我曾尝试阅读优秀的 Beamer 用户指南,但未能理解。
我理解基本思想:有一个计数器beamerpauses
,它由覆盖规范内部的 推进+
。例如,您可以写入\item<+>
,您将获得一个仅显示当前值为 beamerpauses 的幻灯片的项目。此外,beamerpauses 会增加一。
到目前为止一切都很好。
可以这样写\item<.>
。这样可以打开 beamerpauses 的先前值 (-1) 的项目,并且不会增加计数器。
伟大的。
现在这里发生了什么(经过编辑以便做一些有趣的事情:)
\only<.(2)-+(6)>{\alert<+->{foo}\alert<+->{bar}} \only<-.(2)>\alert<-+>{BAR}\alert<-+(1)>{FOO}}
(1) (2) (3) (4) (5)
它是否等同于
\only<3-7>{\alert<2->{foo}\alert<3->{bar}}\only<-6>\alert<-5>{BAR}\alert<-7>{FOO}}
?
具体来说:(1) 处的增量何时发生?在处理两个参数之前还是之后?在评估 (4) 和 (5) 时,(2) 和 (3) 处的增量是否会影响计数器?
在这种情况下,计数器如何变化?它在每个点的值是多少?我如何才能找到答案?我尝试过书写,
\thebeamerpauses
但这个计数器似乎没有随着幻灯片而变化。是否有一个计数器可以保存幻灯片编号?
答案1
增量叠加规范的规则如下:
\beamerpauses
最初设置为 1- 如果
+
在覆盖规范中遇到,则所有出现的+
都会被替换为\beamerpauses
,然后\beamerpauses
增加 - 如果
.
在覆盖规范中遇到,则所有出现的.
都会被替换为\beamerpauses
-1;\beamerpauses
不会改变
如果你假设这一点可能会更容易理解,据我所知,这是等价的:
\beamerpauses
最初设置为 0- 如果
+
在覆盖规范中遇到,\beamerpauses
则递增,并且所有出现的都+
被替换为\beamerpauses
- 如果
.
在覆盖规范中遇到,则所有出现的.
都会被替换为\beamerpauses
;\beamerpauses
不会改变
如果你也假设这\alt
是聪明的,并且吞噬了不活跃的论点,而不是扩展它,你会猜到
\alt<-+>{\alert<+>{foo}\alert<+>{bar}}{\alert<.>{bar}\alert<.>{foo}}
是相同的
\alt<-1>{\alert<+>{foo}\alert<+>{bar}}{\alert<.>{bar}\alert<.>{foo}}
在幻灯片 1 上,第一个参数\alert<+>{foo}\alert<+>{bar}
被展开,结果为
\alert<2>{foo}\alert<2>{bar}
在第 1 张幻灯片之后,第二个参数\alert<.>{bar}\alert<.>{foo}
被扩展,结果是
\alert<1>{bar}\alert<1>{foo}
因此总的来说,这个组合相当于
\alt<-1>{\alert<2>{foo}\alert<2>{bar}}{\alert<1>{bar}\alert<1>{foo}}
将它们放在同一框架中,您会看到它们执行相同的操作。
表示-
间隔,因此<2-4>
表示“在幻灯片 2 到 4 上”。如果没有明确的端点,则将替换第一张和最后一张幻灯片。因此,第一个<-+>
规范相当于<1-1>
,而这又相当于<1>
。
一张张幻灯片下来,我们得到:
扩展,因为是 1
\alt
,所以与\alert<2>{foo}\alert<2>{bar}
\beamerpauses
{foo}{bar}
展开
\alt
,\alert<1>{bar}\alert<1>{foo}
因为\beamerpauses
2 与 相同{bar}{foo}
。
高级增量叠加规范涉及\beamerpauses
用括号中的数字进行偏移,例如\alert<.(2)->{foo}\alert<+->{bar}
,这将首先提醒,bar
然后提醒foo
和bar
。这就是您可以让框架的各个部分(例如,tikzpictures 的各个部分)动态更改的方式,而无需让它们都按照框架上排版的顺序排列,或者对幻灯片编号进行硬编码。
编辑Yossi 问道这是否\alt
真的是“智能”。如果你查看源代码,beamerbaseoverlay.sty
你会发现:
%
% \alt and \altenv
%
\def\alt{\@ifnextchar<{\beamer@alt}{\beamer@alttwo}}
\long\def\beamer@alttwo#1#2{\beamer@ifnextcharospec{\beamer@altget{#1}{#2}}{#1}}
\long\def\beamer@altget#1#2<#3>{%
\def\beamer@doifnotinframe{#2}\def\beamer@doifinframe{#1}%
{\beamer@masterdecode{#3}}\beamer@donow}
\long\def\beamer@alt<#1>#2#3{%
\def\beamer@doifnotinframe{#3}\def\beamer@doifinframe{#2}%
{\beamer@masterdecode{#1}}\beamer@donow}
\alt<#1>{#2}{#3}
在我看来, 的效果就像#2
和#3
保存在宏中,这些宏会根据是否#1
适用于当前框架而扩展。我不完全理解扩展,但我相信当\def
扫描参数文本时,它不会扩展该文本直到替换点(与 不同\edef
,它会在将参数文本分配给 之前扩展它#n
)。所以是的,\alt
是“智能的”,因为有条件包含的文本在被包含之前不会扩展。我想你可以做一个\tracingall
来确定。
后期编辑
忍不住粘贴了我现在正在处理的这个框架。
\begin{frame}[label=integral-of-x]{Example: Integral of $x$}
\begin{example}<+->
Find $\int_0^3 x\,dx$
\end{example}
\begin{solution}<+->
\action<.->{For any $n$ we have $\alert<.(5)>{\Delta x = \frac{3}{n}}$ and for each $i$ between $0$ and $n$, $\alert<.(4)>{x_i = \frac{3i}{n}}$.}
\action<+->{For each $i$, take $x_i$ to represent the function on the $i$th interval.}
\action<+->{So}
\begin{align*}
\action<.->{\int_0^3 x\,dx = \lim_{n\to\infty} R_n }
\action<+->{&= \lim_{n\to\infty} \sum_{i=1}^n \alert<.(1)>{f(x_i)}\,\alert<.(2)>{\Delta x}}
\action<+->{ = \lim_{n\to\infty}\sum_{i=1}^n
\alert<.>{\left(\frac{\alert<.(2)>{3}i}{\alert<.(2)>{n}}\right)}
\alert<+>{\left(\frac{\alert<.(1)>{3}}{\alert<.(1)>{n}}\right) }\\}
\action<+->{&= \lim_{n\to\infty}\alert<.>{\frac{9}{n^2}} \alert<.(1)>{\sum_{i=1}^n i}}
\action<+->{ = \alert<.(1)>{\lim_{n\to\infty}}\frac{9}{\alert<.(1)>{n^2}}
\cdot \alert<.>{\frac{\alert<.(1)>{n(n+1)}}{2}}}
\action<+->{= \frac{9}{2}\alert<.>{\cdot 1}}
\end{align*}
\end{solution}
\end{frame}
答案2
从下面的简单示例中可以看出,内部\alert
正在\alt
决定第二张幻灯片应该是什么,并且这会覆盖第二个参数\alt
认为它应该是什么的内容。
\alt<+->{%
\alert<+>{foo} bar%
}
{barfoo}