阅读错误与调试

编译失败时,LaTeX 会输出一条看起来神秘的 ! … 消息和行号 l.NN,然后停在 ? 提示符。学会读懂它,再配合 .log 和几个调试命令,就能把“坏了”变成“该改这里”。本页介绍如何读错误、查看日志和调试。

如何读错误

错误有固定形态:先是 ! 加消息(例如 ! Undefined control sequence),然后是 l.NN,显示 TeX 卡住的行,并在它已经读到的位置换行。重要l.NN 是 LaTeX 发现问题 的位置,不一定是原因所在;缺少闭合 } 可能在几行之后才暴露,所以如果那一行看起来没问题,也要怀疑 上方。在 ? 提示符下:Return = 尝试继续,h = 帮助,x = 退出,q = 静默跑到最后(收集所有错误),r = 不停顿地运行。(实际中 latexmk 等通常会 nonstop 运行,所以一般事后看 .log。)

  • Undefined control sequence — 拼写错误,或忘了 \usepackage
  • Missing $ inserted — 在数学模式外使用了数学符号。
  • File x.sty not found — 未安装宏包(用 tlmgr 安装)。
  • Runaway argument{ } 不平衡(通常是少了 })。

查看日志 — .log / texfot

.log 文件记录了整次运行:所有错误和 警告(Overfull/Underfull \hbox、未定义引用、字体替换等)。日志信息很多,使用 texfot 可以只保留“值得关注”的行,更容易阅读(见“texdoc / texfot …”)。即使构建“成功”,也要在这里检查警告。

调试命令

\show\foo 会打印 \foo 的含义/定义(并停在 ?);\showthe\textwidth 会打印寄存器或长度的 \typeout{...}(LaTeX)和 \message{...}(TeX)会把 你自己的消息 输出到日志/终端,适合 printf 风格调试。最后的重型工具 \tracingall 会把 TeX 做的一切都写进日志(非常冗长;trace 宏包会整理输出)。它适合用来找展开在哪里出错。

latex
\show\section          % \section の定義を表示 / show its meaning
\showthe\textwidth      % 長さの値を表示 / show a length’s value
\typeout{ここまで来た}    % 自分のメッセージ / your own message
\tracingall             % すべてをログへ(非常に冗長)/ trace everything (very verbose)