定义一个 \dots-aware 命令

定义一个 \dots-aware 命令

编辑:更改了 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

\dotsofamsmath检查下一个标记,如果下一个宏以 开头,还会在必要时检查其含义\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}

在此处输入图片描述

相关内容