Zotero使用JavaScript批量修改文献信息

Zotero支持JS脚本,位于Tools-Developer-Run JavaScript,合理使用可以批量修改文献的title, proceedingsTitle, publicationTitle, language等信息。

选中待修改的文献,进入Run JavaScript面板,输入JS脚本运行即可完成批量操作。

redleafnew/zotero-javascripts 这个仓库收集了很多常用的JS脚本。

例如批量修改文献title为Sentence Case。

Word对Zotero参考文献进行超链接

使用Zotero插件管理参考文献应该是人手必备了:在需要引用的地方点击Add/Edit Citation,全部引用完毕后在参考文献section中点击Add/Edit Bibliography即可生成参考文献列表。

问题在于Zotero官方没有提供文献引用到该参考文献的自动超链接,所以我们目前可以使用VBA宏来实现。方法来自Zotero论坛:Word: Possibility to link references and bibliography in a document? - Page 3 - Zotero Forums

完整代码

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
217
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

Alt+F8调出宏面板,创建宏后运行即可。

LaTeX中常用箭头的别称

左箭头$\gets$:\leftarrow,常在伪代码中表示“得到/赋值”,所以也写作\gets

右箭头$\to$:\rightarrow,常在数学中表示极限的“趋近”,所以也写作\to

长右箭头$\implies$:\Longrightarrow,常在数学中表示“蕴含”,所以也写作\implies

长左右箭头$\iff$:\Longleftrightarrow,常在数学中表示“等价”,所以也写作\iff(IF and only iF)

另外,可以使用两个箭头作为一个符号,但要加s。如“双左箭头”$\leftleftarrows$:\leftleftarrows

Office预设颜色

碰到一个陌生的要求

“给第一自然段添加底纹,要求填充色为白色25%、图案式样为浅色横线、颜色为蓝色”

原来主题颜色里面的预设颜色都是有名字的,光标悬浮一会即可看到。

Excel自然连接

Excel表也可以看做数据库,如何自然连接?

场景:学院发的一些文件实现了k-匿名性,另一些则没有。为了获取更多信息,我们需要将其连接,在信息系统安全中称之为“链接攻击”。

Sheet1 Sheet2

方法:使用

1
=VLOOKUP(A2,Sheet2!$A:$B,2,FALSE)

原理:

VLOOKUP:用于按行查找内容的函数,原型为

1
=VLOOKUP(查找值,包含查找值的范围,包含返回值的范围中的列号,近似匹配 (TRUE) 或精确匹配 (FALSE))

A2:在A2单元格查找,即A列作为外键。

Sheet2!$A:$B:将工作表Sheet2中的A列-B列作为主键的查找范围

2:Sheet2中主键的列号

FALSE:精确匹配

效果:

声明. 教程中出现的信息均已k-匿名化处理,信息取自公开文件。

Word独立修改某个单元格的网格线

对于已对齐的网格线(怎样对齐见“Word表格对齐”一节),直接拖动会使所有与其对齐的网格线移动。

拖动前:

拖动后

可以看到,这些对齐的网格线们是一起移动的。

想要独立地移动某一个单元格的网格线,需要选中这个单元格,然后在移动想要移动的网格线

拖动前

拖动后

注:只要欲独立移动的网格线在选中状态就可以,这样也行。

但是这样似乎只能移动选中单元格左右的(纵向的)网格线,不能独立移动上下的网格线。

一种比较通用的方法:拆分单元格,新形成的网格线不与其他网格线对齐,能独立移动,然后再把原来的网格线删除。

Office2021中删除网格线使用布局-绘图-橡皮擦

Word批注

有时打开Word发现右边有一栏空白,打印时也会跟着打出来。

这个是批注功能,可以在审阅-批注-显示批注中显示或关闭。

也可以对某段话新建批注,如:

嗯,所以是不是可以用这个方法写出一本伪·西瓜书呢hhh

Word目录格式修改

点击目录左上角三个点选中目录

引用-目录-自定义目录

这里就和实现多级标题和实现样式差不多了,可以先看后文的这两节。

我校毕业论文目录要求:

中文:

  1. 一级标题:宋体 小四加粗段前0.5行段后0.5行单倍行距
  2. 二级标题:宋体 小四,行距固定值20磅

英文:

  1. 一级标题:Times New Roman 小四号字加粗段前0.5行段后0.5行单倍行距

  2. 二级标题:Times New Roman 小四号字,行距固定值20磅

目录要求写到二级标题

平时作业和报告没有那么严格,大概是这样:

Word三节式页码

依照我校毕业论文要求,paper需要三种不同的页码

  1. 标题:无页码
  2. 摘要及目录:罗马字符页码
  3. 正文:阿拉伯数字页码

在Word中通过分节实现这个要求。

以一次作业为例:

首先,将整个paper分为3节,通过“分节符”实现,使用位于此处的“分节符”

分别在想要断开页码的页的末尾添加,即这两个位置。

待分的第一节后、第二节前:

待分的第二节后、第三节前:

这时整个word已经分成了三节,三份页码也是断开的:1、1 2、1 2 3…

这时可以分别修改各节页脚的格式和内容

将第一节页码删去

将第二节修改为罗马字符页码

此时:(无)、I II、1 2 3…

可以在第三节加上总页数而不影响前两节,即:即(无)、I II、1/34 2/34 3/34…

