基于 Typst 的新一代的学术幻灯片(Slides)神器 —— Touying

基于 Typst 的新一代的学术幻灯片(Slides)神器 —— Touying

Typst 是为写作而诞生的基于标记的排版系统,Typst 的目标是成为功能强大的排版工具,并且让用户可以愉快地使用它。简单来说:Typst = LaTeX 的排版能力 + Markdown 的简洁语法 + 强大且现代的脚本语言。具体介绍你可以参考这篇文章。

而 Touying 是为 Typst 开发的幻灯片/演示文稿包。Touying 也类似于 LaTeX 的 Beamer,但是得益于 Typst,你可以拥有更快的渲染速度与更简洁的语法。

Touying 取自中文里的「投影」。相较而言,LaTeX 中的 Beamer 就是德文的投影仪的意思。

为什么使用 Touying

  • 相较于 PowerPoint,Touying 并非「所示即所得的」,你可以使用一种「内容与样式分离」的方式编写你的 slides,尤其是 Typst 作为一个新兴的排版语言,提供了简洁但强大的语法,对于代码块、数学公式和定理等内容有着更好的支持。另一个优势是,在有着模板的情况下,用 Touying 编写 slides 要比 PowerPoint 快得多。因此 Touying 相较于 PowerPoint,更适合有着「学术写作」需求的用户使用。
  • 相较于 Markdown Slides,Touying 所依托的 Typst 有着更强大的排版控制能力,例如页眉、页脚、布局和便捷的自定义函数,而这是 Markdown 很难具备、或者说很难做好的能力。并且 Touying 提供了 #pause 和 #meanwhile 标记,提供了更为便捷的动态 slides 能力。
  • 相较于 Beamer,Touying 有着更快的编译速度、更简洁的语法,以及更简单的自定义主题的能力。相较于 Beamer 动辄几秒几十秒的编译时间,Touying 的编译速度基本上能够维持在几毫秒几十毫秒的即时渲染。并且 Touying 的语法相较于 Beamer 更为简洁,也更容易更改模板主题,以及创建你自己的模板。在功能上,Touying 支持了 Beamer 大部分的能力,并且还提供了一些 Beamer 所没有的便利功能。
  • 相较于 Polylux,Touying 提供了一种 oop 风格的语法,能够通过全局单例模拟提供「全局变量」的能力,进而可以方便地编写主题。并且 Touying 并不依赖 counter 和 locate 来实现 #pause,因此能有更好的性能。Touying 还提供了许多独特的功能,例如多种多样的动画能力。

一图流对比:

环境搭建

开始使用 Typst 是十分简单的,你可以选择 在线编辑,也可以选择本地编辑:

  1. 安装 VS Code 作为本地 Typst 编辑工具。
  2. 在 VS Code 中安装 Tinymist Typst 和 Typst Preview 插件。前者负责语法高亮和错误检查等功能,后者负责预览。
    • 也推荐下载 Typst Companion 插件,其提供了例如 Ctrl + B 进行加粗等便捷的快捷键。
    • 你还可以下载我开发的 Typst Sync 和 Typst Sympy Calculator 插件,前者提供了本地包的云同步功能,后者提供了基于 Typst 语法的科学计算器功能。
  3. 打开任意工作区,并新建一个 .typ 后缀的文件,例如 main.typ。
  4. 最后用 VS Code 打开生成的目录,打开对应的 .typ 文件,并按下 Ctrl + K V 进行实时编辑和预览。

示例代码

Touying 的语法很简单,你可以通过标题来划分 Slides。一个简单的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#import "@preview/touying:0.4.2": *

#let s = themes.simple.register(aspect-ratio: "16-9")
#let (init, slides) = utils.methods(s)
#show: init

#let (slide, empty-slide) = utils.slides(s)
#show: slides

= Title

== First Slide

Hello, Touying!

#pause

Hello, Typst!

更多的用法可以参考 Touying 中文文档。Touying 提供了许多内置主题模板,你可以在 这里 找到。

同时 Touying 通过 GitHub Wiki 提供了一个 Gallery 页面,可以在其中浏览由 Touying 用户创建的优雅幻灯片。例如 并不复杂的 Typst 讲座 就是使用 Touying 编写,你可以浏览 在线版本。

学术幻灯片应有的特性

让我们思考一下一个好的学术 Slides 工具应该有哪些特性?

  1. 可以在 Slides 里展示一个用户可见的进度条或当前剩余页数提示。
  2. 易于加入代码块,要有正确的高亮,以及最好能够做到可复制,而不仅是截一张图片。
  3. 能够通过脚本能力复用部分样式块,例如高亮、提示框或定理块等。
  4. 易于编写数学公式,最好是能直接复用已有的数学公式源文件,且易于编辑。
  5. 能够方便地设置文本样式,例如字号、字重和颜色。
  6. 能够复用已有模板,用户只需要做一些填充工作。
  7. 有「简单动画」能力,在 Powerpoint 指一部分动画效果,在 Beamer 里指 \pause 命令。
  8. 有「演讲者视图」,可以展示仅演讲者可见的提示或笔记。
  9. 能够方便地随意放置图片、以及图片之间的层叠覆盖,即基于页面的绝对定位布局。
  10. 能够加入一些箭头、高亮或说明文本,对 Slides 的内容进行解释。
  11. 能够加入 GIF 动图或者视频。
  12. 能够通过在线链接进行更方便的分享和放映,也能分发普通 PDF 文件作为讲义。
  13. 能有动态过渡动画效果,例如淡入淡出、平滑等。

LaTeX 的 Beamer 能够实现 1~7,再使用类似于 pdfpc 这样的工具也能实现 8,但是 9~13 就很难做到了。

