神奇的 \dots 在 amsmath 中如何发挥作用?

神奇的 \dots 在 amsmath 中如何发挥作用?

amsmath包重新定义了\dots命令,以便它根据上下文“猜测”点的正确高度。例如

$x, \dots, y$

将产生三个降低的点,与逗号对齐。而

$x \to \dots \to y$

使用与箭头对齐的居中点。但是,如果我定义自己的宏,amsmath就无法再猜测,它总是使用较低的点。例如

\newcommand{\myto}{\to}
$x \myto \dots \myto y$

使用了错误的点。我怎样才能知道amsmath我想要的是居中点而不是降低点?

顺便说一句,我知道,\cdots但我想要的是\dots仍然能够自动猜出正确的。

答案1

看看amsmath.sty,我看到很多这样的行:

\gdef\coprod{\DOTSB\coprod@\slimits@}

我猜想\DOTSB控制着这个符号前面(或后面?)会出现什么样的点。

\show\mapsto

表明具有魔力\DOTSB。因此,如果定义您自己的宏,我会尝试在它们之前或之后添加\DOTSB\DOTSI(这些似乎是选项)。(请报告发生了什么!)。我猜“知道”某些命令,但必须被告知任何额外的命令。 似乎属于“已知”命令,但例如,必须告知它:\DOTSX\dots\to\mapsto

> \mapsto=\long macro:
->\DOTSB \mapstochar \rightarrow .
l.3 \show\mapsto

答案2

这不符合你的要求,但以最好的语义方式,amsmath 还定义了

  • \dotsc表示“带逗号的点”

  • \dotsb对于“带二元运算符/关系的点”

  • \dotsm“乘法点”

  • \dotsi对于“带积分的点”

  • \dotso对于“其他点”(以上都不是)

(引自LaTeX 数学简明指南,第 15 页.) 其中每个都指定高度。我没有找到您描述的 \dots 行为的文档。您能指出它在哪里吗?

答案3

好吧,既然我问了调试问题,我冒险出去并尝试调试!

使用\show没有作用,在日志文件中产生以下内容:

> \dots=macro:
->\protect \dots  .
l.7 \show\dots

所以我在 Google 上搜索了 show 命令,找到了页面,所以我做了以下事情

\def\pshow#1{{\let\protect\show #1}}
\begin{equation*}
 a \pshow{\dots} b=0;
\end{equation*}

结果是:

> \dots =\long macro:
->\ifmmode \@xp \mdots@ \else \@xp \textellipsis \fi .
\dots ->\protect \dots

进行更深入的检查\mdots@是可能的(使用\makeatletter\makeatother),但结果相当可怕:

 > \mdots@=macro:
->\FN@ \mdots@@ .
l.11 \show\mdots@

在哪里

> \FN@=macro:
->\futurelet \@let@token .

> \mdots@@=macro:
->\gdef \thedots@ {\dotso@ }\ifx \@let@token \boldsymbol \gdef \thedots@ \boldsymbol {\boldsymboldots@ }\else \ifx ,\@let@token \gdef \thedots@ {\dotsc }\else \ifx \not \@let@token \gdef \thedots@ {\dotsb@ }\else \keybin@ \ifgtest@ \gdef \thedots@ {\dotsb@ }\else \xdef \meaning@ {\meaning \@let@token ..........}\xdef \meaning@@ {\meaning@ }\@xp \math@ \meaning@ \math@ \ifgtest@ \@xp \mathch@ \meaning@ \mathch@ \ifgtest@ \@xp \getmathch@ \meaning@ \getmathch@ \fi \else \@xp \macro@ \meaning@@ \macro@ \ifgtest@ \@xp \not@ \meaning@ \not@ \ifgtest@ \gdef \thedots@ {\dotsb@ }\else \@xp \DOTS@ \meaning@ \DOTS@ \ifgtest@ \ifcase     number \DOTSCASE@ \gdef \thedots@ {\dotsb@ }\or \gdef \thedots@ {\dotsi }\else \fi \else \@xp \math@ \meaning@ \math@ \ifgtest@ \@xp \mathbin@ \meaning@ \mathbin@ \ifgtest@ \gdef \thedots@ {\dotsb@ }\else \@xp \mathrel@ \meaning@ \mathrel@ \ifgtest@ \gdef \thedots@ {\dotsb@ }\fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \fi \thedots@ . 

至此,我放弃了……有人愿意继续解剖吗?

相关内容