devcontainerを使ってupLaTeXを書く
/ 7 min read
Updated:Table of Contents
はじめに
iOSDC2024でパンフレットを書くためにTeX(upLaTeX)を使いたいなと思ったのですが、TeXを書くためのセットアップが面倒でした。そこで、いい感じにdevcontainerで書けないかなとGitHubを彷徨っていたところ、**texlive-ja-devcontainer-template** を見つけました。しかし、このテンプレートが古いためか最新のVS Codeでは使えなかったため、一部修正して使えるようにしました。
今回は、フォーク元からの変更点と、どのように変更したかについて一部紹介したいと思います。
実際に、使ってみたい方はこちらから使ってください。
変更点
ざっくりの変更点は以下の通りです。
- bibtexを使った参考文献管理
- mintedを使ったソースコード掲載
- devcontainerで使うベースイメージをUbuntu 24.04 LTSにアップデート
- compose specificationに対応
- docker imageをGitHub Container Registryで管理
- docker imageのCI/CDでビルド
mintedを使ったコード掲載
今までTeXでソースコードを載せるときは、listingsを使ったり、時々、画像化して使っていたのですが、どうやらmintedというものがあるらしいぞ、ということでそちらを使えるようにしました。mintedの利点として、listingsを使うよりもシンタックスハイライトの設定が豊富というのもあります(Swiftとかはデフォルトでシンタックスハイライトの設定が入っている)。
mintedは単純に\usepackage{minted} をするだけではなくPythonのライブラリをインストールする必要あったため、Dockerfile内でインストールしました。
RUN apt update && apt upgrade -y && apt install -y \ git \ cpanminus \ texlive-extra-utils \ python3-pip \ python3-pygments \ make \ && apt clean \ && rm -rf /var/lib/apt/lists/*もともとベースイメージとしてUbuntuを使っていたので、Pythonは入っていたのですが、pipがなかったので入れました。そして、mintedを使うためにpython3-pygments も入れました。これでTeXファイルからmintedを使えるようになります。
mintedの使い方はこんな感じです。
\usepackage{minted}\renewcommand{\listingscaption}{コード} % キャプション名をコードに変更
\begin{document}コード\ref{listings:handle}はSwiftのコードです。\begin{listing} \begin{minted}[breaklines]{swift}public override func handle(_ event: NSEvent!, client sender: Any!) -> Bool { guard let event = event else { return false } // 受け取ったイベントに応じて状態を切り替える Action を呼び出す store.send(.handleRaelizeState(event)) switch store.raelizeState { // 何もないモード case .neutralMode: return false // 文字入力 or 補完ウィンドウ操作モード case .inputMode, .operationMode: return true }} \end{minted} \caption{handleのコード例}\label{listings:handle}\end{listing}\end{document}実際にコンパイルするといい感じに表示してくれます(スクショの1の赤枠は参照のハイパーリンクがついてるので赤くなってます)。
docker imageをGitHub Container Registryで管理
フォーク元では、Docker Hubでイメージを管理していました。そちらにあるイメージを使っていたのですが、ベースイメージが古いためか、devcontainerで警告が出て立ち上がりませんでした。そのためベースイメージを更新しました。
フォーク元に則って、Docker Hubで管理しても全然良かったのですが、どうせだったら同一リポジトリ内でイメージも管理したほうが楽になると思い、GitHub Container Registryで管理するようにしました。
イメージの管理は、毎回手動は面倒 & M1とWindowsでアーキテクチャが違って動かすときに大変そうだったので、GitHub Actionsを使ってCDするようにしています。ローカルで使う開発用イメージでバージョン管理の必要もないので、タグは毎回latestをつけるようにしました。
最初はQEMUを使ってマルチアーキテクチャビルドをしていた(arm64ランナーが無料プランではまだ使えないっぽい)のですが、あまりにも時間がかかりすぎ(3時間くらい待っても終わらなかった…)て諦めました…
name: Push Docker image to GitHub Packages
on: push: branches: - master paths: - "texlive-ja.Dockerfile" workflow_dispatch:
jobs: push_to_registry: runs-on: ubuntu-latest
steps: - name: Check out the repo uses: actions/checkout@v4
- name: Set up Docker Buildx uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }}
- name: Image Build and push uses: docker/build-push-action@v5 with: context: . file: texlive-ja.Dockerfile provenance: false push: true tags: "ghcr.io/tatsumi0000/texlive-ja-devcontainer-template/texlive-ja:latest"docker/build-push-actionで特定のDockerfileをビルドするときは、fileにファイル名を指定することでビルド出来ました。
終わりに
TeXを書くためにもともとあったdevcontainerのテンプレートを使えるように改良しました。mintedを使えるようにするのに少し苦労しましたが、結果的にdevcontainerの開発方法もなんとなく学べて良かったです。