マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

「LaTeX でサブディレクトリがナントカカントカ」に関する何か

コレについての詳細の話。

環境変数に「.//;」を設定するとカレント以下が再帰的に検索されるようになるのは何故かを説明しておく。

「.//;」てなに

TEXINPUTS のような検索パスを示す変数は、複数のパス指定を「;」区切りで並べたリストになっている。例えば TeX Live では texmf.cnf ファイルにおいて次のように設定されている。

TEXINPUTS = .;$TEXMF/tex/{$progname,generic,}//

だから「.//;」は「.//」というパス指定の後に「;」を置いた形である。そして、パス指定において「//」は「その位置以下を再帰的に検索せよ」という意味になる。従って、「.//」は「カレント以下を再帰検索」の意味であることがわかる。((先に示した「普通の TEXINPUTS」の値も最後が「//」になっている。パッケージのファイルを TEXMF ツリーにインストールする際に「$TEXMF/tex/ 以下の任意の場所」のように指示されるのは、再帰的検索が行われるからである。))

それでは最後の「;」は単に余分で「.//」でも構わないのか、というとそうではない。仮にこのように指定すると、確かに「カレント以下を再帰検索」が行われるが、それしか検索されなくなる。つまり、TEXMF ツリーに置かれている article.cls とかが一切見つからなくなってしまうのである。TEXINPUTS の設定は texmf.cnf に書かれた値よりも環境変数の値の方が優先され、そこに「.//」しか書かれていないのでこの動作は当然である。

ところが、“余分”の「;」がある場合は、「その位置*1に“下位の”設定値を挿入せよ」という意味になる。つまり、環境変数で設定した TEXINPUTS の値が「.//;」である場合、末尾に「texmf.cnf での設定値」が挿入されるので、実効的な((余分「;」の処理は実際のパス検索でのリスト解釈の時点で行われるようで、単純に変数の値を参照した場合は未挿入の値になる。つまり「kpsewhich -var-value=TEXINPUTS」は「.//;」を返す。)) TEXINPUTS の値は次のようになる。

.//;.;$TEXMF/tex/{$progname,generic,}//

従って、「カレント以下の再帰検索」も行われるし、TEXMF ツリーの検索も無事行われることになる。*2

余分「;」の別の例

余分「;」で下位の設定値を入れる、という手法は別の問題の解決でも利用されている。

ここでは変数 TEXMFCNF について、環境変数で余分「;」を入れた値を設定することで、リストの要素を“追加”している。

*  *  *

という話を、早くアレwiki に書かないといけないですね……。

*1:つまり、末尾が「;」の場合は末尾、先頭が「;」の場合は先頭、そして 2 個並んだ「;」がある場合はその間。

*2:この場合、2 番目のパス指定の「.」は重複していて無意味になっている。