Typst 取得重大进展
摘要
Typst,一个定位为 LaTeX 替代品的排版系统,发布了版本 0.15,包含新功能,支持可变字体、MathML 和多个参考文献列表。
<p><a href="https://lobste.rs/s/j4oyxa/typst_makes_big_strides">评论</a></p>
查看缓存全文
缓存时间: 2026/09/18 13:50
# Typst 迈出大步
来源:https://lwn.net/Articles/1092993/
> **LWN 订阅者福利**
> 订阅 LWN (https://lwn.net/Promo/nst-nag5/subscribe) 的主要益处是支持我们持续出版,但除此之外,订阅者可以立即访问网站所有内容并使用多种额外功能。请立即注册!
Typst (https://typst.app/) 是一个将文档排版为多种格式(PDF、SVG、PNG,以及开发中的 HTML)的系统。它擅长处理技术材料,常被视为 LaTeX (https://www.latex-project.org/) 的潜在替代品。我们上次关注 Typst (https://lwn.net/Articles/1037577/) 是一年前,当时其版本为 0.13。新版本 0.15 于六月发布 (https://typst.app/blog/2026/typst-0.15/),包含大量新功能 (https://typst.app/docs/changelog/0.15.0/),如支持变量字体、MathML、多参考文献等。Typst 是免费、采用 Apache-2.0 许可的软件,使用 Rust 编程。
#### 变量字体
Typst 现已支持变量字体 (https://developer.mozilla.org/en-US/docs/Web/CSS/Guides/Fonts/Variable_fonts)。大多数字体以包含不同字重(如常规、粗体、斜体等)的文件集形式分发。字体领域的新进展是变量字体的出现,它们能在单个文件中包含所有变体。这既节省空间,又可为作者或设计者提供更大灵活性。字体特性和变体通过设置“轴”值来选择;每个轴改变渲染字形的某个方面。通常有多个轴可具有离散值(用于开关各种特性)或介于两个限制之间的连续值。后者可用于在连续体上选择字体字重。
为测试 Typst 新功能,我下载了两款开源变量字体:Roboto Flex (https://v-fonts.com/fonts/roboto-flex)(具有 13 个轴的通用字体)和 Zycon (https://v-fonts.com/fonts/zycon)(不含字母但包含 17 个装饰性小图像的字体)。Zycon 的六个连续轴能平滑改变图像的各个方面,使其适用于动画。以下是使用这两款字体的 Typst 文档示例,分别调整了它们的一个轴:
```
#set text(font:"Roboto Flex")
#for n in (-305, -200, -98) {
set text(variations:("YTDE": n))
[A penguin jumped quietly.]
}
#set text(font:"Zycon")
#for n in array.range(0, 10, inclusive:true) {
set text(variations:("M1 ": n/10))
str.from-unicode(127773)
}
```
在 Typst 中,“#”字符将文档置于“代码模式”,该行或块的其余部分被解释为 Typst 内置语言的代码。在代码模式中,方括号内的内容被视为“文本模式”或待排版文本。上述代码包含两个通过 `text()` 函数选项设置字体的命令。随后是循环结构,其行为符合预期。循环内我们调用 `text()` 函数设置 `variations` 变量。Roboto Flex 字体使用的文本直接输入,而 Zycon 字体输出的是单个字符 (https://www.fileformat.info/info/unicode/char/1f31d/index.htm),通过 `str.from-unicode()` 函数指定。该字符本可直接输入,但读者可能因浏览器字体覆盖范围无法看到。
我们调整的 Roboto Flex 轴名为 YTDE。如下图所示,该轴决定字体下伸部 (https://www.designyourway.net/blog/what-are-ascenders-and-descenders/) 的长度,同时保持其他特性不变。这在排版表格时可能有用,可避免下伸部与单元格边界冲突。Zycon 的六个轴之一名为“M1”(两个尾随空格是名称的一部分;所有轴名均含四个字符),对不同字符产生不同效果。对月亮字形的作用是改变月相。
使用 `typst compile vfont.typ` 编译此文档会生成 `vfont.pdf`,如下图所示:
> ![[变量字体]](https://static.lwn.net/images/2026/typst-varfont.png)
#### MathML
HTML 导出仍是 Typst 的实验性功能,但此版本显示出显著进展。主要的新 HTML 功能是将数学公式翻译为 MathML (http://www.w3.org/Math/)。之前关于 Typst 的文章展示了某个定积分的标记,并显示了其由 Typst 渲染为 PDF 的输出。相同的 Typst 代码渲染为 HTML 时,会生成一长串 MathML 标记,几乎所有现代网络浏览器都能解释。结果如下:
∫₀¹ (arcsin x)² dx / (x² √(1−x²)) = π ln 2
若看不到上述公式,说明您的浏览器不支持 MathML。若能看到,与之前文章中的排版公式对比,PDF 和 HTML 输出本质上相同。
能在网络浏览器中使用 Typst 生成 TeX 质量的数学公式,无需依赖 MathJax (https://www.mathjax.org/) 等 JavaScript 库或转而使用图像,这对科学交流大有裨益。
要启用实验性 HTML 输出,Typst 需要特殊标志:
```
typst c --features html integral.typ integral.html
```
此命令用于将 `integral.typ` 文件中的方程标记排版为 HTML。
#### “捆绑”输出
Typst 等软件的典型用例是创建单个文件(通常为 PDF 格式的论文或书籍)。新的“捆绑”功能 (https://typst.app/docs/reference/bundle/) 允许作者在单个源文件中指定多个输出文件(可采用 Typst 支持的任何格式)。这些文件可共享数据,并包含文档内及文档间链接。该功能非常适合创建网站(由相互链接的 HTML 文件网络组成),也适用于希望从单个源文件生成会议演讲幻灯片及相关预印本的学者。
以下是创建三个相互链接文档(两个 HTML 页面和一个 PDF)的 Typst 文件简单示例,它们共享一段文本:
```
#let text = ['Twas brillig, and the slithy toves
Did gyre and gimble in the wabe:]
#document("poems.html", title: [Famous Poems])[
#link()[Here] is a famous nonsense poem.]
#document("jabberwocky.html", title: [Jabberwocky by Lewis Carroll])[
This famous poem begins like this: #text
The #link()[rest] of the poem. Go #link()[home].]
#document("jabberwocky.pdf", title: [Jabberwocky: the Complete Poem])[
#text .... Go #link()[home].]
```
若此代码保存为 `bundle.typ`,处理命令为:
```
typst c --features html,bundle --format bundle bundle.typ
```
在我的测试中,捆绑功能按预期工作,但由于它与 HTML 输出仍被视为开发中功能,编译器需要 `--features` 标志。上述命令会创建一个名为“bundle”的新目录,包含 `#document()` 函数中定义的三个文件。它们都包含存储在 `text` 变量中的诗歌前两行。HTML 页面间、HTML 页面与 PDF 之间、以及 PDF 返回双页网站均设有超链接。链接目标通过每个文档函数后的尖括号内的标签指定。
#### 多参考文献
Typst 现在允许在单个文档中包含多个参考文献 (https://typst.app/docs/reference/model/bibliography/),这是备受期待的功能。其典型应用是为每章需要单独参考文献的书籍。通过一个简单示例介绍:
```
#show bibliography: set text(size: 8pt)
= Chapter I
According to @smith, Smith is uncommonly smart.
#bibliography("works.bib", title: "References for Chapter I", group: none)
= Chapter II
Jones@jones has a different view. The issue was finally put to rest in the following year in @mergutroid.
#bibliography("works.bib", title: "References for Chapter II", group: none)
```
首行指定参考文献应使用比正文默认更小的字体。正文中,“@”前缀创建采用默认方括号数字格式的引用。每章末尾调用 `bibliography()` 函数。其第一个参数指定参考文献信息使用的数据库;每个参考文献部分可使用不同的数据库或数据库集合(若需要)。`group` 参数控制引用编号方式。`none` 值使编号在每部分从 1 开始;也可选择在整个作品中连续编号或按任意分组编号。
下图显示了该代码在 PDF 中的输出效果:
> ![[参考文献]](https://static.lwn.net/images/2026/typst-biblios.png)
#### 多 PDF 标准
通常,避免使用专有扩展足以确保 Typst、LaTeX 或其他合格软件创建的 PDF 实现该格式的承诺:文档可在所有阅读器中打开且外观一致(现在和未来均如此)。然而在更深层面,PDF 并非单纯的 PDF。存在多种 PDF 版本,其上还有数十个与可存档性和可访问性相关的正式标准。可存档性标准旨在确保文档能在各种阅读器软件中正常工作,并将永远如此。可访问性标准涉及 PDF 对各类残障人士的可用性。
Typst 已能针对各种 PDF 版本及存档或可访问性标准。新功能是在编译文档时可选择多个目标标准。这很有用,因为可能需要生成同时具有存档和可访问性属性的 PDF。该功能的实现通过警告或错误信息帮助作者在组合不兼容或未遵循目标标准最佳实践时做出判断。
例如,以下命令尝试编译上一节的“book”文档,要求 PDF 1.7 版本和 A-1b 存档标准:
```
typst c --pdf-standard 1.7,a-1b book.typ
```
Typst 编译器返回错误信息:
```
error: PDF 1.7 is not compatible with PDF/A-1b
hint: PDF/A-1b requires version PDF 1.4
```
PDF 1.7 与 A-2b 兼容,因此以下命令可行:
```
typst c --pdf-standard 1.7,a-2b book.typ
```
但若添加 UA-1 可访问性标准,如下:
```
typst c --pdf-standard 1.7,a-2b,ua-1 book.typ
```
则再次出错:
```
error: PDF/UA-1
error: missing document title
hint: set the title with `set document(title: [...])`
```
通常 Typst 编译器不强制要求语法正确以外的条件,但若指定特定可访问性标准,文档必须符合该标准。UA-1 要求文档包含标题等多项内容。
上述内容看似深奥,但可能对典型科学论文或教科书作者关联甚少。这些细节对档案管理员和出版商至关重要;除了帮助残障用户,生成可访问 PDF 在美国和许多其他国家/地区是州和联邦政府的法律要求。Typst 对多 PDF 标准的高级处理使其在这些场景中成为实用工具。
#### 结语
Typst 0.15 还有其他未在本文详述的增强功能,包括专色 (https://typst.app/docs/reference/visualize/color/#definitions-spot) 支持、解释编译过程收敛失败 (https://typst.app/blog/2026/typst-0.15#convergence-diagnostics) 的详细诊断 (https://github.com/typst/typst/pull/7364),以及内置脚本语言的新 map 和 filter 函数 (https://typst.app/docs/reference/foundations/dictionary/#definitions-filter)。已更新至新版本的文档现以 26MB PDF 形式提供 (https://github.com/typst/typst/releases/download/v0.15.0/typst-documentation.pdf)。
Typst 在 GitHub (https://github.com/typst/typst) 上开发,拥有 460 位贡献者。项目创建者撰写了新贡献者指南 (https://github.com/typst/typst/blob/main/CONTRIBUTING.md#contributing-to-typst),描述了 PR 应有的样子,并警告任何由 LLM 生成的代码或描述将被拒绝。他们也坦诚 Typst 既是开源项目也是一家公司,项目方向及个别贡献的适用性决策将考虑公司需求。潜在贡献者和用户应谨记此点。
该系统的开发进展令人印象深刻。用户社区热情高涨;他们的参与已将 Typst 生态系统扩展至超过 1500 个包 (https://typst.app/universe)。然而,出版界的网络效应阻碍 Typst 实现我们在之前文章中看到的潜力。尽管用户已设计出匹配多种期刊风格的模板,但要求源文件提交(而非仅 PDF)的期刊仍坚持使用 LaTeX、Word 或其他格式。极少期刊接受以 Typst 标记的手稿。只要 Typst 仍处于 1.0 之前的版本(这可能仍需一段时间 (https://laurmaedje.github.io/posts/evolving-typst/)),且可能面临对文档的显著破坏性更改,这种状况就不易改变。
尽管如此,Typst 今天仍是极其有用的工具。例如,我最近需创建 SVG 标志,发现使用 Typst 内置图形命令编写文本描述比使用绘图程序更快捷。尚无法断言 Typst 的优势是否会使其成为众多爱好者所称的“LaTeX 替代品”。但若开发持续当前势头,这极有可能实现,尽管可能需十年甚至二十年方能成熟。
---
**本文索引**
[访客文章](https://lwn.net/Archives/GuestIndex/)
Phillips, Lee (https://lwn.net/Archives/GuestIndex/#Phillips_Lee)
相似文章
Typst 0.15 包含众多新内容
Typst 0.15 是开源排版系统的一个重要版本,引入了对可变字体、MathML 导出、多文件输出、多个参考文献列表和多个 PDF 标准的支持,同时还改进了文档和诊断功能。
Typst 0.15.0
Typst 0.15.0 引入了可变字体、带 MathML 的 HTML 导出、多文件导出、多参考文献、PDF 标准定位以及许多其他改进。
Jektex 0.2.0 – 用于LaTeX渲染的Jekyll插件现在速度提升约10倍
Jektex 0.2.0 是一个用于服务器端LaTeX渲染的Jekyll插件,相比之前版本速度提升约10倍,并支持缓存和宏功能。
Rheo 0.4.0
Rheo 0.4.0 是一个文档基础设施工具的更新,它能够从 Typst 源文件实现多格式发布(PDF、HTML、EPUB)。
TeXFix-Bench: An Empirically Grounded Multi-Format Benchmark for LLM-Based Document Source Repair
Presents TeXFix-Bench, a multi-format benchmark for LLM-based document source repair, grounded in a mined fault taxonomy across LaTeX, Typst, and Markdown. Benchmarks seven LLMs with 48,651 attempts, showing compile success alone overstates repair quality.