我想将所有.lua
文件移到子目录中,code
以避免污染主目录。但是,我无法让 lualatex 在那里找到它们。
鉴于此项目布局:
main.tex
main.lua
code/
test.lua
test2.lua
主文本
\documentclass{article}
\directlua{package.path = './code/?.lua;' .. package.path}
\directlua{print(package.path)}
\directlua{require('test')}
\directlua{require('code/test')}
\begin{document}
\end{document}
主lua
package.path = './code/?.lua;' .. package.path
print(package.path)
require('test')
require('code/test')
代码/测试.lua
require('test2')
代码/test2.lua
print('success')
当我运行时,lualatex main.tex
我得到输出:
This is LuaTeX, Version beta-0.79.1 (TeX Live 2014/Arch Linux) (rev 4971)
restricted \write18 enabled.
(./main.tex
LaTeX2e <2014/05/01>
Babel <3.9k> and hyphenation patterns for 79 languages loaded.
(/usr/share/texmf-dist/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/share/texmf-dist/tex/latex/base/size10.clo))./code/?.lua;/usr/local/share/lua/5.2/?.lua;/usr/local/share/lua/5.2/?/init.lua;/usr/local/lib/lua/5.2/?.lua;/usr/local/lib/lua/5.2/?/init.lua;./?.lua
! LuaTeX error [\directlua]:1: module 'test' not found:
no field package.preload['test']
[kpse lua searcher] file not found: 'test'
[kpse C searcher] file not found: 'test'
stack traceback:
[C]: in function 'require'
[\directlua]:1: in main chunk.
l.5 \directlua{require('test')}
? q
OK, entering \batchmode
问题似乎是,尽管我改变了package.path
(并且打印正确!),但 lualatex 仍找不到子目录中的文件。
lua main.lua
当我通过输出运行相同的代码时
./code/?.lua;/usr/share/lua/5.2/?.lua;/usr/share/lua/5.2/?/init.lua;/usr/lib/lua/5.2/?.lua;/usr/lib/lua/5.2/?/init.lua;./?.lua
success
正如预期的那样。
由于某种原因lualatex
似乎没有考虑到package.path
。
使用require('code/test.lua')
不是一个选项,因为test.lua
和之间的依赖关系test2.lua
没有被正确拾取。
我需要做什么才能让 lualatex.lua
在目录中找到我的文件code
?
我已经关注这个问题到这个答案但我不知道这如何解决问题(或者它是否表明我们无法更改 lualatex 中的包搜索路径?)。此外,情况似乎是另一种情况,因为我不想“安装系统范围的”模块,而只想安装此项目的一些脚本。
答案1
我发现在 lualatex 中导入相关包的最快方法是
require(package.searchpath('test', './?.lua:./code/?.lua'))
它会通过搜索 ./ 和 ./code 来找到 test.lua。这很 hack,但也很清晰、快捷。
添加路径加载器,如下所示https://tex.stackexchange.com/a/219228/2891是更彻底的解决方案,但是该代码对我来说并没有立即起作用,而且它需要弄清楚 textmf lua 路径。
答案2
local oldreq = require
require = function(p)
return oldreq(package.searchpath(p, './?.lua;./code/?.lua'))
end