なるべくデフォルトのまま使いたい人へ

# なるべくデフォルトのまま使いたい人へ

LaTeX Workshop を “なるべくデフォルトのまま” 日本語の文書を作成できる構成に変更したい。

:::note info
**[LaTeX Workshop \| James Yu](https://marketplace.visualstudio.com/items?itemName=James-Yu.latex-workshop)**
投稿時; **ver.8.26.0**（2022/05 現在）、最終更新時; **ver.9.19.1**
:::

設定には JSON の編集が伴うため、settings.json や keybindings.json の編集について分からない場合には [\# この節][sec-editsettings] を参考にしてください。

[sec-editsettings]: #settingsjson-と-keybindingsjson-の編集 "§ settings.json と keybindings.json の編集"

## この記事のモチベーション

以下の 2 つのツイートを見つけました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">LaTeX Workshop（VS Code のプラグイン）は、ユーザ側に大きなカスタマイズの自由度を持たせているんだけど、<br>「既定は pdfLaTeX 用しかないので日本語文書のために何かカスタマイズが必要」<br> となったときにそれが仇になって、ネット上に多種多様な設定が溢れかえる状態に陥っている😩<a href="https://twitter.com/hashtag/TeX?src=hash&amp;ref_src=twsrc%5Etfw">#TeX</a> <a href="https://twitter.com/hashtag/TeXLaTeX?src=hash&amp;ref_src=twsrc%5Etfw">#TeXLaTeX</a></p>&mdash; 某 ZR（ざんねん🙃）(@zr_tex8r) <a href="https://twitter.com/zr_tex8r/status/1398527910475038724?ref_src=twsrc%5Etfw">May 29, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">LaTeX Workshop は、意味もわからずに誰かの設定をコピペするぐらいなら、何も設定しないほうがそのままで動くし、エエと思うんやけどな。<a href="https://twitter.com/hashtag/TeXQA?src=hash&amp;ref_src=twsrc%5Etfw">#TeXQA</a> <a href="https://twitter.com/hashtag/%E3%83%86%E3%83%95%E3%83%A9%E3%82%A4%E3%83%96?src=hash&amp;ref_src=twsrc%5Etfw">#テフライブ </a>！</p>&mdash; Munehiro Yamamoto (@munepixyz) <a href="https://twitter.com/munepixyz/status/1506987773680812038?ref_src=twsrc%5Etfw">March 24, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

であれば「なるべくデフォルトの設定のまま構成してみよう！」と言うのがこの記事のモチベーションです。

## ★ 概要

以下の設定を必要なタイプセット方法に変更すれば良いです。したがって、settings.json に以下の設定を追加します。

```jsonc
// settings.json
  "latex-workshop.latex.recipe.default": "first"
//                                          ↑ この値を変更するだけ
```

> [\# `latex-workshop.latex.recipe.default` \- Compile \- James-Yu/LaTeX-Workshop Wiki](https://github.com/James-Yu/LaTeX-Workshop/wiki/Compile#latex-workshoplatexrecipedefault)

| タイプセット方法 |                         値                          |
| :--------------: | :-------------------------------------------------: |
|    (u)pLaTeX     | `"latexmk (latexmkrc)"` <br>（`.latexmkrc` 要作成） |
|     LuaLaTeX     |               `"latexmk (lualatex)"`                |

※ recipes を変更している場合には、これらの値を利用できない場合があります。変更している場合には、構成した recipe 名を指定することが出来ます。

## ■ デフォルトで設定されているタイプセット方法

デフォルトで設定されているタイプセット方法は大きく分けて 2 つがあります。

- デフォルトで利用可能なタイプセット方法 9 つ
- 構成によって指定可能なタイプセット方法 2 つ（※印のもの）

より詳細は以下の表。

|      デフォルトのタイプセット方法      | 実行されるコマンド                                                           |
| :------------------------------------: | :--------------------------------------------------------------------------- |
|              `"latexmk"`               | latexmk から pdfLaTeX を実行                                                 |
|        `"latexmk (latexmkrc)"`         | `.latexmkrc` ファイルを利用したタイプセット                                  |
|         `"latexmk (lualatex)"`         | latexmk から LuaLaTeX を実行                                                 |
|         `"latexmk (xelatex)"`          | latexmk から XeLaTeX を実行                                                  |
| `"pdflatex -> bibtex -> pdflatex * 2"` | pdfLaTeX を実行 → BibTeX を実行 → pdfLaTeX を 2 回を実行                     |
|         `"Compile Rnw files"`          | Rscript から [knitr][knitr_repository] を実行 → latexmk から pdfLaTeX を実行 |
|         `"Compile Jnw files"`          | [Weave.jl][weave.jl_repository] を実行 → latexmk から pdfLaTeX を実行        |
|         `"Compile Pnw files"`          | [Pweave][pweave.py_repository] を実行 → latexmk から pdfLaTeX を実行         |
|              `"tectonic"`              | [Tectonic][tectonic_repository] を利用してタイプセットする                   |
|         `"first"` <sup>※</sup>         | recipe の先頭を実行 <br>（デフォルトでは最上の `"latexmk"` が実行される）    |
|       `"lastUsed"` <sup>※</sup>        | 最後に実行されたレシピを実行                                                 |

[weave.jl_repository]: https://github.com/JunoLab/Weave.jl "Scientific reports/literate programming for Julia - GitHub"
[pweave.py_repository]: https://github.com/mpastell/Pweave "Pweave is a scientific report generator and a literate programming tool for Python. It can capture the results and plots from data analysis and works well with numpy, scipy and matplotlib. - GitHub"
[knitr_repository]: https://github.com/yihui/knitr "A general-purpose tool for dynamic report generation in R - GitHub"
[tectonic_repository]: https://github.com/tectonic-typesetting/tectonic "A modernized, complete, self-contained TeX/LaTeX engine, powered by XeTeX and TeXLive. - GitHub"

Rnw・Jnw・Pnw はそれぞれ R・Julia・Python のコードチャンクが含まれた LaTeX ファイルです。これら Rnw や Jnw に関しては、以下を参照してください。

> [\# Literate programming support using LaTeX \- ExtraFeatures \- James-Yu/LaTeX-Workshop Wiki](https://github.com/James-Yu/LaTeX-Workshop/wiki/ExtraFeatures#literate-programming-support-using-latex)

<details>
<summary>【確認用】デフォルトの tools と recipes（折りたたみ）</summary>

多くの記事は、以下の tools と recipes の構成を上書きすることで、必要なタイプセットを実行するようにしています。これらを変更した場合でも、※印の方法は指定することが出来ます。

以下の構成は 9.10 時点での設定です。これはコピペすることなくデフォルトで利用することが出来ます。

```json
    "latex-workshop.latex.tools": [
      {
        "name": "latexmk",
        "command": "latexmk",
        "args": [
          "-synctex=1",
          "-interaction=nonstopmode",
          "-file-line-error",
          "-pdf",
          "-outdir=%OUTDIR%",
          "%DOC%"
        ],
        "env": {}
      },
      {
        "name": "lualatexmk",
        "command": "latexmk",
        "args": [
          "-synctex=1",
          "-interaction=nonstopmode",
          "-file-line-error",
          "-lualatex",
          "-outdir=%OUTDIR%",
          "%DOC%"
        ],
        "env": {}
      },
      {
        "name": "xelatexmk",
        "command": "latexmk",
        "args": [
          "-synctex=1",
          "-interaction=nonstopmode",
          "-file-line-error",
          "-xelatex",
          "-outdir=%OUTDIR%",
          "%DOC%"
        ],
        "env": {}
      },
      {
        "name": "latexmk_rconly",
        "command": "latexmk",
        "args": [
          "%DOC%"
        ],
        "env": {}
      },
      {
        "name": "pdflatex",
        "command": "pdflatex",
        "args": [
          "-synctex=1",
          "-interaction=nonstopmode",
          "-file-line-error",
          "%DOC%"
        ],
        "env": {}
      },
      {
        "name": "bibtex",
        "command": "bibtex",
        "args": [
          "%DOCFILE%"
        ],
        "env": {}
      },
      {
        "name": "rnw2tex",
        "command": "Rscript",
        "args": [
          "-e",
          "knitr::opts_knit$set(concordance = TRUE); knitr::knit('%DOCFILE_EXT%')"
        ],
        "env": {}
      },
      {
        "name": "jnw2tex",
        "command": "julia",
        "args": [
          "-e",
          "using Weave; weave(\"%DOC_EXT%\", doctype=\"tex\")"
        ],
        "env": {}
      },
      {
        "name": "jnw2texminted",
        "command": "julia",
        "args": [
          "-e",
          "using Weave; weave(\"%DOC_EXT%\", doctype=\"texminted\")"
        ],
        "env": {}
      },
      {
        "name": "pnw2tex",
        "command": "pweave",
        "args": [
          "-f",
          "tex",
          "%DOC_EXT%"
        ],
        "env": {}
      },
      {
        "name": "pnw2texminted",
        "command": "pweave",
        "args": [
          "-f",
          "texminted",
          "%DOC_EXT%"
        ],
        "env": {}
      },
      {
        "name": "tectonic",
        "command": "tectonic",
        "args": [
          "--synctex",
          "--keep-logs",
          "%DOC%.tex"
        ],
        "env": {}
      }
    ],
    "latex-workshop.latex.recipes": [
      {
        "name": "latexmk",
        "tools": [
          "latexmk"
        ]
      },
      {
        "name": "latexmk (latexmkrc)",
        "tools": [
          "latexmk_rconly"
        ]
      },
      {
        "name": "latexmk (lualatex)",
        "tools": [
          "lualatexmk"
        ]
      },
      {
        "name": "latexmk (xelatex)",
        "tools": [
          "xelatexmk"
        ]
      },
      {
        "name": "pdflatex -> bibtex -> pdflatex * 2",
        "tools": [
          "pdflatex",
          "bibtex",
          "pdflatex",
          "pdflatex"
        ]
      },
      {
        "name": "Compile Rnw files",
        "tools": [
          "rnw2tex",
          "latexmk"
        ]
      },
      {
        "name": "Compile Jnw files",
        "tools": [
          "jnw2tex",
          "latexmk"
        ]
      },
      {
        "name": "Compile Pnw files",
        "tools": [
          "pnw2tex",
          "latexmk"
        ]
      },
      {
        "name": "tectonic",
        "tools": [
          "tectonic"
        ]
      }
    ],
```

</details>

## ■ 特定のタイプセット方法を利用する

デフォルトで指定できるタイプセット方法は、特別な 2 つの方法と recipe で構成された 9 つの方法の計 11 の方法です。

|                                                                                                                                                                                                                                         |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| `"first"`, `"lastUsed"`, `"latexmk"`, `"latexmk (latexmkrc)"`, `"latexmk (lualatex)"`, `"latexmk (xelatex)"`, `"pdflatex -> bibtex -> pdflatex * 2"`, `"Compile Rnw files"`, `"Compile Jnw files"`, `"Compile Pnw files"`, `"tectonic"` |

デフォルトでは `"first"` が指定されており、latexmk を利用して pdfLaTeX が実行されるようになっています。LaTeX で日本語文書を作成するには、(u)pLaTeX か LuaLaTeX を利用する必要があるため、これを変更する必要があります。

これを変更するには、以下の設定を変更する。

```jsonc
// settings.json
  "latex-workshop.latex.recipe.default": "first"
```

### ▽ LuaLaTeX の場合

latexmk を利用して LuaLaTeX を実行すれば良いので、settings.json に以下の設定を追加します。

```jsonc
// settings.json
  "latex-workshop.latex.recipe.default": "latexmk (lualatex)"
```

### ▽ (u)pLaTeX の場合

(u)pLaTeX を利用する方法はデフォルトで提供されていません。しかし、`.latexmkrc` を作成することで対応することが出来ます。

このため、settings.json に以下の設定を追加します。

```jsonc
// settings.json
  "latex-workshop.latex.recipe.default": "latexmk (latexmkrc)"
```

ホームディレクトリか LaTeX ファイルのあるカレントディレクトリに `.latexmkrc` を作成し設置します。

- pLaTeX を利用する場合の `.latexmkrc` の例
    ```perl
    #!/usr/bin/env perl
        $latex = 'platex %O -kanji=utf8 -no-guess-input-enc -synctex=1 -interaction=nonstopmode %S';
        $dvipdf = 'dvipdfmx %O -o %D %S';
        $pdf_mode = 3;
    ```
- upLaTeX を利用する場合の `.latexmkrc` の例
    ```perl
    #!/usr/bin/env perl
        $latex = 'uplatex %O -kanji=utf8 -no-guess-input-enc -synctex=1 -interaction=nonstopmode %S';
        $dvipdf = 'dvipdfmx %O -o %D %S';
        $pdf_mode = 3;
    ```

ちなみに、記事のコンセプトとは異なりますが、tools と recipes に (u)pLaTeX を追加することでも対応できます。これは `.latexmkrc` を作りたくない人向けです。

<details>
<summary>latexmk を使った (u)pLaTeX のための settings.json の構成（折りたたみ）</summary>

例えば、`latex-workshop.latex.tools` でデフォルトの記述に続いて以下のように記述します。（これは `.latexmkrc` における `$latex` を `-latex=` 以下に、`$dvipdf` や `$pdf_mode` を `-e` 以下に追加しているだけです）

```jsonc
  // "latex-workshop.latex.tools": [
    //
    // ここまではデフォルトの構成が記述されている
    {
      "name": "platexmk",
      "command": "latexmk",
      "args": [
        "-synctex=1",
        "-interaction=nonstopmode",
        "-file-line-error",
        "-latex=\"platex -kanji=utf8\"",
        "-e",
        "\"$dvipdf = 'dvipdfmx %O -o %D %S'; $pdf_mode = 3\"",
        "-outdir=%OUTDIR%",
        "%DOC%"
      ],
      "env": {}
    },
    {
      "name": "uplatexmk",
      "command": "latexmk",
      "args": [
        "-synctex=1",
        "-interaction=nonstopmode",
        "-file-line-error",
        "-latex=\"uplatex -kanji=utf8\"",
        "-e",
        "\"$dvipdf = 'dvipdfmx %O -o %D %S'; $pdf_mode = 3\"",
        "-outdir=%OUTDIR%",
        "%DOC%"
      ],
      "env": {}
    },
  // ]
```

tools で `platexmk` と `uplatexmk` が構成できたので、`latex-workshop.latex.recipes` で以下のように記述します。

```jsonc
  // "latex-workshop.latex.recipes": [
    //
    // ここまではデフォルトの構成が記述されている
    {
      "name": "platex (latexmk)",
      "tools": [
        "platexmk"
      ]
    },
    {
      "name": "uplatex (latexmk)",
      "tools": [
        "uplatexmk"
      ]
    },
  // ]
```

</details>

## ■ BibTeX や biber を利用したい

BibTeX や biber を利用して参考文献リストを作成したい場合も、デフォルトでは提供されていません。`.latexmkrc` を作成することで対応します。また、索引を作成するために (up)mendex を利用したい場合にも同様に `.latexmkrc` を作成する必要があります。

したがって、settings.json に以下の設定を追加すれば良い。

```jsonc
// settings.json
  "latex-workshop.latex.recipe.default": "latexmk (latexmkrc)"
```

ここでは latexmk についての知識が必要になるため、各自調べてください。latexmk については、以下の記事や公式ドキュメントを参照してください。

- [Latexmk から学ぶ PDF 化までの処理の流れ - Qiita](https://qiita.com/Rumisbern/items/d9de41823aa46d5f05a8)
- [latexmk \- CTAN](https://www.ctan.org/pkg/latexmk)（公式ドキュメント）

その他にも `.latexmkrc` に関して適切に作成・編集することでさまざまなタイプセット方法に対応することが出来ます。

## ■ その他の設定

デフォルトではどのように設定されているか列挙しておきます。各項目には公式 Wiki の該当箇所を参照しています。

- LaTeX ファイルに関連するファイルの変更が検知されたら自動的にタイプセットされる <sup>[[↗]][auto-build-latex]</sup>
- 中間ファイルは LaTeX ファイルと同じディレクトリに生成する <sup>[[↗]][latex-workshoplatexoutDir]</sup>
- 中間ファイルを削除しない <sup>[[↗]][latex-workshoplatexautoCleanrun]</sup>
- 更新された PDF を 1 ページ目から表示 <sup>[[↗]][latex-workshopsynctexafterBuildenabled]</sup>

[auto-build-latex]: https://github.com/James-Yu/LaTeX-Workshop/wiki/Compile#auto-build-latex
[latex-workshoplatexoutDir]: https://github.com/James-Yu/LaTeX-Workshop/wiki/View#latex-workshoplatexoutDir
[latex-workshoplatexautoCleanrun]: https://github.com/James-Yu/LaTeX-Workshop/wiki/Compile#latex-workshoplatexautoCleanrun
[latex-workshopsynctexafterBuildenabled]: https://github.com/James-Yu/LaTeX-Workshop/wiki/View#latex-workshopsynctexafterBuildenabled

この他にもさまざまな設定があります。公式 Wiki や構築記事を参照すると良いでしょう。

### ▽ 文書エディタとしての設定

VSCode は日本語などのプログラミング以外の自然言語の編集に関してデフォルトで対応しません。そのため、いくつかの設定から日本語が編集しやすいように調整する必要があります。また、LaTeX を編集する上でいくつか構成しておくと良い設定があります。

多くの場合、LaTeX のみで設定したいため、次のように `"[latex]": {...}` で囲って設定すると良いでしょう。

```jsonc
// settings.json
  "[latex]": {
    // Some settings
  }
```

これらの設定は以下の記事を参照すると良いでしょう。

> [\# LaTeX エディタとしての設定 \- LaTeX Workshop を使いこなす \- Qiita](https://qiita.com/Yarakashi_Kikohshi/items/a9357dd469320ffb65a0#-latex-%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF%E3%81%A8%E3%81%97%E3%81%A6%E3%81%AE%E8%A8%AD%E5%AE%9A)

ここでの設定は LaTeX Workshop とは関係がなく、VSCode から提供されている設定となっています。

### ▽ キーボードショートカットの追加

2 つのキーボードショートカットを追加しておくと良いでしょう。

- タイプセットを強制的に停止させる：
    　　↳ `Ctrl+Alt+K` (`Cmd+Alt+K`)
- 詳細なログを表示させる：
    　　↳ `Ctrl+Shift+U` (`Shift+Cmd+U`)
- 他のタイプセット方法を選択する：
    　　↳ `Ctrl+Alt+T` (`Cmd+Alt+T`)

<details>
<summary>keybindings.json（折りたたみ）</summary>

Windows、Linux の場合：

```jsonc
// keybindings.json
[
    {
        "key": "ctrl+alt+k",
        "command": "latex-workshop.kill",
        "when": "editorLangId == latex",
    },
    {
        "key": "ctrl+shift+u",
        "command": "latex-workshop.compilerlog",
        "when": "workbench.panel.output.active && editorLangId == latex",
    },
    {
        "key": "ctrl+alt+t",
        "command": "latex-workshop.recipes",
        "when": "editorLangId == latex",
    },
]
```

macOS の場合：

```jsonc
// keybindings.json
[
    {
        "key": "cmd+alt+k",
        "command": "latex-workshop.kill",
        "when": "editorLangId == latex",
    },
    {
        "key": "shift+cmd+u",
        "command": "latex-workshop.compilerlog",
        "when": "workbench.panel.output.active && editorLangId == latex",
    },
    {
        "key": "cmd+alt+t",
        "command": "latex-workshop.recipes",
        "when": "editorLangId == latex",
    },
]
```

</details>

## ■ 実際に使う

ざっくり使い方を紹介します。

1. LaTeX ファイルを作成する
    ```latex
    % sample.tex
    \documentclass{jlreq}
    \begin{document}
    初めまして、\LaTeX{}!!
    \end{document}
    ```
2. `Ctrl+Alt+B` (`Cmd+Alt+B`) を押下
3. PDF が作成されたら `Ctrl+Alt+V` (`Cmd+Alt+V`) を押下
4. `Ctrl+Alt+J` (`Cmd+Alt+J`) を押下すると、カーソルのある位置の PDF 上にジャンプ（SyncTeX による Forward search）

[partial-pull-merging]: https://github.com/James-Yu/LaTeX-Workshop/pull/3292#partial-pull-merging

エラーが発見された場合には、ポップアップが右下に表示される。エラーの詳細は、`Ctrl+Shift+M` (`Shift+Cmd+M`) を押下することで一覧を見ることが出来ます。

エラーの見方については以下の記事を参照してください。

https://qiita.com/Yarakashi_Kikohshi/items/4ede21b06d094ad3b89e

ちなみに、ポップアップに `spawn latexmk ENOENT` が表示された場合には、latexmk が利用できない環境にあります。“latexmk がインストールされているか” や “パスが上手く設定されているか” を確認する必要があります。

# 参考

- [Home · James-Yu/LaTeX-Workshop Wiki](https://github.com/James-Yu/LaTeX-Workshop/wiki)
- [Latexmk - TeX Wiki](https://texwiki.texjp.org/?Latexmk#ke005cd5)

# まとめ

このような構築方法では、タイプセット方法を変更したいほとんどの場合、`.latexmkrc` ファイルを編集するだけで済むようになります。

さまざまな構築記事が乱立する中で、tools と recipes を再考せずに構築しているものは確認できませんでした。なるべくデフォルトのまま構成することで、混乱が減れば良いですね。

また、latexmk が使いづらく感じた場合には、[llmk][llmk_article] や [ClutTeX][cluttex_article] を利用するなど、他のビルドツールに乗り換えても良いでしょう。
この際には tools と recipes を編集する必要があります。

[llmk_article]: https://blog.wtsnjp.com/2020/12/20/llmk-basics/
[cluttex_article]: https://blog.miz-ar.info/2018/10/cluttex-release/

## settings.json と keybindings.json の編集

**Default ではない** ことに注意してください。

1. `Ctrl+Shift+P` (`Shift+Cmd+P`) からコマンドパレットを開く
    - “**uset**” と打ち `Preferences: Open User settings (JSON)` を選択すると settings.json が開く
    - “**okey**” と打ち `Preferences: Open Keyboard Shortcuts (JSON)` を選択を選択すると keybindings.json が開く
2. 必要な設定を追加・保存

これらのファイルは JSON のため、フォーマットを守る必要がある。しかしながら、実体は JSONC であり、コメントを付記することが出来ます。

編集中に左下の :x: や :warning: に数字がある場合、JSON ファイルにエラーや警告が含まれています。このままでは適切な設定が出来ていません。`Ctrl+Shift+M` (`Shift+Cmd+M`) からエラーや警告の内容を確認すると良いでしょう。

## `.latexmkrc` のファイルタイプ指定

`.latexmkrc` は拡張子が指定されないため、シンタックスハイライトが上手くかからないことがあります。`.latexmkrc` は Perl のシンタックスハイライトが加わると編集する際に少しだけ楽になります。

以下の設定を追加すると `.latexmkrc` に Perl のシンタックスハイライトが加わるようになります。

```json
  "files.associations": {
    ".latexmkrc": "perl",
  },
```

# 追記

- 2022/07/12: キーバインドの表示を macOS にも対応。
- 2022/08/20: 軽微修正。
- 2022/09/09: `.latexmkrc` のファイルタイプの指定方法を追記。
- 2023/05/16: 最新の 9.10 に更新。
- 2024/03/27: キーボードショートカットを追加。
- 2024/03/28: (u)pLaTeX に関する tools と recipes への追加に関する記述を追加。