包内的错误行

包内的错误行

我已经创建了自己的包,但是,当我在新文档中使用它时,pdflatex 使用自定义命令(在我自己的包中定义)发现错误,它只显示使用此命令的错误行(相对于主文件),而不是包本身内部的错误行(相对于包文件)。

有人知道我怎样才能强制 pdflatex 显示包文件内的错误行(即强制在包含文件或包内导航)?

答案1

我认为这是 TeX 是一种通过扩展工作的宏语言的自然结果。因此,您在包中所做的定义将不是执行的代码,而主要是扩展到其他代码(可能来自其他包)的代码,因此您所说的“不是包本身内部的错误行(相对于包文件)”的意思根本不清楚。

为了给你一个(完全无意义的)例子,请考虑以下代码:

% this here could be in package A that you loaded or in the kernel
\def\foo !#1!{*#1*}
\def\bar{\foo !test!}

% this here would be in your package
\def\gobbleabit#1#2{#1}
\def\baz { \expandafter \gobbleabit \bar }

% this would be in your document:
\baz

现在如果你通过 TeX (或 LaTeX) 运行它,那么你将得到

! Use of \foo doesn't match its definition.
\bar ->\foo !t
              est!
l.11 \baz

错误在哪里?是在定义\foo和的包“A”中,还是在您的包中,它以一种吞噬掉执行所需的“!”的方式定义?我想说错误在您的包中。\bar\baz\foo

然而,如果我们稍微改变一下这个例子,

% this here would be in package A
\def\foo !#1!{*#1*}
\def\bar{\foo test!}

% this here would be in your package

\def\baz { \bar ... }

% this would be in your document:
\baz

我们将得到几乎相同的错误信息:

! Use of \foo doesn't match its definition.
\bar ->\foo t
             est!
l.11 \baz

但这次错误出在包 A 中,对 的定义有误\bar。归根结底,在此类语言中,您能做的最好的事情就是提供堆栈跟踪,而这正是 TeX 所做的。

如果您想要查看所有正在进行的扩展的完整堆栈跟踪,请设置\errorcontextlines=\maxdimen,然后您还将看到堆栈的所有中间部分(以及 TeX 在每个扩展级别中读取的程度),在这种情况下还有一个:

! Use of \foo doesn't match its definition.
\bar ->\foo t
             est!
\baz -> \bar 
             ... 
l.11 \baz

相关内容