Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献

news/2023/12/5 22:41:50

Zotero以其丰富的插件而闻名,使用起来十分的带劲,最重要的是它是免费的、不卡顿,不像某专业软件。

然而Zotero在word插入参考文献时,无法为参考文献添加超链接,这是一个不得不提的遗憾。

不过,有大佬已经写出了基于Word VBA语言的代码,可以为Zotero在Word中的参考文献一键增加超链接!源代码如下所示:

Word: Possibility to link references and bibliography in a document? - Zotero ForumsZotero is a free, easy-to-use tool to help you collect, organize, cite, and share research.icon-default.png?t=N7T8https://forums.zotero.org/discussion/comment/148343/#Comment_148343

参考教程:

Zotero-word中引用跳转到参考文献/建立超链接-引用格式文章浏览阅读7.4k次,点赞10次,收藏25次。该方法根据标题将作者日期或数字样式引用链接到他们的参考文献条目。https://blog.csdn.net/weixin_47244593/article/details/129072589

不过,这个代码在运行的时候,我遇到了一些严重的问题:

-1. 当一个位置同时引用的参考文献>2,就只能为前两个文献添加超链接,且第3个以及之后的参考文献。

-2. 引用了同一个作者的两篇及以上的参考文献,只能给第一个文献添加超链接,第二个就无法添加。

-3. 部分参考文献添加超链接失败,提示Add BookMarks失败。

作为对VBA语言一窍不通的我,硬着头皮啃了一下源代码,对于问题1和问题2,终于发现了问题所在:在同一位置的参考文献添加链接时,原代码无法正常更新下一处要添加超链接的位置,最关键的是其中pos变量。为此,我增加了对同一位置参考文献的不同引用的定位代码,然后将定位结果复制给pos变量,让代码循环执行时可以正确找到应该添加参考文献的位置

对于第3个问题,有些人说是文献原始的标题有误,我照着这个思路对代码进行了调试,然而事情并不是这样,有的文章标题里面就是有一些特殊符号,比如'#',':'。那么是否可能是这些特殊符号会带来bug?事实证明,会的。原代码的titleAnchor在生成短标题的时候就是用Replace把这些特殊符号以及空格全部用'_'代替,然后Add为Bibliography的BookMark。在Bibliography中可以有这些特殊符号,但是作为BookMark,就不能有这些特殊符号。原代码没有将'#'替换为'_',因此增加一下就解决了。

修改后的代码如下:

