一个基于标记语言的全新排版系统,既强大又易学。

Typst 是一个全新的基于标记语言的排版系统,目标是在功能上媲美 LaTeX,同时更加易于学习和使用。Typst 拥有以下特性:

  • 内建的标记语法,处理常见格式化任务轻而易举
  • 灵活的函数,满足各种定制化需求
  • 紧密集成的脚本系统
  • 数学公式排版、参考文献管理等高级功能
  • 得益于增量编译机制的快速编译速度
  • 若出错,提供友好的错误信息提示

本代码仓库包含 Typst 编译器及其 CLI(命令行界面),这就是你在本地编译 Typst 文档所需的一切。若想获得最佳写作体验,建议免费注册使用我们的 [在线协作编辑器][app]。


示例

我们在文档中提供了一份 [简单入门教程][tutorial]。但如果你希望通过一张图快速了解 Typst 的强大功能,可以看下面这张示例图:

关于 Typst - 图1

我们来拆解一下这段示例中发生了什么:

  • 使用 set rules(设置规则)配置元素属性,比如页面大小或标题编号。设置页面高度为 auto,可以使其根据内容自动调整。Set 规则覆盖了大多数常见配置。如果你需要完全自定义,也可以使用 [show rules][show] 完全重定义某个元素的外观。

  • 使用 = Heading 语法插入标题。一个等号表示一级标题,两个等号表示二级标题,以此类推。Typst 提供了很多类似的轻量级标记语法,完整列表请参见 [syntax] 语法参考。

  • [数学公式][math] 使用美元符号括起来。通过在公式内容两边加上空格,可以将其放入独立的区块中。多字母标识符默认会被解析为 Typst 的定义或函数,除非用引号括起来。这样我们就不需要像 LaTeX 那样写反斜杠了,比如 floorsqrt 可以直接用。phi.alt 表示对 phi 应用了 alt 修饰符,从而选择该符号的某个变体。

  • 接下来我们进入 [脚本][scripting] 部分。要在 Typst 文档中写代码,只需输入一个井号(#)加上表达式。这里我们定义了两个变量和一个递归函数来计算第 n 个 Fibonacci 数。然后我们把结果放入一个居中的表格中显示。表格函数的参数按行传入,因此我们先传入公式 $F_1$$F_8$,再传入计算出的 Fibonacci 数列值。由于这两个是数组,我们使用展开运算符 ..,以将数组的每一项作为独立参数传入。

代码文本版本
  1. #set page(width: 10cm, height: auto)
  2. #set heading(numbering: “1.”)
  3. = Fibonacci sequence
  4. The Fibonacci sequence is defined through the
  5. recurrence relation $Fn = F(n-1) + F(n-2)$.
  6. It can also be expressed in _closed form:
  7. $ Fn = round(1 / sqrt(5) phi.alt^n), quad
  8. phi.alt = (1 + sqrt(5)) / 2 $
  9. #let count = 8
  10. #let nums = range(1, count + 1)
  11. #let fib(n) = (
  12. if n <= 2 { 1 }
  13. else { fib(n - 1) + fib(n - 2) }
  14. )
  15. The first #count numbers of the sequence are:
  16. #align(center, table(
  17. columns: count,
  18. ..nums.map(n => $F#n$),
  19. ..nums.map(n => str(fib(n))),
  20. ))
  21.  

安装方式

Typst 的 CLI(命令行工具)可以通过多种方式获取:

  • 你可以从 [releases 页面][releases] 获取 Typst 的源代码和预编译好的二进制文件。下载与你的操作系统对应的压缩包,并将其放入一个包含在你 PATH 中的目录下。为了保持更新,你可以直接运行 typst update 命令。

  • 你也可以通过不同的包管理器来安装 Typst。但请注意,包管理器中的版本可能会落后于最新的官方发布版本。

    • Linux:

      • 查看 [Repology 上的 Typst][repology]
      • 查看 [Typst 的 Snap 版本][snap]
    • macOS:运行 brew install typst
    • Windows:运行 winget install --id Typst.Typst
  • 如果你已经安装了 [Rust][rust] 工具链,可以通过以下方式安装:

    • 安装最新发布版本:cargo install --locked typst-cli
    • 安装开发版本:cargo install --git https://github.com/typst/typst --locked typst-cli
  • 如果你使用的是 Nix,可以:

    • 使用 nix-shell -p typst 来使用 typst
    • 使用开发版本:nix run github:typst/typst -- --version
  • 如果你是 Docker 用户,可以直接运行预构建好的镜像: docker run ghcr.io/typst/typst:latest --help

