Skip to content

Commit 4433980

Browse files
更新 CSL 相关指引,提及 CSL Validator (#129)
1 parent fff69f7 commit 4433980

File tree

2 files changed

+72
-25
lines changed

2 files changed

+72
-25
lines changed

docs/FAQ/bib-csl.md

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
---
22
tags: [bib]
3+
outline: [2, 3]
34
---
45
# 为什么指定参考文献 CSL 后,报错“failed to load CSL style”?
56

@@ -11,15 +12,53 @@ Typst [已经内置](https://typst.app/docs/reference/model/bibliography/#parame
1112

1213
[^present]: 指 v0.14.0-rc.1 及之后的版本。
1314

14-
其实大部分非标准特性只影响特殊情况。可以先**删除非标准特性**,让 Typst 能读取样式生成参考文献;等真的遇到特殊情况了,再[专门解决](https://typst-doc-cn.github.io/clreq/#x7-bibliography)[手动编辑](https://forum.typst.app/t/how-to-manually-correct-the-format-of-bibliography-for-60-styles/5303/2)。此外,也可以尝试使用 [Citext](https://github.com/Shuenhoy/citext) 替代 Typst 原生的参考文献功能来获取 CSL-M 支持,请参考[如何修复英文参考文献中的“等”](./bib-etal-lang.md)
15+
对此有两种解决思路:
16+
17+
- 其实大部分非标准特性只影响特殊情况。可以先**删除非标准特性**,让 Typst 能读取样式生成参考文献;等真的遇到特殊情况了,再[专门解决](https://typst-doc-cn.github.io/clreq/#x7-bibliography)[手动编辑](https://forum.typst.app/t/how-to-manually-correct-the-format-of-bibliography-for-60-styles/5303/2)
18+
19+
- 使用 [Citext](https://github.com/Shuenhoy/citext) **替代 Typst 原生**的参考文献引擎,支持非标准特性。
20+
21+
这种方法可以根除问题,但会拖慢编译,而且有时需要调用特殊函数而不能单纯`@key`。详见[另一页面的专门小节](./bib-etal-lang.md#citext)
22+
23+
下面具体介绍第一种方法。
24+
25+
## 如何删除非标准特性
1526

1627
::: tip
17-
对于 [Zotero 中文社区的 CSL 样式](https://zotero-chinese.com/styles/),可直接前往[可用于 hayagriva 的 CSL 样式](https://typst-doc-cn.github.io/csl-sanitizer/)下载批量修改好的版本。
28+
对于 [Zotero 中文社区的 CSL 样式](https://zotero-chinese.com/styles/)不必阅读后文,可直接前往[可用于 Hayagriva 的 CSL 样式](https://typst-doc-cn.github.io/csl-sanitizer/)下载批量修改好的版本。
1829
:::
1930

20-
以下列出了常见报错以及解决方法,大致按常见程度降序排列。如果您遇到的错误不在其中,可尝试**二分法**依次删除各个`<macro>`来定位问题。
31+
首先需**定位问题**。请将文件上传到 [CSL 官方网站的 Validator](https://validator.citationstyles.org),正常应出现下面这种结果。
32+
33+
> Oops, I found 8 errors.
34+
>
35+
> **Errors**
36+
>
37+
> 1. Line 42: Bad value `citation-range-delimiter` for attribute `name` on element `term` from namespace `http://purl.org/net/xbiblio/csl`.
38+
>
39+
> ```xml
40+
> ms>
41+
> <term name="citation-range-delimiter">-</ter
42+
> ```
43+
>
44+
> 2. …
45+
46+
::: details CSL Validator 提示 No errors found,但 Typst 仍然无法加载 CSL?
47+
48+
> CSL Validator: Good job! No errors found.
2149
22-
## duplicate field `layout`
50+
CSL Validator 与 Typst/Hayagriva 毕竟原理不同,“CSL Validator 认为合法”与“Typst 认为合法”其实并无严格蕴含关系。
51+
52+
遇到这种情况,可尝试用 Typst 持续编译文档,然后**二分法**依次删除各个`<macro>`来定位问题。
53+
:::
54+
55+
接着结合 Typst 的报错,**逐一修改**各项错误。
56+
57+
例如上例可能伴随 Typst 报错 data did not match any variant of untagged enum Term,与 CSL Validator 第一个错误写的 term 相关,那就找到 CSL 文件的第 42 行,删除或注释`citation-range-delimiter`这行。修改后,如果 Typst 仍然无法加载 CSL,就继续处理下一个错误,直到解决。
58+
59+
以下列出了**常见报错以及解决方法**,大致按常见程度降序排列,可供参考。
60+
61+
### duplicate field `layout`
2362
2463
Typst 暂不支持 CSL-M 标准,可以注释掉多余的 `<layout>` 临时解决。
2564
@@ -44,7 +83,7 @@ Typst 暂不支持 CSL-M 标准,可以注释掉多余的 `<layout>` 临时解
4483

4584
这样修改之后,CSL 根据文献语言自动使用“等”或“et al.”的功能会失效,请见[如何修复英文参考文献中的“等”](./bib-etal-lang.md)
4685

47-
## unknown variant `institution`, expected one of `name`, `et-al`, `label`, `substitute`
86+
### unknown variant `institution`, expected one of `name`, `et-al`, `label`, `substitute`
4887

4988
请在 CSL 文件里注释掉`<institution/>`
5089

@@ -58,7 +97,7 @@ Typst 暂不支持 CSL-M 标准,可以注释掉多余的 `<layout>` 临时解
5897
</macro>
5998
```
6099

61-
## data did not match any variant of untagged enum Term
100+
### data did not match any variant of untagged enum Term
62101

63102
该错误有多种可能原因。
64103

@@ -88,7 +127,7 @@ Typst 暂不支持 CSL-M 标准,可以注释掉多余的 `<layout>` 临时解
88127

89128
此外,个别 CSL 文件错误地把`<term>`当成`<macro>`用。这种情况需要理解文件原本意图才能改正,建议直接向 CSL 维护者提出。
90129

91-
## data did not match any variant of untagged enum TextTarget/Variable
130+
### data did not match any variant of untagged enum TextTarget/Variable
92131

93132
请替换非标准的变量(variable),例如:
94133

@@ -117,9 +156,11 @@ Typst 暂不支持 CSL-M 标准,可以注释掉多余的 `<layout>` 临时解
117156
- `original-issue`
118157
- `original-jurisdiction`
119158

159+
- `<if variable="CSTR">`涉及[2025年新版国标](https://std.samr.gov.cn/gb/search/gbDetailed?id=4507EFE13D37CB6AE06397BE0A0A601F)引入的[科技资源标识 (CSTR)](https://std.samr.gov.cn/gb/search/gbDetailed?id=71F772D81092D3A7E05397BE0A0AB82A),目前无法输入。可先在 CSL 删除整段`<if>`,然后在著录各篇文献时把`CSTR: …`作为文本夹带进相邻位置的字段。
160+
120161
此外,个别 CSL 文件错误地把变量当成`<macro>`用。这种情况需要理解文件原本意图才能改正,建议直接向 CSL 维护者提出。
121162

122-
## missing field `$value`
163+
### missing field `$value`
123164

124165
CSL 标准规定`<else>``<group>``<layout>`等元素必须有内容。如果为空(或者只有注释),就会报告此错误。
125166

@@ -147,7 +188,7 @@ CSL 标准规定`<else>`、`<group>`、`<layout>`等元素必须有内容。如
147188
</citation>
148189
```
149190

150-
## unknown variant ``, expected one of `lowercase`, `uppercase`, `capitalize-first`, `capitalize-all`, `sentence`, `title`
191+
### unknown variant ``, expected one of `lowercase`, `uppercase`, `capitalize-first`, `capitalize-all`, `sentence`, `title`
151192

152193
请删掉空的`text-case`属性。
153194

@@ -156,7 +197,7 @@ CSL 标准规定`<else>`、`<group>`、`<layout>`等元素必须有内容。如
156197
+ <text variable="title"/>
157198
```
158199

159-
## invalid locator
200+
### invalid locator
160201

161202
`locator`属性改为标准规定的小写。
162203

docs/FAQ/bib-etal-lang.md

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,30 +19,36 @@ tags: bib
1919

2020
这种方法简单快速,能覆盖大部分场景。
2121

22-
## 法二:替换参考文献引擎
22+
## 法二:替换参考文献引擎 {#citext}
2323

2424
使用 [Citext](https://github.com/Shuenhoy/citext) 替换 Typst 默认的参考文献引擎[^citext-details]
2525

26-
```typst no-render
27-
// 在文档开头引入
28-
// citext 未发布至 Typst Universe,请手动将仓库下载至本地
29-
#import "./local-package/citext/lib.typ": *
26+
1. 在文档开头引入
3027

31-
#let bib = init-citation(read("refs.bib"))
32-
#show: show-extcite.with(bib: bib, gen-id: true)
28+
```typst no-render
29+
// citext 未发布至 Typst Universe,请手动将仓库下载至本地
30+
#import "./local-package/citext/lib.typ": *
3331
34-
// 将原本的 #bibliography("refs.bib") 替换为
35-
#show bibliography: none
36-
#bibliography("refs.bib")
32+
#let bib = init-citation(read("refs.bib"))
33+
#show: show-extcite.with(bib: bib, gen-id: true)
34+
```
3735

38-
= 参考文献
39-
#extbib(bib)
40-
```
36+
2.`#bibliography("refs.bib")`前后添加
37+
38+
```typst no-render
39+
#show bibliography: none
40+
#bibliography("refs.bib") // 与法一不同,法二需保留这行
41+
42+
= 参考文献
43+
#extbib(bib)
44+
```
4145

4246
这样可以真正实现按文献语言自动切换渲染方式;不过由于替换了引擎,会显著降低从零编译文档的速度,请在编写过程中妥善利用 Typst 的增量编译能力(`typst watch`/`tinymist preview`)。
4347

44-
[^citext-details]: Typst 的参考文献样式采用 CSL 标准,但 CSL 无法描述如何按文献语言切换渲染方式。CSL-M 扩展增加了这一功能,但 Typst 所用参考文献引擎尚不支持。Citext 使用 citation.js/QuickJS/WebAssembly/CtxJS 替代了 Typst 原生的参考文献功能,从而可以借助 citation.js 支持 CSL-M。
48+
此外,同一处引用多篇文献时,不能单纯`@key-a @key-b`,需要调用专门的`mulcite`函数。更多细节请阅读 [Citext 的 README](https://github.com/Shuenhoy/citext)
49+
50+
[^citext-details]: Typst 的参考文献样式采用 CSL 标准,但 CSL 无法描述如何按文献语言切换渲染方式。[CSL-M 扩展](https://citeproc-js.readthedocs.io/en/latest/csl-m/)增加了这一功能,但 Typst 所用参考文献引擎尚不支持。Citext 使用 [citation.js](https://citation.js.org/) + [QuickJS](https://crates.io/crates/rquickjs) + [WebAssembly](https://typst.app/docs/reference/foundations/plugin/) + [CtxJS](https://typst.app/universe/package/ctxjs) 替代了 Typst 原生的参考文献功能,从而可以通过 citation.js 调用 [citeproc-js](https://citeproc-js.readthedocs.io) 来支持 CSL-M。
4551

4652
## 法三:手动录入参考文献
4753

48-
请参考[手动参考文献方案](./bibitem.md)
54+
请参考[手动参考文献方案](./bibitem.md)

0 commit comments

Comments
 (0)