smellman's Broken Diary

クソみたいなもんです

pandocでプログラムが記述された納品用PDFを作ってみる

仕事で一人プロジェクト(開発/コンサルティング)の時にはMarkdownとpandocでお客さん向けのPDFを作っていたんですが、デフォルトのテンプレートだとプログラムやシェルの動作などを記載したときにPDFではtext wrapが動かなくて特にシェルなんかは複数行に改行したり工夫していました。ただ、これをやっていくと精神がガリガリ削られてしまいます。

また、出力したPDFもちょっと格好悪いので使えそうなテーマを探してみました。

User contributed templates · jgm/pandoc Wiki · GitHub

今回は次のテンプレートが良さそうなので使ってみたというお話です。

GitHub - Wandmalfarbe/pandoc-latex-template: A pandoc LaTeX template to convert markdown files to PDF or LaTeX.

まず手元の環境ですが、 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

これでうまく行ったかと思ったら、日本語フォントが出てきません。

f:id:smellman:20170523041717p:plain

これを解決するには CJKmainfont のパラメータを与える必要があります。今回は完全な個人的な趣味で IPAexGothic を使います。

pandoc -f markdown_github test.md -o test.pdf --from markdown --template eisvogel --listings --latex-engine=xelatex -V CJKmainfont=IPAexGothic

f:id:smellman:20170523041902p:plain

これで日本語もばっちり表示されるようになりました。

ただ、 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

f:id:smellman:20170523043120p:plain

これできれいになったと思ったのですが、よく見ると日付がドイツ語になっています。これはデフォルトがドイツ語になっているためなので、 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

f:id:smellman:20170523043611p:plain

これでうまくいきました。なお、日付のフォーマットを変更するのであれば --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 によると日本語はサポートされていないようです。