Defina um comando \dots-aware

Defina um comando \dots-aware

editar:mudou o MWE para mostrar o problema com a babel francesa

Então, eu estava pensando no TeX.sx e me deparei com esta questão Como os pontos mágicos funcionam no amsmath?, eu queria fazer a mesma coisa (ter uma \dotsmacro com reconhecimento).

\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}

mas os pontos não se adaptam. Eu fiz:

texdef -t latex -p amsmath DOTSB

e aparentemente \DOTSBé \relax, e o arquivo amsmath.sty confirma isso. Alguém tem uma solução para isso?

editar: optei pela solução @egreg, porque as outras duas conflitavam com o splitambiente do amsmath.

Responder1

Há um bug no frenchmódulo do babel. O \dotscomando é redefinido para ser

\relax\csname\ifmmode M\else T\fi dots@\endcsname

então, no modo matemático \Mdots@é executado, que se expande para \@xp\mdots@, o que está errado: deveria ser simplesmente \mdots@. Na verdade, o patch \dotsdá o 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}

insira a descrição da imagem aqui

Responder2

\dotsof amsmathverifica o próximo token e também verifica o significado da próxima macro, se necessário, se começar com \DOTSB. A análise de um argumento opcional evita essa detecção, pois é implementada por mais de uma macro (principalmente por causa de \futurelet). Portanto \dotsnão vê \DOTSBo marcador usado por \dots. O exemplo divide a macro em uma parte expansível \DOTSBe outra parte para a seta e o 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}

Isso não funciona frenchb.ldfporque redefine \dotse a definição amsmathdesaparece.

O exemplo a seguir restaura a \dotsmacro amsmathdentro do modo matemático:

\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}

Responder3

Uma solução sem 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}

insira a descrição da imagem aqui

informação relacionada