使用 \pause 解决 AMSMath 环境中的方程编号问题

使用 \pause 解决 AMSMath 环境中的方程编号问题

我正在写一个 Beamer 演示文稿,并尝试(但没有成功)使用\pause它来逐步完成编号方程式数组,方程式依次出现,并且相应的数字在正确的时间出现(即方程式首次出现时)。

编辑\alt:我已经部分解决了这个问题,使用了所述技巧的变体这里,但有一些垂直摆动。

该解决方案应该比我下面提出的解决方案更优雅一些,因为文档的最终用户(不是我)可能需要进行更改,并且不是高级(La)TeX 用户。

\documentclass{beamer}
\begin{document}
  \begin{frame}
    \begin{gather}
       1\alt<2->{\\2\alt<3>{\\3}{}}{}
    \end{gather}
  \end{frame}
\end{document}

答案1

beamer用户指南中,对其的解释\pause是:

amsmath此命令在像这样的环境中不起作用align,因为它们会做出非常邪恶的事情。

align和它的朋友们做的一件坏事gather是,它们对环境的内容进行了两次评估。特别是,诸如 之类的覆盖命令\pause被执行了两次,这可能会造成混乱。在第一次运行中,环境的内容只是被测量;实际的排版是在第二次运行中完成的。

由于第一次运行中的测量以 开始\begingroup \measuring@true,因此可以很容易地修复问题(尽管根据beamer用户指南“没有修复此问题”!):只需\measuring@true停用相应的覆盖命令即可。(当然,必须找出什么正是要停用...)下面的代码执行此操作,并给出所需的输出:

输出的动画 gif

\documentclass{beamer}
\makeatletter
\let\save@measuring@true\measuring@true
\def\measuring@true{%
  \save@measuring@true
  \def\beamer@sortzero##1{\beamer@ifnextcharospec{\beamer@sortzeroread{##1}}{}}%
  \def\beamer@sortzeroread##1<##2>{}%
  \def\beamer@finalnospec{}%
}
\makeatother
\begin{document}
\begin{frame}
  \begin{gather}
    1 \\ \pause
    2 \\ \pause
    3
  \end{gather}
\end{frame}
\end{document}

答案2

这可能不是您想要的答案,但它很有用。这个想法是使用\onslide而不是\pause;然而,这仍然会产生不良效果:最后一个方程编号将出现在每张幻灯片上,如以下示例所示:

\documentclass{beamer}

\begin{document}

\begin{frame}
  \begin{gather}
    \onslide<1->{1\\}
    \onslide<2->{2\\}
    \onslide<3->{3}
  \end{gather}
\end{frame}

\end{document}

一种解决方法是在末尾添加一个新的“虚拟”行,并且不带编号(使用\notag),然后调整垂直空间,以便这个新的虚拟行不会添加不需要的垂直空间,如下例所示:

\documentclass{beamer}

\begin{document}

\begin{frame}
  \begin{gather}
    \onslide<1->{1\\}
    \onslide<2->{2\\}
    \onslide<3->{3\\[-\baselineskip]\notag}
  \end{gather}
\end{frame}

\end{document}

相关内容