创建自己的主题
使用 Touying 创建一个自己的主题是一件略显复杂的事情,因为我们引入了许多的概念。不过请放心,如果您真的用 Touying 创建了一个自己的主题,也许您就可以深切地感受到 Touying 提供的便利的功能的和强大的可定制性。您可以参考 主题的源代码,主要需要实现的就是:
- 自定义
register
函数,初始化全局单例s
; - 自定义
init
方法; - 自定义颜色主题,即修改
self.colors
成员变量; - 自定义
alert
方法,可选; - 自定义 header;
- 自定义 footer;
- 自定义
slide
方法; - 自定义特殊 slide 方法,如
title-slide
和focus-slide
方法; - 自定义
slides
方法,可选;
为了演示如何使用 Touying 创建一个自己的主题,我们不妨来一步一步地创建一个简洁美观的 Bamboo 主题。
修改已有主题
如果你想在本地修改一个 Touying 内部的 themes,而不是自己从零开始创建,你可以选择通过下面的方式实现:
- 将
themes
目录下的 主题代码 复制到本地,例如将themes/university.typ
复制到本地university.typ
中。 - 将
university.typ
文件顶部的#import "../xxx.typ"
命令全部移除。 - 向
university.typ
文件顶部中加入#import "@preview/touying:0.3.3": *
来导入所有模块。 - 将
register
函数中的self: s
替换成self: themes.default.register()
(重要)。
然后就可以通过
#import "@preview/touying:0.3.3": *
#import "university.typ"
#let s = university.register(aspect-ratio: "16-9")
的方式导入和使用主题了。
一个具体的示例:https://typst.app/project/rqRuzg0keo_ZEB5AdxjweA
导入
取决于这个主题是你自己的,还是 Touying 的一部分,你可以用两种方式导入:
如果只是你自己使用,你可以直接导入 Touying:
#import "@preview/touying:0.3.3": *
如果你希望这个主题作为 Touying 的一部分,放置在 Touying themes
目录下,那你应该将上面的导入语句改为
#import "../utils/utils.typ"
#import "../utils/states.typ"
#import "../utils/components.typ"
并且要在 Touying 的 themes/themes.typ
里加上
#import "bamboo.typ"
register 函数和 init 方法
接下来,我们会区分 bamboo.typ
模板文件和 main.typ
文件,后者有时会被省略。
一般而言,我们制作 slides 的第一步,就是确定好字体大小和页面长宽比,因此我们需要注册一个初始化方法:
// bamboo.typ
#import "@preview/touying:0.3.3": *
#let register(
self: themes.default.register(),
aspect-ratio: "16-9",
) = {
self.page-args += (
paper: "presentation-" + aspect-ratio,
)
self.methods.init = (self: none, body) => {
set text(size: 20pt)
body
}
self
}
// main.typ
#import "@preview/touying:0.3.3": *
#import "bamboo.typ"
#let s = bamboo.register(aspect-ratio: "16-9")
#let (init, slides, touying-outline, alert) = utils.methods(s)
#show: init
#show strong: alert
#let (slide, empty-slide) = utils.slides(s)
#show: slides
= First Section
== First Slide
#slide[
A slide with a title and an *important* information.
]
如您所见,我们创建了一个 register
函数,并传入了一个 aspect-ratio
参数来设定页面长宽比。我们使用 self: themes.default.register()
的方式,获得了缺省的 self
。然后我们就需要设置页面参数了。您应该已经知道了,在 Touying 中,我们不应该使用 set page(..)
来设置页面参数,而是应该使用 self.page-args += (..)
这种语法来设置,具体内容可以参考页面布局章节。
除此之外,我们还注册了一个 self.methods.init
方法,它可以用来进行一些全局的样式设置,例如在此处,我们加上了 set text(size: 20pt)
来设置文字大小。你也可以在这里放置一些额外的全局样式设置,例如 set par(justify: true)
等。由于 init
函数被放置到了 self.methods
里,是一个方法,而非普通函数,因此我们需要加上 self: none
参数才能正常使用。
如您所见,后续在 main.typ
中,我们会通过 #show: init
来应用 init
方法里面的全局样式设置,其中 init
函数是通过 utils.methods(s)
绑定并解包而来的。
如果您多加注意,您会发现 register
函数最后有一行独立的 self
,这其实是代表了将修改后的 self
作为返回值返回,后续会被保存在 #let s = ..
中,因此这一行是不可或缺的。
颜色主题
为您的 slides 挑选一个美观的颜色主题,是做好 一个 slides 的关键所在。Touying 提供了内置的颜色主题支持,以尽量抹平不同主题之间的 API 差异。Touying 提供了两个维度的颜色选择,第一个维度是 neutral
、primary
、secondary
和 tertiary
,用于区分色调,其中最常用的就是 primary
主题色;第二个维度是 default
、light
、lighter
、lightest
、dark
、darker
、darkest
,用于区分明度。
由于我们是 Bamboo 主题,因此这里的主题色 primary
我们挑选了一个与竹子相近的颜色 rgb("#5E8B65")
,并加入了中性色 neutral-lightest
,neutral-darkest
,分别作为背景色和字体颜色。
正如下面的代码所示,我们可以使用 self = (self.methods.colors)(self: self, ..)
方法修改颜色主题。其本质就是 self.colors += (..)
的一个包装。
#let register(
self: themes.default.register(),
aspect-ratio: "16-9",
) = {
// color theme
self = (self.methods.colors)(
self: self,
primary: rgb("#5E8B65"),
neutral-lightest: rgb("#ffffff"),
neutral-darkest: rgb("#000000"),
)
self.page-args += (
paper: "presentation-" + aspect-ratio,
)
self.methods.init = (self: none, body) => {
set text(size: 20pt)
body
}
self
}
像这样添加了颜色主题后,我们就可以通过 self.colors.primary
这样的方式获取到这个颜色。
并且有一点值得注意,用户可以随时在 main.typ
里通过
#let s = (s.methods.colors)(self: s, primary: rgb("#3578B9"))
这样的方式修改主题色,其中这句语句需要放在 register()
之后,以及 utils.methods(s)
之前。
这种随时更换颜色主题的内容,正是 Touying 强大可定制性的体现。