Skip to content

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

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

Typst 已经内置了中文常用的 GB/T 7714—2015 格式;如果你使用了其它中文 CSL 样式,可能会遇到这种报错。

概论

在读取 CSL 样式方面,Typst 目前[1]已基本完全支持 CSL 标准。这些样式之所以无法加载,通常是因为用了非标准特性,例如 CSL-M 扩展citeproc-js 内部特性。

其实大部分非标准特性只影响特殊情况。可以先删除非标准特性,让 Typst 能读取样式生成参考文献;等真的遇到特殊情况了,再专门解决手动编辑

以下列出了常见报错以及解决方法,大致按常见程度降序排列。如果您遇到的错误不在其中,可尝试二分法依次删除各个<macro>来定位问题。

duplicate field layout

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

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

xml
<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>

(示例来自 Zotero 上的 China National Standard GB/T 7714-2015 (numeric, 中文),原作者见此文件,依 CC-BY-SA 3.0 协议使用)

这样修改之后,CSL 根据文献语言自动使用“等”或“et al.”的功能会失效,请见如何修复英文参考文献中的“等”

unknown variant institution, expected one of name, et-al, label, substitute

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

xml
  <macro name="secondary-contributors-en">
    <names variable="translator">
      <name/>
      <!-- <institution/> -->
      <label form="short" prefix=" "/>
    </names>
  </macro>

data did not match any variant of untagged enum Term

该错误有多种可能原因。

若 CSL 文件中包含citation-range-delimiter等非标准<term>,请删除它们,例如:

diff
  <locale>
    <terms>
-     <term name="citation-range-delimiter">-</term>
      <term name="page-range-delimiter">-</term>
    </terms>
  </locale>
原因

按照 GB/T 7714—2015,同一处连续引用多篇文献时,起讫序号间用短横线连接,例如[255-256]。这个短横线默认是(U+2013 EN DASH),以上citation-range-delimiter将它修改为-(U+002D HYPHEN-MINUS)。不过citation-range-delimiter超出了 CSL 规范CSL-M 扩展,是 citeproc-js 单独实现的,Typst 并不识别。

常见的非标准<term>如下。

  • citation-range-delimiter可删除
  • space-et-al可替换为et-al
  • en-et-alzh-et-alet-al-zh等也可替换为et-al
  • long-ordinal-11long-ordinal-12(CSL 标准规定最大到 10)可删除

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

data did not match any variant of untagged enum TextTarget/Variable

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

diff
- <if variable="original-container-title">
+ <if variable="container-title">
    <group delimiter=": ">
-     <text variable="original-container-title"/>
+     <text variable="container-title"/>
      <text macro="volume"/>
    </group>
  </if>

常见的非标准变量及解决办法如下。

  • <text term="unpublished"/>是过时的 CSL-M 扩展,可替换为<text value="Unpublished"/>

  • 标准之外的original-*变量可去除original-前缀,常见的有:

    • original-container-titleoriginal-container-title-short
    • original-genre
    • original-event-titleoriginal-event-place
    • original-editor
    • original-status
    • original-issue
    • original-jurisdiction

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

missing field $value

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

对于<else><group>,通常是 CSL 维护者调试时忘记清理,直接把整段元素删掉即可。例如:

diff
  <choose>
    <if variable="URL">
      <text variable="URL"/>
    </if>
-   <else>
-     <!-- <text variable="DOI" prefix="https://doi.org/"/> -->
-   </else>
  </choose>

对于<layout>,应该是工具性 CSL 刻意为之,可填充空字符串解决。

diff
  <citation>
-   <layout/>
+   <layout>
+     <text value=""/>
+   </layout>
  </citation>

unknown variant ``, expected one of lowercase, uppercase, capitalize-first, capitalize-all, sentence, title

请删掉空的text-case属性。

diff
- <text variable="title" text-case=""/>
+ <text variable="title"/>

invalid locator

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

diff
- <if locator="Chapter">
+ <if locator="chapter">

  1. 指 v0.14.0-rc.1 及之后的版本。 ↩︎

What do you think?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v3.5.1

基于 MIT 许可发布