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是一种函数,能够创建elementelement 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最近父级的上下文 来源