|
打开word>视图>宏>创建

进入宏界面

将代码覆盖空白文件
参考网站:
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 &#39;Exception the type &#39;Article&#39;
n2 = InStr(Mid(fieldCode, n1, Len(fieldCode) - n1), &#34;}&#34;) - 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
&#39;Number array with References shown in PlainCit
&#39;Numer is equal or less than Titels, depending on the type
&#39;[3], [8]-[10]; [2]-[4]; [2], [4], [5]
&#39; All citations have to be in Brackets each! [3], [8] not [3, 8]
&#39; This doesnt work otherwise!
&#39; --> treatment of other delimiters could be implemented here
Dim RefNumber(32) As String
i = 0
Do While (InStr(plain_Cit, &#34;]&#34;) Or InStr(plain_Cit, &#34;[&#34;)) > 0
n1 = InStr(plain_Cit, &#34;[&#34;)
n2 = InStr(plain_Cit, &#34;]&#34;)
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
&#39;treat only the shown references (skip the rest)
&#39;[3], [8]-[10] --> skip [9]
&#39;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) = &#34;&#34;
i = i + 1
Loop
End If
&#39;#############
&#39;Make the links
For Refs = 0 To Refs_in_Cit - 1 Step 1
title = array_RefTitle(Refs)
array_RefTitle(Refs) = &#34;&#34;
&#39; make title a valid bookmark name
titleAnchor = title
titleAnchor = MakeValidBMName(titleAnchor)
ActiveWindow.View.ShowFieldCodes = False
Selection.GoTo What:=wdGoToBookmark, Name:=&#34;Zotero_Bibliography&#34;
&#39;&#39; locate the corresponding reference in the bibliography
&#39;&#39; by searching for its title
Selection.Find.ClearFormatting
With Selection.Find
.Text = Left(title, 255)
.Replacement.Text = &#34;&#34;
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
&#39; select the whole caption (for mouseover tooltip)
Selection.MoveStartUntil (&#34;[&#34;), Count:=wdBackward
Selection.MoveEndUntil (vbBack)
lnkcap = &#34;[&#34; & Selection.Text
lnkcap = Left(lnkcap, 70)
&#39; 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
&#39; jump back to the field
aField.Select
&#39; 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 = &#34;&#34;
.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 & &#34;&#34;
&#39; store current style
style = Selection.style
&#39; Generate the Hyperlink -->Forward!
ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:=&#34;&#34;, SubAddress:=titleAnchor, ScreenTip:=lnkcap, TextToDisplay:=&#34;&#34; & numOrYear
&#39; reset the style
Selection.style = style
&#39; comment if you want standard link style
aField.Select
With Selection.Font
.Underline = wdUnderlineNone
.ColorIndex = wdBlack
End With
Next Refs &#39;References in Cit
End If &#39;If Zotero-Field
&#39;#########################
Next aField &#39; next field
&#39; 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 &#34;[A-Za-z]&#34; Then
strIn = &#34;A_&#34; & 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 & &#34;_&#34;
End Select
Next i
tempStr = Replace(tempStr, &#34; &#34;, &#34; &#34;)
MakeValidBMName = Left(tempStr, 40)
End Function宏界面的文件>保存>退出(保险起见退出宏之后再重新进word)
进入word后用zotero插入文献,导出参考文献,然后点击宏>找到ZoteroLinkCitation>运行
最好先在空白文档中试一试,然后再论文中使用。参考文献最好在最后写完之后统一运行宏(不要取消zotero的连接(Unlink Citations)) 我自己测试了一两次,多个文献或者单个文献超连接不会冲突,有一些问题我还未遇见,大家尝试后可以自行调试。 |
|