注意:该中文文档为社区驱动的非官网文档,可能存在错译、漏译或过时等问题,请以官网文档 Documentation 为准,如发现错漏,也欢迎 您的贡献镜像)。Typst 非官方中文交流 QQ 群:793548390
Warning: the Chinese document is a community-driven non-official document, there may be mistranslation, omission or outdated problems, please refer to the official website documentation.
Typst 中文文档

中文用户指南

本页面并不属于官方文档的内容,而是 Typst 中文社区所撰写的面向中文用户的指南。 如果您对在 Typst 中使用中文有什么使用心得,也欢迎在参与贡献!

Typst 的优势

Typst 是可用于出版的可编程标记语言,拥有变量、函数与包管理等现代编程语言的特性,注重于科学写作 (science writing),定位与 LaTeX 相似。

目前仍存在的 CJK 问题

参考 Discord 的记录,可知目前仍存在:

常见 Q&A

如何进一步进阶?

除了参考,还可以考虑阅读 typst-examples-book,里面包含了一些 Typst 的高级知识、简单示例,以及一些最佳实践。

例如简单地实现类似 Markdown 中的引用文本样式:

+ #lorem(10) \
  #rect(fill: luma(240), stroke: (left: 0.25em))[
    *Solution:* #lorem(10)

    $ a_(n+1)x^n = 2... $
  ]
Preview

如何使用 VS Code 进行本地编辑?

  1. VS Code 中打开任意工作目录。
  2. 在 VS Code 中安装 Tinymist TypstTypst Preview 插件。前者负责语法高亮和错误检查等功能,后者负责预览。
    • 也推荐下载 Typst Companion 插件,其提供了例如 Ctrl + B 进行加粗等便捷的快捷键。
    • 你还可以下载我开发的 Typst SyncTypst Sympy Calculator 插件,前者提供了本地包的云同步功能,后者提供了基于 Typst 语法的科学计算器功能。
  3. 新建一个 test.typ 文件,写入内容 = Hello World
  4. 按下 Ctrl + K V,即可同步增量渲染与预览,还提供了光标双向定位功能。

如何为中英文设置不同的字体?

可以使用 text 里面的 fallback 特性。 Typst 中的 font 参数可以接收一个数组,会根据字体里有无当前字符来依次选择字体。 因此我们只需要传入一个英文字体后接中文字体的数组,就可以达到为中英文设置不同的字体的效果。

Hello World 你好世界

#[
  #set text(font: ("IBM Plex Serif", "Noto Sans CJK SC"), lang: "zh", region: "cn")

  Hello World 你好世界
]
Preview

如果你还需要对中文字体进行特殊处理,例如只缩小中文字体的大小,可以考虑用正则表达式进行 hack:

#show regex("\p{sc=Hani}+"): set text(size: 0.8em)

Hello World 你好世界
Preview

为什么我设置的字体没有生效?

如果中文字体不符合 typst 要求,那么它不会选择你声明的字体,例如字体的变体数量不够,参考更详细的 issue

  1. typst fonts 查看系统字体,确保字体名字没有错误。
  2. typst fonts --font-path path/to/your-fonts 指定字体目录。
  3. typst fonts --variants 查看字体变体。
  4. 检查中文字体是否已经完全安装。

为什么连续标点会挤压在一起?

如果字体与 text(lang: .., region: ..) 不匹配,可能会导致连续标点的挤压。例如字体不是中国大陆的,标点压缩会出错;反之亦然。

如何添加中文粗体和斜体?

可以使用 cuti 包。

中文斜体一般使用楷体替代,你可以 通过 show-set 规则实现

#show emph: text.with(font: ("Linux Libertine", "STKaiti"))

孔乙己#emph[上大人]

A quick _brown_
Preview

如果你真的需要伪斜体,可以考虑使用 @EnivexDiscord 给出的一段 hack 代码:

#let skew(angle, vscale: 1, body) = {
  let (a, b, c, d) = (1, vscale * calc.tan(angle), 0, vscale)
  let E = (a + d) / 2
  let F = (a - d) / 2
  let G = (b + c) / 2
  let H = (c - b) / 2
  let Q = calc.sqrt(E * E + H * H)
  let R = calc.sqrt(F * F + G * G)
  let sx = Q + R
  let sy = Q - R
  let a1 = calc.atan2(F, G)
  let a2 = calc.atan2(E, H)
  let theta = (a2 - a1) / 2
  let phi = (a2 + a1) / 2
  
  set rotate(origin: bottom + center)
  set scale(origin: bottom + center)
  
  rotate(phi, scale(x: sx * 100%, y: sy * 100%, rotate(theta, body)))
}

