课程 十五

在环境末尾报告的错误

某些环境(特别是amsmath的对齐环境和tabularx表格)在处理内容之前会扫描整个环境主体。这意味着环境内的任何错误都会在最后一行被报告。然而,如主课程所示,TeX 显示的错误上下文仍然应该能够准确指出错误位置。

% !TEX program=lualatex

\documentclass{ctexart}
\usepackage{amsmath}

\begin{document}

\begin{align}
\alpha &= \frac{1}{2}\\
\beta  &= \frak{2}{3}\\
\gamma &= \frac{3}{4} 
\end{align}

\end{document}

这里的错误将在第12行被报告

l.12 \end{align}

尽管实际错误是在第10行,这可以从上下文行中看出:

! Undefined control sequence.
<argument> ...ha &= \frac {1}{2}\\ \beta &= \frak 
                                                  {2}{3}\\ \gamma &= \frac {...

由早期错误引起的虚假错误

当从命令行交互式调用 LaTeX 时,可以在第一个错误处使用x停止处理,编辑文档并重新运行。但是,如果你滚动过错误提示,或使用自动执行此操作的编辑器或在线系统,TeX 将尝试恢复;然而这可能会导致报告更多的错误。

因此,不要太在意报告的错误 数量,始终专注于修复第一个报告的错误。

% !TEX program=lualatex

\documentclass{ctexart}
\begin{document}
Text_word  $\alpha + \beta$.

More text.
\end{document}

这里的错误是下划线_,它应该输入为\_

TeX 在 第一个 错误消息中正确地报告了这一点

! Missing $ inserted.
<inserted text> 
                $
l.5 Text_
         word  $\alpha + \beta$.
?

然而,如果你滚动过?提示,TeX 会通过添加一个$来恢复,这样_就会在数学模式中被视为下标。数学模式然后会继续到结束数学模式的$,因此后面的\alpha会在文本模式中被看到,从而产生另一个错误

! Missing $ inserted.
<inserted text> 
                $
l.5 Text_word  $\alpha
                       + \beta$.
? 

不触发错误提示的错误

某些错误,特别是直到文件末尾才被检测到的错误,不会生成错误提示,而只是在日志中给出警告。

如果你在 TeXLive.net 服务器上尝试这个示例,它默认会返回一个 PDF;要在日志中查看错误消息,请添加%!TeX log

% !TEX program=lualatex

\documentclass{ctexart}
\begin{document}

 Text {\large some large text) normal size?

\end{document}

在这个例子中,大小变化错误地以 ) 而不是 } 结尾。直到文件末尾,TeX 检测到仍有一个未关闭的组时,才会检测到这种情况。它在这里报告组以 { 开头的行。它无法检测到实际错误,因为 ) 被视为“普通文本”。

(\end occurred inside a group at level 1)

### simple group (level 1) entered at line 5 ({)