Определить команду, поддерживающую \точки

Определить команду, поддерживающую \точки

редактировать:изменил MWE, чтобы показать проблему с французским Babel

Итак, я размышлял о TeX.sx и наткнулся на этот вопрос Как работают магические \точки в amsmath?, я хотел сделать то же самое (иметь \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 это подтверждает. Есть ли у кого-нибудь решение для этого?

редактировать: Я выбрал решение @egreg, потому что два других конфликтуют со splitсредой 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

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

введите описание изображения здесь

Связанный контент