Word 样式

Beta

Word 文档使用一种样式系统,其中每个段落和文本运行都引用一个命名样式。转换流水线会将已知的段落样式名称解析为它们对应的 Tiptap 样式,并对其他所有内容回退为普通段落。basedOn 继承链仅用于解析运行级格式。

导入时的样式解析通过 编辑器扩展REST API 的行为完全一致。导出时,这两条路径都支持 styleOverrides 以自定义文档级样式定义。扩展还额外支持 元素覆盖,可对单个元素进行控制,而 REST API 不接受这种方式。

可识别的段落样式

导入服务会识别这些段落样式名称(不区分大小写)。当某个段落的规范样式名称与其中之一匹配时,它会被转换为相应的 Tiptap 节点:

Word 样式名Tiptap 节点备注
heading 1heading 9(正则 /^heading\s*\d+$/iheading(1 到 9 级)参见 标题
quote(不区分大小写的精确匹配)blockquote参见 块级元素
其他所有内容paragraph参见 段落

样式继承

Word 样式可以像类继承一样继承自其他样式。自定义样式“Company Heading”可能基于“Heading 2”,而“Heading 2”又基于“Normal”。这会形成一个父样式链。

导入时,转换器会沿着这条链收集每个祖先的文本格式(字体、字号、粗体、斜体、颜色)。不过,这条链不会用于决定段落最终变成什么类型的节点。节点类型只基于段落自身的样式名称是否匹配已知模式(标题正则或“Quote”)。

这意味着,一个样式为“Company Heading”的段落会变成普通段落节点,即使它从“Heading 2”继承了标题格式。要让转换器生成标题,样式名称本身必须匹配标题模式(例如“Heading 2”)。

字符样式

Word 也支持应用于单个文本运行的字符样式。导入时不会保留字符样式名称。取而代之的是,解析时已解析出的格式(粗体、斜体、颜色、字号等)已经体现在运行的 CSS 属性中,并会映射为 Tiptap 标记。

这意味着,一个样式为“Strong”且解析为粗体的运行,会生成 bold 标记,因为其格式包含 font-weight: bold。样式名“Strong”本身会被丢弃。

具有非标准格式(小型大写、字母间距、文本效果)的自定义字符样式,如果渲染器不支持这些格式,将会丢失这些格式。

编辑器

Tiptap 中没有样式扩展。编辑器没有 Word 段落样式或字符样式的概念。每种内容类型都有各自的扩展(Heading、Blockquote、CodeBlock、Paragraph),格式则通过标记来处理。

若要将文档中命名样式的排版(如 Heading 1NormalQuote 等的视觉定义)以级联 CSS 的形式带入编辑器,而不是作为逐节点属性,请使用实验性的 CSS 注入 功能。它会提取样式目录,并将其作为作用域限定的 <style> 标签注入,或交由你以 cssStyles 对象的形式处理。该页面记录了它覆盖的 16 个选择器和 11 个属性(仅排版;不包含按边设置的边框,也不包含字母间距)。

导出

每种 Tiptap 节点类型都映射到固定的 Word 样式:

Tiptap 节点导出的 Word 样式
paragraphNormal
heading(1 到 6 级)Heading 1 到 Heading 6
blockquote 的子元素Quote
列表项List Paragraph

原始文档中的自定义样式不会被双向无损保留。从“Legal Disclaimer”样式导入的段落,导出时会变成“Normal”。

默认导出样式定义

样式字体大小其他
NormalAptos11pt之后间距 10pt,行高 1.15
Heading 1Aptos Light16pt粗体,颜色 #2E74B5
Heading 2Aptos Light14pt粗体,颜色 #2E74B5
Heading 3Aptos13pt粗体,颜色 #2E74B5
Heading 4Aptos12pt粗体,颜色 #2E74B5
Heading 5Aptos11pt粗体,颜色 #2E74B5
TitleAptos Light22pt粗体,黑色,居中
SubtitleAptos Light16pt斜体,灰色,居中
QuoteAptos(继承)斜体,居中
Hyperlink(继承)(继承)颜色 #0563C1,下划线

自定义导出样式

可使用 styleOverrides 覆盖任意默认样式或添加新样式。你的覆盖项会与默认值进行深度合并:匹配的 id 值会递归合并,新的 id 值会追加。

ExportDocx.configure({
  styleOverrides: {
    paragraphStyles: [
      {
        id: 'Normal',
        name: 'Normal',
        run: {
          font: 'Calibri',
          size: 24,        // 半磅(24 = 12pt)
        },
        paragraph: {
          spacing: {
            after: 200,    // twips(200 = 10pt)
            line: 276,     // 一行的 240 分之一(276 = 1.15)
          },
        },
      },
    ],
  },
})

样式定义中的单位

字体大小以半磅为单位(24 = 12pt)。间距值以 twips 为单位(20 twips = 1pt)。行距使用一行的 240 分之一来表示(240 = 单倍行距,276 = 1.15)。这些单位来自 docx 库,并与 OOXML 规范一致。