代码风格
简单风格
如果我们只是需要简单使用,我们可以直接在标题下输入内容,就像是在编写正常 Typst 文档一样。这里的标题有着分割页面的作用,同时我们也能正常地使用 #pause 等命令实现动画效果。
#import "@preview/touying:0.4.1": *
#let s = themes.simple.register()
#let (init, slides) = utils.methods(s)
#show: init
#let (slide, empty-slide) = utils.slides(s)
#show: slides
= Title
== First Slide
Hello, Touying!
#pause
Hello, Typst!
并且你可以使用空标题 == 创建一个新页,这个技巧也有助于清除上一个标题的继续应用。
PS:我们可以使用 #slides-end 记号来标志 #show: slides 的结束。
块风格
很多时候,仅仅使用简单风格并不能实现我们需要的所有功能,为了更强大的功能和更清晰的结构,我们同样可以使用 #slide[...] 形式的块风格,其中 #slide 函数需要使用 #let (slide, empty-slide) = utils.slides(s) 语法进行解包,才能正常在 #show: slides 后使用。
例如上面的例子就可以改造成
#import "@preview/touying:0.4.1": *
#let s = themes.simple.register()
#let (init, slides) = utils.methods(s)
#show: init
#let (slide, empty-slide) = utils.slides(s)
#show: slides
= Title
== First Slide
#slide[
Hello, Touying!
#pause
Hello, Typst!
]
以及 #empty-slide[] 可以创建一个没有 header 和 footer 的空 Slide。
这样做的好处有很多:
- 很多时候,我们不只是需要默认的
#slide[...],还需要#focus-slide[...]这些特殊的slide函数; - 不同主题的
#slide[...]函数可能有比默认更多的参数,例如 university 主题的#slide[...]函数就会有着subtitle参数; - 只有
slide函数才可以通过回调风格的内容块来使用#only和#uncover函数实现复杂的动画效果。 - 能有着更清晰的结构,通过辨别
#slide[...]块,我们可以很容易地分辨出 slides 的具体分页效果。
约定优于配置
你可能注意到了,在使用 simple 主题时,我们使用一级标题会自动创建一个 section slide,这是因为 simple 主题注册了一个 s.methods.touying-new-section-slide 方法,因此 touying 会默认调用这个方法。
如果我们不希望它自动创建这样一个 section slide,我们可以将这个方法删除:
#import "@preview/touying:0.4.1": *
#let s = themes.simple.register()
#(s.methods.touying-new-section-slide = none)
#let (init, slides) = utils.methods(s)
#show: init
#let (slide, empty-slide) = utils.slides(s)
#show: slides
= Title
== First Slide
Hello, Touying!
#pause
Hello, Typst!
如你所见,这样就只会剩下两页,而默认的 section slide 就会消失了。
同理,我们也可以注册一个新的 section slide:
#import "@preview/touying:0.4.1": *
#let s = themes.simple.register()
#(s.methods.touying-new-section-slide = (self: none, section, ..args) => {
self = utils.empty-page(self)
(s.methods.touying-slide)(self: self, section: section, {
set align(center + horizon)
set text(size: 2em, fill: s.colors.primary, style: "italic", weight: "bold")
section
}, ..args)
})
#let (init, slides, touying-outline) = utils.methods(s)
#show: init
#let (slide, empty-slide) = utils.slides(s)
#show: slides
= Title
== First Slide
Hello, Touying!
#pause
Hello, Typst!
同样地,我们也可以修改 s.methods.touying-new-subsection-slide 来对 subsection 做同样的事。
实际上,除了 s.methods.touying-new-section-slide,另一个特殊的 slide 函数就是 s.methods.slide 函数,它会在简单风格里没有显示使用 #slide[...] 的情况下默认被调用。
同时,由于 #slide[...] 被注册在了 s.slides = ("slide",) 里,因此 section,subsection 和 title 参数会被自动传入,而其他的如 #focus-slide[...] 则不会自动传入这三个参数。
实际上,你也可以不使用 #show: slides 和 utils.slides(s),而是只使用 utils.methods(s),例如
#import "@preview/touying:0.4.1": *
#let s = themes.simple.register()
#let (init, touying-outline, slide) = utils.methods(s)
#show: init
#slide(section: [Title], title: [First Slide])[
Hello, Touying!
#pause
Hello, Typst!
]
这时候需要手动传入 section、subsection 和 title,但是会有更好的性能,适合需要更快的性能的情况,例如超过数十数百页的情形。