什么是 kpsetool、kpsexpand 和 kpsepath?

什么是 kpsetool、kpsexpand 和 kpsepath?

当我尝试管理我的 LaTeX 发行版时,我经常会遇到命令kpsetoolkpsexpandkpsepath。它们似乎有类似的用途。它是什么?

答案1

当 TeX 开始在世界各地和操作系统中传播时,就出现了一个必要性,即标准化目录结构,以便 TeX 和 METAFONT 等姊妹程序可以找到它们所需的文件。

例如,字体仅以位图形式提供,并且需要动态生成位图以应对不同的打印机或放大倍数。或者需要重新生成格式,最重要的是,必须找到文件而不必明确调用其路径。当然,原始程序已经具有某种内置的查找文件的功能。

出现的标准是kpathseaKarl 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

实际上,kpsepathkpsexpand是的别名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是一个最终运行 或 的脚本kpsewhichkpsepathkpsewhere是一个最终运行 的脚本kpsewhich。因此kpsewhichkpsepath才是真正的主力。

作为示例,将以前面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 环境相关的问题(例如定位文件、检查搜索路径和扩展变量)非常有用。

相关内容