latex大佬请绕行
题注的缺陷
谈到编号,第一反应肯定是使用题注。但是题注不是万能的,如果一级标题为中文,那么使用题注会出现下面这种情况:
可以看出,题注直接引用中文章节编号导致其中出现中文。下面将介绍Seq域
来解决这个问题。
Seq域
域是word中一个重要的功能。许多编号包括章节编号以及引用等都是通过域实现的。域分为很多种,而Seq域则是其中用于编号的域。先介绍其主要用法,首先按Ctrl+F9
输入域代码:
其中
Seq
表示该域为一个Seq
域。figure
为一个标识符,相当于给域取一个名字。不同标识符的域相互不影响。域输入完成后,选中域按F9
,域会被渲染为文字:可以看出,Seq域的基本功能就是产生连续的数字。而单单这个功能明显是不足以满足自动编号的需求。例如不同章节需要重新编号。而域代码中的开关,可以实现这个需求。官网中给出了下面的开关功能:
\c: 重复前边最近的序列号。它可用于在页眉或页脚中插入章节号。
\h: 隐藏域结果。使用它来引用交叉引用中的 Seq 域而不打印数。例如,您可能希望参考编号章节,但不是能打印章节号。\H 开关不隐藏域结果,如果格式 (\ *) 开关。
\n: 插入指定项目的下一个序列号。这是默认值。
\r n: 将序列号重置为指定的数字。 例如,{ SEQ figure \r 3 } 从 3 开始图表编号。
\s: 在“s”之后的标题级别处重置序列号。例如,{ SEQ figure \s 2 } 从“标题2”样式开始编号。
其中我们重点关注\s
、\c
以及\h
这三个域。其中\s
这个域可以使得域代码在不同的章节下自动重新编号,例如需要在一级标题下重新编号,则:
可以看出跨过一级标题之后会重新编号。
而
\c
可以继续上一个编号,\h
可以关闭域显示。因此利用下面的方式可以完成模拟章节号的需求:结合这两种方式就可以完成题注的需求,如图:
自动化
虽然SEQ域大致完成了自动编号的需求,但是每次都要输入一串长的域代码明显也不是好的解决办法。本着能自动化绝不手动的精神,我编写了一段使用VBA自动插入编号的代码(第一次写VBA,代码风格请忽略):
' 添加SEQ域
Function AddSeqFieldOnSection(seqText As String)
Selection.Collapse Direction:=wdCollapseEnd
Set myField = ActiveDocument.Fields.Add(Range:=Selection.Range, Type:=wdFieldSequence, Text:=seqText)
End Function
' 添加两个域 并在中间添加短横
Function AddDoubleFields(name As String, text1 As String, text2 As String)
Options.ReplaceSelection = True
Selection.TypeText name
AddSeqFieldOnSection seqText:=text1
Selection.InsertAfter Text:="-"
AddSeqFieldOnSection seqText:=text2
Selection.InsertAfter Text:=" "
End Function
' 添加不同类型的编号
Function AddFieldWithChapter(fieldType As String)
Call AddDoubleFields(name:=fieldType, text1:="chapter \c", text2:=fieldType & " \s1")
End Function
' 添加章节分隔符
Sub AddChapterField()
AddSeqFieldOnSection ("chapter \h")
End Sub
' 插入图自动编号
Sub AddFigureFied()
Call AddFieldWithChapter("图")
End Sub
' 插入表自动编号
Sub AddTableFied()
Call AddFieldWithChapter("表")
End Sub
目前可以使用图以及表两个前缀进行编号。要使用其他前缀加一个函数即可。在每一章的标题后面插入章节分隔符,然后需要编号的时候插入编号。目前使用的方式是通过调用宏的方式,当然理想的方式是将其添加到选项卡中可以自定义前缀。