似乎我无法\mathrel
在不破坏 的情况下进行修改\overset
,我不明白为什么。即使 的重新定义\mathrel
与原始版本完全相同,下面的代码也无法编译。
\documentclass{article}
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\begin{document}
\let\oldmathrel\mathrel
\def\mathrel#1{\oldmathrel{#1}}
$A \overset{X}{\to} B$
\end{document}
错误信息是:
Runaway argument?
\relax\@nil \binrel@@ {\mathop {\kern \z@ \to }\limits ^{X}} B$ \end \ETC.
! File ended while scanning use of \@tempb.
<inserted text>
\par
到底是怎么回事?
答案1
\mathrel
是广泛使用的 tex 基本命令。如果您不真正理解这些基本命令的工作原理,也不具备跟踪代码的技能,则不应更改它。
在您的示例中,它失败了,因为原语不接受参数。这意味着您可以执行以下操作:
\documentclass{article}
\begin{document}
$abc$
$a\ifnum 1=1 \mathrel \else \mathbin \fi b c$
\end{document}
如果你添加重新定义,\mathrel
将突然抓住\else
as 参数,然后代码就会崩溃:
\mathrel #1->\oldmathrel {#1}
#1<-\else
! Missing } inserted.
<inserted text>
}
l.24 $a\ifnum 1=1 \mathrel \else \mathbin \fi b c$
类似的事情发生在 overset 上,因为 amsmath 定义\mathrel
也在\if
-test 中使用:
\ifdim\wdz@<\z@ \mathbin
\else\ifdim\wdz@>\z@ \mathrel
\else \relax\fi\fi
答案2
我不知道为什么埃格尔的回答被删除了,因为下面有一个有用的评论(我不记得是谁说的)给出了一个非常简单的解决方案:
\protected\def\mathrel#1{\oldmathrel{#1}}
他们警告说,它可能会破坏其他软件包,但使用它不会给我带来任何问题,所以这对我来说是可行的。