どうやら、新しい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'
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のオプションに-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できると何がうれしいか
よくわからない。
※先頭に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'
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 する」のがチョットだけ楽になる、かもしれない。