将 lua 代码移至子目录

将 lua 代码移至子目录

我想将所有.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

相关内容