这是一篇关于 Typst 编程语言的深入研究文章,涵盖了以下主要内容:
- Typst 概述:它是现代排版系统,可大致分为编程语言和布局引擎两部分,本文主要研究其编程语言。基本使用方式类似 Markdown 加上在
$
内写数学公式,有三种模式:Markup Mode(默认模式)、Math Mode 和 Code Mode。 值类型:
- Content:最常见的值类型,是 Markup Mode 或 Math Mode 下写入的内容,最终会被渲染。有内置函数如
emph
可用于处理内容。 - Primitive Values:包括
none
、布尔值、整数、浮点数、字符串、长度、角度、分数、比率、相对值、颜色等。字符串与内容不同,需在 Code Mode 下构造。值在用于 Content 时会被隐式转换为 Content。 - Compound Values:有数组(用括号表示,通过
.at()
访问和修改)和字典(用括号表示,用冒号分隔键值)两种,Typst 的数组是可增长数组,字典是哈希表。 - User-Defined Types:Typst 不支持用户定义类型,但有函数和模块两种抽象形式。
- Content:最常见的值类型,是 Markup Mode 或 Math Mode 下写入的内容,最终会被渲染。有内置函数如
- 控制流:规则简单,有运行时错误且不可捕获,包含
if
、while
、for
、return
、break
、continue
等常见控制流结构,and
和or
也可用于控制流,类似于if
。for
循环可用于执行变异和连接内容。 抽象:
- Functions:用
let
语法定义,有三种参数类型,可通过在函数参数后加[...]
将内容作为最后一个参数传递,函数可隐式返回多个内容。 - Modules:将模块与文件合并,有三种“导入”模块的方式,但模块中的
let
语句默认都是公共的,没有公共/私有标记,不过可通过特定模式隐藏实现细节。
- Functions:用
- 变异:讨论了 Typst 中关于变异的一些情况,如循环、迭代器失效、全局可变变量、函数参数变异等,Typst 有值语义,使用“copy-on-write”实现,虽有优势但性能不可预测。
独特功能:
- 大量样式选项:通过带有默认值的参数来组织和配置文本样式等,还有其他隐式函数如
heading()
、enum()
等可配置样式。 - 持久设置:用
set
改变内置元素函数的默认参数值,set
不会“泄漏”,有特定的作用域和优先级规则。 - 超越内置参数:用
show
回调来处理未被内置参数覆盖的情况,可精确控制元素的渲染,但show
较为复杂,有特定的作用域规则。 - 微调元素:通过
show
可对元素进行微调,如在标题周围添加小花,但可能会遇到一些问题,如与其他元素的交互等。
- 大量样式选项:通过带有默认值的参数来组织和配置文本样式等,还有其他隐式函数如
建议:
- 更强大的 Show:允许
show
语句应用于元素函数的参数,以更方便地进行微调。 - 私有模块项:建议引入
export
关键字来标记模块中的公共项,避免抽象泄漏。 set
和show
用于用户定义函数:希望set
和show
能用于用户定义函数,以更好地分离内容和表现。
- 更强大的 Show:允许
- 结论:对 Typst 的设计印象深刻,其语言简洁,值语义使其易于调试,有处理排版复杂问题的特性,是一个很好的排版系统编程语言。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。