『数式組版』を組む技術:複数のTeX Liveバージョンとtexmf-treeとを管理する
本稿において,“本書”とは木枝祐介著『数式組版』ラムダノート(2018)のことである.
>>> https://www.lambdanote.com/collections/mathtypo
また,本書はLuaLaTeXを用いて組まれた.したがって本稿ではLuaLaTeXの使用を前提としている.
本書が組まれた当時はTeX Live 2017が用いられたが,多くのコードはそれより後のTeX Live 2019まで共通して使用可能である.
本稿では,バージョンに強く依存する場合を除いて,各バージョンは明記されないことがある.
書籍組版を業務として行う場合,我々清閑堂では専用のクラスファイルを用意する.
本稿ではその詳細は述べないが,TeX Liveに収録されているような汎用クラスファイルを利用し,スタイルファイルやプリアンブルでの記述で書籍の組版を開始するよりもよいと我々は判断している.
また,書籍単体であれば,全てのマクロをクラスファイルに記述してもよいが,各出版社や各編集者の特性により,ある程度汎用性のある設定等は別途スタイルファイルに仕立てておく方が合理的である.
TeX Liveはそのリリースサイクルによって,各バージョンの最初のリリースとfrozenとよばれることもある最終更新の段階が存在するという意味でとても安定している.
それらのリリースバージョンを適当に扱うことにより,必要な時点で必要なバージョンに戻ることができるようにすることは重要である.
複数のTeX Live
複数のTeX Liveリリースを管理するのは単にシェルの環境変数で制御すればよい.
たとえば,次はTeX Live 2017と2019とをシェルの設定ファイルに列挙しており,必要に応じてコメントアウトをいれかえることによって環境変数を変更するよう準備している.
#PATH="/usr/local/texlive/2017/bin/x86_64-darwin:$PATH"
PATH="/usr/local/texlive/2019/bin/x86_64-darwin:$PATH"
#INFOPATH="/usr/local/texlive/2017/texmf-dist/doc/info:$INFOPATH"
#MANPATH="Add /usr/local/texlive/2017/texmf-dist/doc/man:$MANPATH"
INFOPATH="/usr/local/texlive/2019/texmf-dist/doc/info:$INFOPATH"
MANPATH="Add /usr/local/texlive/2019/texmf-dist/doc/man:$MANPATH"
なお,これらはTeX Liveをインストールした際最後に出力されるパスである.
複数のtexmf-treeを管理する
ここでは,各書籍用のtexmf-treeを管理することを考える.
ここでtexmf-treeとは,TeX LiveのTDSに則ったディレクトリ構成のことをそうよんでいる.
TDSの詳細についてはTUGによる『A Directory Structure for TeX Files』(https://tug.org/tds/tds.html)を参照のこと.
たとえば本書に用いたtexmf-treeは次のようになっている.
texmf-handbook-mtypog
`-- tex
|-- general
| |-- pdfx.sty
| `-- pdfx.sty.2017
`-- lualatex
`-- handbook-mtypog
|-- handbook-mtypog.cls
|-- handbook-mtypog.ist
|-- mt-vlmr.cfg
`-- t1vlmtt.fd
`texmf-handbook-mtypog`というディレクトリの下に本書で用いたファイル類が集約されている.
◆シンボリックリンクによるtexmf-treeの切替え
以降はTeX Live 2019を前提とする.
`texmf-A`と`texmf-B`という二つのtexmf-treeを切替えることを考える.
`kpsewhich -all texmf.cnf`で返される結果の最後のファイルを参照する.
たとえば次のように返された場合,対象のファイルは`/usr/local/texlive/2019/texmf-dist/web2c/texmf.cnf`である.
/usr/local/texlive/2019/texmf.cnf
/usr/local/texlive/2019/texmf-dist/web2c/texmf.cnf
このファイル`texmf.cnf`では次のように変数が定義されている.
TEXMFHOME = ~/texmf
この変数`TEXMFHOME`は同じファイル`texmf.cnf`で次のように用いられており,必ず参照されることになる.
TEXMF = {$TEXMFAUXTREES$TEXMFCONFIG,$TEXMFVAR,$TEXMFHOME,!!$TEXMFLOCAL,!!$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFDIST}
したがって,texmf-treeを切替えるには,シンボリックリンクで`~/texmf`が`texmf-A`あるいは`texmf-B`を指すようにすれば十分である.
なお,texmf-treeを変更した場合は毎回`mktexlsr`を実行する.
◆環境変数TEXMFHOMEに複数のディレクトリを設定
ところで,汎用性が高いスタイルファイルをまたtexmf-treeの形(`texmf-C`とする)に仕立てておき,`texmf-A`と同時に参照できるようにしたい場合もある.
これは,シンボリックリンクをひとつのtexmf-treeに対して行うことでは解決できない.
上で参照したファイル`texmf.cnf`の冒頭にも書かれているように,カスタマイズを行うのは別ディレクトリの同じ名前のファイル`texmf.cnf`を編集する.
`kpsewhich texmf.cnf`(オプション無し)で返されるファイルがそれである.
カスタマイズ用の`texmf.cnf`で,たとえば`TEXMFHOME`を次のようにカスタマイズする.
TEXMFHOME = ~/texmf-{Y,Z}
そして,`texmf-Y`は`texmf-A`を,`texmf-Z`は`texmf-C`をそれぞれシンボリックリンクで指すようにすればよい.
なお,シンボリックリンクを用いなくとも,この`texmf.cnf`に直接texmf-treeのパスを書き込んでもよい.
注:非カスタマイズ用のファイル`texmf.cnf`は書き換えないこと.
なお,TeX Liveのリリースバージョンに依存せずに必要な環境変数を設定するには,次で返ってくる場所に`texmf.cnf`を置けばよい.
kpsewhich -var-value=TEXMFLOCAL
◆環境変数TEXMFCNFの設定により`texmf.cnf`を任意のディレクトリに配置
ディレクトリ`/usr/local`以下に配置せず,たとえば自分のホームディレクトリの`.texlive2019`以下に配置したいといった場合は,使用しているシェルで次のような環境変数設定を行えばよい.
export TEXMFCNF="$HOME/.texlive2019:$TEXMFCNF"
`kpsewhich -all texmf.cnf`によって,どの`texmf.cnf`が読まれるか確認するとよい.
より上(前)にあるもので後ろの定義が上書きされる.
$HOME/.texlive2019/texmf.cnf
/usr/local/texlive/2019/texmf.cnf
/usr/local/texlive/2019/texmf-dist/web2c/texmf.cnf