h20y6m.github.io

2021年12月02日

独自TeX Liveリポジトリを作ってみる話

これは「TeX & LaTeX Advent Calendar 2021」の2日目の記事として投稿した『独自TeX Liveリポジトリを作ってみる話 · GitHub』の転載です。

この記事ではpTeXの開発版バイナリを独自リポジトリからTeX Live Managerを使用してインストールする方法を紹介します。

実際に作成したものは以下にあります。

はじめに

この記事を読んでいる人の中にはaminophenさんの「pLaTeX が本格的にやばいかもという話」を読んだことがある人も多いかもしれません。その中で挙げられている「和文と欧文が混同されてしまう」問題に対処するための開発がtexjporg/tex-jp-buildprintkanji_16bitブランチで行われています。この改修が行われたpTeXバイナリはTeX Live 2022に含まれることになると思いますが、pTeXの内部構造を大きく改造する大改修となるため予期せぬバグが起きる可能性もあります。

そのため早めに改修後のバイナリを試してみたいと思っている人も多いことでしょう。しかし開発版バイナリを既存のTeX Liveのバイナリに上書きしてしまうと既存のバイナリと比較したいときに不便ですし、TeX Liveの更新で戻されてします可能性もあります。バイナリを別の名前にして現行版のバイナリと並行して利用できるようにすることもできますがTeX Liveの更新があった場合に一々手動でフォーマットを再作成する必要があります。またどちらの場合もバイナリを更新したときに手動でフォーマットの再作成が必要となり面倒です。

もし独自のパッケージをTeX Live Managerで管理することが出来ればパッケージの更新時に自動的にフォーマットの再作成を行ってくれるので便利です。TeXLive ManagerはTLContribのような外部のリポジトリを追加して利用することが出来ます。独自のリポジトリを作成してTeXLive Managerに追加してあげれば独自のパッケージをTeX Live Managerで管理することが出来るはずです。

そこで今回は独自のTeX Liveリポジトリを作成し、その独自リポジトリから開発版pTeXバイナリをインストールしてみました。独自のTeX Liveリポジトリを作成はtltexjpのリポジトリを参考にしました。

バイナリのビルド

まずは開発版pTeXのバイナリを用意します。今回は現行版と開発版の比較がしやすいように別のコマンドとしてビルドします。開発版のptexはptex-betaのように-beta付きの名前にすることにします。

エンジンの名称を変更するためsource/texk/web2c/texmfmp.hのTEXMFENGINENAME-beta付に書き換えます。

Linuxの場合、あとは通常通りにビルドした後、出来上がった(e)(u)ptexを(e)(u)ptex-betaにリネームします。またplatex-beta -> eptex-betaのようなシンボリックリンクも作成しておきます。

Windowsの場合は角藤先生が作成されているW32TeXのソース(w32tex-src.tar.xz)に開発版の変更をマージしたうえでビルドする必要があります。かなり大変そうなので今回はこちらの無理矢理MSVCでビルドするやつを使うことにします。

リポジトリの作成

リポジトリの作成はLinux上で行います。今回はUbuntu 20.04 on WSL2上で行いました。

以下のような構成でディレクトリを作成します。このディレクトリはGitでバージョン管理することにします。

./
|-- bin/
|   |-- win32/
|   `-- x86_64-linux/
|-- texmf-dist/
|   `-- web2c/
`-- tlpkg/
    `-- tlpsrc/

共通の定義ファイルの作成

tlpkg/tlpsrc/に以下のファイルを作成します。

category TLCore
depend container_format/xz
depend container_split_doc_files/1
depend container_split_src_files/1
depend minrelease/2021
depend release/2021-tlptexbeta
category TLCore
depend opt_autobackup:1
depend opt_backupdir:tlpkg/backups
depend opt_create_formats:1
depend opt_desktop_integration:1
depend opt_file_assocs:1
depend opt_generate_updmap:0
depend opt_install_docfiles:1
depend opt_install_srcfiles:1
depend opt_location:__MASTER__
depend opt_post_code:1
depend opt_sys_bin:/usr/local/bin
depend opt_sys_info:/usr/local/share/info
depend opt_sys_man:/usr/local/share/man
depend opt_w32_multi_user:1
depend setting_available_architectures:win32 x86_64-linux

独自パッケージの定義

独自パッケージの定義ファイルを作成します。パッケージの定義ファイルはtlpkg/tlpsrc/以下に<packagename>.tlpsrcのような名前で作成します。

今回はptex-betaという名前で独自パッケージを作成します。以下の内容でtlpkg/tlpsrc/ptex-beta.tlpsrcを作成します。

