如何在 Latex Beamer 中插入覆盖层

如何在 Latex Beamer 中插入覆盖层

我在 中有多达 15-20 个叠加层frame。我试图在状态图中突出显示某些状态。问题是有时我想添加一个叠加层,比如 5 到 6 之间。我需要增加 6 之后所有叠加层的计数器,这可能非常烦人。我考虑将叠加层编号为 5 的倍数,以便我可以稍后插入叠加层。但是,每个数字都会导致新的幻灯片,这是非常不可取的。另一个解决方案是创建一个单独的框架。有没有更好的方法来处理这个问题?我是否遗漏了一些显而易见的东西?

答案1

以下是使用带偏移的增量覆盖规范的示例。

\documentclass{beamer}
\begin{document}
\begin{frame}[label=integral-of-x]{Example: Integral of $f(x) =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 $f$ 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}
\end{document}

示例代码输出

基本上,<+->表示增加暂停计数并从该暂停计数开始应用此计数。 <.->表示从当前暂停计数开始(实际上不执行任何操作,但有助于组织)。还有诸如<.(5)>当前暂停计数加五之类的意思。因此,您可以在之前或之后插入内容,而无需明确更改暂停计数。当然,如果您引用带有和的叠加层<.>,并且<.(5)>想要在它们之间插入某些内容,则需要更改<.(5)><.(6)>或类似内容。

我创建这种复杂序列的工作流程通常是将其绘制在纸上。我会写下每一步应该开始、结束或改变的内容。从那以后,就只是猜测和检查的问题了。\includeonlyframes前导命令允许您在开发时专注于一帧。

答案2

我认为有些情况下增量覆盖是不够的。例如,框架可以揭示一个图表,同时在其他地方显示注释:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{backgrounds}

\begin{document}
\begin{frame}
\begin{tikzpicture}[framed]
    \onslide<1->{\node[red] (r) {Red};}
    \onslide<2->{\node[blue, below of = r] {Blue};}
\end{tikzpicture}\\
\only<1>{Red node comment}
\only<2>{Blue node comment}
\end{frame}
\end{document}

在这种情况下,我们可能希望插入一个新节点,比如绿色节点,出现在红色和蓝色节点之间。据我所知,唯一的解决方案是插入

\onslide<2->{\node[green, right of = r] {Green};}

在红色和蓝色之间,然后手动增加所有受影响的叠加规范(即,将大于或等于 2 的所有内容加 1)。对于复杂的图表,这可能非常繁琐。也许更简洁的方法是,如果 beamer 支持分数幻灯片编号,这样我们就可以插入类似

\onslide<1.5->{\node[green, right of = r] {Green};}

我最近不得不修改一个较大的图表,在花了一些时间重新编号后,我编写了一个简单的 Python 脚本,该脚本仅使用整数将这些分数规范转换为等效规范。下面的脚本读取一个文本文件(在第一个参数中给出),其中包含一个带有分数叠加的单帧,并输出等效的有效投影仪帧。它非常粗糙(例如,如果叠加规范分为两行,则不起作用),但可以作为一个很好的起点。

import re
import sys

p = re.compile("<(([0-9]+(\.[0-9]+)?)(-([0-9]+(\.[0-9]+)?)?)?)>")

def extract(s):

    ret = set()
    for r in [m[0] for m in p.findall(s)]:
        ret = ret.union(set([float(x) for x in r.split('-') if x]))
    return ret

def sub(s, newi):
    for m in [m for m in p.finditer(s)]:
        for r in [m.regs[2], m.regs[5]]:
            if r[0] < 0: continue
            s = s[:r[0]] + str(newi[float(s[r[0]:r[1]])]) + s[r[1]:]
    return s


f = open(sys.argv[1], "r+")
ls = [l for l in f]
xs = set.union(*[extract(l) for l in ls])
newi = dict(zip(sorted(xs), range(len(xs)+1)[1:]))
for l in ls:
    sys.stdout.write(sub(l, newi))

答案3

从 beamer 手册(你可以用 阅读texdoc beamer)中,以下覆盖

\begin{itemize}
\item<1-> Apple
\item<2-> Peach
\item<3-> Plum
\item<4-> Orange
\end{itemize}

等于

\begin{itemize}
\item<+-> Apple
\item<+-> Peach
\item<+-> Plum
\item<+-> Orange
\end{itemize}

如果顺序不连续,您可以编写一个新命令并使用\setcounter\addtocounter。 (抱歉没有指出一个例子,我找不到一个。)

相关内容