#let fake-italic(body) = skew(-12deg, body)

#let shadowed(body) = box(place(skew(-50deg, vscale: 0.8, text(fill: luma(200), body))) + place(body))

#fake-italic[中文伪斜体]

#shadowed[还可以用来实现文字阴影效果]
Preview

如何为设置各行段落的缩进?

使用 #set par(first-line-indent: 2em)

#set par(first-line-indent: 2em)

= 一级标题

豫章故郡,洪都新府。星分翼轸,地接衡庐。襟三江而带五湖,控蛮荆而引瓯越。物华天宝,龙光射牛斗之墟;人杰地灵,徐孺下陈蕃之榻。雄州雾列,俊采星驰。

台隍枕夷夏之交,宾主尽东南之美。都督阎公之雅望,棨戟遥临;宇文新州之懿范,襜帷暂驻。

十旬休假,胜友如云;千里逢迎,高朋满座。腾蛟起凤,孟学士之词宗;紫电青霜,王将军之武库。家君作宰,路出名区;童子何知,躬逢胜饯。

== 二级标题

时维九月,序属三秋。潦水尽而寒潭清,烟光凝而暮山紫。俨骖騑于上路,访风景于崇阿。临帝子之长洲,得天人之旧馆。

层峦耸翠,上出重霄;飞阁流丹,下临无地。鹤汀凫渚,穷岛屿之萦回;桂殿兰宫,即冈峦之体势。
Preview

缺点是标题下的第一行没有缩进。为了解决这个问题,我们有两种办法:

第一种办法:手动加入缩进。

#set par(first-line-indent: 2em)

#let indent = h(2em)

= 一级标题

#indent 豫章故郡,洪都新府。星分翼轸,地接衡庐。襟三江而带五湖,控蛮荆而引瓯越。物华天宝,龙光射牛斗之墟;人杰地灵,徐孺下陈蕃之榻。雄州雾列,俊采星驰。

台隍枕夷夏之交,宾主尽东南之美。都督阎公之雅望,棨戟遥临;宇文新州之懿范,襜帷暂驻。

十旬休假,胜友如云;千里逢迎,高朋满座。腾蛟起凤,孟学士之词宗;紫电青霜,王将军之武库。家君作宰,路出名区;童子何知,躬逢胜饯。

== 二级标题

#indent 时维九月,序属三秋。潦水尽而寒潭清,烟光凝而暮山紫。俨骖騑于上路,访风景于崇阿。临帝子之长洲,得天人之旧馆。

层峦耸翠,上出重霄;飞阁流丹,下临无地。鹤汀凫渚,穷岛屿之萦回;桂殿兰宫,即冈峦之体势。
Preview

这样做的优点是可以手动控制缩进,缺点是手动缩进不太方便。

第二种办法:使用假段落自动加入缩进。

#set par(first-line-indent: 2em)

#let fake-par = style(styles => {
  let b = par[#box()]
  let t = measure(b + b, styles);

  b
  v(-t.height)
})

#show heading: it => {
  it
  fake-par
}

= 一级标题

豫章故郡,洪都新府。星分翼轸,地接衡庐。襟三江而带五湖,控蛮荆而引瓯越。物华天宝,龙光射牛斗之墟;人杰地灵,徐孺下陈蕃之榻。雄州雾列,俊采星驰。

台隍枕夷夏之交,宾主尽东南之美。都督阎公之雅望,棨戟遥临;宇文新州之懿范,襜帷暂驻。

十旬休假,胜友如云;千里逢迎,高朋满座。腾蛟起凤,孟学士之词宗;紫电青霜,王将军之武库。家君作宰,路出名区;童子何知,躬逢胜饯。

== 二级标题

时维九月,序属三秋。潦水尽而寒潭清,烟光凝而暮山紫。俨骖騑于上路,访风景于崇阿。临帝子之长洲,得天人之旧馆。

层峦耸翠,上出重霄;飞阁流丹,下临无地。鹤汀凫渚,穷岛屿之萦回;桂殿兰宫,即冈峦之体势。
Preview

PS: 例子来源于 Myriad-Dreamin

如何让行内数学公式显示为行间数学公式的大小?

可以通过 display() 函数实现。

