編集:フランス語のバベルの問題を示すためにMWEを変更しました
そこで、TeX.sxについて疑問に思い、この質問にたどり着きました
amsmath ではマジック \dots はどのように機能しますか?、私も同じことをしたかったのです(\dots
-aware マクロを持つ)。
\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}
しかし、ドットは適応しません。私はそうしました:
texdef -t latex -p amsmath DOTSB
どうやら で\DOTSB
あり\relax
、amsmath.sty ファイルでこれが確認できます。これに対する解決策を持っている人はいますか?
編集: 他の 2 つはsplit
の環境と競合するため、@egreg のソリューションを選択しましたamsmath
。
答え1
french
のモジュールにバグがありますbabel
。\dots
コマンドは次のように再定義されます。
\relax\csname\ifmmode M\else T\fi dots@\endcsname
したがって、数式モードでは\Mdots@
が実行され、 に展開されますが\@xp\mdots@
、これは誤りです\mdots@
。単に となる必要があります。実際、パッチを適用すると\dots
期待どおりの結果が得られます。
\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}
答え2
\dots
は、amsmath
次のトークンをチェックし、次のマクロが で始まる場合は、必要に応じてその意味もチェックします\DOTSB
。オプションの引数の解析では、複数のマクロによって実装されているため (主に のため\futurelet
)、この検出が妨げられます。したがって、は によって使用されるマーカー\dots
を認識しません。例では、マクロを の展開可能な部分と、矢印とオプションの引数の他の部分に分割します。\DOTSB
\dots
\DOTSB
\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}
これは には機能しませんfrenchb.ldf
。 が再定義され\dots
、 の定義がamsmath
なくなるためです。
次の例では、内部数式モード\dots
のマクロを復元します。amsmath
\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}
答え3
なしのソリューション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}