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 \DOTSB
ist 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 split
Umgebung von in Konflikt standen amsmath
.
Antwort1
Es gibt einen Fehler im french
Modul von babel
. Der \dots
Befehl 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 \dots
fü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}
Antwort2
\dots
von amsmath
prü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 \dots
sieht \DOTSB
, der von verwendete Marker, nicht \dots
. Das Beispiel teilt das Makro in einen erweiterbaren Teil für \DOTSB
und 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}
\usepackage[french]{babel}
Dies funktioniert nicht für frenchb.ldf
, da es neu definiert \dots
und die Definition von amsmath
nicht mehr vorhanden ist.
Das folgende Beispiel stellt das \dots
Makro amsmath
im 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}