はじめに
この記事は,
- LaTeXをvscodeで書いている人
- 基本的な環境構築はできている人
- pdflatex,uplatex,lualatexなど,様々なエンジンの文書を扱う機会がある人
といった条件に当てはまる人が対象です.
問題発生
私はvscodeのLaTeX WorkshopでLaTeXを執筆しており,少し前に(日本語の文書において)uplatexからlualatexへ移行した.そのこともあって,最近書いた文書はlualatexで,昔書いた文書はuplatexという状況にある.なので,
- uplatex用のレシピ
- lualatex用のレシピ
の2つを用意し,文書に合わせて適切な方を選ぶようにして,解決した.
非常にめんどくさい!!!!
欲を言えば,いちいち2つのレシピから適切な方を選択することなく,なにも考えずに,cmd + option + B (WindowsならCtrl + Alt + B)を押しただけで,もう勝手になにもかも上手く行ってほしいものである.
そこで,TeX文書の1行目におまじないを書くことで,うまくいくようにならないか考えた.例えば,uplatexを使いたかったら,
% uplatex
\documentclass{jsarticle}
などとかくということである(% uplatexがおまじない).
色々と考えた結果,これでうまくいくようになった.
setting.json
まず,vscodeのsetting.jsonの一部の記述を,次のようにした.
// レシピ
"latex-workshop.latex.recipes": [
{
"name": "latexmk",
"tools": [
"latexmk"
]
}
],
// ツール
"latex-workshop.latex.tools": [
{
"name": "latexmk",
"command": "latexmk",
"args": [
"-outdir=%OUTDIR%",
"%DOC_EXT%" //拡張子をつけるため,重要
],
},
],
見て分かる通り,1つのレシピしか用意してない.なぜなら,絶対にレシピの切り替えを手作業でやりたくないからである.
また,"latex-workshop.latex.tools"の"args"は,必ず%DOC%ではなく%DOC_EXT%にする(拡張子.texがついたままになる).
.latexmkrcを改良
次に,.latexmkrcを次のようにした.ちなみに,uplatexとlualatexに加えて,pdflatexにも対応できるようにしている.この.latexmkrcはホームディレクトリにおいておく.
#!/usr/bin/env perl
# DVI / PDF
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 4; # lualatex
foreach my $arg (@ARGV) {
next if $arg =~ /^-/;
next unless $arg =~ /\.tex$/;
next unless -f $arg && -r _ && ! -z _;
open(my $fh, '<', $arg) or next;
my $first_line = <$fh>;
close($fh);
if ($first_line =~ /pdflatex/i) {
$pdf_mode = 1; # pdflatex
last;
} elsif ($first_line =~ /uplatex/i) {
$pdf_mode = 3; # uplatex
last;
}
}
# LaTeX
$pdflatex = 'pdflatex -synctex=1 -interaction=nonstopmode -file-line-error %O %S';
$lualatex = 'lualatex -synctex=1 -interaction=nonstopmode -file-line-error %O %S';
$latex = 'uplatex -synctex=1 -interaction=nonstopmode -file-line-error %O %S';
$max_repeat = 10;
# BibTeX
$bibtex = 'upbibtex %O %S';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars %O %S';
# index
$makeindex = 'upmendex %O -o %D %S';
# preview
$pvc_view_file_via_temporary = 0;
if ($^O eq 'linux') {
$pdf_previewer = "xdg-open %S";
} elsif ($^O eq 'darwin') {
$pdf_previewer = "open %S";
} else {
$pdf_previewer = "start %S";
}
# clean up
$clean_full_ext = "%R.synctex.gz";
何をしているか簡単に説明すると,texファイルの1行目を読み取って,書かれているおまじないに応じて,$pdf_modeを変更しているだけである.
今回の場合,おまじないが書かれていなければlualatexが動くようになっているが,ここはお好みで変えてもらって構わない(その場合は,おまじないを読み取る部分も少し変更する必要がある).
実はもう環境は完成している.実際,
- uplatexを書きたかったら,texファイルの1行目に
% uplatexと書く - pdflatexを書きたかったら,texファイルの1行目に
% pdflatexと書く - lualatexを書きたかったら,texファイルの1行目におまじないは書かない
(あるいは,% lualatexと明示しても問題ない)
ということをすれば,勝手に.latexmkrcがうまく動いてくれるので,
あとはもうなにも考えずに,cmd + option + B (WindowsならCtrl + Alt + B)をポンと押すだけで良いのである.
2025/11/27に内容を次のように修正した:
- 修正前は,おまじないの書き方をマジックコメントの形式にしていたが,それだと,他のエディタで動かしたときに変にマジックコメントが読まれて意図しない挙動になるおそれがあったため,おまじないの書き方を,ただのコメントアウトにした(これなら,他のエディタでは確実に無視される).
-
.latexmkrcの可読性を改善した.
終わりに
これで,快適な執筆環境が構築できて,個人的にはかなり満足している.もしかしたら,.latexmkrcの改良などせずとも,もっと簡単にエンジンの自動切り替えを実現できるかもしれないが,調べた感じ見つからなかったので,私はしばらくこの環境で行こうと思う.
参考文献
.latexmkrcの# previewの部分に関しては,次のサイトを参考にした: