amsmath 的“聚集”中的盒子行为不一致。

amsmath 的“聚集”中的盒子行为不一致。

最近我正在开发一个包(伊塔劳),在 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 环境中存在错误 - 并且确实存在所有错误的迹象(如第一个答案所证实) - 请将它们提请[电子邮件保护]。我们有一个等待安排更新的详尽清单,我已经将此报告添加到列表中。我还记录了这个位置,以便此处发布的任何建议都将成为记录的一部分,开发人员可以在实际开始工作时进行审查。

相关内容