用 Markdown 写东西很爽,但交作业、交论文、交报告的时候,老师/期刊/甲方要的是 Word。

直接用 Pandoc 转一下?能转,但出来的 docx 打开一看:水平线是过时的 VML 矢量图、表格全贴在左边、代码块没有颜色、有些属性 Word 还会报兼容性警告。能用,但不好看。

于是就有了 M2W。几个月迭代下来,它已经从一个小工具长成了一个完整的服务——有了自己的名字 Folio,支持 Mermaid 流程图、可视化模板、开发者 API 和用户账户。

Folio 是什么

Folio(原名 M2W,Markdown → Word)是一个自部署的在线转换服务,底层是 Pandoc 引擎,上层包了一层精心调校的 DOCX 后处理。你在浏览器里写 Markdown,右侧实时预览,点一下就能下载一份排版精致的 .docx 文件。

在线体验:folio.mrwuliu.top

Folio 浅色主题界面
Folio 编辑器界面(浅色主题):左侧 Markdown 编辑,右侧实时预览

它解决了什么问题

Pandoc 是文档转换领域的瑞士军刀,功能强大,但它直接输出的 DOCX 有几个硬伤:

  1. 水平线丑——Pandoc 用的是已被废弃的 VML <v:rect> 矢量图形画水平线,在新版 Word 里显示异常。
  2. 表格不居中——表格默认紧贴页面左侧,学术论文里非常难看。
  3. 没有三线表——中文学术论文标配的「三线表」(上下粗线 + 表头下方细线,无竖线)Pandoc 做不到。
  4. 代码没颜色——代码块输出后是一片灰白,没有语法高亮。
  5. 兼容性警告——部分冗余的 OOXML 属性会触发 Word 的格式校验警告。

Folio 在 Pandoc 转完之后,额外跑了五步 OOXML 后处理,一次性解决以上全部问题。

核心功能

LaTeX 公式实时渲染

行内公式 $E=mc^2$ 和独立公式块都能写,编辑器里用 KaTeX 实时渲染,导出的 Word 里是真正的 LaTeX 公式(不是图片)。配合 pandoc-crossref,公式还能自动编号、用 \eqref{} 交叉引用,编号右对齐——这是后来专门针对学术排版补的细节。

LaTeX 公式实时渲染
编辑器中写 LaTeX,右侧即时渲染散度定理和高斯积分

Mermaid 流程图

