未定义的控制序列
未知的命令名称:拼写错误、缺少软件包、错误的引擎。
未定义的控制序列
症状
编译以`!未定义的控制序列。然后,日志显示发生该情况的行,分为两部分:TeX 已读取的所有内容(包括一行上的有问题的命令)以及其下方源代码行的其余部分。上面一行的最后一个标记是 TeX 无法识别的命令,这使得这是更容易精确定位的错误之一。
为什么会发生
控制序列是以反斜杠开头的任何内容。 TeX 没有固定的词汇表:命令的存在只是因为内核、文档类、包或您自己的 \newcommand 定义了它们。当 TeX 读取反斜杠后跟一个未定义的名称时,它无法猜测您的意思并停止。一般来说,错误绝不是命令“错误”。目前,在该引擎下,该名称在本文档中是未知的。
通过三项检查修复它
首先检查拼写。在大多数情况下,用“\texbf”代替“\textbf”,用“\lable”代替“\label”,或者用杂散空格将名称分成两个帐户。日志的行号可以直接引导您找到拼写错误。
如果拼写正确,则定义包可能丢失。如果没有“\usepackage{graphicx}”,“\includegraphics”什么也不做,“\toprule”需要“booktabs”,“\SI”需要“siunitx”。当您从另一个文档或模型的答案中复制片段时,这种情况最为严重:正文出现了,而序言行却没有。在每个命令解释 中找到哪个包定义了命令,添加 \usepackage 行,然后重新编译。如果软件包本身未安装,请参阅安装缺少的软件包。
如果加载包后错误仍然存在,请怀疑引擎。有些命令仅存在于特定引擎下:\fontspec 及其相关命令需要 XeLaTeX 或 LuaLaTeX,并且将在 pdfLaTeX 下死亡并出现此错误。在其文档中指定引擎的模板通常出于这个原因这样做。 此项目使用哪个引擎 解释了差异。
两个值得了解的怪癖
顺序很重要:在定义它的 \usepackage 行之前使用的命令此时仍然未定义,因此将包加载保留在序言中,位于 \begin{document} 上方。并且一个错误常常隐藏着另一个错误,因为 TeX 恢复后它可能会误读接下来的所有内容。修复日志中第一个未定义的控制序列,重新编译,然后查看剩下的内容。