上下文包的“Lua 根”是什么?

上下文包的“Lua 根”是什么?

作为包作者,我想要编写一个可以被 和 找到的 Lualualatex模块context

原型lualatex运行合理,我相信如果我发布该软件包,这也将是事实。

但是,context原型找不到我的文件,但我可以通过指定合适的LUAINPUTS环境变量(指向可以直接找到我的文件的目录)强制它找到我的文件。

但是,我不明白我的包是否(或如何)能在这个环境变量所在的“野外”环境中工作。不是设置为与我的开发环境一样。

问题本质上是:我应该将文件放在context哪里require

以下是我认为的最小工作示例:

让我们假设我的包位于/tmp/luamodule/texmf/tex/generic/pgfplots/libs/foo/bar/xyz.lua。这类似于我的模糊想法,它将texmf是全局texmf入口点,然后我有我的包(目录tex/generic/pgfplots/libs),然后我有一个类似于我的 Lua 包的子目录结构(foo/bar/xyz.lua)。

包文件xyz.lua包含高级包

io.write("\nFOUND IT!\n")

然后我有一个包含

\documentclass{standalone}

\directlua{require('foo.bar.xyz')}

\begin{document}

OK.
\end{document}

处理这个

export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots//:"
lualatex xyz.tex

有效:我在控制台输出中看到“FOUND IT”。

接下来,我重试相同操作context并写入xyzcontext.tex包含

\directlua{require('foo.bar.xyz')}
\starttext
OK.
\stoptext

翻译

export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots//:"
context xyzcontext

由于找不到 Lua 文件而失败。

但是如果我写的话

export LUAINPUTS="/tmp/luamodule/texmf/tex/generic/pgfplots/libs/:"
context xyzcontext

不同之处在于,我的第一个 LUAINPUTS 路径包含一个递归包含(//),而第二个路径包含精确的根目录。

我已经了解到context与 相比, 做的事情不同lualatex(不使用kpseduringrequire并以不同的方式处理句点)。但这个问题让我们感到疑惑:lualatex似乎可以与递归定义的 lua 文件路径一起使用。从 tex live 附带的 texmf.cnf 配置来看,我希望我的目录命名方案能够正常工作。但是 context 怎么办?如果我不设置这样的根路径,它会找到我的文件吗?似乎这种命名方案可以与 PGF 的图形绘制库一起使用(在 和 中lualatexcontext,但我真的不明白为什么。

我甚至尝试将我的.lua文件复制到 TL 2014 全局texmf树中(然后texhash)——但没有成功。

因此,我的问题是:我应该将.lua文件放在哪里以便lualatexcontext都能找到它们?

有关的: Lua 模块的最佳实践

答案1

为了得到一个可以被赞成的社区维基答案来删除这个问题,并且如果它获得足够的赞成/请求,我可能会重新格式化,以下是评论:

您是否运行了 mtxrun --generate 来重新创建文件名数据库?这应该会使 TEXMF 中的文件可供 Context 的查找例程使用。– Philipp Gesang 2014 年 12 月 25 日 15:53

[… 继续] 此外,上下文代码很少调用 require() 来加载包,通常只用于外部非 TeX 库。相反,在 Lua 端使用 environment.loadluafile() 和在 TeX 端使用 \registerctxluafile 更符合习惯。– Philipp Gesang 2014 年 12 月 25 日 15:53

@phg 我不知道 mtxrun --generate。我现在运行它,没有任何明显的区别(即它仍然找不到文件)。 – Christian Feuersänger 2014 年 12 月 25 日 17:31

@phg 您对 environment.loadluafile 的引用对我来说很新。那是解决方案吗?我还收到了一些上下文人员的意见,即 dofile(resolvers.findfile("foo.bar.whatever.lua")) 是最佳实践的一部分。不可否认,这只会让我更加困惑,不知道如何编写应该在 lualatex 和上下文中使用的 LUA 库。– Christian Feuersänger 2014 年 12 月 25 日 17:34

...也许我的问题的答案可能是某种转换“如果我是 context 否则如果我是 lualatex...” – Christian Feuersänger 2014 年 12 月 25 日 17:35

如果在 --generate 之后找不到该文件,那么它可能位于错误的树中?Garden 中的模块通常位于 texmf-modules 中,您手动安装的内容位于 texmf-local 下。当然,这是假设您使用的是 Minimals。对于文件位置有一些约定。大多数第三方模块的文件都属于 tex/context/third/${MODULE}/ 下,脚本应该从 ./scripts/context/lua/third/${MODULE} 下的 mtxrun 调用,但我认为在进行文件查找时不会强制执行该约定。– Philipp Gesang 2014 年 12 月 27 日 11:36

以下是调试路径查找的建议:首先确定 Context 存储其文件信息的位置。通常,这是根目录 texmf-cache 或 texmf-var 下名为 luatex-cache/context 的目录。然后在 texmf-local/ 下的某个位置创建一个具有唯一名称的虚拟文件。现在运行 mtxrun --generate 并递归地 grep luatex-cache 以查找虚拟文件的名称。如果找到该文件,它将显示在树内容描述中(luatex-cache/context//trees/.lua)。如果没有,则 Context 根本不会遍历该位置。– Philipp Gesang 2014 年 12 月 27 日 11:44

顺便说一句,我的一个软件包可以在 Context、Plain 和 Latex 中使用:bitbucket.org/phg/enigma/src - 我刚刚验证了将文件放在 texmf-local 下的相应树中可以正常工作。 – Philipp Gesang 2014 年 12 月 27 日 11:55

@phg 感谢您的耐心和时间!解决了!我将文件放入 /home/ludewich/tl2014/texmf-dist/tex/generic/pgf/math/foo/ba‌​r,运行 mtxrun --generate,它被正确索引,我的最小运行。我以为我在你的第一条评论之后做了同样的事情,但也许我犯了一些错误?如果你把关于 mtxrun 的提示写成答案,我会很乐意接受它。 – Christian Feuersänger 2014 年 12 月 27 日 14:10

相关内容