图表的自动编号及交叉引用的实现方法
笑人齿缺曰狗窦大开
编辑于 2024年11月20日 11:33

0.写在前面

以下是我在整理大论文的格式中遇到的些许问题,互联网上找到的回答并不能很好的解决我的问题。解决方法稍显笨拙,一是为自身的学习成长做一点记录,二是抛砖引玉,为大家提供一点不一样的解决思路。


1.页眉的设置

页眉中需要设置,靠左为“XX大学博(硕)士学位论文”;靠右为章序章名。以硕士论文为例,设置方法如下:

具体步骤:

双击页眉打开页眉编辑,键入XX大学硕士学位论文,键入制表位,点击插入-->文档部件-->域-->StyleRef,域属性选择文档的标题1(即学位论文中的章标题),点击插入。调整制表位间隔与边框下框线。

页眉内容

插入引用域

制表位设置

效果展示:

2.图表自动编号

步骤1:

制作章的编号(域代码实现)。ctrl+F9插入域代码,shift+F9切换域代码格式,F9更新域代码。

将光标定位在第*章中间,插入域代码,键入SEQ Chapter \s。在每一章的标题处都需键入。(建议复制粘贴)。

章的编号

步骤2:

制作图表的自动编号域代码。同样插入域代码后,分别键入:

代码块
JavaScript
自动换行
复制代码
{ SEQ Chapter \c·}-{ SEQ Table\* ARABIC  \s·1}
{ SEQ Chapter \c·}-{ SEQ Fig \* ARABIC  \s·1}
复制成功

其中SEQ是序列域代码,Chapter、Table、Fig是用户自定义的名称。\c表示保持章节号不变,\*ARABIC表示用阿拉伯数字编号(非必需),\s 1表示在一级标题下重新编号。

图的编号设置

步骤3:

制作图表自动编号的文档部件,方便使用。选中图1-1,点击文档部件,将所选内容保存到文档部件。

保存至文档部件

同理制作表的自动编号文档部件。添加至快速访问可以便捷使用。

3.交叉引用

VBA实现。

代码块
clike
自动换行
复制代码

Sub 图表书签()
    Dim selectedText As String
    Dim lineText As String
    Dim chapterNum As String
    Dim figureNum As String
    Dim subsequentText As String
    Dim string1 As String
    Dim string2 As String
    Dim isFigure As Boolean
    
    ' 检查是否有选中的文本
    If Selection.Type <> wdSelectionNormal Then
        MsgBox "请选中图表编号文本!", vbExclamation
        Exit Sub
    End If
    
    ' 获取选中的文本
    selectedText = Trim(Selection.Text)
    lineText = Trim(Selection.Paragraphs(1).Range.Text) ' 获取当前行的文本
    
    ' 提取章节号和图号(使用正则表达式)
    Dim regex As Object
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = "(图|表)(\d+)-(\d+)"
    regex.Global = False
    
    If regex.Test(selectedText) Then
        Dim matches As Object
        Set matches = regex.Execute(selectedText)
        Dim typePrefix As String
        typePrefix = matches(0).SubMatches(0) ' 获取图或表的前缀
        chapterNum = matches(0).SubMatches(1) ' 获取章节号
        figureNum = matches(0).SubMatches(2) ' 获取图号或表号
        
        ' 判断是图还是表
        isFigure = (typePrefix = "图")
    Else
        MsgBox "选中的文本格式不正确!", vbExclamation
        Exit Sub
    End If
    
    ' 提取后续文本
    subsequentText = Trim(Mid(lineText, Len(selectedText) + 1))
    subsequentText = Trim(Replace(subsequentText, vbCr, "")) ' 去掉换行符
    
    ' 生成字符串
    If isFigure Then
        string1 = "第" & chapterNum & "章图" & figureNum & "_" & subsequentText
    Else
        string1 = "第" & chapterNum & "章表" & figureNum & "_" & subsequentText
    End If
    
    ' 检查书签名有效性
   string2 = Replace(string1, " ", "_") ' 将空格替换为下划线
    
    ' 检查是否已有同名书签
    If ActiveDocument.Bookmarks.Exists(string2) Then
        ' 提示用户
        MsgBox "书签名称已存在,正在删除旧书签!", vbInformation
        ActiveDocument.Bookmarks(string2).Delete ' 删除同名书签
    End If
    
    ' 添加新书签
    ActiveDocument.Bookmarks.Add Name:=string2, Range:=Selection.Range
    MsgBox "已创建书签: " & string2
    
End Sub

' 函数:检查书签名的有效性
Function IsValidBookmarkName(bookmarkName As String) As Boolean
    Dim invalidChars As String
    Dim i As Integer
    
    invalidChars = "/\[]:;|=," & Chr(0) & Chr(7) ' 书签名中无效字符
    IsValidBookmarkName = True ' 默认有效
    
    For i = 1 To Len(invalidChars)
        If InStr(bookmarkName, Mid(invalidChars, i, 1)) > 0 Then
            IsValidBookmarkName = False
            Exit Function
        End If
    Next i
    
    ' 书签名不能以空格开头或结尾
    If Trim(bookmarkName) <> bookmarkName Then
        IsValidBookmarkName = False
    End If
End Function

复制成功

选中图1-1,运行宏即可生成标签,点击交引用即可实现交叉引用。

后记

1、使用多级列表管理一级标题的编号,数字与章标题的中文间隔异常。因为此问题,后续无法使用题注功能进行交叉引用。

2、以上问题同样导致,新建一个Fig的题注(即给图序做自动编号的名字),可以在交叉引用类型中找到Fig中对应的图,但交叉引用只显示自定义的章节序号,不显示图序号。