这animate
包非常适合简单的动画,但它的缺点是动画的每一帧都必须在编译期间创建。对于具有简单动态但循环时间较长(即许多不同的帧)的动画,这会导致较长的编译时间和较大的 PDF 文件。
作为示例,考虑以下 MWE。
\documentclass{article}
\usepackage{tikz}
\usepackage{animate}
\def\bouncerow#1#2{%
\begin{tikzpicture}[baseline=0pt]
\def\bounceball##1##2{%
+(0,{abs(cos( (##2) / (##1) * 180 ))}) circle[radius=.5ex]
}
\draw [line cap=round]
(0,0) \bounceball{1}{#2}
foreach \n in {2, ..., #1} {
coordinate (previous)
({(\n-1)*1em},0pt) \bounceball{\n}{#2}
coordinate (this)
(previous) -- (this)
};
% Make the bounding box fixed.
\path (-1ex,-1ex) rectangle ({(#1 - 1)*1em + 1ex},1cm+1ex);
\end{tikzpicture}%
}
\begin{document}
Here are some bouncing circles:
\begin{animateinline}[loop, autoplay]{24}%
\multiframe{144}{r=0+0.0417}{% We need 6*24 = 144 frames here.
\bouncerow 3\r
}%
\end{animateinline}
Here are lots of those circles:
\begin{animateinline}[loop, autoplay]{24}%
\multiframe{216}{r=0+0.0417}{% We would need 2520*24 = 60480 frames for this!
\bouncerow 9\r
}%
\end{animateinline}
\end{document}
\bouncerow{n}
绘制一排球,球体中心相连,以不同的频率弹跳。第一个球每秒弹跳一次,第二个球每隔一秒弹跳一次,依此类推。因此,第一排的弹跳(周期为 1 秒、2 秒和 3 秒)每 6 秒重复一次。我们可以轻松地为其制作动画。
但是对于第二行,有 9 个球,我们必须准备 42 分钟的动画!这显然是不可行的。
我希望理论上可以在使用 JavaScript 查看动画时进行必要的计算,这样可以消除编译开销并减少生成的 PDF 的文件大小。但是,我找不到任何关于如何执行此操作的文档(我能理解)。通过合理的工作量是否可行?我熟悉 TeX,过去也有一些使用 JavaScript 的经验,所以如果解决方案比较技术性,那也不是问题。
我目前发现的情况:
答案1
正如已经注意到的,pkganimate
制作的动画由快速连续播放的静态动画帧组成。与基于 SMIL 的 SVG 动画不同,单个图形对象无法单独制作动画。
根本原因可能是 Adobe 定义的 JavaScript for PDF 规范中缺少 Canvas 对象及其 DOM 表示。
因此,pkganimate
适合制作相对较短的动画序列。