Typst 0.15 包含众多新内容

Lobsters Hottest 工具

摘要

Typst 0.15 是开源排版系统的一个重要版本,引入了对可变字体、MathML 导出、多文件输出、多个参考文献列表和多个 PDF 标准的支持,同时还改进了文档和诊断功能。

<p><a href="https://lobste.rs/s/fkoa80/typst_0_15_contains_multitudes">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/06/15 19:01

# Typst: Typst 0.15 包罗万象 – Typst 博客 来源:https://typst.app/blog/2026/typst-0.15 **在相同字体的无数实例、多文件输出、多个参考文献以及同时支持多种 PDF 标准之间,Typst 0.15 完全关乎多重性。** Typst 0.15 是我们迄今为止最新且最大的版本,它带来了长期渴求的可变字体支持,通过 MathML 和多文件支持进一步推动了实验性 HTML 导出,巩固了已有功能(如参考文献管理和 PDF 标准支持),并在众多其他方面进行了改进。在此发布周期中,我们还大力投入于基础系统,以便让 Typst 更容易被采用和使用。为了扩展和改进文档,我们已将其移植到 Typst,并首次发布了其[打印版本](https://github.com/typst/typst/releases/download/v0.15.0/typst-documentation.pdf)。同时,我们还在更新日志中首次包含了详尽的[迁移指南](https://typst.app/docs/changelog/0.15.0/#migration-guide)。在编译器方面,我们致力于提供更清晰、更可操作的诊断信息和提示(新的内省警告只是其中之一)。对于未来的 Typst 版本,我们已经开始通过迁移工具和包的自动兼容行为来实现更平滑的升级。 ## 目录 在这篇博文中,我们将深入探讨本版本的一些亮点: - [可变字体](#variable-fonts) - [MathML](#mathml) - [捆绑导出](#bundle-export) - [多个参考文献](#multiple-bibliographies) - [同时支持多种 PDF 标准](#multiple-pdf-standards) - [布局收敛诊断](#convergence-diagnostics) - [文档的打印版本](#print-docs) 要开始使用 Typst 0.15…… - **……在网络应用中:** 直接打开你的任意项目!系统会提示你升级到最新版本。 - **……在命令行中:** 在终端中运行 `typst update`,或者如果你之前没有安装 Typst,可以下载[最新版本的 CLI](https://typst.app/open-source/#download)。 关于本版本所有更改的全面概览,请访问[更新日志](https://typst.app/docs/changelog/0.15.0/)。如果你正在将文档升级到 Typst 0.15,也可以直接跳到[迁移指南](https://typst.app/docs/changelog/0.15.0/#migration-guide)。 ## 可变字体 字体通常带有适合文档中不同设计元素的不同设计变体。常见的基础是每个字体系列有四种字体:常规体、粗体、斜体和粗斜体。除此之外,许多字体还提供更多字重、不同拉伸(也称宽度)或针对不同磅值设计的变体。传统上,每种变体都对应一个不同的字体文件。这很容易导致字体系列包含大量文件,但仍然缺少精确所需的变体。这时可变字体就派上了用场。它们让字体设计师能够以*参数化*的方式表示字形轮廓和度量,从而可以从单一轮廓定义中推导出不同的字重、宽度等。可变字体中可调整的不同参数称为*变体轴*。有一些标准轴用于经典设计选项,如斜体、倾斜、字重、拉伸和光学尺寸(基于磅值的调整)。Typst 会根据 `text` 函数的 `style`、`weight`、`stretch` 和 `size` 参数自动配置这些轴: ``` #set par(justify: true) #set text(font: "Mona Sans") #for weight in range( 100, 900, step: 10, inclusive: true, )[ #text(weight: weight)[A] ] ``` 预览 此外,字体可以定义完全自定义的变体轴,例如一个调整字体*柔和度*的轴。下面,我们调整了字体 `Fraunces` 的 `SOFT` 变体轴(自定义轴通常全部大写): ``` #set text( font: "Fraunces", size: 50pt, ) #text(variations: (SOFT: 0))[ Soft / #underline[Rigid] ] #text(variations: (SOFT: 100))[ #underline[Soft] / Rigid ] ``` 预览 ### 字体里有什么? 为了充分利用可变字体,你需要知道它支持哪些设计变化。为了帮助你,我们改进了网络应用中的工具提示和自动补全功能,以及 CLI 中的 `typst fonts` 输出,以便你了解所选字体有哪些变化。我们还搜索了网络应用中所有提供可变版本的字体,并为它们找到了可变版本。使用 Typst 0.15 的项目将自动使用这些可变版本,而 Typst 0.14 及更低版本将继续使用静态版本。 一个使用字体 'Fraunces' 的文本设置规则,下方是 'Fraunces' 的自动补全条目,显示以下详细信息:Variable. Weight 100-900. Has italics. Supports optical sizing. SOFT 0-100. WONK 0-1. ``` $ typst fonts --variants Fraunces ├ fonts/Fraunces[SOFT,WONK,opsz,wght].ttf (Variable) │ Style: Normal │ Stretch: 100% │ Weight: 100-900 (Default: 900) │ Optical Size: 9pt-144pt (Default: 9pt) │ SOFT: 0-100 (Default: 0) │ WONK: 0-1 (Default: 1) └ fonts/Fraunces-Italic[SOFT,WONK,opsz,wght].ttf (Variable) ... ``` ## MathML 如果你之前使用过 Typst 的 HTML 导出,可能会注意到它完全忽略了公式。通过使用 `html.frame` 并将公式渲染为 SVG,可以找到相当好的解决方法。但这会使公式变得不可访问且不可选择。在 Typst 0.15 中,我们通过 MathML 为公式添加了原生支持。MathML 编码了公式的结构和语义。MathML 公式保持文本可选性,可以被屏幕阅读器朗读,并在浏览器中以高分辨率渲染。MathML 在所有主流浏览器中都得到支持,但渲染质量略有差异。如果绝对视觉一致对你至关重要,那么渲染为 SVG 可能仍然更合适;但除此之外,使用原生 MathML 输出是更可取的,因为它能让你的数学内容被更多用户访问。 下面是一个公式示例以及 Typst 如何渲染它: ``` $ sum_(i in NN) 1 + i $ ``` 预览 以下是你浏览器中通过 Typst 的 HTML 导出将该公式渲染为 MathML 的结果: ∑i∈N1+i ## 捆绑导出 当我们首次发布 Typst 时,PDF 是唯一支持的导出格式。在 Typst 0.5 中我们增加了 PNG 导出,在 Typst 0.8 中增加了 SVG 导出。这两种格式仍然非常接近 PDF 导出,因为它们都在 Typst 完成文档布局后介入。然后,在 Typst 0.13 中,我们增加了对 HTML 导出的实验性支持。这是一种结构上非常不同的输出格式,因为它需要更早地介入,布局完全委托给浏览器。自 Typst 0.14 起,HTML 导出仅限于输出单个文件。这意味着多页网站需要一些外部编排。在我们将 https://typst.app/docs 上的文档移植到 Typst 本身的过程中,我们需要一种从单个 Typst 项目导出多个 HTML 页面的方法。最初的想法是构建一个能够实现这一点的功能——可能通过某种 `html.output` 元素来输出多个 HTML 页面。但在设计该功能时,我们发现了一个很好的泛化:为什么要添加这个新元素并将功能限制在 HTML 上呢?我们已经*有*一个元素可以表示整个 HTML 文档:`document` 元素。借助新的[捆绑导出](https://typst.app/docs/reference/bundle/),`document` 元素承担了这一新角色,并补充了一个新的 `asset` 元素。`document` 接收使用 Typst 其他导出格式之一导出的内容。与此同时,`asset` 接收你选择的原始字节数据,并按原样写入磁盘。两个元素都将所需的输出路径作为第一个参数。 下面是一个包含三个输出文件的示例: ``` #document("index.html", title: [Home])[ #title() #link()[Go to blog] ] #document("blog.html", title: [Blog])[ #title() Welcome to my blog! ] #asset("robots.txt", "Disallow: *") ``` 这里,两个文档都使用了 HTML 导出格式,因为提供的路径具有 `.html` 扩展名。一个文档可以使用 Typst 的任何单文件导出格式([PDF](https://typst.app/docs/reference/pdf/)、[PNG](https://typst.app/docs/reference/png/)、[SVG](https://typst.app/docs/reference/svg/) 或 [HTML](https://typst.app/docs/reference/html/))。 Typst 0.15 中另一个与捆绑导出结合使用非常有用的新功能是 `within` 选择器,它将内省限定在特定元素的后代范围内。默认情况下,内省是整个捆绑包全局的。使用这个选择器,你可以将其限定到特定文档。 我们预计捆绑导出最常用于网站,但还有其他用例。例如,你可以创建一个 PDF 和一个包含演示者演讲备注的辅助文件。而且我相信你们中的一些人会滥用 `asset` 元素作为输出通道,用 Typst 进行原始计算。😄 请注意,与 HTML 导出一样,捆绑导出被视为实验性功能。要在 CLI 中启用它,请传递 `--features bundle` 或设置 `TYPST_FEATURES=bundle`。当与 HTML 导出结合时,请用逗号分隔指定(即 `bundle,html`)。网络应用目前还不支持捆绑导出。 ## 多个参考文献 凭借超过 90 个赞成票,对多个参考文献的支持几乎进入了 Typst 功能请求历史前十名。虽然原生支持缺失,但社区已经提供了不止一个而是两个包(`alexandria` 和 `pergamon`)。Typst 0.15 最终增加了对多个参考文献的原生支持。如果你只是开始在文档中添加多个参考文献,Typst 会自动将引文分配到各个参考文献中,以覆盖常见用例。具体来说,默认情况下,引文会被其引用键所在的下一个参考文献捕获;如果没有这样的后续参考文献,则被包含该键的前一个参考文献捕获。通过这种方式,你可以实现: - ……*按章节*的参考文献:只需在章节末尾添加参考文献,引文就会被相应捕获。 - ……*按主题*的参考文献:为不同主题创建不同的 `.yaml` 或 `.bib` 文件,并将使用它们的参考文献添加到文档中。每条引文会自动分配给包含其键的参考文献。 根据你的引用样式,你可能希望或不希望使用参考文献的共享编号;这可以通过 `bibliography` 函数的新 `group` 参数来控制。如果你需要更多控制,可以编写一个选择器,精确定义特定参考文献应捕获哪些引文。有了这个功能,你可以尽情发挥。为什么不为文档中的每个信息框定义单独的参考文献呢? ``` #let info(body) = block( stroke: (left: 1.5pt + blue), fill: aqua.lighten(50%), inset: 1em, context { body show divider: set block( spacing: 1.2em, ) divider() bibliography( "works.bib", title: none, target: selector(cite).within( here(), ), style: "mla", ) } ) = On the matter of dumplings In recent years, we can observe an uptick in dumpling consumption across the board. @netwok #info[ Dumplings are particularly enjoyed among pirates. @arrgh ] #bibliography("works.bib") ``` 预览 ## 同时支持多种 PDF 标准 在 Typst 0.12 中,我们增加了对 PDF/A 导出的初始支持,在 Typst 0.14 中我们进行了扩展并增加了对 PDF/UA 的支持。然而,之前还不支持同时符合*两个*标准的文件导出。在 Typst 0.15 中,我们消除了这一限制。这意味着你现在可以生成一个既适合长期存储(例如 PDF/A-2a)又普遍可访问(PDF/UA-1)的文件。 Typst 网络应用的 PDF 导出对话框,其中同时选择了 PDF/A-2a 和 PDF/UA-1 作为"PDF 标准"选项。 ## 布局收敛诊断 文档本质上是*内部依赖的*。我的意思是,一些典型的文档元素依赖于只有在文档布局完成后才知道的信息。最典型的例子是目录(大纲):它包含页码,而这些页码只有在布局完成后才知道。同时,大纲的长度会影响页码。而且,如果这还不够,大纲的长度还可能依赖于具体的页码。(关于这个问题的一个可视化解释,请看我最近在 RustWeek 上的[相关演讲片段](https://www.youtube.com/watch?v=yWWVhbyOWWE&t=884s)。) Typst 通过多次编译文档来解决这种内部依赖,直到输出稳定下来。不幸的是,输出 (a) 并不保证能稳定下来,(b) 在一般情况下,不可能知道它是否会稳定下来。因此,Typst 在固定次数的尝试后放弃。然后,你会得到一个警告,说"布局在五次尝试中未能收敛"。到目前为止,这就是你得到的所有信息。如果你刚刚做了一个更改,你仍然可以合理地回溯并找出问题所在。但如果你让这个警告搁置一段时间,以后再找出原因可能会非常困难。那时,唯一的办法就是剥离文档的部分内容,观察警告何时消失何时出现。 在 Typst 0.15 中,我们增加了新的诊断信息,以帮助你更快地定位收敛问题的原因。下面是一个不收敛文档的示例,以及 Typst 为它生成的新诊断信息。这个示例中的问题是,我们正在查询所有标题元素,然后生成比我们观察到的*多一个*元素。通过这种设置,文档在每次迭代中都会增加一个标题,没有稳定的机会。 ``` #context { let elems = query(heading) let count = 1 + elems.len() count * [= Heading] } ``` 预览 ``` warning: document did not converge within five attempts = hint: see 1 additional warning for more details = hint: see https://typst.app/help/convergence for help warning: number of heading elements did not stabilize ┌─ main.typ:2:14 │ 2 │ let elems = query(heading) │ ^^^^^^^^^^^^^^ │ = hint: the following numbers of elements were observed: - run 1: 0 - run 2: 1 - run 3: 2 - run 4: 3 - run 5: 4 - final: 5 ``` ## 文档的打印版本 最后但同样重要的是,我个人对此感到非常兴奋。在最近的发布周期中,我们在幕后做了大量工作,将整个文档系统移植到了 Typst。这意味着你在 https://typst.app/docs 上看到的所有内容现在都是使用 Typst 的捆绑和 HTML 导出功能生成的。这也意味着,对我们来说,制作文档的打印版本作为独立的 PDF 文件变得相当直接。

相似文章

Typst 0.15.0

Hacker News Top

Typst 0.15.0 引入了可变字体、带 MathML 的 HTML 导出、多文件导出、多参考文献、PDF 标准定位以及许多其他改进。

arXiv上可访问数学的扩展:HTML转换与MathML 4

arXiv cs.CL

arXiv报告了其正在进行的HTML Papers项目,重点介绍了改进的转换保真度、达到75%无错误率的语料库级HTML转换、用于可访问语音的初步MathML 4 Intent注释,以及为降低成本而进行的LaTeXML的Rust移植。

逆境中的优秀字体

Hacker News Top

一篇探讨意外字体现象与工艺的文章,包括显示屏上的卷帘快门效应以及对字体局限性的创造性应用。