Comment redéfinir `\ mathrel` sans casser` \ overset`?
Il semble que je ne puisse pas modifier \mathrelsans casser \overset, et je ne comprends pas pourquoi. La compilation suivante échoue même lorsque la redéfinition de \mathrelfait exactement la même chose que la version originale.
\documentclass{article}
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\begin{document}
\let\oldmathrel\mathrel
\def\mathrel#1{\oldmathrel{#1}}
$A \overset{X}{\to} B$
\end{document}
Le message d'erreur est:
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 se passe-t-il?
Réponses
\mathrelest une commande tex primitive utilisée partout. Vous ne devriez pas le changer sans vraiment bien comprendre le fonctionnement de ces primitives et sans la compétence pour tracer le code.
Dans votre exemple, cela échoue car la primitive ne prend pas d'argument. Cela signifie que vous pouvez faire quelque chose comme ceci:
\documentclass{article}
\begin{document}
$abc$
$a\ifnum 1=1 \mathrel \else \mathbin \fi b c$
\end{document}
Si vous ajoutez votre redéfinition, \mathrelva soudainement saisir l' \elseargument as, puis le code s'effondre:
\mathrel #1->\oldmathrel {#1}
#1<-\else
! Missing } inserted.
<inserted text>
}
l.24 $a\ifnum 1=1 \mathrel \else \mathbin \fi b c$
Quelque chose de similaire se produit avec un excès car les définitions amsmath utilisent \mathrelégalement à l'intérieur d'un \if-test:
\ifdim\wdz@<\z@ \mathbin
\else\ifdim\wdz@>\z@ \mathrel
\else \relax\fi\fi
Je ne sais pas pourquoi la réponse d' egreg est supprimée, car il y avait un commentaire utile en dessous (je ne me souviens plus de qui) qui donnait une solution très simple:
\protected\def\mathrel#1{\oldmathrel{#1}}
Ils ont averti que cela pourrait casser d'autres paquets, mais son utilisation ne me pose aucun problème, donc cela fonctionne pour moi.