エラーと警告を読むゾ

# エラーと警告を読むゾ

LaTeX Workshop では、エラーや警告のメッセージが一覧で表示される。そのため、ターミナルログや LOG ファイルを読む必要はない。

これをきちんと使いたい。

<!-- LaTeX のエラーや警告はターミナルと LOG ファイルに記載される。これらのログにはエラーや警告以外のメッセージも含まれている。 -->

## Recipe terminated with error :confounded:

“Recipe terminated with error” で困っている人向けの節。

“Recipe terminated with error” は LaTeX のエラーメッセージではなく、「LaTeX Workshop がレシピを実行したが、エラーを含んで終了した」ことを知らせるメッセージである。そのため、LaTeX のエラーメッセージを確認する必要がある。

したがって、コンパイルしたときにポップアップが表示された際には、`Ctrl+Shift+M` (`Shift+Cmd+M`) を押下しよう。これによって開かれる PROBLEMS パネルにメッセージが記載されている。このメッセージの確認方法は [この節](#-problems-パネルでログメッセージを確認する) を参照。

もしも、この方法で解決できない場合にはそれぞれの節を参照。

- エラーメッセージが表示されない場合 <sup>[[ ↓ ]](#-正しくログを-latex-workshop-に引き渡す)</sup>
- “spawn xxxxx ENOENT” が表示される場合 <sup>[[ ↓ ]](#-enoent)</sup>

## ○ 正しくログを LaTeX Workshop に引き渡す

LaTeX はそもそもターミナルで利用するコマンドラインツールであり、LaTeX Workshop ではこれを簡便に実行するために tools と recipes が提供されている。ここで、tools には LaTeX のオプション引数を含めることが出来るが、必ず含めるべきものがいくつかある。これは LaTeX Workshop に正しくログを引き渡す要件として必要になる。

> [\# The PROBLEMS Pane displays wrong messages \- FAQ](https://github.com/James-Yu/LaTeX-Workshop/wiki/FAQ#the-problem-pane-displays-wrong-messages)

LaTeX Workshop に正しくログを引き渡す要件として、LaTeX に 2 つのオプション引数を課す必要がある。

- `-file-line-error`
- `-interaction=nonstopmode` or `-halt-on-error`

|       オプション引数       | 説明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| :------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
|     `-file-line-error`     | メッセージスタイルを `file:line:error` に変更。<br> LaTeX Workshop はこのスタイルでないとエラーなどの該当箇所にジャンプ出来ない。[<sup>[↗]</sup>][file-line-error]                                                                                                                                                                                                                                                                                                                                |
| `-interaction=nonstopmode` | LaTeX と対話せずに重大なエラー以外は適当に処理してエラーや警告としてターミナルログに出力する。<br> <div style="padding: 10px; margin-bottom: 10px; border: 1px dashed #333333;"> この他のモードは LaTeX Workshop で利用しても意味がない：<ul> <li><code>errorstopmode</code> (default), <code>scrollmode</code>: エラーがある場合、ユーザーに入力を求めるため不向き</li> <li><code>batchmode</code>: ターミナルログを生成しないので、LaTeX Workshop がエラーや警告を認識できない</li> </ul></div> |
|      `-halt-on-error`      | 初めのエラー箇所で処理を止める。<br> <div style="padding: 10px; margin-bottom: 10px; border: 1px dashed #333333;"> 以下の場合で有用：<ul><li> エラーを逐次確認したい場合</li> <li> エラーが大量に表示される場合</li> <li> 無限ループが発生する場合</li></ul></div>                                                                                                                                                                                                                                |

[file-line-error]: https://github.com/James-Yu/LaTeX-Workshop/wiki/FAQ#the-problem-pane-displays-wrong-messages:~:text=Please%20make%20sure%20at%20first%20that%20you%20call%20LaTeX%20compilers%20with%20an%20option%20%2Dfile%2Dline%2Derror.

<!-- `nonstopmode` と `-halt-on-error` を併用するとどうなるのかいまいち理解できていない。 -->

これを踏まえて基本的に、どの LaTeX を利用していても `~.tools` の `args` には少なくとも次のようにしておくべきだろう。

```json
  "latex-workshop.latex.tools": [
    {
      "name": "XXLaTeX",
      "command": "xxlatex",
      "args": [
        "-file-line-error",
        "-interaction=nonstopmode",
        "%DOC%"
      ],
    },
  ],
```

<!--
これは、ターミナルでは以下と等価である。（`%DOC%` は TeX ファイルの絶対パスのプレースホルダ）

```
$ xxlatex -file-line-error -interaction=nonstopmode %DOC%
```
-->

これに加えて、SyncTeX を利用して PDF と TeX ファイル間をジャンプしたい場合には、`-synctex=1` を追加しておくと良い。

これらの引数は `.latexmkrc` 内で課していても良いだろう。（ちなみに、latexmk における `-silent` オプションは `batchmode` に相当するらしい。）

### ■ コンパイルが終了しない

小さいファイルであっても終了しないパターンは次の 2 つが考えられる。

1. `nonstopmode` になっていない（対話モードになっている）
2. latexmk などのビルドツールでファイルを監視している（*e.g.* latexmk では `-pvc`）

この手の問題があるかどうかを検証するのであれば、以下のような意図的にエラーが生じるファイルをコンパイルしてみると良い。問題なければ、コンパイルが終了し PROBLEMS パネルに `Undefined control sequence.` と表示される。

```latex
\documentclass{article}
\begin{document}
  Hello, \LaTex{}!!
  % 正しくは `\LaTeX{}'
\end{document}
```

<!--
稀に終了しないパターンとして、LaTeX のコマンドオプション引数に `-interaction=nonstopmode` を含めていないために、LaTeX が対話モードで実行されているパターンがある。
LaTeX はユーザーの入力を待っているが、ユーザーは一向に入力しない。また、LaTeX Workshop は対話モードに対応していないため入力する手段もない。これでは終了しないのは当然である。

この問題は、`-interaction=nonstopmode` を含めれば解決するはずである。（もちろん、コンパイルが終了しないようなコードを組んでいる場合は除く）
-->

しかしながら、十分な時間が経ってもコンパイルが終了しない場合もある。このときにはプロセスを強制的に終了する必要がある。コマンドパレットから次のコマンドを実行する。

```
> LaTeX Workshop: Kill latex compiler process
```

あるいは、キーボードショートカットで以下のように追加しておくと、簡単に実行を停止することが出来る。以下では `Ctrl+Alt+K` とした。

```json
  {
    "key": "ctrl+alt+k",
    "command": "latex-workshop.kill",
    "when": "editorLangId == latex",
  },
```

macOS では `key` を `Cmd+Alt+K` とすると良いだろう。

```json
  {
    "key": "cmd+alt+k",
    "command": "latex-workshop.kill",
    "when": "editorLangId == latex",
  },
```

macOS におけるキーバインドの設定での修飾子キーは `Ctrl`、`Shift`、`Alt`、`Cmd` の 4 つである。`Option` ではなく `Alt` であることに注意が必要。

> [\# Accepted keys \- Visual Studio Code Key Bindings](https://code.visualstudio.com/docs/getstarted/keybindings#_accepted-keys)

## ○ PROBLEMS パネルでログメッセージを確認する

> [\# Catching errors and warnings \- Compile](https://github.com/James-Yu/LaTeX-Workshop/wiki/Compile#catching-errors-and-warnings)

コンパイルした LaTeX にエラーが含まれる場合、PROBLEMS パネルにエラーや警告、Bad box が表示される。この PROBLEMS パネルは `Ctrl+Shift+M` (`Shift+Cmd+M`) で表示させることが出来る。

例として以下のような結果を得ることがある。（日本語化している場合、PROBLEMS パネルは「問題」と表記されている）

![PROBLEMS panel][Problempanel]

[Problempanel]: https://i.gyazo.com/b29a2afe8011fbbb650693b860505f9d.png
[Problempanel_1]: https://i.gyazo.com/970ffdd2adaa1ad4e12466f79cd43d7e.png
[Problempanel_li]: https://i.gyazo.com/2adf5bb3025a7959763d0954df2ebdf3.jpg

|         記号         | メッセージの種類 | 意味                                                                                                                                          |
| :------------------: | :--------------: | :-------------------------------------------------------------------------------------------------------------------------------------------- |
|         :x:          |      エラー      | PDF を出力できない致命的な問題                                                                                                                |
|      :warning:       |       警告       | 意図した出力となっていない可能性のある問題                                                                                                    |
| :information_source: |     Bad box      | 指定された領域からはみ出している<br> <blockquote>[Understanding underfull and overfull box warnings - Overleaf][badbox-overleaf]</blockquote> |

[badbox-overleaf]: https://www.overleaf.com/learn/how-to/Understanding_underfull_and_overfull_box_warnings

LaTeX のエラー関連は PROBLEMS パネルを確認すれば一覧で見ることが出来る。これに対応して左下のステータスバーに以下のメッセージが表示されている。

| ![error and warning and badbox][errorWarningBadbox] |
| :-------------------------------------------------: |

[errorWarningBadbox]: https://i.gyazo.com/c7fb914e3667ea102f5818d38c60259d.png

また、この PROBLEMS パネルのエラーメッセージをクリックするとエディタ上の該当箇所にジャンプすることが出来る。該当箇所には波線が引かれている。この波線にマウスポインタを合わせるとホバーでエラー内容を見ることも出来る。

<!--
![Error with underline][error_underline]

[error_underline]: https://i.gyazo.com/130f87281151f9522cc2af096c9a5afd.png
-->

LaTeX のエラーメッセージは以下のような一覧を見ることで、原因を特定することが出来る。

- [TeX のエラーメッセージ - TeX Wiki](https://texwiki.texjp.org/?TeX%20%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8)
- [LaTeX のエラーメッセージ - TeX Wiki](https://texwiki.texjp.org/?LaTeX%20%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8)
- [LaTeX の警告メッセージ - TeX Wiki](https://texwiki.texjp.org/?LaTeX%20%E3%81%AE%E8%AD%A6%E5%91%8A%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8)

<details>
<summary> 今回のテストファイル（折りたたみ）</summary>
<div>

```latex
\documentclass{jlreq}
\usepackage{amsmath}
\newcommand{\cmdname}[1]{\texttt{\textbackslash #1}}
\newcommand{\pkgname}[1]{\textsf{#1}}
\begin{document}

\begin{equation}
  \bm{V} \text{: \cmdname{bm} command is provided by \pkgname{bm} package. \cmdname{bm} command means vector and provides bold italic style.}
  \label{eqn:bm}
\end{equation}

Cross-reference \cmdname{label\{eqn:bm\}}:
\ref{eqn:bm}

\end{document}
```

</div>
</details>

## ○ ターミナルログを見る

ターミナルログは `Ctrl+Shift+U` (`Shift+Cmd+U`) から表示できる OUTPUT パネルの `LaTeX Compiler` に出力される。（ターミナルログと書いているが、OUTPUT パネルで見ているものはターミナルではないことに注意が必要）

これを見るには、コマンドパレットから以下を実行する。

```
> LaTeX Workshop: View LaTeX compiler logs
```

あるいは、キーボードショートカットで以下のように追加しておくと、簡単に `LaTeX Compiler` を開けることが出来る。

```json
  {
    "key": "ctrl+shift+u",
    "command": "latex-workshop.compilerlog",
    "when": "workbench.panel.output.active && editorLangId == latex",
  },
```

macOS では `key` を `Shift+Cmd+U` とすると良いだろう。

```json
  {
    "key": "shift+cmd+u",
    "command": "latex-workshop.compilerlog",
    "when": "workbench.panel.output.active && editorLangId == latex",
  },
```

<!--
\#\#\# ■ ログ出力

ログの出力には次のような設定が用意されている。
場合によってはログを見る必要があるため、基本的にはデフォルトのままで問題ない。

|                             設定                              | デフォルト値 | デフォルト値の意味                               |
| :-----------------------------------------------------------: | :----------: | :----------------------------------------------- |
|               `latex-workshop.message.log.show`               |   `false`    | ターミナルログを表示する                         |
| `latex-workshop.latex.build.clearLog.everyRecipeStep.enabled` |    `true`    | 実行するたびにログを消去する                     |
|             `latex-workshop.message.badbox.show`              |    `true`    | Bad box のメッセージを PROBLEMS パネルに出力する |
-->

## ○ ポップアップ

コンパイルに失敗するとポップアップで次のようなメッセージが表示されるが、これは LaTeX にとって本質的なメッセージではない。

```
❌ Recipe terminated with error.
```

これは単に「コンパイルに失敗しました」と言っているだけである。このメッセージをどのように読み解こうとしても LaTeX を正常にコンパイルすることは出来ない。

また、`"latex-workshop.latex.autoBuild.cleanAndRetry.enabled": true` にしている場合、次のようなポップアップを得ることもある。

```
⚠️ Recipe terminated with error. Retry building the project.
```

これは「コンパイルに失敗しました。再試行してください」と言っている。これも LaTeX のエラーメッセージにとっては本質的には意味がない。

LaTeX にとって意味のあるエラーメッセージは、PROBLEMS パネルや LOG ファイルを見る必要がある。

### ■ ENOENT

次のようなポップアップを受けることがある。

```
❌ Recipe terminated with fatal error: spawn xxxxx ENOENT.
```

`ENOENT` とは “Error NO ENTry” :no_entry: の略であり、`xxxxx` と言うコマンドがエントリーされていないことを示している。すなわち、このポップアップメッセージは「`xxxxx` というコマンドが見つからない」ことを意味している。（この状態ではもちろんターミナルからでも実行できない）

解決方法は「` LaTeX 環境変数の設定 `」や「` LaTeX パスを通す `」で検索して解決してほしい。これは PC や環境によってかなり異なるため、ここでは詳細を示さない。これは LaTeX 固有の問題ではなく、PC でコマンドが使えるかどうかの問題である。
パスを通しましょう。

<!-- パスが通っているか確認するには、ターミナルで `$ tex --version` などとすると良い。 -->

<details>
<summary> あるいは、settings.json からパスを指定することも出来る（折りたたみ）</summary>
<div>

コマンドのあるディレクトリを `PATH` で指定する。`PATH` の指定先は例なので、実際に利用できるものではありません。

```jsonc
  "latex-workshop.latex.tools": [
    {
        "name": "latexmk",
        "command": "latexmk",
        "args": [
          // ...
        ],
        "env": {
          "PATH": "/Library/TeX/texbin"
        }
    },
  ],
```

`PATH` は、which コマンドや where コマンドを利用することで探すことが出来る。

```bash
which latexmk
```

```batch
where latexmk
```

この方法では `~.tools` のそれぞれに `PATH` を記載する必要があり、かなり面倒くさい。場合によっては、ターミナルから直接実行する必要がある場合もあるため、パスを通すことをオススメする。

</div></details>

#### パスが通っているか・インストールされているか確認する

ターミナル上で利用する LaTeX エンジンを実行する。このとき、`--version` オプションを付けて実行すると良い。

以下の例では `xxlatex` という仮のエンジンを実行している。

```powershell
xxlatex --version
```

また、そもそもエンジンがインストールされているか確認しても良いだろう。

```powershell
tlmgr info xxlatex
```

<details>
<summary> 【確認例】latexmk のパスが通っているか・インストールされているか（折りたたみ）</summary>
<div>

Windows 機に TeX Live 2022 をインストールした状態で確認する。

> latexmk のパスが通っているか確認する。

```console
$ latexmk --version
Latexmk: Invoked as 'd:\texlive\2022\texmf-dist\scripts\latexmk\latexmk'
Latexmk, John Collins, 17 Mar. 2022. Version 4.77
```

latexmk が存在しない場合、存在しない旨のメッセージが返ってくる。この例では latexmk が存在するため、バージョン情報を見ることが出来ている。

> latexmk がインストールされているか確認する。

```console
$ tlmgr info latexmk
package:     latexmk
category:    Package
shortdesc:   Fully automated LaTeX document generation
longdesc:    Latexmk completely automates the process of generating a LaTeX document. Given the source files for a document, latexmk issues the appropriate sequence of commands to generate a .dvi, .ps, .pdf or hardcopy version of the document. An important feature is the "preview continuous mode", where the script watches all of the source files (primary file and included TeX and graphics files), and reruns LaTeX, etc., whenever a source file has changed. Thus a previewer can offer a display of the document's latest state.
installed:   Yes
revision:    62767
sizes:       doc: 1069k, run: 417k, bin: 5k
relocatable: No
cat-version: 4.77
cat-license: gpl2
cat-topics:  compilation
cat-related: latexn prv arara
cat-contact-home: http://personal.psu.edu/~jcc8/software/latexmk/
collection:  collection-binextra
```

`installed:` の項目を見ると `Yes` となっているため、インストールされていることが確認できる。`No` の場合にはインストールされていない。

もしもインストールされていない場合は、`$ tlmgr install latexmk` や `$ tlmgr install collection-binextra` を実行するとインストールすることが出来る。

</div>
</details>

<details>
<summary><code>PATH</code> の確認（折りたたみ）</summary>
<div>

TeX Live の `PATH` を確認するには、次のように確認する。

> Windows の場合。

```batch
echo %PATH%
```

> Windows 以外の場合。

```bash
echo $PATH
```

これを実行した際に、パスが通っていれば `texlive` を含むパスが表示される。例として、持っている Windows PC でこれを実行すると、次のようなパスが表示された。

```
D:\texlive\2022\bin\win32
```

このようなパスが表示されない場合はパスが通っていない。通しましょう。

</div>
</details>

### ■ ポップアップの非表示

ある程度慣れてくると、これらのポップアップは邪魔になってくる。もちろん、きちんとステータスバーを見る必要があるが、非表示にしてしまっても問題ないだろう。これらのポップアップがなくとも、ステータスバー左下を確認すれば問題ない。

|    エラーや警告がない場合     |             エラーや警告がある場合の例              |
| :---------------------------: | :-------------------------------------------------: |
| ![error and warning][problem] | ![error and warning and badbox][errorWarningBadbox] |

[problem]: https://i.gyazo.com/5b09593c85f6548a86e033f707c39745.png

以下の設定をそれぞれ `false` に設定することでポップアップを抑制することが出来る。

|         記号         |                   設定                    | デフォルト値 |
| :------------------: | :---------------------------------------: | :----------: |
|         :x:          |    `latex-workshop.message.error.show`    |    `true`    |
|      :warning:       |   `latex-workshop.message.warning.show`   |    `true`    |
| :information_source: | `latex-workshop.message.information.show` |   `false`    |

コンパイル以外で表示されるポップアップもあるため、注意する必要がある。

## ○ ログファイルを削除しない

`latex-workshop.latex.autoClean.run` の設定や `Ctrl+Alt+C` (`Cmd+Alt+C`) を実行すると中間生成ファイルを削除することが出来る。

しかしながら、デフォルトでは削除する中間生成ファイルの中に `"*.log"` が含まれるため、これも削除されてしまう。これではコンパイルが失敗したときのエラー原因を特定しづらくなる場合があるため、`"*.log"` を外しておくと良いだろう。

```jsonc
  "latex-workshop.latex.clean.fileTypes": [
    "*.aux",
    "*.bbl",
    // "*.blg", // BibTeX のログファイル
    "*.idx", "*.ind", "*.lof", "*.lot", "*.out", "*.toc", "*.acn", "*.acr", "*.alg", "*.glg", "*.glo", "*.gls", "*.fls",
    // "*.log", // LaTeX のログファイル
    "*.fdb_latexmk", "*.snm", "*.synctex(busy)", "*.synctex.gz(busy)", "*.nav"
  ]
```

## ○ 特定の警告を非表示にする

:::note warn
ここでの非表示とは、ターミナルログから PROBLEMS パネルに警告メッセージを引き渡さないことを指す。これに伴って、エディタ内の波線も引かれなくなる。
警告そのものが発行されなくなるわけではない。
:::

LaTeX のコンパイルのうち、特定の警告に関して気にしなくても問題ない場合がある。

LaTeX Workshop では次のような設定から PROBLEMS パネルに特定の警告を拾わないようにすることが出来る。これらの設定は正規表現で指定することが出来る。

|                    設定                    | 説明                          |
| :----------------------------------------: | :---------------------------- |
| `latex-workshop.message.latexlog.exclude`  | LaTeX のメッセージを抑制する  |
| `latex-workshop.message.bibtexlog.exclude` | BibTeX のメッセージを抑制する |

ここで指定する警告メッセージは、ターミナルログ行頭の `LaTeX Font Warning:` などの有無はどちらでも良いらしい。

### ！注意

さまざまな警告に関して非表示にしておいても良いが、自分が把握できていない警告を非表示にしておくと後々でかなり面倒なことになりかねないので注意が必要。（ターミナルログ等を見る癖のある人であれば問題ないが…）

また、稀に次のような設定を見かけるが、すべてのメッセージを非表示にしているのであまりオススメはしない。

```json
  "latex-workshop.message.latexlog.exclude":[
    "(.*)"
  ],
```

### ■ 具体例 1

フォントに関する警告に次のようなものが出てくる場合がある。

```log
LaTeX Font Warning: Font shape `JY1/mc/m/it' undefined
```

これは、「`JY1/mc/m/it`（和文フォントにおける斜体）が未定義だぞ」という警告である。LaTeX ではこれの後に未定義のフォントを何かで代用した旨が表示されることになる。

> [\# “LaTeX Font Warning: Font shape `JY1/mc/m/it' undefined” といった警告が出る \- よくある質問 - TeX Wiki](https://texwiki.texjp.org/?%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E8%B3%AA%E5%95%8F#bf583189)

この警告は、適当にプリアンブルで設定をしておけば表示されないものの、少々煩雑であり、コンパイルに失敗するわけではない。そのため、非表示にしておいても良いだろう。

この警告を非表示にする場合には、次のように設定を課せば良い。

```json
  "latex-workshop.message.latexlog.exclude": [
    "(Font shape `(JY1|JT1|JY2|JT2)(/.*)(sl|it|sc)'.*|Some font shapes were not available.*)",
  ],
```

> [\# 日本語文書特有の LaTeX Font Warning を警告表示に含めないようにする \- Visual Studio Code/LaTeX - TeX Wiki](https://texwiki.texjp.org/?Visual%20Studio%20Code%2FLaTeX#n019e1af)

### ■ 具体例 2

相互参照についての警告は次のようなものがある。

```log
LaTeX Warning: Reference `labelName' on page 3 undefined on input line 15.
```

```log
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
```

```log
LaTeX Warning: There were undefined references.
```

相互参照の問題が解決していない場合、どれも表示される。これを非表示に構成したい場合には次のようにすれば良いだろう。

```json
  "latex-workshop.message.latexlog.exclude": [
    "Reference `.+' on page \\d+ undefined on input line \\d+\\.",
    "Label\\(s\\) may have changed\\. Rerun to get cross-references right\\.",
    "There were undefined references\\.",
  ],
```

latexmk でコンパイルする場合には元から表示されない上、場合によってはこれがないと複数回のコンパイルを忘れてしまう場合も無きにしも非ずなので注意してほしい。

<!--
個人的には下 2 つの `Label(s) may have changed.` と `There were undefined references.` はほとんど同じ警告のように感じるため、片方だけ非表示にしていても問題ないように思われる。
-->

<!--

コメントアウトされている闇の記事

\#\# ○ LaTeX エラーの原因を探る

エラーの原因には次のようなパターンが考えられる。

- パスが通っていないためのエラー
- エディタの LaTeX 呼び出しに際するエラー
- llmk や latexmk などのビルドツールによるエラー
- LaTeX の処理内でのエラー
    - 構文エラー
    - コマンドのエラー
    - パッケージの衝突
    - ... etc.
- BibTeX などの外部コマンドのエラー

一般的に、これらのパターンをそれぞれ検証することでどこにエラーの原因があるのか探す必要がある。

> **_例_**：初めて LaTeX の環境構築をした。エディタの設定が上手くいっているかテスト実行したところ、上手く実行が出来ない。

ターミナルで実行して、実際にファイルが実行されるか確認することで「エディタの LaTeX の呼び出しによるエラー」の可能性を潰す。エラーが無ければエディタの設定に原因がある。エラーがあれば、エディタの設定以外に原因がある。もちろん、その両方がある場合もあるだろう。

latexmk などのビルドツールを利用している場合は、ビルドツールを利用する場合と利用しない場合でテストすべきである。これで「llmk や latexmk などのビルドツールによるエラーか」を検証することが出来る。

\#\#\# ■ LaTeX 処理上のエラー

LaTeX Workshop では PROBLEMS パネルを見れば、どこにエラー原因があるのか分かる。先に示したエラーメッセージ一覧を確認すればある程度原因を解決することが出来るだろう。しかしながら、単純にそれだけでは原因の特定が難しい場合もある。

そこで、プリアンブルとエラーが表示される周辺を抜き出して **MWE**: Minimal Working Example を作成することをオススメしたい。ここで言う MWE とは、「**指定したコンパイル方法で実行すると問題を再現できる最小の例**」のことを指す。

これを作成するメリットは次の 3 点だろう。

- 元の大きなファイルをいじるよりも軽量で実行しやすい
- さまざまな方法を試す中で、原因と異なる部分の関係のないエラーを避けることが出来る
- 同じ環境であれば誰でも問題を再現できるため、問題を誰かと共有して解決策を模索できる

この MWE を作成していじることで “なんとなく” 解決したり、原因を特定して調べることで解決方法を見つけることになるだろう。

もしも、これで原因を特定できなかった場合、LaTeX についてどこかの質問サイトで質問することになるだろう。その際には以下の 6 点を明らかにすると、回答者も比較的簡単に答えることが出来るようになる。

- コンパイル方法

    > LaTeX Workshop では `~.tools` の `command` と `args` やビルドツールの中身を指す。
    > llmk や latexmk などのビルドツールが原因ではない場合は、実際に実行する LaTeX エンジンを指定する方が良いだろう。

- MWE

    > レポートや論文はそのまま投稿できないことが多いため、MWE の作成は大いに重要になる。

- MWE を実行したときの LOG ファイル

    > LOG ファイルのエラー情報は解決の手掛かりになる。

- どのような結果を得たいのか

    > ゴールは明確に。質問タイトルにも対応している。

- OS

    > e.g. Windows, macOS, Linux, etc.

- TeX ディストリビューション

    > e.g. TeX Live20XX, etc.

重要な点の 1 つとして、この 6 つの必要事項の中には LaTeX Workshop や TeXworks、TeXstudio などのエディタとは関係がないことにも注目しておきたい。LaTeX 処理上のエラーであれば、Colud LaTeX や Overleaf であってもその限りではないだろう。

\#\#\#\# 注意点

- これらの情報はすべてテキストで投稿する
    - スクリーンショットでは読みづらい
    - 逆に、実現したいことは言葉で説明するとともに、図示するとより分かりやすいだろう
- 「〜〜の記事を参考にして」ではなく、実際に利用している環境の設定を書くようにしたい

また、Markdown を利用できる質問サイトであれば、出来るだけコードブロックや折りたたみなどを活用して見やすいものを作成しておきたい。
-->

# 参考

- 公式 Wiki
    - [Compile](https://github.com/James-Yu/LaTeX-Workshop/wiki/Compile)
    - [\# The PROBLEMS Pane displays wrong messages \- FAQ](https://github.com/James-Yu/LaTeX-Workshop/wiki/FAQ#the-problem-pane-displays-wrong-messages)

# 余談

LaTeX のエラーメッセージは分かりづらいという言説はよくあるが、“Recipe terminated with error” は LaTeX のエラーメッセージではない。

<!--
「LaTeX Workshop でコンパイルしたら `❌ Recipe terminated with fatal error.` というエラーメッセージが出ました。どうしたら良いですか？」という質問がいかに無意味な質問なのだろう。LaTeX のエラーメッセージは分かりづらいというような言説はよくあるが、この場合では読みもしていない可能性が高く見える。LOG ファイルを見るか、ターミナルログを確認してから分からないと言う方が好ましいだろう。
-->

<!--
PROBLEMS パネルに引き渡された情報がすべてのエラーだと思われる。しかし、非常に稀ながら場合によってはすべてを認識出来ているとは限らないので注意が必要になる。PROBLEMS パネルになにも表示されていないが、コンパイルが上手くいかない場合にはこのようなことも想定して良いだろう。
-->

この他にも、ChkTeX や Lacheck を利用したり textlint を利用する際にもエラーや警告が PROBLEMS パネルに出力される。

# 追記

- 2022/07/12: キーバインドの表示を macOS にも対応
- 2022/08/12: 軽微修正
- 2022/08/20: パスやインストールの確認方法について追記
- 2022/10/28: コードブロックのハイライトを追加