Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第15章:目录与域

学习目标

  • 理解什么是域
  • 理解域的表示方式
  • 掌握常见域:TOC(目录)、PAGE、REF等
  • 理解目录是怎么生成的

15.1 什么是域

域是Word中的动态内容,可以根据文档上下文自动更新。

常见的域:

  • PAGE:自动页码
  • TOC:自动目录(根据标题样式生成)
  • REF:交叉引用
  • DATE:当前日期
  • HYPERLINK:超链接
  • STYLEREF:引用样式内容

15.2 域在XML中怎么表示

域分成几个部分:begin → instructions → end

<w:r>
  <w:fldChar w:fldCharType="begin"/>  <!-- 开始标记 -->
</w:r>
<w:r>
  <w:instrText>PAGE</w:instrText>       <!-- 域指令 -->
</w:r>
<w:r>
  <w:fldChar w:fldCharType="separate"/> <!-- 分隔,结果在后面 -->
</w:r>
<w:r>
  <w:t>3</w:t>                         <!-- 当前缓存的结果 -->
</w:r>
<w:r>
  <w:fldChar w:fldCharType="end"/>     <!-- 结束标记 -->
</w:r>

结构:

  1. w:fldChar w:fldCharType="begin" - 域开始
  2. w:instrText - 域指令(就是域代码)
  3. w:fldChar w:fldCharType="separate" - 分隔指令和结果
  4. 结果内容 - 缓存的上次计算结果
  5. w:fldChar w:fldCharType="end" - 域结束

如果不需要分开保存结果,可以没有separate和结果部分,只有begin → instr → end。


15.3 常见域例子

PAGE 页码

我们已经见过:

<w:r>
  <w:fldChar w:fldCharType="begin"/>
  <w:instrText>PAGE</w:instrText>
  <w:fldChar w:fldCharType="separate"/>
  <w:t>5</w:t>
  <w:fldChar w:fldCharType="end"/>
</w:r>

Word打开后会自动替换成当前页码。

NUMPAGES 总页数

<w:instrText>NUMPAGES</w:instrText>

用来显示总页数,常见用法:“第 5 页,共 10 页”

DATE 当前日期

<w:instrText>DATE \@ "YYYY年MM月DD日"</w:instrText>

\@ 指定日期格式。

TOC 目录

<w:r>
  <w:fldChar w:fldCharType="begin"/>
  <w:instrText>TOC \o "1-3" \h \z</w:instrText>
  <w:fldChar w:fldCharType="separate"/>
  <!-- 目录生成后结果在这里 -->
  <w:fldChar w:fldCharType="end"/>
</w:r>

TOC指令参数:

  • \o "1-3" 包含大纲级别1-3级(标题1到标题3)
  • \h 超链接
  • \z 隐藏页码边框
  • \u 保留样式

更新域的时候,Word会自动扫描所有标题,生成目录。所以你只要放对TOC域,Word会自动生成。


15.4 自动目录怎么工作

Word的自动目录工作原理:

  1. 你给各个标题应用了标题样式(Heading1, Heading2…)或者设置了大纲级别
  2. 你插入TOC域
  3. Word更新域时,扫描整个文档,收集所有有大纲级别的段落
  4. 根据级别生成目录条目,每个条目带页码和超链接
  5. 放在TOC域的位置

所以,生成目录的关键是:正确设置标题的大纲级别

只要标题大纲级别正确,TOC域就能正确生成目录。


15.5 交叉引用 REF

交叉引用用REF域:

<w:r>
  <w:fldChar w:fldCharType="begin"/>
  <w:instrText>REF _Ref123456789 \h</w:instrText>
  <w:fldChar w:fldCharType="separate"/>
  <w:t>第3章</w:t>
  <w:fldChar w:fldCharType="end"/>
</w:r>

\h 表示超链接。点击交叉引用会跳转到引用位置。


15.6 什么时候更新域

  • 用户打开文档可以手动更新域(右键 → 更新域)
  • Word打印的时候通常会自动更新
  • 编程生成文档后,如果有TOC,最好告诉用户打开后需要更新域

15.7 例子:页脚的“第X页,共Y页“

<w:ftr>
  <w:p>
    <w:pPr>
      <w:jc w:val="center"/>
    </w:pPr>
    <w:r>
      <w:t>第 </w:t>
    </w:r>
    <w:r>
      <w:fldChar w:fldCharType="begin"/>
      <w:instrText>PAGE</w:instrText>
      <w:fldChar w:fldCharType="separate"/>
      <w:t>1</w:t>
      <w:fldChar w:fldCharType="end"/>
    </w:r>
    <w:r>
      <w:t> 页,共 </w:t>
    </w:r>
    <w:r>
      <w:fldChar w:fldCharType="begin"/>
      <w:instrText>NUMPAGES</w:instrText>
      <w:fldChar w:fldCharType="separate"/>
      <w:t>10</w:t>
      <w:fldChar w:fldCharType="end"/>
    </w:r>
    <w:r>
      <w:t> 页</w:t>
    </w:r>
  </w:p>
</w:ftr>

就是我们常见的页码格式。


本章小结

  • 域是动态内容,Word会自动计算更新
  • 域结构:begin → instrText(指令) → separate → 结果 → end
  • PAGE显示当前页码,NUMPAGES显示总页数
  • TOC域自动生成目录,基于标题大纲级别
  • 更新域后才能看到最新结果

这是第三部分Open XML核心结构的最后一章。第三部分我们已经完整讲解了docx各个主要部分的结构。现在我们进入第四部分:Word排版设计实践。