本文对Zotero的配置进行了整理,供自己将来参考。

Zotero作为文献管理软件,在整个工作流中担任对文献的整理、阅读管理任务,并提供面向上游输入与下游输出的接口。

在文献的输入部分,通过Zotero浏览器插件Sci-Hub解析器实现对英文文献源信息和pdf的一键抓取,通过茉莉花插件实现对知网文献的抓取。收集到文献之后Zotero会通过WebDav在多个设备间进行同步,在阅读过程中利用翻译插件对英文文献实现选中翻译,利用Markdown插件实现更强大的内置笔记。在写作输出阶段,通过Zotero官方的Word插件联动word快速生成参考文献,并利用Word宏实现参考文献的交叉引用。

至此,覆盖文献阅读全流程的Zotero就配置完成了。

输入

浏览器插件

Zotero官方提供了浏览器插件Zotero Connector,支持Chrome、Safari、MS Edge等浏览器,可以在对应浏览器官方的扩展商店进行安装。

以Chorme为例,可以在Chome 网上商店进行下载安装。

Sci-Hub 解析器

参考这篇文章配置Sci-Hub解析器,配合浏览器插件使用,可以直接在Sci-Hub下载文献。

修改extensions.zotero.findPDFs.resolvers

1
2
3
4
5
6
7
8
9
{
"name":"Sci-Hub",
"method":"GET",
"url":"https://sci-hub.ren/{doi}",
"mode":"html",
"selector":"#pdf",
"attribute":"src",
"automatic":true
}

知网文献抓取

安装茉莉花插件、PDFtk Server,并更新解析器(Translator),Zotero和网页插件都要更新,可能需要多点几次更新。

茉莉花插件在这个仓库下载xpi按照文档安装即可。

PDFtk Server按照官网指示进行安装即可。

处理

利用WebDav多端同步

Zotero作为跨平台软件,在各个设备上都有自己的客户端,我希望能在iPad端和Mac/PC端同步PDF和标注。Zotero官方提供了一个云同步服务,但是速度比较慢,而且免费使用限制了300MB的容量,不能满足我的文献同步要求。因此选择坚果云的WebDav服务进行同步。

关于Zotero如何使用坚果云,可以查看坚果云官方的这篇文档

翻译插件

安装Zotero PDF Translate插件,在这个仓库下载xpi按照文档安装即可。

Markdown笔记插件

安装markdownhere4zotero插件,在这个仓库下载xpi并安装即可。该插件的公式渲染默认使用谷歌的服务,可以按照这篇文章修改至国内服务。

Update:

在Zotero 6.0.14版本中,官方在笔记中支持了公式功能。但是由于不是全功能markdown,插入图片等还是不支持。

输出

Word插件生成参考文献

Zotero安装时会自动在Word添加插件,可以在菜单栏看到,如果出现找不到插件的情况, 可以参考这篇文章手动将插件复制到Word启动项中。

如果Zotero没有所需的引用格式,可以在设置-引用-样式-获取更多样式中搜索并安装。

参考文献交叉引用

先正常使用Zotero添加参考文献,然后利用Word宏实现修改参考文献为交叉引用。由于Zotero本身添加参考文献也是利用Word宏实现的,将来官方可能也会添加交叉引用的功能。

对于如何添加Word宏参考这篇文章

宏代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
Public Sub ZoteroLinkCitation()

' get selected area (if applicable)
Dim nStart&, nEnd&
nStart = Selection.Start
nEnd = Selection.End

' toggle screen updating
Application.ScreenUpdating = False

' define variables
Dim title As String
Dim titleAnchor As String
Dim style As String
Dim fieldCode As String
Dim numOrYear As String
Dim pos&, n1&, n2&, n3&

ActiveWindow.View.ShowFieldCodes = True
Selection.Find.ClearFormatting

' find the Zotero bibliography
With Selection.Find
.Text = "^d ADDIN ZOTERO_BIBL"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute

' add bookmark for the Zotero bibliography
With ActiveDocument.Bookmarks
.Add Range:=Selection.Range, Name:="Zotero_Bibliography"
.DefaultSorting = wdSortByName
.ShowHidden = True
End With

' loop through each field in the document
For Each aField In ActiveDocument.Fields
' check if the field is a Zotero in-text reference
'##################################################
If InStr(aField.Code, "ADDIN ZOTERO_ITEM") > 0 Then
fieldCode = aField.Code
'#############
' Prepare
' Plain citation== Format of Textfield shown
' must be in Brackets
Dim plain_Cit As String
plCitStrBeg = """plainCitation"":""["
plCitStrEnd = "]"""
n1 = InStr(fieldCode, plCitStrBeg)
n1 = n1 + Len(plCitStrBeg)
n2 = InStr(Mid(fieldCode, n1, Len(fieldCode) - n1), plCitStrEnd) - 1 + n1
plain_Cit = Mid$(fieldCode, n1 - 1, n2 - n1 + 2)
'Reference 'as shown' in word as a string