Public Sub ZoteroLinkCitation()
Dim nStart&, nEnd&
nStart = Selection.Start
nEnd = Selection.End
Application.ScreenUpdating = False
Dim title As String
Dim titleAnchor As String
Dim style As String
Dim fieldCode As String
Dim numOrYear As String
Dim pos&, n1&, n2&ActiveWindow.View.ShowFieldCodes = True
Selection.Find.ClearFormatting
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
With ActiveDocument.Bookmarks.Add Range:=Selection.Range, name:="Zotero_Bibliography".DefaultSorting = wdSortByName.ShowHidden = True
End With
ActiveWindow.View.ShowFieldCodes = FalseFor Each aField In ActiveDocument.Fields
' check if the field is a Zotero in-text referenceIf InStr(aField.Code, "ADDIN ZOTERO_ITEM") > 0 ThenfieldCode = aField.Codepos = 0Paper_i = 1Do While InStr(fieldCode, """title"":""") > 0n1 = InStr(fieldCode, """title"":""") + Len("""title"":""")n2 = InStr(Mid(fieldCode, n1, Len(fieldCode) - n1), """,""") - 1 + n1title = Mid(fieldCode, n1, n2 - n1)titleAnchor = Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(title, " ", "_"), "#", "_"), "&", "_"), ":", "_"), ",", "_"), "-", "_"), ".", "_"), "(", "_"), ")", "_"), "?", "_"), "!", "_")titleAnchor = Left(titleAnchor, 40)Selection.GoTo What:=wdGoToBookmark, name:="Zotero_Bibliography"Selection.Find.ClearFormattingWith Selection.Find.Text = Left(title, 255).Replacement.Text = "".Forward = True.Wrap = wdFindAsk.Format = False.MatchCase = False.MatchWholeWord = False.MatchWildcards = False.MatchSoundsLike = False.MatchAllWordForms = FalseEnd With'查找引文,BibliographySelection.Find.Execute'选中对应引文的这一段Selection.Paragraphs(1).Range.SelectWith ActiveDocument.Bookmarks.Add Range:=Selection.Range, name:=titleAnchor.DefaultSorting = wdSortByName.ShowHidden = TrueEnd WithaField.SelectSelection.Find.ClearFormattingIf pos = 0 Then' 初始化起始位置和数组startPosition = 1ReDim commaPositions(1 To 1)' 查找逗号的位置(前提是作者和年份之间采用英文逗号分隔符,否则要改为其他符号)DocommaPosition = InStr(startPosition, Selection, ",")If commaPosition > 0 Then' 将逗号的位置添加到数组commaPositions(UBound(commaPositions)) = commaPosition' 更新起始位置,以便下一次查找startPosition = commaPosition + 1ReDim Preserve commaPositions(1 To UBound(commaPositions) + 1)End IfLoop While commaPosition > 0End If' 输出记录的逗号位置'For j = 1 To UBound(commaPositions)'Debug.Print "Comma found at position: " & commaPositions(j)'Next jWith Selection.Find.Text = "^#".Replacement.Text = "".Forward = True.Wrap = wdFindContinue.Format = False.MatchCase = False.MatchWholeWord = False.MatchWildcards = False.MatchSoundsLike = False.MatchAllWordForms = FalseEnd WithSelection.Find.ExecuteSelection.MoveLeft Unit:=wdCharacter, Count:=1Selection.MoveRight Unit:=wdCharacter, Count:=posSelection.Find.ExecuteSelection.MoveLeft Unit:=wdCharacter, Count:=1Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtendnumOrYear = Selection.Range.Text & ""pos = commaPositions(Paper_i) - 1Paper_i = Paper_i + 1style = Selection.style'插入超链接ActiveDocument.Hyperlinks.Add Anchor:=Selection.Range, Address:="", SubAddress:=titleAnchor, ScreenTip:="", TextToDisplay:="" & numOrYearaField.SelectSelection.style = style'如果为文中的参考文献引用设定了格式,那么需要取消下面的注释'Selection.style = ActiveDocument.Styles("CitationFormating")fieldCode = Mid(fieldCode, n2 + 1, Len(fieldCode) - n2 - 1)LoopEnd If
Next aField
ActiveDocument.Range(nStart, nEnd).Select
End Sub


http://www.ppmy.cn/news/1230150.html

相关文章

优秀智慧园区案例 - 佛山美的工业城零碳智慧园区,先进智慧园区建设方案经验

一、项目背景 美的工业园区西区最早建于上世纪90年代,到现在已经过去近30年,而这三十年恰恰是信息科技大发展的30年,原有的生产办公条件已不能很好的承载新时期办公和参观接待的需求。所以在21年美的楼宇科技事业部决定对原来的园区进行改造…

汽车级低压差稳压器LDO LM317BD2TR4G原理、参数及应用

LM317BD2TR4G主要功能特性分析 : LM317BD2TR4G 低漏 (LDO) 线性电压稳压器是一款可调 3 端子正向 LDO 电压器,能够在 1.2 V 至 37 V 的输出电压范围内提供 1.5 A 以上的电流。此电压稳压器使用非常简便,仅需两个外部电阻即可设置输出电压。另…

音视频项目—基于FFmpeg和SDL的音视频播放器解析(十六)

介绍 在本系列,我打算花大篇幅讲解我的 gitee 项目音视频播放器,在这个项目,您可以学到音视频解封装,解码,SDL渲染相关的知识。您对源代码感兴趣的话,请查看基于FFmpeg和SDL的音视频播放器 如果您不理解本…

Nginx(反向代理,负载均衡,动静分离)

反向代理 Nginx反向代理是一种将客户端请求转发给后端服务器的技术,即反向代理服务器。在这种架构中,客户端请求首先到达Nginx服务器,然后由Nginx服务器将请求转发给后端服务器,后端服务器响应请求,并将响应传递回Ngi…

FPGA实现双向电平转换

网上搜了一圈,好像没看到的类似的中文资料,不过MicroSemi有个文档AC349上给出了完整的解决方案,还有参考代码。 话不多说,看图: 欲知详情的朋友,请参考 AC349

算法笔记-第九章-堆(未完成-=需要好好搞搞题目)

算法笔记-第九章-堆 堆的基础知识堆的相关性质堆序性堆的存储堆的基础操作下滤操作上滤操作 建堆自顶向下建堆法自下而上建堆法 堆的应用优先队列 大佬讲解向下调整够建大顶堆 堆的基础知识 堆的相关性质 大佬视频总结 堆必须是一个完全二叉树完全二叉树只允许最后一行不为满…

