更新以澄清问题

更新以澄清问题

我有这个非常短的 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导致了错误消息(上面错误消息的第一行)。

相关内容