复杂动画
得 益于 Polylux 提供的语法,我们同样能够在 Touying 中使用 only
、uncover
和 alternatives
。
回调风格的函数
为了避免上文提到的 styled
与 layout
限制,Touying 利用回调函数巧妙实现了总是能生效的 only
、uncover
和 alternatives
,具体来说,您要这样引入这三个函数:
#slide(repeat: 3, self => [
#let (uncover, only, alternatives) = utils.methods(self)
In subslide #self.subslide,
test #uncover("2-")[uncover] function,
and test #only("2-")[only] function,
#pause
and paused text.
])
注意到了吗?我们不再是传入一个内容块,而是传入了一个参数为 self
的回调函数,随后我们通过
#let (uncover, only, alternatives) = utils.methods(self)
从 self
中取出了 only
、uncover
和 alternatives
这三个函数,并在后续调用它们。
这里还有一些有趣的事实,例如 int 类型的 self.subslide
指示了当前 subslide 索引,而实际上 only
、uncover
和 alternatives
函数也正是依赖 self.subslide
实现的获取当前 subslide 索引。
我们手动指定了参数 repeat: 3
,这代表着显示 3 张 subslides,我们需要手动指定是因为 Touying 无法探知 only
、uncover
和 alternatives
需要显示多少张 subslides。
only
only
函数表示只在选定的 subslides 中「出现」,如果不出现,则会完全消失,也不会占据任何空间。也即 #only(index, body)
要么为 body
要么为 none
。
其中 index 可以是 int 类型,也可以是 "2-"
或 "2-3"
这样的 str 类型,更多用法可以参考 Polylux。
uncover
uncover
函数表示只在选定的 subslides 中「显示」,否则会被 cover
函数遮挡,但仍会占据原有。也即 #uncover(index, body)
要么为 body
要么为 cover(body)
。
其中 index 可以是 int 类型,也可以是 "2-"
或 "2-3"
这样的 str 类型,更多用法可以参考 Polylux。
您应该也注意到了,事实上 #pause
也使用了 cover
函数,只是提供了更便利的写法,实际上它们的效果基本上是一致的。
alternatives
alternatives
函数表示在不同的 subslides 中展示一系列不同的内容,例如
#slide(repeat: 3, self => [
#let (uncover, only, alternatives) = utils.methods(self)
#alternatives[Ann][Bob][Christopher]
likes
#alternatives[chocolate][strawberry][vanilla]
ice cream.
])
如你所见,alternatives
能够自动撑开到最合适的宽度和高度,这是 only
和 uncover
所没有的能力。事实上 alternatives
还有着其他参数,例如 start: 2
、repeat-last: true
和 position: center + horizon
等,更多用法可以参考 Polylux。