VSCodeで、"Backend request inconsistent with engine"というエラーの対処法 + 余談

:::note warn
投稿者はLaTeX環境の、特にVSCodeの構造には全然詳しくないので、仕組みや原理の理解については間違っているかもしれません。ご了承ください。
:::
# 背景
VSCodeで、uplatex+dvipdfmxを用いてpdfファイルを作成したいと思い、プリアンブルに
```latex:preamble.tex
\documentclass[uplatex, dvipdfmx]{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\usepackage[dvipdfmx]{hyperref}
```
と記述したところ、次のようなエラーに遭遇しました。
![スクリーンショット 2025-04-15 12.57.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625495/43f92984-abf8-40d5-9ba5-f67cbc619c52.png)

このとき、compile logには次のような記述がありました。
```latex: compile log(一部抜粋)
! Package hyperref Error: Wrong DVI mode driver option `dvipdfmx',
(hyperref)                because pdfTeX or LuaTeX is running in PDF mode.
```


これは、(おそらく)「本体側は(uplatexではなく)pdfTeXかLuaTeXを走らせているため、ドライバ側で指定したdvipdfmxを認識できない」という事を表しています。「jsonファイルも.latexmkrcファイルも適切に書き換えているはずなのに、どうしてpdfTeXが動いているんだ?」と不思議に思い、chatGPTに質問しまくりながらしばらく試行錯誤しました。

## 参考: 問題発生時の設定
問題発生時、`settings.json`ファイルと`.latexmkrc`ファイルの中身は以下の通りでした。
#### `settings.json`
```
{
  "latex-workshop.latex.recipes": [
    {
      "name": "uplatex -> dvipdfmx",
      "tools": ["uplatex-dvipdfmx"]
    }
  ],
  "latex-workshop.latex.tools": [
    {
      "name": "uplatex-dvipdfmx",
      "command": "latexmk",
      "args": [
        "-e", "$latex=q/uplatex %O -interaction=nonstopmode %S/",
        "-e", "$dvipdf=q/dvipdfmx %O -o %D %S/",
        "-pdfdvi",
        "%DOC%"
      ]
    }
  ],
  "latex-workshop.latex.recipe.default": "uplatex -> dvipdfmx",
  "latex-workshop.view.pdf.viewer": "tab",
  "latex-workshop.latex.clean.subfolder.enabled": true,
  "latex-workshop.latex.autoClean.run": "onBuilt",
  "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",
    "*.dvi",
    "*.synctex.gz"
  ]
}

```
#### `.latexmkrc`
```
$latex = 'uplatex -interaction=nonstopmode -synctex=1 %O %S';
$dvipdf = 'dvipdfmx -f ipaex.map -o %D %S';
$pdf_mode = 2; # DVI -> PDF
```

#### ファイルの場所
それぞれのファイルは以下の場所に格納してありました。
```
my-folder/
├── test.tex
├── .latexmkrc
├── .vscode/
│   └── settings.json 

```
この`my-folder/`の絶対パスは`/Users/shunakashu/projects/my-folder`でした。
# 原因
端的にいうと、原因は

①`settings.json`ファイルがいろいろなディレクトリに散財していたこと(特に、`my-folder`より上位のディレクトリにもjsonファイルが散財していた始末)

②LaTeX Workshopが本当に読み込んでいたものは、(当初の自分が想定していた)uplatex -> dvipdfmxをrecipeとして指定したjsonファイルではなく、別のディレクトリにあるjsonファイルだったこと

③そのjsonファイルがpdfLaTeXをrecipeに指定するものだったこと

の2点でした。そのため、何度jsonファイルを書き換えてもWorkshopに反映されないのは当然でした(肝心のLaTeX Workshopが参照するjsonファイルの方は何も変更されていないため)。

多分、丁寧に環境構築をされた方はこんなエラーに遭遇しないと思います(`settings.json`をあちこちにぐちゃぐちゃ乱立させるような暴挙はしないはず)。自分みたいに、環境構築をよくわかっていないまま、ディレクトリを1つ選ぶたびに適当にjsonファイルを作っては放置するを繰り返してしまうと、このようなことになってしまいます。

教訓として、**不要なjsonファイルは消すべし**ということを学びました。jsonファイルに限らず、不要なファイルが残っているとPCの作動に干渉するリスクがあるのは当然です。どうやら自分はゴミ捨ての出来ない人間だったという訳です。

# 対処
要するに、「正しい」`settings.json`ファイルを適切な形で編集さえすれば、"Backend request"(プリアンブルで指定したドライバ)と"engine"(jsonファイル側で指定されるLaTeX系)との間のinconsistency=不整合は生じなくなるわけです。そこで、以下のようにします。↓

`settings.json`ファイルを、
Codeの「基本設定」>「設定」>「拡張機能」>「Latex-workshop>Latex: Recipes」にある“settings.jsonで編集“から編集する
![スクリーンショット 2025-04-15 12.38.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625495/1013782a-d3b4-44a9-9ea2-f7dc8de14a0e.png)
↑この青枠の部分にある"settings.jsonで編集"をクリックして、そこからjsonファイルの編集画面に飛べばOKです。

ここで、設定画面では「ユーザー」と「ワークスペース」のどちらの設定を変更するかを選ぶことができます。上の画面で、
・「ワークスペース」を選択した上で上記の"settings.jsonで編集"をクリックすると、`/現在のプロジェクトフォルダ/.vscode/settings.json`の場所にあるjsonファイルが編集されます。jsonファイルの設定は現在開いているワークスペースのみに反映されます。
・「ユーザー」を選択して同様のことを行うと、`~/Library/Application Support/Code/User/settings.json`の場所にあるjsonファイルが編集されます。この場合、ここにあるjsonファイルの設定は、**ワークスペースごとに異なるjsonファイルを作成していない限り**グローバルに反映されます。
・VSCodeは、基本的に[^1]「ワークスペースの設定」>「ユーザーの設定」(>「デフォルトの設定」)の順に優先順位を定めます。そのため、あるワークスペースに`settings.json`ファイルが存在する場合、ユーザー設定ではなくその`settings.json`ファイルの内容に従って作動します。



あとは、`settings.json`および`.latexmkrc`の中身自体は上で記載したものでOKです。

# 余談
さて、"Backend request inconsistent with engine"の問題が解決して、晴れて`uplatex->dvipdfmx`によるビルドが可能になりましたが、今度は別の問題に遭遇しました。(割とすぐ解決)

## pdfビューワーの調子が悪い
VSCodeのpdfビューワーを起動しても、なぜか表示されるpdfが真っ白になっていました。(VSCodeを閉じてAdobe Readerで当該pdfファイルを読み込むと、別に問題なく文書が表示されていました)
## 対処
### 結局dvipdfmxじゃなくてLuaLaTeXにした
「dvipdfmx出力ってLaTeX WorkshopのPDFビューワーと相性が悪いらしい」という噂を聞き、結局ビルドレシピをLuaLaTeXに変更しました(`.latexmkrc`は消しました)。以下が現在の僕のjsonファイルの中身です。
```settings.json
{
  "latex-workshop.latex.tools": [
    {
      "name": "latexmk (lualatex)",
      "command": "latexmk",
      "args": ["-lualatex", "-synctex=1", "-interaction=nonstopmode", "%DOC%"]
    }
  ],
  "latex-workshop.latex.recipes": [
    {
      "name": "latexmk",
      "tools": ["latexmk (lualatex)"]
    }
  ],
  "latex-workshop.view.pdf.viewer": "tab",
  "latex-workshop.latex.autoBuild.run": "onSave"
}
```
### LaTeX Workshopのバージョンを下げた
なんかLaTeX Workshopのバージョン`10.7.4`(2025年1月版)だとpdf出力がうまくいかなかったのですが、バージョンを下げて`9.21.1`くらいにすると、VSCode内部のビューワーでうまく表示されました。理由は分かりません。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625495/750c6844-c9bf-4884-9730-aa1919297e67.png">
サイドバーの「拡張機能」をクリックして拡張機能一覧を表示させて、カーソルを"LaTeX Workshop"の上において右クリックすると、このようなメニューが表示されるので、「別のバージョンをインストール...」を選択します。

![スクリーンショット 2025-04-15 14.02.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625495/9acb6d6a-3bf1-458f-9970-7e93e50736d6.png)
すると、過去のバージョンが選択できるようになります。



# 脚注
[^1]:これは推測なのですが、`settings.json`ファイルをあちこちに乱立させたせいでVSCodeの中でこの優先順位がバグってしまったことが今回の大元のエラーの原因なのではないかと思っています。反省。