LATEX: DOCKER WITH VSCODE 2

前回からの続き。LaTeXの処理を行うdocker環境を整備する。

3.Dockerのrootless化

VScodeからuser権限でdockerを実行できるようにdockerのrootless化を行う。こちらも公式がドキュメントを整備しているのでそれに沿って作業を行う。

$ sudo apt install uidmap
$ sudo systemctl disable --now docker.service docker.socket
$ sudo chmod 644 /etc/hosts
$ /usr/bin/dockerd-rootless-setuptool.sh install

私の環境では dockerd-rootless-setuptool.sh が途中で停止する事象が発生した。ログを見る限りだと /etc/hosts を開くことが出来ないため systemctl --user start docker.service が完了しないようであった。このため、セキュリティ上は好ましくないが、 /etc/hosts の権限を644に変更することにした。余談ではあるが、これを機にいくつかのコンテナをrootlessユーザで実行するように変更した。

4.LaTeXコンテナイメージの作成

Dockerfileは次を作成した。必要なパッケージは絞り込むのが面倒だったので、各所を参考にしながら適当に決めている。

ARG OS_VER 24.04
#
FROM ubuntu:${OS_VER} AS LaTeX
RUN apt-get update && \
  apt-get -y install \
    texlive-lang-japanese \
    texlive-lang-cjk \
    texlive-fonts-recommended \
    texlive-latex-extra \
    xdvik-ja \
    latexmk \
    evince && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/*
COPY latexmkrc /root/.latexmkrc
WORKDIR /TeX

latexmkrcは基本的にはdocker実行時にマウントする予定だが、特に機密情報も含まれていないのでコンテナにも埋め込んでおく。

#!/usr/bin/env perl

# LaTeX
$latex = 'platex -synctex=1 -halt-on-error -file-line-error %O %S';
$max_repeat = 5;

# BibTeX
$bibtex = 'pbibtex %O %S';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars %O %S';

# index
$makeindex = 'mendex %O -o %D %S';

# DVI / PDF
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3;

# preview
$pvc_view_file_via_temporary = 0;
if ($^O eq 'linux') {
    $dvi_previewer = "xdg-open %S";
    $pdf_previewer = "xdg-open %S";
} elsif ($^O eq 'darwin') {
    $dvi_previewer = "open %S";
    $pdf_previewer = "open %S";
} else {
    $dvi_previewer = "start %S";
    $pdf_previewer = "start %S";
}

# clean up
$clean_full_ext = "%R.synctex.gz"

普段はコンテナイメージを作成した際はlatestタグをつけていないが、今回はシェルスクリプトで動かすためlatestタグを付けてイメージ更新時にシェルスクリプトの更新が不要なようにしておく。

build_f="Dockerfile"
Ubuntu=24.04
IMAGE=latex:latest
docker build -f ${build_f} -t ${IMAGE} --build-arg OS_VER=${Ubuntu} ./

5.LaTeXコンパイル実行用シェルスクリプトの作成

$HOME/bin なり /usr/bin なりPATHを通している好きなところに次のスクリプトを配置する。

#!/bin/bash
DOCFILE=$1
echo "DOC=$DOCFILE"
echo "DIR=$PWD"

mountF="-v ${PWD}:/TeX"
if [ -e ${PWD}/latexmkrc ]; then
mountF="-v ${PWD}:/TeX -v ${PWD}/latexmkrc:/root/.latexmkrc"
fi

echo $mountF

echo "====== RUN DOCKER ======"
docker run --rm \
  ${mountF} \
  latex:latest \
  /usr/bin/latexmk -outdir=/TeX/out /TeX/$DOCFILE

実行時はCurrent Dirしかコンテナからは見えないので、Libディレクトリなどを使う場合は変更が必要。latexmkrcをマウントするようにしているが、texファイルと同じ場所にあるlatexmkrcは読み込む仕様のようなので、無くてもいいかも。複数のlatexmkrcを読み込んだ場合、競合する設定は先に読み込んだlatexmkrcを優先するらしい。私の場合は毎回/root/.latexmkrcが読み込まれているようなのでこれを上書きするためにマウントの設定は一旦残しておく。

6.コンパイル

VScodeの設定は完了しているので次画面の赤丸箇所からコンパイルを行うことができる

TeXのコンパイル