Definir un comando compatible con \dots

Definir un comando compatible con \dots

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 \dotsmacro 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 \DOTSBlo 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 splitentorno de amsmath.

Respuesta1

Hay un error en el frenchmódulo de babel. El \dotscomando 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 \dotsda 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}

ingrese la descripción de la imagen aquí

Respuesta2

\dotsof amsmathcomprueba 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 \dotsno ve \DOTSBel marcador utilizado por \dots. El ejemplo divide la macro en una parte expandible \DOTSBy 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}

Resultado

\usepackage[french]{babel}

Esto no funciona para frenchb.ldf, porque redefine \dotsy la definición de amsmathdesaparece.

El siguiente ejemplo restaura la \dotsmacro del amsmathmodo 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}

ingrese la descripción de la imagen aquí

información relacionada