赞
踩
可能不少用户觉得 LaTeX 的报错很迷。这一点在我水的上一篇帖子中讨论过一些原因。很迷的报错多数是底层的排版引擎,也就是 TeX 程序给出的,报错时通常接触到了非常底层的命令,而 TeX 又没有“函数调用栈”的说法,因此错误信息让人一头雾水。这类报错的错误信息是直接写进 TeX 源码的,如最常见的 ! Undefined control sequence.
。
另一方面,TeX 的 errmessage
命令提供了类似其它语言中抛出异常的机制。LaTeX 内核将此命令封装成 GenericError
命令,并进一步封装成供内核使用的 @latex@error
内部命令以及供宏包和文档类作者使用的 PackageError
和 ClassError
命令。这些命令的特殊性体现在错误信息上,比如内核定义的各种报错信息以 LaTeX error:
开头。
其它语言通常在抛出错误或异常之后直接中断编译/解释而退出,但TeX的nonstopmode/batchmode等模式会选择忽视错误一直编译下去(这也是不少LaTeX IDE默认给编译程序加上的命令行选项),于是一步错步步错,后面一连串错误就完全看不懂了。然则,一般而言第一条错误信息是最重要的。
本文汇总了内核中由 @latex@error
定义的错误信息,顺序大致按照内核源码 latex.ltx
中出现的先后顺序。
1) Command foo undefined.
使用 renewcommand
宏重定义一个未定义的控制序列。
2) Environment bar undefined.
使用 renewenvironment
宏重定义一个未定义的环境,或用 begin
命令开启一个未定义的环境。
3) The control sequence 'foo' is undefined! There is nothing here to make robust.
使用 MakeRobust
宏处理一个未定义的控制序列。MakeRobust
是较新版本内核添加的一个宏,用于加强原有命令为“健壮命令”。健壮命令相关的内容可以单开一个帖子写了,此处按下不表。
4) Command foo already defined. Or name end... illegal, see p.192 of the manual.
使用 newcommand
宏定义一个已经定义过的命令,或者使用 newcommand
宏定义头三个字母为 end
的命令(后者主要考虑不与环境的定义冲突,因为在定义环境 foo
时总会定义一对命令 foo
和endfoo
)。如果用户没有亲自用 newcommand
宏定义过命令,则一般归因于宏包之间的冲突。
5) There's no line here to end.
在垂直模式下(可通俗地理解为段落之间)使用了 或
newline
等换行命令。换言之,需要先用一些文字或命令开启一个新的段落,而后才能换行。
6) No counter 'foo' defined.
以未定义的计数器作为某些命令的参数(如 setcounter
、stepcounter
等宏的参数, newtheorem
的可选参数等)。
7) Counter too large.<
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。