skip to content
私的歌詞倉庫

devcontainerを使ってupLaTeXを書く

/ 7 min read

Updated:
Table of Contents

はじめに

iOSDC2024でパンフレットを書くためにTeX(upLaTeX)を使いたいなと思ったのですが、TeXを書くためのセットアップが面倒でした。そこで、いい感じにdevcontainerで書けないかなとGitHubを彷徨っていたところ、**texlive-ja-devcontainer-template** を見つけました。しかし、このテンプレートが古いためか最新のVS Codeでは使えなかったため、一部修正して使えるようにしました。

今回は、フォーク元からの変更点と、どのように変更したかについて一部紹介したいと思います。

実際に、使ってみたい方はこちらから使ってください。

GitHub - Tatsumi0000/texlive-ja-devcontainer-template: VS Code Remote Developmentの機能を用いて、LaTeX環境を容易に構築するサンプルコードです。

変更点

ざっくりの変更点は以下の通りです。

  • 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の赤枠は参照のハイパーリンクがついてるので赤くなってます)。

Screenshot 2024-06-22 at 0.52.38.png

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の開発方法もなんとなく学べて良かったです。

参考文献