zotero中编写CSL文件自定义参考文献格式

引言

 最近草拟了几篇论文,终于想要去学学怎么自动插入参考文献了。虽然现在还是感觉用zotero插入参考文献还是差那么点意思,需要先保存文献到本地,然后才能在word里导入相应的参考文献。如果只是使用一次的论文的话,确实麻烦,但科研免不了退稿拒稿,而各家的参考文献格式又不一样。这时候才意识到文献管理工具是多么重要了。
 当投的期刊会议比较偏门时,很难找到已经做好的参考文献样式文件,就得自己动手来对CSL文件进行调整了。但网络上很多的教程要么就是粗略的依据经验来教授如何对CSL文件进行手动修改,要么就是使用可视化CSL编辑器来自定义。而后者在我看来真的很不直观,前者则是弄得一头雾水,作为半个程序员还不如稍微学习一下CSL的编写规范自己动手来编辑。于是有此教程。

CSL概述

 CSL全称citation stytle Language,顾名思义就是编写参考格式的语言,本身在XML格式上发展而来。本文并不打算对XML格式或者CSL格式本身做过多的介绍,如有需要自行查阅官方文档:1,本文也算是在该文档基础上修改而来,从中受益匪浅。本文着重关注的是如何看懂CSL文件,在了解其层次化结构的基础上进行修改,并且主要是在Zotero提供的范本CSL上进行介绍,不涉及较为偏门的语法。

CSL的一般结构

  我们能看到的CSL文件一般布局如下:

<?xml version="1.0" encoding="utf-8"?>
<style>
  <info/>
  <locale/>
  <macro/>
  <macro/>
  <citation/>
  <bibliography/>
</style>

 我们可以看到CSL文件除了抬头,整个都是被包裹在<style><\style>定义的代码块中,抬头可以无视,旨在说明CSL文件所遵循的XML版本和编码格式,我们只需要对style中的代码进行编辑即可实现风格的修改。而在<style>中,整个代码又大体可以被划分为6个部分,每个部分同样是会被形如<child>,<\child>的域所包裹(其实也就是HTML中的格式,类似C中的花括号,如果域为空的话也可以直接用<child\>一行表示)。同样的,CSL文件最基本的元素就可认为是这样一个,比较类似于其他编程语言中的,也有着类似于父类子类重写,子类继承的概念。一个标准的域为如下格式:

<parent attribute1="..." attribute2="...">
	<child1>
	<\child1>
<partent>

attribute就对类的属性进行了基本的定义,一般通过它的名字就知道定义了哪方面的内容,可选项的话查阅文档2即可.

这6个部分都对最后输出的风格有一定的影响,首先给出一个范本,以此为基础进行介绍:

<?xml version="1.0" encoding="utf-8"?>
<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0">
  <info>
    <title>Example Style</title>
    <id>http://www.zotero.org/styles/example</id>
    <link href="http://www.zotero.org/styles/example" rel="self"/>
    <link href="http://www.zotero.org/styles/apa" rel="template"/>
    <link href="http://www.example.com/style-guide/" rel="documentation"/>
    <author>
      <name>John Doe</name>
      <email>JohnDoe@example.com</email>
    </author>
    <contributor>
      <name>Jane Doe</name>
    </contributor>
    <contributor>
      <name>Bill Johnson</name>
    </contributor>
    <category citation-format="author-date"/>
    <category field="science"/>
    <updated>2014-10-15T18:17:09+00:00</updated>
    <rights license="http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License</rights>
  </info>

  <locale xml:lang="en">
    <terms>
      <term name="no date">without date</term>
    </terms>
  </locale>

  <macro name="author">
    <names variable="author">
      <name initialize-with="."/>
    </names>
  </macro>
  
  <macro name="issued-year">
    <choose>
      <if variable="issued">
        <date variable="issued">
          <date-part name="year"/>
        </date>
      </if>
      <else>
        <text term="no date"/>
      </else>
    </choose>
  </macro>
  
  <citation et-al-min="3" et-al-use-first="1">
    <sort>
      <key macro="author"/>
      <key macro="issued-year"/>
    </sort>
    <layout prefix="(" suffix=")" delimiter="; ">
      <group delimiter=", ">
        <text macro="author"/>
        <text macro="issued-year"/>
      </group>
    </layout>
  </citation>
  
  <bibliography>
    <sort>
      <key macro="author"/>
      <key macro="issued-year"/>
      <key variable="title"/>
    </sort>
    <layout suffix=".">
      <group delimiter=", ">
        <group delimiter=". ">
          <text macro="author"/>
          <text macro="issued-year"/>
          <text variable="title"/>
          <text variable="container-title"/>
        </group>
        <group>
          <text variable="volume"/>
          <text variable="issue" prefix="(" suffix=")"/>
        </group>
        <text variable="page"/>
      </group>
    </layout>
  </bibliography> 
  
