一、Zotero简述
Zotero是一款开源的文献管理工具,它可以帮助用户方便地收集、组织、引用和共享文献。
Zotero具有强大的论文管理功能,用户可以轻松添加、编辑和删除文献条目,并将它们分门别类地整理到文件夹中。Zotero的一大亮点是它的引用解析能力。它能自动识别网页上的参考文献信息,并将其转换为标准的格式,如BibTeX或CSL JSON。这得益于其内置的PDF元数据提取算法和在线的Crossref服务,使得导入新文献变得快速且准确。
没有用过Zotero的同学可以查看这篇教程:Zotero实现参考文献自动化
二、和Word建立超链接,实现点击引用跳转
2.1、问题描述
然而,尽管Zotero在文献管理和引用生成方面表现优秀,但与另一款流行的文献管理工具EndNote相比,它确实缺少一项比较常用的功能:无法与Word直接建立超链接以实现点击引用跳转。
在EndNote中,用户可以轻松地在Word文档中插入引用,并且这些引用会自动生成超链接,只需点击文中的引用,即可迅速跳转到文档末尾的参考文献部分,查看相应的文献详细信息。Zotero虽然也提供了丰富的引用格式和文献管理功能,但它却无法与Word直接建立这种超链接。
2.2、解决思路
经过搜索zotero的论坛https://forums.zotero.org/search?Page=p1&Search=hyperlink,发现其实很多帖子有提到这个问题,但暂时没有官方的解决方案。
虽然官方没有提供,但是可以借助Word宏实现这个功能。
2.3、解决方案
经过论坛内的寻找以及各大网站的类似方案分析,这里给出一个解决方案,首先切换到视图窗口,点击查看宏:
点击创建,准备创建一个新宏
在跳出的创建宏的编辑窗口中,输入以下代码:
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
' 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
然后在左边改名,将宏的名字改为ZoteroLinkCitation:
以上这段VBA 代码用于在 Word 文档中处理 Zotero 引用信息的,其:
- 首先获取当前 Word 文档中的选区(如果有的话)。nStart 和 nEnd 变量分别存储选区的起始和结束位置。
- 然后通过查找特定的字段代码(包含
^d ADDIN ZOTERO_BIBL
),代码定位到文档中的Zotero参考文献列表,并为其添加书签。 - 其次,宏遍历文档中的每个字段,检查它们是否包含Zotero的引用。
- 对于每个Zotero引用,代码提取出相关的信息,如纯文本引用格式、引用的标题等。然后,它创建一个有效的书签名,以便在参考文献列表中定位每个引用。
- 对于每个引用,宏在Word文档中创建一个超链接,指向参考文献列表中相应的条目。这样,用户可以通过点击引用快速跳转到参考文献的详细信息。
- 在创建链接后,宏会重置文本的样式,以确保文档的一致性和可读性。
使用Ctrl+S保存宏后,再次回到Word,切换到视图栏,然后打开宏窗口,找到刚刚创建好的宏,然后点击运行:
等待片刻,就可以发现,成功为每个引用配置好了超链接:
最后
💖 个人简介:专研于人工智能领域,目前主攻文本生成图像(text to image)方向
📝 个人主页:中杯可乐多加冰
🎉 支持我:点赞👍+收藏⭐️+留言📝
另外,我们已经建立了研学交流群,如果你也是大模型、T2I方面的爱好者或研究者可以私信我加入。