通知发布格式规范排版
什么时候用
- 用户发来通知、通报、活动通知、公文
.docx,要求「按格式规范改一下」「统一格式」 - 需要把草稿排版成符合《关于进一步规范通知和公文发布工作的通知》的正式文本
- 需要检查一份通知是否符合格式规范
不适用于:论文、教案、PPT、非行政文书。
黄金流程(3 步)
# ① 环境(python-docx 缺失时执行一次;国内网络建议加清华源)
pip install python-docx
# pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-docx
# ② 路径(按实际安装位置调整;Windows 用 %USERPROFILE%\.workbuddy\skills\...)
PY=$(command -v python3)
SKILL=~/.workbuddy/skills/suda-tec-notice-format
# ③ 先看清楚原文结构,再动手
$PY $SKILL/scripts/inspect_docx.py "输入.docx"
# ④ 排版(默认另存为 原名_规范格式.docx,不覆盖原件)
$PY $SKILL/scripts/format_notice.py "输入.docx"
# 覆盖原件用 --inplace;指定路径用 -o 输出.docx
> 注意用 $SKILL 变量,别写成 <skill>——尖括号在 shell 里是重定向符,命令会直接失败。
改完必须用 inspect_docx.py 复核一遍(脚本会打印每段的行距/缩进/字体,肉眼扫一遍即可),再交付。
动手前先备份原版(例如复制到 修改前备份/)——--inplace 虽会自动备份,但另存模式不会。
格式参数表(权威,不要凭记忆改)
| 部位 | 字体 | 字号 | 对齐 | 行距 | 缩进 |
|---|---|---|---|---|---|
| 发文标题 | 方正小标宋_GBK | 二号 22pt | 居中 | 固定 30 磅 | 无 |
| 通知字号(如 商字〔2026〕XX号) | 宋体 | 四号 14pt | 居中 | 固定 30 磅 | 无 |
| 主送机关(各班级、各同学:) | 仿宋 | 16pt | 左 | 固定 29 磅 | 无,末尾全角冒号 |
| 正文 | 仿宋 | 三号 16pt | 左 | 固定 30 磅 | 首行缩进 2 字(32pt) |
| 一级标题「一、」 | 黑体 | 16pt | 左 | 固定 30 磅 | 首行缩进 2 字 |
| 二级标题「(一)」 | 楷体 | 16pt | 左 | 固定 30 磅 | 首行缩进 2 字 |
| 三级标题「1.」 | 仿宋 加粗 | 16pt | 左 | 固定 30 磅 | 首行缩进 2 字 |
| 四级标题「(1)」 | 仿宋 | 16pt | 左 | 固定 30 磅 | 首行缩进 2 字 |
| 附件说明「附件:1.xxx」 | 仿宋 | 16pt | 左 | 固定 30 磅 | 左空二字;正文下空一行;名称后不加标点 |
| 行文机构(落款) | 仿宋 | 16pt | 右对齐 | 固定 30 磅 | 无;正文下空三行 |
| 成文日期 | 仿宋 | 16pt | 右对齐 | 固定 30 磅 | 阿拉伯数字标全,月日不编虚位 |
| 表格 | 仿宋 | 16pt | 表格居中;短单元格居中,长文本/多行单元格左对齐 | 固定 30 磅 | 表格样式清为 Normal Table + 逐格写死黑色四边框线(sz=6)、表头加粗、列宽按内容长度比例分配 |
- 所有西文与数字:ascii/hAnsi 一律 Times New Roman(只写
font.name不够,必须写w:rFonts的w:eastAsia) - 字体名一律不带 GB2312 后缀:正文写
仿宋、二级标题写楷体。规范原文写「3号仿宋-GB2312」,但学校通知系统按字体名精确匹配,带后缀会匹配不到而回退成别的字体(详见「常见坑」)。发文标题的方正小标宋_GBK是方正官方字体全名,保留后缀;若发布系统也识别不了,把脚本顶部XBS改成方正小标宋再跑一次。 - 层次序数只能是「一、」「(一)」「1.」「(1)」,禁止写成「1、」
- 页边距沿用原文(本项目惯例:左右 1.25in、上下 1in),规范未强制,不要自作主张改
规范原文的两处自相矛盾(按下面口径执行)
- 一级标题加不加粗:「通知格式规范」未提,「公文版式规范」明确写「黑体,16号字,不加粗」。→ 不加粗(黑体本身已够醒目)。若用户此前的旧文件用的是加粗,主动提示差异并问是否要统一。
- 二级标题加粗:「通知格式规范」写加粗,「公文版式规范」写不加粗。→ 通知类文档加粗(脚本默认加粗,
--l2-bold/--no-l2-bold可切换)。
内容层面的常见问题(脚本不自动改,跑完要人工扫一眼并提示用户)
- 一级标题序号断档:只写到「四、」后面就变成光秃秃的「活动形式」「报名要求」——很常见。按出现顺序补齐「五、六、七…」再跑脚本(否则这些段不匹配
^[一二三四五六七八九十]+、,会被当成正文刷成仿宋)。 - 正文提到「附件1」却没有附件说明:按规范应在正文下空一行左空二字补「附件:1.XXX」,名称后不加标点。
- 年级写法:「26级」这类口语写法,正式通知建议写「2026级」(属内容判断,先问用户再改)。
- 日期与星期是否对得上:用
date -j -f "%Y-%m-%d" "2026-10-14" "+%A"快速核对。 - 表格里的半角连字符(如「第2-4名」)规范未强制,保留原样即可。
必须提醒用户的两个人工项(脚本做不了)
- 通知字号必须是准确值,脚本不推断、不猜测。处理方式只有两种:
- 文档里已有字号行 → 原样保留其前缀和编号,一个字不改;只有缺编号时才补XX占位并提示
- 文档里没有字号行 → 不自动生成,只提示「请人工补 X字〔YYYY〕N号」
正确做法是问使用者要本单位的已备案字号和编号,或在原稿里查到后直接写入。格式为 X字〔YYYY〕N号(如 商字〔2026〕12号)。
2. 成文日期、主送机关、落款单位名称属于内容判断,脚本只排版不改,需用户确认。
常见坑(都踩过)
- 段落索引 ≠ body 子元素索引:文档里只要有
w:tbl,d.paragraphs的序号就会前移。本 skill 的脚本用正则自动分类,规避了这个问题;手写脚本时千万别用硬编码下标。 - 中文字体不生效:
run.font.name = '仿宋'只改 ascii/hAnsi。必须rFonts.set(qn('w:eastAsia'), ...)。 - 空段落没有 run:改字体前要先
p.add_run(""),否则改不动。 table.alignment要用WD_TABLE_ALIGNMENT.CENTER,不是WD_ALIGN_PARAGRAPH.CENTER。- dxa → EMU:1 dxa = 635 EMU。
- 表格框线的三条铁律(复制到网页通知栏 / OA 才有边框,缺一条都不行):
1. 清掉w:tblStyle——最常见的元凶。Table Grid/网格型这类内置样式把边框定义在styles.xml里,Word 复制到剪贴板时输出<table class="MsoTableGrid">加一段<style>块,网页编辑器普遍剥掉<style>块和 class 引用,边框就整个没了。删掉样式 = 回到 Normal Table。
2. 不写表格级w:tblBorders——表格级框线在 HTML 里落到<table border=...>属性上,同样会被过滤。
3. 逐格写w:tcBorders,颜色明确写000000(不要auto)——单元格上的直接格式会导出成<td style="border:...">行内样式,行内样式过得了过滤,边框才留得住。
脚本已内置(normalize_table_borders),合并单元格续格与嵌套表格都覆盖。用 inspect_docx.py 看「表格样式 / 表格级框线 / 逐格框线 / 边框色」四项全 ✓ 才算数。
实测对照:可用样张 = Normal Table + 无 tblBorders + 逐格 tcBorders;失败样本 = Table Grid + 有 tblBorders + 0 处 tcBorders。
若表格靠样式做了底纹/配色且必须保留,加 --keep-table-style,代价是粘贴后可能没边框。
- w:tblPr / w:tcPr 的子元素有严格顺序:tblBorders 必须在 tblInd 之后、shd/tblLayout/tblLook 之前;tcBorders 必须在 tcW/vMerge 之后、shd/tcMar/vAlign 之前。直接 append 到末尾会让 Word 报「文件内容有问题」。脚本的 _sort_children 按规范顺序整体重排,源文档自带的脏顺序(如 w:jc 被写在最后)也一并理顺。
- 字体名绝不带 GB2312 后缀:正文 仿宋、二级标题 楷体。规范原文写「3号仿宋-GB2312」,但学校通知系统(PU 平台 / 官网 CMS)按字体名精确匹配,仿宋-GB2312 / 仿宋_GB2312 匹配不到就会回退成系统默认字体,正文显示成别的字体。脚本每次排版都会自动清洗全文档(含表格和样式定义)里残留的 仿宋_GB2312 / FangSong_GB2312 / 楷体_GB2312 等变体——旧文档重跑一次即可修正,不需要手工替换。
- 本机缺规范字体时显示成替代字体:脚本写入的是字体名,机器没装对应字体就会出现回退。Windows/WPS 通常自带仿宋/楷体/黑体/方正小标宋;macOS 若缺,可装开源 Fandol 字库并改名为规范名后放入 ~/Library/Fonts,或直接用 WPS 打开。注意区分:本机显示回退 ≠ 文档有问题,发布到装了规范字体的机器上就是对的。
交付前自检清单
- [ ] 标题二号方正小标宋、居中;字号四号宋体、居中
- [ ] 主送机关 29 磅、全角冒号
- [ ] 正文全部 3 号仿宋、首行缩进 2 字、30 磅
- [ ] 全文搜不到
GB2312字体名(正文应是干净的「仿宋」,不是「仿宋-GB2312」) - [ ] 一级标题黑体(不加粗)、三级标题加粗
- [ ] 数字/英文是 Times New Roman
- [ ] 落款及日期右对齐,正文下空三行
- [ ] 表格仿宋三号、列宽合理(长文本列不被挤扁)、表头加粗
- [ ] 表格体检四项全 ✓:表格样式 Normal Table / 表格级框线无 / 逐格框线 N/N / 边框色 000000(复制到网页通知栏才有框线)
- [ ] 通知字号已填真实编号(不是 XX)
- [ ] 原版已备份到
修改前备份/
已知边界(脚本做不到,别硬指望)
- 不会自动补一级标题序号:序号断档要靠人补(见上文)。做成自动有把正文误判成标题的风险,宁可人工。
- 附件说明前的「空一行」、落款「右空二字」未实现(规范未强制,且各学院习惯不同)。
- 不处理页眉/页脚/页码,不改页边距,不转换
.doc(需先另存为.docx)。 - 只做排版,不做内容校对(事实、数字、联系人等仍需人来核)。
文件
scripts/format_notice.py— 主脚本,自动识别段落角色并套用上表参数,同时规范化表格(逐格写死框线)与少量标点scripts/inspect_docx.py— 结构体检:逐段打印对齐/缩进/行距/字体 + 表格框线覆盖情况,排版前后都用它references/format-spec.md— 规范原文要点 + 通知字号填写要求(不含任何部门名单)