¿Cómo redefinir `\ mathrel` sin romper` \ overset`?
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
\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
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í.