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

第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>

结构很清晰:

  1. 开头是docDefaults定义默认格式
  2. 然后是每个样式一个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:customStyle1表示是用户自定义样式,0表示内置样式

子元素

元素说明
w:name样式的显示名称,用户在Word界面看到的名称
w:basedOn基于哪个样式,样式继承
w:next应用此样式段落回车后下一段默认样式
w:pPr段落属性,应用此样式的段落默认格式
w:rPr字符属性,应用此样式的文字默认格式

样式ID vs 名称

  • styleId 是内部ID,通常是英文不变,比如Heading1
  • name 是显示名称,本地化会变,中文就是“标题 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>

属性查找顺序

当应用一个样式时,属性查找顺序:

  1. 当前样式定义的属性 → 使用
  2. 如果没有,找basedOn父样式 → 使用父样式定义
  3. 如果父样式也没有,继续找祖父样式…
  4. 最后找默认样式 → 使用默认

为什么要继承

  • 减少重复定义
  • 修改共同属性只需要改父样式
  • 保持一致性
  • 方便批量修改

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 样式优先级

如果多个格式设置作用于同一个文字,优先级是怎样的?

优先级从高到低:

  1. 直接格式(直接在rPr/pPr设置的属性)- 最高
  2. 字符样式 - 高于段落样式
  3. 段落样式 - 低于字符样式
  4. 默认样式(Normal)
  5. 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排版的核心,理解样式机制对你无论是编程处理文档还是手动排版都非常重要。

下一章我们讲解字体与字号设置。