札记(一)——插入动画
⚠新坑警告
准备把学习LaTeX过程中探索到的一些有用的、好玩的方法都记录下来。
同时还有新坑:“MATLAB札记”
引入
记得在刚开学的时候,看到一个信号老师公众号,分享了一个其他学校的信号幻灯片。那篇文章的主旨不是讲那个幻灯片怎么样,但我一看发现是用写的,居然还说有动画,我就在想这是怎么实现的呢?生成的不都是PDF嘛,怎么会动呢?但是我依稀记得,Adobe Acrobat是可以导入swf动画的,所以应该是可以实现的。当时没多想,直到……
做电磁场实验的时候实验3、4,其实都是动态的过程,一个是电磁波的透射与反射实验、还有一个是电磁波的极化。虽然题目要求的是截三张图即可,但是我还是想试试,在PDF里怎么搞个动画,所以就有了这篇文章。
总体大概是这么些步骤:
Step 0:获得一组动画
Step 1:转图片格式
Step 2:在导言区引入
animate
Step 3:在正文中使用
animate
创建动画
前期准备——转图片格式
Step 0:获得一组动画
这个前期准备可能会是MATLAB札记的第一篇文章,会谈谈怎么从MATLAB中导出GIF动画。
假设我们已经获得了一个GIF动画,或者获得了一组视频,这是前提条件。
Step 1:转图片格式
需要注意的是,在中使用animate宏包
插入的实际上是一组带编号的图像序列,而非是真正意义上的GIF动画或者视频。
分不同的格式,可以用两种方法来解决。
GIF转图片序列
这里使用的软件叫做 ImageMagick ,这是一个开源软件,但是他是使用命令行指令进行操作的。
安装好 ImageMagick
之后,我们就可以用它提供的 convert
命令将 GIF 格式的动图逐帧地切分成一系列图片了。假设你的目标图片是 lab031.gif
,那么使用如下命令可以得到一系列图片:lab031-0.png
, lab031-1.png
, lab031-2.png
, …
1 | magick convert lab031.gif -coalesce lab031.png |
值得注意的是,在使用这条指令的时候需要先将命令行定位到GIF动画所在的文件夹目录下,不然也找不到啊。
这样我们就从GIF获得了图片序列。
视频转图片序列
关于为什么会出现视频格式:在实验四中,我制作了一个GUI界面,但是GUI界面我并没有找到可以内部录制GIF动画的较好的方法,所以这里只好先录屏,再转图片序列咯。当然还可以再多一步,视频->GIF(用格式工厂)->图片序列(用上面的方法)。
这里我使用的是Pr软件。虽然Pr很不稳定,但是还是能用的。这边的操作不复杂,基本不用担心电脑会不会炸。
-
菜单栏:文件->导出->
媒体
-
格式
中选择PNG,预设
不用管 -
下面
视频
选项中,可以在看得清画面的情况将宽,高调的尽量小,防止导出的PNG序列质量太高,导致最终整个PDF的大小太大。 -
还是
视频
选项中,把帧速率设的尽量小,比如我1分半钟的视频,帧速率为1,导出的PNG序列就是90张,过多的图片可能会使PDF中的动画变得更流畅,但是带来的问题就是它的大小会很大。(❗值得注意的是,Pr导出的图像即使画面尺寸不大,大小还是比较大的,所以需要注意一下图像质量和帧率的问题)
当然格式工厂的方法也是可行的,但格式工厂对于视频的质量压缩的实在是太多了。
关键步骤——animate宏包
的使用
Step 2:在导言区引入animate
和其它宏包一样,在 的导言区中使用 \usepackage[<options>]{animate}
即可引入 animate
宏包。
❗值得注意的是
- 必须在引入
animate
宏包之前,引入graphicx
宏包。 - 使用
animate
宏包创建动画,也需要两次编译(第一次创建 JavaScript 内容,第二次在具体位置插入内容),这是由于交叉引用导致的。
1 | % 在导言区插入以下代码 |
Step 3:在正文中使用animate
创建动画
animate
提供的 \animategraphics
语句用于在LaTeX中插入一组PNG序列。其基本应用形式为
1 | \animategraphics[<options>]{<frame rate>}{<file basename>}{<first>}{<last>} |
这个命令的使用其实和普通插入图片的指令\includegraphics
和插入小图的\subfigure
的应用场景是一致的。就是嵌套在figure
环境中使用。
各成分的含义:
-
<frame rate>
:帧速率,差不多就是帧率的意思,即一秒钟多少张PNG -
<file basename>
:图片序列前缀 -
<first>
和<last>
:图片序列序号范围- ❗使用 ImageMagick和Pr导出的图片序列编号类型并不一样,但是无伤大雅。ImageMagick导出的是自然数编号(例如1-90),而Pr导出的是固定位数编号(例如00-90,或者000-121)之类的。填写这两个{}内容是尊重事实即可,不需要做出调整。
-
<options>
:可选项(摘自参考文献2,见下面叙述)
部分可选项
只能用于接口的选项
这里的接口指的是
animate
宏包提供的用户接口。例如我们已经见过的\animategraphics
命令,以及下一节会介绍的animateinline
环境。
label=<label text>
:为animate
对象指定唯一的标签,可用于之后的 JavaScript 控制。
every=<num>
:只为每个第<num>
帧构建动画,而忽略剩余的帧。二者皆适用的选项
type=<type name>
:使用指定的图片类型(而不按照前面提到的顺序搜索)。
poster[= first | <num> | last | none]
:指定用于打印和默认展示的动画帧,默认是第一帧。
autopause
:当动画所在页不再呈现时,自动暂停动画。
autoresume
:当被暂停的动画重新呈现时,自动恢复播放。
autoplay
:当动画所在页在 PDF 阅读器中呈现时,自动播放动画。
loop
:播放到最后一帧时,从第一帧开始继续播放;如此往复。
palindrome
:播放到最后一帧时,逐帧倒退;如此往复。
step
:忽略frame rate
,只在每次点击鼠标时播放一帧。
width=<h-size>, height=<v-size>, totalheight=<v-size>, keepaspectratio
:按绝对长度缩放动画的大小。
scale=<factor>
:按比例缩放动画的大小。
controls
:展示用于控制动画的按钮。
begin=<begin content>
例子(来自电磁场实验3)
1 | % 导言区引用以下代码 |
这段代码表示帧率为24帧每秒,它的文件来源于图片目录下的lab032文件夹中lab032-
为前缀的图片序列,共有0-361总共362张图组成。同时,它具有自动播放、重复播放、具有控制按钮这三个选项,同时所占页宽为0.7倍页宽。下面三张图体现了从GIF到PNG序列再到中文件的变化。
(这个格式工厂转的有点问题)
下面这一排按钮不出意外的话,分别表示⏮回到开头,⏪上一帧,⏸暂停(长按才行,不然只会顿一下),⏩下一帧,⏭最后一帧,后三个按钮分别是➖降低帧率、🔛恢复设定的帧率、➕提高帧率。
一些注意事项
-
这个功能稍有点复杂,但是应用起来的效果还是很不错的。但是这个功能还是很鸡肋的。这个需要支持Javascript的PDF阅读器,网上整理的有这些
-
Adobe Acrobat / Reader
-
PDF-XChange
-
Foxit Reader
我目前主要使用的是Adobe Acrobat DC,所以打开没问题。但我vscode里环境配套的Sumatra PDF就根本无法播放这个动画。所以很大程度上只能自娱自乐。
还有同学指出福昕阅读器对于这个的支持也不是很好,一卡一卡的。还有人用iPad上的PDF Expert打开直接死机。所以不到迫不得已我也不会用。
-
-
这个功能用在制作Beamer过程中应该还是很不错的。可以在幻灯片中清楚的显示动画效果。
-
不是很推荐用格式工厂转,噪点奇多无比,可以试试网上的一些在线转换工具。
参考文献
- 林特斯9527.LaTeX 中插入GIF图片[EB/OL].https://www.cnblogs.com/LinTeX9527/p/11122268.html.2019-07-02/2020-05-12 .
- 始终.LaTeX 黑魔法(四):插入动画(animate 宏包教程)[EB/OL].https://liam.page/2017/08/10/importing-animate-in-LaTeX/.2017-08-10/2020-05-12.