行内数学公式(脚本模式) $integral x dif x$

行内数学公式(展示模式) $display(integral x dif x)$
Preview

注意,由于 display 也是一个函数,所以在其内部的逗号 , 要进行转义 \,

每次都要手动打 display 感觉很麻烦,能不能默认自动加上呢?如下所示,借助 labelshow 即可实现。

#show math.equation.where(block: false): it => {
  if it.has("label") and it.label == label("displayed-inline-math-equation") {
    it
  } else {
    [$display(it)$<displayed-inline-math-equation>]
  }
}

行内数学公式(展示模式) $integral x dif x$
Preview

如何嵌入 PDF 文件?

你暂时没有办法在 Typst 里嵌入 PDF 文件,但是你可以先使用 在线工具 将 PDF 文件转换为 SVG 文件,然后嵌入 svg 文件。

如何根据章节对图表和公式进行编码?

可以使用 i-figured 包。

如何编写复杂表格或编写简洁的表格?

复杂表格:可以使用 tablex 包。

类 Markdown 表格:可以使用 tablem 包。

如何更换不同的参考文献格式?

Typst (>=0.10.0) 可以使用 csl 文件指定参考文献格式,见 bibliography 的文档

Typst 内置了中文常用的 GB/T-7714-2015 格式,其他 GB/T-7714-2015 变体可以查看 GB/T 7714—2015 相关的 CSL 样式

为什么指定参考文献 csl 后,报错 failed to load CSL style

报错1: (duplicate field `layout`)

Typst 暂不支持 CSL-M 标准,可以注释掉多余的 <layout> 临时解决。

在 csl 文件里搜索 bibliography,这里通常有多个 <layout> ,一般建议注释掉 <layout locale="en"> 这一段 <layout> 。例子如下

<bibliography entry-spacing="0" et-al-min="4" et-al-use-first="3" second-field-align="flush">
  <!--
  <layout locale="en">
    <text variable="citation-number" prefix="[" suffix="]"/>
    <text macro="entry-layout"/>
  </layout>
  -->
  <layout>
    <text variable="citation-number" prefix="[" suffix="]"/>
    <text macro="entry-layout"/>
  </layout>
</bibliography>

(示例来自 http://www.zotero.org/styles/china-national-standard-gb-t-7714-2015-numeric ,原作者见此文件,依 CC-BY-SA 3.0 协议使用)

这样修改之后,csl 根据文献语言自动使用“等”或“et al.”的功能会失效,请见下一条 Q&A 的问题1。

报错2: (unknown variant `institution`, expected one of `name`, `et-al`, `label`, `substitute`)

在 csl 文件里注释掉不支持的部分。

为什么参考文献格式与预期不符?

问题1: 希望在中文文献使用 、在西文文献使用 et al.,但 Typst 均显示为 (或均显示为 et al.)。

Typst 暂不支持 CSL-M 标准,因此暂时无法通过修改 csl 文件实现中文西文自动使用不同的文字(typst/typst#2793, typst/citationberg#5, typst/hayagriva#126)。

如果参考文献均为同一种语言,可以为参考文献部分设定语言,如:

#set text(lang: "zh")
一些内容 @tbs1#heading(level: 1, numbering: none)[参考文献]
#{
  set text(lang: "en")
  bibliography(
    "many-authors.bib",
    style: "gb-7714-2015-numeric",
    title: none
  )
}
Preview

如果需要实现中文西文自动使用不同的文字,可以使用正则替换魔法,请见 nju-lug/modern-nju-thesis#3

问题2: (numeric 格式) 连续引用多条文献时,应当折叠为 1-4 ,但是 Typst 折叠为 1,4

hayagriva 已知 bug typst/hayagriva#154

可以通过将 csl 文件里的 after-collapse-delimiter="," 改成 after-collapse-delimiter="-" 临时解决。请注意,这样做并不符合 CSL 规范,修改后的文件不应当用于 Zotero 等文献管理软件。待 hayagriva 修复此 bug 后,需要改回。

问题3: 引文条目中 . 部分丢失。

在 csl 中修改生成引文条目的 macro,向缺少 . 的部分添加 <group delimiter=". ">

问题4: 参考文献不显示 bib 中的 note

目前暂不支持(typst/hayagriva#91)。

一些 Typst 中文资源列表

可以查看 Awesome Typst 中文版 中文版,以及浏览 第三方包

中国大学论文

中文简历

幻灯片