Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

この記事では、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)。

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

BXjscls XeLaTeX版

補足:

  • 事前に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

スクリーンショット 2019-04-30 23.31.05.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の使い方を参照してください。

方法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

本文フォントをヒラギノ丸ゴ ProN 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

パラグラフ1字下げ

(専門的な話: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

sky_y
『Markdownライティング入門』、日本Pandocユーザ会の人。
https://note.solarsolfa.net/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away