\dots対応コマンドを定義する

\dots対応コマンドを定義する

編集:フランス語のバベルの問題を示すために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}

ここに画像の説明を入力してください

関連情報