![如何快速排除因缺少右括号而导致的错误?](https://linux22.com/image/249093/%E5%A6%82%E4%BD%95%E5%BF%AB%E9%80%9F%E6%8E%92%E9%99%A4%E5%9B%A0%E7%BC%BA%E5%B0%91%E5%8F%B3%E6%8B%AC%E5%8F%B7%E8%80%8C%E5%AF%BC%E8%87%B4%E7%9A%84%E9%94%99%E8%AF%AF%EF%BC%9F.png)
我最常犯的错误可能是忘记放置结束括号,即}
,或结束命令,例如\end{description}
。在编译时,此类错误通常不会说“\begin{description}
缺少结束命令。”,而是说“\end{document}
意外出现”。
- 在大型的复杂文档中,找到此类错误的来源可能很困难。
- 当错误出现在
\input
文件内部时,通常更难找到。 - 当某些宏需要额外的括号时,这些会变得更加困难,例如
\begin{tabular}{lll}
。
是否有任何技巧或策略可以用于快速找到文档中缺少结束项目的项目?
答案1
如果你正在使用 e-TeX(你可能正在使用),你可以让 TeX 在日志文件中记录分组级别和奇异性,方法是:
\tracinggroups=1
\tracingnesting=2
如果错误是由于分组问题引起的,这可能有助于找到错误的原因。
在您自己的代码中,最好在组级别开始时给出一条简短的日志消息,以便您可以立即在日志中识别哪些组在哪里启动和关闭。
此外,您可以随时在代码中显示当前组嵌套
\showgroups
答案2
我建议您使用该syntonly
包。它必须在文档标题中声明,
\usepackage{syntonly}
然后你接着写
\syntaxonly
它所做的只是检查语法而不编译文档。它无法进一步帮助您发现错误,但至少可以避免编译文档失败。语法正确后,只需对其进行注释即可。
%\syntaxonly
答案3
这并不好,但对于我调试这些类型的乳胶错误来说,如果你有一个很大的文档,而你真的不知道错误的括号结构可能在哪里,那么使用旧的“二进制搜索”效果最好。
只需注释掉文档的一半,进行编译,如果有效,则继续执行注释的部分,否则继续执行未注释的部分。
(如果您\input
提交了文件,请按照嵌套代码进行操作。)
说真的,这很愚蠢,但大多数情况下,这样做是最快的,尽管理论上存在通过评论产生新错误的情况。通常很容易看出如何评论,这样就不会发生这种情况。
当然,最好与 gcedo 的答案结合起来。
答案4
这仅涉及内联方程中不匹配的括号,但可能仍然有用。
在花了很长时间寻找内联方程式中的错误之后,我制作了以下 Python 脚本,该脚本可让您粘贴可疑文本,并扫描每个方程式以查找不平衡的括号和其他隐蔽的语法错误:
import re
def find_invalid_equations_in_tex(tex):
lines = [line for line in tex.split('\n') if len(line.strip(' '))>0]
for line in lines:
print('Running Line starting with: "{}..."'.format(line[:16]))
result = re.findall(pattern='\$.*?\$', string=tex)
for eqn in result:
n_opens = len(re.findall('\{', eqn))
n_closes = len(re.findall('\}', eqn))
prefix = 'Error on Line starting with: "{}..."\n '.format(line[:16])
assert n_opens==n_closes, prefix+"Equation\n {}\n.. has {} {{'s than }}'s".format(eqn, 'more' if n_opens>n_closes else 'fewer')
double_prefixes = re.findall(pattern='\\\\[a-zA-Z]+\s*\\\\[a-zA-Z]+\{.*\}', string=eqn)
assert len(double_prefixes) == 0, prefix+"Detected invalid 'double-prefix' syntax. Change from: '\\aaa\\bbb{{ccc}}' to '\\aaa{{\\bbb{{ccc}}}}':\n Equation: {}".format('\n '.join(double_prefixes))
print('.. {} is clear'.format(eqn))
print(' No brace mismatches found in {} equations.'.format(len(result)))
print('No errs found in {} lines'.format(len(lines)))
def get_multiline_input(prompt):
print(prompt+". Press CTRL-D (or Command-D on Mac) once done.")
contents = []
while True:
try:
line = input()
except EOFError:
break
contents.append(line)
return '\n'.join(contents)
tex = get_multiline_input('Paste your suspect tex here >> ')
find_invalid_equations_in_tex(tex)