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

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

## Big surで使えない問題
どうやらmacOS最新の[Big surでは現状、pandoc-crossref@v0.3.9.0aで対応していないみたいです](https://github.com/lierdakil/pandoc-crossref/releases pandoc-crossref)。残念。
そこで今回はDockerを使います。

# Docker構成
Dockerは[pandoc/latex](https://hub.docker.com/r/pandoc/latex pandoc/latex)を元に、日本語出力用にlualatex、pandoc-crossrefなどをinstallする必要があります。

**実際のコードは[こちら](https://kcpoipoi.hatenablog.com/entry/2020/07/27/120438 日々是好日)の記事を参考させていただきましたので、確認ください。**

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

```txt: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系を設定しています。

```yaml:defaults.yaml
pdf-engine: lualatex
variables:
  documentclass: bxjsarticle
  classoption:
    - jafont=ms
```
## 図表番号、引用
pandoc-crossrefの使用はfiltersに追加するだけです。
pathはDockerでインストールした場所を参照してください。

```yaml:defaults.yaml
filters:
  - pandoc-crossref
```

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

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

filters:
  - citeproc
```

## まとめ
全文を以下に書いておきました。趣味で欧文フォントをTimes New Romanに、その他もろもろ設定しています。詳しい設定値は[Pandoc User Guide](https://pandoc.org/MANUAL.html Pandoc)を見てください。


```yaml: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限定？)](https://github.com/lierdakil/pandoc-crossref/issues/20 issues)ようです。
地道に図を作るしかないみたいですね。

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