Markdown 转 Word:Pandoc 与妙言导出

Markdown 写作约 7 分钟

把 Markdown 转成 Word,最稳的办法是 Pandoc,pandoc note.md -o note.docx 会把标题、列表、表格、代码和公式转成真正的 Word 结构,再用 --reference-doc 指定字体和样式。妙言 V4.5.0 不直接写 .docx,它的导出是 HTML、图片和 PDF,所以在妙言里要么导出 Word 能读或能粘贴的东西,要么对同一个笔记文件跑 Pandoc。图表、提示块和双链,两条路都需要手动处理一步。

Pandoc 这条路

pandoc note.md -o note.docx

在笔记所在的文件夹里运行,这样笔记引用的图片才找得到。Pandoc 手册说 --resource-path 默认是工作目录,只在 Pandoc 自己要找图片时才起作用,写 docx 就属于这种情况。图片在别处时用 --resource-path 列出文件夹,并且自己把 . 也写上,因为一旦设置了这个选项,工作目录除非列出来,否则不再被搜索。

粘贴进妙言的图片在笔记里写成 /i/name.png,前面带斜杠,Pandoc 会把它当成从磁盘根目录算起的路径,于是提示 Could not fetch resource,用图片的描述文字顶替图片。在笔记所在文件夹里转换时把这个斜杠去掉就行:

sed 's#](/i/#](i/#g' note.md | pandoc -f gfm -o note.docx

Pandoc 自己的 Markdown 已经能读管道表格、任务列表和删除线,按 GFM 读则是照 GitHub 的规则来,还会打开处理 > [!NOTE] 提示块的 alerts 扩展:

pandoc -f gfm note.md -o note.docx

手册把 gfm 描述为 GitHub-Flavored Markdown,不加的话 Pandoc 按它自己的 Markdown 方言读,和 GFM 大部分重叠,但并不完全一样。$...$ 公式两种读法都行,tex_math_dollars 扩展把两个美元符号之间的内容当作 TeX 公式,两种格式里它都是开着的。运行 pandoc --list-extensions=gfm 可以看到这个格式有哪些扩展,前面是 + 的表示默认开着。

格式从哪里来

Pandoc 不是从零画一份 Word 文档,而是把你的内容填进一份参考文档,外观来自这份文档的样式。手册列出了这些样式,段落样式有 Normal、Body Text、First Paragraph、Compact、Title、Author、Date、Heading 1 到 Heading 9、Source Code 和 Footnote Text,字符样式有 Verbatim Char 和 Hyperlink,表格样式只有一个叫 Table。

所以格式不在 Markdown 里,## 变成 Heading 2 段落,代码围栏变成 Source Code,它们长什么样由参考文档决定。公式也不会被丢掉,手册写明 docx 输出里的 TeX 公式会写成 OMML,也就是 Word 自己的公式格式,到了 Word 里是可以直接编辑的公式。

设置字体,尤其是中文

先取出默认的参考文档,在 Word 里改好,再传回去:

pandoc -o custom-reference.docx --print-default-data-file reference.docx
pandoc note.md -o note.docx --reference-doc=custom-reference.docx

用 Word 或 LibreOffice 打开 custom-reference.docx,改的是样式而不是示例文字,正文改 Normal 和 Body Text,标题改各级 Heading,代码改 Source Code。中文文档要把这些样式里的中文(东亚)字体也设上,不只设西文字体,因为一个样式可以给西文字符和中文字符分别指定字体,只改西文的话,中文还是样式原来的字体,和西文放在一起可能不协调。同一份参考文件对每篇笔记都适用,只需要做一次。

默认的 reference.docx 也带着页面大小和页边距,转出来纸张不对,就在参考文档里改一次。

走妙言的导出

