ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

macOSとPandoc、MacTeXでMarkDownをPDFに変換する

最近、ドキュメントやメモはMarkDownで書くことが多くなっています。 実はこのブログもMarkDown形式で書いていたりします。

そしてMarkDownで書いたドキュメントを配布する際にPDF出力しているのですが、現在利用しているエクスポートツールが

  • とにかく重い
  • 色々対応するには独自タグを入れなければならず、ソースが汚くなる
  • 100ページを超えるとよくフリーズする
  • 100ページを超えるとレイアウトが崩れる、書式の変換に失敗する
  • バグがとにかく多い

…という問題があり、移行先を会社のみんなで検討していました(特に4つ目が厄介で、出力後に目視して確認していました)。 とりあえず私は定番のPandocとMacTeXをmacOSにインストールして使ってみることにしました。

エクスポートするツールの選定

エクスポートするツールを選択するにあたり、いくつか必要な機能がありました。目次機能、改ページ機能、見出しのレベルから章番号(1. とか 1-1..みたいなもの)を自動で割り振ってくれる機能、コマンド実行例を示すための書式…などです。これまで使っていたツールはこの目次機能にバグがありました。

これらの中でも特に重要視していたのが「必要な箇所で改ページする機能」です。PandocとMacTeXの組み合わせだと、「\clearpage」というタグを入れるだけで改ページしてくれました。コマンド部分はPandocのオプションで「–highlight-style=」で指定すると良いようです。私はzenburnがお気に入りです。PDFに目次を含める場合はPandocのオプションで「–toc」を含めるといい感じにやってくれるようです。詳細はこちらをご覧ください。

qiita.com

Pandocがあれば色々な形式にエクスポートすることができますが、PDF出力するには例えばMacTeXなどが必要だそうです。以下、macOS SierraにPandocとMacTeXをインストールした時の試行錯誤したログです。

インストールする

次のように実行します。HomebrewとXCodeが事前に必要です。

tooyamac% brew install lua pandoc pandoc-crossref

インストール後、PDF出力に必要らしいMacTeXをダウンロードしてインストールします。

実はbrew cask install mactexでもインストールできるらしいのですが、すごい時間がかかるので公式サイトからダウンロードします。pkg形式のファイルなのでダウンロードしたものをダブルクリックしてインストールするだけです。リンク先はこちらに日本のミラーサイトが掲載されているので、その中から選びます。

初めてのPDF出力

出力しよう。おや?

tooyamac% pandoc -t beamer ./hoge.md -o ./hoge.pdf
pandoc: pdflatex not found. pdflatex is needed for pdf output.

pdflatex がないようです。さっきインストールしたけど?

ググった!

見つかった!

どうやらバイナリーのパスが旧来から変わったようです。とはいえ、参考にしたページに書かれたパスも違っていたんですけど、探したらどうやらSierraではここに展開されるようです。とりあえずシンボリックリンクを貼ればなんとかなるようです。

tooyamac% ln -s /Library/TeX/Root/bin/x86_64-darwin/pdflatex /usr/local/bin/

そしてもう一度試したら今度は別のバイナリーがないと言われました。先ほどのと同様、 /Library/TeX/Root/bin/x86_64-darwin/にバイナリーがあったため、シンボリックリンクではなく、パスを通すことにしました。bashなら.bashrc、zshなら.zshrcに書けば良いようです。macOSの場合はpandocコマンドの実行に管理権限とかsudoを実行する必要はないため、ユーザーのrcファイルに書くだけで良いようです。私はzsh大好き人間なので次のファイルに記述しました。

tooyamac% vi ~/.zshrc
...
export PATH=/Library/TeX/Root/bin/x86_64-darwin:$PATH

tooyamac% source ~/.zshrc

3度目のPDF出力

出力しよう。おや?

また、エラーが出ました。 エラーログを取り忘れたので具体的なエラーを含めることができませんが、Markdownソースに日本語が入っているとエラーになるようです。

最後の行に「–latex-engine=xelatex」オプションを使ってくれと出ているので実行してみると、エラーは出ずにコマンドが通りました。ただし、英語部分だけ出力されるという悲しい状態でした。

tooyamac% pandoc input.md -o test.pdf -V documentclass=ltjarticle
...
Try running pandoc with --latex-engine=xelatex.

4度目のPDF出力

出力されたPDFに日本語が出てこない問題はここに書かれていました。「–latex-engine=lualatex」を指定すれば良いようです。

betrue12.hateblo.jp

最終的には

最終的には次のオプションを指定して出力することで、ほぼ希望通りのものを出力することができました。

tooyamac% pandoc -D latex > mytemplate.tex

tooyamac% pandoc -F pandoc-crossref document.md -o document.pdf -V documentclass=ltjsarticle --latex-engine=lualatex --template=mytemplate.tex --highlight-style zenburn --toc -N

環境を作るのはなかなか大変でしたが、クリックするとその部分にジャンプできる「役立つ目次」や割と簡単な記述で「改ページ」が入れられるようになった点、あの重いエクスポートツールを起動しないでも良い点は非常に良いかなと思います。

残す課題は?

表紙がシンプルすぎるのでどうしようか検討中です。表紙くらいなら別のソフトウェアを使って作ったものを差し込んでしまえばいいんじゃないか?…というのもアイデアとしてはアリだと思っています。