Typst 参考文献怎么按 GB/T 7714 排版
在 Typst 里写参考文献:#bibliography 读取 .bib 和 Hayagriva .yml 文件,@key 与 #cite 的写法和 form 参数,内置的 GB/T 7714—2015 顺序编码制、著者-出版年制和脚注样式,2025 版用 CSL 文件或 gb7714-bilingual 包实现,"等"与"et al."由什么决定,参考文献表标题,以及找不到文献、找不到文件等报错的含义。
最后核对:2026-10-24Typst 自己处理参考文献:不需要 BibTeX 或 biber,也不用多跑几遍编译,写好 #bibliography 和引用就能看到结果。它内置了 GB/T 7714—2015 的样式,但没有内置 2025 版。GB/T 7714—2025 已于 2026 年 7 月 1 日起实施,学校要求新版时,要用项目里的 CSL 文件或 Typst Universe 上的包,本文后面分两节介绍。LaTeX 的做法见 LaTeX 参考文献与 GB/T 7714—2025。
最短的写法是什么
在文中用 @key 引用,在文末用 #bibliography 读入文献文件、选择样式:
// title: Typst GB/T 7714—2015 顺序编码制
#set text(
font: ((name: "Libertinus Serif", covers: "latin-in-cjk"), "Noto Serif CJK SC"),
lang: "zh", // 参考文献表的标题"参考文献"和著者后的"等"都由这里的语言决定
region: "cn",
)
#set par(justify: true, first-line-indent: (amount: 2em, all: true))
= 引用示例
// @key 引用一条文献;顺序编码制下序号是上标
诗格类文献的整理见张伯伟的汇编 @zhang2002。
// 只隔着空格的几个引用会合并成一处,连续的序号压成范围
热解动力学和土壤湿度反演方面已有系统研究 @liu2000 @wang2022 @dunbar2013。
// 内置的 GB/T 7714 顺序编码制样式会丢掉 @key[...] 里的页码,
// 国标要求的"[1]288"可以用 #super 手动写在引用后面
书中第 288 页有专门讨论 @zhang2002#super[288]。
// form 改变引用的形式:"prose" 著者 + 序号,"author" 只有著者,"year" 只有年份
#cite(<zhang2020>, form: "prose")讨论了深度学习在排版中的应用,#cite(<smith2019>, form: "author")在 #cite(<smith2019>, form: "year") 年也有类似的工作。
// 改成著者-出版年制:把 style 换成 "gb-7714-2015-author-date"
#bibliography("refs.bib", style: "gb-7714-2015-numeric")
几点说明:
#bibliography("refs.bib", style: "gb-7714-2015-numeric")的第一个参数是文献文件的路径,相对于当前的.typ文件。.bib是普通的 BibLaTeX 数据库,从 Zotero 等工具导出的文件可以直接用。- 文献表里只列出正文引用过的文献。要列出文件里的全部条目,写
full: true。 - 文献表的标题由文档语言决定:
lang: "zh"时是"参考文献",lang: "en"时是"Bibliography"。 - 只隔着空格的几个
@key会合并成一处引用,连续的序号压成范围,如 [2–4]。 - 顺序编码制的序号是上标,这是样式规定的,不用自己写
#super。
内置的 GB/T 7714 样式有哪些
Typst 0.15.1 内置四个国标样式:
| 样式名 | 体系 | 正文效果 |
|---|---|---|
gb-7714-2015-numeric | 2015 版顺序编码制 | 上标 [1]、[2–4] |
gb-7714-2015-author-date | 2015 版著者-出版年制 | (张伯伟, 2002) |
gb-7714-2015-note | 2015 版注释体系 | 脚注 |
gb-7714-2005-numeric | 2005 版顺序编码制 | 上标 [1] |
写 style: "gb-7714-2025-numeric" 会报 error: unknown style: gb-7714-2025-numeric,因为没有这个样式。
内置样式有两个要知道的细节:
- 页码不显示。Typst 的引用可以带补充信息,
@zhang2002[288]或#cite(<zhang2002>, supplement: [288]),但顺序编码制和著者-出版年制的国标样式都不输出它,编译也不报错。国标要求的"[1]288"可以写成@zhang2002#super[288],示例里就是这样做的。 - 学位论文的学校不显示。
.bib里写在school字段的学校名不会出现在文献表里,要写进publisher字段,才能得到"合肥: 中国科学技术大学, 2000"。
@key 和 #cite 怎么写
@key 是 #cite(<key>) 的简写。需要改变引用的形式时,用 #cite 的 form 参数:
form: "normal"(默认):样式规定的形式,如上标的 [1] 或"(张伯伟, 2002)";form: "prose":著者作为句子的一部分,如"Dunbar 等 (2013)";form: "author"、form: "year":只输出著者或年份;form: "full":在正文里输出完整的文献条目;form: none:不输出任何东西,但这条文献照样进入文献表。
写 @key 时要注意,标签名可以包含汉字,所以 @zhang2002讨论了 会被读成标签 <zhang2002讨论了>,报错说这个标签不存在。标签后面紧跟汉字时,写成 #cite(<zhang2002>)讨论了;后面是标点或空格则没有问题。
用 Hayagriva 的 .yml 文件
除了 .bib,Typst 还读它自己的 Hayagriva 格式。它是 YAML 文件,每条文献以引用键开头,下面缩进写字段,比 .bib 少写很多括号:
// title: Typst 著者-出版年制与 Hayagriva
#set text(
font: ((name: "Libertinus Serif", covers: "latin-in-cjk"), "Noto Serif CJK SC"),
lang: "zh",
region: "cn",
)
#set par(justify: true, first-line-indent: (amount: 2em, all: true))
= 引用示例
// 著者-出版年制:引用显示为"(著者,年份)"
诗格类文献已有系统整理 @zhang2002。
// 内置的 GB/T 7714 样式不输出 @key[...] 里的页码,需要时直接写在正文里
书中第 288 页有专门讨论 @zhang2002。
// 几处引用连写,合并成一个括号
相关研究见 @liu2000 @dunbar2013。
// "prose" 让著者成为句子的一部分,只有年份在括号里
#cite(<dunbar2013>, form: "prose")讨论了核糖体天然产物的生物合成。
// 文献表按著者排序;title 换掉默认的"参考文献"
#bibliography("refs.yml", style: "gb-7714-2015-author-date", title: [主要参考文献])
type是文献类型:book图书、thesis学位论文、article文章等。期刊文章的期刊名、卷、期写在parent下面。- 出版地和出版者写在
publisher下面的location和name里。 - 西文姓名写成
"Dunbar, Kyle L."。因为名字里有逗号,引号不能省:省掉时 YAML 会按逗号把每个姓名拆成两个人,不会报错:示例里的两位著者会变成四位,文献表里还会出现"等"。 .bib和.yml可以同时用:#bibliography(("refs.bib", "more.yml"))。
这个示例用的是著者-出版年制。文献表先列中文文献,按著者姓名的拼音排序,再列西文文献。
"等"和"et al."由什么决定
国标规定,著者超过三位时只列前三位,中文文献后加"等",西文文献后加"et al."。用 Typst 内置的样式时,用哪一个只取决于文档的语言,与文献本身是什么语言无关:
lang: "zh"时,西文文献也是"SMITH J, DOE J, ROE R, 等";lang: "en"时,中文文献也是"张三, 李四, 王五, et al."。
在 .bib 条目里加 langid = {english} 或 language = {english} 不会改变这一点。需要中西文分别处理时,用后面介绍的 gb7714-bilingual 包。
2025 版怎么办:用 CSL 文件
Typst 的 style 参数除了内置的样式名,还可以写一个 CSL 样式文件的路径。CSL 官方样式库(GitHub 上的 citation-style-language/styles)已经收录了 GB/T 7714—2025 的三个样式:china-national-standard-gb-t-7714-2025-numeric.csl(顺序编码制)、-author-date.csl(著者-出版年制)和 -note.csl(注释)。把文件下载下来上传到项目里,文件约 17 KB:
// title: Typst GB/T 7714—2025(CSL 文件)
// Typst 0.15.1 没有内置 2025 版样式。项目里的 .csl 文件来自 CSL 官方样式库
// (citation-style-language/styles 中的 china-national-standard-gb-t-7714-2025-numeric.csl)
#set text(
font: ((name: "Libertinus Serif", covers: "latin-in-cjk"), "Noto Serif CJK SC"),
lang: "zh",
region: "cn",
)
#set par(justify: true, first-line-indent: (amount: 2em, all: true))
= 引用示例
诗格类文献的整理见张伯伟的汇编 @zhang2002。
热解动力学和土壤湿度反演方面已有系统研究 @liu2000 @wang2022 @dunbar2013。
// 这个样式同样不输出 @key[...] 里的页码,用 #super 写在引用后面
书中第 288 页有专门讨论 @zhang2002#super[288]。
中文和西文文献各有一条四位著者的文献 @zhang2020 @smith2019,比较文献表里著者的写法。
// style 写 .csl 文件的路径(相对于当前文件),就用这个文件里的样式
#bibliography("refs.bib", style: "china-national-standard-gb-t-7714-2025-numeric.csl")
和内置的 2015 版样式相比,输出有这些不同:西文著者的姓不再全部大写("Smith J"),标点改成全角的","和":"。这个样式同样不输出 @key[...] 里的页码,"等"和"et al."也仍由文档语言决定,所以西文文献后面还是"等",而且"等"前面多一个空格。
2025 版怎么办:用 gb7714-bilingual 包
Typst Universe 上的 gb7714-bilingual 包(本文用 0.2.3 版)实现了 2015 和 2025 两版国标。它自己读取 .bib、排版文献表,不经过 Typst 的 #bibliography,所以能按每条文献的语言切换用语:中文文献用"等",西文文献用"et al."。
// title: Typst GB/T 7714—2025 双语参考文献
// gb7714-bilingual 自己读取 .bib、排版参考文献表,不经过 Typst 的 #bibliography。
// 它按每条文献的语言切换"等/et al."等用语,并支持 2015 和 2025 两个版本
#import "@preview/gb7714-bilingual:0.2.3": init-gb7714, gb7714-bibliography, multicite
#set text(
font: ((name: "Libertinus Serif", covers: "latin-in-cjk"), "Noto Serif CJK SC"),
lang: "zh",
region: "cn",
)
#set par(justify: true, first-line-indent: (amount: 2em, all: true))
// .bib 的内容要用 read() 读进来再交给它;version 不写时就是 "2025"
// style 可选 "numeric"(顺序编码制)或 "author-date"(著者-出版年制)
#show: init-gb7714.with(read("refs.bib"), style: "numeric", version: "2025")
= 引用示例
// 这个包的引用前面的空格会留在输出里,所以 @ 紧贴前面的汉字;
// 标签后面紧跟汉字时要写成 #cite(<key>),见下文
诗格类文献的整理见张伯伟的汇编@zhang2002。
// 用这个包时,几处连写的 @key 不会自动合并,要合并就用 multicite
热解动力学和土壤湿度反演方面已有系统研究#multicite("liu2000", "wang2022", "dunbar2013")。
// 方括号里的页码会写进引用的方括号里,得到 [1, 288]
书中第 288 页有专门讨论@zhang2002[288]。
这两条文献#cite(<zhang2020>)和#cite(<smith2019>)都有四位著者:文献表里中文文献写"等",西文文献写"et al."。
// 参考文献表:标题按正文语言自动选"参考文献"或"References"
#gb7714-bibliography()
- 用
read("refs.bib")把文件内容交给init-gb7714;多个文件写成read("a.bib") + read("b.bib")。version可选"2015"或"2025",不写时是 2025 版;style可选"numeric"或"author-date"。 - 文献的语言先看条目的
language字段,再看langid,都没有时看题名和著者里有没有连续的汉字。 - 学位论文的学校从
school字段读。为内置样式改写到publisher的条目,换用这个包时要改回school。 - 它把西文题名改成只有句首大写:示例里的"Revealing Nature's Synthetic Potential…"输出为"Revealing Nature's synthetic potential…"。专有名词要在
.bib里用花括号保护,示例写了{Nature's}、{Typst}、{GNSS-R},不写时它们会变成小写。 - 几个
@key连写时不会合并,要写成#multicite("a", "b", "c")。 @key[288]的页码会放进方括号里,得到"[1, 288]"。- 引用前面的空格会留在输出里,所以示例里的
@紧贴前面的汉字。
参考文献表的标题怎么改
#bibliography 的 title 参数改标题:title: [主要参考文献] 换一个名字,title: none 不要标题。这个标题是一级标题,但不编号,即使文档设置了 heading 的 numbering。用 gb7714-bilingual 时,标题写在 #gb7714-bibliography(title: ...) 里,而且要写成标题元素:title: heading(numbering: none)[主要参考文献];只写 [主要参考文献] 会排成一行普通文字。title: none 同样不要标题。
常见报错对照
| 报错 | 原因 | 解决 |
|---|---|---|
label `<nokey>` does not exist in the document | @nokey 的键在文献文件里没有;或者文档里还没有 #bibliography;或者 @key 后面紧跟着汉字 | 检查键的拼写(区分大小写);加上 #bibliography;键后面紧跟汉字时写 #cite(<key>) |
citation key `nokey` is not present in the bibliography | 用 #cite(<nokey>) 引用了不存在的键 | 同上 |
the document does not contain a bibliography | 用了 #cite,但文档里没有 #bibliography | 加上 #bibliography |
file not found (searched at ...) | 文献文件或 CSL 文件不在给出的路径上,括号里是查找的位置 | 检查文件名和文件夹,路径相对于当前的 .typ 文件 |
unknown style: gb-7714-2025-numeric | 没有这个内置样式 | 用 CSL 文件或 gb7714-bilingual |
failed to parse BibLaTeX (expected comma) | .bib 里两个字段之间少了逗号 | 按报错的行号补上逗号 |
failed to parse BibLaTeX (duplicate key "a") | .bib 里有两条文献用了同一个键 | 改掉其中一个 |
label `<zhang2002>` occurs both in the document and a bibliography | 文档里的标签和文献的键重名 | 改掉标签或键 |
expected label, found string | 写成了 #cite("zhang2002") | 写成 #cite(<zhang2002>) |
报错的位置在 JointTex 里会在源码中标出,并列在"问题"标签页里。中文正文本身的排版见 Typst 中文排版,其他报错见 Typst 常见报错。
