引言
最近草拟了几篇论文,终于想要去学学怎么自动插入参考文献了。虽然现在还是感觉用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"
)这一部分是如何输出,从这里我们可以直观的猜测出它定义了那些输出格式;
-
首先,
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
-
form="short"
定义了姓名会使用缩写,prefix=", "
说明该字段输出时有前缀", ",text-case="capitalize-first"
说明首字母大写。由此可以猜测存在form="long suffix=". "
的用法。 -
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文件的修改步骤如下:
- 将CSL文件分段,分成info, locale, maco, citation, bibliography六大部分,每部分分行以保持清晰;
- 对bibliography进行划分,将不同类型论文的规定隔开,同样是为了保证清晰;
- 依照整体要求对相应的macro字段进行修改,比如姓名是否缩写等
- 依照要求对某类论文的输出要求在bibliography中删除不需要字段,比如无需DOI等。
- 对最终输出的排布顺序进行调整,在bibliography中调整text顺序以及前缀后缀等。
这一系列操作都建议在Zotero的样式编辑界面进行调整,以能得到实时的反馈,最后再另存为CSL文件,由Zotero导入。
待解
有些会议要求参考文献中的期刊或者会议论文的container字段,也就是会议名、杂志名以缩写形式呈现,目前还没找到特别理想的方法解决这一问题。倒是可以直接用format="short"
再勾选zotero中的“使用MEDL山NE期肝刊缩写”实现,但默认是使用对应依赖样式所定义的缩写。而和规定缩写不同时就抓瞎了,可行的办法是手动在zotero中对对应文献的介绍进行修改,将会议名直接变为简写,如下:
输出为: