开发一段复杂的代码时,我遇到了以下神秘的错误:
./[email protected]:5: Undefined control sequence.
\GenericError ...
#4 \errhelp \@err@ ...
l.5 ...w@thmref@thm:defi:DistRn\endcsname{$\mathbb
{R}$}
通过“二分查找”,我意识到这是由于以下原因造成的:
\documentclass[a4paper]{report}
\usepackage{amsfonts}
\begin{document}
\expandafter\xdef\csname mw@thmref@thm:defi:DistRn\endcsname{$\mathbb{R}$}
\end{document}
然后变成\xdef
就\gdef
消失了。所以我很好奇,来这里问:这里发生了什么,这个错误是什么意思?
答案1
有一个原因\xdef
是 latex 中不支持命令,大多数 tex 构造在 edef 中爆炸。使用 \protected@edef
然后\protect
用于任何脆弱的命令。
如果你走的话
\edef\foo{\def\zzz{hello}}
然后它会尝试扩展(仅)标记,而定义\foo
.\def
是不可扩展的,因此就保持原样,然后它会尝试扩展\zzz
,然后通常会给出未定义的命令错误(或者如果\zzz
已经有定义,则会因扩展该定义而得到任意错误)。这就是 latex\protect
机制的全部原因,\xdef
直接使用只会直接将其炸开一个洞。
日志输出看起来有点奇怪的原因是它揭示了(或试图揭示)一个具有有趣名称的内部标记
\@err@ %
这是一个名称中有 65 个左右空格的 token,