この記事では、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
になります。(ソースは後ほど)
# 圧力鍋を使った牛すじカレーの作り方
## 材料
- 業務スーパーの冷凍牛すじ 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向けの設定です。一方、lualatex
でCJKmainfont
を使うと、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のクラスを使ってフォントを指定したい場合「classoption
にjafont
を含める」方法もある。
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