'Title array in fieldCode (all referenced Titles within this field)
Dim array_RefTitle(32) As String
i = 0
Do While InStr(fieldCode, """title"":""") > 0
n1 = InStr(fieldCode, """title"":""") + Len("""title"":""")
n2 = InStr(Mid(fieldCode, n1, Len(fieldCode) - n1), """,""") - 1 + n1
If n2 < n1 Then 'Exception the type 'Article'
n2 = InStr(Mid(fieldCode, n1, Len(fieldCode) - n1), "}") - 1 + n1 - 1
End If
array_RefTitle(i) = Mid(fieldCode, n1, n2 - n1)
fieldCode = Mid(fieldCode, n2 + 1, Len(fieldCode) - n2 - 1)
i = i + 1
Loop
Titles_in_Cit = i

'Number array with References shown in PlainCit
'Numer is equal or less than Titels, depending on the type
'[3], [8]-[10]; [2]-[4]; [2], [4], [5]
' All citations have to be in Brackets each! [3], [8] not [3, 8]
' This doesnt work otherwise!
' --> treatment of other delimiters could be implemented here
Dim RefNumber(32) As String
i = 0
Do While (InStr(plain_Cit, "]") Or InStr(plain_Cit, "[")) > 0
n1 = InStr(plain_Cit, "[")
n2 = InStr(plain_Cit, "]")
RefNumber(i) = Mid(plain_Cit, n1 + 1, n2 - (n1 + 1))
plain_Cit = Mid(plain_Cit, n2 + 1, Len(plain_Cit) - (n2 + 1) + 1)
i = i + 1
Loop
Refs_in_Cit = i
'treat only the shown references (skip the rest)
'[3], [8]-[10] --> skip [9]
'Order of titles given from fieldcode, not checked!
If Titles_in_Cit > Refs_in_Cit Then
array_RefTitle(Refs_in_Cit - 1) = array_RefTitle(Titles_in_Cit - 1)
i = 1
Do While Refs_in_Cit + i <= Titles_in_Cit
array_RefTitle(Refs_in_Cit + i - 1) = ""
i = i + 1
Loop
End If

'#############
'Make the links
For Refs = 0 To Refs_in_Cit - 1 Step 1
title = array_RefTitle(Refs)
array_RefTitle(Refs) = ""
' make title a valid bookmark name
titleAnchor = title
titleAnchor = MakeValidBMName(titleAnchor)

ActiveWindow.View.ShowFieldCodes = False
Selection.GoTo What:=wdGoToBookmark, Name:="Zotero_Bibliography"

'' locate the corresponding reference in the bibliography
'' by searching for its title
Selection.Find.ClearFormatting
With Selection.Find
.Text = Left(title, 255)
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute

' select the whole caption (for mouseover tooltip)
Selection.MoveStartUntil ("["), Count:=wdBackward
Selection.MoveEndUntil (vbBack)
lnkcap = "[" & Selection.Text
lnkcap = Left(lnkcap, 70)

' add bookmark for the reference within the bibliography
Selection.Shrink
With ActiveDocument.Bookmarks
.Add Range:=Selection.Range, Name:=titleAnchor
.DefaultSorting = wdSortByName
.ShowHidden = True
End With

' jump back to the field
aField.Select
' find and select the numeric part of the field which will become the hyperlink
Selection.Find.ClearFormatting
With Selection.Find
.Text = RefNumber(Refs)
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute

numOrYear = Selection.Range.Text & ""

' store current style
style = Selection.style
' Generate the Hyperlink -->Forward!
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:="", SubAddress:=titleAnchor, ScreenTip:=lnkcap, TextToDisplay:="" & numOrYear
' reset the style
Selection.style = style

' comment if you want standard link style
aField.Select
With Selection.Font
.Underline = wdUnderlineNone
.ColorIndex = wdBlack
End With

Next Refs 'References in Cit

End If 'If Zotero-Field
'#########################

Next aField ' next field

' go back to original range selected
ActiveWindow.View.ShowFieldCodes = False
ActiveDocument.Range(nStart, nEnd).Select

End Sub
Function MakeValidBMName(strIn As String)
Dim pFirstChr As String
Dim i As Long
Dim tempStr As String
strIn = Trim(strIn)
pFirstChr = Left(strIn, 1)
If Not pFirstChr Like "[A-Za-z]" Then
strIn = "A_" & strIn
End If
For i = 1 To Len(strIn)
Select Case Asc(Mid$(strIn, i, 1))
Case 49 To 57, 65 To 90, 97 To 122
tempStr = tempStr & Mid$(strIn, i, 1)
Case Else
tempStr = tempStr & "_"
End Select
Next i
tempStr = Replace(tempStr, " ", " ")
MakeValidBMName = Left(tempStr, 40)
End Function


本文采用CC-BY-SA-3.0协议,转载请注明出处
作者: TieStone