这是近期加的重磅功能。在 Markdown 里写 ```mermaid 代码块,编辑器右侧会实时渲染出流程图、时序图、甘特图;导出 Word 时,这些图会被栅格化成高清 PNG(2x 设备像素比)嵌进文档。

背后的实现有点讲究:Folio 起了一个独立的 Chromium headless 渲染微服务,加载的 mermaid.min.js 和浏览器预览用的是同一份字节。这意味着「你在预览里看到什么样,导出的 Word 里就是什么样」——不会出现预览和导出位置漂移的问题。早期试过用 Rust 版的 mmdr,但它的布局算法和 mermaid.js 有出入,最终放弃了。

可视化模板引擎

以前要自定义 Word 样式,得手工编辑 reference.docx 里的 XML,门槛很高。现在 Folio 内置了一个可视化模板引擎:打开「模板设置」,就能像填表一样配置正文字体、字号、颜色、加粗/斜体,以及 H1–H6 每一级标题的样式;还能选代码主题(github-light、monokai 等)、行距、纸张大小(A4/Letter)。

配置好以后可以存成多个命名模板,一键切换,不用再碰任何 XML。模板会生成真正的 reference.docx 注入 Pandoc,同时驱动代码块的语法高亮配色。

深色 / 浅色主题

编辑器和预览区都支持深色、浅色、跟随系统三种主题。整个界面也换上了新的 Morandi 配色和 SVG logo。深夜写论文的时候,眼睛会感谢你。

Folio 深色主题界面
深色主题下的编辑器与预览

输出效果:Word 里长这样

这是转换后的 docx 在 Microsoft Word 里打开的样子——标题层级、正文、公式、代码块,排版干净。

转换结果在 Word 中打开
转换后的 DOCX 在 Microsoft Word 中打开

隐私模式:Pandoc 跑在你的浏览器里

这是我最喜欢的功能。点一下「离线模式」,Folio 会加载一份编译成 WebAssembly 的 Pandoc(pandoc-wasm),在浏览器的 Web Worker 里完成全部转换。你的文档内容不会离开你的设备,不会经过任何服务器。

更厉害的是,服务端那套五步 DOCX 后处理逻辑,用 JavaScript 完整重写了一遍(基于 JSZip),所以离线模式输出的 docx 和服务端输出的一模一样

其他特性

  • 实时预览——左侧编辑,右侧即时渲染标题、代码高亮、表格、公式、Mermaid 图。
  • 拖拽导入——直接把 .md / .markdown / .txt 文件拖进页面,自动加载内容。
  • 分页控制——工具栏一键插入分页符;开启「分页支持」后,Markdown 里的 --- 会变成真正的 Word 分页符。
  • 交叉引用——基于 pandoc-crossref,图表公式自动编号,中英文前缀自适应(图/表/公式 vs Figure/Table/Equation)。
  • 参考文献——支持上传 CSL 引用样式和 BibTeX 文献库,自动生成符合学术规范的参考文献列表。
  • 用户账户——注册登录后可以保存文档、跨设备同步设置,按分层享受不同的配额。

五步 DOCX 后处理:让输出「能看」

Pandoc 生成 docx 后,Folio 不是简单地修修补补,而是对 OOXML 做了一次完整的「单遍重写」——解压 docx(本质是个 zip),在一次读取、一次写入的过程中,按固定顺序依次完成五个变换:

  1. 水平线修正——把 Pandoc 那套废弃的 VML <v:rect> 替换成干净的 <w:pBdr> 段落底边框。
  2. 表格居中——给每个表格的 <w:tblPr> 注入 jc="center"
  3. 三线表——应用经典学术三线表样式:上下粗边框(sz=12)、表头下方细边框(sz=6)、垂直居中、无内部竖线。
  4. 代码着色——把 Pandoc 的约 30 种语法 token 类型映射到 GitHub Light 配色(关键字 #CF222E、字符串 #0A3069、注释 #6E7781……),代码块背景色 #F6F8FA
  5. 兼容性清理——剥离会触发 Word 校验警告的冗余属性(tblLookcnfStyledurableId 等)。

这五个步骤的顺序是有讲究的——水平线修正必须在表格处理之前,代码着色必须在兼容性清理之前。换一次 zip 就改完,高效且正确。

怎么用

网页版(最简单)

打开 folio.mrwuliu.top,在编辑器里写 Markdown,点转换,下载 docx。不需要注册,匿名就能用(有速率限制)。注册账户后可以保存文档、解锁更高的配额。

开发者 API

如果你想把转换能力接进脚本、CI/CD 或第三方应用,Folio 提供了一套完整的 RESTful 开发者 API(/v1/*),用 API Key 鉴权。在网页端「账户设置」里创建 Key(以 m2w_ 开头,每个账户最多 5 个),所有 /v1 响应都是统一的 {code, data, msg} 信封。

# 用 API Key 提交转换
curl -X POST https://folio.mrwuliu.top/api/v1/convert \
  -H "X-API-Key: m2w_xxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"text": "# Hello\n\nWorld", "crossref": true}'

# 轮询状态
curl https://folio.mrwuliu.top/api/v1/task/{task_id} \
  -H "X-API-Key: m2w_xxxxxxxx"

# 下载结果
curl https://folio.mrwuliu.top/api/v1/task/{task_id}/download \
  -H "X-API-Key: m2w_xxxxxxxx" -o output.docx

除了转换,/v1/docs 还能通过 API 管理 Markdown 文档(增删改查),/v1/me/v1/usage 可以查账户信息和用量配额(这两个是只读的,不消耗调用额度)。

每个 /v1 响应都会带上速率限制头,告诉你今天还剩多少额度:

X-RateLimit-Limit: 100
X-RateLimit-Remaining: 99
X-RateLimit-Reset: 1783267200

分层配额:Free 每天 20 次调用,Basic 100 次,Pro 500 次,Admin 不限。请求体支持 24 个字段,覆盖 Pandoc 的主要能力:目录深度、章节编号、交叉引用前缀、CSL/BibTeX 引用、自定义模板、附件嵌入等。

写在最后

Folio 起初是为了解决自己写论文时的痛点——脑子里想的是 Markdown,但交出去必须是 Word。Pandoc 能转,但转出来不好看;手动调格式又太累。于是花了几天时间,把 Pandoc 包了一层精心调校的后处理,又加了个浏览器端的离线模式。

后来它一点点长大:加上了 Mermaid 流程图、可视化模板引擎、给开发者的 API、用户账户和分层配额,也从 M2W 改名成了 Folio,换了一套更舒服的视觉。但核心没变——把 Markdown 干净漂亮地变成 Word。

如果你也经常在 Markdown 和 Word 之间反复横跳,不妨试试:folio.mrwuliu.top