2019年5月28日火曜日

エディタから latexmk を使うと何故か pdflatex を呼び出される

去年ほぼ同じ内容をまとめていたので要約

Q: エディタの拡張機能とかで latexmk を使ってコンパイルすると、latexmkrc の記述を無視して pdflatex が使われてしまうのは何故?
A: (1) エディタが付加している latexmk のオプションに -pdf が含まれていたから (2) latexmkrc の問題(正しく読み込まれていない、実はうっかり別のファイルで $pdf_mode やオプションを指定してしまっていた、など)
Q: 作業ディレクトリをカレントディレクトリとして動作させたシェル(cmd, PowerShellなど含む)で latexmk を実行したらうまくいくのに、エディタの拡張機能とかで latexmk を使ってコンパイルすると失敗するのは何故?
A: ディレクトリのパスやファイル名に、漢字や空白文字が含まれていたり、ネットワークパス(Windowsの場合)だったりするとうまくいかないときがあります。

Visual Studio Code + LaTeX Workshop ではまっていたのです

texファイルのホームディレクトリに latexmkrc を作って、

$pdf_mode = 3;
$latex = 'platex -synctex=1 -halt-on-error %O %S';
$dvipdf = 'dvipdfmx %O -o %D %S';
$bibtex = 'pbibtex %O %B';
$max_repeat = 5;

とか書いておけば、 platex と dvipdfmx を使って良い感じに仕上げてくれるはず、なのですが、 vscode と latex拡張の組み合わせでは、何故かpdflatex が実行されてしまいます。何故? latexmkrc が読まれてないのか? と思ったのですが、 理由は package.json で設定されている latex-workshop.latex.tools にありました。
https://github.com/James-Yu/LaTeX-Workshop/blob/v7.0.1/package.json
            {
              "name": "latexmk",
              "command": "latexmk",
              "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-pdf",
                "-outdir=%OUTDIR%",
                "%DOC%"
              ],
              "env": {

              }
            },
そこに-pdfが書いてあるせいです。これを書かれてしまうと latexmkrc が $pdf_mode を指定しても無視するんですよね…勘弁してほしいなあ…

(2021年12月追記:最近では "latexmk(latexmkrc)"というものが追加されており、argsに何も設定されていないモードが追加されていましたので、これを使うとよいでしょう。)  

対策は、latexmk のツールの設定を上書きし、 -pdf オプションを外すことです。
ファイル→基本設定→設定、を選び、latex-workshop.latex.tools を検索し、settings.json をクリックします。
表示されるjsonファイルに "latex-workshop.latex.tools" 要素を入れてしまいましょう。 補完入力に乗っかると全部書かれてしまいますが、latexmk の args(引数)に該当する部分をよく見て、
    "latex-workshop.latex.tools": [
        {
            "name": "latexmk",
            "command": "latexmk",
            "args": [
                "-synctex=1",
                "-interaction=nonstopmode",
                "-file-line-error",
                "-outdir=%OUTDIR%",
                "%DOC%"
            ],
            "env": {}
        }
    ]
などとすればよいでしょう。

0 件のコメント: