如何让“kpse.find_file”知道“\input@path”的修改?

如何让“kpse.find_file”知道“\input@path”的修改?

我正在\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)

相关内容