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


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

【以下では、TeX Live 2019 (scheme-full)がインストール状態を前提とします。
インストール方法は TeX Live - TeX Wiki を参照してください。】

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

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

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

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

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

## 材料

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

## 方法

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

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

ゆであがった牛すじは、普通にカレーの材料に使う。残っただしはカレーの水に使ったり、中華スープなどにすると美味。
$ 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を出力します)。

$ 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)。

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

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

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

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

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

方法1: BXjsclsを使う

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

BXjsclsは、pdfLaTeX/XeLaTeX/LuaLaTeXというPandoc対応のLaTeXエンジンに対して、jsclasses相当の組版ができる文書クラスを提供します。

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

$ 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でもほぼ同等です):

補足:

  • 事前にIPAexフォントをインストールする必要があります。macOSはbrew cask install font-ipaexfontで入ります。
  • BXjsclsにはPandocモードがあり、Pandoc既定のLaTeXテンプレート向けによしなに諸々の設定をしてくれます。

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

方法2: Pandoc(隠し)テンプレート変数を使う

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

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

pandoc -D latex

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

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

  • luatexjapresetoptions

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

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

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

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

補足:

  • この方法は--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の使い方を参照してください。

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

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

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

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

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

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

$ 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を次のように書き換えられます。

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

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

以上です。

追記(2019-05-02):BXjsclsに対するフォント指定を jafont で行う

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

ところで:
#Pandoc のPDF出力でBXjsclsのクラスを使ってフォントを指定したい場合「classoptionjafontを含める」方法もある。

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