Typst 笔记
Typst 是一个成长中的 LaTeX 替代品
本文撰写于 0.11.1 版本发布时
更新于 0.12.0 发布后
一句话笔记
- 文件扩展名为 .typ
set par(spacing: ...)
可以设置段落间距import
会导入模块,include
会运行模块show
隐式使用了context
表达式,但不完全,见 https://typst.app/docs/reference/context/#1table
用于制作表格,grid
才是排版用的- 用
block
与box
设置clip: true
和inset
为负可以裁切里面的内容 contexual
的字段、方法或函数需要在上下文中访问- 如果函数的 位置参数 类型为
content
,则可以单独传入,比如enum(start: 4, [foo], [bar])
等效于enum(start: 4)[foo][bar]
类型、函数与元素
Typst 里的各种值都有其类型
- 部分类型有与类型同名的构造函数(
Constructor
),用于创建实例 - 而
bool
、none
等一些类型是单例化的 - 部分类型上会定义 静态方法 和 实例方法
- 部分实例支持访问字段,例如
dictionary
、module
content
类型对文档构成十分重要[]
(内容块)创建了一个content
实例content
是个很复杂的类型,可以通过fields()
实例方法看到实例构成
- 函数大多是纯函数,只有一部分实例方法有副作用
- 部分函数也兼作“模块”,其中定义了其它函数,比如
list.item()
- 部分函数是
contextual
的,代表它们需要在上下文中求值
element
是文档元素,例如文字(text
)、“图表”(figure
)element
往往是content
类型element
支持访问字段,我们只能访问在它被创建时传入element function
的同名参数
element function
是一种函数,能够创建element
element function
可以用于设定样式element function
支持访问字段,能访问的字段与函数的settable
参数一致,用于访问上下文
模式
编辑 Typst 文档时,会用到三种模式:文本、代码、数学,每种模式内的语法是不同的
模式间的切换
- Typst 文档的最父级为文本模式
- 可以从任意模式中进入任意其他模式
文本模式
- 内容块
[]
中为文本模式,文本模式中的[
与]
会被视作文本
代码模式
- 紧接着
#
之后会进入代码模式,代码模式中无法再次使用#
- 部分表达式(
+
、-
、=
……)需要在#
后用()
括起来才能被代码模式正确识别 ;
可用来分割表达式,例如#let a = 1; #a
与#{let b = 2; b -= 1}
- 代码模式会在
#
后紧接的表达式结束时自动退出,或通过 代码块{}
指定模式的作用范围
作用域
代码模式中,代码块{}
与 内容块[]
会构成 作用域
- 父级作用域内无法访问子级作用域内声明的变量
- 子级作用域内可以访问父级作用域内声明的变量
- 子级作用域内可以对父级作用域内声明的变量进行遮蔽(variable shadowing)
另外,由于函数皆为纯函数,所以想要在函数执行时修改变量,则必须通用这个变量的 实例方法 或者通过 state
数学模式
$$
之间为数学模式,用于书写公式- 数学模式中,
math
与sym
模块的内容可以不通过代码模式并无需模块名前缀便可访问 - 由于数学模式仅用于书写公式,故一部分的
content
不会正确渲染;见数学样式等
样式
我们设置 element
的样式,比如字体、行间距、页边距等等
按设置优先级从高到低,有以下三种方式:
- 通过
element function
创建element
,例如align(center, text(17pt)[text])
- 通过
show
表达式,查找替换该表达式之后且其所处作用域内的内容 - 通过
set
表达式设置样式上下文
上下文
文档中的一些值需要在实际渲染后才能得知,要想访问它们就需要用到上下文
上下文类似于一个 共享变量,分为样式上下文与位置上下文
上下文的最小变化单位是表达式,即在某个表达式修改上下文后,它紧接的下一个表达式访问的就已经是更新过的上下文了
样式上下文
element
会自动访问样式上下文,并更根据它设定自己的样式
样式上下文是有关作用域的,子级作用域的上下文复制自父级,故子级作用域内的上下文更新不影响父级
位置上下文
记录了文档中某个、某种实例的位置、数量信息
- 位置上下文通常会被自动更新
- 与样式上下文不同,它是否受作用域影响取决于实例的类型
访问上下文
有些表达式能够隐式访问上下文,例如上文提到的 content
、以及 show
的子表达式(其实也是 content
)等等
contextual
的函数需要处于context
表达式中才能被正确求值context
表达式会返回一个新实例,这个实例每次被访问都会根据所处上下文更新context
表达式会使其子表达式能且仅能够访问context
最近父级的上下文 来源