TeX 发展了若干年,各种字体,宏包的数目已经非常地多了,比如你看现在的 CTeX 完整版安装完后就已经超过 1GB 大小了,而 TeXLive 光盘已经要使用 DVD 了。这么多的文件,各个 tex 编译程序如何找到它们就成了个大问题,总不能一个目录一个目录地搜索吧。 TeX 用户组织(TUG)发明了 Web2C/Kpathsea 系统,用于自个发布的 TeXLive 发行版。这个系统基本思路是:所有 tex 相关文件按照 TeX 目录结构标准(TDS)放在若干个 TEXMF 目录里面,然后所有 tex 程序比如 tex.exe,pdftex.exe,xetex.exe 在编译的时候如果需要寻找任何文件,都通过 kpathsea.dll 运行库查询文件所在的位置。当然,你也可以自己运行 kpsewhich.exe 程序手动查询某个文件所在的位置。 kpathsea 当然不会傻到一个目录目录的去查找文件,它是根据 tds 目录结构,按照文件的扩展名去相应的目录查找。比如你需要寻找 article.cls 文件,运行下列命令kpsewhich article.cls 时,kpathsea 发现这个文件是 latex 的文档类文件,所以只去各个 TEXMF 目录的 tex\latex 子目录里查找这个文件。然后返回文件所在的位置。 我们之前说 TEXMF 目录有不止一个,比如你打开 TeXLive 的安装目录,可以看到 texmf,texmf-dist,texmf-var 等等子目录,这些都是 TEXMF 目录。所以现在还得明白的是,kpathsea 怎么才能知道 TEXMF 目录都有哪些,分别在什么位置呢?实际上 kpathsea 运行的时候,首先要去寻找一个叫做 texmf.cnf 的文件,这个文件记录了各个 TEXMF 所在的位置。 那么,kpathsea 又要去哪些地方寻找 texmf.cnf 文件呢?在 kpathsea 中,以 $SELFAUTOLOC、$SELFAUTODIR 和 $SELFAUTOPARENT 变量分别表示 kpathsea 所在目录、kpathsea 所在目录的上一级目录和 kpathsea 所在目录的上两级目录。默认情况下, kpathsea 按照如下顺序查找 texmf.cnf 文件:
{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c}这种写法是 kpathsea 的简写,需要解释一下:花括号里面用逗号隔开的几个路径段表示要挨个试,括号与括号或者路径段放在一起表示两者连接起来组成新的路径;而特殊的是,括号内的最前或最后可能有一个逗号,这表示最前面或最后面有一个空路径段。这种简写法多半很雷人,那么我们把这个表示法的完整展开式按顺序写一下吧:
$SELFAUTOLOC; $SELFAUTODIR; $SELFAUTOPARENT; $SELFAUTOLOC/share/texmf-local/web2c; $SELFAUTODIR/share/texmf-local/web2c; $SELFAUTOPARENT/share/texmf-local/web2c; $SELFAUTOLOC/texmf-local/web2c; $SELFAUTODIR/texmf-local/web2c; $SELFAUTOPARENT/texmf-local/web2c; $SELFAUTOLOC/share/texmf/web2c; $SELFAUTODIR/share/texmf/web2c; $SELFAUTOPARENT/share/texmf/web2c; $SELFAUTOLOC/texmf/web2c; $SELFAUTODIR/texmf/web2c; $SELFAUTOPARENT/texmf/web2c;找到了 texmf.cnf 一切就都顺利了。最后,这些 TEXMF 所在的位置也可以通过环境变量设置,而且这样设置的优先级最高。 还有,CTeX 以及它所包含 MiKTeX 不使用 web2c/kpathsea 系统,TeXLive 和 W32TeX 使用。 选自:http://hi.baidu.com/manbuzhe2009/item/3e8ce75fcb8fe8404eff203d
发表评论 取消回复