</style>

info

 info顾名思义主要是对CSL文件本身做出的解释,介绍了CSL文件的名字、依赖项、作者、类型、更新时间等等,和CSL文件最终的输出效果关系不大,不做具体介绍,同样可见1。一自用的话只需修改其中的titile字段即可。

local

 locale同样也比较好理解,类似于本地化的意思。他使得我们可以CSL中的一些默认提供的关键字段进行修改,比如作者名间连缀的“and",我们就可以通过添加一下语句:<term name="and">also</term>
在这里将其修改为" also ":

J. Hirsch, M. Tiede, X. Zhang, J. A. Noah, A. Salama-Manteau, and M. Biriotti
J. Hirsch, M. Tiede, X. Zhang, J. A. Noah, A. Salama-Manteau, also M. Biriotti

但其实这个地方也一般也不常用。

macro

  macro是我们需要重点介绍的部分,macro直译为宏,定义了绝大部分我们需要输出的字段的格式。通常而言,一个macro就定义参考文献格式中的一项内容,像:

 <macro name="author">
    <names variable="author">
      <name and="text" et-al-min="3" et-al-use-first="1" initialize-with=". "/>
      <label form="short" prefix=", " text-case="capitalize-first"/>
      <et-al font-style="italic"/>
      <substitute>
        <names variable="editor"/>
        <names variable="translator"/>
      </substitute>
    </names>
  </macro>

这一macro就定义了最终参考文献中作者name="author")这一部分是如何输出,从这里我们可以直观的猜测出它定义了那些输出格式;

  1. 首先,et-al-min="3" et-al-use-first="1"是定义了作者超过3名是使用et.al进行省略,并且省略后保留一位作者名,通过对initialize-with=". "进行修改可以发现,它是定义了作者名和姓之间的连接方为“.",修改为
    et-al-min="3" et-al-use-first="2" initialize-with="! "可看到如下结果:

    J! Hirsch, M! Tiede, et al
    
  2. form="short"定义了姓名会使用缩写,prefix=", "说明该字段输出时有前缀", ",text-case="capitalize-first"说明首字母大写。由此可以猜测存在 form="long suffix=". "的用法。

  3. font-style="italic"则是定义了斜体输出

其余的macro字段同理,一般有author,title, volume, page等等宏定义字段可定制。而在macro域里也时常见到包含了if语句,易知它就是定义了不同情况下该macro会如何输出,如下例:

 <macro name="title">
    <choose>
      <if type="bill book graphic legal_case legislation motion_picture song" match="any">
        <text variable="title" font-style="italic"/>
      </if>
      <else>
        <text variable="title" quotes="true"/>
      </else>
    </choose>
  </macro>

就定义了当文献类型为"bill book graphic legal_case legislation motion_picture song" 中的一种时斜体输出,否则就加引号后输出。

citation

 citation定义了文中的引用是如何出现的,常见的就是数字形式:“[1]”或者作者形式"[Chen et.al]",典型如下:

  <citation collapse="citation-number">
    <sort>
      <key variable="citation-number"/>
    </sort>
    <layout delimiter=", ">
      <group prefix="[" suffix="]" delimiter=", ">
        <text variable="citation-number"/>
        <text macro="citation-locator"/>
      </group>
    </layout>
  </citation>

明显看出这里就是"citation-number",带前缀“[”,后缀“]”的格式,也就是“[1]”,一般此处也不用过多自定义,直接复制现有的格式覆盖即可。

bibliography

 bibliography是CSL文件的重头戏,它决定了最终Reference中的参考文献会如何显示,bioliography中最重要的子类layout定义了最终会对于给定的文献会输出何种内容,以及如何输出。其中大都会包含一组if…else if …else语句以对不同类型的参考文献进行处理,范例如下:

