从“show_error_hook”中获取当前输入的文件名

从“show_error_hook”中获取当前输入的文件名

在 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.texsub1.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,取决于问题所在)中修复它

相关内容