category Package
shortdesc Development version pTeX
depend platex
depend ptex
depend uplatex
depend uptex
execute AddFormat name=eptex-beta       engine=eptex-beta  options="*eptex.ini"   patterns=language.dat fmttriggers=cm,hyphen-base,knuth-lib,plain,ptex-base,ptex-fonts,etex
execute AddFormat name=euptex-beta      engine=euptex-beta options="*euptex.ini"  patterns=language.def fmttriggers=cm,hyphen-base,knuth-lib,plain,uptex-base,uptex-fonts,etex,ptex-base
execute AddFormat name=platex-beta      engine=eptex-beta  options="*platex.ini"  patterns=language.dat fmttriggers=atbegshi,atveryend,babel,cm,everyshi,firstaid,hyphen-base,l3backend,l3kernel,l3packages,latex,latex-fonts,tex-ini-files,unicode-data,ptex-fonts,latex
execute AddFormat name=platex-beta-dev  engine=eptex-beta  options="*platex.ini"  patterns=language.dat fmttriggers=atbegshi,atveryend,babel,cm,everyshi,firstaid,hyphen-base,l3backend,l3kernel,l3packages,latex,latex-fonts,tex-ini-files,unicode-data,ptex-fonts,l3kernel,latex-base-dev,latex-firstaid-dev
execute AddFormat name=ptex-beta        engine=ptex-beta   options="ptex.ini"                           fmttriggers=cm,hyphen-base,knuth-lib,plain,ptex-base,ptex-fonts
execute AddFormat name=uplatex-beta     engine=euptex-beta options="*uplatex.ini" patterns=language.dat fmttriggers=atbegshi,atveryend,babel,cm,everyshi,firstaid,hyphen-base,l3backend,l3kernel,l3packages,latex,latex-fonts,tex-ini-files,unicode-data,uptex-fonts,platex,latex
execute AddFormat name=uplatex-beta-dev engine=euptex-beta options="*uplatex.ini" patterns=language.dat fmttriggers=atbegshi,atveryend,babel,cm,everyshi,firstaid,hyphen-base,l3backend,l3kernel,l3packages,latex,latex-fonts,tex-ini-files,unicode-data,uptex-fonts,platex,l3kernel,latex-base-dev,latex-firstaid-dev
execute AddFormat name=uptex-beta       engine=uptex-beta  options="uptex.ini"                          fmttriggers=cm,hyphen-base,knuth-lib,plain,uptex-base,uptex-fonts
binpattern f bin/${ARCH}/eptex-beta
binpattern f bin/${ARCH}/euptex-beta
binpattern f bin/${ARCH}/platex-beta
binpattern f bin/${ARCH}/platex-beta-dev
binpattern f bin/${ARCH}/ptex-beta
binpattern f bin/${ARCH}/uplatex-beta
binpattern f bin/${ARCH}/uplatex-beta-dev
binpattern f bin/${ARCH}/uptex-beta

またビルドしたptex-betaバイナリ(とシンボリックリンク)をbin/以下の各アーキテクチャごとのディレクトリ入れます。

ここまでで一旦Gitでコミットをしておきます。

データベースファイル&コンテナファイルの生成

データベースファイルtexlive.pdbやコンテナファイルを作成するスクリプトはTeX Live のリポジトリにあります。Subversionでチェックアウトしてきてもよいのですが、今回は必要なモノだけ集めたコンテナイメージを作成して使うことにします。

以下のようなDockerfileを作成します。

FROM ubuntu:20.04

