我有这个非常短的 TeX 文件
\documentclass[12pt]{report}
\usepackage[a4paper,widh=100mm,top=50mm]{geometry}
\begin{document}
test
\end{document}
widh
其中我犯了一个错误,写成了width
。现在当我通过编译时,pdflatex
我期望得到类似
! Error message: blablabala
l.2 \usepackage[a4paper,widh=100mm,top=50mm]{geometry}
这将帮助我找到源文件中出现错误的行(即第二行)。
但我却收到了这个错误信息
! Package keyval Error: widh undefined.
See the keyval package documentation for explanation.
Type H <return> for immediate help.
...
l.994 \ProcessOptionsKV[p]{Gm}
为什么这样?此外,不仅不显示发生错误的行,甚至还显示不同文件中的不同行,这有什么用呢?
我的看法是,这l.994 \ProcessOptionsKV[p]{Gm}
是使用第 2 行的数据调用的一些代码部分,错误只发生在那时,而且没问题,但为什么消息没有另外说明文件和回溯/追踪到实际线?
更新以澄清问题
我做了一些测试,并将 tex 源代码调整为
\documentclass[12pt]{report}
\usepackage[a4paper,widh=100mm,top=50mm]{geometry}
\errmessage{line three intentionally throws an error}
\begin{document}
\end{document}
故意在第三行抛出一个错误,然后输出显示
/usr/share/texmf-dist/tex/latex/geometry/geometry.sty:994: Package keyval Error
: widh undefined.
See the keyval package documentation for explanation.
Type H <return> for immediate help.
...
l.994 \ProcessOptionsKV[p]{Gm}
%
)
./testerrorlinemadness.tex:3: line three intentionally throws an error.
l.3 ...e{line three intentionally throws an error}
明确指出,当引发第一个错误时,我的源文本文件尚未评估第三行,因此在我看来没有真正的理由**不在发生错误时显示当前行号*。
更新,其他语言如何处理错误消息?
由于评论和答案倾向于认为示例功能不会报告更正确的行号(原始 tex 文件中引发错误的行)是完全自然和可以接受的,我想表明其他语言确实可以追溯到发生错误的点。
为此,我们来看一个简短的例子,看看 JavaScript 如何处理类似的错误报告任务
// EXAMPLE how error message and propagation work in many another
// language (example javascript)
//
// description: what would be MACROS in latex such as /usepackage
// would be named FUNCTIONS in javascript.
// To keep with the example in latex and allow comparison
// we make up a two functions 1: "usepackage" and 2: "geometry"
function usepackage(parameter)
{
geometry(parameter);
}
function geometry(parameter)
{
ProcessOptionsKV=parameter.width.length;
}
// When now calling the usepackage correctly no error occurs
usepackage( {width:"12mm"} )
// But when providing wrong input, there is an error message
usepackage( {widh:"12mm"} )
// this is the error message
/*
Exception: TypeError: parameter.width is undefined
geometry@Scratchpad/1:16:3
usepackage@Scratchpad/1:11:3
@Scratchpad/1:24:1
*/
// reading the message shows backtracingly line by line
// how the error came about. after the Error message it shows that
// the error occured in
// 1. function "geometry" in file "Scratchpad/1" line 16,
// which was called from
// 2. function "usepackage" in file "Scratchpad/1" line 11
// which was provided with the wrong input from
// 3. the file "Scratchpad/1" line 24
//
答案1
如果您想要更具信息量的错误消息,您可以增加\errorcontextlines
\errorcontextlines=200
\documentclass[12pt]{report}
\usepackage[a4paper,widh=100mm,top=50mm]{geometry}
\begin{document}
test
\end{document}
生产
! Package keyval Error: widh undefined.
See the keyval package documentation for explanation.
Type H <return> for immediate help.
...
\GenericError ...
\endgroup
\KV@split ...x \KV@errx {\@tempa \space undefined}
\else \ifx \@empty #3\@emp...
\KV@do ...ax #1\@empty \else \KV@split #1==\relax
\expandafter \KV@do \fi
<argument> a4paper,widh=100mm,
top=50mm
\setkeys ... {KV@#1@}\let \@tempc \relax \KV@do #2
,\relax ,
\@ProcessOptionsKV ...keys {#2}{\@tempa }}\@tempa
\AtEndOfPackage {\let \@un...
l.994 \ProcessOptionsKV[p]{Gm}
%
?
这显示了导致错误的宏扩展级别,默认情况下 LaTeX 会关闭此功能,因为它仅公开对大多数用途来说不那么有趣的各种命令的实现。
TeX 有无记录特定宏的定义位置,只有错误发生时的定义,因此无法说明当前正在处理的参数\ProcessOptionsKV
最初是从该行输入的
\usepackage[a4paper,widh=100mm,top=50mm]{geometry}
答案2
好吧,packagegeometry
调用 packagekeyval
来验证给定的选项。错误消息显示显示错误的包中的行,package keyval
。没关系。
但您收到消息称widh
发现了无效选项。
现在您可以在代码中搜索拼写错误的选项。
如果你仔细查看错误消息,你会发现:
("C:\Program Files\MiKTeX 2.9\tex\latex\geometry\geometry.cfg")
! Package keyval Error: widh undefined.
See the keyval package documentation for explanation.
Type H <return> for immediate help.
...
l.994 \ProcessOptionsKV[p]{Gm}
%
Try typing <return> to proceed.
If that doesn't work, type X <return> to quit.
现在您可以看到包geometry
导致了错误消息(上面错误消息的第一行)。