Typora 导出 Word 模版操作手册

Typora 导出 Word 模版操作手册

本手册记录从零建立 Word 模版、调整现有模版、配置 Pandoc 参数、编写 Lua 过滤器的完整流程,方便更换模版时按步骤操作。


一、样式对应关系总表

以下是 Typora(Pandoc)导出 Word 时,各类内容与 Word 样式名称的对应关系。

Word 模版中的样式名支持中文别名,例如 Heading 1标题1 等价,Pandoc 均可识别。

Typora 内容类型 Pandoc 默认 Word 样式名 中文别名(等价) 说明
正文段落(首段) First Paragraph --- 可合并到正文统一处理
正文段落(非首段) Body Text --- 可用 Lua 过滤器改为自定义名
一级标题 # Heading 1 标题1 两者等价,Word 模版中改名即可
二级标题 ## Heading 2 标题2 同上
三级标题 ### Heading 3 标题3 同上
四级标题 #### Heading 4 标题4 同上
代码块(三个反引号) Source Code ---
无序列表 - List Bullet ---
有序列表 1. List Number ---
引用块 > Block Text ---
表格整体 Table --- 表格样式,非段落样式
表格单元格内段落 Compact ---
表题(: 表题文字 Table Caption --- 写在表格上方或下方均可
图题(图片 alt text) Image Caption ---

二、从零建立 Word 模版的步骤

2.1 生成 Pandoc 默认模版

在命令行运行以下命令,生成 Pandoc 官方默认 reference.docx,以此为基础修改,避免样式丢失问题。

复制代码
pandoc --print-default-data-file reference.docx > my-reference.docx

在此基础上修改样式,而不是直接在出版社模版上新建样式。

2.2 必须建立的样式清单

打开 my-reference.docx,在样式窗格中找到以下样式并修改为所需格式。若样式不存在,通过「开发工具 → 文档模板 → 管理器 → 导入/导出 → 从 Normal.dotm 复制」的方式调入后再修改。

正文类

样式名 用途 建议设置
Body Text 正文非首段(或用 Lua 改为自定义名 BodyTextMain) 与正文字体、行距一致
First Paragraph 正文首段 与 Body Text 相同,或在 Lua 中合并统一处理

标题类

样式名 用途 建议设置
Heading 1 一级标题 # 章标题字体、字号、间距
Heading 2 二级标题 ## 节标题字体、字号、间距
Heading 3 三级标题 ### 小节标题字体、字号、间距
Heading 4 四级标题 #### 四级标题字体、字号、间距

列表类

样式名 用途 建议设置
List Bullet 无序列表 字体、缩进与模版列表一致,绑定圆点编号格式
List Number 有序列表 字体、缩进与模版有序列表一致

代码类

样式名 用途 建议设置
Source Code 代码块每一行 等宽字体、背景底色、左缩进 0、无首行缩进

表格类

样式名 用途 建议设置
Table 表格整体样式(表格样式,非段落样式) 边框、字体、首行底色等
Compact 表格单元格内段落 字体与表格样式一致,不覆盖表格样式
Table Caption 表题 与模版表题样式一致

图片类

样式名 用途 建议设置
Image Caption 图题 与模版图题样式一致

引用类

样式名 用途 建议设置
Block Text 引用块 > 与模版提示框样式一致

2.3 表格样式的特殊设置

(1)在 Word 模版中,表格样式必须命名为 Table,Pandoc 才能自动关联。

(2)打开表格样式修改对话框,分别设置以下部分。

  • 将格式应用于「整个表格」:设置字体、内外边框线型和粗细。
  • 将格式应用于「标题行」:设置首行背景色、字体,以及上下边框加粗。
  • 将格式应用于「最后一行」:设置下边框加粗。

(3)保存时选「基于该模板的新文档」。

2.4 避免样式丢失的注意事项

  • 新建样式时,弹窗底部选「基于该模板的新文档」,不要选「仅限此文档」。
  • Body TextList Bullet 等是 Word 内置保留样式名,不要新建同名样式,应找到已有的内置样式直接修改。若内置样式不存在,通过「管理样式 → 导入/导出」从 Normal.dotm 复制过来再修改。
  • 新建或修改的样式,必须在文档中有内容实际使用,否则 Word 关闭后会清理未使用的样式。可在模版末尾为每个样式写一行占位文字。
  • 样式快捷键保存到 Normal.dotm,这样所有 Word 文档都能使用,不随导出文档消失。

三、调整现有模版以适配 Typora 导出

如果已有一份出版社或自定义的 Word 模版,按以下步骤逐项调整,无需从零重建。

3.1 标题样式

Pandoc 导出标题时,查找名为 Heading 1Heading 4 的样式。

(1)打开现有模版,打开样式窗格,找到模版中已有的各级标题样式。

(2)将各级标题样式重命名:

  • 一级标题样式 → 改名为 Heading 1(或在 Word 中确认别名已包含 标题1
  • 二级标题样式 → Heading 2
  • 三级标题样式 → Heading 3
  • 四级标题样式 → Heading 4

(3)若模版标题样式已叫 标题1标题4,Pandoc 同样可以识别,无需改名。

3.2 正文段落样式

Pandoc 导出正文时套用 Body Text(非首段)和 First Paragraph(首段)。由于这两个是 Word 内置保留样式名,容易出现新建后消失的问题,建议用 Lua 过滤器改为自定义样式名。

(1)在现有模版中新建一个段落样式,命名为 BodyTextMain(可自定义,非内置名,不会消失)。

(2)将该样式的字体、行距设置为与模版正文一致。

(3)在 Lua 过滤器中将正文段落统一指定为 BodyTextMain(见第五节)。

3.3 代码样式

(1)在现有模版中找到代码相关样式(通常叫「代码」「源代码」或类似名称)。

(2)将其改名为 Source Code

(3)修改样式设置:左缩进设为 0,首行缩进设为无,保留等宽字体和背景底色。

(4)由于 Pandoc 将代码块合并为一个段落加软回车,首行缩进只作用于第一行,需使用 Lua 过滤器将每行拆为独立段落(见第五节),这样每行都能触发首行缩进或统一样式。

3.4 表格样式

(1)单击现有模版中的目标表格,在「表设计」选项卡中确认当前应用的表格样式名称(鼠标悬停在高亮样式缩略图上查看)。

(2)若样式名不是 Table,有两种处理方式:

  • 右键该样式 → 修改 → 将名称改为 Table(同时确认原有 Table 内置样式已删除或改名,避免冲突)。
  • 或基于当前表格新建样式,命名为 Table:表设计 → 样式库下拉 → 新建表格样式。

(3)新建或修改 Table 样式时,在「修改表格样式」对话框中分别设置「整个表格」「标题行」「最后一行」的边框和背景色,确保这些格式保存在样式定义里,而不是直接刷上去的格式。

(4)修改或新建 Compact 样式,字体与表格内文字一致。

3.5 列表样式

(1)在样式窗格中找到 List Bullet 样式(若不存在,从 Normal.dotm 导入)。

(2)右键修改:设置字体、行距与模版列表一致,格式 → 编号 → 绑定模版中的圆点列表格式。

(3)若模版列表样式有自定义名称,可在 Lua 过滤器中直接指定该名称(见第五节),无需改名。

3.6 引用块样式

(1)在样式窗格中找到 Block Text 样式(若不存在,从 Normal.dotm 导入)。

(2)修改为模版中提示框的格式,或在 Lua 过滤器中指定模版中已有的引用样式名。

3.7 表题与图题样式

(1)找到模版中的表题样式,改名为 Table Caption;找到图题样式,改名为 Image Caption

(2)若不想改名,可在 Lua 过滤器中指定自定义样式名。

3.8 防止样式丢失

(1)打开「开发工具 → 文档模板」,取消勾选「自动更新文档样式」,防止 Word 重开时用 Normal 模版覆盖自定义样式。

(2)每个新建或调整的样式,在模版文档中写一行占位文字并应用该样式,防止 Word 清理未使用样式。

(3)保存时确认选「基于该模板的新文档」。


四、Typora 的配置

4.1 样式文件配置

在 Typora 偏好设置 → 导出 → Word(.docx)中:

  • 「样式文件」填写模版文件的绝对路径。
  • 「自定义参数」填写 Lua 过滤器路径(见第五节)。

4.2 表题的写法

Pandoc 识别的表题语法是以 : 开头(冒号加空格),写在表格上方或下方均可。

markdown 复制代码
: 表 1-1 OpenClaw 与 ChatGPT 的功能对比

| 列1 | 列2 |
|-----|-----|
| 内容 | 内容 |

4.3 图题的写法

图题直接写在图片的 alt text 位置。

markdown 复制代码
![图 1-1 OpenClaw 主界面](图片路径.png)

五、Lua 过滤器完整代码

将以下代码保存为 code-block-fix.lua,放到纯英文路径下(避免中文路径导致编码错误),文件编码必须为 UTF-8(无 BOM)。

lua 复制代码
-- code-block-fix.lua
-- Typora 导出 Word 的样式修正过滤器

-- 1. 将代码块每一行拆分为独立段落
--    使每行都能触发 Word 样式中的首行缩进
function CodeBlock(el)
  local result = {}
  local lines = {}
  for line in (el.text .. "\n"):gmatch("([^\n]*)\n") do
    table.insert(lines, line)
  end
  while #lines > 0 and lines[#lines] == "" do
    table.remove(lines)
  end
  for _, line in ipairs(lines) do
    local text = line == "" and " " or line
    local block = pandoc.CodeBlock(text, el.attr)
    table.insert(result, block)
  end
  return result
end

-- 2. 设置表格列宽均等铺满页面(Pandoc 3.x)
--    删除此函数可关闭均等列宽功能
function Table(tbl)
  if tbl.colspecs and #tbl.colspecs > 0 then
    local col_count = #tbl.colspecs
    local width = 1.0 / col_count
    tbl.colspecs = tbl.colspecs:map(function(colspec)
      return {colspec[1], width}
    end)
  end
  return tbl
end

-- 3. 将正文段落统一应用自定义样式 BodyTextMain
--    需在 Word 模版中建立名为 BodyTextMain 的段落样式
--    如需使用其他样式名,将 "BodyTextMain" 替换即可
function Pandoc(doc)
  local function fix_blocks(blocks)
    local result = pandoc.List()
    for _, block in ipairs(blocks) do
      if block.t == "Para" then
        result:insert(pandoc.Div(
          {block},
          pandoc.Attr("", {}, {["custom-style"] = "BodyTextMain"})
        ))
      else
        result:insert(block)
      end
    end
    return result
  end
  doc.blocks = fix_blocks(doc.blocks)
  return doc
end

-- 4. 将无序列表每项应用自定义列表样式
--    将 "List Bullet" 改为模版中实际的列表样式名
function BulletList(el)
  local result = pandoc.List()
  for _, item in ipairs(el.content) do
    for _, block in ipairs(item) do
      result:insert(
        pandoc.Div(
          {block},
          pandoc.Attr("", {}, {["custom-style"] = "List Bullet"})
        )
      )
    end
  end
  return result
end

-- 5. 将引用块应用自定义样式
--    将 "Block Text" 改为模版中实际的引用样式名
function BlockQuote(el)
  return pandoc.Div(
    el.content,
    pandoc.Attr("", {}, {["custom-style"] = "Block Text"})
  )
end

5.1 Typora 自定义参数配置

在 Typora 偏好设置 → 导出 → Word(.docx)→ 自定义参数中填写:

复制代码
--lua-filter="D:\你的路径\code-block-fix.lua"

路径必须是绝对路径,且不能包含中文。也可以将 lua 文件放到 Pandoc 默认数据目录,则只需填写文件名:

复制代码
--lua-filter=code-block-fix.lua

Pandoc 默认数据目录路径为:

复制代码
C:\Users\你的用户名\AppData\Roaming\pandoc\

六、常见问题与解决方法

问题 原因 解决方法
代码块第一行有首行缩进,其他行没有 Pandoc 将代码块合并为一个段落加软回车 使用 Lua 过滤器将每行拆为独立段落
表格没有铺满页面宽度 Pandoc 默认根据内容计算列宽 使用 Lua 过滤器设置均等列宽
导出后正文字体与模版不一致 Pandoc 套用默认 Body Text 样式 在模版中修改 Body Text,或用 Lua 指定 BodyTextMain
表格内字体与模版不一致 表格单元格使用 Compact 样式 在模版中修改 Compact 样式的字体
列表样式与模版不一致 Pandoc 套用默认 List Bullet 样式 在模版中修改 List Bullet 样式,或用 Lua 指定自定义样式名
引用块样式与模版不一致 Pandoc 套用默认 Block Text 样式 修改 Block Text 样式,或在 Lua 中指定模版样式名
导出时报编码错误 Lua 文件路径包含中文,或文件编码不是 UTF-8 将 Lua 文件移至纯英文路径,确认编码为 UTF-8(无 BOM)
新建样式关闭后消失 使用了 Word 内置保留样式名(如 Body Text) 不要新建,从 Normal.dotm 导入后直接修改
样式快捷键导出后消失 快捷键不属于样式定义,存储在 Normal.dotm 或文档中 将快捷键保存到 Normal.dotm,对所有文档生效
表格样式关联不上 表格样式名不是 Table,或样式格式是直接刷上去的而非定义在样式里 新建或改名为 Table,在样式定义里设置边框和底色
代码块底色随缩进偏移 段落底纹跟随左缩进 Source Code 样式左缩进设为 0,不要用左缩进实现视觉效果

七、更换模版时的操作清单

(1)以 Pandoc 默认 reference.docx 为基础生成新模版文件,或在现有模版上按第三节步骤调整。

(2)确认标题样式命名为 Heading 1Heading 4(或 标题1标题4)。

(3)新建 BodyTextMain 段落样式,字体行距与模版正文一致。

(4)确认或新建 Table 表格样式,在样式定义中设置边框、首行底色、字体。

(5)修改 Compact 样式,字体与表格内文字一致。

(6)确认或修改 Source Code 样式,左缩进 0,无首行缩进,等宽字体,背景底色。

(7)确认或修改 List Bullet 样式,绑定圆点列表格式。

(8)确认或修改 Block Text 样式,与模版引用框格式一致。

(9)确认 Table CaptionImage Caption 样式存在并格式正确。

(10)每个样式在模版文档中写一行占位文字,防止 Word 关闭后清理未使用样式。

(11)取消勾选「自动更新文档样式」(开发工具 → 文档模板)。

(12)更新 Lua 过滤器中的自定义样式名与新模版一致。

(13)更新 Typora 偏好设置中的样式文件路径。

(14)用一份包含正文、代码、表格、列表、引用、图片、表题、图题的测试 md 文件导出,逐项核对样式是否正确关联。

相关推荐
略略略咯咯1 小时前
stream流浅拷贝
开发语言·python
long3161 小时前
Java 团队入门到精通学习资料
java·开发语言
城管不管2 小时前
rabbitmq如何保证消息不丢失?解决方案又是什么?
开发语言·ai·面试·职场和发展·rabbitmq·php·agent
程序员良辰2 小时前
【TongWeb7】启动接近两分钟问题排查
java·开发语言·中间件
深色風信子2 小时前
Kotlin Bytedeco OpenCV 图像图像58 无缝克隆
开发语言·opencv·kotlin·bytedeco
朝阳392 小时前
react19【系列实用教程】实用组件封装
开发语言·前端·javascript
我是苏苏2 小时前
C#基础:使用System.Speech.Synthesis离线播放/朗读文字内容
开发语言·c#
Patrick在香港2 小时前
Python依赖管理从踩坑到选型:pip/poetry/uv四种方案全面实测
开发语言·python·数据分析·scikit-learn·ai编程·pip·uv
我命由我123452 小时前
Kotlin 面向对象 - 枚举排序
android·java·开发语言·java-ee·kotlin·android studio·android-studio