贾斯汀·庞布里奥

这是一篇关于 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 不支持用户定义类型,但有函数和模块两种抽象形式。
  • 控制流:规则简单,有运行时错误且不可捕获,包含ifwhileforreturnbreakcontinue等常见控制流结构,andor也可用于控制流,类似于iffor循环可用于执行变异和连接内容。
  • 抽象

    • Functions:用let语法定义,有三种参数类型,可通过在函数参数后加[...]将内容作为最后一个参数传递,函数可隐式返回多个内容。
    • Modules:将模块与文件合并,有三种“导入”模块的方式,但模块中的let语句默认都是公共的,没有公共/私有标记,不过可通过特定模式隐藏实现细节。
  • 变异:讨论了 Typst 中关于变异的一些情况,如循环、迭代器失效、全局可变变量、函数参数变异等,Typst 有值语义,使用“copy-on-write”实现,虽有优势但性能不可预测。
  • 独特功能

    • 大量样式选项:通过带有默认值的参数来组织和配置文本样式等,还有其他隐式函数如heading()enum()等可配置样式。
    • 持久设置:用set改变内置元素函数的默认参数值,set不会“泄漏”,有特定的作用域和优先级规则。
    • 超越内置参数:用show回调来处理未被内置参数覆盖的情况,可精确控制元素的渲染,但show较为复杂,有特定的作用域规则。
    • 微调元素:通过show可对元素进行微调,如在标题周围添加小花,但可能会遇到一些问题,如与其他元素的交互等。
  • 建议

    • 更强大的 Show:允许show语句应用于元素函数的参数,以更方便地进行微调。
    • 私有模块项:建议引入export关键字来标记模块中的公共项,避免抽象泄漏。
    • setshow用于用户定义函数:希望setshow能用于用户定义函数,以更好地分离内容和表现。
  • 结论:对 Typst 的设计印象深刻,其语言简洁,值语义使其易于调试,有处理排版复杂问题的特性,是一个很好的排版系统编程语言。
阅读 4
0 条评论