最近我正在开发一个包(伊塔劳),在 amsmath 中遇到了奇怪的环境体验gather
。也就是说,它与\vtop
我在进入环境之前保留的框发生冲突。请考虑以下最小测试用例:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\newbox\mybox
\setbox\mybox=\vtop{\halign{&#\cr a & b \cr c \cr}}
ht = \the\ht\mybox, dp = \the\dp\mybox
\begin{gather}
ht = \the\ht\mybox, dp = \the\dp\mybox
\box\mybox
\end{gather}
\begin{gather}
\setbox\mybox=\vtop{\halign{&#\cr a & b \cr c \cr}}
ht = \the\ht\mybox, dp = \the\dp\mybox
\box\mybox
\end{gather}
\end{document}
结果应如下所示:您将在第一个 之前看到打印的“ht = 6.94444pt, dp = 12.0pt” gather
,但在其中您将只看到ht = 0.0pt, dp = 0.0pt
。我的框去哪儿了?如果您在之后插入相同的诊断,gather
您会注意到它不会再回来。
在第二个中gather
,您将看到“ht = 0.0pt,dp = 21.94444pt”,并且\halign
将根据需要在“c”上打印“a b”,但整个内容确实会对齐,以便第一行的最顶部位于环境建立的文本行的最底部(与其他文本和标签进行比较)。高度去哪儿了?(不要说“进入深度”:)。)
这真的很烦人,因为它完全违反了我所理解\vtop
的做法:将框的基线放在内部框顶部的基线处。在 a 之外\halign
打印相同的内容会将“a b”放在文本中,这是应该的。 gather
\vtop
这个错误不会出现在 中align
。在那里(以及 中)发生的事情gather
是,我发现我的一些宏被重复评估了。大概 AMS 环境读取了它们的内容两次以获得正确的排版?不幸的是,我无法想象这会如何导致第二个错误(请注意,即使您不打印框,数字也会发生变化)。
答案1
环境gather
确实似乎对其环境进行了两次求值。第二次求值实际上产生了最终的排版结果。\box\mybox
用替换\copy\mybox
来解决该问题。
编辑:我忽略了你的第二个问题。看起来gather
环境设置是\everycr
为了它自己的目的,这会干扰你的“\halign”。一个解决方法是使用
\setbox\mybox=\vtop{\everycr{}…}
或者将整个任务移到gather
环境之外。
编辑第二个:记住 a 的内部\vtop
也是一个组,我通过移动\everycr
到它内部来简化解决方案。
答案2
gather 环境肯定会对其内容进行两次评估。从 amsmath.dtx 文件中:
所有显示环境都会排版两次——一次是在“测量”阶段,另一次是在“生产”阶段; \cs{ifmeasuring@} 将用于确定我们处于哪种情况,以便我们采取适当的措施。
如果任何 amsmath 环境中存在错误 - 并且确实存在所有错误的迹象(如第一个答案所证实) - 请将它们提请[电子邮件保护]。我们有一个等待安排更新的详尽清单,我已经将此报告添加到列表中。我还记录了这个位置,以便此处发布的任何建议都将成为记录的一部分,开发人员可以在实际开始工作时进行审查。