文档格式规范器(Document Format Normalizer)
概述
统一 Word(.docx)文档正文的排版,同时保护封面、标题、目录、页眉页脚等非正文内容。默认规则:
- 中文字符 → 宋体
- 英文/数字 → Times New Roman
- 字号 → 小四(12pt)
- 行距 → 单倍
- 首行缩进 → 两个汉字
何时使用
当用户表达以下意图时触发:
- "规整格式""规范格式""统一格式"
- "把这个文档的正文字体/字号/段落整理一下"
- 提供一个 .docx 文件并要求按上述规范排版正文
正文 / 非正文的判定规则
脚本用启发式规则识别正文,只改正文,不动其他。满足以下任一条件的段落会被保护(跳过):
- 段落样式名包含:heading / 标题 / title / subtitle / 副标题 / toc / 目录 / caption / 题注 / header / footer / 页眉 / 页脚 / quote
- 段落居中对齐(通常是封面/标题)
- 段落字号 ≥ 15pt(约三号,通常是标题)
- 文本匹配
--protect-regex指定的正则(用于保护"只有视觉、没用标题样式"的标题) - 空段落
其余有文字的段落视为正文并重排。表格单元格内的段落也会按同样规则处理。
处理"没用标题样式的标题"
有些文档全篇都是 Normal 样式,标题仅靠人眼区分(例如"知识内容1: xxx""第一章 xxx""1.1 xxx")。
此时样式/居中/字号规则都无法识别,需用 --protect-regex 按文字规律保护。例如:
"$PY" "$SCRIPT" "文件.docx" --protect-regex "^(知识内容|知识点|第.{1,3}章|\d+(\.\d+)*[\s、.])"
先用 --dry-run 观察被保护清单是否符合预期,再正式执行。
使用方法
1. 确认环境(首次使用)
脚本依赖 python-docx。若未安装,用隔离环境安装一次:
# 创建隔离 venv(若已存在可跳过)
"C:/Users/WangZhenyu/.workbuddy/binaries/python/versions/3.13.12/python.exe" -m venv "C:/Users/WangZhenyu/.workbuddy/binaries/python/envs/default"
# 安装依赖
"C:/Users/WangZhenyu/.workbuddy/binaries/python/envs/default/Scripts/pip.exe" install python-docx
2. 运行(推荐先 dry-run 预览)
PY="C:/Users/WangZhenyu/.workbuddy/binaries/python/envs/default/Scripts/python.exe"
SCRIPT="C:/Users/WangZhenyu/.workbuddy/skills/document-format-normalizer/scripts/format_docx.py"
# 预览:只报告会改哪些、保护哪些,不写文件
"$PY" "$SCRIPT" "输入文件.docx" --dry-run
# 正式执行:默认生成 <文件名>_formatted.docx,绝不覆盖原文件
"$PY" "$SCRIPT" "输入文件.docx"
3. 常用参数
-o, --output:指定输出路径--size:正文字号 pt,默认 12(小四)--latin:英文字体,默认Times New Roman--cjk:中文字体,默认宋体--include-centered:连居中段落也一起改(默认跳过以保护封面/标题)--big-title-pt:大于等于该字号视为标题跳过,默认 15--protect-regex:文本匹配该正则的段落按标题保护(应对无标题样式的文档)--dry-run:只预览不落盘
工作流建议
- 先跑
--dry-run,把"重排段落数"和"被保护段落"清单给用户确认,重点核对被保护的是否确为封面/标题。 - 若发现有正文被误判保护(例如某段正文恰好居中),加
--include-centered或调高--big-title-pt后重跑。 - 正式执行后,用 present_files 展示生成的
_formatted.docx给用户。 - 原文件始终保留,输出为新文件,安全可回退。
注意事项
- 仅支持
.docx。若是旧版.doc,先另存/转换为.docx。 - 字体名"宋体""Times New Roman"必须准确,否则 Word 会回退到默认字体。
- 首行缩进用
firstLineChars=200(两字符),与字号无关,换字号也能保持两字缩进。