为什么调用texdoc
会运行,其中包括luatex
?它有什么用处?
答案1
我将首先解答您的问题中的“如何”和“什么”部分,并将“为什么”部分推迟到这个答案的末尾。
TeXLive 和 MikTeX 都包含该texdoc
实用程序。(我不知道其他 TeX 发行版是否也包含该实用程序。)以下内容适用于基于 MacTeX 的系统;我认为其他 TeXLive 系统的设置非常相似。恐怕我无法提供关于如何texdoc
在基于 MikTeX 的系统中实现的详细信息。
在 MacTeX2014 上,可执行文件texdoc
位于目录中
/usr/local/texlive/2014/bin/x86_64-darwin
在该目录中运行后ls -l texdoc
发现该文件texdoc
是所谓的符号链接:
lrwxr-xr-x [...] texdoc -> ../../texmf-dist/scripts/texdoc/texdoc.tlu
切换到/usr/local/texlive/2014/texmf-dist/scripts/texdoc
并输入ls -l texdoc.tlu
产生
-rwxr-xr-x [...] texdoc.tlu
即,它是一个状态为“全球可执行”(和“全球可读”)的普通文件。
输入cat texdoc.tlu
结果:
#!/usr/bin/env texlua
-- texdoc.tlu: small wrapper around main.tlu
-- (makes it easier to install a new version of texdoc in TEXMFHOME)
kpse.set_program_name(arg[-1], 'texdoc')
require('texdoc.main')
第一行显示texlua
——不是 luatex
-- 通过 启动/usr/bin/env
。尽管texlua
只不过是 的一个符号链接luatex
(两者都位于/usr/local/texlive/2014/bin/x86_64-darwin
),但它们并不相同。手册页说:“如果 [luatex] 被称为 texlua,它将充当 Lua 解释器”。LuaTeX 参考指南第 3.1.1 节指出,“如果可执行文件被命名为 ”,LuaTeX 的行为就像一个独立的 Lua 解释器 [...]。texlua
因此,texlua
只能作为 Lua 解释器运行。
另外:Lua 的众多非常有用的特性之一是它是多平台的,这意味着同一组 Lua 脚本(通常……)会产生相同的结果不管运行平台。虽然不能假设lua
(可执行文件)在任何给定系统上都可用,但当然可以texdoc
假设texlua
在任何具有 的系统上都可用texdoc
。
一旦texlua
启动,就会调用两个 lua 函数:kpse.set_program_name
,这是 luatexkpse
库中提供的(请查看 LuaTeX 参考手册第 4.6.1 节以了解该kpse.set_program_name
函数的作用),以及require
,这是一个内置的 lua 函数。
main.tlu
函数加载的文件require
包含另一个 Lua 脚本(在 MacTeX2014 中,此脚本由 79 行代码组成),该脚本完成大部分“实际工作”。如果texdoc
调用时不带任何参数或 为texdoc -h
,则会生成帮助屏幕。如果texdoc
调用时带有一个或多个“实际”参数,则会启动进一步的 Lua 脚本以调用适当的程序(通常但不一定是 pdf 查看器)来显示参数。例如,如果我输入
texdoc hyperref cleveref
hyperref
和软件包的用户指南cleveref
已在我的 pdf 文件查看程序中启动。
到目前为止,我只检查了什么 texdoc
但我还没有给出理由为什么 texdoc
使用texlua
-- 而不是,例如perl
,这是另一个多平台脚本实用程序。我还没有与该texdoc
实用程序的作者(Manuel Pégourié-Gonnard)核实过,但我强烈怀疑这是因为,如前所述,每个提供该texdoc
实用程序的 TeX 发行版还包含texlua
一个功能齐全的 Lua 解释器。相比之下,期望perl
安装在所有用户的系统上可能不是一个好主意。