使用 TikZ 进行代码流维度

使用 TikZ 进行代码流维度

最近我努力编写动画图形投影仪演示文稿,有时包含 100 多张幻灯片。我发现我需要从三个相互影响的维度进行思考:

  1. 时间维度,在这个维度中我必须考虑幻灯片的顺序。
  2. 平面的维度,我必须考虑幻灯片上图形对象的放置。
  3. 代码流维度,其中 LaTeX 命令按照它们在代码中出现的顺序执行。LaTeX 允许您引用在代码中稍后定义的命令,因为对于命令\a' to refer to a command\b' 来说,即使\b在其下方定义,只要\b在下方某处定义,也是可以的。相反,使用 tikz 时,您不能引用命名节点,除非它之前已定义。这使设计变得复杂,因为有时您需要将节点放置在相对于另一个节点的位置,即使该其他节点在演示中显示得更晚。

我想知道这里的人们是否有关于工作流程和设计的技巧来帮助完成这个过程。我在这个网站上收集的一些技巧包括:

以下是一些我仍不知道如何处理的事情:

  • 覆盖中使用相对偏移的范围规范,即语法中的某种内容,其\uncover<(-6>-(+17)>{snark}应该在从当前幻灯片之前 6 张开始到其后 17 张幻灯片结束的幻灯片范围内显示“讽刺”。

  • 使保存的幻灯片标签遵守范围规则,以便\savepause{label}可以在可多次调用的宏中使用。

  • 根据某些宏的当前值强制beamer重新计算幻灯片的布局。

  • 对使用叠加层制作的动画进行快照,以便将动画的精髓保存到讲义中。

  • 在 ranges beamer 的覆盖规范中放置宏名称时,是否存在任何限制?您是否可以自由地将宏定义为幻灯片编号,然后在尖括号内使用它。

但更重要的是,我正在寻找工具和答案来回答我尚未能阐明的问题:有效的建议和

答案1

这里有一些我经常使用的一些技巧和窍门,用于管理包含大量幻灯片和复杂动画的投影仪框架。

使用 TikZ 进行代码流维度

我不使用 beamer 的覆盖命令(\visible<>\only<>等等)。相反,我总是绘制所有元素,但隐藏它们在幻灯片上不应出现的位置。为了指定可见性,我使用visible on=<...>如下的 TikZ 样式(取自思维导图 tikzpicture 在 beamer 中 (逐步显示),在那里查找完整的 MWE):

  % Keys to support piece-wise uncovering of elements in TikZ pictures:
  % \node[visible on=<2->](foo){Foo}
  % \node[visible on=<{2,4}>](bar){Bar}   % put braces around comma expressions
  %
  % Internally works by setting opacity=0 when invisible, which has the 
  % adavantage (compared to \node<2->(foo){Foo} that the node is always there, hence
  % always consumes space that (foo) is always available.
  %
  % The actual command that implements the invisibility can be overriden
  % by altering the style invisible. For instance \tikzsset{invisible/.style={opacity=0.2}}
  % would dim the "invisible" parts. Alternatively, the color might be set to white, if the
  % output driver does not support transparencies (e.g., PS) 
  %
  \tikzset{
    invisible/.style={opacity=0},
    visible on/.style={alt={#1{}{invisible}}},
    alt/.code args={<#1>#2#3}{%
      \alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
    },
  }

通过这种方法,所有命名元素(尤其是节点)始终存在,因此即使在幻灯片上不可见,您也可以使用它们进行坐标计算。此外,tikzpicture始终具有完整的尺寸,从而避免了经常出现的“跳图”问题。

同样的论点也适用于突出显示效果(例如,在幻灯片 2 上将节点变为红色)。对于这些,我使用以下样式(最初取自 Matthew Leingang 对如何使用 Tikz 节点制作投影仪覆盖):

% Key to apply style on specific overlays only
% usage (e.g.): \node[onslide=<2->{fill=red}]{I am red on slide 2!};
%
% see also: https://tex.stackexchange.com/questions/6135/how-to-make-beamer-overlays-with-tikz-node 
%
\tikzset{onslide/.code args={<#1>#2}{%
  \only<#1>{\pgfkeysalso{#2}} 
}}

当然,您可以轻松地将所有这些与其他样式或 TikZ 范围相结合。恕我直言,所有这些都使代码比标准覆盖命令更具可读性。我已经使用这种方法好几年了。

叠加步骤编号

如果开发更大的动画,通常最好尽可能使用相对叠加规范(并感谢 Joseph 的回答投影机中的相对覆盖规范?我了解到这个机制确实很强大)。

尽管如此,有时你会发现自己处于必须使用绝对数字或只是想使用它们的情况,因为它们使代码更具可读性:

\begin{frame}{Uncovering piecewise}
  \begin{tikzpicture}[every node/.style={fill=red!30, draw=red}]
    \node{Foo}
      child[visible on=<3->]{node {Bar}}
      child[visible on=<2->]{node {Baz}}
    ;  
  \end{tikzpicture}
  \par
  \only<3>{COOL PICTURE!}
\end{frame}

然而,如果使用绝对数字,如果您稍后想要插入一个中间步骤,并因此必须手动增加所有后续数字,那么它可能会变成真正的 PITA。

为了防止出现这种情况,我采用了 BASIC 编程早期的行号方案:最初只使用 10 的倍数,以便以后有一些空间可以在“中间”添加行。为了防止 beamer 为每个动画步骤创建 10 张幻灯片,我手动限制在帧级别使用的步骤:

\begin{frame}<1,20,30>{Uncovering piecewise}
  \begin{tikzpicture}[every node/.style={fill=red!30, draw=red}]
    \node{Foo}
      child[visible on=<30->]{node {Bar}}
      child[visible on=<20->]{node {Baz}}
    ;  
  \end{tikzpicture}
  \par
  \only<30>{COOL PICTURE!}
\end{frame}

为讲义定制动画

在帧级别上定制动画步骤的想法也可以应用于针对特定问题轻松定制动画,例如针对讲义。

handout模式下,投影仪通常会将一帧的所有幻灯片折叠成一张幻灯片,并将其用作讲义。不过,我经常想提供一些讲义中的动画步骤(但不是全部)。在这种情况下,可以使用模式说明符(all:handout:beamer:)来告诉 beamer 某些动画元素也应该或仅应是讲义/演示文稿幻灯片的一部分。

我没有逐个元素地指定这一点,因为这样很快就会成为一场噩梦,而是all:对所有叠加规范都使用 -specifier,这样动画的每个步骤也将成为讲义的一部分。然后,我在帧级别上选择我真正想要在讲义中的幻灯片:

% Skip slide 2 in handout
\begin{frame}<beamer|handout:1,3>{Uncovering piecewise}
  \begin{tikzpicture}[every node/.style={fill=red!30, draw=red}]
    \node{Foo}
      child[visible on=<all:3->]{node {Baz}}
      child[visible on=<all:2->]{node {Bar}}
    ;  
  \end{tikzpicture}
  \par
  \only<all:3>{COOL PICTURE!}
\end{frame}

在我的过程中,制作讲义(并决定其中应包含哪些幻灯片)通常是我采取的最后行动之一。通过这种方法,定制讲义变得非常容易。

相关内容