专栏名称: LaTeX工作室
欢迎光临分享与学习LaTeX的王国
目录
相关文章推荐
51好读  ›  专栏  ›  LaTeX工作室

探索 Typst,一种类似于 LaTeX 的新排版系统(1)

LaTeX工作室  · 公众号  ·  · 2024-10-23 21:25

正文

请到「今天看啥」查看全文


你好!今天我们将回顾 Typst(“Ty”代表排版,“pst”代表时尚),这是一种用于编写文本文档(通常是 PDF 文档)的语言和工具。这将是一篇很长的文章;它一开始很小,但后来不断增长。

Typst 的精神和目标与 LaTeX 相似:它是一种排版工具,可以用于编写和生成文档,通常是 PDF 文件。它旨在用于学术/科学环境,就像 LaTeX 如今一样。

Typst 是撰写任何形式的长篇文本(如论文、文章、科学论文、书籍、报告和家庭作业)的好选择。此外,对于包含数学符号的文档,例如数学、物理和工程领域的论文,Typst 也非常适用。最后,由于其强大的样式和自动化功能,它是任何共享共同样式的文档集(如系列丛书)的绝佳选择。https://typst.app/docs/tutorial/

由于这是互联网,我们将首先从“人们的真相来源”Reddit™ 开始。这里有一个关于/r/LaTeX 的帖子(https://www.reddit.com/r/LaTeX/comments/zyuyfc/has_anyone_tried_typst/),正如你所预期的那样,如果有什么偏向的话,应该是偏向 LaTeX 的。而天哪,这难道不是整个宇宙中最友好、最文明的 Reddit 帖子吗?真的。在 LaTeX 社区中讨论 LaTeX 的替代品时,只有一个(1)不礼貌的评论。这个评论已经有两年的历史了,所以其中提到的一些缺点(例如计数器的自省功能以及编译器未开源)已经被解决。

在本文中,我们将回顾 Typst 的语法,并将其与 LaTeX 和 Markdown 进行比较。我们将了解 Typst 通常的使用方式,然后探讨其在一种未在文档中提及的场景中的适用性:使用 Typst 生成遵循模板并需要填充变量数据的 PDF 报告、发票和其他类似文件。

顺便说一句:在本文中,我将提到 LaTeX 作为 Typst 的比较对象,即使 LaTeX 实际上是一系列宏(https://tex.stackexchange.com/questions/49/what-is-the-difference-between-tex-and-latex),底层使用的是 TeX,某些属性(例如布局算法)更恰当地归属于 TeX 而非 LaTeX。而其他属性(例如屏幕左侧显示原始 LaTeX 文件,右侧显示渲染后的 PDF 的 UI 模式)实际上是处理 LaTeX 文档的编辑程序的属性,而不是 LaTeX 本身。简而言之,每当你在本文中看到 LaTeX 时,它实际上可能指的是“LaTeX 周边的一系列工具和程序”,而不一定是 LaTeX 本身,因为做出所有这些区分可能会令人困惑,并且对于本文的目的来说并不会提供额外的清晰度。

样例展示

在开始之前,让我们展示一些用 Typst 制作的文档。它们可能看起来与 LaTeX 制作的文档相似,但这正是目的:如果它能接近伟大的 LaTeX,那就算成功了!LaTeX 经历了几十年的时间,有大量非常聪明的人投入了大量非常聪明的工作。

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 的等效物)的包生态系统。

简而言之,Typst 旨在提供与 LaTeX 提供的几乎相同的元素。许多元素已经存在,那些尚未存在的可能稍后会添加,因为 Typst 仍然是一个非常年轻的项目。

Typst、LaTeX 和 Markdown

Typst 语言的语法更接近 Markdown 而不是 LaTeX。

比较 Markdown:

# A Sample Document

## Introduction

This is an introduction.

## Section One

* A
* B
* C

Figure 1 shows a figure. As can be seen,
the figure depicts an image of a picture.

![Figure 1: Observe the image in the picture](image.jpg)

[This is a link](https://example.com)

LaTeX 代码:

\documentclass[12pt, a4paper]{article}

\usepackage{graphicx}
\usepackage{hyperref}

\title{A Sample Document}
\author{My Name}
\date{\today}

\begin{document}
\maketitle

\section{Introduction}
This is an introduction.

\section{Section One}
\begin{itemize}
 \item{A}
 \item{B}
 \item{C}
\end{itemize}

Figure \ref{fig:figure} shows a figure. As can be seen,
the figure depicts an image of a picture.

\begin{figure}[h]
    \centering
    \includegraphics[width=0.7\textwidth]{image}
    \caption{Observe the image in the picture}
    \label{fig:figure}
\end{figure}

\href{https://example.com}{This is a link}
\end{document}

Typst 代码:

= Introduction

This is an introduction.

= Section One

- A
- B
- C

@figure shows a figure. As can be seen, the figure depicts
an image of a picture.

#figure(
  image("image.jpg", width: 70%),
  caption: [
    Observe the image in the picture
  ],


#link("https://example.com")[This is a link]

现在我们来将 Typst 逐个与 LaTeX、Markdown 和 Word 及类似编辑器进行比较。

对照 LaTeX

与 LaTeX 相比,Typst 的代码量要少得多。例如,标题不是 \section{Title} ,而是 = Title ,这与 Markdown 的 # Title 风格一致。链接不是先用 \usepackage{hyperref} 再用 \href{https://example.com}{这是个链接} ,而是直接用 #link("https://example.com")[这是个链接] ,同样非常类似于 Markdown。等等。Typst 在编写特殊元素时,对以反斜杠开头的宏依赖较少,而是为最常见的操作使用专用语法(例如,无序列表即项目符号列表使用 - 作为每个条目。有序列表则使用+。标题使用 = ,每级一个 = 。引用使用创建引用, @tag 用于引用它。加粗和斜体使用 内容 内容 。代码使用`反引号`)。

对于没有专用语法的内容,则使用“函数调用”,这与编程语言中的函数调用非常相似。例如,添加删除线:

This is #strike[not] relevant.

而对于 LaTeX






    
\usepackage{soul}

This is \st{relevant}

函数调用语法与 LaTeX 的宏非常相似,只是 LaTeX 的反斜杠被数字/井号 # 取代,参数不是放在大括号内,而是放在常规的圆括号和方括号内。

更复杂的语法,比如表格,看起来也很相似:

#table(
  columns: 4,
  [], [Exam 1], [Exam 2], [Exam 3],

  [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}

再次,略有相似之处。LaTeX 的表格可能稍微不那么整洁,例如显式的换行符和列分隔符,以及表示(即 \hlines)与数据(单元格的实际内容)混合的方式。

Typst 也可以读取 BibLaTeX 格式的参考文献,这很好,因为许多工具(如 Google Scholar 或 Mendeley)可以导出这种格式的引用。它还可以使用 Hayagriva,另一种基于 YAML 的格式(也是由 Typst 开发的)。

harry:
    type: Book
    title: Harry Potter and the Order of the Phoenix
    author: Rowling, J. K.
    volume: 5
    page-total: 768
    date: 2003-06-21

electronic:
    type: Web
    title: Ishkur's Guide to Electronic Music
    serial-number: v2.5
    author: Ishkur
    url: http://www.techno.org/electronic-music-guide/

引用的时候是这样的:

@electronic states that electronic music is made by electrons.

再次,这与 LaTeX 的 \cite{electronic} 非常相似。与 LaTeX 不同的是,完全相同的语法也用于插入交叉引用:例如,如果你有一个带有 table_label 标签的表格,你也可以通过@table_label 插入对表格的引用。LaTeX 使用不同的命令, \cite{} 用于引用, \ref{} 用于交叉引用。另一个区别是,LaTeX 的引用仅插入编号(例如,你会写 Figure~\ref{fig:something} shows that... ,而 LaTeX 只会替换编号),而 Typst 的引用会插入整个名称+编号(即,你会写 @fig_something shows that... ,而 @fig_something 引用会被替换为 Figure 1 或类似的内容)。

方程也得到了支持(正如你所期望的,任何试图与 LaTeX 相提并论的东西都会如此)。既支持行内方程(即在段落内、在正常文本流中排版的方程),也支持块模式(独立段落设置的方程):

#set math.equation(numbering: "(1)")

It has always been known that, for physicists, $pi = 3$.

Proof:

$
  & pi = 3.14 \
  & 3.14 = 3 \
  therefore & pi = 3
$

LaTeX 代码:

\usepackage{amssymb}
\usepackage{amsmath}

It has always been known that, for physicists, $\pi = 3$.

Proof:

\begin{equation}
\begin{split}
 & \pi = 3.14 \\
 & 3.14 = 3 \\
 \therefore & \pi = 3
\end{split}
\end{equation}

编译输出:

可能方程式最大的不同在于,在 Typst 中,符号是通过普通单词插入的。例如,观察内联方程式 $pi = 3$ :pi 被转换为实际的 π 符号。(开头的美元符号不是 pi 符号的一部分,它是整个内联方程式的定界符,类似于 LaTeX 中的情况)。在 LaTeX 中,符号始终需要反斜杠。同样的情况也发生在构成因此符号 ∴ 的三角形中的三个点:LaTeX 需要反斜杠,而 Typst 不需要。在 LaTeX 中仅写入没有反斜杠的 pi 会被解释为两个变量 p 和 i,它们将以斜体形式排版。Typst 只对单个字母的单词这样做。任何比这更长的内容都会被解释为符号。要编写实际的变量序列(例如 ab > 0,其中 a 和 b 是相乘的),您需要在它们之间留一个空格:a b > 0。要编写不应由斜体字母序列组成的实际文本,您可以用双引号将其包裹起来: { x | x "is positive" }

LaTeX 代码如下:

\{ x \mid x \textrm{ is positive} \}

与 Markdown 的对比

正如我们所见,Typst 中最常见的语法结构看起来与 Markdown 相当接近。特别是标题、粗体和斜体、链接和列表(有序和无序)使用的特殊字符非常少,虽然这些字符不是 Markdown 的,但实现了相同的目的。

尽管如此,Markdown 和 Typst 在目标上存在显著差异。Markdown 的典型目标通常是 Markdown 本身(例如,当你使用 Markdown 记笔记时,就像在 Obsidian 和 Joplin 笔记应用程序中所做的那样,这些应用程序将笔记存储为 Markdown)或 HTML(例如,在包含在 Github 仓库中的 README 文件中,或者在一些网站生成器如 Hugo 中,这个博客至少目前就是这样编写的)。因此,Markdown 的数据模型是 HTML 可用元素的一个受限子集,具有更少的语法(例如,一级标题 # Title 被转换为

Title

。图像 ![alt](link) 被转换为 link" alt="alt"> ,并且没有对大小的原生控制)。

换句话说,Markdown 是网络时代的产物,适用于网络。通常不会出现在网页上的内容也不会出现在 Markdown 中。这意味着目录、下划线文本(在网络中几乎唯一表示超链接,因此不应用于非超链接的内容)、公式、引用、文档作者的概念或文档其他部分的交叉引用(尽管大多数 Markdown 处理器支持交叉链接,但不会自动插入像“第 2.1 节”这样的文本,其中数字是链接目标的正确编号)。

由于专注于 Web,Markdown 的文档也喜欢生活在单个垂直无限的页面上(网页通常没有分页符)。

相比之下,Typst 和 LaTeX 在由一定数量的矩形页面组成的 PDF 文档世界中运行,这些页面可能带有页码。在 Markdown 中,您永远找不到将页面大小设置为 A4 的选项……因为在 Web 上这毫无意义!同样适用于边距、页码、在“每页顶部”添加当前章节、每页页眉和页脚、有关奇数页与偶数页的所有内容(例如,将页码对齐到右侧或左侧,或在左边缘为装订留出不对称边距)、根据需要留出空白页以使章节在打印书籍时始终从右侧开始,或者防止孤行和遗行(即分别留在页面顶部和底部的非常短的一两行段落)。

然而,所有这些都由 LaTeX 和 Typst 提供。简而言之:如果您的文档将成为具有独立页面的 PDF,并且不仅仅是一系列文本和图像(这些可以按顺序转储到页面上,在页面空间用尽时断开),那么 Markdown 并不是很有用,因为它不提供页面感知功能。

此外,Markdown 没有内置支持一些在学术/科学文档中使用(并且可以说是至关重要的)的功能:

  • 引用和参考文献
  • 交叉引用(例如,在文本的其他部分引用表 1、图 2 或第 3.4 节)
  • 公式(某些工具,如 Hugo,确实支持公式,但这不是 Markdown 的关注点:这些内容由其他工具处理,Markdown 会忽略所有这些内容)
  • 带标题的图像。Markdown 的图像,如 ![alt text](link) ,仅被渲染为``元素。这可以添加,但超出了 Markdown 本身的功能
  • 带标题的表格,对于交叉引用这些表格是必要的
  • 直接在 Markdown 中对内容进行样式化的方法。例如,无法将某个单词设置为红色。如果将 Markdown 文档转换为 HTML,有时可以使用 Markdown 渲染工具提供一个 CSS 文件来对输出内容进行样式化。特别是,Markdown 不提供任何功能来使所有章节标题以 Arial 12 磅加粗字体显示,这可能是您想提交论文的期刊所要求的。

请注意,所有这些都可以手动添加。例如,引用可以逐字键入,如参见[2]以了解可用方法的综述...(即,实际的 2 被实际的括号包围),然后在最后可以添加一个# 参考文献部分,其中每个参考文献都是手动编写的,包括分配给它的编号、作者、标题、期刊等。当然,一旦添加了另一个参考文献,可能需要重新排列所有现有参考文献(因为某些参考文献样式要求参考文献按第一作者的姓氏或其他条件排序),并且对重新排列的参考文献的所有引用都需要更新。图像说明可以通过将图像包裹在一个两行的表格中来添加,其中第一行包含图像,第二行直接写明图 1:图像的标题。这不能用于表格,但可以在表格上方或下方单独插入一个段落作为表格标题。然后,“交叉引用”可以是直接的词语图 1 显示了...。当然,同样地,如果需要在两个图或表之间插入另一个图或表,它会导致所有后续条目的编号发生变化,从而要求对这些元素的所有引用也进行更改。

方程和内容样式超出了 Markdown 的范围。它们可以在其他地方处理,在解析 Markdown 文档并呈现其他内容的应用程序中,通常是 HTML,或者以 HTML 为中间步骤生成 PDF(将 HTML 文档转换为 PDF 是一个相对机械的过程,可以使用浏览器或 Qt 的 WebKit 引擎等 HTML 渲染引擎)。

一般来说,Markdown 的问题(仅在尝试将其用作 LaTeX 替代品时才会出现。Markdown 对其功能范围内的应用来说已经足够好)在于它不在“研究论文”的抽象层(因此也不涉及相应的概念)上运行。它在“文本文档”层面上运行。在文本文档的世界里,重要的实体是段落、句子、标题、图像、列表、表格、超链接等。而研究论文的世界还关注参考文献、图表、目录等。请注意,科学论文中发现的高层次概念实际上是低层次概念的组合:引用实际上只是一个超链接,显示一些文本,但它体现了一些额外的想法,例如特定的格式(如用于 IEEE 风格引用的 [1]),其超链接指向文档中的另一个位置(即参考文献列表中的相应条目),并且当其对应的参考文献重新排序时能够自动更改。

同样地,论文中的图表由原始图像(一个充满彩色像素的矩形)+ 文字(图注)组成,但它们受到额外的限制:图像和文字属于同一个实体,因此作为一个整体移动(即,没有合理的排版系统会将图像放在一页的末尾,而将其图注放在下一页的开头,而是将两个元素一起放在某一页上)。提供的图注会自动加上类似“图 1:”的前缀,图表的编号会自动生成(顺便说一句,这个编号与可能用于章节名称、表格、代码块和其他枚举元素的类似计数器是分开的),并且可以创建引用,这些引用会自动替换为图表的当前编号。

目录同样由文本行组成,但它们不是任意的文本行:目录的数据来自文档中其他地方定义的标题/章节名称,并按顺序呈现,可能保留其层次结构(例如,子章节相对于其父章节缩进显示),每个条目旁边可能有页码(这又是 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 为文档本身分配了更多的屏幕空间。

还有其他人:LibreOffice(与 Ubuntu 捆绑)、OpenOffice(LibreOffice 在 2010 年从中分离出来)、OnlyOffice、WPS Office、Apple Pages,可能还有无数其他软件。

所有这些应用程序都有一个共同点:它们都是所见即所得的文本/文字处理器,也称为“awhat you see is what you get”,即你编辑的文档与其最终形式具有相同的外观:

所见即所得是相对于早期交互方式的巨大进步,在早期交互方式中,用户以更抽象的方式指定其目标,并且直到很久之后才能看到结果。例如,在所见即所得界面中,要将文本加粗,你可以用鼠标突出显示文本,然后从格式菜单中选择“加粗”命令。简单。更重要的是,一旦选择了格式命令,文档的屏幕显示就会立即反映出新的格式。在任何时候,你在屏幕上看到的就是你构建的内容,也是打印出来的样子。Jakob Nielsen, https://www.nngroup.com/articles/rip-wysiwyg/

这与 LaTeX 相反,在 LaTeX 中,例如加粗文本是通过在源(纯文本)文档中用 \textbf{...} 包围来实现的,然后观察渲染后的 PDF 中的变化;Typst 和 Markdown 中则是用 *...* 包围;HTML 中则用...>包围。在这所有的情况下,文本的格式化都是通过在其周围添加更多文本来完成的:格式化并不是一种神奇的属性,而是靠近(通常是围绕)“目标”文本的更多文本。另一方面,在 Word、Google Docs 等工具中,格式化存在于一个不同的领域,“覆盖”在内容之上,而不是与之并列。

这意味着所见即所得编辑器更容易被人们掌握,因为执行的操作会立即反映在原地,而不是作为生成另一个文档的构建过程的指令。

另一方面,由于样式是应用于内容之上的,通常更难全局应用样式,除非有一种声明“样式”的方法,这些样式可以稍后应用于“内容”。公平地说,Word、Google Docs、LibreOffice 和其他工具确实支持样式,即一组属性(如字体大小、颜色、行间距、内容是否编号、缩进、对齐方式等),这些属性可以一次性应用于内容的多个部分。例如,在 Word 文档中,大多数内容可能采用 Normal 样式,这是标准的普通文本。章节标题可能是 Heading 1,子章节标题可能是 Heading 2,整个文档的标题可能是 Title,等等。事实上,通常可以通过识别传统淡蓝色的 Heading 1(或 2 或 3)样式的章节标题来辨别 Word 文档:

然而,这些样式的可选性意味着您可以自由忽略它们,并直接对文档的部分内容进行更改。需要行与行之间有更多间距吗?大多数人可能会使用 Ctrl+A 选择整个文档(或者更可能的是,从文档开头点击然后拖动到底部),然后更改间距。这将把新设置应用于已存在的所有内容,然后 Word 会在按下 Enter 键插入的新段落中继续应用相同的样式……

直到它不起作用为止,某个段落莫名其妙地恢复了原始行距。或者您从网页粘贴了一些内容,它带来了自己的格式,您单击清除格式按钮将其删除,自定义间距也随之丢失。

此外,通过样式(即样式)应用的样式与手动应用的样式在 WYSIWYG 应用程序中是无法区分的。这就是重点!换句话说,这两行看起来是一样的:

第二行是手动设置以匹配标题样式。但实际上它没有应用标题样式,而只是一个正文文本。如果我们更改了标题样式,那么这一行将不会应用这些更改:因为在编辑器看来,它只是一段普通文本。除非点击每一处看似应用了样式的文本,并检查它是否真的应用了该样式,否则无法检测到这一点。

此外,图形工具还存在一些小麻烦:尝试在 Word 中输入三十个参考文献?至少在我以前撰写论文时,这是一项非常枯燥的任务:打开引用对话框,点击新建,选择一种引用类型,然后手动点击并填写多个文本字段,再点击保存,然后对剩下的二十九个引用重复这个过程。造成这种情况的根本原因是,点击操作比复制粘贴文本要慢,而且 Word 没有类似模板的文本表示形式。相比之下,Google Scholar(以及其他可能生成参考文献的网站)可以非常容易地提供将参考文献导入 LaTeX 的方法:

实际引用是一段纯文本,可以复制到剪贴板中,通过电子邮件或短信传递,并粘贴到文件中。试着用 Word 做这件事:

@book{vulis1992modern,
title={Modern TEX and its Applications},
author={Vulis, Michael},
year={1992},
publisher={CRC Press}
}

或者你是否见过一个由实际数字开头的编号列表?Word 会非常努力地识别那些看起来像是编号列表开头的内容,并将它们转换为实际的编号列表,但如果有人使用了非标准格式,它可能会失败。这样的列表大部分看起来像真实的编号列表,但没有列表特有的功能:没有自动递增的数字,没有自动缩进,没有添加使用不同编号样式的子列表(例如,主列表使用 1.,2.,3.,而子列表使用 a.,b.,c.)。你是否见过手动设置样式的节标题?或者手动加上标题的图片?或者(令人不寒而栗)手动编写的参考文献列表?或者手动编写并精心维护的目录?或者一个虽然自动生成但与实际文档不同步的目录?所有这些都可能发生在一般用途的文字处理器中,这些处理器并不是在“这是节标题”的抽象级别上操作,而只是在“这是一行文本”的级别上操作。

而且不要忘了,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 则很容易实现这种模板化。

最后,Word 能否做到这一点(在简历中以小圆圈显示多种语言的熟练程度)?

\cvsection{Languages}
\cvskill{English}{5}
\divider
\cvskill{Spanish}{4}
\divider
\cvskill{German}{3.5}

或者这样(将按键操作显示在小框中,例如在软件手册中)?

This is some more or less blind text,
to demonstrate how the sequence looks
in text. This \keys{\ctrl+\alt+Q} is
the result of a style which name...

或者这样(直接在文档中绘制图表)?

\begin{tikzpicture}[node distance={15mm}, thick, main/.style = {draw, circle}]
\node[main] (1) {$x_1$};
\node[main] (2) [above right of=1] {$x_2$};
\node[main] (3) [below right of=1] {$x_3$};
\node[main] (4) [above right of=3] {$x_4$};
\node[main] (5) [above right of=4] {$x_5$};
\node[main] (6) [below right of=4] {$x_6$};
\draw[->] (1) -- (2);
\draw[->] (1) -- (3);
\draw (1) to [out=135,in=90,looseness=1.5] (5);
\draw (1) to [out=180,in=270,looseness=5] (1);
\draw (2) -- (4);
\draw (3) -- (4);
\draw (5) -- (4);
\draw[->] (5) to [out=315, in=315, looseness=2.5] (3);
\draw[->] (6) -- node[midway, above right, sloped, pos=1] {+1} (4);
\end{tikzpicture}

或者,这是我个人最喜欢的这个?它是一个用于编写歌曲集的软件包,包含歌词和和弦,配备了诸如在后续诗节中重复前一诗节的和弦序列、显示需要回声的部分、仅在乐手版中出现而不在歌手版中出现的注释、吉他指法图、自动转调、智能等音(即某个和弦应该显示为 B♭ 还是 A♯,尽管它们在技术上是相同的声音。选择哪一个取决于歌曲的调式,通常由歌曲的第一个和弦决定)、圣经引用、自动索引(按标题、按作者、按圣经参考、按著名歌词如第一行)以及从同一源文档创建带和弦和不带和弦的书籍(分别供乐手和歌手使用)等功能。

\songsection{Worship Songs}

\begin{songs}{}
\beginsong{Doxology}[by={Louis Bourgeois and Thomas Ken},
                     sr={Revelation 5:13},
                     cr={Public domain.},
                     index={Praise God, from Whom all blessings flow}]
\transpose{2}
\beginverse
\[G]Praise God, \[D]from \[Em]Whom \[Bm]all \[Em]bless\[D]ings \[G]flow;
\[G]Praise Him, all \[D]crea\[Em]tures \[C]here \[G]be\[D]low;
\[Em]Praise \[D]Him \[G]a\[D]bove, \[G]ye \[C]heav'n\[D]ly \[Em]host;
\[G]Praise Fa\[Em]ther, \[D]Son, \[Am]and \[G/B G/C]Ho\[D]ly \[G]Ghost.
\[C]A\[G]men.
\endverse
\endsong
\end{songs}

或者,最后,Word 能处理鸭子吗?许多鸭子?成堆的鸭子?

\begin{tikzpicture}[scale=0.6]
\duck
\duck[xshift=90pt, scale=.3, yshift=150pt]
\duck[xshift=60pt, scale=.3, yshift=100pt]
\duck[body=gray!50!white, head=gray!50!white,
xshift=80pt, scale=.3, yshift=50pt]
\end{tikzpicture}

为了公平起见,所有这些都在 LaTeX 中完成,而不是在 Typst 中,但目的是与 Word 进行比较。Word 无法做到这些(也许可以通过宏来实现,但希望我们作为人类已经达成共识,即宏是邪恶的)。Typst 在功能上类似于 LaTeX,理论上应该能够做到所有这些。例如,所有图形示例(尤其是语言能力的圆圈、花哨的按键、带箭头的图表和鸭子)在 LaTeX 中都使用 TikZ。Typst 已经有了 cetz,“一个受 TikZ 启发的 API 用于 Typst 绘图的库”。它应该允许用户做类似的事情(否则,欢迎贡献)。对于歌本,已经有 conchord 和 chordx,它们都可以将和弦排版在歌词上方。还有 Typst 包可以绘制节点和箭头组成的图表(类似于 Graphviz/DOT)、时序/信号图、量子电路、类似 Beamer 的幻灯片、甘特图、物理量单位、棋盘(包括 Forsyth–Edwards 记谱法)、化学公式、带有事件的日历、内容旁的待办事项或编辑注释或评论、分形、家谱树、颜色匹配的括号、卡诺图、俄罗斯方块屏幕、多种类型的图表、黎曼和、芯片引脚图、试卷、真值表(自动填充!)、更多时序图等。

原文自:https://blog.jreyesr.com/posts/typst/

全新 LaTeX 知识库,入门资料,免费知识代码:

https://www.latexstudio.net/LearnLaTeX/

精心制作免费视频教程:

https://space.bilibili.com/209746320







请到「今天看啥」查看全文