どうやら、新しい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'
フツーにPDFが出力できた。端末表示をみると、どうやらpdfLaTeXを使うワークフローが選択されているようである。実際、出力PDFの文書情報のProducerの値もpdfTeX-1.40.20
となっている。
さらに細かく挙動を調べてみると、以下のようになっているようだ。
- latexmk起動時に
-pdf
オプションが指定されている1。 - latexmk実行時にカレントディレクトリは変更されていない。
- Latexmkの
-outdir
オプションでLaTeXの出力先を変えている。 - 従って、カレントにlatexmkrcがある場合は読み込まれる。
- ただし、latexmkrc内に
$pdf_mode
の設定を書いても、起動オプションの-pdf
により上書きされて、常に$pdf_mode=1
となる。
- Latexmkの
Pandocで(u)pLaTeXする方法
以上のことから考えると、「Pandocで(u)pLaTeX+dvipdfmxを使う」ためには以下のようにすればよいことがわかる。
- pandocコマンドのオプションに
-pdf-engine=latexmk
を指定する。 - latexmkのオプションに
-pdfdvi
(TeX→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できると何がうれしいか よくわからない。
これを次のコマンドで変換する。
> 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'
別解
いちいちカレントに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する」のがチョットだけ楽になる、かもしれない。