妙言的文件 > 导出子菜单有 HTML、图片、PDF 和妙言 PPT PDF,没有一个是 Word 格式,也不能替代 Pandoc 去编辑,适合的情形是读的人要的是渲染后的样子,而不是可编辑文字。

  • PDF。 文件 > 导出 > PDF 把预览打印到固定的 A4 页面,保存在下载目录,对方只读,或者图表必须保持原样时用它,内容见 Mac 上把 Markdown 导出 PDF。
  • HTML。 文件 > 导出 > HTML 写出 标题.html,样式和脚本从妙言的 CDN 加载,本地图片的路径也指向那个 CDN,加载不出来,见 Markdown 转 HTML。可以用浏览器打开,选中内容再粘贴进 Word,但 Word 对粘贴进来的 HTML 保留多少并不固定,拿自己的笔记试一次再检查结果,能跟着过来的只有远程图片。
  • 图片。 写出整个预览的 PNG,更适合单张插图,不适合当文档。

哪些能保留,哪些会丢

笔记里的内容 经过 Pandoc 怎么处理
标题、列表、粗体、链接 变成 Word 样式 检查参考文档里的样式
表格 变成使用 Table 样式的 Word 表格 检查列宽和对齐
代码围栏 标了语言的围栏会高亮,在 docx 里用 Source Code 检查长行
$...$ 公式 写成 Word 公式(OMML) 点一下公式确认
Mermaid、PlantUML、Markmap 块 对 Pandoc 来说是带语言名的普通代码,不会画图 把图贴成图片
> [!NOTE] 提示块 加 -f gfm 时变成一行 Note 加正文的普通段落,用 Pandoc 自己的 Markdown 时是以 [!NOTE] 开头的引用 在 Word 里重新排版或改写
[[双链]] Pandoc 有 wikilinks_title_after_pipe 和 wikilinks_title_before_pipe 两个扩展 换成真正的链接,或者启用其一

图表方面,妙言在预览和 PDF 导出里会渲染 Mermaid 和 Markmap,一个可行的办法是从预览里截下图表,作为图片插入,Mermaid 源码仍留在笔记里;PlantUML 需要网络,预览要向 PlantUML 服务器取 SVG。

提示块的框会丢。妙言会把 > [!NOTE] 引用块渲染成带样式的提示块,Pandoc 手册说它的 alerts 扩展支持 GitHub 风格的 Markdown alert,--list-extensions 显示这个扩展在 gfm 里开着、在 Pandoc 自己的 Markdown 里关着。在 Pandoc 3.12.1 里,-f gfm 会把提示块变成一行 Note 加正文,都是 First Paragraph 样式,没有框也没有颜色,用 Pandoc 自己的 Markdown 则保留为以 [!NOTE] 开头的引用。

转完之后的检查

  1. 打开文件,在 Word 的导航窗格里看标题层级,跳级说明源文件里就跳了。
  2. 滚到每一张表和每一张图,图缺了说明 Pandoc 没找到文件,在笔记所在目录运行,或者设 --resource-path。
  3. 点一个公式,它应该是公式,如果是图片或者原样的美元符号,回头检查输入格式。
  4. 看第一页,笔记开头的 front matter 是元数据而不是正文,确认标题和作者是你要的样子。
  5. 搜 [!、[[ 和三个反引号,找出没转换的提示块、双链和代码围栏。
  6. 在 custom-reference.docx 里改一个样式,重新转换,确认整篇文档都跟着变。

Pandoc 的 raw 块可以往 docx 里插入 Word 专用的 XML,比如分页符,手册在 raw_attribute 扩展那一节给了例子,这个扩展在 Pandoc 自己的 Markdown 里开着、在 gfm 里关着,按 GFM 读时要写成 -f gfm+raw_attribute,Markdown 表达不了的版式细节可以这样控制。Markdown 本身能写什么,见 Markdown 语法速查 和 Markdown 里画 Mermaid 图。

常见问题

妙言能直接存成 .docx 吗?

不能,V4.5.0 导出 HTML、图片、PDF 和妙言 PPT PDF,要 docx 就对笔记文件跑 Pandoc。

为什么中文和英文看起来不是一个字体?

样式里西文和中文各指定了一个字体,在参考文档的样式里设置东亚字体。

需要装 LaTeX 吗?

转 docx 不需要,Pandoc 对 LaTeX 的依赖在它默认的 PDF 路径上,不在 Word 文件上。