案例 2:Beamer 中的自动叠加规范如何工作(在嵌套情况下)

案例 2:Beamer 中的自动叠加规范如何工作(在嵌套情况下)

我之前问过问题关于这一点,但我觉得它不够集中而且答案有点混乱......所以我没有编辑那个问题,而是选择开始一个新的问题......我希望大家不要反对。


我无法理解 Beamer 使用时会做什么嵌套自动覆盖规范。请考虑以下示例:

\documentclass[10pt,a4paper]{beamer}

\begin{document}
\begin{frame}
\Huge
\only<1-+(3)>{\alert<-+>{foo} \alert<-+>{bar}}
\only<+>{a}\only<+>{b}\only<+>{c}\only<+>{d}\only<+>{e}
\only<1>{1}\only<2>{2}\only<3>{3}\only<4>{4}\only<5>{5}\only<6>{6}
\end{frame}
\end{document}

这使: 替代文本

我想说的是,foo 和 bar 会按预期出现,但在幻灯片 4 和幻灯片 5 之间的 \only 之外,会发生一些奇怪的事情。特别是 b 和 c 在哪里?我希望字母和数字之间有很好的对应关系……你不会吗?当然,会有偏移,但我不会期望这个偏移会在第 5 张幻灯片处发生变化。

另外,是否有一个变量/计数器可以保存幻灯片编号?


为了强调我的建议,即 \beamerpauses 应该只计算一次,我会说以下框架中有两条完全非直观的线:

\begin{frame}
\alt<1-2>{
\begin{itemize}[<+->]
\item a
\item b
\end{itemize}}{
\addtocounter{beamerpauses}{2} %why should I need this?
\begin{itemize}[<+->]
\item A
\item B
\item C
\item D
\end{itemize}
}
\action<6>{} %this lines is really annoying because of the 6
%\action<+>{} %this gives an extra slide at the end.
%\action<.>{} %this doesn't work.

\end{frame}

我会写出整个东西而不需要那些多余的线条并且期望它能够正常工作(TM)....

答案1

这是合乎逻辑的,船长,但不是我们所知道的那种逻辑。

要记住的关键事实是,每次投影仪看到+然后abeamerpauses递增。这是我看到的,其中 (斜体) 的值beamerpauses在很多场合被评估。首先,我运行的实际代码(beamerpauses用颜色突出显示)。

{\color{green}\thebeamerpauses}
\only<1-+(3)>{\alert<-+>{foo} {\color{green}\thebeamerpauses} \alert<-+>{bar}}
{\color{green}\thebeamerpauses}
\only<+>{a}\only<+>{b}\only<+>{c}\only<+>{d}\only<+>{e}
{\color{green}\thebeamerpauses}
\only<1>{1}\only<2>{2}\only<3>{3}\only<4>{4}\only<5>{5}\only<6>{6}
{\color{green}\thebeamerpauses}

