编辑:更改了 MWE 以显示法语 babel 的问题
因此,我对 TeX.sx 感到疑惑,并遇到了这个问题
神奇的 \dots 在 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
ofamsmath
检查下一个标记,如果下一个宏以 开头,还会在必要时检查其含义\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}