第7章:样式定义机制(styles.xml)
学习目标
- 理解Word样式体系架构
- 理解内嵌样式和命名样式
- 理解段落样式和字符样式的区别
- 理解样式继承机制
- 掌握styles.xml的结构
- 理解默认样式的作用
7.1 为什么需要样式
样式是Word排版的核心机制。理解了样式,你才能真正理解Word排版。
如果没有样式:
- 你需要手动给每一段文字设置字体、字号、对齐、间距
- 修改格式需要一处处改,非常麻烦
- 格式很难保持一致
使用样式:
- 把一套格式属性命名保存为样式
- 给段落应用样式,就自动应用所有格式
- 修改样式,所有应用该样式的地方自动更新
- 整个文档格式保持一致
- 可以自动生成目录
在docx中,所有样式定义都集中放在word/styles.xml中。
7.2 样式的分类
Word中的样式分为几类:
按应用对象分
| 类型 | 说明 | 存储位置引用 |
|---|---|---|
| 段落样式 | 应用于整个段落 | 在pPr中用pStyle引用 |
| 字符样式 | 应用于部分文字 | 在rPr中用rStyle引用 |
| 链接样式 | 既是段落也是字符 | Word UI中可以两种方式用 |
| 表格样式 | 应用于表格 | 表格引用 |
| 列表样式 | 应用于编号列表 | numbering.xml引用 |
最常用的是段落样式和字符样式。
按来源分
- 内置样式:Word自带的样式,比如“标题1“、“标题2”、“正文“等
- 自定义样式:用户自己创建的样式
保存在哪里
- 所有样式定义都在
styles.xml中 - 每个样式一个
<w:style>元素 - 每个样式有唯一的样式ID和名称
7.3 styles.xml 的整体结构
一个典型的styles.xml结构:
<w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<!-- 默认格式定义 -->
<w:docDefaults>
<w:rPrDefault>...</w:rPrDefault> <!-- 默认字符格式 -->
<w:pPrDefault>...</w:pPrDefault> <!-- 默认段落格式 -->
</w:docDefaults>
<!-- 样式定义 -->
<w:style w:type="paragraph" w:styleId="Normal" w:default="1">
<w:name w:val="Normal"/>
<w:basedOn w:val="Normal"/>
<w:pPr>...</w:pPr> <!-- 段落属性 -->
<w:rPr>...</w:rPr> <!-- 字符属性 -->
</w:style>
<w:style w:type="paragraph" w:styleId="Heading1">
<w:name w:val="Heading 1"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:pPr>...</w:pPr>
<w:rPr>...</w:rPr>
</w:style>
<w:style w:type="character" w:styleId="Emphasis">
<w:name w:val="强调"/>
<w:rPr>...</w:rPr>
</w:style>
</w:styles>
结构很清晰:
- 开头是
docDefaults定义默认格式 - 然后是每个样式一个
w:style元素
7.4 w:style 元素详解
我们来看一个完整的样式定义:
<w:style w:type="paragraph" w:styleId="Heading1" w:default="0" w:customStyle="1">
<w:name w:val="标题 1"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:link w:val="Heading1Char"/>
<w:uiPriority w:val="1"/>
<w:rsid w:val="00B63F5E"/>
<w:pPr>
<w:outlineLvl w:val="0"/>
<w:spacing w:before="360" w:after="240"/>
<w:keepNext/>
</w:pPr>
<w:rPr>
<w:sz w:val="36"/>
<w:b/>
</w:rPr>
</w:style>
属性
| 属性 | 说明 |
|---|---|
w:type | 样式类型:paragraph段落,character字符,table表格,numbering列表 |
w:styleId | 样式ID,文档内唯一,用来引用,程序用这个 |
w:default | 是否是该类型的默认样式,1表示默认 |
w:customStyle | 1表示是用户自定义样式,0表示内置样式 |
子元素
| 元素 | 说明 |
|---|---|
w:name | 样式的显示名称,用户在Word界面看到的名称 |
w:basedOn | 基于哪个样式,样式继承 |
w:next | 应用此样式段落回车后下一段默认样式 |
w:pPr | 段落属性,应用此样式的段落默认格式 |
w:rPr | 字符属性,应用此样式的文字默认格式 |
样式ID vs 名称
styleId是内部ID,通常是英文不变,比如Heading1name是显示名称,本地化会变,中文就是“标题 1“- 程序引用样式用
styleId,不是name
7.5 样式继承机制
样式支持继承:一个样式可以基于另一个样式,继承它的所有属性,然后覆盖自己需要改的部分。
继承语法
<w:style w:type="paragraph" w:styleId="MyHeading">
<w:name w:val="我的标题"/>
<w:basedOn w:val="Heading1"/> <!-- 基于标题1 -->
<w:pPr>
<w:spacing w:before="480"/> <!-- 只改段前间距,其他继承Heading1 -->
</w:pPr>
</w:style>
属性查找顺序
当应用一个样式时,属性查找顺序:
- 当前样式定义的属性 → 使用
- 如果没有,找
basedOn父样式 → 使用父样式定义 - 如果父样式也没有,继续找祖父样式…
- 最后找默认样式 → 使用默认
为什么要继承
- 减少重复定义
- 修改共同属性只需要改父样式
- 保持一致性
- 方便批量修改
Normal正文样式
通常Normal(正文)是最基础的样式,大部分段落样式都基于它:
<w:style w:type="paragraph" w:styleId="Normal" w:default="1">
<w:name w:val="正文"/>
<!-- 定义默认字体、字号、行间距等 -->
</w:style>
<w:style w:type="paragraph" w:styleId="Heading1">
<w:basedOn w:val="Normal"/> <!-- 继承正文 -->
<!-- 只覆盖需要变化的属性 -->
</w:style>
7.6 默认格式 docDefaults
在styles.xml开头,有个docDefaults元素,定义文档的默认格式。
<w:docDefaults>
<w:rPrDefault>
<w:rPr>
<!-- 默认字符格式 -->
<w:rFonts w:ascii="宋体" w:eastAsia="宋体" w:hAnsi="宋体"/>
<w:sz w:val="24"/> <!-- 默认12磅 -->
</w:rPr>
</w:rPrDefault>
<w:pPrDefault>
<w:pPr>
<!-- 默认段落格式 -->
<w:spacing w:line="360"/> <!-- 默认单倍行距 -->
</w:pPr>
</w:pPrDefault>
</w:docDefaults>
默认格式的作用
如果:
- 段落没有应用任何样式
- 样式中没有定义某个属性
- 继承链上都没有找到
就使用docDefaults中的默认格式。
可以把它理解为最基础的默认值。
7.7 段落样式 vs 字符样式
让我们再明确一下两者的区别:
段落样式
- 应用于整个段落
- 在段落属性中引用:
<w:p> <w:pPr> <w:pStyle w:val="Heading1"/> <!-- 引用段落样式 --> </w:pPr> </w:p> - 包含段落属性和字符属性
- 整个段落都使用该样式的字符属性
字符样式
- 应用于段落内部分文字
- 在运行属性中引用:
<w:r> <w:rPr> <w:rStyle w:val="Emphasis"/> <!-- 引用字符样式 --> </w:rPr> </w:r> - 只包含字符属性
- 只影响应用的那部分文字
例子:段落样式+字符样式
<!-- 段落应用"标题1"段落样式 -->
<w:p>
<w:pPr>
<w:pStyle w:val="Heading1"/>
</w:pPr>
<!-- 标题前几个字使用"强调"字符样式 -->
<w:r>
<w:rPr>
<w:rStyle w:val="Emphasis"/>
</w:rPr>
<w:t>开头</w:t>
</w:r>
<!-- 剩下的字使用段落样式的默认字符格式 -->
<w:r>
<w:t>其他文字</w:t>
</w:r>
</w:p>
这样很灵活:整个段落是标题样式,局部可以再应用字符样式变化格式。
7.8 样式优先级
如果多个格式设置作用于同一个文字,优先级是怎样的?
优先级从高到低:
- 直接格式(直接在rPr/pPr设置的属性)- 最高
- 字符样式 - 高于段落样式
- 段落样式 - 低于字符样式
- 默认样式(Normal)
- docDefaults默认格式 - 最低
举个例子:
- 段落应用“正文“样式,字体宋体,五号
- 段落中某个run应用“强调“字符样式,斜体
- 这个run还直接设置了蓝色
最终结果:宋体,五号,斜体,蓝色。
7.9 内置样式ID参考
常用的内置样式styleId你可以直接用:
| styleId | 中文名称 | 类型 |
|---|---|---|
| Normal | 正文 | 段落 |
| Heading1 | 标题 1 | 段落 |
| Heading2 | 标题 2 | 段落 |
| Heading3 | 标题 3 | 段落 |
| Title | 标题 | 段落 |
| Subtitle | 副标题 | 段落 |
| Emphasis | 强调 | 字符 |
| Strong | 加粗 | 字符 |
| Hyperlink | 超链接 | 字符 |
| FootnoteText | 脚注文字 | 段落 |
7.10 实际例子:一个简单的styles.xml
让我们看一个完整简单的例子:
<?xml version="1.0" encoding="UTF-8"?>
<w:styles xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
<!-- 默认格式 -->
<w:docDefaults>
<w:rPrDefault>
<w:rPr>
<w:rFonts w:ascii="仿宋_GB2312" w:eastAsia="仿宋_GB2312"
w:hAnsi="仿宋_GB2312"/>
<w:sz w:val="24"/> <!-- 12磅 -->
</w:rPr>
</w:rPrDefault>
<w:pPrDefault>
<w:pPr>
<w:spacing w:line="360"/> <!-- 单倍行距 -->
</w:pPr>
</w:pPrDefault>
</w:docDefaults>
<!-- 正文样式(默认段落样式) -->
<w:style w:type="paragraph" w:styleId="Normal" w:default="1">
<w:name w:val="正文"/>
</w:style>
<!-- 标题1 -->
<w:style w:type="paragraph" w:styleId="Heading1">
<w:name w:val="标题 1"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:pPr>
<w:outlineLvl w:val="0"/>
<w:spacing w:before="360" w:after="240"/>
</w:pPr>
<w:rPr>
<w:sz w:val="36"/> <!-- 18磅 -->
<w:b/>
<w:rFonts w:ascii="黑体" w:eastAsia="黑体" w:hAnsi="黑体"/>
</w:rPr>
</w:style>
<!-- 标题2 -->
<w:style w:type="paragraph" w:styleId="Heading2">
<w:name w:val="标题 2"/>
<w:basedOn w:val="Normal"/>
<w:next w:val="Normal"/>
<w:pPr>
<w:outlineLvl w:val="1"/>
<w:spacing w:before="240" w:after="120"/>
</w:pPr>
<w:rPr>
<w:sz w:val="28"/> <!-- 14磅 -->
<w:b/>
</w:rPr>
</w:style>
<!-- 强调字符样式 -->
<w:style w:type="character" w:styleId="Emphasis">
<w:name w:val="强调"/>
<w:basedOn w:val="DefaultParagraphFont"/>
<w:rPr>
<w:i/>
<w:color w:val="800000"/>
</w:rPr>
</w:style>
</w:styles>
这个例子定义了:
- 默认字体:仿宋,12磅,单倍行距
- 正文样式:使用默认
- 标题1:黑体,18磅加粗,段前间距360半磅,段后240半磅
- 标题2:14磅加粗,间距小一点
- 强调字符:斜体,棕色
本章小结
- 所有样式定义都在
word/styles.xml中 - 样式主要分为段落样式和字符样式
- 段落样式在
pPr中用pStyle引用,影响整个段落 - 字符样式在
rPr中用rStyle引用,影响局部文字 - 样式支持继承,通过
basedOn基于另一个样式 docDefaults定义最基础的默认格式- 优先级:直接格式 > 字符样式 > 段落样式 > 默认
样式是Word排版的核心,理解样式机制对你无论是编程处理文档还是手动排版都非常重要。
下一章我们讲解字体与字号设置。