使用方法

安装完成后,你可以像这样使用 Typst:

  1. # 在当前工作目录中创建名为 `file.pdf` 的文件。
  2. typst compile file.typ
  3. # 在指定路径生成 PDF 文件。
  4. typst compile path/to/source.typ path/to/output.pdf

你还可以监听源文件的变化,并在内容变更时自动重新编译。这种方式比每次从头编译要快,因为 Typst 支持增量编译。

  1. # 监听源文件并在更改时重新编译。
  2. typst watch file.typ

Typst 还允许你为项目添加自定义字体路径,并列出所有已发现的字体:

  1. # 添加额外的字体目录进行搜索。
  2. typst compile --font-path path/to/fonts file.typ
  3. # 列出系统和指定目录下已发现的所有字体。
  4. typst fonts --font-path path/to/fonts
  5. # 或者通过环境变量方式(Linux 语法)。
  6. TYPST_FONT_PATHS=path/to/fonts typst fonts

更多 CLI 子命令与选项见下:

  1. # 显示可用子命令和选项。
  2. typst help
  3. # 显示某个子命令的详细用法。
  4. typst help watch

如果你希望使用带有自动补全和即时预览的集成式开发体验,也可以试试 [Typst 的免费 Web 应用][app]。

社区

主要的 Typst 社区交流平台是我们的 [论坛][forum] 和 [Discord 服务器][discord]。 论坛是提问、互相帮助以及展示你用 Typst 做出酷炫作品的好地方;而 Discord 更适合快速提问、讨论贡献事宜或是随便聊聊。欢迎你加入我们!

[Typst Universe][universe] 是一个社区共享模板和包的地方。 如果你也想分享自己的作品,可以提交到我们的 [包仓库][packages]。

如果你在社区中遇到了不愉快的体验,请 [联系我们][contact]。

贡献方式

我们非常欢迎来自社区的贡献。如果你遇到了 bug,欢迎提交 issue。 如果你想实现一个新功能或修复一个 bug,请按照 [贡献指南][contributing] 中的步骤进行。

如果你希望自己构建 Typst,请先确保安装了 [最新稳定版 Rust][rust]。然后克隆本仓库并构建 CLI:

  1. git clone https://github.com/typst/typst
  2. cd typst
  3. cargo build --release

构建完成后,优化后的二进制文件会存储在 target/release/ 目录下。

另一个不错的贡献方式是 [分享包][packages],让整个社区受益。

发音与拼写

IPA 音标:/taɪpst/。 “Ty” 的发音类似于 Typesetting 中的 “Ty”,而 “pst” 类似于 Hipster 中的结尾。 在书写中,请将 Typst 视作专有名词,首字母 “T” 要大写。

设计原则

Typst 的整体设计围绕三个核心目标:强大性简洁性高性能。 我们认为,现在是时候拥有一个既能与 LaTeX 匹敌、又易学易用,并且足够快速实现即时预览的系统。为此,我们遵循三大设计原则:

  • 通过一致性实现简洁性: 如果你学会了 Typst 中的一种操作方式,那么你应该能够将它类推到其他地方。 如果有多种方式实现相同的效果,那它们之间应该存在抽象层次的差异。比如,= Introduction#heading[Introduction] 实现的是同一个效果,而前者只是后者的语法糖(syntax sugar)。

  • 通过可组合性实现强大性: 提高灵活性的方法有两种:一种是为每个功能都提供一个开关,另一种是提供少量但可自由组合的模块。 Typst 采用的是第二种方式。我们提供的系统可以让你组合出我们都没想到的新用法。TeX 也是第二类的系统,但它过于底层,所以大家更倾向使用 LaTeX。但 LaTeX 的可组合性并不强,通常每个功能都得通过引入一个包来实现(例如 \usepackage{knob})。

  • 通过增量性实现高性能: 所有 Typst 的语言特性都必须支持增量编译。 幸运的是,我们有 [comemo] 这个系统,它在后台承担了大部分繁重的增量编译任务。