如果要让三节的页码内容相同,可以进入第i+1节的页眉和页脚工具,然后点击“链接到前一条页眉”,这时第i节和第i+1节就建立了联系(至于是哪链接到了页眉,我不太明白)

全部完成后会删除现有页脚,并出现“与上一节相同”字样

此时按刚刚的方法重新添加页脚,然后再修改某节的内容,发现有页脚的节同时被修改了,即(无)、I/34 II/34、1/34 2/34 3/34…:

Word段前分页

有时发现这样的情况,某页没有分页符但是不和下一页连着。

这是“段前分页”的功能。

Word快速右对齐

光标放在某行的右侧,当出现如下图标时双击即可。

左对齐、居中对齐同理。

Word表格对齐

有时Word的表格通过拖拽无法对齐,可以在拖拽时按住ALT键精确对齐。

将鼠标放在表格线上,出现对齐标志时双击表格线有时可以快速对齐。

Word删除脚注

脚注不是页脚

以IEEE journal为例,这个叫做脚注。若想编辑它,可以进入视图-草稿界面,搜索脚注中的内容或双击脚注编号,打开脚注窗格。

但这样并不能完全删掉脚注,会留下空行。

事实上,脚注是与正文对应的,当正文对应的脚注编号被删除后,相应的脚注就会被整段删除。

右击脚注编号(需要显示段落标记)-定位至脚注,删除正文对应的脚注就可以完全删除脚注了。

Word图片后接正文

修改样式-后续段落样式-正文

image-20220509003748136

Word图片高保真

文件-选项-高级-不压缩文件中的图像、高保真

Word整体居中,文字左对齐

左对齐

居中

右键-自动调整-根据内容自动调整表格

居中左对齐

这个在各种报告首页时很好用,很多老师做的报告模板简直烂的不行,没眼看,我们可以用表格重绘一个首页。

效果:

pdf复制出的文字变成乱码

编码问题,OCR该pdf的创建者使用编码可能非UTF-8。

我们可以将其打印为pdf,在自己的计算机上重新OCR一遍。

这两步都需要很长时间,做好心理准备。

前后效果

Word中的一种代码框

之前一直用的开始-段落-边框和底纹-方框,最近发现了一种好看的排版方式——分隔线加程序名,如图:

实在没找到教程,用表格造了个轮子

注:合并单元格在表格工具-布局-合并单元格

还挺好看

Word目录对齐中文西文

Word目录会出现中西文不对齐的情况,如图:

点击目录-段落-中文版式-允许西文在单词中间换行

恢复正常

至于这个选项的意义,顾名思义——用于拆分西文。一般地,西文(英文字母、英文标点、数字等一切半角的东西)是要连在一起的,不能随意换行,否则无法区分单词的意思,但中文可以随意换行,所以当出现某行对不齐时,多半是这个原因。

再随手来一个,比如将[2]前面那两个英文作者放到后面去,就会发现我们的中文被拉得非常长,没法与上一行对齐,如图:

允许西文在单词中间换行后就舒服多了,至于English speaker能不能看懂,本科阶段有那么重要吗hh~

Word粘贴高亮代码

在大一大二时,我从IDE或某些高亮网站上复制渲染好的HTML

大三,对paper有了一点点理解后觉得新宋体(是等宽的)五号的代码比较好看,同时越发觉得以往的方法有限制,比如不能更改格式(字号或颜色更改后变乱)、有些语言不支持(比如shell)、网站很快就失效了等等,于是开始使用notepad++。

notepad++支持许多语言高亮,如图。

image-20220417173441795

点击插件-NppExport-Copy all formats to clipboard

ctrl+V回word

按红框修改后可以把它存为一个样式,以后就可以直接对粘进来的代码应用样式了(目前觉得这样比较好看)

感觉效果不错

Word中实现多级标题自动编号

面向paper,记录一下怎样实现多级标题自动编号

首先,定义好文本的样式,大概有以下几种

将这些样式按要求应用于文字后,选中某个标题1的编号,接着按图示进入”定义新的多级列表“,这里以第2个标题1为例

在这里(注意一定是在这个页面!!)定义出所有编号的格式(标题1和它的子标题)

级别1

级别2

注意:若编号格式不正确,通过“包含的编号级别来自”和“此级别的编号样式”这两个选项框来加入标题变量(有黑色阴影的),建议把格式清空后自己手动加。

这样就成功了,不会出现第2个标题1下的子标题仍跟随第1个标题1的情况

2022.5.14更新:“要在库中显示的级别”选项,是你点击的那个标题所对应的库中的级别,如果你已经排好了级别就不需要改了。

Word中直引号和弯引号

有时输入代码中的引号需要为直引号,但输入后就变成了弯引号

解决方法:

在 文件-选项-校对-自动更正选项 中把图示两个标签中的选项取消勾选

latex中的各种mod

\bmod - 最细间距,无括号,不分行间行内
\pmod - 有括号,行间间距大,行内间距稍小
\mod - 无括号,其余同 \pmod
\pod - 无 mod ,其余同 \pmod

源代码:

1
2
3
4
a \equiv b \bmod p
a \equiv b \pmod p
a \equiv b \mod p
a \equiv b \pod p

行间效果:

行内效果:

$ a \equiv b \bmod p $
$ a \equiv b \pmod p $
$ a \equiv b \mod p $
$ a \equiv b \pod p $

我觉得 $(2)$ 好看