![什么是 kpsetool、kpsexpand 和 kpsepath?](https://linux22.com/image/470208/%E4%BB%80%E4%B9%88%E6%98%AF%20kpsetool%E3%80%81kpsexpand%20%E5%92%8C%20kpsepath%EF%BC%9F.png)
当我尝试管理我的 LaTeX 发行版时,我经常会遇到命令kpsetool
、kpsexpand
和kpsepath
。它们似乎有类似的用途。它是什么?
答案1
当 TeX 开始在世界各地和操作系统中传播时,就出现了一个必要性,即标准化目录结构,以便 TeX 和 METAFONT 等姊妹程序可以找到它们所需的文件。
例如,字体仅以位图形式提供,并且需要动态生成位图以应对不同的打印机或放大倍数。或者需要重新生成格式,最重要的是,必须找到文件而不必明确调用其路径。当然,原始程序已经具有某种内置的查找文件的功能。
出现的标准是kpathsea
Karl Berry(我们对他的这份礼物感激不尽)编写的库(Karl 路径搜索),作为 Web2C 计划的一部分:首先以原始 Pascal 语言提取 TeX 和朋友的 Web 源代码,然后翻译成 C 并进行编译;在此编译过程中,这些程序可以链接到诸如 之类的库kpathsea
。
此库使用一些配置文件来设置(伪)环境变量,这些变量用于大量任务。为什么是“伪”?因为这些变量仅在kpathsea
启动链接的程序时才添加到环境中。
最重要的是SELFAUTOLOC
:如果我tex
从命令行(或通过前端)启动,此变量将自动设置为包含可执行文件的目录;这允许设置其他SELF...
变量,这些变量反过来加载设置其他变量的配置文件,并使程序执行的 shell 知道它们。最重要的变量也许是TEXINPUTS
。
举个例子,我的机器上保存着从 2012 年到现在的 2023 年的 TeX Live 发行版。如果我想测试一个文件来查看问题何时开始出现,我可以从 shell 启动,比如,
/usr/local/texlive/2022/bin/universal-darwin/pdflatex
甚至
/usr/local/texlive/2012/bin/x86_64-darwin/pdflatex
并且会自动分别从 2022 或 2012 加载包等。
有许多用于询问的工具kpathsea
:
kpseaccess kpsereadlink kpsetool kpsewhich
kpsepath kpsestat kpsewhere kpsexpand
实际上,kpsepath
和kpsexpand
是的别名kpsetool
,但是所有与 链接的程序kpathsea
都能够根据其名称采取不同的操作。
例如,pdflatex
只是可执行文件的符号链接pdftex
,但调用它pdflatex
允许kpathsea
根据需要设置变量pdflatex
:LaTeX 和纯 TeX 的路径优先级不同。实际上,在主配置文件中,您可以阅读
TEXINPUTS.pdflatex = $TEXMFDOTDIR;$TEXMF/tex/{latex,generic,}//
TEXINPUTS.xelatex = $TEXMFDOTDIR;$TEXMF/tex/{xelatex,latex,xetex,generic,}//
实际上kpsetool
是一个最终运行 或 的脚本kpsewhich
,kpsepath
而kpsewhere
是一个最终运行 的脚本kpsewhich
。因此kpsewhich
和kpsepath
才是真正的主力。
作为示例,将以前面kpsexpand
带有转义的伪变量名称作为参数:$
> kpsexpand \$SELFAUTOLOC
/usr/local/texlive/2023/bin/universal-darwin
但直接用kpsewhich
一个可以做得更好
> kpsewhich -var-value SELFAUTOLOC
/usr/local/texlive/2023/bin/universal-darwin
而不需要转义$
(这个特性在处理 Windows 时非常有用,它使用不同的方式来扩展变量)。
只是为了展示调用不同的可执行文件时会发生什么
> /usr/local/texlive/2012/bin/x86_64-darwin/kpsewhich -var-value TEXMFROOT
/usr/local/texlive/2012```
If you want to find where the system thinks a file resides in, you can use `kpsewhich`:
```bash
> kpsewhich story.tex
/usr/local/texlive/2023/texmf-dist/tex/plain/knuth-lib/story.tex
另一个例子:
> kpsereadlink $(type -p pdflatex)
pdftex
你应该能够在你的系统上找到手册页,但你也可以这样做
> texdoc kpsexpand
您将获得相关手册页的 PDF 版本。
祝您阅读愉快!
答案2
在深入研究了这个主题之后,我大概知道了它们是什么。我提到的命令 — kpsetool、kpsexpand 和 kpsepath — 是 Kpathsea 库的一部分,TeX 发行版使用它来在 TeX 系统中定位文件。
kpsetool:
- 此命令用于管理Kpathsea工具。
- 示例:
kpsetool --help
将显示可用的选项。
kps扩展:
- 该命令用于扩展文件和目录名中的变量。
- 例如,您可以使用
kpsexpand \$TEXMFHOME
将变量扩展$TEXMFHOME
为其实际值。
kpsepath:
- 此命令用于显示 TeX 搜索路径的元素。
- 例如,
kpsepath tex
将显示 TeX 路径中查找.tex
文件的目录。
这些命令是 Kpathsea 库的一部分,该库负责 TeX 发行版中的文件搜索和路径管理。它们对于理解和排除与 TeX 环境相关的问题(例如定位文件、检查搜索路径和扩展变量)非常有用。