Skip to main content

md-to-word

Featured in Chinese Indie Dev Ecosystem: Academic Research Skills Release License: MIT Python 3.9+

English | 简体中文

把 Markdown 编译成符合规范的 Word(.docx):学位论文、期刊论文、技术报告与公文。 排版规则写成一份可进 Git 的 requirements.txt,导出是确定性的——同一份稿子任何时候重跑, 产出逐字节一致;导出前有预检、导出后有对账,不合规就中止并指到行号。

两个前提:内容与排版分离(Markdown 是源,格式全部声明在要求文件里); AI 全流程代办(用户提需求,Agent 负责格式提取、稿件规范化与质量闭环)。


30 秒示例

你写的(demo/00_quickstart/hello.md,节选):

---
crossref:
  tbl-prefix: "表"
---

%% 文档标题 我的第一份规范 Word 文档

# 引言

这是一份最小样例:一页纸、二十二行 Markdown。中文首行缩进两个字符、西文用
Times New Roman、行距 1.5 倍、各级标题黑体——这些都不用你在 Word 里点。

# 一个三线表

%% 表题 **表 1** 三套样例的端到端导出耗时

| 样例 | 篇幅 | 稳定耗时 | 主要演示的排版要素 |
|:------|:--|:---|:--------------|
| 最小样例(本文) | 1 页 | 0.15 s | 中西文字体、首行缩进、多级标题、三线表 |
| 技术白皮书样例 | 5 页 | 0.30 s | 全网格数据表、APA 引用、单线极简页眉 |
| 学位论文样例 | 8 页 | 0.43 s | 目录、分节页码、双线章名页眉、跨页表头 |

你声明的(demo/00_quickstart/requirements.txt,节选):

纸张:A4
页边距:上2.54cm 下2.54cm 左2.54cm 右2.54cm
西文字体:Times New Roman

文档标题:黑体/Times New Roman 二号 加粗 不倾斜 居中 行距1.5倍 段前0磅 段后12磅 首行缩进0字符 无边框
一级标题:黑体/Times New Roman 三号 加粗 不倾斜 左对齐 行距1.5倍 段前12磅 段后6磅 首行缩进0字符 与下段同页
正文:宋体/Times New Roman 小四 不加粗 不倾斜 两端对齐 行距1.5倍 段前0磅 段后0磅 首行缩进2字符
表格:居中 三线表 线宽上1.5磅 线宽底1.5磅 线宽表头下0.75磅 单元格垂直居中
表头:宋体/Times New Roman 五号 加粗 不倾斜 居中 行距1.0倍 段前0磅 段后0磅 首行缩进0字符 跨页重复

你跑的:

md-to-word hello.md -r requirements.txt -o hello.docx

你得到的(约 0.2 秒,1 页):

最小样例的输出

中文首行缩进两个字符、西文 Times New Roman、三线表带表题表注——没有一步是在 Word 里点的。


安装

实现只有一份:Python 包 md-to-word。命令行、库调用、技能目录都是它的入口——技能目录整棵 vendor 这份源码,因此不装包也能跑。

用法 适合 安装 使用
命令行 本地导出、CI pip install md-to-word-docx md-to-word 稿件.md -o 输出.docx
Python 库 写脚本、接自有流程 同上 from md_to_word import export
AI 技能 让 Agent 代办、且不想装任何东西 用自包含的技能目录(整棵源码 + SKILL.md + references/),本仓库只发布引擎 「按学校的格式要求把这份稿子导出成 Word」

PyPI:pip install md-to-word-docx(PyPI 上 md-to-word 已被近似项目占用,包名多一个后缀; 装完的命令仍然是 md-to-word)。在源码检出里跑则是 pip install -r requirements.txt 之后用 python -m md_to_word。

更新:pip install -U md-to-word-docx(隔离环境用 pipx install / pipx upgrade,避免装进系统环境)。 实现与手册一起升级:完整词表、契约与门禁说明都在包内 manual.md,与代码同一个版本, 不存在"代码是新的、说明是旧的"。

依赖:python-docx、lxml、PyYAML、latex2mathml、citeproc-py,5 个纯 Python 包。 导出不需要任何外部二进制:没有 Pandoc,没有 Quarto,不调用 Word。--pdf 核对版才用到本机 Word(仅 macOS;不可用时自动跳过,不影响 .docx)。


用法

命令行:

md-to-word 稿件.md -o 输出.docx                     # 默认中文预设(zh-academic)
md-to-word 稿件.md --preset en-nature -o out.docx   # 英文期刊预设
md-to-word 稿件.md -r 格式要求.txt -o out.docx       # 指定格式要求文件
md-to-word --help                                   # 全部选项;帮助语言跟随稿件语种

退出码:0 完成;1 稿件、门禁或依赖问题;3 .docx 已写出但 --pdf 未渲染(非 macOS)。

md-to-word --contract 打印稿件契约速查(三条约定 + 样式名清单),并给出包内完整手册与内置预设 的真实路径——只装了包、手上一份文档都没有时,从这一条命令开始(英文加 --lang en)。 导出结果不符合预期时加 --verbose,会打印逐个样式套用的明细。

Python:

from md_to_word import export

result = export("稿件.md", "输出.docx", preset="zh-academic")
if not result.ok:            # ok = docx 已写出(--pdf 跳过不算失败)
    raise SystemExit("\n".join(result.errors))
print(result.output_docx)    # result.messages 是进度与提醒

AI 技能:把 Markdown 交给 Agent 并说明格式要求即可,例如「按某某大学研究生学位论文的 格式要求导出为 Word」。技能目录是自包含的(整棵源码 + SKILL.md + references/),不依赖 pip;Agent 在那边按 SKILL.md 走完格式提取、稿件规范化、模板生成与三道门禁。


