我已经搜索过该问题的变体,但没有找到类似的内容。
我有一组 Word 文档,其中包含两种类型的内联引用。第一种是标准学术引用,已通过 Zotero 插入,需要保持不变并链接到 Zotero。
第二种类型是纯文本,需要在同一位置转换为脚注,并删除其括号。第二种引用总是以“(File XX_XX”开头,其中 X 是整数,或“(Digital file”。
如果能一次性将第二种类型的所有引文转换为脚注,那将大有帮助。如果做不到这一点,也可以使用宏将选定的文本转换为脚注,并删除其括号。我现在已经设法录制一个可以逐一执行这些操作的宏,但如果有一种方法可以自动化整个文档的过程,那就太好了。
希望您能帮忙,并提前致谢。
以下是包含两种引用类型的示例段落:
豪登省政府承担机构职责的第二个领域是公共交通运营商的监管。2000 年《国家陆路交通转型法案》设立了省级运营许可委员会,全权负责向所有公共交通运营商颁发基于路线的运营许可证(Cameron,2005 年;Wosiyana,2005 年;Palmer、Moodley 和 Parnell,2017 年)。这些 OLB 负责管理将旧的基于半径的许可证转换为基于路线的运营许可证,并在市政府的指导下颁发新许可证。然而,到了 Rea Vaya 事件时,豪登省 OLB 已“陷入行政混乱”,几乎停止发放运营许可证,约翰内斯堡市只能根据尚未处理的许可证申请收据来统计可能受影响的运营商(文件 03_05,约翰内斯堡市与出租车行业参与会议 BRT 第 1a 阶段联合工作组,2010 年 3 月 26 日)。
最后的引用需要是一个脚注,内容如下:
文件 03_05,约翰内斯堡市与出租车行业参与 BRT 阶段 1a 联合工作组会议,2010 年 3 月 26 日
答案1
就是这样,但是你必须决定要投入多少精力来使其工作以及需要手动修复多少。
Sub NotesToFootnotes1()
'
Const matchcount As Integer = 2
Dim i As Integer
Dim r As Word.Range
Dim rStart As Word.Range
Dim fn As Word.Footnote
Dim s(1 To matchcount, 1 To 2) As String
' This uses a wildcard search which looks for 3 "groups"
' The first is a "("
' The second is the 'body' of the footnote
' The third is a ")"
s(1, 1) = "([(])(File [0-9][0-9]_[0-9][0-9]*)([)])"
' This replaces the found text by the content of the second group.
s(1, 2) = "\2"
s(2, 1) = "([(])(Digital file*)([)])"
s(2, 2) = "\2"
For i = 1 To matchcount
Set r = ActiveDocument.Content
With r.Find
.Text = s(i, 1)
.Replacement.Text = s(i, 2)
.Forward = True
.Wrap = wdFindStop
.Format = False
' This wil actually match Digital fIle, Digital File, DIGITAL FILE etc.
' If you only want to match Digital file, set it to False
.MatchCase = True
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
' Very important!
.MatchWildcards = True
.Execute Replace:=True
Do While .Found
Set rStart = r.Duplicate
rStart.Collapse WdCollapseDirection.wdCollapseStart
' Initially, create an empty footnote, because if we want to
' put formatted text in the footnote, we can't do it in the .Add
With rStart.Footnotes.Add(Range:=rStart, Text:="")
' Don't copy the newly inserted footnote reference!
r.Start = r.Start + 1
' This copies the content of the range, which would include formatting
' possibly images and so on. If you don't want that, use
' .Range.Text = r.Text
' instead, but be aware that anything other than text will probably not
' copy exactly the way you expect.
.Range.FormattedText = r.FormattedText
End With
Set rStart = Nothing
r.Delete
.Execute Replace:=True
Loop
Set r = Nothing
End With
Next ' i
End Sub