为什么 `&` 会重置分组?

为什么 `&` 会重置分组?

这个答案,我曾经用\tikzmark它来标记排版文本的范围,这样我就可以在其旁边绘制更改栏。但最初看起来更改栏会随着数学模式内容而“消失”。经过一些调试,我将其缩减为以下 MWE:

\documentclass{article}

\usepackage{etoolbox}
\usepackage{amsmath}
\newlength\aLength
\newcommand{\tester}[1]{%
  \setlength{\aLength}{50pt}%
  \def\aMacro{Hello}%
  \typeout{Before: \the\aLength, and \aMacro}%
  #1%
  \typeout{After: \the\aLength, and \ifdef{\aMacro}{\aMacro}{undefined!!}}
}%

\begin{document}
\begin{align*}
  \tester{0}
  \tester{ 0 & 1 }
\end{align*}
\end{document}

这会产生以下行为:

Before: 50.0pt, and Hello
After: 50.0pt, and Hello
Before: 50.0pt, and Hello
After: 0.0pt, and undefined!!
Before: 50.0pt, and Hello
After: 50.0pt, and Hello
Before: 50.0pt, and Hello
After: 0.0pt, and undefined!!

我对于这个输出有两个疑问:

  1. 为什么会有四组输出?MWE\tester只调用了两次。
  2. 究竟做了什么&才会导致\aLength\aMacro恢复到以前的价值观?

答案1

align构建一个本质上类似于的对齐tabular;每个单元格形成一个组,除了执行全局分配之外,没有太多的事情可做:

\global\aLength=50pt\relax

此外,align还会读取其内容两次:第一次用于测量列,第二次用于进行实际排版。

它用来判断是否处于第一步的条件是\ifmeasuring@;所以

\ifmeasuring@\typeout{...}\fi

将仅显示一次消息。您必须选择是在两个步骤中执行(全局)分配还是仅执行一次。请注意@名称中的。

相关内容