在这个答案,我曾经用\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!!
我对于这个输出有两个疑问:
- 为什么会有四组输出?MWE
\tester
只调用了两次。 - 究竟做了什么
&
才会导致\aLength
并\aMacro
恢复到以前的价值观?
答案1
align
构建一个本质上类似于的对齐tabular
;每个单元格形成一个组,除了执行全局分配之外,没有太多的事情可做:
\global\aLength=50pt\relax
此外,align
还会读取其内容两次:第一次用于测量列,第二次用于进行实际排版。
它用来判断是否处于第一步的条件是\ifmeasuring@
;所以
\ifmeasuring@\typeout{...}\fi
将仅显示一次消息。您必须选择是在两个步骤中执行(全局)分配还是仅执行一次。请注意@
名称中的。