📑

texliveの最強環境を作ったよ

2022/01/14に公開

texliveのdockerイメージを作成し、devcontainerとして使えるようにしました。

概要

卒論のため久しぶりにTeX環境を作る必要があったので、TeX Liveがfullでインストールされたコンテナイメージを探していたのですが、無かったので作りました。
通常のインストール手順ではハマるポイントがあったのでパッケージマネージャを使わない方法でインストールしました。

devcontainer化することで、vscodeから立ち上げるだけで補完、プレビューが使えるようになっています。

devcontainer

devcontainerとはvscodeの(拡張)機能の1つで、利用することで用意したコンテナの中にワークスペースフォルダをマウントし、コンテナ内のコマンド、環境を使うことができます。
また、拡張機能、設定についても指定したものを使うことができます(ローカルのvscodeにはインストールされません)。
これにより環境の分離、チーム内での共通化ができます。

参考:devcontainerのチュートリアル

ネット上に存在するTeX用Dockerイメージ

ネット上には、フルインストール版、日本語に必要なモジュールに限定した版の両方について、様々なイメージが存在しています。
しかし、日本語環境がうまく入らない、texindex(フォーマッタ)が動作しないなど、日本語環境で常用するには不具合が発生しました。
執筆中に試してみたら、公式が配布しているtexlive/texliveイメージはちゃんと全部動きました。。。まあ、見なかったことにします。
また、fullと謳っていながら実際にはモジュールに不足があるイメージもあります(主に日本語関係のモジュールがない)。

制作内容

全容はGithubのリポジトリから参照できます。

tex.profile

texを非対話的に(ビルド時にユーザーがオプション等を選択しない)インストールするのに必要な設定ファイルです。
今回は、このファイルによるスキーマ指定がしたかったため、aptは使わずに、ソースからインストールしています。

selected_scheme scheme-fullでfullバージョンを指定しています。

その他で肝要な部分は、option_doc 0option_src 0です。
fullでインストールすると、ドキュメントとソースを含むだけで2GB近く消費してしまいます。
そのため、このオプションで除外しておきます。

selected_scheme scheme-full

TEXDIR /opt/texlive/2021
TEXMFCONFIG ~/.texlive2021/texmf-config
TEXMFHOME ~/texmf
TEXMFLOCAL /opt/texlive/texmf-local
TEXMFSYSCONFIG /opt/texlive/2021/texmf-config
TEXMFSYSVAR /opt/texlive/2021/texmf-var
TEXMFVAR ~/.texlive2021/texmf-var

binary_x86_64-darwin 0
binary_x86_64-linux 1
binary_win32 0
option_doc 0
option_src 0
option_adjustrepo 0

余談ですが、この設定ファイルの書式、TeX Liveのリファレンスにも見つけられませんでした(一度デフォルト設定でビルドすると出力されるから、それを改変しろ。ということらしい。)

Dockerfile

本体となるDocekrfileです。
ベースにはMicrosoftが公開しているdevcontainer用に設定されたイメージを使用しました。
基本的なutil系コマンドがインストール済みです。

それ以降の処理はコメントに記載してあるとおりです。

FROM mcr.microsoft.com/vscode/devcontainers/base:ubuntu-21.04

COPY tex.profile ./

# 日本のミラーサーバからTeX Live 2021をダウンロードしてくる
RUN wget https://texlive.texjp.org/2021/tlnet/install-tl-unx.tar.gz \
    && mkdir install-tl \
    && tar xzf install-tl-unx.tar.gz -C install-tl --strip-components 1 \ # 解凍
    && ./install-tl/install-tl \ # インストールスクリプトを起動
    --profile ./tex.profile \ # 先述のプロファイルを指定する
    --repository http://texlive.texjp.org/2021/tlnet \ # 依存のDL元も日本のミラーサーバ
    && rm -r install-tl-unx.tar.gz install-tl

# latexindentを使うために必要なperlのモジュールをaptで取得する。
# cpan(perlのパッケージマネージャ)でのインストールはperl外の依存(makeとか)を必要とするため、対応するものをaptで探した。
RUN apt-get update \
    && apt-get install -y --no-install-recommends \
    libyaml-tiny-perl \
    libfile-homedir-perl \
    libunicode-linebreak-perl \
    && apt-get autoremove -y \
    && apt-get clean -y \
    && rm -rf /var/lib/apt/lists/*

USER vscode

# 環境変数の更新
RUN echo 'export PATH="$PATH:/opt/texlive/2021/bin/x86_64-linux"' >> ~/.bashrc

また、本番リポジトリではこのDockerfileをビルド、Dockerhubにアップしたものをpullしてくる様になっています。
そのため、通常のtexliveのインストール、ビルドよりも大幅に短期間でセットアップできます。
(一度pullしておけば再起動は爆速)

その他

latexmkrc(texからPDFへのビルド手順を定義したファイル)と、settings.json(vscodeの設定)については、このリポジトリを参考にしています。

まとめ

以上の内容をテンプレートリポジトリとしてこちらにアップしました。
補完、フォーマットも効いて、エラーは該当ラインに表示、ファイルの保存時に自動的にビルドするなど、手間の割になかなか便利に使えると思います。
是非使ってみてください。

GitHubで編集を提案

Discussion