在 luatex 参考指南中,status.filename
描述为返回“当前输入文件的名称”。luatex wiki描述如何将其与 一起使用show_error_hook
以生成包含正确文件名的更好的错误消息。但是,我发现 总是status.filename
显示主输入文件的名称。
例如,给定文件main.tex
:
\documentclass{article}
\usepackage{luacode}
% Better error output.
\begin{luacode}
luatexbase.add_to_callback("show_error_hook",
function ()
texio.write_nl("Previous error location: " .. status.filename .. ":" .. status.linenumber)
end,
"Machine-readable error message", 1)
\end{luacode}
\begin{document}
\input{apple.tex}
\end{document}
第二个文件apple.tex
:
\par Misplaced item: \item \par
运行时lualatex main.tex
,我收到以下错误:
! LaTeX Error: Lonely \item--perhaps a missing list environment.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
Previous error location: ./main.tex:1
也就是说,行号对于错误来说是正确的,但是文件名main.tex
却不是apple.tex
,正如我期望的那样。
如何从内部正确获取当前输入文件的名称show_error_hook
?
答案1
这似乎是 luatex 的文件记录和 LaTeX 的输入定义之间的不良交互。它与错误回调无关,status.filename
即使直接调用也会给出错误的文件。
尝试使用 luatex 0.85 的最新测试版本(以及 latex 2016/01/01 的测试版本)我得到的结果与您使用 latex 显示的结果相匹配,但与普通的结果不匹配,如果我使用不带括号的形式,则与 latex 的结果不匹配\input
。
采取main1.tex
和sub1.tex
如下所示,main
可以用普通或乳胶进行处理。
\ifx\documentclass\undefined\else
\documentclass{minimal}\begin{document}\expandafter\def\csname bye\endcsname{\end{document}}
\fi
aaa
\directlua{texio.write_nl('\string\n./main1 line 5: ' .. status.filename .. ' line ' .. status.linenumber .. '\string\n')}
aaa
\input sub1
\input{sub1}
\bye
xxx
\directlua{texio.write_nl('\string\n./sub1 line 2: ' .. status.filename .. ' line ' .. status.linenumber .. '\string\n')}
使用简单的命令我进入了终端:
(./main1.tex
./main1 line 5: ./main1.tex line 5
(./sub1.tex
./sub1 line 2: ./sub1.tex line 2
) (./sub1.tex
./sub1 line 2: ./sub1.tex line 2
status
在每种情况下显示与固定字符串中的预期值匹配的实际打印值。
使用 lualatex 我得到:
./main1 line 5: ./main1.tex line 5
(./sub1.tex
./sub1 line 2: ./sub1.tex line 2
) (./sub1.tex
./sub1 line 2: ./main1.tex line 2
显示在最后一种情况下,使用括号输入形式,状态显示输入文件的行号,但显示顶级文件的文件名。
因此,作为一种解决方法,您可以使用
\input apple.tex
没有括号,但我会看看我们是否可以在 latex (或 luatex,取决于问题所在)中修复它