手軽にLatex環境を構築する with VSCode + Docker
この記事で分かること
ノートやレジュメをつくるのにLatexを重宝しますが、環境構築が少し手間です。
とくに扱うパソコンが変わるたびに環境構築をやり直すのは面倒です。
そういうわけで、Dockerを使って手軽に環境構築してしまおう、という記事です。
1回やっておけば、Dockerfileを新環境にもっていって同じものを作れるので便利です。
想定する読者は、Dockerを使ったことがあるLatexユーザーです。
前提
- Windows11 (動作確認した環境)
- VSCodeがインストールされていること
- WSLの設定済み
- Dockerを動かせる環境があること(Docker DesktopやRancher Desktopインストール済み)
- Latexを使ったことがある
準備
以上は前提なのでここでは詳細は述べませんが、参考になりそうな情報を上げておきます。
- VSCodeのインストール
- WSLの設定
- Docker、Composeの準備
- Latexについて
公式のイメージを探す
ここではTexのディストリビューションとして、もっともメジャーなTexLiveを使うことにします。
適当なベースイメージを用意して、そこにTexLiveをインストールしてもいいですが、DockerHubに公式イメージがあるようなので、そちらを使うほうが手軽です。
ということで、TexLiveのイメージをプルして使うことにします。
Dockerfileとdocker-compose.yamlの準備
メインのディレクトリとして、"latex-project"を用意して、その中にDockerfileなどを配置します。
texファイルとその生成物はsrc/my-noteディレクトリの中に入れるようにします。
Git管理する想定なので、.keepディレクトリは管理用の空ファイルです(git pushするときにからのディレクトリは認識されないため)。
また、README.mdはお好みで書いてください。
.
└── latex-project/
├── .vscode-server/
│ └── .keep
├── src/
│ ├── my-note
│ └── .keep
├── .env
├── .gitignore
├── docker-compose.yaml
├── Dockerfile
└── README.md
Dockerfile
Dockerfileは下記のように書いておきます。
デフォルトのイメージではtexliveというユーザが用意されているようなので、
コンテナ作成時にそのユーザでログインするようにしておきます。
また、マウントするための作業ディレクトリも用意しておきます。
今回はライブラリのインストールなどは特に必要ありませんが、お好みで入れたいものがあればここで追加してください。
# texliveの公式イメージを使う
FROM texlive/texlive:latest
# ユーザーの追加(公式イメージではtexliveというユーザーがある)
ARG USERNAME=texlive
# ユーザー切り替え
USER $USERNAME
# 初期ディレクトリの設定
WORKDIR /home/$USERNAME/src
docker-compose.yaml
docker-compose.yamlは下記のようにしました。
ホストのsrcディレクトリとコンテナ内のsrcディレクトリをマウントして、
texソースファイルなどを永続化しておきます(コンテナが終了したときにファイルが消えてしまうと悲しいので)。
また、VSCodeでコンテナにアタッチして作業する想定で、都度コンテナ内で必要なVSCode拡張を入れることを想定して、.vscode-serverディレクトリもマウントしておきます。
これで、コンテナを立ち上げるたびに拡張機能をインストールする手間を省けます。
コマンドでBashを実行しているのはプロセスがなくてコンテナが終了してしまうのを防ぐためです。
services:
latex:
# コンテナ名
container_name: ${CONTAINER_NAME}
# Dockerfileへのパス
build: .
# ビルドされたイメージのタグ
image: ${HOST_NAME}/${SERVICE_NAME}:${VERSION}
# ボリュームマウント
volumes:
- ./src:/home/texlive/src
- ./.vscode-server:/home/texlive/.vscode-server
command: >
bash
tty: true
.env
後から管理しやすいように、
コンテナ名やイメージ名は環境変数として別ファイルに書いておきます。
それぞれの名前はお好みの形に変更可能です。
CONTAINER_NAME=texlive
HOST_NAME=texlive
SERVICE_NAME=mylatex
VERSION=1.0.0
.gitignore
srcと.vscode-serverの中身はGit管理しないようにします。
ソースファイルはtexのプロジェクトごとに個別でGit管理するようにします。
このようにしておくと、コンテナ環境周りと中身のソース回りを分けて管理できるので、個人的におすすめです。アプリの環境をGit管理するときなどにもこの形をとることが多いです。
また、.vscode-serverの中にはVSCode拡張ライブライのソースが入りますが、こちらは環境依存なので管理しないようにしています。
.keepは空のファイルです。GitHubなどにPushしたときにからのディレクトリは含まれないので、Git管理用に追加しているものです。
src/*
!src/.keep
.vscode-server/*
!.vscode-server/.keep
.env
VSCodeでLatexをコンパイルできるようにする
docker-compose.yamlがある場所で下記を実行して、イメージをビルドしてコンテナを立ち上げます。
docker-compose up -d
下記を実行して正常にコンテナがあれば大丈夫です。
docker-compose ps
コンテナが正常に立ち上がったら、VSCodeでアタッチします。
VSCode左下の「WSL:Ubuntu」のボタンを押すと下記のようなドロップダウンが出るので、その中から「実行中のコンテナーにアタッチする」を選択してアタッチします。
無事にアタッチ出来たら、コンテナ内でVSCode拡張のLatex Workshopをインストールして有効にしておきます。
VSCodeでのコンパイルの準備として、設定ファイルを編集しておきます。
VSCodeから設定を開きます。
右上にJSONで開くボタンがあるので押します。
設定のJSONに下記を追加します。
"latex-workshop.latex.tools": [
{
"name": "latexmk-uplatex",
"command": "latexmk",
"args": [
"-e","$latex=uplatex",
"-e","$bibtex=biber",
"-e","$dvipdf='dvipdfmx %O -o %D %S'",
"-e","$pdf_mode=3", // uplatex → dvipdfmx でPDF化
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"%DOC%"
]
}
],
"latex-workshop.latex.recipes": [
{ "name": "uplatex -> dvipdfmx", "tools": ["latexmk-uplatex"] }
],
"latex-workshop.latex.recipe.default": "uplatex -> dvipdfmx"
今回は既存プロジェクトの移行の形をとっていて、もともとがuplatexだったのでここでもuplatexのエンジンを使っています。
余談
ちなみにlatexのエンジンについては下記の記事などが勉強になります。
近年ではplatexやuplatexのようなdviファイルを経由する形よりも、pdfを直接コンパイルする方式が主流になっていくのではないか、という話もあります。実際、海外の英語テキストをコンパイルするのはpdflatexやLuaLatexなどを使うほうが主流のようです。
今後はLuaLatexなどへの移行が必要になるかもしれません。
もし今回の構成でLuaLatexに移行する場合は、設定ファイルの変更だけでなく、texファイル内での書き方も修正必要なので注意です。
コンパイル
最後に、適当なTexファイルを作り、コンパイルしてみます。
texファイルを開くと右上に三角のボタンが出るので、それを押すとコンパイルできます。
uplatexなので、dviファイルを経由してpdfファイルを生成します。
my-noteディレクトリ内にdviファイルとpdfファイルが正常に生成されていることを確認できればOKです。
お疲れさまでした。
まとめ
VSCode+DockerでLatexの環境構築をしました。
Dockerでやる意義は、1度Dockerfileを作っておけば、PCを買い替えても同様に動かせることです。
それでは快適なLatexライフを!
Discussion