Markdownからめちゃくちゃそれっぽいpdfを組版するシステムを作ったお話
お久しぶりです坂ラッシュです。
さて、突然ですが皆さんは電子媒体で作るレポートを何で作っていますか?
パワポ?Word?LaTeX?はたまたMarkdown?
Markdownはとても良いものです。簡単に書けるし、HackMDというサービスを利用すればクラウドで保存しておけるし、編集もしやすいし、画像もクリップボードからコピーすれば勝手にアップロードしてくれます、最高!
でもこのHackMD,唯一の不満がありました。pdfアウトプットに対応していないことです。
そこで、Markdown(拡張マークダウン)から、LaTeXを通してpdfを組版する仕組みを総勢15時間くらいかけて作ったので紹介します。
そのソフトの名前はPanPDF!
出来たもの
firefox/chromeの拡張として作ってあるPanPDFを入れ、HackMDのコンテキストメニューの中に追加されているPanPDFを押しすとPanPDFが起動します。
https://gyazo.com/74d7c9980226d0de071a570061150017
https://gyazo.com/e9931e790455e36b0a0708b321e5fb30
するとツール(C#で作成した)が起動していって...
https://gyazo.com/d954c1599bb757ee4900f0558a5d6e93
https://gyazo.com/66077dff82b74363b6c9389051803db4
完成
https://gyazo.com/c8c5e3ee1a03c8f8fbbd066de7f787c5
画像もちゃんとダウンロードして構成してくれるし、自作拡張記法にも対応していて、またコードインデントにも対応しています。後目次も自動生成です!かっこいい!!!
https://gyazo.com/0ccda6bbbb014ae0db14c6c8633722ae
https://gyazo.com/c1e069a66eea89e5f80b1d8dcbac89f4
インストール必要なもの
TexLive2020 (LuaLaTeXを使用する)
pandoc
(Windows)
テンプレ
code:head.md
---
author: sakarush
date: \today{}
classoption: pandoc,a4paper
header-includes: |
\usepackage{amsmath,amssymb}
\usepackage{ascmac}
\usepackage{framed}
\renewcommand\thefootnote{\Roman{footnote}}
\usepackage{color}
---
これはmarkdownというより、markdownの頭につけるYAMLヘッダです。
ここにpandocに送るオプションを指定することが出来ます。
コマンド
適切にpandocにオプションを渡さなければ死にます。
このオプションをぐぐるのが辛かった!
code: command
pandoc head.md source.md -o out.pdf --pdf-engine=lualatex --highlight-style=kate -V documentclass=bxjsarticle -V classoption=pandoc -f markdown+hard_line_breaks --self-contained -N
大体みれば分かるんですが、概ねオプションの解説は以下の通りです
--pdf-engine=lualatex:pdfの組版にlualatexを使う(xelatexでも多分大丈夫、日本語対応している必要があります)
--highlight-style=kate:これはコードハイライトの色付け設定です。お好きに変えてよい
-V documentclass=bxjsarticle:日本語で出力するために必要
-V classoption=pandoc:書いとこう(無くてもいいかも)
-f markdown+hard_line_breaks:拡張マークダウンで組版します。またHackMD式に単なる改行を文の改行とみなします。
--self-contained:これは直接pdfを出力する場合には無くても良さそう。texを経由する(後述)場合に必要となります。
-N : ナンバリングする際に必要となります。
処理の流れ
PanPDF(ブラウザ拡張)の処理
ブラウザの拡張機能として、HackMDのサイトのデータを書き換えてPanPDFの発行ボタンを作成。
ボタンを押す
レジストリに登録されたデータを参照して、コマンドライン上でPanPDFが起動。引数1にはHackMDのURLが渡される
PanPDF(クライアント)の処理
~PreProcess~
渡されたURLをvalidateして、MDをダウンロード出来る形に変更(基本のURL/download)。
リクエストを投げてMDファイルをダウンロード
MDを読み込んでパースしていく(簡単に言えば、次のような処理を行う)
画像を見つけたら、画像をダウンロードしてローカルのパスに変更しておく
Pandocに噛ませると死ぬ部分を検知して、置き換えてやる
macro.txtの中身に従って、独自に糖衣な文を置換する。
タイトルヘッダが付与されていなかった場合に、タイトルに適切な文章を探してくる。
パースが終われば、変更後のファイルを保存する。
pandocプロセスを立ち上げて、適切な設定をセッティングして変更後のmdファイルを tex ファイルに変換する(直接pdfにはしない。)
pandocプロセスを監視し、エラーならば終了、完了すれば次に進む。
LuaLaTeXプロセスを立ち上げて、適切な設定をセッティングしてtexファイルをpdfファイルに変換する。
Markdownに違反があればここでエラーが出て、しかも終了しないのでエラー検知 & エラー表示 & プロセスキルをこっちで行う必要がある。
おまけにこの処理は長いので顔文字を表示した (>ω<) つ \
Lulatexプロセスが終了したら、一時ファイルをクリーンアップして、ファイルを表示して終了する。
その他無限の技術検証と細かな色々をしたんですが、もう何をしたかすら忘れてしまったのでこれ以上は書きません。
とにかくこれでレポートがかっこよくなるし、書くコストの追加もほぼ0だからめちゃくちゃ楽しい!
ほくほくしております。
ちなみにこのツール、コードも糞だし実行も自分向けな所があるし、環境構築も若干面倒なので、欲しい場合は連絡してください()