DockerとVSCodeでらくらくLaTeX環境

　この記事では私が普段レポートの作成などに使用しているLaTeXの環境を紹介しようと思います．ブログの執筆は初めてなので読みづらいかもしれませんが悪しからず．

# 構成
　Dockerコンテナ上でtexliveがインストールされたDebianのコンテナを動かして，そのコンテナにVSCodeのRemote Developmentで繋いで編集からコンパイルまでを行っています．
　TexのコンパイルはVSCodeにLaTexWorkShopという拡張を入れることでVSCode上から行えるようになります．
　フォルダ構成ですが，一つのリポジトリにバンバンtexファイルを突っ込んでいく形で作業しているので，コンテナやVSCodeの設定ファイルをワークスペース単位で管理する形にしています．

# 構築手順
　この章では，実際にこの環境を構築するのに必要な手順について書いていきます．

## 環境
- デバイス MacBook Air (M2, 2022)
- OS：macOS Sequoia 15.1.1
- Docker Desktop 4.36.0
- VSCode 1.95.3
    - 拡張機能
    - Remote Development
    - LaTeX WorkShop

## Dockerイメージの構築
　Dockerイメージの作成にはVSCodeのdevcontainerという機能を使用します．devcontainerとは名前の通り開発用のコンテナを作成する機能で，簡単なコンテナならVSCode上のボタンをポチポチするだけで作れます．今回は自分で作成したDockerfileを指定する形で使用します．
　devcontainerを作成するには，`.devcontainer`というフォルダを作り，その中にコンテナの構成を表す`devcontainer.json`と`Dockerfile`を入れます．
 ```
 ./.devcontainer:
.  ..  devcontainer.json  Dockerfile
 ```
　それぞれのファイルは次のとおりです．
```Dockerfile:Dockerfile
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y texlive-full
RUN apt install -y locales
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen \
  && locale-gen
RUN apt install -y git
```

```json:devcontainer.json
{
    "name": "Latex Dev Container",
    "build": {
        "dockerfile": "Dockerfile",
        "context": "..",
        "args": {
            "PROXY": "${localEnv:http_proxy}"
        }
    },
    "customizations": {
        "vscode": {
            "settings": {
                "terminal.integrated.shell.linux": "/bin/bash"
            },
            "extensions": [
                "James-Yu.latex-workshop"
            ]
        }
    },
    "mounts": [
        // List of folders to mount into the dev container
    ],
    "forwardPorts": [
        // List of ports to forward from the dev container to the local machine
    ]
    // "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=delegated"
}
```
## settings.json
 次はLaTexWorkShop用の設定を作成していきます．今回はワークスペース用の設定をjsonで書いていきます．
Cmd + Shift + P を押して出てきたコマンドパレットに`settings`と打ち込み，候補の中から`Open Workspace settings(JSON)`を選ぶことでワークスペース用のjsonファイルが開きます．
各種設定の意味ですが，説明が面倒なので自力でググってください．
 
 簡単に説明すると，`.recipies`で書いた内容がLaTeXWorkShopのタブに表示されます．`"latex-workshop.latex.tools"`は`.recipies`から使うコマンドを定義してます．
```json:settings.json
{
    "latex-workshop.latex.tools": [
        {
            "name": "lualatex",
            "command": "lualatex",
            "args": [
                "%DOC%"
            ]
        },
        {
            "name": "pbibtex",
            "command": "pbibtex",
            "args": [
                "%DOCFILE%.aux"
            ]
        }
    ],
    "latex-workshop.latex.recipes": [
        {
            "name": "1 item Build (lualatex)",
            "tools": [
                "lualatex"
            ]
        },
        {
            "name": "2 item Build (lualatex * 2)",
            "tools": [
                "lualatex",
                "lualatex"
            ]
        },
        {
            "name": "3 item Build (lualatex * 3)",
            "tools": [
                "lualatex",
                "lualatex",
                "lualatex"
            ]
        },
        {
            "name": "All item Build (lualatex * 4) + BibTeX",
            "tools": [
                "lualatex",
                "pbibtex",
                "lualatex",
                "lualatex",
                "lualatex",
            ]
        }
    ],
    "latex-workshop.latex.autoBuild.run": "onSave",
    "latex-workshop.latex.recipe.default": "first",
    "latex-workshop.latex.build.clearLog.everyRecipeStep.enabled": false
}
```
さて以上でおおよその設定は完了です．このワークスペースを開いた上で左下のRemote Developmentのボタンを押し，メニューからReopen in Containerを押すと現在のワークスペースをコンテナ内で開くことができます．初回はコンテナのビルドがあるため割と時間がかかります．
![fig1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3949702/a4e848a5-5f1a-9d1c-5dff-8e8d3b70b02f.png)
# まとめ
VSCodeのdevcontainerとLaTeXWorkShopを使ってDockerコンテナ内で動くLaTeX環境を構築しました．おそらく他に調べればこれの上位互換みたいな構成がいっぱい見つかると思います．本当はもうちょっとちゃんと書きたかったのですが，やる気と時間が無くなったので今回はこんなところで