$npx -y skills add XiaoMaColtAI/math-modeling-skill --skill docx创建、编辑、校验和转换 Word DOCX,支持数学建模论文模板、原生公式、三线表、修订和批注。
| 1 | # DOCX 工具 |
| 2 | |
| 3 | ## 路径与写入 |
| 4 | |
| 5 | - 当前目录为本工具根目录,只读。 |
| 6 | - 模板和脚本从本目录读取。 |
| 7 | - 生成或修改后的 DOCX 必须写入用户 `PROJECT_ROOT`。 |
| 8 | - 默认不覆盖输入文件或 Skill 文件。 |
| 9 | |
| 10 | ## 数学建模论文推荐流程 |
| 11 | |
| 12 | 采用“当届官方参考模板 + `python-docx` 构建 + OMML 公式 + OOXML 校验 + 渲染抽检”。官方模板控制页面、样式、分节、页眉页脚和编号;代码负责稳定写入内容。 |
| 13 | |
| 14 | ```python |
| 15 | from pathlib import Path |
| 16 | import sys |
| 17 | |
| 18 | scripts = Path("<SKILL_ROOT>") / "tools" / "docx" / "scripts" |
| 19 | sys.path.insert(0, str(scripts)) |
| 20 | import paper_format as pf |
| 21 | |
| 22 | doc = pf.new_document( |
| 23 | contest="cumcm", |
| 24 | template_path=Path("<PROJECT_ROOT>") / "当届官方模板.docx", |
| 25 | preserve_template_content=False, |
| 26 | ) |
| 27 | # 此示例只借用模板样式后追加正文。 |
| 28 | # 若官方模板包含固定摘要页或编号页,应改为 True 并在原位置填充。 |
| 29 | pf.title(doc, "论文题目") |
| 30 | pf.abstract_title(doc) |
| 31 | pf.body(doc, "摘要正文。") |
| 32 | pf.keywords(doc, "优化;预测") |
| 33 | pf.equation(doc, r"\min f(x)=\sum_{i=1}^{n}x_i^2") |
| 34 | pf.three_line_table(doc, [["符号", "说明"], ["x", "决策变量"]]) |
| 35 | pf.save_document(doc, Path("<PROJECT_ROOT>"), contest="cumcm") |
| 36 | ``` |
| 37 | |
| 38 | ## 公式 |
| 39 | |
| 40 | ### 直接写入 |
| 41 | |
| 42 | `scripts/equations.py` 把常用 LaTeX 子集转成 Word 原生 OMML。未知命令、未闭合分组和不支持环境会报错,不会静默生成错误文本。 |
| 43 | |
| 44 | ```powershell |
| 45 | python scripts/equations.py replace "输入.docx" ` |
| 46 | --replace "EQ_OBJECTIVE" "\min f(x)=\sum_{i=1}^{n}x_i^2" ` |
| 47 | --output "<PROJECT_ROOT>/输出.docx" |
| 48 | ``` |
| 49 | |
| 50 | 同一占位符出现多次时会全部替换。支持分式、上下标、根式、n 次根、常用希腊字母与关系符号、反三角函数和常见矩阵,包括 `\nu`、`\mu`、`\approx`、`\arcsin`、`\arccos`、`\arctan`。 |
| 51 | |
| 52 | ### 复杂公式 |
| 53 | |
| 54 | 复杂 LaTeX 优先使用 Pandoc 的成熟转换: |
| 55 | |
| 56 | ```powershell |
| 57 | python scripts/equations.py generate "论文.md" ` |
| 58 | --output "<PROJECT_ROOT>/论文.docx" ` |
| 59 | --template "官方模板.docx" |
| 60 | ``` |
| 61 | |
| 62 | 转换后仍须校验和渲染抽检。 |
| 63 | |
| 64 | ## 解包、校验与重打包 |
| 65 | |
| 66 | DOCX/XLSX 共用的 OOXML 基础工具只保留在 `scripts/office/`: |
| 67 | |
| 68 | ```powershell |
| 69 | python scripts/office/unpack.py "输入.docx" "<PROJECT_ROOT>/unpacked" |
| 70 | python scripts/office/validate.py "<PROJECT_ROOT>/输出.docx" |
| 71 | python scripts/office/pack.py "<PROJECT_ROOT>/unpacked" "<PROJECT_ROOT>/输出.docx" --original "输入.docx" |
| 72 | ``` |
| 73 | |
| 74 | 不要在不理解 OOXML 关系和内容类型的情况下直接修改压缩包。 |
| 75 | |
| 76 | ## 修订 |
| 77 | |
| 78 | ```powershell |
| 79 | python scripts/accept_changes.py "输入.docx" "<PROJECT_ROOT>/已接受修订.docx" |
| 80 | ``` |
| 81 | |
| 82 | 工具使用隔离的 LibreOffice 配置。超时、非零退出或残留修订标记都会失败,失败时不发布输出文件。 |
| 83 | |
| 84 | ## 批注 |
| 85 | |
| 86 | 先解包,再添加批注元数据和文档标记。父批注不存在或批注 ID 重复时,工具会在写入前失败。 |
| 87 | |
| 88 | ```powershell |
| 89 | python scripts/comment.py "<PROJECT_ROOT>/unpacked" 0 "批注意见" |
| 90 | python scripts/comment.py "<PROJECT_ROOT>/unpacked" 1 "回复意见" --parent 0 |
| 91 | ``` |
| 92 | |
| 93 | ## 必做验证 |
| 94 | |
| 95 | ```powershell |
| 96 | python scripts/check_env.py |
| 97 | python scripts/self_check.py |
| 98 | python scripts/office/validate.py "<PROJECT_ROOT>/完整论文.docx" |
| 99 | ``` |
| 100 | |
| 101 | 调用 `validate_paper_structure()` 检查官方前置结构、篇幅质量目标、公式/图/表数量、图表编号与正文引用、参考文献双向对应,并传入渲染后的实际页数。CUMCM 默认的 15000 字词单位和约 20 页只是质量目标;以 2026 年官方规范为例,正文不超过 30 页才是硬约束。结构校验后,把 DOCX 渲染成 PDF 或图片抽检分页、公式、表格、图片、页眉页脚和字体替换。 |