diff --git a/docs/guides/guide-for-latex-users.md b/docs/guides/guide-for-latex-users.md index 38c9307f77ad..7587e9e5e184 100644 --- a/docs/guides/guide-for-latex-users.md +++ b/docs/guides/guide-for-latex-users.md @@ -4,20 +4,25 @@ description: | --- # LaTeX 用户指南 -这篇文章是写给那些已经有过 LaTeX 使用经验,并想要尝试 Typst 的用户。 -我们将从用户的角度出发,解释这两套系统之间主要的不同。 -虽然 Typst 并不是基于 LaTeX 构建的,语法也完全不同,但通过这篇文章,你可以方便地将 LaTeX 的使用经验转化过来。 - +如果你已经使用过 LaTeX,并想要尝试 Typst, 这篇文章是个很好的入门指南。 +我们将从用户的角度出发,解释这两套系统之间主要的不同点。 +虽然 Typst 并不基于 LaTeX,语法也完全不同,但通过这篇文章,你可以方便地将 LaTeX 的使用经验转化过来。 -跟 LaTeX 一样,Typst 是一门基于标记的排版系统。首先在纯文本里编写自己的文档,然后通过一些命令和语法对其进行修饰,最后使用编译器将源文件排版并渲染成 PDF 文件。在以下几个方面,Typst 跟 LaTeX 之间也存在区别:日常任务上,Typst 使用更为专用的语法,这一点可以类比 Markdown。Typst 的命令也更有「原则性」:在 LaTeX 中,你可能需要为不同软件包学习不同的语法和约定,但在 Typst 中,命令总是保持一致,所以你只需要理解一些基本的概念。并且 Typst 比 LaTeX 快得多:Typst 文件的编译通常只需要几毫秒,而不是几秒,因此 Typst 可以实现实时增量渲染。 +跟 LaTeX 一样,Typst 是一门「基于标记的排版系统」。 +首先在纯文本里编写文档,然后通过一系列命令和语法对其进行修饰,最后使用编译器将源文件排版并渲染成 PDF 文件。 +然而,Typst 跟 LaTeX 之间也在以下几个方面存在区别: +首先,在日常任务上,Typst 使用更专用的语法 (这一点可以类比 Markdown)。 +Typst 的命令也更加统一:在 LaTeX 中,你可能需要为不同软件包学习不同的语法和约定,但在 Typst 中,命令总是保持一致,所以你只需要理解一些基本的概念。 +此外 Typst 比 LaTeX 快得多:Typst 文件的编译通常只需要几毫秒,而不是几秒,正因如此 Typst 的网页版和编译器可以实现实时增量渲染。 -在接下来的部分,我们将回答从 LaTeX 切换到 Typst 时一些常见的问题。 -如果你更喜欢一步一步地介绍 Typst,请阅读我们的 [教程]($tutorial)。 +在接下来的部分里,我们将回答从 LaTeX 切换到 Typst 时一些常见的问题。 +如果你更喜欢从头了解 Typst,请阅读我们的 [教程]($tutorial)。 ## 如何创建一个新的空文档?{ #getting-started } -很简单,你只需要创建一个空的文本文档(文件后缀是.typ),无需额外的模板,你就可以直接开始编写。 -如果您使用的是 Web App,请单击“+ Empty document”以创建一个带有文件的新项目,然后进入编辑器。 + +很简单,你只需要创建一个空的文本文档(文件后缀是 `.typ`),无需额外的模板,你就可以直接开始编写,默认使用 A4 纸张大小。 +如果您使用的是 Web App,可以单击 "+ Empty document",创建一个带有文件的新项目,然后进入编辑器。 [段落分隔符]($parbreak) 和 LaTeX 相同,空一行即可: @@ -28,44 +33,47 @@ Here are two paragraphs. The output is shown to the right. ``` +如果你想直接从原有的 LaTeX 文档迁移过来,你可以使用 [Pandocs](https://pandoc.org) 将其转换为 Typst 格式。 +这个转换的工具也集成进了 Typst 的 Web App 中,你可以直接上传你的 LaTeX 文件,然后在上面继续编写。 + ## 我如何创建章节标题,强调,...?{ #elements } + LaTeX 使用 `\section` 命令创建章节标题。多级标题分别用 `\subsection`、`\subsection` 等表示。根据文档种类的不同,还有 `\part` 和 `\chapter`。 -在 Typst 中,标题设置更简洁:在标题所在的行前面加上一个等号和一个空格,便得到了一级标题:`[= Introduction]`。 -如果你需要一个二级标题,则可以使用两个等号:`[== In this paper]`。 -通过在前面加上更多的等号,你可以嵌套任意层级的标题。 +在 Typst 中,标题没那么啰嗦:在标题所在的行,前面加上等号和空格,就得到了一级标题:`[= Introduction]`。 +如果你需要一个二级标题,使用两个等号:`[== In this paper]`。 +在前面加上更多的等号,你可以嵌套任意层级的标题。
-译者注: -这一点上更接近 Markdown 中 `#` 的作用,在接下来的阅读中你会不断看到这种「Markdown + LaTeX」杂糅的产物,结合这两者分别的痛点,可以更加深入了解 Typst 设计这些语法的原因。 +**译者注:** + +类比 Markdown 中 `#` 的作用,在接下来的阅读中你会不断看到这种「Markdown + LaTeX」杂糅的产物,结合这两者分别的痛点,可以更加深入了解 Typst 设计这些语法的原因。 +
强调(通常以斜体字呈现)是通过用`[_underscores_]`来表达, -而着重的强调(通常以黑体字呈现)是通过使用`[*Star*]`来代替。 - -强调(英文中以斜体呈现)只需要把文本包含在 `_下划线_` 中, -粗体则需要包含在 `*单个星号*` 之中。 - -下面是 LaTeX 中使用的常见标记命令及其 Typst 对应的表示方式。你也可以查看[完整的语法备忘单]($syntax)。 - -| 元素 | LaTeX | Typst | See | -|:-----------------|:--------------------------|:-----------------------|:-------------------------| -| 着重强调 | `\textbf{strong}` | `[*strong*]` | [`strong`]($strong) | -| 强调 | `\emph{emphasis}` | `[_emphasis_]` | [`emph`]($emph) | -| 等宽文字 / 代码 | `\texttt{print(1)}` | ``[`print(1)`]`` | [`raw`]($raw) | -| 链接 | `\url{https://typst.app}` | `[https://typst.app/]` | [`link`]($link) | -| 标签 | `\label{intro}` | `[]` | [`label`]($label) | -| 交叉引用 | `\ref{intro}` | `[@intro]` | [`ref`]($ref) | -| 文献引用 | `\cite{humphrey97}` | `[@humphrey97]` | [`cite`]($cite) | -| 无序列表 | `itemize` 环境 | `[- List]` | [`list`]($list) | -| 有序列表 | `enumerate` 环境 | `[+ List]` | [`enum`]($enum) | -| 术语列表 | `description` 环境 | `[/ Term: List]` | [`terms`]($terms) | -| 图片 | `figure` 环境 | `figure` 函数 | [`figure`]($figure) | -| 表格 | `table` 环境 | `table` 函数 | [`table`]($table) | -| 公式 | `$x$`, `align` / `equation` 环境 | `[$x$]`, `[$ x = y $]` | [`equation`]($math.equation) | - -在 Typst 中,使用 [列表]($list) 并不需要「环境」,而采用一种更为轻量的语法。 -只需要在每行开头前,加入连字符 `-`,就可以创建一个无序列表: +而着重的强调(通常以黑体字呈现)是通过使用`[*Star*]`来表达。 + +下面是 LaTeX 中使用的常见标记命令,以及 Typst 中对应的表示方式。你也可以查看[完整的语法备忘单]($syntax)。 + +| 元素 | LaTeX | Typst | See | +| :-------------- | :------------------------------- | :--------------------- | :--------------------------- | +| 着重强调 | `\textbf{strong}` | `[*strong*]` | [`strong`]($strong) | +| 强调 | `\emph{emphasis}` | `[_emphasis_]` | [`emph`]($emph) | +| 等宽文字 / 代码 | `\texttt{print(1)}` | `` [`print(1)`] `` | [`raw`]($raw) | +| 链接 | `\url{https://typst.app}` | `[https://typst.app/]` | [`link`]($link) | +| 标签 | `\label{intro}` | `[]` | [`label`]($label) | +| 交叉引用 | `\ref{intro}` | `[@intro]` | [`ref`]($ref) | +| 文献引用 | `\cite{humphrey97}` | `[@humphrey97]` | [`cite`]($cite) | +| 无序列表 | `itemize` 环境 | `[- List]` | [`list`]($list) | +| 有序列表 | `enumerate` 环境 | `[+ List]` | [`enum`]($enum) | +| 术语列表 | `description` 环境 | `[/ Term: List]` | [`terms`]($terms) | +| 图片 | `figure` 环境 | `figure` 函数 | [`figure`]($figure) | +| 表格 | `table` 环境 | `table` 函数 | [`table`]($table) | +| 公式 | `$x$`, `align` / `equation` 环境 | `[$x$]`, `[$ x = y $]` | [`equation`]($math.equation) | + +在 Typst 中,使用 [列表]($list) 并不需要创建「环境」,而采用一种更为轻量的语法。 +只需要在每行开头前,加入连字符 `-`,就可以创建一个无序列表 (`itemize`): ````example To write this list in Typst... @@ -86,22 +94,24 @@ To write this list in Typst... ```` -使用正确的缩进,可以实现嵌套列表。且在每项间添加空行,可以得到一个行间距更大的列表 +通过正确的缩进,可以实现列表间嵌套。 +在每项间添加空行,可以得到一个行间距更大的列表。 -要获得一个 [有序列表]($enum)( `enumerate` ),可以用 `+` 代替连字符。 -对于一个 [术语列表]($terms)( `description` ),可以用 `[/ Term: Description]` 来表示。 +用 `+` 代替连字符 `-`,可以得到 [有序列表]($enum)( `enumerate` )。 +用 `[/ Term: Description]` ,可以得到 [术语列表]($terms)( `description` )。 ## 我如何使用一个命令? { #commands } + LaTeX 十分依赖以反斜杠 `\` 开头的命令,它需要通过这些 _宏_ 来排版、插入或改变内容。 -有些命令可以传入参数,这些参数通常使用大括号括起来。`\cite{rasmus}` +有些命令接受参数,通常使用大括号括起来。`\cite{rasmus}` Typst 区分两种模式:[「标记模式」和「脚本模式」]($scripting/#blocks)。 -默认是「标记模式」。此模式下,你可以直接编排文本、使用不同的语法结构,如 `*使用星号标记粗体文本* `。 -而「代码模式」下,则更类似像 Python 一样的编程语言,提供了输入、执行代码的选项。 +默认处在「标记模式」下。此模式中,你可以直接编排文本、使用不同的语法结构,如 `*使用星号标记粗体文本*`。 +而「脚本模式」下,则提供一个类似 Python 的编程语言,提供了输入、执行代码的选项。 -在 Typst 的标记模式中,你可以使用井号(`#`)来使用单个命令(或者表达式)。 -例如,你可以通过这种方式来分割不同的 [文件]($scripting/#modules),或者基于某些 [条件]($scripting/#conditionals) 渲染文字。在「脚本模式」下,也可以通过方括号来包含正常的(「标记模式」下的)[内容块]($content)。 -在「脚本模式」下,内容(标记模式的整体)会被跟其他变量一样,当作一个值本身进行处理。 +在 Typst 的标记模式中,你可以使用井号(`#`)来使用单个命令(或者 _表达式_)。 +例如,你可以通过这种方式来分割不同的 [文件]($scripting/#modules),或者基于某些 [条件]($scripting/#conditionals) 渲染文字。 +在「脚本模式」下,也可以通过方括号来包含正常的[内容块]($content),这些内容如同其他变量一样,被视作一种值。 ```example First, a rectangle: @@ -120,26 +130,30 @@ And finally a little loop: ```
-译者注:这段英文原文就表述的很不清晰,这里提供一点解释。 +**译者注:** -标记模式,如同 Markdown,不需要额外的内容,默认就处在这个标记模式下:可以直接使用 `_text_` 或者 `*text*` 来实现斜体/粗体(参考上文) +这段英文原文就表述的很不清晰,这里提供一点解释。 + +标记模式,如同 Markdown,不需要额外的内容,默认就处在这个标记模式下:可以直接使用 `_text_` 或者 `*text*` 来实现斜体/粗体(参考上文)。 脚本模式,以 `#` 开头(类比 LaTeX 中以 `\` 开头来书写命令),仅仅存在于一个命令(表达式)中,当这个表达式结束之后,一切又回到标记模式中。 -在脚本模式中,无需额外使用 `#`(命令/关键字会直接识别,不同于 LaTeX),同时在命令中也可以使用标记模式(使用 `[]`,比如例子给出的 `[Hi #x]`) +在脚本模式中,无需额外使用 `#`(命令/关键字会直接识别,不同于 LaTeX),同时在命令中也可以使用标记模式(使用 `[]`,比如例子给出的 `[Hi #x]`)。 + +此外: -另外: +- 在标记模式中,可以引用脚本模式的函数、值,都通过 `#` 进行标记。 +- 在脚本模式中,函数返回值为 `content` 的会在当前位置渲染出来,如果没有显示指明返回值,则默认会将函数体内的所有内容块相加并返回。 +- 在脚本模式中,使用标记模式的内容 (`Content`),也可以作为变量的值。 -- 在标记模式中,可以引用脚本模式的函数、值,都通过 `#` 进行标记 -- 在脚本模式中,函数返回值为 `content` 的会在当前位置渲染出来如果没有显示指明返回值,则默认会将函数体内的所有内容块相加并返回 -- 在脚本模式中,使用标记模式的内容 (Content),也可以作为变量的值
-一个函数调用总是涉及到函数的名称([`rect`]($rect), [`underline`]($underline), -[`calc.max`]($calc.max), [`range`]($array.range)),后面是小括号(与 LaTeX 不同,如果宏不需要参数,方括号和大括号是可选的)。 -在这些圆括号内传递的参数的预期列表取决于具体的函数,并在 [引用]($reference) 中指定。 +不同于 LaTeX,Typst 中函数定义总是要求函数名([`rect`]($rect), [`underline`]($underline), +[`calc.max`]($calc.max), [`range`]($array.range))+ 括号的形式(而 LaTeX 中,没有参数的情况下,[]和{} 都是可以忽略的)。 +需要向函数传递的具体参数可以在[参考]($reference)中找到。 ### 参数 { #arguments } -一个函数可以有多个传入参数,有些参数是位置参数,只需提供变量的值即可(不需要提供参数名):函数 `[#lower("SCREAM")]` 以全小写的方式返回其传入值。 + +一个函数可以有多个参数,有些参数是位置参数,只需提供变量的值即可 (不需要提供参数名称), 例如:函数 `[#lower("SCREAM")]` 以全小写的方式返回其传入值。 很多函数使用命名参数来提高可读性,例如创建一个指定大小和描边的正方形,可以使用如下命名参数: ```example @@ -150,17 +164,14 @@ And finally a little loop: ) ``` -你指定一个命名参数,首先输入它的名字(上文中是它`width`、`height`和`stroke`),然后是冒号,接着是值(`2cm`、`1cm`、`red`)。 -你可以在每个函数的参考页中找到可用的命名参数,或者在输入时的自动完成面板中找到。 +指定一个命名参数时,首先输入参数名(上面的 `width`、`height`和`stroke`),然后是冒号和对应的值(`2cm`、`1cm`、`red`)。 +你可以在「函数的参考页」或者「自动补全」中找到可用的命名参数。 命名参数类似于一些 LaTeX 环境的配置方式,例如,你可以输入`\begin{enumerate}[label={alph*)}]`来启动一个带有标签`a)`、`b)`等的列表。 -指定命名参数时,你需要首先输入参数的名字,例如 `width`、`height` 和 `stroke` 等,接下来输入冒号和对应的值 (`2cm`、`1cm`、`red`) ,你可以在文档或者自动补全中找到可以传入的参数。 -命名参数有些类似 LaTeX 中配置环境的办法,比如 `\begin{enumerate}[label={alph*)}]` 可以作为一个带有标签`a)`、`b)`等的列表的起始标志。 - -大多数情况下,你会希望向函数传递一些 [内容块]($content)。 -例如,在 LaTeX 中的命令 `\underline{Alternative A}` -在 Typst 中则可以写成 `#underline([Alternative A])`,方括号表示其中的值是一个内容块 。 -在这些方括号中,你可以使用正常的标记语法。然而,都这样写的话,需要嵌套的括号数量还是太多了,因此你可以把位于尾部的内容块放到括号后面(如果没有其他参数,甚至可以忽略 `()`): +多数情况,你会想要向函数传递一些 [内容块]($content)。 +例如,在 LaTeX 中的命令 `\underline{Alternative A}`, 在 Typst 中可以写成 `#underline([Alternative A])`. +方括号表示其中的值是一个[内容块](content)。 +在这些方括号中,你可以使用正常的标记语法。不过这样写的话,需要的括号还是太多了,因此你可以把「位于尾部的内容块」移到括号外(如果没有其他参数,可以忽略 `()`): ```example Typst is an #underline[alternative] @@ -170,33 +181,49 @@ to LaTeX. ``` ### 数据类型 { #data-types } -你很可能已经注意到了,上文提到的这些参数有着不同的数据类型。Typst支持多种 [数据类型]($type),下表是其中一些比较重要的类型和以及声明他们的办法。 -注意:为了使用以下任何类型,你必须处在脚本模式中。 +你可能已经注意到了,上文提到的这些参数有着不同的数据类型。Typst 支持多种 [数据类型]($type),下表是其中一些比较重要的类型和以及他们的声明办法。 +只有处在脚本模式中才能声明这些类型: -| 数据类型 | 示例 | -|:-------------------------------------|:----------------------------------| -| [内容块 (content)]($content) | `{[*fast* typesetting]}` | -| [字符串 (str)]($str) | `{"Pietro S. Author"}` | -| [整型 (int)]($int) | `{23}` | -| [浮点数 (float)]($float) | `{1.459}` | -| [绝对长度 (absolute length)]($length) | `{12pt}`, `{5in}`, `{0.3cm}`, ... | -| [相对长度 (relative length)]($ratio) | `{65%}` | +| 数据类型 | 示例 | +| :------------------------------------ | :-------------------------------- | +| [内容块 (content)]($content) | `{[*fast* typesetting]}` | +| [字符串 (str)]($str) | `{"Pietro S. Author"}` | +| [整型 (int)]($int) | `{23}` | +| [浮点数 (float)]($float) | `{1.459}` | +| [绝对长度 (absolute length)]($length) | `{12pt}`, `{5in}`, `{0.3cm}`, ... | +| [相对长度 (relative length)]($ratio) | `{65%}` | 内容块和字符串的区别在于,内容可以包含标记,包括函数调用,而字符串实际上只是一个普通的字符序列。 -Typst 提供了 [条件分支、循环结构]($scripting/#conditionals),以及常用的运算符,比如 `+` 和 `==`,你也可以定义你自己的变量,并在此基础上进行计算。 +Typst 提供了 [条件分支、循环结构]($scripting/#conditionals),以及常用的[运算符]($scripting/#operators),例如 `+` 和 `==`。 -### 影响后续内容的命令 { #rules } -在 LaTeX 中,有些命令,例如 `\textbf{bold text}` 通过大括号传入参数,并且只影响括号内的内容。而有些命令,比如 `\bfseries bold text`「起到开关的作用」,在这行命令后的所有内容都会受这个命令的影响。 +你也可以在你定义的[变量]($scripting/#bindings)中存储值 (包括函数)。在计算、流程复用或者需要反复使用一个值的时候可能会用到。 +创建新变量的关键字是 `let`, 和 LaTeX 中 `\newcommand` 类似。 -在 Typst 中,同样的函数可以同时用来影响: +```example +// Store the integer `5`. +#let five = 5 + +// Define a function that +// increments a value. +#let inc(i) = i + 1 + +// Reference the variables. +I have #five fingers. -- 文档的剩余部分 -- 一段区域(作用域) -- 它的参数 +If I had one more, I'd have +#inc(five) fingers. Whoa! +``` + +### 影响后续内容的命令 { #rules } -举例来说,`[#text(weight: "bold")[bold text]]` 仅仅会加粗传入的参数,而 `#set text(weight: "bold")` 会影响「到作用域结束」,(或者,如果不在作用域中,影响文档的剩余部分)。根据使用方式的不同(函数调用 / 使用 Set 规则),很容易区分它的作用域。 +在 LaTeX 中,例如 `\textbf{bold text}` 的命令通过大括号传入参数,并且只影响括号内的内容。 +而有些命令,比如 `\bfseries bold text`「起到开关的作用」(在 LaTeX 中这被叫做声明),在这行命令后的所有内容都会受这个命令的影响。 + +在 Typst 中,一个函数既可以用来影响文档的剩余部分,也可以只影响传入的参数。 +举例来说,`[#text(weight: "bold")[bold text]]` 仅仅会加粗传入的参数,而 `#set text(weight: "bold")` 的影响会持续「到当前块结束」(或者,如果不在内容块中,影响文档的剩余部分)。 +根据使用方式的不同 (直接调用/在 [set rule]($styling/#set-rules)) 可以直观的表示函数的作用方式。 ```example I am starting out with small text. @@ -207,7 +234,7 @@ This is a bit #text(18pt)[larger,] don't you think? ``` -Set 规则可能出现在文档的任何部分。它们可以被认为是其各自函数的默认参数值: +Set rules 可以出现在文档的任何部分。它们的作用方式可以类比向函数传递默认参数。 ```example #set enum(numbering: "I.") @@ -219,15 +246,32 @@ Good results can only be obtained by + checking the data for biases ``` -`+` 是调用 [`{enum}`]($enum) 函数的语法糖(可以把它看作是一种简写),我们在上面应用了一个 Set 规则。 +`+` 是调用 [`{enum}`]($enum) 函数的语法糖(可以把它看作是一种简写),我们在上面应用了一个 set rule。 从这个意义上讲,[大多数的特殊语法都是只是某一个函数的简写]($syntax)。 +如果你需要重新定义一个组件的样式(仅修改传递参数无法实现),你可以通过 [show rule]($styling/#show-rules) 完全重定义其样式 +(与 LaTeX 中 `\renewcommand` 相似,类似于定义了一个_宏_). + +你可以通过 [`font`]($text.font), [`style`]($text.style), 和 [`weight`]($text.weight) 参数 +来实现 LaTeX 命令 `\textbf`, `\textsf`, `\rmfamily`, `\mdseries`, 和 `\itshape` 的效果。 +`text` 函数可以在 set 规则(声明风格)中使用,也可以带有内容参数。 +为了替换 `\textsc`,你可以使用 [`smallcaps`]($text.smallcaps) 函数,它会将其内容参数渲染为小型大写字母。 +如果你想要使用它的声明风格(类似于 `\scshape`),你可以使用一个 [_everything_ show 规则]($styling/#show-rules) 来将这个函数应用到作用域的其余部分: -如果你需要重新定义一个组件的样式(超过了修改其参数所能提供的),你可以通过 [Show 规则]($styling/#show-rules) 完全重定义其样式(与 LaTeX 中 `\renewcommand` 相似,类似于定义了一个宏). +```example +#show: smallcaps + +Boisterous Accusations +``` ## 如何加载一个文档类 / 模板? { #templates } -在 LaTeX 中,你可以使用 `\documentclass{article}` 来定义文档的样式。通过这个命令,你也可以通过把 `article` 更换为 `report`和 `amsart` 来更换文档的样式。 -在使用 Typst 中,你可以通过 [函数]($function) 来修改文档的样式。通常情况下,你可以使用模板中提供的函数来修改整个文档,使用方式如下:你可以通过 `#import` 来导入模板函数,然后你使用这个函数来对文档使用样式。具体的做法是通过 [Show 规则]($styling/#show-rules) 来将整个文档包装在这个函数中,具体如下: +在 LaTeX 中,`.tex` 文件通常以 `\documentclass{article}`开头,来定义文档的样式。 +在这个命令中,你也可以把 `article` 替换为 `report`和 `amsart` 来更改文档的样式。 + +在 Typst 中,你可以通过 [函数]($function) 来修改文档的样式。通常情况下,你可以使用模板中提供的函数来修改整个文档。 +首先,你可以通过 `#import` 来导入模板函数。 +然后你使用这个函数来对文档使用样式。 +具体的做法是通过 [show rule]($styling/#show-rules) 来将整个文档包装在这个函数中,具体如下: ```example:single >>> #let conf( @@ -317,72 +361,75 @@ article by putting insightful paragraphs right here! ``` -这里的 [`import`]($scripting/#modules) 命令,导入了在其他文件中声明的函数。在这个例子中,它从 `conf.typ` 中导入了 `conf` 函数。这个函数会将整个文档展示为一个会议论文。我们通过 Show 规则讲这个样式应用到全局,同时设置了文档的一些元数据。在应用 Show 规则之后,我们就可以开始写文章了。 +这里的 [`import`]($scripting/#modules) 命令,导入了在其他文件中声明的函数,从而可以在当前文件中使用。 +在这个例子中,它从 `conf.typ` 中导入了 `conf` 函数。 +这个函数会将整个文章的样式整理成一个会议论文。 +我们通过 show rule 把这个样式应用到全局,同时也设置了文档的一些元数据。 +在应用 show rule 之后,我们就可以开始写文章了。
在 Typst 中,函数被称为"命令",它们可以将其参数转化为输出值,包括文档 _内容_。 -函数是"纯净"的,这意味着它们除了创建一个输出值/输出内容外,不能产生任何其他效果。 +函数是"纯"的,这意味着它们除了创建一个输出值/输出内容外,不能产生任何副作用。 这与 LaTeX 的宏形成了鲜明的对比,后者可以对你的文档产生任意的效果。 -函数算作 Typst 的一种命令,而且可以将输入的参数转换为所需要的输出,包括内容块。在 Typst 中函数都是「过程的、纯的」,意味着他们除了返回值外不能有任何其他的副作用。 -这与 LaTeX 的宏形成了鲜明的对比,后者可以对你的文档产生任意的效果。 +为了使一个函数应用到整个文档,show rule 会处理其后的所有内容,并将其结果作为参数传递给指定的函数。 +`.with` 是一个 _方法_,它接受 `conf` 函数,并在将其传递给 show 规则之前预先配置一些参数。 -要让一个函数为你的整个文档提供样式,显示规则会处理它后面的所有内容,并以结果为参数调用冒号后面指定的函数。 -`.with` 部分是一个方法,它接收 `conf` 函数,并在传递给显示规则之前预先配置它的一些参数。 +**译者注:** -为了将一个样式应用到整个文档,Show 规则会把后续的所有内容都作为参数,传递给冒号后面定义的函数。`.with` 是函数对象的一个方法,它可以预设一些其他的默认参数(类似于柯里化),在传递给 Show 规则之前进行一些设置更改。 +`#show: conf.with(title: [标题])` 等价于 Lambda 表达式形式的 `#show: it => conf(title: [标题], it)` -译者注:`#show: conf.with(title: [标题])` 等价于 Lambda 表达式形式的 `#show: it => conf(title: [标题], it)`
在 Web App 中,你可以选择一些预先定义好的模板,甚至可以通过模板向导创建自己的模板。 -你也可以访问 [Awesome Typst 仓库](https://github.com/qjcg/awesome-typst) 来查看一些社区提供的模板。我们正在筹备为包管理器增加托管模板的能力(目前只能托管工具类包),在那之后这一切都会更加容易分享! +在本地命令行中,你也可以使用 `typst init` 来从模板创建项目。 +查看发布在 Typst Universe 上的[模板列表]($universe/search/?kind=templates), 这是官方的包管理库。 +你也可以访问 [Awesome Typst 仓库](https://github.com/qjcg/awesome-typst) 来查看一些社区提供,尚没有以包发布的模板。 -你也可以 [创建你自己的自定义的模板]($tutorial/making-a-template)。它们比相应的 LaTeX 的 `.sty` 文件短得多,可读性也高得多,所以不妨一试! +你也可以 [创建你自己的自定义的模板]($tutorial/making-a-template)。它们比相应的 LaTeX 的 `.sty` 文件短得多,可读性也高得多,所以不妨一试! ## 如何导入包? { #packages } -Typst 是 "即插即用" 的,所以许多流行的 LaTeX 包的对应功能是直接内置到 Typst 里的。 + +Typst 就像那种自带电池的玩具,许多流行的 LaTeX 包的对应功能是直接内置到 Typst 里的。 在下面我们列出一些 LaTeX 中常用的包,和他们对应的 Typst 命令: -| LaTeX 包 | Typst 替代 | -|:--------------------------------|:---------------------------------------------------------------------| -| graphicx, svg | [`image`]($image) 函数 | -| tabularx | [`table`]($table), [`grid`]($grid) 函数 | -| fontenc, inputenc, unicode-math | 直接编写! | -| babel, polyglossia | [`text`]($text.lang) 函数: `[#set text(lang: "zh")]` | -| amsmath | [数学模式]($category/math) | -| amsfonts, amssymb | [`sym`]($category/symbols) 模块和 [syntax]($syntax/#math) | -| geometry, fancyhdr | [`page`]($page) 函数 | -| xcolor | [`text`]($text.fill) 函数: `[#set text(fill: rgb("#0178A4"))]` | -| hyperref | [`link`]($link) 函数 | -| bibtex, biblatex, natbib | [`cite`]($cite), [`bibliography`]($bibliography) 函数 | -| lstlisting, minted | [`raw`]($raw) 函数和语法 | +| LaTeX 包 | Typst 替代 | +| :------------------------------ | :---------------------------------------------------------------- | +| graphicx, svg | [`image`]($image) 函数 | +| tabularx | [`table`]($table), [`grid`]($grid) 函数 | +| fontenc, inputenc, unicode-math | 直接编写! | +| babel, polyglossia | [`text`]($text.lang) 函数: `[#set text(lang: "zh")]` | +| amsmath | [数学模式]($category/math) | +| amsfonts, amssymb | [`sym`]($category/symbols) 模块和 [syntax]($syntax/#math) | +| geometry, fancyhdr | [`page`]($page) 函数 | +| xcolor | [`text`]($text.fill) 函数: `[#set text(fill: rgb("#0178A4"))]` | +| hyperref | [`link`]($link) 函数 | +| bibtex, biblatex, natbib | [`cite`]($cite), [`bibliography`]($bibliography) 函数 | +| lstlisting, minted | [`raw`]($raw) 函数和语法 | | parskip | [`block`]($block.spacing) 和 [`par`]($par.first-line-indent) 函数 | | csquotes | 设置 [`text`]($text.lang) 语言,并输入 `["]` or `[']` | -| caption | [`figure`]($figure) 函数 | -| enumitem | [`list`]($list), [`enum`]($enum), [`terms`]($terms) 函数 | +| caption | [`figure`]($figure) 函数 | +| enumitem | [`list`]($list), [`enum`]($enum), [`terms`]($terms) 函数 | - -尽管 _很多_ 东西是内置的,但并非所有东西都可以内置。这就是为什么 Typst 有一个内置的 [包管理器]($packages),社区可以在其中共享他们的工作和自动化工具。让我们以 _tablex_ 包为例:此包允许您以内置的表格尚不支持的方式自定义表格。要在文档中使用 tablex,您只需编写: +尽管 _很多_ 东西是内置的,但并非所有东西都可以内置。 +这也是 Typst 提供一个内置的 [包管理器]($packages)的原因,社区成员可以在其中共享他们的工作和自动化工具。 +以 _ctez_ 包为例,这个包允许你绘制复杂图形和函数图像。要在文档中使用 ctez,你只需要编写: ```typ -#import "@preview/tablex:0.0.6": tablex, gridx +#import "@preview/ctez:0.2.1" ``` (`@preview` 是一个 _namespace_,在包管理器还处于早期和实验状态时使用,它将在将来被替换。) -除了官方的软件包存储库,您可能还会想看 -[Awesome Typst 仓库](https://github.com/qjcg/awesome-typst),其中集合了为 Typst 创建的资源精选列表。 - -译者注:以及 [Awesome Typst 中文仓库](https://github.com/typst-doc-cn/awesome-typst-cn)。 +除了官方的软件包存储库,您可能还会想看 [Awesome Typst 仓库](https://github.com/qjcg/awesome-typst),其中集合了为 Typst 创建的资源精选列表。 -如果您需要从项目中的另一个文档加载函数和变量,例如使用模板,则可以使用相同的 -[`{import}`]($scripting/#modules) 语句,其中应该包含文档名,而不是特定的包。要包含另一个文档的文本内容, -您可以使用 [`{include}`]($scripting/#modules) 语句。它将读取指定文档的内容,并将其直接置入文档中。 +如果您需要从项目中的另一个文档加载函数和变量,例如使用模板,则可以使用相同的 [`{import}`]($scripting/#modules) 语句,其中应该包含文档名,而不是特定的包。 +要包含另一个文档的文本内容,您可以使用 [`{include}`]($scripting/#modules) 语句。它将读取指定文档的内容,并将其直接置入文档中。 ## 如何输入数学公式? { #maths } -要在 Typst 中进入数学模式,只需将数学公式用 `$` 符号括起来。你可以通过在方程内容和其周围的 `$` 符号之间添加空格或换行来书写块状公式(行间公式)。 + +在 Typst 中,把公式包含在 `$` 记号中即可,在两个 `$$` 中添加额外的空格/换行符可以创建块状公式。 ```example The sum of the numbers from @@ -402,7 +449,7 @@ Typst 在数学模式下预先定义了很多有用的变量。所有希腊字 如果你想在你的表达式中插入多字母纯文本,可以用双引号将其括起来: ```example -$ delta "if" x <= 5 $ +delta "if" x <= 5 $ ``` 在 Typst 中,定界符将根据内部表达式自动缩放大小,就像在 LaTeX 中自动添加了隐藏的 `\left` 和 `\right` 命令一样。 @@ -411,7 +458,7 @@ $ delta "if" x <= 5 $ 在不破坏运算优先级的前提下,Typst 会自动将斜线 `/` 的两端内容识别成分数。所有没必要的括号将不会出现在编译结果中: ```example -$ f(x) = (x + 1) / x $ +f(x) = (x + 1) / x $ ``` [下标和上标]($math.attach) 在 Typst 和 LaTeX 中的作用是相似的。`{$x^2$}` 将产生一个上标,`{$x_2$}` 产生一个下标。 @@ -460,9 +507,11 @@ $ mat( ``` ## 如何获得 "LaTeX 外观"? { #latex-look } + 用 LaTeX 编写的论文有一种美观且易于识别的外观。这主要是由于它们的字体 [Computer Modern](https://zh.wikipedia.org/wiki/Computer_Modern)、对齐方式、窄行距和宽边距。 下面是一个示例: + - 设置宽 [边距]($page.margin) - 启用 [两端对齐]($par.justify), [更紧密的行间距]($par.leading) 和 [首行缩进]($par.first-line-indent) @@ -479,26 +528,41 @@ $ mat( #show heading: set block(above: 1.4em, below: 1em) ``` -这应该是一个很好的起点! 如果你想更进一步,为什么不创建一个可重复使用的模板呢? +这应该是一个很好的起点!如果你想更进一步,为什么不创建一个可重复使用的模板呢? + +## 参考文献 + +Typst 的参考文献系统与 BibTeX 文件兼容。你可以通过 [`bibliography`]($bibliography) 函数加载你的 `.bib` 文献库。 +也可以使用 [Typst 原生基于 YAML 的格式](https://github.com/typst/hayagriva/blob/main/docs/file-format.md). + +Typst 使用引文样式语言(Citation Style Language)来定义和处理引文和参考文献样式。你可以将 CSL 文件与 BibLaTeX 的 `.bbx` 文件进行类比。 +编译器已经包含了 [80 多种引文样式]($bibliography.style),但你可以使用 [CSL 仓库](https://github.com/citation-style-language/styles) 中的任何符合 CSL 标准的样式,或者编写自己的样式。 + +你可以通过相同的语法 `[@key]` 来引用参考文献中的条目或者引用文档中的标签(这将引用一个名为 `key` 的条目)。 +或者,你可以使用 [`cite`]($cite) 函数。 + +你可以使用 [`[#cite(, form: "prose")]`]($cite.form) 来引用你的引文的其他形式,比如仅年份或者用于自然语言的引文(类似于 `\citet` 和 `\textcite`)。 + +你可以在 [`bibliography`]($bibliography) 函数的文档页面上找到更多信息。 + +## 安装 + +你有两种方式使用 Typst:在[我们的 Web 应用程序](https://typst.app/signup/)中,或者在你的计算机上[安装编译器](https://github.com/typst/typst/releases)。 +当你使用 Web 应用程序时,我们提供一个内置的协作编辑器,并在你的浏览器中运行 Typst,无需安装。 + +如果你选择在你的计算机上使用 Typst,你可以将编译器作为一个单独的小二进制文件下载,任何用户都可以运行,无需 root 权限。 +与 LaTeX 不同,包在你第一次使用时下载,然后在本地缓存,保持你的 Typst 安装精简。 +你可以使用你自己的编辑器,并决定在本地编译器中存储文件的位置。 ## 与 LaTeX 相比,Typst 目前有哪些不足? { #limitations } -尽管现在 Typst 已经可以成为许多人的 LaTeX 替代品,但仍有一些功能是 Typst (尚)不支持的。 -这里列出了相应的不足,在一些情况下,也包含了可能的变通方法。 - -- **本地图表和绘图。** LaTeX 用户经常在 PGF/TikZ 中与他们的文档一起创建图表。 - Typst 还不包括绘制图表的工具,但社区正在加紧提供解决方案,如 - [`cetz`](https://github.com/johannes-wolf/typst-canvas)。你可以把这些工具添加到你的文档中,开始画图。 - -- **在没有分页符的情况下改变页边距。** LaTeX 中,你可以在不换页的前提下,调整页边距。 - 要在 Typst 中改变页边距,你要使用 [`page`]($page) 函数(会强制换页)。 - 如果你只想让几个段落伸进页边距,然后再恢复到旧的页边距,你可以使用带负数填充的 [`pad`]($pad) 函数。 - -- **将 PDF 作为图像。** 在 LaTeX 中,插入 PDF 或 EPS 文件的矢量图已经成为一种习惯。 - Typst 不支持这两种格式作为图像格式,但你可以用 [在线工具](https://cloudconvert.com/pdf-to-svg) - 或 [Inkscape](https://inkscape.org/) 轻松地将这两种文件转换成 SVG 文件。我们计划在 Typst 的 Web 应用程序中也加入这些文件格式的自动转换功能。 - -- **分页符优化。** LaTeX 的算法会智能优化换行符和换页符。Typst 虽然也会避免「孤儿」和「寡妇」的出现,但它所使用的算法远远不及 LaTeX 所使用的复杂。 - 你可以在提交文档前使用 `[#pagebreak(weak: true)]` 在 Typst 中插入自定义分页。 - 参数 `weak` 会保证:如果这里本来就该是很自然的换页,则不会插入两个换页符。 - 你也可以使用 `[#v(1fr)]` 在页面末尾插入一些空白,它的工作原理与 LaTeX 的 `\vfill` 相当类似。 - \ No newline at end of file + +对于大多数人,Typst 现在已经是一个很好的 LaTeX 替代品。 +然而,如果你是一个重度 LaTeX 用户,你可能会发现 Typst 还缺少一些功能: + +- **原生图表和绘图。** LaTeX 用户通常会在 PGF/TikZ 中创建图表。Typst 目前还没有包含绘图工具,但社区正在提供解决方案,比如 [`cetz`](https://github.com/johannes-wolf/typst-canva)。你可以将这些添加到你的文档中绘制图表。 + +- **更改页面边距而不换页。** 在 LaTeX 中,你可以在不换页的前提下,调整页边距。你可以使用 [`page` 函数]($page),但这将强制换页。如果你只是需要调整几个段落的边距,你可以使用 [`pad` 函数]($pad) 来进行负填充。 + +- **以图片的形式插入 PDF。** 在 LaTeX 中,将矢量图形作为 PDF 或 EPS 文件插入已经成为一种惯例。Typst 不支持以图片形式读取这两个格式,但你可以使用 [在线工具](https://cloudconvert.com/pdf-to-svg) 或 [Inkscape](https://inkscape.org/) 将它们转换为 SVG 文件。Web app 会在上传 PDF 文件时自动将其转换为 SVG 文件。 + +- **换页符优化。** LaTeX 的算法会智能优化换行符和换页符。Typst 虽然会避免孤行的出现,它所使用的算法远远不及 LaTeX 所使用的复杂。你可以在提交前,插入自定义的换页符:`#pagebreak(weak: true)` 。参数 `weak` 会保证:如果这里本来就该是很自然的换页,不会插入两个换页符,你也可以使用 `#v(1fr)` 在页面中插入一些空白。这点和 LaTeX 的 `\vfill` 相似。