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 #touying-fn-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 context expression, 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.