Complex Animations
Thanks to the syntax provided by Polylux, we can also use only
, uncover
, and alternatives
in Touying.
Mark-Style Functions
We can use mark-style functions, which are very convenient to use.
At subslide #utils.touying-wrapper((self: none) => str(self.subslide)), we can
use #uncover("2-")[`#uncover` function] for reserving space,
use #only("2-")[`#only` function] for not reserving space,
#alternatives[call `#only` multiple times \u{2717}][use `#alternatives` function #sym.checkmark] for choosing one of the alternatives.
However, this does not work in all cases, for example if you put uncover
into the layout function like grid
function, you will get an error.
Callback-Style Functions
To overcome the limitations of layout functions mentioned earlier, Touying cleverly implements always-effective only
, uncover
, and alternatives
using callback functions. Specifically, you need to introduce these three functions as follows:
#slide(repeat: 3, self => [
#let (uncover, only, alternatives) = utils.methods(self)
At subslide #self.subslide, we can
use #uncover("2-")[`#uncover` function] for reserving space,
use #only("2-")[`#only` function] for not reserving space,
#alternatives[call `#only` multiple times \u{2717}][use `#alternatives` function #sym.checkmark] for choosing one of the alternatives.
])
Notice that we no longer pass a content block but instead pass a callback function with a self
parameter. Later, we extract only
, uncover
, and alternatives
functions from self
using:
#let (uncover, only, alternatives) = utils.methods(self)
We then call these functions in subsequent steps.
Here's an interesting fact: the self.subslide
of type int indicates the current subslide index, and in fact, the only
, uncover
, and alternatives
functions rely on self.subslide
to determine the current subslide index.
We manually specify the repeat: 3
parameter, indicating the display of 3 subslides. We need to do this manually because Touying cannot infer how many subslides only
, uncover
, and alternatives
should display.
only
The only
function means it "appears" only on selected subslides. If it doesn't appear, it completely disappears and doesn't occupy any space. In other words, #only(index, body)
is either body
or none
.
The index can be an int type or a str type like "2-"
or "2-3"
. For more usage, refer to Polylux.
uncover
The uncover
function means it "displays" only on selected subslides; otherwise, it will be covered by the cover
function but still occupies the original space. In other words, #uncover(index, body)
is either body
or cover(body)
.
The index can be an int type or a str type like "2-"
or "2-3"
. For more usage, refer to Polylux.
You may also have noticed that #pause
actually uses the cover
function, providing a more convenient syntax. In reality, their effects are almost identical.
alternatives
The alternatives
function displays a series of different content in different subslides. For example:
#slide(repeat: 3, self => [
#let (uncover, only, alternatives) = utils.methods(self)
#alternatives[Ann][Bob][Christopher]
likes
#alternatives[chocolate][strawberry][vanilla]
ice cream.
])
As you can see, alternatives
can automatically expand to the most suitable width and height, a capability that only
and uncover
lack. In fact, alternatives
has other parameters, such as start: 2
, repeat-last: true
, and position: center + horizon
. For more usage, refer to Polylux.