A normal paper, styled with Typst,the first page of a PDF paper, filled with placeholder text, showing a title, authors, an abstract, and two-column text with sections
a set of equations
a Python code block where some lines have been highlighted in different colors https://typst.app/universe/package/codly
a song with lyrics and chords above the lyrics, plus the digitations for the corresponding guitar chords
a dataflow diagram with an input, three processing steps and an output, joined with arrows of various styles https://typst.app/universe/package/fletcher
a set of slides in a PDF document, one slide per page:https://typst.app/universe/package/polylux
a Gantt chart with three sections and activities in each section:https://typst.app/universe/package/timeliney
a chess board:https://typst.app/universe/package/board-n-pieces
a diagram of a network packet or similar, showing the use of each bit in the packet:https://typst.app/universe/package/bytefield
a circuit diagram of a basic processor, showing the data path:https://typst.app/universe/package/circuiteria
several keyboard shortcuts, displayed as rectangles that represent the key combinations:https://typst.app/universe/package/keyle
some integral approximations (Riemann sums) where the area under a curve is approximated by rectangles that go up to the curve:https://typst.app/universe/package/riesketcher
two side-by-side versions of an exam, where one is unfilled and the other has the solutions:https://typst.app/universe/package/tutor
a digital timing/waveform diagram, with a clock signal that toggles periodically, a bus that changes values, and a “wire” signal:https://typst.app/universe/package/wavy
a checklist with multiple checks to be performed for a plane:https://typst.app/universe/package/aero-check
a CV with personal data, previous experience, education, skills, languages and other information:https://typst.app/universe/package/grotesk-cv
an invoice with recipient information, a table of bought items, pricing and payment information:
a directed graph/tree layout:https://github.com/cetz-package/cetz/blob/master/gallery/tree.typ
a badge/diploma for a participant in a congress, containing the person’s name, some logos, and a QR code:https://forum.typst.app/t/using-typst-for-event-badges/128
Typst 介绍
Typst 的目标是类似于 LaTeX:“它旨在与 LaTeX 一样强大,同时更容易学习和使用”。它支持的结构是标记/排版系统中的传统结构,这些也与 HTML 和编译为 HTML 的语言(如 Markdown)中的结构类似:文本段落、多个级别的标题、有序和无序列表、粗体和斜体、图像、表格、脚注、超链接等。
它还具有在网页内容(例如 HTML 和 Markdown)中不太常见的元素,但在学术文档中非常常见(即 LaTeX,在一定程度上还有 MS Word):编号的图像和表格、对这些编号的图像、表格和标题的自动交叉引用;自动更新的目录、表格目录、图像目录、公式或代码块目录、不同的页面大小、大量的数学/公式符号、文档作者和创建日期的概念,以及用于绘制图形(TikZ 的等效物)或构建演示文稿幻灯片(Beamer 的等效物)的包生态系统。
[John], N/A, A, N/A, [Mary], N/A, A, A, [Robert], B, A, B, )
这将生成类似这样的内容(为了清晰起见,这里没有显示一些样式):
在 LaTeX 下的代码如下:
\begin{tabular}{|l|l|l|l|} \hline & Exam 1 & Exam 2 & Exam 3 \\ \hline John & N/A & A & N/A \\ \hline Mary & N/A & A & A \\ \hline Robert & B & A & B \\ \hline \end{tabular}
方程和内容样式超出了 Markdown 的范围。它们可以在其他地方处理,在解析 Markdown 文档并呈现其他内容的应用程序中,通常是 HTML,或者以 HTML 为中间步骤生成 PDF(将 HTML 文档转换为 PDF 是一个相对机械的过程,可以使用浏览器或 Qt 的 WebKit 引擎等 HTML 渲染引擎)。
目录同样由文本行组成,但它们不是任意的文本行:目录的数据来自文档中其他地方定义的标题/章节名称,并按顺序呈现,可能保留其层次结构(例如,子章节相对于其父章节缩进显示),每个条目旁边可能有页码(这又是 PDF 特有的概念,在 Web 上没有意义,因为每一页都在一个无限高的容器中)显示在右侧,用字符(例如点 .)填充标题结尾和页码之间的空间。所有这些功能都可以手动键入文本行,但目录这一更高层次的概念已经隐含了所有这些约束,使作者免去了维护目录格式的工作。可以说,这是专注于论文和类似文档的工具存在的最大原因之一:它们直接在语言中提供了更高层次的概念。
与 Word、Google Docs 和其他文本处理器相比
当然,不使用 LaTeX 撰写论文的人很可能使用 Word 或其他等效的文本处理器(需要引用)。Word 的优势在于,它可能是世界上最知名的(桌面)软件之一(令人惊讶的是,似乎没有一个容易找到的桌面环境中最常用应用程序的图表)。现在,通过 Office 的云订阅计划(称为 Office 365,我认为?),它也支持多人同时编辑,这对于协作编辑非常有用。
还有 Google Docs,它是 Google“办公工具”套件的一部分。它将所有内容链接到您的 Google 帐户,而 Word 则链接到您的 Microsoft 帐户(如果您愿意的话。目前,Word 仍然可以在没有连接到母公司的状态下工作……看着你,Windows 11!)。作为一个以 Web 为中心的应用程序(与 Word 不同,Word 是在互联网尚未普及的时代诞生的,因此是一个桌面时代的产物),Google Docs 只能通过浏览器访问(忽略伪装成浏览器的应用程序,例如 PWA,我无法验证这些是否被 Google Docs 使用)。Google Docs 内置了云保存和协作功能。其界面也与 Word 不同:Word 使用功能区,而 Google Docs 使用更传统的菜单栏和下拉菜单,加上右键点击上下文菜单。因此,Google Docs 为文档本身分配了更多的屏幕空间。
另一方面,由于样式是应用于内容之上的,通常更难全局应用样式,除非有一种声明“样式”的方法,这些样式可以稍后应用于“内容”。公平地说,Word、Google Docs、LibreOffice 和其他工具确实支持样式,即一组属性(如字体大小、颜色、行间距、内容是否编号、缩进、对齐方式等),这些属性可以一次性应用于内容的多个部分。例如,在 Word 文档中,大多数内容可能采用 Normal 样式,这是标准的普通文本。章节标题可能是 Heading 1,子章节标题可能是 Heading 2,整个文档的标题可能是 Title,等等。事实上,通常可以通过识别传统淡蓝色的 Heading 1(或 2 或 3)样式的章节标题来辨别 Word 文档:
然而,这些样式的可选性意味着您可以自由忽略它们,并直接对文档的部分内容进行更改。需要行与行之间有更多间距吗?大多数人可能会使用 Ctrl+A 选择整个文档(或者更可能的是,从文档开头点击然后拖动到底部),然后更改间距。这将把新设置应用于已存在的所有内容,然后 Word 会在按下 Enter 键插入的新段落中继续应用相同的样式……
此外,图形工具还存在一些小麻烦:尝试在 Word 中输入三十个参考文献?至少在我以前撰写论文时,这是一项非常枯燥的任务:打开引用对话框,点击新建,选择一种引用类型,然后手动点击并填写多个文本字段,再点击保存,然后对剩下的二十九个引用重复这个过程。造成这种情况的根本原因是,点击操作比复制粘贴文本要慢,而且 Word 没有类似模板的文本表示形式。相比之下,Google Scholar(以及其他可能生成参考文献的网站)可以非常容易地提供将参考文献导入 LaTeX 的方法:
实际引用是一段纯文本,可以复制到剪贴板中,通过电子邮件或短信传递,并粘贴到文件中。试着用 Word 做这件事:
@book{vulis1992modern, title={Modern TEX and its Applications}, author={Vulis, Michael}, year={1992}, publisher={CRC Press} }
而且不要忘了,Word 和类似软件并不是排版系统,因此通常不具备更高级的排版功能。你是否曾经需要在段落开头手动按几次 Enter 键,只是为了使该段落在下一页开始(或者如果你够高级,可以按 Ctrl+Enter 插入分页符)?这就是 Word 没有试图防止孤行和寡行。你是否遇到过某些两端对齐的段落中,某一行单词之间的间距异常大?这是因为使用了不够理想的对齐算法。据我所知,默认情况下 Word 不会使用连字(例如,在“official”一词中的 f 和 i 之间)。LaTeX 爱好者从其视角编写了一份长长的差异列表(尽管需要注意,该列表大约是 2008 年的,而 Word 在此期间可能已经发生了很大变化。LaTeX 更稳定,应该变化不大)。确实,其中大多数都是很小的变化,除非你真的喜欢字体或将其与其它对比,否则很难察觉,但仍然存在。
文本处理器通常使用一种较为不透明的数据格式作为文档的存储后端(例如,Word 的 DOCX 文档实际上是伪装成 ZIP 文件的,里面装满了 XML 文档)。这意味着它们不太适合自动化处理,换句话说,无法像模板那样自动生成包含可变信息的文档(例如,自动信函总是以“亲爱的 ”开头)。当然,有许多工具可以实现这一点,但它们都必须与 DOCX 数据模型作斗争。例如,考虑这个工具,它允许你在文档中插入可变数据,方法是在变量周围加上双方括号,[[variable]]:
在他们的文档中有以下段落:
★
表面上,Templater 看起来就像一个邮件合并解决方案。你可以在文档的特定位置放置标签,并在稍后用实际值替换它们。有人可能会疑惑,为什么需要一个库来实现这一点,因为 OOXML 只是一个包含 XML 文件的 ZIP 文件,可以轻松编辑/操作。
★
但即使在这样一个简单的用例中也存在障碍,因为 Word 倾向于将文本拆分为段落,因此即使是像 [[TAG]] 这样简单的文本也经常看起来像
"00A42204"> "en-US"/>
[[
type="spellStart"/> "00A42204"> "en-US"/>
TAG
type="spellEnd"/> "00A42204"> "en-US"/>
"preserve">]]
★
其中包含了许多对原始[[TAG]]文本来说并不真正相关的“无用”的 Word 特定信息。还有一些 Word 特定的规则,例如 xml:space=“preserve”,在处理过程中必须遵守。
★
一旦开始使用表格和列表,替换标签就不再仅仅是:“在 XML 中定位并替换标签值”。随着图像和特殊的 Word 对象(如图表,其实是在 Word 压缩包内的嵌入式 Excel 文件)的加入,更改标签需要对 Word 的行为、格式和规则有深入的了解。因此,即使开发者对 OOXML 格式非常熟悉,一个能够应对这些调整的库仍然可以提供很大的帮助。
哎呀。当即使是简单的单词也无法在源 XML 文档中保留时,事情就变得非常棘手了。天真的文本替换或传统文本模板引擎(例如,在服务器端 HTML 框架中使用的 Jinja 或 Go 的 text/template)无法在这些 XML 文档上工作,因为它们依赖于特殊的标记(通常是{{ some_var }}或类似的东西),而正如我们上面所见,Word 会将这些标记拆分为不同的 XML 元素,因此{{ ... }}的字面内容在 XML 中任何地方都不会出现。这还是在我们开始处理重复项(比如你想将一个项目列表渲染为项目符号列表)、条件格式(例如,将列表中的某些项目涂成红色或有条件地加粗)、表格(你可能想要重复几行)、插入图像或图表(这涉及到整个嵌入的 Excel 文档,其中包含为表格提供数据的信息)、尝试在页眉中添加数据(例如今天的日期)、将可变数据作为水印添加或其他更高级的替换之前的情况,事情很快就会变得很糟糕。
相比之下,像 LaTeX 或 Typst 这样的工具,源数据是一个纯文本文件,与模板工具非常配合。没有幕后的神秘语法被添加。因此,在文档中包含自动数据相对容易实现:我们可以使用任何文本模板引擎在 LaTeX/Typst 文档中插入所需的标签和/或指令,然后用相应的引擎渲染生成 LaTeX/Typst 文档,再用 TeX 或 Typst 分别渲染该文档以生成 PDF 文档。关键在于,由于源文档是纯文本,有很多工具可以处理它们,而不像 Word 那些奇怪的 XML 文档。
我们将在后面的部分看到更多关于使用 Typst 进行文档模板化的示例。
从 Typst 或 LaTeX 模板生成报告或其他自动文档的问题在于它们会呈现为 PDF。这意味着输出基本上已经固定了。虽然有一些编辑 PDF 文档的方法(例如,Word 可以在可能牺牲一些格式的情况下进行编辑;还有 Adobe Acrobat,不是免费的 Reader 版本,它可以以每月 12.99 美元,即每年约 150 美元的价格进行编辑),但这些方法要么笨拙,要么需要付费。因此,没有简单的方法来预先渲染文档的大部分内容,比如那些总是相同或可以直接从某些数据源填充的无聊部分,然后再将半填充的文档交给一个人进行最后的润色或修改。能够模板化 Word 文档的工具通常可以接收一个 Word 文档并输出另一个 Word 文档,这对于人们后续编辑来说要容易得多;它们不会将其输出冻结在一个难以编辑的 PDF 中。
总结一下:像 Word 或 Google Docs 这样的文本/字处理软件与 LaTeX 或 Typst 这样的排版系统是不同类型的工具。它们更加通用,但在抽象层次上较低(由于需要更加通用)。WYSIWYG 编辑器中样式和内容的混合意味着文档内或多个文档之间的样式或内容模式更容易失去同步。而 LaTeX 和 Typst(以及 HTML)具有“语义”注释的层次,这意味着它不是“这一行是 14 号 Arial 字体,加粗,左对齐,带有两级编号”,而是“这一行应用了子标题的样式”,这是一个更高层次的概念。此外,由于 DOCX 文档中的原始信息存储在 XML 文件中,使用它们作为包含可变信息的文档模板相当困难,而基于纯文本的格式如 Markdown、HTML、LaTeX 和 Typst 则很容易实现这种模板化。