作为解释由 egreg 编写,“amsmath
重新定义\dots
,以便可以进行前瞻,以确定要使用哪种点。”但是,我注意到,\dots
当我定义宏来代替原本可以识别的命令时,此功能不起作用\dots
。例如,
\documentclass[12pt]{report}
\usepackage{amsmath}
\newcommand{\by}{\times}
\begin{document}
\begin{gather*}
A = A_1 \times \dots \times A_n \\
B = B_1 \by \dots \by B_m
\end{gather*}
\end{document}
产生输出
两对之间的点\times
处于正确位置,而两对之间的点\by
则不正确。我猜这是因为\dots
在宏扩展之前进行了前瞻?有办法解决这个问题吗?
答案1
\documentclass[12pt]{report}
\usepackage{amsmath}
\newcommand{\by}{\times}
\let\olddots\dots
\def\dots{\expandafter\olddots\romannumeral`\^^@}
\begin{document}
\begin{gather*}
A = A_1 \times \dots \times A_n \\
B = B_1 \by \dots \by B_m
\end{gather*}
\end{document}
答案2
标准方法amsmath
是使用\DOTSB
宏内部(\dots
提前查找\DOTSB
)。
笔记:我不知道为什么宏不重要,\long
所以它起作用,因此星号\newcommand*
是强制的(无论如何都是正确的)。
\documentclass{scrartcl}
\usepackage{mathtools}
\newcommand*{\by}{\DOTSB\times}
\begin{document}
\begin{gather*}
A = A_1 \times \dots \times A_n \\
B = B_1 \by \dots \by B_m
\end{gather*}
\end{document}
要跳过 AMS 测试\long
:
\documentclass{scrartcl}
\usepackage{mathtools}
\newcommand{\by}{\DOTSB\times}
\makeatletter
{\uccode`5=`m \uccode`6=`a \uccode`7=`c
\uccode`8=`\\ \uccode`9=`l \uccode`+=`o
\uppercase{\gdef\macro@#1#2#3#4\macro@{\gtest@false
\ifx 5#1\ifx 6#2\ifx 7#3\gtest@true
\xdef\meaning@{\macro@@#4\macro@@}\fi\fi
\else
\ifx 8#1\ifx 9#2\ifx +#3\gtest@true
\xdef\meaning@{\macro@@#4\macro@@}\fi\fi\fi
\fi}}}
\makeatother
\begin{document}
\begin{gather*}
A = A_1 \times \dots \times A_n \\
B = B_1 \by \dots \by B_m
\end{gather*}
\end{document}