17611538698
webmaster@21cto.com

告别 LaTeX 的繁琐:现代文档排版语言 Typst 快速上手指南

编程语言 0 20 6小时前
A Typst Presentation : r/typst

21CTO导读:Typst 是一种简单而强大的基于标记(Markup-based)的文档排版语言,旨在为学术论文、技术手册、书籍及各类复杂文档提供极致的排版体验。作为 TeX 和 LaTeX 的现代替代方案,它兼具简洁语法与强大的编程扩展能力。

在日常工作中,我们创建的文档通常可以分为两大类:第一类是使用 Microsoft Word 或 Google Docs 等办公软件编写的商务与日常文档;第二类是从代码仓库或项目构建过程中半自动生成的项目技术文档(如使用 Sphinx、Pandoc 等工具)。

但事实上,还有“第三类文档”。这类文档由专门的排版语言(Typesetting Languages)生成——它将标记语言与编程语言融为一体,专为书籍、学术期刊、科学论文及技术手册等对格式与版式要求极高的高质量出版物而生。

排版语言不仅能输出赏心悦目的排版效果,还能作为“单一事实来源(Single Source of Truth)”,灵活导出为印刷品、网页、电子书等多种格式。近年来,开源项目 Typst(发音同 typist)凭借其现代化的设计,迅速成长为满足此类需求的强力选择。

1. 跨越半个世纪的革新:TeX、LaTeX 与 Typst


几十年来,TeX 及其衍生版本 LaTeX 一直是学术界与出版业的绝对主导者。TeX 由传奇计算机科学家 Donald Knuth 于 1978 年创立,而更为大众熟知的 LaTeX 则诞生于 1984 年。

尽管 TeX 和 LaTeX 生态繁荣、支持广泛,但它们存在两个长期困扰开发者的核心痛点:

  • 年代久远:它们是为几十年前的计算环境设计的,其语法结构与管理方式在今天看来显得繁琐且违背直觉;

  • 复杂度极高:LaTeX 最初正是为了简化 TeX 而生,但其底层的复杂性始终无法被完全掩盖,配置与调试门槛极高。


而Typst 的诞生,正是为了彻底解决 TeX 和 LaTeX 的历史包袱。

图片

typst官方网站:https://lib.rs/crates/typst

Typst 吸取了 TeX 的核心优势(如优雅的数学公式排版),同时抛弃了沉重的历史负担。虽然它并没有直接兼容 TeX 的语法(可通过第三方工具转换),但它带来了一套更加直观、现代且易于维护的全新语法体系。

2. 开发生态与工作流:CLI、Web 应用与 VS Code 插件


Typst 提供了极为灵活的开发环境,适应不同的使用场景:

  • 命令行工具(CLI):开源的官方 Typst 编译器,适合集成至 CI/CD 或自动化构建流水线;

  • Web Playground(Typst App):官方提供的托管式 Web 应用,支持在浏览器中实时预览编辑效果,开箱即用;

  • VS Code 扩展:其中最受欢迎的是 Tinymist Typst 插件,它为本地开发提供了强大的代码补全、实时渲染与预览功能。


在处理基础文档时,Typst 的学习成本极低。它的语法与 Markdown 类似:使用下划线 _ 表示斜体,星号 * 表示加粗,等号 = 表示各级章节标题。

3. 核心机制:样式声明与“代码模式”


当需要自定义文档的版面样式时,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 即可覆盖前置声明。

代码模式(Code Mode)与函数定义


在 Typst 中,井号(#)是切换“标记模式(普通文本)”与“代码模式(Typst 指令与表达式)”的语法开关。你可以通过代码模式轻松编写复杂的宏与自定义函数:

这是普通文本。#let inline_image(img) = {   box(height8em, place(top+left, dx5pt, square(       image(img, height100%, fit"cover")  )))}这又是一段普通的文本。

上述代码定义了一个名为 inline_image 的函数,它接收一个图片路径作为参数,并将其嵌入到一个内联框中。Typst 的代码风格非常现代,语句以换行符结尾,无需像 C/JS 那样强制使用分号。

4. 强大的导出与文档查询(Query)系统


Typst 原生支持导出为 PDF、常见图像格式及 HTML。针对不同的导出目标,你可以通过内置的 target() 函数实现条件渲染:

#let sectionbreak(txt) = {   context (    if target() == "html" {      html.elem("div", attrs: (class: "section-break"))[]      return    } else {      divider()    }  )}

在此示例中,如果导出目标是 HTML,函数会插入一个带有指定 CSS 类的空

标签以供后续排版;而针对 PDF 等静态文档目标,则默认渲染内置的分割线 divider()

此外,Typst 还引入了类似 DOM 查询的元素内省系统。通过 query 函数,开发者可以轻松获取文档中的特定元素(如标题、图表、脚注等):

// 查询文档中所有的 1 级标题query(heading.where(level: 1))

得益于包管理器(Package Manager)的引入,Typst 摆脱了 TeX 繁琐的全局安装流程。在文档中直接使用 import 语句引用远程包,编译器便会自动下载并完成引入。

5. 优雅的数学公式排版


Typst 的数学模块继承了 TeX 的审美优势,但在语法上进行了大幅度的简化。只要具备基础编程经验,即可快速上手。

数学模式由美元符号($)包裹:

sum_(k=1)^n k = (n(n+1)) / 2 $

这一行简单的代码即可渲染出标准、漂亮的数学等式。如果需要在正文中输出文本原义的美元符号,只需使用斜杠(\$)进行转义即可。对于拥有大量旧 TeX 资产的用户,可以使用社区开源的 MiTex 等第三方扩展工具,将 TeX 公式无缝转换为 Typst 语法。

6. 生态与自动化拓展


作为一项快速迭代的开源技术,Typst 生态仍在蓬勃发展中。尽管出于安全考虑,Typst 对文件路径导入与本地数据读取施加了较严格的限制,但开发者可以借助外部编程语言对 Typst 进行二次封装与自动化扩展。

例如,通过 Python 官方生态中的 typst 第三方库,你可以轻松使用 Python 调用 Typst 编译器:

  • 自动化驱动多文件协同构建流程;

  • 在编译前读取根目录之外的数据源;

  • 结合内省查询(Query)动态生成文档报告。


随着用户社区的持续爆发(目前官方包目录已收录超 1000 个扩展包),Typst 正在成为越来越多开发者、学者与出版团队创作技术文档的全新首选。

作者:洛逸

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信