マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

Pandocで(u)pLaTeXしてみる話

どうやら、新しいPandocではビルドにLatexmkが使えるらしい。

  • Add latexmk as an option for --pdf-engine (#3195). Note that you can use --pdf-engine-opt=-outdir=bar to specify a persistent temp directory.

Pandocの「PDF出力エンジン」(--pdf-engine)として指定できるLaTeXエンジンはpdfLaTeX、XeLaTeX、LuaLaTeXに限られている。しかし、Latexmkが使えるようになったということは、これを利用して「(u)pLaTeX+dvipdfmxでPDFを生成する」ことができるはずである。

PandocでLatexmkしてみる

とりあえず、簡単な英語のMarkdown文書を用意して試してみる。

[test1.md]

# Welcome!

Hello, Pandoc *chaos*!

これを--pdf-engine=latexmk付のpandocで変換する。

※プロンプトを>で表す。

> pandoc --pdf-engine=latexmk test1.md -o test1.pdf
Latexmk: Run number 1 of rule 'pdflatex'
Latexmk: Run number 2 of rule 'pdflatex'

f:id:zrbabbler:20190506233335p:plain
test1.pdfの内容

フツーにPDFが出力できた。端末表示をみると、どうやらpdfLaTeXを使うワークフローが選択されているようである。実際、出力PDFの文書情報のProducerの値もpdfTeX-1.40.20となっている。

さらに細かく挙動を調べてみると、以下のようになっているようだ。

  • latexmk起動時に-pdfオプションが指定されている1
  • latexmk実行時にカレントディレクトリは変更されていない。
    • Latexmkの-outdirオプションでLaTeXの出力先を変えている。
    • 従って、カレントにlatexmkrcがある場合は読み込まれる。
    • ただし、latexmkrc内に$pdf_modeの設定を書いても、起動オプションの-pdfにより上書きされて、常に$pdf_mode=1となる。

Pandocで(u)pLaTeXする方法

以上のことから考えると、「Pandocで(u)pLaTeX+dvipdfmxを使う」ためには以下のようにすればよいことがわかる。

  • pandocコマンドのオプションに-pdf-engine=latexmkを指定する。
  • latexmkのオプションに-pdfdviTeX→DVI→PDFのワークフローを指定)を追加するために、pandocのオプションに--pdf-engine-opt="-pdfdvi"も指定する。
  • カレントにlatexmkrcを置いて、そこに(u)pLaTeX+dvipdfmxを使うための設定を書く。

つまり、Pandocのコマンド行は以下の形になる。

> pandoc --pdf-engine=latexmk --pdf-engine-opt="-pdfdvi" ......

latexmkrcの内容は(最低限として)以下のようにする。
※先述の通り、$pdf_modeの設定は効かないので不要。

upLaTeX+dvipdfmxの場合:

$latex = 'uplatex';
$bibtex = 'upbibtex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex -U %O -o %D %S';

pLaTeX+dvipdfmxの場合:

$latex = 'platex -kanji=utf8';
$bibtex = 'pbibtex -kanji=utf8';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex -U %O -o %D %S';

もちろん、この設定はPDF生成に用いるコマンドを変更するだけのもので、PandocのLaTeXコード生成には何も影響を与えない。従って、ここで示したもの以外のPandocの設定は「途中で生成されるLaTeXファイルが(u)pLaTeXで通るようにする」必要がある。

実際にupLaTeXしてみた

例として、日本語のMarkdown文書をPandocのデフォルトのLaTeXテンプレートを通してupLaTeX+dvipdfmxのワークフローでPDFに変換してみる。デフォルトのLaTeXテンプレートは本来は(u)pLaTeXには対応していないが、BXjsclsのクラスのPandocモードであれば利用できる。

※もちろん、カスタムのテンプレートを指定してもよい。

[test2.md]

---
title: PandocでupLaTeXしたい話
author: 某ZR
documentclass: bxjsarticle
classoption:
  - pandoc
papersize: a5
---

# upLaTeXできると何がうれしいか

よくわからない。

※先頭にYAMLメタデータブロックを記述している。

これを次のコマンドで変換する。

> pandoc --pdf-engine=latexmk --pdf-engine-opt="-pdfdvi" test2.md -o test2.pdf
Latexmk: Run number 1 of rule 'latex'
Latexmk: Run number 2 of rule 'latex'
Latexmk: Run number 1 of rule 'dvipdf'

f:id:zrbabbler:20190506233146p:plain
test2.pdfの内容

別解

いちいちカレントにlatexmkrcを置くのは面倒である。代わりに、固定のディレクトリ(仮に/path/to/dirとする)にLatexmkの設定ファイルを置いた上でそれを-rオプションで読み込むという方法もある。

この場合、Pandocが生成するコマンド行において-rオプションが-pdfより後ろに置かれるため、設定ファイル内の$pdf_modeの記述で-pdfを上書きすることができる。従って、次のように$pdf_,modeを含めた設定ファイルを用意しておくとよい。

[/path/to/dir/uplatex-dpx.latexmk]

$latex = 'uplatex';
$bibtex = 'upbibtex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex -U %O -o %D %S';
$pdf_mode = 3;

その上で、以下のコマンドを実行する2。(実際には改行なしの1行で入力する。)

pandoc --pdf-engine=latexmk
    --pdf-engine-opt="-r" --pdf-engine-opt="/path/to/dir/uplatex-dpx.latexmk"
    test2.md -o test2.pdf

まとめ

新しいPandocを使うと「Pandocで(u)pLaTeXする」のがチョットだけ楽になる、かもしれない。


  1. 実際のコマンド行は次の通り: latexmk -interaction=batchmode -halt-on-error -pdf -quiet -outdir=TEMPDIR TEMPDIR/input.tex;ここでTEMPDIRはPandocが生成した一時ディレクトリの名前。

  2. 一つの--pdf-engine-optでは一つのコマンド引数しか指定できないので、-r /path/to/dir/uplatex-dpx.latexmkというオプションを指定するには煩雑であるが--pdf-engine-optを2回書くしかないようである。