我怎样才能让 amsmath 的 \dots 在宏扩展之后向前看?

我怎样才能让 amsmath 的 \dots 在宏扩展之后向前看?

作为解释由 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}

相关内容