仕事で一人プロジェクト(開発/コンサルティング)の時にはMarkdownとpandocでお客さん向けのPDFを作っていたんですが、デフォルトのテンプレートだとプログラムやシェルの動作などを記載したときにPDFではtext wrapが動かなくて特にシェルなんかは複数行に改行したり工夫していました。ただ、これをやっていくと精神がガリガリ削られてしまいます。
また、出力したPDFもちょっと格好悪いので使えそうなテーマを探してみました。
User contributed templates · jgm/pandoc Wiki · GitHub
今回は次のテンプレートが良さそうなので使ってみたというお話です。
まず手元の環境ですが、 Homebrew 経由で入れた MacTex と pandoc となります。OSなどの違いは各自汲み取ってください。
とりあえず、導入をしてみます。
mkdir -p ~/.pandoc/templates/ cd ~/.pandoc/templates/ wget https://raw.githubusercontent.com/Wandmalfarbe/pandoc-latex-template/master/eisvogel.latex
あとは pandoc に --template eisvogel というオプションを追加すればよいのですが、単純にこれだけだとうまく動きません。
まず以下のような markdown があるとして、適当に処理してみます。
# openmaptilesでベクトルタイルの作成 本ドキュメントはopenmaptilesを利用してベクトルタイルのバイナリ(.mbtile形式)を作成するところまでを解説します。 ## ターゲット ### ハードウェア - Ubuntu 16.10 or Ubuntu 17.04 - 64bit CPU - 4GBメモリ以上 - 30GB以上のディスクスペース
pandoc -f markdown_github test.md -o test.pdf --from markdown --template eisvogel --listings
すると次のようなエラーになります。
! Package inputenc Error: Unicode char テ (U+30C6) (inputenc) not set up for use with LaTeX. See the inputenc package documentation for explanation. Type H <return> for immediate help. ... l.308 \section{テストドキュメント} Try running pandoc with --latex-engine=xelatex. pandoc: Error producing PDF
メッセージに沿って xelatex を使うようにします。
pandoc -f markdown_github test.md -o test.pdf --from markdown --template eisvogel --listings --latex-engine=xelatex
これでうまく行ったかと思ったら、日本語フォントが出てきません。
これを解決するには CJKmainfont のパラメータを与える必要があります。今回は完全な個人的な趣味で IPAexGothic を使います。
pandoc -f markdown_github test.md -o test.pdf --from markdown --template eisvogel --listings --latex-engine=xelatex -V CJKmainfont=IPAexGothic
これで日本語もばっちり表示されるようになりました。
ただ、 usage を見るとYAMLでタイトルを拡張できるようです。なぜYAMLを閉じるのが ... なのかはわかりませんが、とりあえず markdown に組み込んでみます。
最終的なサンプルは以下のようにしました*1。
--- title: "ベクトルタイルの作成方法" author: [Taro Matsuzawa taro@georepublic.co.jp] date: \today ... # テストドキュメント 本ドキュメントはopenmaptilesを利用してベクトルタイルのバイナリ(.mbtile形式)を作成するところまでを解説します。 ## ターゲット ### ハードウェア - Ubuntu 16.10 or Ubuntu 17.04 - 64bit CPU - 4GBメモリ以上 - 30GB以上のディスクスペース ### ソフトウェア - Docker > 1.11.0 - Docker Compose > 1.7.1 - git - make - bc ## セットアップ ### utility openmaptiles の ```quickstart.sh``` の実行に必要なコマンドをインストールします。 ```bash sudo apt-get install git make bc ``` ### Docker apt-getコマンドでdockerをインストールし、サービスを起動します。 ```bash sudo apt-get install docker.io sudo service docker start ``` ### Docker Compose #### Ubuntu 16.10 Ubuntu 16.10ではパッケージで提供しているバージョンが古いため、手動でインストールをします。 ```bash sudo su - curl -L https://github.com/docker/compose/releases/download/1.10.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose exit ``` #### Ubuntu 17.04 Ubuntu 17.04ではパッケージが提供してるものを利用します。 ```bash sudo apt-get install docker-compose ```
これで出力してみましょう。
pandoc -f markdown_github test.md -o test.pdf --from markdown --template eisvogel --listings --latex-engine=xelatex -V CJKmainfont=IPAexGothic
これできれいになったと思ったのですが、よく見ると日付がドイツ語になっています。これはデフォルトがドイツ語になっているためなので、 README を参考にして英語にしてみましょう*2。
pandoc -f markdown_github test.md -o test.pdf --from markdown --template eisvogel --listings --latex-engine=xelatex -V CJKmainfont=IPAexGothic -V lang=en-US
これでうまくいきました。なお、日付のフォーマットを変更するのであれば --metadata date="`date +%Y-%m-%d`" などとしてdateの値を与えるとうまくいきます。
pandoc -f markdown_github test.md -o test.pdf --from markdown --template eisvogel --listings --latex-engine=xelatex -V CJKmainfont=IPAexGothic -V lang=en-US --metadata date="`date +%Y-%m-%d`"
ちなみに、僕の場合は最初にTable of Contentsをつけるので --toc オプションも追加します。この --toc オプションも言語設定によって影響があるので、このテンプレートを使う場合は -V lang=en-US をつけておくのがおすすめです。
なお、全て試していないのですが text wrap が有効なのは --listings オプションを追加したときで、他の Syntax Highlighting を設定するとうまく動きません。
というかそもそも --listings をつければ最初の text wrap の問題解決していたような気がするんだけど考えるのをやめました。
幸せになればいいんだよ!!!!なりてえよ!!!!
あ、ついでですが、これあくまでPDF向きなのでこのmarkdownをhtmlに出力すると変になるから気をつけてね!
*1:お客さんに怒られないようちょっと構成を変えてる
*2:http://tug.ctan.org/language/hyph-utf8/doc/generic/hyph-utf8/hyphenation.pdf によると日本語はサポートされていないようです。