PandocでMarkdown+Latexからpdfを出力する話


はじめに

論文を書きたいと考えた時Markdown + Latexを使いたくなるのは道理かと思いますが、なかなかまとまった記事がなかったのでエントリーです。
オーソドックスに日本語でpdf出力 + pandoc-crossrefで図表番号を自動採番 + citeprocで参考文献を引いてこよう、という構成で作っています。

Big surで使えない問題

どうやらmacOS最新のBig surでは現状、[email protected]で対応していないみたいです。残念。
そこで今回はDockerを使います。

Docker構成

Dockerはpandoc/latexを元に、日本語出力用にlualatex、pandoc-crossrefなどをinstallする必要があります。

実際のコードはこちらの記事を参考させていただきましたので、確認ください。

日本語で出力する際はフォントが問題になります。実装法はいくつかあるみたいですが、簡単にはフォントファイル(ttf等)をそのままコピーする方法があります。

dockerfile
# 〜色々設定

RUN mkdir -p /usr/share/fonts
COPY fonts /usr/share/fonts

これで./fontsに使いたいフォントを入れておくと参照されます。
ちなみに今回msフォントを使うため ms明朝とmsゴシックを/System/Library/Fontsからコピーしてきました。

Pandocの設定

Pandoc 2.8からDefault fileにyaml形式で長ったらしいオプションをまとめることができる様になりました。そこでここではDefault fileを使って設定を書いていきます。

日本語出力

文書クラスにはBXjsclsを使っています。これで簡単に日本語の設定が書けるので便利です。ここではフォントにms系を設定しています。

defaults.yaml
pdf-engine: lualatex
variables:
  documentclass: bxjsarticle
  classoption:
    - jafont=ms

図表番号、引用

pandoc-crossrefの使用はfiltersに追加するだけです。
pathはDockerでインストールした場所を参照してください。

defaults.yaml
filters:
  - pandoc-crossref

参考文献

参考文献はciteprocを使ってBiBTeXから出力します。ここでは参考文献を書いたbibファイルと引用方法を書いたcslファイルを./bibに入れてあります。

defaults.yaml
csl: bib/fogefoge
bibliography:
- bib/foge.bib

filters:
  - citeproc

まとめ

全文を以下に書いておきました。趣味で欧文フォントをTimes New Romanに、その他もろもろ設定しています。詳しい設定値はPandoc User Guideを見てください。

defaults.yaml
input-file: src.md
output-file: desc.pdf

pdf-engine: lualatex

epub-subdirectory: EPUB
epub-fonts:
  - Times New Roman.ttf
  - MS Mincho.ttf

variables:
  fontsize: 11pt
  documentclass: bxjsarticle
  classoption:
    - pandoc
    - jafont=ms
  mainfont: "Times New Roman"
  sansfont: "Times New Roman"
  indent: true
  header-includes:
    - \renewcommand{\thesection}{第\arabic{section}章}
    - \renewcommand{\thesubsection}{\arabic{section}-\arabic{subsection}}
    - \renewcommand{\thesubsubsection}{\arabic{section}-\arabic{subsection}-\arabic{subsubsection}}
  chaptersDepth: 2
  titlepage: true
  papersize: a4

metadata:
  figureTitle: " "
  tableTitle: " "
  listingTitle: "コード "
  figPrefix: "図."
  eqnPrefix: "式."
  tblPrefix: "表."
  lstPrefix: "コード."
  chapDelim: "-"

table-of-contents: true
toc-depth: 3
number-sections: true

csl: bib/fogefoge
bibliography:
- bib/foge.bib

reference-links: true
reference-location: document

filters:
  - pandoc-crossref
  - citeproc

では出力してみましょう。コマンドラインで以下を実行してみるとpdfが生成されるはずです。

docker run --volume "$(pwd):/data" compiler -d defaults.yaml

もし、Latexまわりでエラーが出た場合はdefaults.yaml内のoutput-file:desc.texに変え、standalone: trueを追加するとtexファイルが生成されるためエラー箇所が見つけやすいと思います。

図を入れ子にしたい場合

pandoc-crossrefにはSubfiguresという図を入れ子にできる機能がありますが、これはpdf出力次には使えない?(Tex限定?)ようです。
地道に図を作るしかないみたいですね。

さいごに

論文締切直前に現実逃避で実装していましたが、案外Default fileを使っている記事を見なかったので投稿してみました。
Pandoc周りは初めて触ったのでお見苦しい箇所あるかもしれませんが、参考になれば幸いです。