メモ: Pandoc+LaTeXで気軽に日本語PDFを出力する

この記事では、[Pandoc](https://pandoc.org/)を使って日本語PDFを出力する方法について説明します。特にLaTeXをPDF変換エンジンに使う場合を想定します。

【以下では、TeX Live 2019 (scheme-full)がインストール状態を前提とします。
インストール方法は [TeX Live - TeX Wiki](https://texwiki.texjp.org/?TeX%20Live) を参照してください。】

（補足: TeX Live 2019以前でも構いませんが、後述のパッケージを利用するには、TeX Live 2016あたり以降が必要だと思います。あるいは [`tlmgr`コマンド](https://texwiki.texjp.org/?tlmgr)でTeX Liveをアップグレードしてください。）

## 日本語でふつうにLaTeXできないPandoc

Pandocでは和文を含む入力文書を、普通にPDFへ変換する（`-o foo.pdf`）とエラーになります。Pandocが使うPDF変換エンジン（`--pdf-engine`オプション）は、デフォルトで`pdflatex`だからです。

実際に、和文が書かれたMarkdownファイル `sample.md` を変換しようとすると、pdfLaTeX側で`! Package inputenc Error`になります。（ソースは後ほど）

```md:sample.md
# 圧力鍋を使った牛すじカレーの作り方

## 材料

- 業務スーパーの冷凍牛すじ 1kg
- 長ねぎ（青い部分）、生姜
- カレーの材料

## 方法

まず牛すじを水から茹でて、沸騰したら1分茹でる（加圧は不要）。その後ざるにあげ、鍋を洗う。

次に圧力鍋へ長ねぎ・生姜・牛すじを入れる。圧力鍋の $\frac{2}{3}$ まで水を入れる。
強火にかけて加圧する。加圧できたら弱火にし、20分間茹でる。

ゆであがった牛すじは、普通にカレーの材料に使う。残っただしはカレーの水に使ったり、中華スープなどにすると美味。
```

```console
$ pandoc foo.md -o foo.pdf
Error producing PDF.
! Package inputenc Error: Unicode character で (U+3067)
(inputenc)                not set up for use with LaTeX.

See the inputenc package documentation for explanation.
Type  H <return>  for immediate help.
 ...

l.53 ...el{pandocux3067lua-ja-ux3059ux308bux4ef6}}
```

日本語入力に対応するLaTeX系の `--pdf-engine` は、`xelatex`および`lualatex`です。
（その他、HTML出力では`wkhtmltopdf`なども利用できますが割愛。pdfLaTeXでできなくもないけどそれも割愛）

それでも、素の`xelatex`および`lualatex`では、和文を正しく変換できません（和文文字をスキップして無理矢理PDFを出力します）。

```console
$ pandoc sample.md -o sample.pdf --pdf-engine=xelatex
[WARNING] Missing character: There is no 圧 in font [lmroman12-bold]:mapping=tex-text;!
[WARNING] Missing character: There is no 力 in font [lmroman12-bold]:mapping=tex-text;!
[WARNING] Missing character: There is no 鍋 in font [lmroman12-bold]:mapping=tex-text;!
（以下略）
$ pandoc sample.md -o sample.pdf --pdf-engine=lualatex
[WARNING] Missing character: There is no 圧 (U+5727) in font [lmroman12-bold]:+tlig;!
[WARNING] Missing character: There is no 力 (U+529B) in font [lmroman12-bold]:+tlig;!
[WARNING] Missing character: There is no 鍋 (U+934B) in font [lmroman12-bold]:+tlig;!
（以下略）
```

出力結果は悲惨です（画像は素のXeLaTeX）。

![素のXeLaTeX](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10473/acbff79d-621c-980d-2f64-4ab392ab7a93.png)

もちろんベースがLaTeXである以上、LaTeXの方でカスタマイズすることは可能です。
XeLaTeX / LuaLaTeXともにソリューションがあります（後述）。

正攻法としては、Pandocにはそのためのオプションとして、`-H / --include-in-header=`があります。
Pandocに`-H header.tex`と読み込ませれば、header.texに書いたLaTeXの設定（プリアンブル部分）が反映されます。そこに和文用の設定を書けばよいのです。

とはいえ、書くのはかなり面倒です。

## Pandoc+LaTeXで気軽に日本語PDFする方法

できればワンライナーで変換したいところです。しかも、まあまあ悪くないクオリティの組版もほしいです。
その間のバランスをとる良い感じの方法をまとめてみます。

## 方法1: BXjsclsを使う

pLaTeXは和文LaTeXの代名詞といえるぐらいに有名です。その中でも[jsclasses（新ドキュメントクラス）](https://texwiki.texjp.org/?jsclasses)は、和文を美しく組んでくれるため定評があります。しかし、jsclassesはpLaTeXを必要とするため、Pandocでは使えません。

[BXjscls](https://texwiki.texjp.org/?BXjscls)は、pdfLaTeX/XeLaTeX/LuaLaTeXというPandoc対応のLaTeXエンジンに対して、jsclasses相当の組版ができる文書クラスを提供します。

BXjsclsを使う場合、コマンドは次のようになります。


```console
$ pandoc sample.md -o sample.pdf --pdf-engine=xelatex -V documentclass=bxjsarticle -V classoption=pandoc
$ pandoc sample.md -o sample.pdf --pdf-engine=lualatex -V documentclass=bxjsarticle -V classoption=pandoc
```

出力結果（XeLaTeX版、LuaLaTeXでもほぼ同等です）：

![BXjscls XeLaTeX版](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10473/5766bc53-ebf9-6b59-a803-7a9afed52a75.png)


補足：

- 事前にIPAexフォントをインストールする必要があります。macOSは`brew cask install font-ipaexfont`で入ります。
- [BXjsclsにはPandocモードがあり](https://texwiki.texjp.org/?BXjscls#f45df5c0)、Pandoc既定のLaTeXテンプレート向けによしなに諸々の設定をしてくれます。

（なお、かなり長いコマンドですが、Pandocの世界ではまだ短い方です……）

## 方法2: Pandoc（隠し）テンプレート変数を使う

（ここまでは前座です。いよいよ書きたかった本題です）

ところで、Pandocが使う標準のテンプレートは `-D` オプションでチェックできます。LaTeXの場合は

```sh
pandoc -D latex
```

で確認できます（長いので`less`コマンドなどにパイプすると読みやすいでしょう）。

ある日、趣味でこのテンプレートを熟読していると、[Pandoc User's Guide](https://pandoc.org/MANUAL.html)に載っていないテンプレート変数（コマンドラインなどからテンプレートに与えられる変数）があることに気がつきました。

- luatexjapresetoptions

繰り返しですが、これは[Pandoc標準のLaTeXテンプレート](https://github.com/jgm/pandoc-templates)です。すなわち（少なくとも現在の最新版では）公式に使えて、本来はUser's Guideに載るべき項目です（あとでプルリクする予定）。

### 方法2-1: `luatexjapresetoptions`変数を使う方法

結論から言えば、この`luatexjapresetoptions`変数を使っても和文PDFを作れます。
しかも、**かなり簡潔にフォント指定ができます。**

```console
$ pandoc sample.md -o sample.pdf --pdf-engine=lualatex -V documentclass=ltjsarticle -V luatexjapresetoptions=hiragino-pron
```

![スクリーンショット 2019-04-30 23.31.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10473/608d6764-db68-fa7a-aa65-af2011f34fc0.png)


補足：

- この方法は`--pdf-engine=lualatex`専用です（LuaTeX-jaの成果物です）。`xelatex`は使用できません。
- `documentclass`にはLuaTeX-ja専用のもの（`ltjsarticle`など） を使います
- `luatexjapresetoptions`には、フォントのプリセットを指定します
    - noembed: 非埋込
    - kozuka-pro: 小塚フォント (Pro)
    - kozuka-pr6: 小塚フォント (ProVI)
    - kozuka-pr6n: 小塚フォント (Pr6N)
    - hiragino-pro: ヒラギノフォント (Pro, Std)
    - hiragino-pron: ヒラギノフォント (ProN, StdN)
    - morisawa-pro: モリサワフォント (Pro)
    - morisawa-pr6n: モリサワフォント (Pr6N)
    - ipa: IPAフォント
    - ipaex: IPAexフォント
    - ms: MS 明朝，MS ゴシック
    - moga-mobo: MogaMincho, MogaGothic, MoboGothic（20150420.0 以降）
    - yu-win: Windows 8.1 に付属する游書体（20140114.0 以降）
    - yu-osx: OS X 10.9 に付属する游書体（20140114.0 以降）
    - sourcehan: 源ノ明朝，源ノ角ゴシック
- いずれも詳しい説明は[LuaTeX-jaの使い方](https://ja.osdn.net/projects/luatex-ja/wiki/LuaTeX-ja%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)を参照してください。


### 方法2-2: LuaTeX-jaで `CJKmainfont`変数を使う方法

余談ですが、`CJKmainfont`変数を使う方法もあります。こちらはCJK（中国語・日本語・韓国語）の本文フォントを指定するためのもので、元々はXeLaTeX向けの設定です。一方、`lualatex`で`CJKmainfont`を使うと、`luatexja-fontspec`が読み込まれた状態で、同様に指定ができます。

これを使うことで、OS上の任意のフォントを本文用に読み込めます（ただし英数字のPostScript名が無難？）。次は「ヒラギノ丸ゴ ProN W4」(HiraMaruProN-W4)を読み込む例です。

```console
$ pandoc sample.md -o sample.pdf --pdf-engine=lualatex -V documentclass=ltjsarticle -V CJKmainfont=HiraMaruProN-W4
```

![本文フォントをヒラギノ丸ゴ ProN W4に](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10473/01f100d7-1ac6-1cdc-1742-c792b1e09369.png)

### 方法2-3: BXjsclsで `CJKmainfont`変数を使う方法

`CJKmainfont`変数自体はXeLaTeX向けに利用できるので、さきほどのBXjsclsとの合わせ技も可能です。

```console
$ pandoc sample.md -o sample-xetex-bx-maru.pdf --pdf-engine=lualatex -V documentclass=bxjsarticle -V classoption=pandoc -V CJKmainfont=HiraMaruProN-W4
```

表示は方法2-2と同様です。

## 補足：字下げ（インデント）について

PandocのLaTeXテンプレートは、Pandocなりのいろいろな事情や思想に基づいて作られています。そのため、LaTeXの「標準的」な挙動とはかなり異なっています。その中でも特に目立つのが「デフォルトで字下げしない（パラグラフの区切りは行送り）」という挙動です。

これまで紹介してきた方法は、いずれもLaTeX側では「パラグラフの開始は1字下げ」という日本語組版の標準的な組み方をデフォルトとします。しかし、**PandocのLaTeXテンプレートは字下げの挙動を上書きします**。

上記の方法で「パラグラフの開始は1字下げ」を実現するには、コマンドに対して単に`-V indent=true`を追加します（正確には、`indent`変数に非空白文字を指定します）。たとえば方法2-2を次のように書き換えられます。

```console
$ pandoc sample.md -o sample-luatex-ja.pdf --pdf-engine=lualatex -V documentclass=ltjsarticle -V luatexjapresetoptions=hiragino-pron -V indent=true
```

![パラグラフ1字下げ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10473/c4f8b8a4-0806-cc23-fd62-f091f6f17c79.png)


（専門的な話：Pandocで`indent`変数をセット ~~した~~ しない場合、LaTeXテンプレートでは[parskip.sty](https://ctan.org/pkg/parskip)が読み込まれます。これにより、字下げ（`\parindent`）が強制的になくなり、行送り（`\parskip`）がゼロでなくなります。）

以上です。

## 追記（2019-05-02）：BXjsclsに対するフォント指定を `jafont` で行う

ZR-TeXnobabblerさんから補足があったので、引用します。（一部、内容を変えない程度に筆者による編集をしています）



> ところで：
> \#Pandoc のPDF出力でBXjsclsのクラスを使ってフォントを指定したい場合「`classoption`に`jafont`を含める」方法もある。
> 
>```sh
pandoc -s -t latex-smart --pdf-engine=lualatex -V documentclass=bxjsarticle -V classoption="pandoc,jafont=sourcehan" http://doc.md  -o doc.pdf
```
> この方法はどのエンジンでも使える。ただ`jafont`に指定できる値はエンジンにより異なる。（`lualatex`なら`luatexja-preset`のオプションになる。）

> 「`jafont`」クラスオプションについては：
> → https://texwiki.texjp.org/?BXjscls#uc956aaf
> 「`-t latex-smart`」については：
> → https://zrbabbler.hatenablog.com/entry/20171030/1509377027

※ 引用元（Twitter、スレッドが続きます）: https://twitter.com/zr_tex8r/status/1123449152518656000