PowerPoint 作为最老牌的所示即所得 Slides 软件,可以很方便地支持 5~11,也能一定程度上实现 4 数学公式支持,但是并不方便。而无论是行内代码、代码块或伪代码,PowerPoint 的表现都不尽人意,主要还是在于不方便,不够自动化。而 1 的自动化进度条更是难以找到解决方案,主要根源在于 PowerPoint 并不是一个可编程的 Slides 软件,也许只能靠插件实现这些功能。

而 Typst 实际上能够实现 1~13 大部分能力,只有动态过渡动画效果目前还是难以实现。(后续支持 HTML 导出后 可能就可以实现了,未来可期?)

其中 1~6 可以通过定位类似于 Beamer 的 Polylux 实现,里面提供了一些简单的内置模板,当然你也可以实现一个自己的模板,相信使用 Typst 提供的简单语法,做到这件事并不难。

而关于 8,你可以使用 Touying HTML 导出 来实现放映,还支持导出为 PPTX 格式。或者你也可以选择使用 Touying 的 Pdfpc 支持或 Pympress 支持。

而关于 11,虽然 Typst 的 PDF 导出确实不支持 GIF 动图和视频,但是你可以使用 Typst Preview 插件实现 GIF 动图的预览,以及 Touying HTML 导出 也是支持 GIF 动图的。

而关于 9 和 10,你可以使用我开发的一个 Typst 包 Pinit,其提供了一个基于页面绝对定位与基于「图钉」pins 相对定位的能力,可以很方便地实现箭头指示与解释说明的效果。

下面我们具体介绍一下 Touying 的特殊且强大的能力。

现代化的模板

Touying 内置的模板足够美观大方,你可以简单地开箱即用。Touying 提供了许多内置主题模板,你可以在 这里 找到。

Metropolis 主题:

Dewdrop 主题:

University 主题:

Aqua 主题:

当然,基于 Typst 提供的简洁语法,你当然也可以自定义一个自己喜欢的主题。

动画

Touying 支持各种各样的动画命令,最简单的动画命令是 #pause 和 #meanwhile。

#pause 的用途很简单,就是用于将后续的内容放到下一张子幻灯片中,并且可以使用多个 #pause 以创建多张子幻灯片,一个简单的例子:

1
2
3
4
5
6
7
#slide[
First #pause Second

#pause

Third
]

有些情况下,我们需要在 #pause 的同时展示一些其他内容,这时候我们就可以用 #meanwhile。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#slide[
First

#pause

Second

#meanwhile

Third

#pause

Fourth
]

Touying 还支持 数学公式 内部、CeTZ 和 Fletcher 等 其他作图包 内部使用 #pause 和 #meanwhile 命令:

其中 CeTZ 和 Fletcher 是 Typst 里十分强大便捷的绘图包,可以对标 LaTeX 中的 TikZ。

样式块

Typst 提供了许多样式块或者定理块包,例如 showybox 和 ctheorems 包:

可以很方便地为你的 Slides 加入美观的样式块,更好地突出你需要展示的内容。

数学公式

Typst 的数学公式语法确实与 LaTeX 数学公式语法不同,这是为了实现更简洁易懂的数学公式语法,例如 (x + 1) / x >= 1 => 1/x >= 0 与 \frac{x + 1}{x} \ge 1 \Rightarrow \frac{1}{x} \ge 0,前者显然更为简洁易懂。

但如果你需要在 Typst 里实时书写和渲染 LaTeX 公式,也可以做到,你可以使用 MiTeX 包,可以随时复用你已有的 LaTeX 数学公式。

1
2
3
4
5
6
7
8
9
10
11
#import "@preview/mitex:0.2.4": *

Write inline equations like #mi("x") or #mi[y].

Also block equations (this case is from #text(blue.lighten(20%), link("https://katex.org/")[katex.org])):

#mitex(`
f(x) = \int_{-\infty}^\infty
\hat f(\xi)\,e^{2 \pi i \xi x}
\,d\xi
`)

相对定位标注

你可以使用我开发的一个 Typst 包 Pinit,其提供了一个基于页面绝对定位与基于「图钉」pins 相对定位的能力,可以很方便地实现箭头指示与解释说明的效果。

这种能力对编写 Slides 十分有帮助,你可以随意地对已有的内容使用箭头进行标注,达到和 PowerPoint 一样强大的任意布局能力。

放映工具

Touying 支持多种放映工具,常见方式如下:

纯 PDF 格式:导出纯 PDF 格式,使用任意的 PDF Viewer 或浏览器进行放映。

Pdfpc 格式:导出 PDF 文件和 .pdfpc 文件,然后使用 Pdfpc 工具进行放映,可支持「演讲者视图」功能,但缺点是 Windows 上安装不方便。

Pympress 放映:导出右侧带有笔记的 PDF 文件,然后使用强大的 PDF 放映工具 pympress 进行放映。

PowerPoint 放映:通过 Touying Exporter 工具导出为 PPTX 格式,其本质就是内嵌了许多 PNG 图片且带演讲者注释的 PPTX 打包文件,但用来放映也完全足够。

HTML 导出与在线放映:通过 Touying Exporter 工具导出为 HTML 格式,其使用了 impress.js 框架,将 Slides 导出为 SVG 格式并封装成了一个独立的 HTML 文件,既可以直接打开 HTML 文件,也可以将其部署到 GitHub Pages 等地方,打开链接直接在线放映。由于支持 GIF 动图和演讲者视图,还能线下或线上分发,因此这是最推荐的放映方式。

你还可以使用 Touying 提供的 Template 仓库,只需要鼠标点击几下复制一个仓库,就能通过 GitHub Pages 创建一个你自己的 在线放映链接。

使用搜索:谷歌必应百度