LaTeX のコンパイル環境を docker に閉じ込めて使う

VM を含めて普段から4箇所ほど環境を使いまわしていると LaTeX の環境をそれぞれで整えるのがかなり億劫である. 昨年の卒業論文で書き始める前に構築した環境が割とポータブルだったのでそれをまとめて書く.

求めていた環境は以下のような形で,割とシンプルに満たせたと思う.

  • ローカルに LaTeX およびそれに関係するパッケージは一切入れない
  • docker とプロジェクトがあればどこでもビルドできる
  • ローカルに LaTeX 環境を整えた場合とコンパイル等の速度に差は無い
  • (編集はターミナルで完結させたい = GUI使いたくない)

github.com

README にも書いてある通り,プロジェクトごと一度引っ張ってきて解凍するだけで良い. docker を使っているので(docker 以外に)インストールが必要なものはないし,パッケージで必要なのがあっても Dockerfile に書いてしまえば問題無い.

Dockerfile のベースイメージは alpine をベースに作ってあるもの*1を使っているのでディスクもそんなに食べない.

Dockerfile

FROM paperist/alpine-texlive-ja

RUN apk add --update ghostscript git

RUN tlmgr update --self

# You can install package using tlmgr
# e.g.) RUN tlmgr install ulem

日本語入力系の設定が記載している .latexmkrc を参考に*2してコマンド類をまとめることで,コンパイル時のスクリプトも単純にしている.

build.sh

docker build -t latex-template .
docker run --rm -it -v $PWD:/workdir latex-template:latest latexmk main.tex

.latexmkrc

#!/usr/bin/env perl
$latex            = 'platex -synctex=1 -halt-on-error';
$latex_silent     = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex           = 'pbibtex';
$dvipdf           = 'dvipdfmx %O -o %D %S';
$makeindex        = 'mendex %O -o %D %S';
$max_repeat       = 5;
$pdf_mode         = 3;

ipsj のテンプレートくらいの内容なら特に問題無く扱える.コンテナ起動速度もコンパイル時間に比べれば一瞬なので気にならないはず. ブログの内容は古い可能性があるので,適宜リポジトリを参照してほしい.