文档目录、页眉和文档章节标题之间插入相互链接的最佳实践

发布于:2024-02-05 ⋅ 阅读:(105) ⋅ 点赞:(0)

如果我们手里有一个设置了标题样式的Word长文档,只需要在文档中使用“引用”面板的“目录”命令,即可为文档添加目录,此时点击目录项,就会跳转到文档正文中的相应位置。但是点击正文中的标题,却不能跳转到对应的目录项。此外,如果我们希望正文中相应章节页面的页眉也显示章节标题,那么就必须在章节标题前添加分节符,这样才能实现不同章节的页眉互不影响。在每个章节前插入分节符以及给每节添加不同的页眉,并且实现点击每节的标题和页眉也能跳转到目录的相应位置,对于长文档来说,用手工输入肯定是比较困难的。本文介绍以下三个宏实现这一需求。下面的宏对文档规范化的要求是:每个标题的大纲级别是改标题下面所有内容中大纲级别最高的,并且标题不能是空行。
首先在每个指定级别的标题前添加分节符。推荐添加分页型分节符。如果章节较短,添加连续型分节符,如果某一页上靠前的一部分内容属于上一节的正文,中间出现下一节的标题,由于这一节的页眉属于上一节,这一页页眉的内容与页面上的标题就会对应不上。

Sub 指定级别标题前插入分节符()
    Dim pos As Long
    With Selection
        .StartOf wdStory
        Do
            pos = .Start
            .GoToNext wdGoToHeading
            If pos = .Start Then Exit Do
            If .ParagraphFormat.OutlineLevel = wdOutlineLevel1 Then
                '如果章节较短,可插入连续分节符wdSectionBreakContinuous,
                '否则宜插入分页分节符wdSectionBreakNextPage。
                '推荐使用分页型分节符,这样页眉中的超链接与节标题可以一一对应
                .InsertBreak Type:=wdSectionBreakNextPage
            End If
        Loop
    End With
End Sub

为文档添加目录可以用手工完成。须注意的是如果没有在目录最后添加一个空行,下面的代码应该参考注释进行修改。为了使正文中的标题及页眉能够链接到相应的目录项,必须为每个目录项添加书签。以下的宏实现了这个功能,标签名也就是对应的标题的内容。

Sub 为每个目录项添加书签()
    Dim aPara As Paragraph, txt$
    ActiveDocument.TablesOfContents(1).Range.Select
    For Each aPara In Selection.Paragraphs
        txt = aPara.Range.Text
        If Len(txt) > 1 Then
        	' 在目录项中截取标题文本作为书签名
            txt = Left(txt, InStr(txt, Chr(9)) - 1) 'chr(9)为目录前导符
            '在插入目录后应该将光标定位到最后一条目录结尾输入一个空行,最后一条目录的Range才不会是整个目录
            '如不多输入一个空行,不应直接用aPara.Range作为下面的Add方法的参数,
            '应该构造一个Range:ActiveDocument.Range(aPara.Range.Start, aPara.Range.End - 1)
            ActiveDocument.Bookmarks.Add _
                Range:=aPara.Range, Name:=txt
        End If
    Next
End Sub

最后是在每节的节标题区域插入到目录的链接,同时修改各节页眉,添加相应内容并插入链接。我在此前的博客中也写过实现相同功能的代码,但很显然都没有本文中的代码简洁高效:

Sub 处理节标题和页眉的链接()
    Dim aSec As Section, pos As Long, txt$, aPara As Paragraph, leadingTxt$
    leadingTxt = "前导字符串"
    Application.ScreenUpdating = False
    For Each aSec In ActiveDocument.Sections
        With Selection
        	' 节标题为每节第一个段落
            Set aPara = aSec.Range.Paragraphs(1)
            '本文处理的标题大纲级别为1,VBA中有相应大纲级别常量定义
            '如果文档编写规范,可以省略这个if判断语句
            If aPara.OutlineLevel = wdOutlineLevel1 Then
                txt = Replace(aPara.Range.Text, Chr(13), "") '去掉段落结尾的回车符
'                Debug.Print txt
				' 文档如果没有空白标题行,也可以省略下面的if判断
                If Len(txt) > 1 Then
                	'将节标题链接到目录,注意在第一个宏中在目录项设置了以标题文本为书签名的书签
                    ActiveDocument.Hyperlinks.Add Anchor:=aPara.Range, Address:="", _
                        SubAddress:=txt
                    '设置页眉与上一接不同    
                    aSec.Headers(wdHeaderFooterPrimary).LinkToPrevious = False
                    '在本届页眉区域添加内容并设置超链接链接到目录项                    
                    With aSec.Headers(wdHeaderFooterPrimary).Range
                    '设置页眉中的文本。leadingTxt可以是书名,与节标题间添加一个Tab键
                        .Text = leadingTxt & vbTab & txt
                        .Font.Size = 10 ' 字体大小为五号
                        .ParagraphFormat.TabStops.ClearAll
                        '在页眉中添加右对齐制表位,将节标题对齐到右边
                        .ParagraphFormat.TabStops.Add Position:=CentimetersToPoints(16 _
                            ), Alignment:=wdAlignTabRight, Leader:=wdTabLeaderSpaces
                    End With
                    ActiveDocument.Hyperlinks.Add Anchor:=aSec.Headers(wdHeaderFooterPrimary).Range, Address:="", _
                        SubAddress:=txt

                End If
            End If
        End With
    Next
    Application.ScreenUpdating = True
    ' 恢复视图为页面视图
    If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        ActiveWindow.Panes(2).Close
    End If
    ActiveWindow.ActivePane.View.Type = wdPrintView
End Sub
本文含有隐藏内容,请 开通VIP 后查看