第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>
结构:
w:fldChar w:fldCharType="begin"- 域开始w:instrText- 域指令(就是域代码)w:fldChar w:fldCharType="separate"- 分隔指令和结果- 结果内容 - 缓存的上次计算结果
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的自动目录工作原理:
- 你给各个标题应用了标题样式(Heading1, Heading2…)或者设置了大纲级别
- 你插入TOC域
- Word更新域时,扫描整个文档,收集所有有大纲级别的段落
- 根据级别生成目录条目,每个条目带页码和超链接
- 放在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排版设计实践。