Introduction
諸般の事情でローカルの1環境内に日本語論文環境×2と英語論文×1を同居させて、それぞれで柔軟にタイプセットしたかった。
そこで、VSCodeでLaTeXをタイプセットする環境の構築と設定方法、複数のLaTeX環境をフォルダごとに切り替えて使う必要がある人(私)に向けた記事です。
前提としてVS Codeの設定ファイルsettings.jsonを編集できる必要があります。権限とか、場所とか、書き方とか。そこまで丁寧に書かないです。わからないけどやらねばならない方は調べてください。
諸般の事情
どれも捨てられない環境3つを同居させる必要性が生じてしまった。
具体的には、添削等(卒論、修論、ついでに学会原稿)、日本語の投稿論文、英語の投稿論文で必要な環境が全部違った。
想定する環境
- Mac系のPC
- TeX LiveもしくはTeX Shop導入済み
- VS CodeとVS CodeのLaTeX拡張機能導入済み
- globalのsettings.jsonを変更しても怒られない(重要!)
- .vscodeディレクトリを自分で作って置ける(重要!)
最終的な状態
全体的な環境
- pdflatexと(u)pLaTeX + dvipdfmxを簡単な設定で切り替え
- upLaTeX + pdflatex (+pbibtex)
- pLaTeX + dvipdfmx (+pbibtex)
- upLaTeX + divpdfmx (+pbibtex)
- なるべく可搬性が高い(他の環境に投げ込んでも動く)
各ファイルのコンパイル(タイプセット)
- あるTeXファイルでタイプセットした時、あらかじめ設定したエンジンを使用する
- ファイルは保存したときに、自動でコンパイルされる
- 1回のコンパイルでbibまで全部やる
- 入力補完をする
結論
全体としては「共通して使用できる設定はlatexmkrcに記載して、それ以外の部分はsettings.jsonで補完する」「各ワークスペースフォルダに.vscodeフォルダを作成し、そこに用のsettings.jsonを格納する」という方針が良さげでした。
#!/usr/bin/env perl
# LaTeX
$latex_opteions = '%O -no-guess-input-enc -synctex=1 -interaction=nonstopmode %S';
$latex = 'uplatex'.$latex_options;
$max_repeat = 6;
# BibTeX
$bibtex = 'pbibtex %O %B';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars %O %S';
# index
$makeindex = 'upmendex %O -o %D %S';
# DVI / PDF
$pdflatex = 'pdflatex'.$latex_options;
$dvipdf = 'dvipdfmx %O -o %D %S';
# preview
$pvc_view_file_via_temporary = 0;
if ($^O eq 'linux') {
$dvi_previewer = "xdg-open %S";
$pdf_previewer = "xdg-open %S";
} elsif ($^O eq 'darwin') {
$dvi_previewer = "open %S";
$pdf_previewer = "open %S";
} else {
$dvi_previewer = "start %S";
$pdf_previewer = "start %S";
}
# clean up
$clean_full_ext = "%R.synctex.gz"
{
"[tex]": {
// スニペット補完中にも補完を使えるようにする
"editor.suggest.snippetsPreventQuickSuggestions": false,
// インデント幅を2にする
"editor.tabSize": 2
},
"[latex]": {
// スニペット補完中にも補完を使えるようにする
"editor.suggest.snippetsPreventQuickSuggestions": false,
// インデント幅を2にする
"editor.tabSize": 2
},
"[bibtex]": {
// インデント幅を2にする
"editor.tabSize": 2
},
// ---------- LaTeX Workshop ----------
// 使用パッケージのコマンドや環境の補完を有効にする
"latex-workshop.intellisense.package.enabled": true,
"latex-workshop.synctex.afterBuild.enabled":true,
// 生成ファイルを削除するときに対象とするファイル
// デフォルト値に "*.synctex.gz" を追加
"latex-workshop.latex.clean.fileTypes": [
"*.aux",
"*.bbl",
"*.blg",
"*.idx",
"*.ind",
"*.lof",
"*.lot",
"*.out",
"*.toc",
"*.acn",
"*.acr",
"*.alg",
"*.glg",
"*.glo",
"*.gls",
"*.ist",
"*.fls",
"*.log",
"*.fdb_latexmk",
"*.snm",
"*.nav",
"*.dvi",
"*.synctex.gz"
],
// 生成ファイルを "out" ディレクトリに吐き出す
"latex-workshop.latex.outDir": "out",
// ビルドのレシピに使われるパーツ
"latex-workshop.latex.tools": [
{
"name": "ja_pLaTeX-dvi",
"command": "latexmk",
"args": [
"-e", "$pdf_mode = 3",
"-f",
"-gg",
"-pdfdvi",
"-latex=\"platex\"",
"-latexoption=\"-kanji=utf8\"",
"-halt-on-error",
"-file-line-error",
"-outdir=%OUTDIR%",
"%DOC%",
]
},
{
"name": "ja_upLaTeX-dvi",
"command": "latexmk",
"args": [
"-e", "$pdf_mode = 3",
"-f",
"-gg",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-outdir=%OUTDIR%",
"%DOC%"
]
},
{
"name": "en_upLaTeX-pdflatex",
"command": "latexmk",
"args": [
"-e", "$pdf_mode = 1",
"-f",
"-gg",
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-outdir=%OUTDIR%",
"%DOC%"
]
}
],
"latex-workshop.view.pdf.viewer": "tab",
"editor.linkedEditing": true,
"editor.snippetSuggestions": "top",
"editor.suggest.showWords": false,
"latex-workshop.latex.autoBuild.run": "onSave",
"files.insertFinalNewline": true, // お好みで
}
{
// 行の折り返し設定
"editor.wordWrap": "on", // お好みで
"editor.wrappingIndent": "indent", // お好みで
// 行末空白の除去
"files.trimTrailingWhitespace": true, // お好みで
// ビルドのレシピ
"latex-workshop.latex.recipes": [
{
"name": "en_default",
"tools": [
"en_upLaTeX-pdflatex"
]
},
],
}
参考文献的な話
この辺りを参考にしました。先駆者に感謝。
細かい設定の解説などはリンク先を参照してください。
全体の構成
.latexmkrc
基本的には共通して使用する設定やオプションの構成を担います。
今回、pdflatexとdvipdfmxを同居させるので、.latexmkrc内にpdf_modeを記載していません。これがベストプラクティスかどうかはわかんないんですが。
このファイルに関しては参考文献として先に挙げたサイト様が書いてくださってるものをベースに組み合わせてるだけなので、解説は譲ります。
#!/usr/bin/env perl
# LaTeX
$latex_opteions = '%O -no-guess-input-enc -synctex=1 -interaction=nonstopmode %S';
$latex = 'uplatex'.$latex_options;
$max_repeat = 6;
# BibTeX
$bibtex = 'pbibtex %O %B';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars %O %S';
# index
$makeindex = 'upmendex %O -o %D %S';
# DVI / PDF
$pdflatex = 'pdflatex'.$latex_options;
$dvipdf = 'dvipdfmx %O -o %D %S';
# preview
$pvc_view_file_via_temporary = 0;
if ($^O eq 'linux') {
$dvi_previewer = "xdg-open %S";
$pdf_previewer = "xdg-open %S";
} elsif ($^O eq 'darwin') {
$dvi_previewer = "open %S";
$pdf_previewer = "open %S";
} else {
$dvi_previewer = "start %S";
$pdf_previewer = "start %S";
}
# clean up
$clean_full_ext = "%R.synctex.gz"
settings.json
こちらも先に上げたサイト様のものをほぼ使わせていただいてます。
3環境を同居させるにあたって、ちょっとだけ構成を変えてます。
具体的に言えば、
- ビルドレシピをglobal設定の方から無くした
- pdf_modeの設定をtoolsでしてる
部分です。この構成がベストかはわからないですが、動きます。
pdf_mode
-eというオプションはどうやらその直後にきたものをperlと解釈するようなので、それぞれのツールで引数として設定しています。dviは3、pdflatexは1、出力しない場合は0を渡せば良いです。
latex
latexに指定するものに関してはどっちでも構いません。upLaTeXをデフォルトにするならpLaTeXを使うツールに、pLaTeXをデフォルトにするならupLaTeXを使うツールに、それぞれ設定をかける必要があるだけです。私の場合はupLaTeXをベースにしています。
// ビルドのレシピに使われるパーツ
"latex-workshop.latex.tools": [
{
"name": "ja_pLaTeX-dvi",
"command": "latexmk",
"args": [
"-e", "$pdf_mode = 3", // pdf出力の調節
"-f",
"-gg",
"-pdfdvi",
"-latex=\"platex\"", // ここ
"-latexoption=\"-kanji=utf8\"",
"-halt-on-error",
"-file-line-error",
"-outdir=%OUTDIR%",
"%DOC%",
]
},
-latexoptionはすでにあるオプションに対して、オプションを追加するやつらしいです(詳しく知りたい方はlatexmk --helpで参照可能)。
日本語をタイプセットするため、-kanjiを追加しましたが、よく分かってはいません。いろんな人が記事にしてるので調べたら多分理由がわかると思います。多分utf-8になってない字があるとかそういうでは?とは思ってる。
settings.json(workspeace)
どうしてこっちでわざわざレシピを設定しているの?という話をまず。
参考にしたサイトでも言われていますが、基本的に設定したレシピは最初のものがデフォルトとみなされます。
実はこれが困るわけです。単純な保存動作でタイプセットしたいので、デフォルトが使われると不都合な場合があります。
実は今回同居させる環境、タイミングによってどれをよく使うかが変わるという少々面倒な状態。なんなら1日で全ての環境でコンパイルするような時もあります。
「どのファイルがどの環境でコンパイルしなければならないのか」というのを一度設定するだけで、以後気にしなくて良いというのは負荷がかなり少なくてGood。
これを一気に解決できる(多分)のが、ワークスペースごとに.vscodeディレクトリを作ってsettings.jsonを配置し、そのプロジェクト内でだけ設定を適用すること。どうせ一番最初に文書を作るときには何でコンパイルするのかを意識するので、認知的な負荷や手間がかなり削減されます。
後何と言っても都合がいいのは、折り返しだったりの設定をそれぞれにできること。細かい設定をプロジェクトごとにできるというのは、拡張性を考えると欠かせないポイントです。
これは、英語論文用の環境の例です。
{
// 行の折り返し設定
"editor.wordWrap": "on", // お好みで
"editor.wrappingIndent": "indent", // お好みで
// 行末空白の除去
"files.trimTrailingWhitespace": true, // お好みで
// ビルドのレシピ
"latex-workshop.latex.recipes": [
{
"name": "en_default",
"tools": [
"en_upLaTeX-pdflatex"
]
},
],
}
nameはマジでなんでもいいので、日が経ってから開いて「あーーこれ英語のやつか」となるくらいの名前とかにしています。
pdf出力なしの環境をそれぞれに作って、pdfが必要なら明示的に実行するとかでもいいかもしれないですね。
おわりに
なんでこんな環境ごちゃごちゃなんだろうな……?と思いながら調べてどうにかした感じなので、同じような苦しみと悲しみを抱えた人間の役に立てば嬉しいです。
いい加減に情処は論文誌の方のテンプレをupLaTeXでタイプセットできるようにしてくれ。何も知らなくてびっくりしたんだから。
実は想定読者として、今度戻ってくる同期くんを考えながら書きました。もし同じことに悩んでたら、そのときの君に届け〜!
どうせ研究室の中に残していくような気はするけどね。
参考文献(再掲含む)
採用はしなかったけど参照したもの