editar:Cambió el MWE para mostrar el problema con la Babel francesa.
Entonces, estaba preguntando sobre TeX.sx y encontré esta pregunta
¿Cómo funcionan los puntos mágicos en amsmath?, Quería hacer lo mismo (tener una \dots
macro compatible).
\documentclass{minimal}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage[french]{babel}
\renewcommand*{\to}{%
\DOTSB
\myto
}
\NewDocumentCommand{\myto}{o}{%
\IfValueTF{#1}{%
\xrightarrow{#1}%
}{%
% default latex \to
\mathchar"3221
}%
}
\begin{document}
\(t\to[s]\dots\to[b]a\)
\end{document}
pero los puntos no se adaptan. Hice:
texdef -t latex -p amsmath DOTSB
y aparentemente \DOTSB
lo es \relax
, y el archivo amsmath.sty lo confirma. ¿Alguien tiene una solución para esto?
editar: Elegí la solución @egreg porque las otras dos entraban en conflicto con el split
entorno de amsmath
.
Respuesta1
Hay un error en el french
módulo de babel
. El \dots
comando se redefine para ser
\relax\csname\ifmmode M\else T\fi dots@\endcsname
entonces en modo matemático \Mdots@
se ejecuta, que se expande a \@xp\mdots@
, lo cual es incorrecto: debería ser simplemente \mdots@
. De hecho, la aplicación de parches \dots
da el resultado esperado:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\usepackage[french]{babel}
\usepackage{xpatch}
% the redefinition of \dots happens at begin document
% we simply remove one step: instead of the faulty
% \Mdots@ we do \mdots@
\AtBeginDocument{\xpatchcmd{\dots}{M}{m}{}{}}
\renewcommand*{\to}{%
\DOTSB
\myto
}
\NewDocumentCommand{\myto}{o}{%
\IfValueTF{#1}{%
\xrightarrow{#1}%
}{%
% default latex \to
\rightarrow
}%
}
\begin{document}
\(t\to[s]\dots\to[b]a\)
\end{document}
Respuesta2
\dots
of amsmath
comprueba el siguiente token y también comprueba el significado de la siguiente macro si es necesario, si comienza con \DOTSB
. El análisis de un argumento opcional evita esta detección, porque está implementado por más de una macro (principalmente debido a \futurelet
). Por lo tanto \dots
no ve \DOTSB
el marcador utilizado por \dots
. El ejemplo divide la macro en una parte expandible \DOTSB
y la otra parte para la flecha y el argumento opcional:
\documentclass{minimal}
\usepackage{amsmath}
\usepackage{xparse}
\renewcommand*{\to}{%
\DOTSB
\myto
}
\NewDocumentCommand{\myto}{o}{%
\IfValueTF{#1}{%
\xrightarrow{#1}%
}{%
% default latex \to
\mathchar"3221
}%
}
\begin{document}
\(t\to[s]\dots\to[b]a\)
\end{document}
\usepackage[french]{babel}
Esto no funciona para frenchb.ldf
, porque redefine \dots
y la definición de amsmath
desaparece.
El siguiente ejemplo restaura la \dots
macro del amsmath
modo matemático interno:
\documentclass{minimal}
\usepackage{letltxmacro}
\usepackage{amsmath}
\LetLtxMacro\amsmathdots\dots
\usepackage{xparse}
\usepackage[french]{babel}
\AtBeginDocument{%
\LetLtxMacro\frenchdots\dots
\everymath{\LetLtxMacro\dots\amsmathdots}%
\everydisplay{\LetLtxMacro\dots\amsmathdots}%
}
\renewcommand*{\to}{%
\DOTSB
\myto
}
\NewDocumentCommand{\myto}{o}{%
\IfValueTF{#1}{%
\xrightarrow{#1}%
}{%
% default latex \to
\mathchar"3221
}%
}
\begin{document}
\(t\to[s]\dots\to[b]a\)
\end{document}
Respuesta3
Una solución sin xparse
:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{letltxmacro,amsmath}
\LetLtxMacro\amsdots\dots
\usepackage[french]{babel}
\AtBeginDocument{%
\LetLtxMacro\frenchdots\dots
\everymath{\LetLtxMacro\dots\amsdots}%
\everydisplay{\LetLtxMacro\dots\amsdots}%
}
\renewcommand*\to{\DOTSB\myto}
\newcommand*\myto[1][]{\if$#1$\dots\else\xrightarrow{#1}\fi}
\begin{document}
\( t\to[s]\dots\to[b]a \to\)
\end{document}