在 beamer 中,如何在 \only 中使用 \pause

在 beamer 中,如何在 \only 中使用 \pause

我想使用\pauseinside \only,如下例所示。有时效果很好(见幻灯片 2 和 3),但有时效果不好(见幻灯片 5 和 6)。为什么?

\documentclass{beamer}
\setbeamertemplate{footline}
{
  \hfill \insertframenumber{} / \inserttotalframenumber\hspace*{2ex}
}

\begin{document}
\begin{frame}
\frametitle{An example}
\only<1>{
insert a picture for instance
}
\pause
\only<2-3>{
\begin{itemize}
\item here is my first remark
\pause
\item and here is my second
\end{itemize}
}
\only<4>{
insert a 2nd picture
}
\pause
\only<5-6>{
\begin{itemize}
\item bla bla bla
\pause
\item ...
\end{itemize}
}
\end{frame}
\end{document}

我特意想让脚注显示帧数,在这个例子中仅为“1/1”。

答案1

我这里没有 LaTeX,但这应该可以。你必须将每个都重写\pause为正确的<n-m>语法。

\begin{frame}
\frametitle{An example}
\only<1>{
insert a picture for instance
}
\only<2-3>{
\begin{itemize}
\item<2-3> here is my first remark
\item<3-3> and here is my second
\end{itemize}
}
\only<4>{
insert a 2nd picture
}
\only<5-6>{
\begin{itemize}
\item<5-6> bla bla bla
\item<6-6> ...
\end{itemize}
}
\end{frame}

答案2

这是由于其工作方式所致\pause。当beamer处理帧时,它有一个内部计数器beamerpauses,用于计算当前“逻辑”幻灯片是什么。这适用于您想要指定叠加命令而不引用特定幻灯片的情况,如果您不知道(或尚未决定)特定幻灯片编号是什么,这将非常有用。当您有或之类的东西时,它会被使用\item<+->\alert<.(1)>它根据严格的规则递增:基本上,您需要+叠加层中的。它是不是通过诸如 之类的东西增加\alert<3-4>。这很有用,因为它允许您拥有一个“主流”(使用+)和它之外的一些东西,使用明确的规范。

现在妙语连珠。 \pause与 相同\onslide<+->。因此它使用beamerpauses计数器并增加它。但所有这些\onlys 都没有。此外,当 的覆盖规范\only不是匹配后,它会丢弃其内容而不进行处理。因此,当覆盖不匹配时,不会处理 s\pause中的那些 s 。\only

让我们考虑一下幻灯片 5 上发生了什么。

\begin{frame}
\frametitle{An example}
\only<1>{% not present on slide 5
insert a picture for instance
}
\pause % on slide 5
\only<2-3>{% not on slide 5
\begin{itemize}
\item here is my first remark
\pause % not on slide 5
\item and here is my second
\end{itemize}
}
\only<4>{ % not on slide 5
insert a 2nd picture
}
\pause % on slide 5
\only<5-6>{ % on slide 5
\begin{itemize}
\item bla bla bla
\pause % on slide 5
\item ...
\end{itemize}
}
\end{frame}

因此,我们剩下以下内容,我会计算一下beamerpauses

\begin{frame}
\frametitle{An example} % beamerpauses = 1
\pause % beamerpauses = 2
\pause % beamerpauses = 3
\begin{itemize}
\item bla bla bla
\pause % beamerpauses = 4
\item ...
\end{itemize}
\end{frame}

但是我们在第 5 张幻灯片上,因此所有这些停顿都被视为“已处理”,这意味着在第 5 张幻灯片上,整个内容都已排版。

有多种方法可以解决这个问题,但最简单的方法是避免混合使用这两种指定幻灯片内容的方法。\pause对主流使用,只对主流之外的内容使用特定规范。如果其他方法都失败了,您可以随时手动设置,例如使用beamerpauses\setcounter{beamerpauses}{5}

答案3

我经常发现它的\pause表现并不像我期望的那样。对我来说,\pause在所有情况下,都应该在当前文本之后的一张幻灯片中显示其后的文本。我已按如下方式实现:

\makeatletter

\newcount\np@pauses
\np@pauses=\z@
\def\np@reset{%
  \loop\ifnum\np@pauses>\z@
    \csgundef{np@pause@\the\np@pauses}
    \global\advance\np@pauses by -1 %
  \repeat}

% At each frame, reset the \np@pause@ variables
\apptocmd{\beamer@reseteecodes}{\np@reset}{}{}

\newcommand{\np@pause}[1]{%
  \ifcsname np@pause@#1\endcsname%
    \beamer@@pause[\csname np@pause@#1\endcsname]%
  \else%
    \ifnum\beamer@coveringdepth=0 %
      \@tempcnta=\beamer@slideinframe%
      \advance\@tempcnta by 1 %
      \expandafter\xdef\csname np@pause@#1\endcsname{\the\@tempcnta}%
      \beamer@@pause[\the\@tempcnta]%
    \fi%
  \fi%
}
\newif\ifnp@patched
\let\np@beamer@frameslide\beamer@frameslide
\let\np@endbeamer@frameslide\endbeamer@frameslide
\RenewEnviron{beamer@frameslide}{%
  % Replace all \pause's by \np@pause{uniq-id}.
  \np@pauses=0%
  \loop%
    \global\advance\np@pauses by 1 %
    \edef\temp{\noexpand\np@pause{\the\np@pauses}}%
    \expandafter\patchcmd\expandafter{\expandafter\BODY\expandafter}%
      \expandafter{\expandafter\pause\expandafter}%
      \expandafter{\temp}%
      {\np@patchedtrue}{\np@patchedfalse}%
    \ifnp@patched%
  \repeat%
  \np@beamer@frameslide%
  \BODY%
  \np@endbeamer@frameslide%
}
\makeatother

这将重新定义beamer@frameslide环境以将 each 更改\pause为其中 uniq-id 只是之前读取了\np@pause{uniq-id}多少个s。然后等待它以可见的方式执行( ),存储当前幻灯片编号,并从此时起充当。\pause\np@pausebeamer@coveringdepth=0\pause[slide-nb + 1]

这使用etoolboxenviron

您的示例和该代码片段具有“预期”的行为。

相关内容