RUN apt-get update \
 && apt-get install -y --no-install-recommends \
      git \
      libtext-unidecode-perl \
      libxml-parser-perl \
      libxml-xpath-perl \
      perl \
      subversion \
      xz-utils \
 && rm -rf /var/lib/apt/lists/*

RUN mkdir -p /opt/texlive/tlpkg && cd /opt/texlive/tlpkg \
 && svn export svn://tug.org/texlive/trunk/Master/tlpkg/TeXLive/ \
 && mkdir -p /opt/texlive/tlpkg/bin && cd /opt/texlive/tlpkg/bin \
 && svn export svn://tug.org/texlive/trunk/Master/tlpkg/bin/tl-update-tlpdb \
 && svn export svn://tug.org/texlive/trunk/Master/tlpkg/bin/tl-update-containers \
 && mkdir -p /opt/texlive/tlpkg/installer && cd /opt/texlive/tlpkg/installer \
 && svn export svn://tug.org/texlive/trunk/Master/tlpkg/installer/config.guess

ENV PATH /opt/texlive/tlpkg/bin:$PATH

WORKDIR /work

コンテナイメージをビルドしておきます。

podman build -t tl-update .

以下の二つのコマンドでデータベースとコンテナファイルを生成します。

podman run --rm -it -v `pwd`:/work tl-update tl-update-tlpdb --master=/work --from-git
podman run --rm -it -v `pwd`:/work tl-update tl-update-containers --master=/work --location=/work/dist --no-sign --all --recreate

(初回は--recreateオプションが必要なようです。)

dist/tlpkg/以下にtexlive.pdb等のファイルが、dist/archive/以下にptex-beta.r*.tar.xz等のファイルが生成されればOKです。

独自リポジトリからインストール

独自リポジトリをTeX Live Managerに登録します。(/path/toの部分はもちろん作ったリポジトリへのパスです。)

tlmgr repository add /path/to/tlptexbeta/dist ptexbeta
tlmgr pinning add ptexbeta '*'
tlmgr repository add C:/path/to/tlptexbeta/dist ptexbeta
tlmgr pinning add ptexbeta "*"

インストールする前にtexlive/2021/texmf.cnfに以下を追記します。(内容はtexlive/2021/texmf-dist/web2c/texmf.cnfの-betaなしのものからコピーしたものです。)

% ptex-beta
TEXINPUTS.eptex-beta       = $TEXMFDOTDIR;$TEXMF/tex/{ptex,plain,generic,latex,}//
TEXINPUTS.euptex-beta      = $TEXMFDOTDIR;$TEXMF/tex/{uptex,ptex,plain,generic,latex,}//
TEXINPUTS.platex-beta      = $TEXMFDOTDIR;$TEXMF/tex/{platex,latex,generic,}//
TEXINPUTS.platex-beta-dev  = $TEXMFDOTDIR;$TEXMF/tex/{latex-dev,platex,latex,generic,}//
TEXINPUTS.ptex-beta        = $TEXMFDOTDIR;$TEXMF/tex/{ptex,plain,generic,latex,}//
TEXINPUTS.uplatex-beta     = $TEXMFDOTDIR;$TEXMF/tex/{uplatex,platex,latex,generic,}//
TEXINPUTS.uplatex-beta-dev = $TEXMFDOTDIR;$TEXMF/tex/{latex-dev,uplatex,platex,latex,generic,}//
TEXINPUTS.uptex-beta       = $TEXMFDOTDIR;$TEXMF/tex/{uptex,ptex,plain,generic,latex,}//

TeX Live Managerからptex-betaパッケージをインストールします。TeX Live ManagerのGUIからもインストールできます。

tlmgr install ptex-beta

適当なファイルをコンパイルしてインストールできたか確認します。

$ cat test.tex
\documentclass[dvipdfmx,a4paper]{jarticle}
\usepackage{bxjalipsum}
\begin{document}
\jalipsum{wagahai}
\end{document}

$ platex-beta test
ptenc_ptex_mode is called! (1)
This is e-pTeX, Version 3.141592653-p3.10.90-210701-2.6 (utf8.euc) (TeX Live 2022/dev) (preloaded format=platex-beta)
 restricted \write18 enabled.
entering extended mode
(./test.tex
pLaTeX2e <2021-06-01>+2 (based on LaTeX2e <2021-11-15>)
L3 programming layer <2021-11-22>
(/usr/local/texlive/2021/texmf-dist/tex/platex/base/jarticle.cls
Document Class: jarticle 2020/09/30 v1.8f Standard pLaTeX class
(/usr/local/texlive/2021/texmf-dist/tex/platex/base/jsize10.clo))
(/usr/local/texlive/2021/texmf-dist/tex/latex/bxjalipsum/bxjalipsum.sty)
(/usr/local/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def
(|extractbb --version)) (./test.aux) [1] [2] [3] [4] [5] [6] [7] [8] [9]
(./test.aux) )
Output written on test.dvi (9 pages, 51952 bytes).
Transcript written on test.log.

うまくいったようです。

おわりに

本記事では独自のTeX Liveリポジトリを作成しそこからTeX Live Managerを使用してpTeXの開発版バイナリをインストールする方法を紹介紹介しました。TeX Live Managerによってパッケージを管理することでtlmgr updateした場合も必要に応じて自動的にフォーマットを再作成されるようになり一々手動でフォーマットを再作成する必要もなくなりました。

皆さんもぜひ独自TeX Liveリポジトリを作って開発版pTeXを試しましょう!