多重TEXMFツリー

TeX でファイル検索を行う kpathsea ライブラリは、 複数の TEXMF ツリーからファイルを検索します。 teTeX-3.0 で以下のようなディレクトリツリーが採用されました。

これにより、システムの用意するファイル、個人が後から付け加えたファイル、 その中でも静的に存在するもの、設定ファイルとして変更されたもの、 自動生成されたもの、などと細かく区別できるようになりました。 そのぶんちょっと複雑です。

役割りtetex-3.0*1ptetex3*2Vine 4.0FC5*3
TEXMFCONFIG個人の設定ファイル$HOME/.texmf-config
TEXMFVAR個人の生成されたファイル$HOME/.texmf-var
TEXMFHOME個人のファイル$HOME/texmf(隠しファイルでないことに注意*4
TEXMFSYSCONFIGシステムの設定ファイル@texmf@-config$TEXMFMAIN-config/usr/share/texmf-config
TEXMFSYSVARシステムの生成されたファイル@texmf@-var$TEXMFMAIN-var/usr/share/texmf-var
TEXMFLOCALシステムのファイル@texmf@-local$TEXMFMAIN-local/usr/local/share/texmf
TEXMFMAINシステムのファイル@texmf@/usr/local/teTeX/share/texmf/usr/share/texmf
TEXMFDISTtetex-texmfそのもの@texmf@-dist$TEXMFMAIN-dist/usr/share/texmf-dist
  • 上にあるものほど優先して検索されます。 *5
  • それぞれのディレクトリの下には、同じディレクトリ構造を作る必要があります。 例えば、$TEXMF-var/fonts/map/dvips/updmap/psfonts.map というファイルが あるはずで、$TEXMF-var/psfonts.map というファイルはあっても使ってもらえません。
  • TEXMFMAIN のような変数(?) に何が設定されているか知るには、以下のコマンドを実行します。
    kpsewhich -var-value TEXMFMAIN

ユーザに知っておいてもらいたいこと

ディレクトリがたくさんありますが、$TEXMF の下はほとんど空っぽで、 $TEXMF-dist にたくさんのファイルがあるかもしれません。 $TEXMF-local, $HOME/texmf というディレクトリは存在しないこともあります。 $TEXMF-var や $TEXMF-config の下にあるファイルの数はほんの少しです。

追加マクロの置場

従来は TEXINPUTS で指定することの多かった個人のマクロ類置場ですが、 TEXMF ツリーの一部に置けば、環境変数の指定が不要になります。

追加のマクロやフォントを置くには、 個人所有とするか、システム全体で共有するかで、 置場が二通り考えられます。以下の表のようにします。

$TEXMF 以下は OS 付属のパッケージが使う可能性があるので、 ユーザは手を加えないのがよいでしょう。 $TEXMF-dist 以下も変更しないのがマナーのようです。多重TEXMFツリー#j3aa9dd4

インストール先$HOME/texmf$TEXMF-local など
及ぼす影響の範囲その個人のみシステム全体
root権限不要必要
用いるコマンドupdmapupdmap-sys

これらのディレクトリの下には、$TEXMF(-dist) を参考に、 同じ構造のディレクトリを掘ってファイルを置きます。 TEXINPUT で指定するならディレクトリを掘らなくてもよいのですが、 この方法ではちゃんと整理しなさいということです。 普通のマクロなら $HOME/texmf/(p)tex/(p)latex/ あたりに置けばよいでしょう。

システム全体の置場は、正確には TEXMFLOCAL に設定された場所で、 環境によっては $TEXMF-local とは違うかもしれません。 "kpsewhich -var-value TEXMFLOCAL" を実行して確かめて下さい。

環境を持ち運ぶためにも,$TEXMFHOME ($HOME/texmf) や $TEXMFLOCAL を活用しよう

自分用にマクロをダウンロードし,適切な位置に格納したときには,TEXMF ツリーごと持ち運べば,どこでも同じようにマクロを使えることが期待できます。 $HOME/texmf の中に適切にディレクトリを掘って,インストールし,$HOME/texmf を持ち運べばよいということになります。

異なる OS 間で持ち運ぶことを考えると,マクロの文字コードが JIS (iso-2022-jp) であれば,文字コード変換の手間がありません (→漢字コード)。最近では utf-8 でも大丈夫でしょうか?

ただし、W32TeX と teTeX-3.0 + ptetex3 が まったく同じ TeX 環境を提供しているかというと、そんなことはありません。 LaTeX 部分は前者の方が新しいでしょう。 スライド環境は後者のほうが多く入っていると思います。 $HOME/texmf は最優先で読み込まれるので、 システムのものとの重複には目をつぶって、 マクロを多めにダウンロードしておくことも必要かもしれません。

少し昔を知る人向けの注意

昔は TEXMF を環境変数で指定するのが常套手段でしたが、 多重 TEXMF ツリーを実現するために TEXMF には {/home/hoge/.texmf-config, /home/hoge/.texmf-var, /home/hoge/texmf, /usr/share/texmf-config, /usr/share/texmf-var, /usr/share/texmf-local, /usr/share/texmf, !!/usr/share/texmf-dist} のように設定される必要があります。

ということで、以前のように TEXMF=/usr/local/share/texmf などとしていると、 teTeX-3.0 ではいろいろなファイルを見つけられずに動作不良を起こします。 結局のところ、環境変数 TEXMF には何も指定しないのがよいです。

TEXMF に限らず、環境変数 TEXMFMAIN, TEXMFCNF も設定すべきでなくて、 $TEXMF/web2c/texmf.cnf に書いてあるシステムのディフォルトを そのまま使うので十分です。

二つの TeX システムがある場合の使い分けは、PATH の通し方で対処します (→他のTeX環境との共存)。

PATH の後方にある dvips のようなコマンドを絶対パスで起動しても、 内部で kpsewhich を呼び出すときには、 PATH の先頭に近いものを使ってしまいます。 この場合、TEXMF ツリーの場所も間違えてしまうことになります。 TeX 関連のコマンドは、PATH を通さない限りちゃんとは動かないということです。


TeX メンテナに知っておいてもらいたいこと

詳しい説明は、井上氏による kpathseaライブラリにおけるファイル検索 もどうぞ。

TEXMFDIST

teTeX-3.0 から、$TEXMF-dist というディレクトリを作り、 その中に tetex-texmf-3.0.tar.gz を展開することが推奨されています。 この中のファイルを編集するのは Thomas Esser 氏(teTeXの作者)だけというのがお約束で、 もし改編したいファイルがあれば、 $TEXMF(-local) 以下などにコピーした上で行うのがよいのでしょう。 TeX Q&A 34850 などが参考になります。

ただ、これに従ったパッケージは少数派のようです。 FC5 や Debian では、teTeX-2.0 時代と同様に、 $TEXMF の中に全部のファイルを展開しているようです。 FreeBSD の ports では -dist が存在しますが、 若干のファイルが書き換えられています。

ptetex3 では、単純化のために $TEXMF-dist を用いることを必須としています。 teTeX はリリース後、数年は変化がないので、 $TEXMF-dist を別に分けておくことは、パッケージ配布において、 都合がよいと思います。 また、コンパイル時間の節約 にも利用できます。

$TEXMF-local

ptetex3 では、$TEXMF-dist と $TEXMF のみを用い、 $TEXMF-local にはファイルを作らないようにしています。 ptetex3 を用いてパッケージを作る場合、 独自にカスタマイズをするのに $TEXMF-local を使ってもらって大丈夫です。

$TEXMFLOCAL と $TEXMFMAIN

本来は $TEXMFLOCAL が $TEXMFMAIN よりも優先されるべきだと思うのですが、 tetex-src-3.0.tar.gz ではそうはなっていません。 単なるミスだと思うので、ptetex3 では正しく入れ換えておきました。 FC5 などでも同じことをしているようです。

$TEXMFMAIN とその他のシステムディレクトリ

teTeX-3.0 で @texmf@-var のように定義されているディレクトリは、 FC5 の例を見ていただいてわかるように、 /usr/share/texmf-var と、ベタに展開されてしまいます。 パッケージングの途中でよく行われる、仮想インストールの場合は、 これらの環境変数をすべて書き換える必要があります。 ptetex3 ではこの書き換えの手間を減らすため、 $TEXMFMAIN の変数を利用して定義しています。 このため仮想インストールで変更すべきは $TEXMFMAIN のみでよいわけです。

my_option で TEXMFDIST を指定した場合は、もちろんその指定が優先されます。 仮想インストールで変更する必要もありません。

texconfig / updmap / fmtutil

teTeX-3.0 からは、updmap はユーザ向けのコマンドになり、 システム設定を変更するには updmap-sys を用いることになりました。 "-sys" 付きのコマンドでは、$HOME/texmf 以下のファイルは見ないということです。 TeX パッケージを作るには、こちらのコマンドを使う必要があります。

"-sys" なしのコマンドでは、$HOME/.texmf-(var|config) あたりにファイルを作ります。 個人の設定を分けることができるという点では有益なのですが、 システム設定が変更されたとしても、個人設定があればそちらが優先され、 変更が行き届かないことにもなります。

ptetex3 では、make 時に $HOME/.texmf-var 等の個人設定ファイルがあると 副作用をもたらす可能性があるので、 存在チェックして消してもらうようにしています。 パッケージを作るスクリプトでは $HOME を unset するとより安全でしょう。


*1 tetex-src-3.0/texk/kpathsea/texmf.in-teTeX
*2 ptetex3-20061111 の /usr/local/teTeX/share/texmf/web2c/texmf.cnf
*3 tetex-3.0-17の/usr/share/texmf/web2c/texmf.cnf
*4 ~/.texmf というものを時々目にするのですが、teTeX-3.0 でも 2.0 でも使った形跡がありません。どこで使われてたのかまったく不明です。
*5 ところが、何と teTeX-3.0 のディフォルトとは一ヶ所異なります。$TEXMFLOCAL と $TEXMFMAIN

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-12-26 (火) 15:38:27 (3927d)