概要
これまで筆者は
に挑戦してきた.
しかし,上に挙げた記事内の方法ではコンパイルが一度しか実行されない.従って,相互参照を含んでいたり BibTeX を利用していたりする場合,生成される PDF ファイルは (??) を含むなど不完全なものとなる.そこで,一度実行すれば自動的に必要なだけコンパイルをやってくれる Latexmk を利用して,この問題を解決する.
また,上に挙げた記事内の方法ではひとつの TeX ファイルのコンパイルにしか対応していなかった.これはコードの中でコンパイルする TeX ファイルを指定していたからである.そこで,コードでファイルを指定するのではなく,Git の機能の一つであるタグを用いてファイルを指定することで,この問題を解決する.
詳細
コンパイルさせたいファイルをタグ名で指定するため,タグ名は必ず ファイル名-ver.x にする.例えば doc1.tex というファイルをコンパイルさせたいなら,タグ名は doc1-ver.1 などとする.
必要ファイルの準備
下記の通り,必要最低限のファイルを用意する.同じものがこのリポジトリにある.
.
│  .latexmkrc
│
└─.github
    ├─actions
    │  └─latex
    │          Dockerfile
    │          entrypoint.sh
    │
    └─workflows
            latexmk.yml
.latexmkrc
.latexmkrc は Latexmk 実行時に何1を使ってコンパイルするかを記述したファイルである.
$latex  = 'platex -synctex=1 %O %S';
$bibtex = 'pbibtex %O %B';
$dvipdf = 'dvipdfmx %O -o %D %S';
Dockerfile
Dockerfile にはアクション実行時に行われる動作が一通り書かれている.
FROM ubuntu:latest
RUN apt-get update \
  && apt-get install -y --no-install-recommends \
    curl \
    python3 \
    latexmk \
    lmodern \
    texlive \
    texlive-latex-extra \
    texlive-lang-japanese \
  && rm -rf /var/lib/apt/lists/*
RUN mktexlsr && mkdir -p /app
WORKDIR /app
ADD entrypoint.sh /entrypoint.sh
RUN ["chmod", "+x", "/entrypoint.sh"]
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
entrypoint.sh は Dockerfile の最後で実行されるシェルスクリプトである.Latexmk の実行と,生成された PDF ファイルのリリース実行が書かれている.
3行目の GITHUB_REF には refs/tags/タグ名 という値が代入されているので,最初の10文字を排除して TAG_NAME としている.また,TAG_NAME は ファイル名-ver.x という形に決めていたので,4行目では後ろから見て最初のハイフン以降を排除して FILE_NAME としている.
# !/bin/bash
set -eux
TAG_NAME=${GITHUB_REF:10}
FILE_NAME=${TAG_NAME%-*}
# build pdf (change if necessary)
latexmk -pdfdvi $FILE_NAME.tex
# create release
res=`curl -H "Authorization: token $GITHUB_TOKEN" -X POST https://api.github.com/repos/$GITHUB_REPOSITORY/releases \
-d "
{
  \"tag_name\": \"$TAG_NAME\",
  \"target_commitish\": \"$GITHUB_SHA\",
  \"name\": \"$TAG_NAME\",
  \"draft\": false,
  \"prerelease\": false
}"`
# extract release id
rel_id=`echo ${res} | python3 -c 'import json,sys;print(json.load(sys.stdin)["id"])'`
# upload built pdf
curl -H "Authorization: token $GITHUB_TOKEN" -X POST https://uploads.github.com/repos/$GITHUB_REPOSITORY/releases/${rel_id}/assets?name=$FILE_NAME.pdf\
  --header 'Content-Type: application/pdf'\
  --upload-file $FILE_NAME.pdf
latexmk.yml
latexmk.yml にはアクションの場所や実行される条件が記述されている.実行条件は
- push された中身に TeX ファイルが含まれていること
- タグ名が *-ver.*の形になっていること
としている.
name: LaTeX to PDF (Latexmk)
on:
  push:
    paths: '*.tex'
    tags: '*-ver.*'
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Set up Git repository
        uses: actions/checkout@v1
      - name: Build docker image
        uses: denkiuo604/latexmk/.github/actions/latex@master
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
これでアクション実行に必要なファイルは揃う.
いざリリース
コンパイルしたい TeX ファイルを .latexmkrc と同じディレクトリに配置する.このリポジトリでは,例えば次のファイルを用いている.
\documentclass{jsarticle}
\usepackage{amssymb}
\begin{document}
$(S,\Sigma,\mu)$を測度空間とする.
このとき,相異なる$i,j$に対して$A_i\cap A_j\neq\varnothing$を満たす
任意の$A_1,A_2,\cdots\in\Sigma$に対して
\begin{equation}\label{可算加法性}
    \mu\left(\bigcup_{k=1}^\infty A_k\right)=\sum_{k=1}^\infty\mu(A_k)
\end{equation}
が成り立つ.
また,(\ref{可算加法性})において$A_{n+1}=A_{n+2}=\cdots=\varnothing$とすることで
\begin{equation}\label{有限加法性}
    \mu\left(\bigcup_{k=1}^nA_k\right)=\sum_{k=1}^n\mu(A_k)
\end{equation}
も得られる.
\end{document}
上記 doc2.tex は相互参照を含むため,コンパイルを少なくとも2回実行しなければならない.しかし,Latexmk を使えば必要回数だけ自動でコンパイルしてくれる.
TeX ファイルを配置できたら,タグ名のルールに注意して push すればよい.今の場合,タグ名は doc2-ver.1 などとする.実際の結果は GitHub リポジトリを参照のこと.
参考
- 
platex か latex か,pbibtex か bibtex かなど.ここでは最低限の設定のみしている. ↩