注意:该中文文档为社区驱动的非官网文档,可能存在错译、漏译或过时等问题,请以官网文档 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 中安装 Typst LSPTypst 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 中文资源列表

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

中国大学论文

中文简历

幻灯片