作为包作者,我想要编写一个可以被 和 找到的 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
(不使用kpse
duringrequire
并以不同的方式处理句点)。但这个问题让我们感到疑惑:lualatex
似乎可以与递归定义的 lua 文件路径一起使用。从 tex live 附带的 texmf.cnf 配置来看,我希望我的目录命名方案能够正常工作。但是 context 怎么办?如果我不设置这样的根路径,它会找到我的文件吗?似乎这种命名方案可以与 PGF 的图形绘制库一起使用(在 和 中lualatex
)context
,但我真的不明白为什么。
我甚至尝试将我的.lua
文件复制到 TL 2014 全局texmf
树中(然后texhash
)——但没有成功。
因此,我的问题是:我应该将.lua
文件放在哪里以便lualatex
和context
都能找到它们?
有关的: 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/bar,运行 mtxrun --generate,它被正确索引,我的最小运行。我以为我在你的第一条评论之后做了同样的事情,但也许我犯了一些错误?如果你把关于 mtxrun 的提示写成答案,我会很乐意接受它。 – Christian Feuersänger 2014 年 12 月 27 日 14:10