我正在\graphicspath
为 GregorioTeX 开发类似的功能,但在使用我们的 Lua 代码时遇到了一些问题\input@path
。基本上,while\input@path
适用于\input
语句,在我们输入文件之前,我们的 Lua 代码首先使用 定位文件,kpse.find_file
以便检查它是否是最新的(如果不是,则从适当的源文件中重新生成它)。问题是kpse.find_file
似乎不知道 的定义\input@path
。
所以我的问题是我需要做什么才能\input@path
将 的定义传递给 Lua,以便它kpse.find_file
会在这些附加路径中搜索它要查找的文件?或者,是否有另一种方法可以在 Lua 代码中定位文件,并且知道\input@path
?
由于这涉及访问多个文件,我发布了我的MWE 为 zip具有适当目录结构的文件。
答案1
\input@path
是一个非常简单的系统,它只是循环遍历列表,直到找到某个内容,所以如果列表是 aa/,bb/,cc/,而你正在寻找 file.foo,那么你需要执行
kpse.find_file ("file.foo") or
kpse.find_file ("aaa/" .. "file.foo") or
kpse.find_file ("bbb/" .. "file.foo") or
kpse.find_file ("ccc/" .. "file.foo")
所以你需要做的就是将\input@path
它拆分成一个 Lua 表,然后遍历这个表,直到找到该文件
所以...如果子目录中zzz
有一个文件,test.foo
我们可以通过以下方式使用 TeX 或 Lua 找到它:
\documentclass{article}
\makeatletter
\def\input@path{{aaa/}{zzz/}}
\def\maketabl#1{\ifx\relax#1\else,"#1"\expandafter\maketabl\fi}
\directlua{
input_path = {""\expandafter\maketabl\input@path\relax}
}
\begin{document}
\IfFileExists{test.foo}{\typeout{FILE is \@filef@und\space (TeX)}}
\directlua{
f="test.foo"
%
for i,k in pairs(input_path) do
fp=kpse.find_file(k .. f)
if (fp) then
print("FILE is " .. fp .. " (Lua)")
break
end
end
}
\end{document}
这使得终端输出
FILE is zzz/test.foo (TeX)
FILE is ./zzz/test.foo (Lua)