Typst: LaTeX 的现代平替
提到学术写作排版和演示文稿制作,你会想到什么呢?想必大家都会想到 LaTeX。
LaTeX 是一种基于标记语言的排版工具,在不关心样式的情况下进行以内容为中心的编写工作,然后进行编译就可以得到样式规范精致的出版级文档。并且其基于宏包和命令的设计,可以实现非常复杂丰富的排版效果,例如 Beamer 就是一个用于制作演示文稿的宏包。但是,LaTeX 也有一些缺点,比如语法繁琐、学习曲线陡峭、编译速度慢等。那么,有没有一种工具,可以实现 LaTeX 的几乎所有功能,但更加现代化、轻量级和易用呢?当然有,那就是 Typst。
1. 安装与使用
按照 Typst 官方仓库 的说明安装即可。
- Linux 使用各发行版的包管理器安装即可
- macOS 使用
Homebrew
安装:brew install typst
- Windows 使用
winget
安装:winget install --id Typst.Typst
然后直接对源文件进行编译即可:
或
如果需要实时编译,可以使用 watch
命令:
配合 vscode 中的 LSP 插件和 PDF 预览插件,可以实现 Markdown 同等体验的实时预览,真的是秒编译!
2. 一则简单的例子
下面直接使用一个相对完整的例子来展示一下 Typst 的基本语法和功能:
#set page(height: auto)
#set heading(numbering: "1.")
// Title
= Transfomer
== Introduction
// Paragraph with citation & reference
The Transformer model @VaswaniAttentionallyou2017 has been widely used in NLP tasks. It is based on the self-attention mechanism, which allows the model to focus on different parts of the input sequence. The self-attention mechanism is used to compute the attention weights for each token in the input sequence. The attention weights are then used to compute the weighted sum of the input tokens, which is used as the input to the next layer of the model.
== Model Architecture
The structure of the original Transformer model is shown in Figure @fig:transformer.
// figure with caption
#figure(
image("transformer_structure.jpg", width: 70%),
caption: [
_Transformer_ model structure
],
) <fig:transformer>
// numbered list
+ The input sequence is first embedded into a sequence of vectors.
+ The self-attention mechanism is used to compute the attention weights for each token in the input sequence.
+ The attention weights are then used to compute the weighted sum of the input tokens.
+ The weighted sum is used as the input to the next layer of the model.
== Attention Mechanism
The attention are computed using the following equation @eq:attention:
// equation
#set math.equation(numbering: "(1)")
$ op("Attention")(Q, K, V) = op("softmax")((Q K^T)/sqrt(d_k))V $<eq:attention>
where $Q$, $K$, and $V$ are the query, key, and value matrices, respectively, and $d_k$ is the dimension of the key vectors.
== Conclusion
// bulleted list
- The Transformer model has been widely used in NLP tasks.
- The self-attention mechanism allows the model to focus on different parts of the input sequence.
= Fibonacci Sequence
// programming
#let count = 8
#let nums = range(1, count + 1)
#let fib(n)= (
if n<=2 {1}
else { fib(n - 1) + fib(n - 2) }
)
The first #count numbers of the sequence are:
#align(center, table(
columns:coun,
..nums.map(n => $F_#n$),
..nums.map(n => str(fib(n))),
))
Python code to calculate the Fibonacci sequence:
\```python
def fib(n):
if n <= 2:
return 1
else:
return fib(n - 1) + fib(n - 2)
\```
// without the '/' in real code
// bibliography
#bibliography("ref.bib", title: "References", style: "ieee")
这是编译后的效果:
3. 特性与优点
4. 特性与优点
从上面的例子可以看出,Typst 的语法十分简洁,有种 Markdown 的美。但同时它也保留了 LaTeX 的强大功能,可以实现几乎一切。
上面涉及的 Typst 的一些特点和优点有:
- 简洁的基本语法:与 markdown 类似的,标题、段落、列表、引用、代码块等基本语法都非常简洁易懂。
- 轻量级:Typst 非常轻量级,本体大小不过几十兆,比 LaTeX 动辄六七个 G 的发行版小的多,Package 也是按需加载并缓存的,当然包管理还在不断完善中。
- 超快的编译速度:Typst 的编译速度非常快,几乎可以称得上是实时渲染,和 Latex 的编译速度相比简直是天壤之别,几乎和 Markdown 的实时渲染一样。
- 高级页面设置:可以通过
#set page
来设置页面的宽度和高度等参数,当然还有很多可修改的参数。 - 引用和参考文献:所有的引用都统一通过
@
符号来引用,通过#bibliography
来生成参考文献,通过<label-name>
来给图像、表格、代码块、公式等打上标签方便引用。 - 语义化的数学公式:数学公式的语法也非常简洁,相比于 LaTeX 更加语义化,不需要大量的
\
和{}
。 - 编程支持与强自定义性:Typst 也支持编程,且语法简单,可以更简单地实现更多复杂的功能,包括但不限于计算、绘图、数据处理等。也可以方便地定义模板和宏包。
更完整的教程和语法可以参考 Typst 官方文档。
同样也有包完成了对演示的支持,例如 touying 包,比 LaTeX 的 Beamer 更加简洁易用,并且由于编译的速度快,可以实现实时编译,大大增加了效率。
官方还提供了与 Overleaf 类似的在线编辑器,可以方便地在线编辑和分享文档。同样得益于 Typst 的编译速度,在线编辑器也是实时编译(不像 Overleaf 每次还得保存等编译),也可以方便地导出。
5. 局限性与解决方案
当然官方也大方承认了与 LaTeX 相比 Typst 当前的局限性,并列出了几个主要的问题,并提出了相应的应对方法。包括:
- 没有 Native 的图表绘制功能。LaTeX 有 PGF/TikZ 这个强大的绘图工具,并且有强大的生态支持,而 Typst 没有。但 Typst 胜在其强大的社区支持,目前已经有诸如 CeTZ 的社区项目,可以实现大部分主要的图表绘制功能(相比于 PGF/TikZ 的功能有哪些限制,其实我也不是很清楚,因为我绘图功能需求相对简单,对 PGF/TikZ 和 CeTZ 的能力边界不是很了解)。
- 不方便随时随地改变页面 Margin。Typst 中修改 Margin 需要一个 Pagebreak,也就是说每一页的 Margin 是一定的,不能只针对某一段文字进行 Margin 的调整。官方提出可以用
pad function
通过设置负的 pad 来实现。 - 不支持 pdf 和 eps 作为图像插入。Typst 建议使用 svg 作为图像插入,并提出可以使用工具非常轻松地将 pdf 和 eps 转换为 svg。
- 分页分段分行优化。这可能是很多 LaTeX 拥护者比较介意的地方。LaTeX 用了很多智能的算法来优化分页分段和分行。但 Typst 用的算法则相对没有那么成熟。但 Typst 也提出了一些自己设置分页和间隔的方法如
pagebreak
和v
函数等,详见上面的链接。
此外,Typst 和 LaTeX 专注于内容的想法都是好的,但都没法解决在需要精细化定制排版样式时产生的问题,例如内容和样式的混杂,这是一个普遍的问题,肯定是不如 HTML 和 CSS 的分离做法的。但其实也仁者见仁吧。
5.1 公式转换
由于 Typst 重新设计了数学公式语法,这就导致了一些兼容性问题,LaTex 公式以及使用 MathJax 或 KaTeX 的 Markdown 渲染器使用的公式无法直接在 Typst 中使用,需要进行一步转换,反之亦然。所以这里提供一些转换工具:
以上两个工具可用于将 LaTeX 公式转换为 Typst 公式,但是属于外置工具,以下这个包可以实现在 Typst 中直接使用 LaTeX 公式,甚至是更多 LaTeX 指令和功能:
当然,还有我们的万能工具 Pandoc
Pandoc 可以实现 Markdown、LaTeX、Typst 之间的相互转换,虽然某些格式他们相互之间的转换可能会有一些损失,但是公式的转换还是基本没有问题的。上面的链接是 Pandoc 的在线尝试页面,可以方便地进行格式转换,而不需要创建文件再使用 cli 进行转换。
6. 总结
Typst 是一个非常优秀的工具,可以实现 LaTeX 的几乎所有功能,但更加现代化、轻量级、快速和易用。如果你是一个 LaTeX 用户,那么 Typst 会是一个非常好入手的工具。如果你是一个 Markdown 用户,那么 Typst 也会是一个非常好的选择,Typst 的基础语法并没有比 Markdown 复杂多少,并且编译速度也几乎称的上是实时渲染。尽管 Typst 也有一些局限性,但官方也都提出了相应的解决方案,并始终在不断更新和积极维护。总的来说,Typst 是一个非常值得推荐的排版工具。