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 Text、List Bullet等是 Word 内置保留样式名,不要新建同名样式,应找到已有的内置样式直接修改。若内置样式不存在,通过「管理样式 → 导入/导出」从 Normal.dotm 复制过来再修改。- 新建或修改的样式,必须在文档中有内容实际使用,否则 Word 关闭后会清理未使用的样式。可在模版末尾为每个样式写一行占位文字。
- 样式快捷键保存到
Normal.dotm,这样所有 Word 文档都能使用,不随导出文档消失。
三、调整现有模版以适配 Typora 导出
如果已有一份出版社或自定义的 Word 模版,按以下步骤逐项调整,无需从零重建。
3.1 标题样式
Pandoc 导出标题时,查找名为 Heading 1~Heading 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

五、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 1~Heading 4(或 标题1~标题4)。
(3)新建 BodyTextMain 段落样式,字体行距与模版正文一致。
(4)确认或新建 Table 表格样式,在样式定义中设置边框、首行底色、字体。
(5)修改 Compact 样式,字体与表格内文字一致。
(6)确认或修改 Source Code 样式,左缩进 0,无首行缩进,等宽字体,背景底色。
(7)确认或修改 List Bullet 样式,绑定圆点列表格式。
(8)确认或修改 Block Text 样式,与模版引用框格式一致。
(9)确认 Table Caption 和 Image Caption 样式存在并格式正确。
(10)每个样式在模版文档中写一行占位文字,防止 Word 关闭后清理未使用样式。
(11)取消勾选「自动更新文档样式」(开发工具 → 文档模板)。
(12)更新 Lua 过滤器中的自定义样式名与新模版一致。
(13)更新 Typora 偏好设置中的样式文件路径。
(14)用一份包含正文、代码、表格、列表、引用、图片、表题、图题的测试 md 文件导出,逐项核对样式是否正确关联。