редактировать:изменил 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
\dots
of 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}