21CTO导读:Typst 是一种简单而强大的基于标记(Markup-based)的文档排版语言,旨在为学术论文、技术手册、书籍及各类复杂文档提供极致的排版体验。作为 TeX 和 LaTeX 的现代替代方案,它兼具简洁语法与强大的编程扩展能力。
在日常工作中,我们创建的文档通常可以分为两大类:第一类是使用 Microsoft Word 或 Google Docs 等办公软件编写的商务与日常文档;第二类是从代码仓库或项目构建过程中半自动生成的项目技术文档(如使用 Sphinx、Pandoc 等工具)。
但事实上,还有“第三类文档”。这类文档由专门的排版语言(Typesetting Languages)生成——它将标记语言与编程语言融为一体,专为书籍、学术期刊、科学论文及技术手册等对格式与版式要求极高的高质量出版物而生。
排版语言不仅能输出赏心悦目的排版效果,还能作为“单一事实来源(Single Source of Truth)”,灵活导出为印刷品、网页、电子书等多种格式。近年来,开源项目 Typst(发音同 typist)凭借其现代化的设计,迅速成长为满足此类需求的强力选择。
几十年来,TeX 及其衍生版本 LaTeX 一直是学术界与出版业的绝对主导者。TeX 由传奇计算机科学家 Donald Knuth 于 1978 年创立,而更为大众熟知的 LaTeX 则诞生于 1984 年。
尽管 TeX 和 LaTeX 生态繁荣、支持广泛,但它们存在两个长期困扰开发者的核心痛点:
年代久远:它们是为几十年前的计算环境设计的,其语法结构与管理方式在今天看来显得繁琐且违背直觉;
复杂度极高:LaTeX 最初正是为了简化 TeX 而生,但其底层的复杂性始终无法被完全掩盖,配置与调试门槛极高。
而Typst 的诞生,正是为了彻底解决 TeX 和 LaTeX 的历史包袱。
typst官方网站:https://lib.rs/crates/typst
Typst 吸取了 TeX 的核心优势(如优雅的数学公式排版),同时抛弃了沉重的历史负担。虽然它并没有直接兼容 TeX 的语法(可通过第三方工具转换),但它带来了一套更加直观、现代且易于维护的全新语法体系。
Typst 提供了极为灵活的开发环境,适应不同的使用场景:
命令行工具(CLI):开源的官方 Typst 编译器,适合集成至 CI/CD 或自动化构建流水线;
Web Playground(Typst App):官方提供的托管式 Web 应用,支持在浏览器中实时预览编辑效果,开箱即用;
VS Code 扩展:其中最受欢迎的是 Tinymist Typst 插件,它为本地开发提供了强大的代码补全、实时渲染与预览功能。
在处理基础文档时,Typst 的学习成本极低。它的语法与 Markdown 类似:使用下划线 _ 表示斜体,星号 * 表示加粗,等号 = 表示各级章节标题。
当需要自定义文档的版面样式时,Typst 的编程能力便能大显身手。通过预设的 #set 指令,你可以全局或局部控制页面布局:
#set page(width: 5.25in, height: 8in, margin: 0.5in)#set text(size: 11pt, font: "Libre Baskerville")#set par(first-line-indent: 1.75em, justify: true)
在 Typst 中,# set命令会影响其所在位置之后的所有内容。如果你需要在文档中途改变样式(例如从单列排版切换为双列),随时再次调用 #set 即可覆盖前置声明。在 Typst 中,井号(#)是切换“标记模式(普通文本)”与“代码模式(Typst 指令与表达式)”的语法开关。你可以通过代码模式轻松编写复杂的宏与自定义函数:
这是普通文本。#let inline_image(img) = {box(height: 8em, place(top+left, dx: 5pt, square(image(img, height: 100%, fit: "cover"))))}这又是一段普通的文本。
上述代码定义了一个名为 inline_image 的函数,它接收一个图片路径作为参数,并将其嵌入到一个内联框中。Typst 的代码风格非常现代,语句以换行符结尾,无需像 C/JS 那样强制使用分号。
Typst 原生支持导出为 PDF、常见图像格式及 HTML。针对不同的导出目标,你可以通过内置的 target() 函数实现条件渲染:
#let sectionbreak(txt) = {context (if target() == "html" {html.elem("div", attrs: (class: "section-break"))[]return} else {divider()})}
在此示例中,如果导出目标是 HTML,函数会插入一个带有指定 CSS 类的空
divider()。此外,Typst 还引入了类似 DOM 查询的元素内省系统。通过 query 函数,开发者可以轻松获取文档中的特定元素(如标题、图表、脚注等):
// 查询文档中所有的 1 级标题query(heading.where(level: 1))
得益于包管理器(Package Manager)的引入,Typst 摆脱了 TeX 繁琐的全局安装流程。在文档中直接使用 import 语句引用远程包,编译器便会自动下载并完成引入。
Typst 的数学模块继承了 TeX 的审美优势,但在语法上进行了大幅度的简化。只要具备基础编程经验,即可快速上手。
数学模式由美元符号($)包裹:
$ sum_(k=1)^n k = (n(n+1)) / 2 $
这一行简单的代码即可渲染出标准、漂亮的数学等式。如果需要在正文中输出文本原义的美元符号,只需使用斜杠(\$)进行转义即可。对于拥有大量旧 TeX 资产的用户,可以使用社区开源的 MiTex 等第三方扩展工具,将 TeX 公式无缝转换为 Typst 语法。
作为一项快速迭代的开源技术,Typst 生态仍在蓬勃发展中。尽管出于安全考虑,Typst 对文件路径导入与本地数据读取施加了较严格的限制,但开发者可以借助外部编程语言对 Typst 进行二次封装与自动化扩展。
例如,通过 Python 官方生态中的 typst 第三方库,你可以轻松使用 Python 调用 Typst 编译器:
自动化驱动多文件协同构建流程;
在编译前读取根目录之外的数据源;
结合内省查询(Query)动态生成文档报告。
随着用户社区的持续爆发(目前官方包目录已收录超 1000 个扩展包),Typst 正在成为越来越多开发者、学者与出版团队创作技术文档的全新首选。
作者:洛逸
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。