![我应该将自己的 .sty 或 .cls 文件放在哪里,以使它们可供我的所有 .tex 文件使用? - 授权(kpathsea 基础知识)](https://linux22.com/image/360670/%E6%88%91%E5%BA%94%E8%AF%A5%E5%B0%86%E8%87%AA%E5%B7%B1%E7%9A%84%20.sty%20%E6%88%96%20.cls%20%E6%96%87%E4%BB%B6%E6%94%BE%E5%9C%A8%E5%93%AA%E9%87%8C%EF%BC%8C%E4%BB%A5%E4%BD%BF%E5%AE%83%E4%BB%AC%E5%8F%AF%E4%BE%9B%E6%88%91%E7%9A%84%E6%89%80%E6%9C%89%20.tex%20%E6%96%87%E4%BB%B6%E4%BD%BF%E7%94%A8%EF%BC%9F%20-%20%E6%8E%88%E6%9D%83%EF%BC%88kpathsea%20%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%EF%BC%89.png)
为了获得非 TeXlive .sty 文件,我遵循了该问题的建议:我应该将自己的 .sty 或 .cls 文件放在哪里,以使它们可供我的所有 .tex 文件使用?。
我按照指示去做了,但是 kpsewhich 找不到我的 CmathLuaTex.sty 文件,TeXmaker 和 TeXworks 也找不到。
那么错误在哪里?
答案1
在提出一个程序之前(更适合新手),让我们列出许多失败的方式(更适合知情人士):
- 愚蠢但仍然耗时,拼写错误:使用名为 example.sty 的文件进行测试而不是 CMathLuaTeX.sty,或者可能是 CmathLuaTeX.sty 或者可能是 CmathLuaTex.sty ...
- $TEXMFHOME 不在 $TEXMF 或 $TEXMFDBS 目录列表中(使用
kpsewhich -var-value=TEXMF
或检查kpsewhich -var-value=TEXMFDBS
) - $TEXMF 中的 !!$TEXMFHOME 错误,而不是 $TEXMFHOME
- 在默认 texmf.cnf 配置文件中所做的修改,被更新清除
- .sty 文件位置错误(不在 $TEXMFHOME/tex 层次结构中)
- 直接在磁盘上进行搜索时,$TEXMFHOME 目录中存在 ls-R 文件,会阻止在磁盘上进行搜索(kpathsea 手册中描述,有时会遇到)
- 使用指向 .sty 文件实际目录的符号链接直接在磁盘上使用搜索时:不考虑没有子目录的目录中的符号链接
- 使用带有索引 ls-R 文件的搜索时:ls-R 文件缺失、过时、放错位置(不在 $TEXMFHOME 目录中)
- 自定义 texmf.cnf 文件来覆盖错误目录中的默认 texmf.cnf 文件(例如在默认 texmf.cnf 文件的注释中推荐的位置!)
我至少遇到了三个这样的错误……
以下是可以避免所有这些陷阱的程序:
- 输入
kpsewhich -var-value=$TEXMFHOME
以了解 texmf 用户树应该去往何处(例如:/home/ad/texmf) - 创建(如果不存在)$TEXMFHOME 目录下名为“tex”的子目录(例如 /home/ad/texmf/tex)以及类似 /home/ad/texmf/tex/latex 或 /home/ad/texmf/tex/mystuff 的子目录
- 在 $TEXMFHOME/tex 层次结构中包含您的 .sty 或 .cls 文件,或包含它们的层次结构的符号链接。
我们现在需要通知 kpathsea 在 $TEXMFHOME 中搜索: kpsewhich -var-value=TEXMFCNF
将给出 kpathsea 查找配置 texmf.cnf 文件的目录列表。顺序是有意义的:首先检查最左边的目录,如果变量已经定义,则覆盖后续文件。列表的最后一个目录中是默认的 texmf.cnf 文件。在倒数第二个目录之前的某个目录中(通常是倒数第二个目录),如果不存在 texmf.cnf 文件,则创建一个新的。您可能需要管理员权限,具体取决于目录的位置。我们将使用此文件来修改 $TEXMF 或 $TEXMFDBS 变量的定义,具体取决于我们想要的 kpathsea 搜索类型:a) 直接在磁盘上或 b) 基于 ls-R 索引文件。为避免拼写错误,最好从默认 texmf.cnf 文件(在前一个目录列表的最后一个目录中)复制 $TEXMF 或 $TEXMFDBS 变量的默认值。- a) 在磁盘上搜索:在新的 texmf.cnf 中,将“$TEXMFHOME”添加到默认 texmf.cnf 文件中变量 $TEXMF 的列表中;例如:
TEXMF = {$TEXMFCONFIG,$TEXMFVAR,$TEXMFSYSCONFIG,!!$TEXMFSYSVAR,!!$TEXMFLOCAL,!!$TEXMFDEBIAN,!!$TEXMFDIST,$TEXMFHOME}
。这是最简单的方法,但不是最有效的。b) 根据 ls-R 索引文件搜索:在新的 texmf.cnf 中,将“$TEXMFHOME”添加到默认 texmf.cnf 文件中变量 $TEXMF 的列表中;例如:TEXMFDBS = {!!$TEXMFSYSVAR,!!$TEXMFLOCAL,!!$TEXMFDEBIAN,!!$TEXMFDIST,!!$TEXMFHOME}
;使用以下命令创建/更新 ls-R 文件,texhash $TEXMFHOME
例如texhash /home/ad/texmf
如果 $TEXMFHOME 是“/home/ad/texmf”;如果您使用了符号链接,请检查它是否位于包含子目录的 $TEXMFHOME/tex 子目录中,否则创建一个虚拟的。 - 检查一切是否正常:
kpsewhich example.sty
应该会给出文件路径。如果成功,您首选的 tex 编辑器/源应该会找到您的自定义 .sty/.cls 文件。
资料来源:kpathsea 库手册kpsewhich -var-value=TEXMFCNF
,默认的 texmf.cnf 文件中的注释位于使用,版本 kpathsea 6.2.1获取的列表的最后一个目录中。