Typst 笔记

Typst 是一个成长中的 LaTeX 替代品

本文撰写于 0.11.1 版本发布时
更新于 0.12.0 发布后

一句话笔记

  • 文件扩展名为 .typ
  • set par(spacing: ...)可以设置段落间距
  • import 会导入模块,include 会运行模块
  • show 隐式使用了 context 表达式,但不完全,见 https://typst.app/docs/reference/context/#1
  • table 用于制作表格,grid 才是排版用的
  • blockbox 设置 clip: trueinset 为负可以裁切里面的内容
  • contexual 的字段、方法或函数需要在上下文中访问
  • 如果函数的 位置参数 类型为 content,则可以单独传入,比如 enum(start: 4, [foo], [bar]) 等效于 enum(start: 4)[foo][bar]

类型、函数与元素

Typst 里的各种值都有其类型

  • 部分类型有与类型同名的构造函数(Constructor),用于创建实例
  • boolnone 等一些类型是单例化的
  • 部分类型上会定义 静态方法实例方法
  • 部分实例支持访问字段,例如 dictionarymodule

  • 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

数学模式

  • $$ 之间为数学模式,用于书写公式
  • 数学模式中,mathsym 模块的内容可以不通过代码模式并无需模块名前缀便可访问
  • 由于数学模式用于书写公式,故一部分的 content 不会正确渲染;见数学样式

样式

我们设置 element 的样式,比如字体、行间距、页边距等等

按设置优先级从高到低,有以下三种方式:

  1. 通过 element function 创建 element,例如 align(center, text(17pt)[text])
  2. 通过 show 表达式,查找替换该表达式之后且其所处作用域内的内容
  3. 通过 set 表达式设置样式上下文

上下文

文档中的一些值需要在实际渲染后才能得知,要想访问它们就需要用到上下文

上下文类似于一个 共享变量,分为样式上下文与位置上下文

上下文的最小变化单位是表达式,即在某个表达式修改上下文后,它紧接的下一个表达式访问的就已经是更新过的上下文了

样式上下文

element 会自动访问样式上下文,并更根据它设定自己的样式

样式上下文是有关作用域的,子级作用域的上下文复制自父级,故子级作用域内的上下文更新不影响父级

位置上下文

记录了文档中某个、某种实例的位置、数量信息

  • 位置上下文通常会被自动更新
  • 与样式上下文不同,它是否受作用域影响取决于实例的类型

访问上下文

有些表达式能够隐式访问上下文,例如上文提到的 content、以及 show 的子表达式(其实也是 content)等等

  • contextual 的函数需要处于 context 表达式中才能被正确求值
  • context 表达式会返回一个新实例,这个实例每次被访问都会根据所处上下文更新
  • context 表达式会使其子表达式能且仅能够访问 context 最近父级的上下文 来源