能力与限制

支持 说明
页面与正文 纸张、页边距、装订线、文档网格、中西文字体、字号、行距、缩进、段距、对齐、颜色
标题与页眉页脚 六级标题、奇偶页/首页不同、页码格式与起始、分节、{页码} {总页数} {样式标题} 域
表格 三线表/全网格线/顶底线/无边框、线宽、表头跨页重复、单元格对齐与内边距、列宽比例
公式 原生 OMML、居中、编号靠右、按章编号、编号外观模板、@eq- 交叉引用
图与题注 图片宽度按版心钳制、题注与图同页绑定、图题在上一律由作者决定
文献 .bib + CSL,内置 29 份常用样式(GB/T 7714、APA、Nature、IEEE、Vancouver 等)
行内 加粗、斜体、删除线、下划线、上下标、行内代码、行内公式、链接、脚注
列表 有序、无序、嵌套三级、引用块内的列表
质量门禁 导前预检(契约、样式、引文)、导后防丢数、逐条样式对账

不支持(需在 Word 里补,或换一种写法):

做不到 原因与替代
定制封面页(校徽、填空栏、签署页) %% 文档标题 只生成一页标准标题区;封面在 Word 里并到首页,或用表格排一张简版
合并单元格、斜线表头、单元格底纹 Markdown 表格只有规则二维网格;按网格导出后在 Word 里合并
多栏混排、文字环绕的浮动图 单栏是唯一版式,图片走独立居中图段;环绕在 Word 里改
带编号公式里求和/积分的上下限上下排 Word 只有显示式才把上下限排到符号上下,带编号公式是行内公式;内容与符号正确,排法不同
行内文字颜色 颜色是样式属性,按样式行声明(颜色#1F4E79),不支持行内 {color=…}

完整词表与逐条原理见包内 manual.md(随 wheel 发布); 实现取舍见 references/design.md。


手上有现成的模板?

学校、期刊或单位下发的 .docx 不必逐条抄成要求文件。用包内的读取器反推一份草稿:

md-to-word-template 学校模板.docx -o 论文_requirements.txt

读出页面尺寸、页边距、页眉页脚距边界、页码格式与起始、各样式的中西文字体与字号、加粗倾斜、 对齐、行距(区分倍数/固定值/最小值)、段前段后、缩进(含字符单位)、段落下边框、表格边框与 表头行、页眉页脚内容与域。读不出的项列成待确认清单,不假装读到了。


仓库结构与文档路由

路径 读它做什么
src/md_to_word/resources/manual.md 使用手册:稿件契约、requirements.txt 完整词表、代办流程、门禁、能力边界、CSL 清单。随包发布
README.md / README_EN.md 是什么、怎么装、怎么跑
references/design.md 设计原理与故障排查(导出结果不符合预期时先看它 §2)
demo/ 四份样例:最小样例、中文学位论文、技术白皮书、英文期刊投稿
scripts/ 开发与验收工具(见 scripts/README.md)
src/md_to_word/ 实现本体:模型 → OOXML 写出器、样式生成、校验、对账
resources/ Word 365 底模与 29 份规范化 CSL 样式;manual.md 也在这里
presets/ 内置格式预设:zh-academic.txt(默认)、en-nature.txt

仓库里什么会发到用户机器上:src/(含 manual.md)、presets/、resources/ 与包元数据 (wheel 约 300 KB);tests/、demo/、scripts/、references/ 不进包——它们是仓库的验收面, 不是运行时的依赖。技能文档不在本仓库:自包含技能目录整棵 vendor 这里的源码,另有自己的 SKILL.md 与 references/。


实现了什么,借了什么

排版、编号、门禁、OOXML 写出都是本项目自己的代码。借用的只有两段有公开标准的部分: LaTeX 解析(latex2mathml)与 CSL 引文渲染(citeproc-py)。判据是:标准化的借,非标准化的自研。


许可

代码为 MIT。resources/csl/ 下的引文样式来自 citation-style-language/styles,按 CC BY-SA 3.0 使用; resources/pure_modern_base.docx 由本项目生成,随 MIT 发布。

Metadata

Release files for md-to-word-docx 2.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for md-to-word-docx 2.0.1
File Size Uploaded Provenance
md_to_word_docx-2.0.1.tar.gz 248.8 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for md-to-word-docx 2.0.1
File Interpreter ABI Platform
md_to_word_docx-2.0.1-py3-none-any.whl Python 3 none any Details

Total release size: 541.5 kB

Release files / md_to_word_docx-2.0.1.tar.gz

Download URL md_to_word_docx-2.0.1.tar.gz
Size 248.8 kB
Tags Source
SHA-256 checksum
How to use checksums
e8576eacf87f4878dbb8479066cdd40a6ceea5a547823e6a5d71d04a3916db5c
BLAKE2b-256 checksum
How to use checksums
81fbffe5491032eed4745ffc880bb808604af182da77b4cdd931fd580987d885
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.0

Release files / md_to_word_docx-2.0.1-py3-none-any.whl

Download URL md_to_word_docx-2.0.1-py3-none-any.whl
Size 292.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9b42e3fa1588c6bc4d0ed0bd63a6eb0d62917dba73859a6136d70ea56ea8c1d8
BLAKE2b-256 checksum
How to use checksums
10ea56b8c2410e753c3b2cff7aeae1b1a0dc6623944ecd4a84c44ebed6360ea0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.11.0

Security for md-to-word-docx 2.0.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page