bibliography entry-spacing="0" second-field-align="flush">
    <layout>
      <!-- Citation Number -->
      <text variable="citation-number" prefix="[" suffix="]"/>
      <!-- Author(s) -->
      <text macro="author" suffix=", "/>
      <!-- Rest of Citation -->
      <choose>
        <!-- Specific Formats -->
        <if type="article-journal">
          <group delimiter=", ">
            <text macro="title"/>
            <text variable="container-title" font-style="italic" form="short"/>
            <text macro="locators"/>
            <text macro="page"/>
            <text macro="issued"/>
            <text macro="status"/>
          </group>
          <choose>
            <if variable="URL DOI" match="none">
              <text value="."/>
            </if>
            <else>
              <text value=","/>
            </else>
          </choose>
          <text macro="access"/>
        </if>
        <else-if type="paper-conference speech" match="any">
          <group delimiter=", " suffix=".">
            <text macro="title"/>
            <text macro="event"/>
            <text macro="issued"/>
            <text macro="locators"/>
            <text macro="page"/>
            <text macro="status"/>
          </group>
          <text macro="access"/>
        </else-if>
        <else>
          <group delimiter=", " suffix=". ">
            <text macro="title"/>
            <text variable="container-title" font-style="italic"/>
            <text macro="locators"/>
          </group>
          <group delimiter=", " suffix=".">
            <text macro="publisher"/>
            <text macro="page"/>
            <text macro="issued"/>
          </group>
          <text macro="access"/>
        </else>
      </choose>
    </layout>
  </bibliography>

可以看出首先借由<text>标签,首先会输出前缀“[”,后缀“]”的citation number字段,也就是我们常见的"[1]",而后输出后缀为“,”的作者字段(作者字段不是简单的变量,而是之前被定义了格式的author macro) 。

[1] J. Hirsch, M. Tiede, X. Zhang, et al.,

 而后依照文章类型的不同分开处理,如果是期刊论文,则定义了一个以“,”作为分隔符的组,其内输出的元素都会以“,”隔开,组内输出论文的名字、出版社、地址、页、系列等信息,(这些信息的格式在对应的macro里得到定义

“Interpersonal Agreement and Disagreement During Face-to-Face Dialogue: An fNIRS Investigation,” Front Hum Neurosci, vol. 14, p. 606397, Jan. 2021, 

然后有DOI号就输出,否则输出逗号;最后输出接收情况。整体如下:

J. Hirsch, M. Tiede, X. Zhang, et al., “Interpersonal Agreement and Disagreement During Face-to-Face Dialogue: An fNIRS Investigation,” Front Hum Neurosci, vol. 14, p. 606397, Jan. 2021, doi: 10.3389/fnhum.2020.606397.

 会议论文和演讲的格式归位一类处理,其他的归为一类处理。

在bibliography中会出现很无需定义格式的字段,会以variable输出,具体对应什么内容,可参见2

整体修改思路

 总得来说,CSL文件的修改步骤如下:

  1. 将CSL文件分段,分成info, locale, maco, citation, bibliography六大部分,每部分分行以保持清晰;
  2. 对bibliography进行划分,将不同类型论文的规定隔开,同样是为了保证清晰;
  3. 依照整体要求对相应的macro字段进行修改,比如姓名是否缩写等
  4. 依照要求对某类论文的输出要求在bibliography中删除不需要字段,比如无需DOI等。
  5. 对最终输出的排布顺序进行调整,在bibliography中调整text顺序以及前缀后缀等。

这一系列操作都建议在Zotero的样式编辑界面进行调整,以能得到实时的反馈,最后再另存为CSL文件,由Zotero导入。

待解

 有些会议要求参考文献中的期刊或者会议论文的container字段,也就是会议名、杂志名以缩写形式呈现,目前还没找到特别理想的方法解决这一问题。倒是可以直接用format="short"再勾选zotero中的“使用MEDL山NE期肝刊缩写”实现,但默认是使用对应依赖样式所定义的缩写。而和规定缩写不同时就抓瞎了,可行的办法是手动在zotero中对对应文献的介绍进行修改,将会议名直接变为简写,如下:

在这里插入图片描述

输出为:
在这里插入图片描述

参考


  1. Primer: An introducation to CSL ↩︎ ↩︎

  2. CSL 1.0.2 Specification ↩︎ ↩︎

  • 8
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值