Definieren Sie einen \dots-fähigen Befehl

Definieren Sie einen \dots-fähigen Befehl

bearbeiten:MWE wurde geändert, um das Problem mit dem französischen Babel anzuzeigen

Ich habe mich also über TeX.sx gewundert und bin auf diese Frage gestoßen Wie funktionieren magische Punkte in amsmath?, ich wollte dasselbe tun (ein \dots-fähiges Makro haben).

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

aber die Punkte passen sich nicht an. Ich habe Folgendes gemacht:

texdef -t latex -p amsmath DOTSB

und anscheinend \DOTSBist es so \relax, und die Datei amsmath.sty bestätigt dies. Hat jemand eine Lösung dafür?

bearbeiten: Ich habe mich für die Lösung von @egreg entschieden, da die anderen beiden mit der splitUmgebung von in Konflikt standen amsmath.

Antwort1

Es gibt einen Fehler im frenchModul von babel. Der \dotsBefehl wurde neu definiert als

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

so wird im mathematischen Modus \Mdots@ausgeführt, was zu erweitert wird \@xp\mdots@, was falsch ist: es sollte einfach sein \mdots@. Tatsächlich \dotsführt das Patchen zum erwarteten Ergebnis:

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

Bildbeschreibung hier eingeben

Antwort2

\dotsvon amsmathprüft das nächste Token und prüft ggf. auch die Bedeutung des nächsten Makros, wenn es mit beginnt \DOTSB. Das Parsen für ein optionales Argument verhindert diese Erkennung, da es von mehr als einem Makro implementiert wird (hauptsächlich wegen von \futurelet). Daher \dotssieht \DOTSB, der von verwendete Marker, nicht \dots. Das Beispiel teilt das Makro in einen erweiterbaren Teil für \DOTSBund den anderen Teil für den Pfeil und das optionale Argument:

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

Ergebnis

\usepackage[french]{babel}

Dies funktioniert nicht für frenchb.ldf, da es neu definiert \dotsund die Definition von amsmathnicht mehr vorhanden ist.

Das folgende Beispiel stellt das \dotsMakro amsmathim Mathematikmodus wieder her:

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

Antwort3

Eine Lösung ohne 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}

Bildbeschreibung hier eingeben

verwandte Informationen