现在,我看到了(asciified)的内容,加上我对正在发生的事情的解释,包括代码扩展为什么(就所有覆盖规范而言)和“英语翻译”。 (免责声明:这都是从观察到的行为而不是引擎盖或引擎盖下观察得出的。)

  1. 1 3 酒吧 4 919

    \only<1-4>{\alert<-2>{foo} \alert<-3>{bar}}
    \only<4>{a}\only<5>{b}\only<6>{c}\only<7>{d}\only<8>{e}
    \only<1>{1}\only<2>{2}\only<3>{3}\only<4>{4}\only<5>{5}\only<6>{6}
    

    and+中的 s表示在“foo”之后,我们已递增两次。对于“bar”的 s 再次递增。对于“a”和 c 的每个s 再次递增,到该行结束时达到 9。\only\alert\alert\only

  2. 1 3 酒吧 4 929

    \only<1-4>{\alert<-2>{foo} \alert<-3>{bar}}
    \only<4>{a}\only<5>{b}\only<6>{c}\only<7>{d}\only<8>{e}
    \only<1>{1}\only<2>{2}\only<3>{3}\only<4>{4}\only<5>{5}\only<6>{6}
    

    又一样。

  3. 13 酒吧 4 939

    \only<1-4>{\alert<-2>{foo} \alert<-3>{bar}}
    \only<4>{a}\only<5>{b}\only<6>{c}\only<7>{d}\only<8>{e}
    \only<1>{1}\only<2>{2}\only<3>{3}\only<4>{4}\only<5>{5}\only<6>{6}
    

    -+foo-alert 中的扩展为,因此-2我们在此处丢失了对 foo 的警报。

  4. 13酒吧4A949

    \only<1-4>{\alert<-2>{foo} \alert<-3>{bar}}
    \only<4>{a}\only<5>{b}\only<6>{c}\only<7>{d}\only<8>{e}
    \only<1>{1}\only<2>{2}\only<3>{3}\only<4>{4}\only<5>{5}\only<6>{6}
    

    现在 bar 也发生了这种情况。最后,我们到达了第一个字母出现的幻灯片,因为+中的\only<+>{a}扩展为4

  5. 1 2d757

    \only<1-4>{\alert<-2>{foo} \alert<-3>{bar}}
    \only<2>{a}\only<3>{b}\only<4>{c}\only<5>{d}\only<6>{e}
    \only<1>{1}\only<2>{2}\only<3>{3}\only<4>{4}\only<5>{5}\only<6>{6}
    

    有趣的事情就在这里发生。首字母\only<1-+(3)>{...}被扩展为\only<1-4>{...}。这意味着现在括号内的所有内容完全消失。这包括两个+s。因此,现在所有\only<+>{a}s 等都比以前更早出现在第二张幻灯片上。

  6. 1 2767

    \only<1-4>{\alert<-2>{foo} \alert<-3>{bar}}
    \only<2>{a}\only<3>{b}\only<4>{c}\only<5>{d}\only<6>{e}
    \only<1>{1}\only<2>{2}\only<3>{3}\only<4>{4}\only<5>{5}\only<6>{6}
    

    又一样。

总而言之,理解这个例子的关键是记住\only 扔掉它的论点出现在不该出现的幻灯片上。这对于在不同的幻灯片上呈现相当复杂的东西非常有用。

至于你的最后一个问题:据我所知没有。我曾经需要一个,但找不到,所以就定义了一个。这是一个粗略的定义,涉及一个围绕 frametitle 命令的包装器,这样我就可以在每张幻灯片上添加一些代码来增加幻灯片计数器。


关于更新,我认为这里关于这两行奇怪的代码有两个问题。第一个是问题+。我不得不说,我发现你关于它应该“正常工作”的断言有点不诚实。你有已经指定了精确的覆盖规范(在 中\alt<1-2>),因此您已经必须手动计算一些东西。有很多其他方法可以通过该特定示例实现您想要的结果(但我怀疑它过于简单,而您真正想要的结果可能要复杂得多!)。可能最相关的是使用环境,onlyenv因为排版其内容(然后将其丢弃)。因此,这有效:

\begin{frame}
\begin{onlyenv}<1-2>
\begin{itemize}[<+->]
\item a
\item b
\end{itemize}
\end{onlyenv}
\begin{itemize}[<+->]
\item A
\item B
\item C
\item D
\end{itemize}
\end{frame}

我认为第二个问题实际上是不同的,这是我之前问过。不知何故,beamerpauses在自动显示的列表后获取正确的结果有点复杂。我有一个命令\itpause,用于在列表后减去一个beamerpauses,然后执行\pause- 这是我发现的使以下内容正常工作的最简单的方法:

\begin{frame}
\begin{itemize}[<+->]
\item First item
\item Second item
\end{itemize}
\itpause
On the \alert{third} frame
\end{frame}

\pause那里,最后一行出现在第四框架,没有任何内容,则它出现在第二beamerpauses框架。我会将此归类为错误;这似乎与列表环境内部和外部的差异有关。要了解这一点,请比较\alert<.>{}内部和外部的不同行为:

\begin{frame}
\alert<.>{hello}
\begin{itemize}[<+->]
\item A \alert<.>{hello}
\item B
\item C
\item D
\end{itemize}
\alert<.>{hello}
\end{frame}

答案2

关于最后一个问题,框架内当前幻灯片的编号存储在 TeX 计数寄存器中\beamer@slideinframe。你可以用以下命令将其转换为 LaTeX 计数器

\makeatletter \setcounter{currentslide}{\the\beamer@slideinframe} \makeatother

如果你喜欢。

答案3

回答你的最后一个问题,我认为没有一个公共计数器来保存幻灯片编号。否则我会期望一个命令,\insertslidenumber但没有。请参阅这个问题我们在那里想出了一个解决方法,\insertframestartpage从中减去\insertpagenumber

相关内容