【Linux】22、CPU 评价指标、性能工具、定位瓶颈、优化方法论:应用程序和系统

文章目录 一、评价 CPU 的指标1.1 CPU 使用率1.2 平均负载(Load Average)1.3 上下文切换1.4 CPU 缓存命中率 二、性能工具2.1 维度:从 CPU 性能指标出发,即当你查看某性能指标时,要清除知道哪些工具可以做到2.2 维度&a…

Ribbon

在Spring Cloud中,Ribbon是一个用于客户端负载均衡的组件,它可以与其他服务发现组件(例如Eureka)集成,以提供更强大的负载均衡功能。Ribbon使得微服务架构中的客户端能够更加智能地调用其他服务的实例,从而…

人力资源小程序

人力资源管理对于企业的运营至关重要,而如今随着科技的发展,制作一个人力资源小程序已经变得非常简单和便捷。在本文中,我们将为您介绍如何通过乔拓云网制作一个人力资源小程序,只需五个简单的步骤。 第一步:注册登录乔…

异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (二)

继上一章: CSDN 本次需要做的是进行有效ip的验证! 我们知道,从网页上爬取上千上万个ip之后,因为是免费的代理,所以,对这上千上万个ip进行验证有效性就需要考虑效率上的问题了; 而验证ip有效性的唯一办法,就是通过对网络发起请求;如果state200,就是有效,否则就是无效; 而上…

视频转码方法:多种格式视频批量转FLV视频的技巧

随着互联网的发展,视频已成为日常生活中不可或缺的一部分。然而,不同的视频格式可能适用于不同的设备和平台,因此需要进行转码。在转码之前,要了解各种视频格式的特点和适用场景。常见的视频格式包括MP4、AVI、MKV、FLV等。其中&a…

BP神经网络原理与如何实现BP神经网络

本文部分图文来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一、BP神经网络的背景生物学原理 二、BP神经网络模型 2.1 BP神经网络的结构 2.2 BP神经网络的激活函数 三、BP神经网络的误差函数 四、BP神经网络的训练 4.1 BP神经网络的训练流程 4.2 BP神经网络的训练流…

Android Studio常见问题

Run一直是上次的apk 内存占用太大,导致闪退

《 机器人基础 》期末试卷(A)

一、填空题(30分,每空2分) 1. 按照相机的工作方式,机器人常用相机分为1)__ 单目摄像头 2)__ 双目摄像头 _ 3)_深度摄像头_ 三类。 2. 度量地图强调…

PTA 7-7 分解质因数(c++)

求出区间[a,b]中所有整数的质因数分解。 输入格式: 输入两个整数a&#xff0c;b。数据规模和约定  2<a<b<10000 输出格式: 每行输出一个数的分解&#xff0c;形如ka1a2a3...(a1<a2<a3...&#xff0c;k也是从小到大的)(具体可看样例) 输入样例: 在这里给…

java mybatisplus generator 修改字段类型

最新版生成代码的指定字段类型 FastAutoGenerator .dataSourceConfig(config -> {config.typeConvertHandler(new ITypeConvertHandler() {Overridepublic NotNull IColumnType convert(GlobalConfig globalConfig, TypeRegistry typeRegistry, TableField.MetaInfo metaIn…

react的组件和元素的类型总结

先来一小段代码 const Demo <div>Demo</div>const App () > {return (<div><Demo></Demo></div>); }不知道这段代码大家会不会发现是错误的&#xff0c;这里的Demo 是一个JSX&#xff0c;并不是一个组件&#xff0c;所有不能使用<…

【开源】基于JAVA的超市自助付款系统

项目编号&#xff1a; S 008 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S008&#xff0c;文末获取源码。} 项目编号&#xff1a;S008&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 商品类型模块2.2 商品模块2.3 超市账…

「Verilog学习笔记」实现3-8译码器①

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 分析 ① 本题要求根据38译码器的功能表实现该电路&#xff0c;同时要求采用基础逻辑门实现&#xff0c;那么就需要将功能表转换为逻辑表达式。 timescale 1ns/1nsmodule d…

elementui表格自定义指令控制显示哪些列可以拖动

Vue.directive(tableBorder, function (el, {value}) {// value允许传字符串数字和数组el.classList.add(z_table_hasBorder)let hasStyle el.querySelector(style)if(hasStyle){hasStyle.remove()}let style document.createElement(style)let str .z_table_hasBorder .el…
最新文章