如何在不破坏“\overset”的情况下重新定义“\mathrel”?

如何在不破坏“\overset”的情况下重新定义“\mathrel”?

似乎我无法\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将突然抓住\elseas 参数,然后代码就会崩溃:

\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}}

他们警告说,它可能会破坏其他软件包,但使用它不会给我带来任何问题,所以这对我来说是可行的。

相关内容