我尝试了一个简单的切换动画。
首先,我创建一个布尔值,如果我将其设置为 true,则执行 if 路径,将其设置为 false 则执行 else 路径。到目前为止一切顺利。在 animateinline 中,我想根据布尔表达式绘制一些东西。使用 if 路径,我将变量设置为 false,因此我期望在下一个循环中使用 false 路径,而 else 路径则相反(简单的锁定逻辑)。
我必须做什么改变才能获得预期的结果(切换每帧不同的绘制)。
\documentclass{beamer}
\usepackage{tikz}
\usepackage{animate}
\usepackage{ifthen}
\usetikzlibrary{shapes, arrows.meta, positioning}
\newboolean{boolvar} %declaration, seems to be false by default
\setboolean{boolvar}{true}
\begin{document}
\begin{frame}
\begin{animateinline}[controls,loop]{50}
\begin{tikzpicture}
\ifthenelse{\boolean{boolvar}}
%if:
{
\node[draw=green,
minimum width=2cm,
minimum height=1cm] at (0,1) {1};
\setboolean{boolvar}{false} %this should set boolvar to false
}
%else:
{
\node[draw=red,
minimum width=2cm,
minimum height=1cm] at (0,1) {0};
\setboolean{boolvar}{true} %this should set boolvar to true
}
\end{tikzpicture}
\end{animateinline}
\end{frame}
\end{document}
答案1
环境中不存在任何\newframe
或命令。因此,仅根据布尔变量的初始设置生成一个动画帧。\multiframe
animateinline
可以将环境放置\multiframe{2}{}{...}
在周围tikzpicture
以获得两个动画帧。但请注意,在主体内定义或设置的变量\multiframe
具有仅限于当前循环执行的局部范围。Pkgifthen
不允许全局设置布尔变量。或者,etoolbox
可以使用允许设置布尔值的命令以 为前缀的包\global
:
\documentclass{beamer}
\usepackage{tikz}
\usepackage{animate}
\usepackage{etoolbox}
\usetikzlibrary{shapes, arrows.meta, positioning}
\newbool{boolvar} %declaration, seems to be false by default
\booltrue{boolvar}
\begin{document}
\begin{frame}
\begin{animateinline}[controls,loop]{50}
\multiframe{2}{}{
\begin{tikzpicture}
\ifbool{boolvar}
%if:
{
\node[draw=green,
minimum width=2cm,
minimum height=1cm] at (0,1) {1};
\global\boolfalse{boolvar} %this should set boolvar to false
}
%else:
{
\node[draw=red,
minimum width=2cm,
minimum height=1cm] at (0,1) {0};
\global\booltrue{boolvar} %this should set boolvar to true
}
\end{tikzpicture}
}
\end{animateinline}
\end{frame}
\end{document}
但是,对于手头的问题,可能更容易使用\newframe
来生成两个动画帧:
\documentclass{beamer}
\usepackage{tikz}
\usepackage{animate}
\usetikzlibrary{shapes, arrows.meta, positioning}
\begin{document}
\begin{frame}
\begin{animateinline}[controls,loop]{50}
\begin{tikzpicture}
\node[draw=green,
minimum width=2cm,
minimum height=1cm] at (0,1) {1};
\end{tikzpicture}
\newframe
\begin{tikzpicture}
\node[draw=red,
minimum width=2cm,
minimum height=1cm] at (0,1) {0};
\end{tikzpicture}
\end{animateinline}
\end{frame}
\end{document}