¿Cómo redefinir `\ mathrel` sin romper` \ overset`?

Oct 09 2020

Parece que no puedo modificar \mathrelsin romper \overset, y no entiendo por qué. Lo siguiente no se puede compilar incluso cuando la redefinición de \mathrelhace exactamente lo mismo que la versión original.

\documentclass{article}
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\begin{document}
\let\oldmathrel\mathrel
\def\mathrel#1{\oldmathrel{#1}}
$A \overset{X}{\to} B$
\end{document}

El mensaje de error es:

Runaway argument?
\relax\@nil \binrel@@ {\mathop {\kern \z@ \to }\limits ^{X}} B$ \end \ETC.
! File ended while scanning use of \@tempb.
<inserted text> 
                \par 

Que esta pasando?

Respuestas

3 UlrikeFischer Oct 09 2020 at 06:49

\mathreles un comando primitivo tex que se usa en todas partes. No debería cambiarlo sin una buena comprensión de cómo funcionan estas primitivas y sin la habilidad de rastrear el código.

En su ejemplo, falla porque la primitiva no acepta un argumento. Esto significa que puede hacer algo como esto:

\documentclass{article}

\begin{document}

$abc$

$a\ifnum 1=1 \mathrel \else \mathbin \fi b c$

\end{document}

Si agrega su redefinición, de \mathrelrepente tomará el \elseargumento as, y luego el código se desmorona:

\mathrel #1->\oldmathrel {#1}
#1<-\else 

! Missing } inserted.
<inserted text> 
                }
l.24 $a\ifnum 1=1 \mathrel \else \mathbin \fi b c$

Algo similar sucede con overset ya que las definiciones de amsmath \mathreltambién usan dentro de una \if-test:

    \ifdim\wdz@<\z@ \mathbin
    \else\ifdim\wdz@>\z@ \mathrel
    \else \relax\fi\fi
user21820 Oct 10 2020 at 17:00

No sé por qué se elimina la respuesta de egreg , porque había un comentario útil debajo (no recuerdo quién) que dio una solución muy simple:

\protected\def\mathrel#1{\oldmathrel{#1}}

Advirtieron que puede romper otros paquetes, pero usar esto no me causa ningún problema, así que esto funciona para mí.