最近草拟了几篇论文,终于想要去学学怎么自动插入参考文献了。虽然现在还是感觉用zotero插入参考文献还是差那么点意思,需要先保存文献到本地,然后才能在word里导入相应的参考文献。如果只是使用一次的论文的话,确实麻烦,但科研免不了退稿拒稿,而各家的参考文献格式又不一样。这时候才意识到文献管理工具是多么重要了。
当投的期刊会议比较偏门时,很难找到已经做好的参考文献样式文件,就得自己动手来对CSL文件进行调整了。但网络上很多的教程要么就是粗略的依据经验来教授如何对CSL文件进行手动修改,要么就是使用可视化CSL编辑器来自定义。而后者在我看来真的很不直观,前者则是弄得一头雾水,作为半个程序员还不如稍微学习一下CSL的编写规范自己动手来编辑。于是有此教程。
CSL全称citation stytle Language,顾名思义就是编写参考格式的语言,本身在XML格式上发展而来。本文并不打算对XML格式或者CSL格式本身做过多的介绍,如有需要自行查阅官方文档:1,本文也算是在该文档基础上修改而来,从中受益匪浅。本文着重关注的是如何看懂CSL文件,在了解其层次化结构的基础上进行修改,并且主要是在Zotero提供的范本CSL上进行介绍,不涉及较为偏门的语法。
我们能看到的CSL文件一般布局如下:
<style>
style>
我们可以看到CSL文件除了抬头,整个都是被包裹在和
<\style>
定义的代码块中,抬头可以无视,旨在说明CSL文件所遵循的XML版本和编码格式,我们只需要对style中的代码进行编辑即可实现风格的修改。而在中,整个代码又大体可以被划分为6个部分,每个部分同样是会被形如
的域所包裹(其实也就是HTML中的格式,类似C中的花括号,如果域为空的话也可以直接用
一行表示)。同样的,CSL文件最基本的元素就可认为是这样一个域,比较类似于其他编程语言中的类,也有着类似于父类和子类重写,子类继承的概念。一个标准的域为如下格式:
<\child1>
attribute
就对类的属性进行了基本的定义,一般通过它的名字就知道定义了哪方面的内容,可选项的话查阅文档2即可.
这6个部分都对最后输出的风格有一定的影响,首先给出一个范本,以此为基础进行介绍:
<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0">
Example Style
http://www.zotero.org/styles/example
"http://www.zotero.org/styles/example" rel="self"/>
"http://www.zotero.org/styles/apa" rel="template"/>
"http://www.example.com/style-guide/" rel="documentation"/>
John Doe
JohnDoe@example.com
Jane Doe
Bill Johnson
"author-date"/>
"science"/>
2014-10-15T18:17:09+00:00
"http://creativecommons.org/licenses/by-sa/3.0/">This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 License
xml:lang="en">
"no date">without date
"author">
"author">
"."/>
"issued-year">
"issued">
"issued">
"year"/>
"no date"/>
"3" et-al-use-first="1">
"author"/>
"issued-year"/>
"(" suffix=")" delimiter="; ">
", ">
"author"/>
"issued-year"/>
"author"/>
"issued-year"/>
"title"/>
".">
", ">
". ">
"author"/>
"issued-year"/>
"title"/>
"container-title"/>
"volume"/>
"issue" prefix="(" suffix=")"/>
"page"/>
style>
info顾名思义主要是对CSL文件本身做出的解释,介绍了CSL文件的名字、依赖项、作者、类型、更新时间等等,和CSL文件最终的输出效果关系不大,不做具体介绍,同样可见1。一自用的话只需修改其中的titile字段即可。
locale同样也比较好理解,类似于本地化的意思。他使得我们可以CSL中的一些默认提供的关键字段进行修改,比如作者名间连缀的“and",我们就可以通过添加一下语句:
在这里将其修改为" 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 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定义了文中的引用是如何出现的,常见的就是数字形式:“[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是CSL文件的重头戏,它决定了最终Reference中的参考文献会如何显示,bioliography中最重要的子类layout
定义了最终会对于给定的文献会输出何种内容,以及如何输出。其中大都会包含一组if…else if …else语句以对不同类型的参考文献进行处理,范例如下:
bibliography entry-spacing="0" second-field-align="flush">
<layout>
<text variable="citation-number" prefix="[" suffix="]"/>
<text macro="author" suffix=", "/>
<choose>
<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>
可以看出首先借由
标签,首先会输出前缀“[”,后缀“]”的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文件的修改步骤如下:
这一系列操作都建议在Zotero的样式编辑界面进行调整,以能得到实时的反馈,最后再另存为CSL文件,由Zotero导入。
有些会议要求参考文献中的期刊或者会议论文的container字段,也就是会议名、杂志名以缩写形式呈现,目前还没找到特别理想的方法解决这一问题。倒是可以直接用format="short"
再勾选zotero中的“使用MEDL山NE期肝刊缩写”实现,但默认是使用对应依赖样式所定义的缩写。而和规定缩写不同时就抓瞎了,可行的办法是手动在zotero中对对应文献的介绍进行修改,将会议名直接变为简写,如下:
Primer: An introducation to CSL ↩︎ ↩︎
CSL 1.0.2 Specification ↩︎ ↩︎