LaTeX 環境構築の手順【VSCode / pLaTeX / upLaTeX / LuaLaTeX / pdfLaTeX / BiBTeX】

## はじめに
本記事では、$\LaTeX$ の環境構築の手順を説明します。
**Mac** を想定していますが、**Windows** などでもほぼ同じ手順で実行できます。

卒業論文や修士論文を **LaTeX** で執筆する学生は多いです。特に、理系分野の学生は、**Microsoft Word** ではなく **LaTeX** で執筆せざるをえません。

オンライン上で **LaTeX** を執筆する環境としては、**[Cloud LaTeX](https://cloudlatex.io/ja)** や **[Overleaf](https://ja.overleaf.com/)** があります。**Cloud LaTeX** はデフォルトで日本語に対応しており、**VSCode** の拡張機能で簡単に連携できるので、おすすめです。
一方、卒業論文・修士論文を執筆する時期になると、アクセスが集中し、サーバダウンがときどき起こります。
したがって、ローカルに **LaTeX** の執筆環境を整えておくのは重要です。

## 1. LaTeX をインストールする
- **MaxTeX** を **Homebrew** でインストールする
    - GUI アプリケーションなしをインストールする
- ターミナルに入力する
- 時間がかかる（20 分ほど）
- 途中、パスワードの入力が必要になる
```bash
brew install mactex-no-gui --cask
```
```bash
exec $SHELL -l
```

## 2. LaTeX をアップデートする
- **MaxTeX** をアップデートする
- 時間がかかる（30 分ほど）
```bash
sudo tlmgr update --self --all
```

## 3. デフォルトを A4 用紙に設定する
```bash
sudo tlmgr paper a4
```

## 4. VSCode の拡張機能 **LaTeX Workshop** をインストールする
- **VSCode** で拡張機能 **LaTeX Workshop** を検索し、インストールする

## 5. `setting.json` を編集する
- `⌘` + `,` で設定画面に移動し、 右上のボタンから `setting.json` を開く

### 5.1. LaTeX エンジンの設定を記入する
- **pLaTeX**
- **upLaTeX**
- **LuaLaTeX**
- **pdfLaTeX**
- **pBibTeX**
- **BibTeX**
```setting.json
// ----- LaTeX エンジンの設定 ----- //
"latex-workshop.latex.tools": [
    { // pLaTeX
        "name": "platex",
        "command": "ptex2pdf",
        "args": [
            "-interaction=nonstopmode",
            "-l",
            "-ot",
            "-kanji=utf8",
            "-synctex=1",
            "%DOC%"
        ],
        "env": {
            "PATH": "/Library/TeX/texbin"
        }
    },
    { // upLaTeX
        "name": "uplatex",
        "command": "ptex2pdf",
        "args": [
            "-interaction=nonstopmode",
            "-l",
            "-u",
            "-ot",
            "-kanji=utf8",
            "-synctex=1",
            "%DOC%"
        ],
        "env": {
            "PATH": "/Library/TeX/texbin"
        }
    },
    { // pBibTeX
        "command": "pbibtex",
        "args": ["%DOCFILE%", "-kanji=utf8"],
        "name": "pbibtex",
        "env": {
            "PATH": "/Library/TeX/texbin"
        }
    },
    { // LuaLaTeX
        "name": "lualatexmk",
        "command": "latexmk",
        "args": [
            "-lualatex",
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "-outdir=%OUTDIR%",
            "%DOC%"
        ],
        "env": {
            "PATH": "/Library/TeX/texbin"
        }
    },
    { // pdfLaTeX
        "name": "pdflatex",
        "command": "pdflatex",
        "args": [
            "-synctex=1",
            "-interaction=nonstopmode",
            "-file-line-error",
            "%DOC%"
        ],
        "env": {
            "PATH": "/Library/TeX/texbin"
        }
    },
    { // BibTeX
        "name": "bibtex",
        "command": "bibtex",
        "args": [
            "%DOCFILE%"
        ],
        "env": {
            "PATH": "/Library/TeX/texbin"
        }
    },
],
```

### 5.2. LaTeX レシピの設定を記入する
- 上記の「5.1. LaTeX エンジンの設定を記入する」に続けて記入する
- **pLaTeX**（**BiBTeX** あり）
- **pLaTeX**（**BiBTeX** なし）
- **upLaTeX**（**BiBTeX** あり）
- **upLaTeX**（**BiBTeX** なし）
- **LuaLaTeX**

- **pdfLaTeX**（**BiBTeX** あり）
- **pdfLaTeX**（**BiBTeX** なし）
```setting.json
// ----- LaTeX レシピの設定 ----- //
"latex-workshop.latex.recipes": [
    { // pLaTeX（BiBTeX あり）
        "name": "pLaTeX pBibTeX",
        "tools": ["platex", "pbibtex", "platex", "platex"]
    },
    { // pLaTeX（BiBTeX なし）
        "name": "pLaTeX",
        "tools": ["platex"]
    },
    {  // upLaTeX（BiBTeX あり）
    "name": "upLaTeX pBibTeX",
    "tools": ["uplatex", "pbibtex", "uplatex", "uplatex"]
    },
    { // upLaTeX（BiBTeX なし）
    "name": "upLaTeX",
    "tools": ["uplatex"]
    },
    { // LuaLaTeX
        "name": "lualatex",
        "tools": [
            "lualatexmk"
        ]
    },
    { // pdfLaTeX（BibTeX あり）
        "name": "pdfLaTeX BibTeX",
        "tools": [
            "pdflatex",
            "bibtex",
            "pdflatex",
            "pdflatex"
        ]
    },
    { // pdfLaTeX（BibTeX なし）
        "name": "pdfLaTeX",
        "tools": [
            "pdflatex"
        ]
    },
],
```

### 5.3. コンパイル時の設定を記入する
- 上記の「5.2. LaTeX レシピの設定を記入する」に続けて記入する
```setting.json
// ----- コンパイル時の設定 ----- //

// ⌘ + s でファイル保存時に自動でコンパイルする
"latex-workshop.latex.autoBuild.run": "onSave",

// 直近で使用したレシピでコンパイルする
"latex-workshop.latex.recipe.default": "lastUsed",

// PDF（プレビュー）
// PDF を VSCode で開く
"latex-workshop.view.pdf.viewer": "tab",
// PDF の幅を調整する
"latex-workshop.view.pdf.zoom": "page-width",
// PDF を右側に開く
"latex-workshop.view.pdf.tab.editorGroup": "right",

// LaTeX Workshop のインテリセンスを有効にする
"latex-workshop.intellisense.package.enabled": true,

// 不要なファイルを削除する
"latex-workshop.latex.clean.method": "glob",
"latex-workshop.latex.autoClean.run": "onBuilt",
"latex-workshop.latex.clean.fileTypes": [
    "%DOCFILE%.acn",
    "%DOCFILE%.acr",
    "%DOCFILE%.alg",
    "%DOCFILE%.aux",
    "%DOCFILE%.bbl",
    "%DOCFILE%.blg",
    "%DOCFILE%.dvi",
    "%DOCFILE%.fdb_latexmk",
    "%DOCFILE%.fls",
    "%DOCFILE%.glg",
    "%DOCFILE%.glo",
    "%DOCFILE%.gls",
    "%DOCFILE%.idx",
    "%DOCFILE%.ind",
    "%DOCFILE%.lof",
    "%DOCFILE%.lot",
    "%DOCFILE%.nav",
    "%DOCFILE%.out",
    "%DOCFILE%.snm",
    "%DOCFILE%.toc",
    "%DOCFILE%.vrb"
],
```

## 6. VSCode に LaTeX スニペットを設定する
- **VSCode** の左下の設定ボタンから「Snippets（スニペット）」を開く
- **LaTeX** と入力し、`latex.json` を開く
- スニペットを設定しておくと、毎回、同じコードを入力する手間が省ける
```latex.json
"my_latex_template": {
    "prefix": "my_template",
    "body": [
        "\\documentclass[${1:a4paper, 11pt}]{${2:jsarticle}}",
        
        // よく使うパッケージを設定
        "\\usepackage{amsmath}",
        "\\usepackage{amssymb}",
        "\\usepackage[dvipdfmx]{graphicx}",
        "\\usepackage{enumitem}",
        "\\usepackage[nobreak]{cite}",
        "${3}",
        "",
        "\\begin{document}",
        "",
        "\\title{${4}}",
        "\\author{${5}}",
        "\\date{${6:\\today}}",
        "\\maketitle",
        "",
        "\\section{はじめに}",
        "$0",
        "",
        "\\end{document}",
        "",
    ],
    "description": "LaTeX テンプレート"
}
```

## 7. 実際にローカルで LaTeX を執筆する
- **VSCode** で空の **LaTeX** ファイルを作成する
- `my_template` と入力すると、上記の「6. VSCode に LaTeX スニペットを設定する」で設定したスニペットが自動入力される
- タイトルや本文などを適当に記入する
- **VSCode** の左側に表示されている $\TeX$ のボタンを押す
- 今回は **BiBTeX** は使用していないため、「Build LaTeX project（LaTeX プロジェクトをビルド）」から、「Recipe: pLaTex （レシピ：pLaTex）」もしくは「Recipe: upLaTex（レシピ：upLaTex）」を実行する
- 「View LaTeX PDF（LaTeX PDF を表示）」を実行すると、右側に PDF が表示される
- `Recipe terminated with fatal error: spawn ptex2pdf ENOENT.` というエラーが出る場合は、後述の「8. エラーが出る場合」を確認する
```sample.tex
\documentclass[a4paper, 11pt]{jsarticle}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage[dvipdfmx]{graphicx}
\usepackage{enumitem}
\usepackage[nobreak]{cite}


\begin{document}

\title{\LaTeX 環境構築の手順}
\author{著者名}
\date{\today}
\maketitle

\section{はじめに}
本稿では，\LaTeX の環境構築の手順を説明する．

\end{document}
```

## 8. エラーが出る場合

### 8.1. `Recipe terminated with fatal error: spawn ptex2pdf ENOENT.`
- `ptex2pdf` が設定と異なる場所にあるというエラー
- ターミナルで `ptex2pdf` の正しい場所を探す
```bash
which ptex2pdf
```
- 「5.1. LaTeX エンジンの設定を記入する」で記入した `setting.json` の一部を修正する
- **pLaTeX** や **upLaTeX** 以外も同様に修正しておく
```setting.json
"env": {
    "PATH": "<ptex2pdf の正しい場所>"
}
```

### 8.2. LuaLaTeX で `env: perl: no such file or directory`
- ターミナルで latexmk -lualatex -synctex=1 -interaction=nonstopmode sample.tex を実行して成功するか確認する
- 成功するなら、`perl` の場所を探す
```bash
which perl
```
- 「5.1. LaTeX エンジンの設定を記入する」で記入した `setting.json` の一部を修正する
```setting.json
{ // LuaLaTeX
    "name": "lualatexmk",
    "command": "latexmk",
    "args": [
        "-lualatex",
        "-synctex=1",
        "-interaction=nonstopmode",
        "-file-line-error",
        "-outdir=%OUTDIR%",
        "%DOC%"
    ],
    "env": {
        "PATH": "/Library/TeX/texbin:<perl の場所>"
    }
},
```

## 参考
https://qiita.com/SUZUKI_Masaya/items/7fb5509006163e7e671f

https://zenn.dev/raychan/articles/dbbe6a0bd13086

https://qiita.com/Rx-K8/items/63e682dee034171ddc73

https://qiita.com/rainbartown/items/d7718f12d71e688f3573

https://blog.n-hassy.info/2021/05/vscode-latex-enoent/

https://zap.hatenablog.jp/entry/2023/04/13/015117