毕业论文格式规范检测与修复
Overview
本 Skill 提供一套完整的毕业论文格式检测工作流,支持任意学校的撰写规范文档输入,自动化完成:规范解析 → 格式检测 → 问题诊断 → 自动修复 → 对比报告生成。
前置要求
- Python 3.7+
- 依赖库:
python-docx(必需),pywin32(仅 Windows 读取 .doc 格式时需要),lxml - 安装命令:
pip install python-docx lxml pywin32
核心工作流
Phase 1: 输入收集
收集以下信息:
- 规范文档(可选):学校的毕业论文撰写规范文件(支持 .doc / .docx / .txt / .pdf 格式)
- 论文文档:待检查的毕业论文 .docx 文件
- 输出目录:检查报告和修复文件的存放路径(默认与论文文件同目录)
规范来源优先级:
- ✅ 用户提供了规范文档 → 解析该文档,按院校规范执行检查和修复
- ✅ 用户未提供规范文档 → 使用本 Skill 内置的通用默认规范(见下方"通用格式检查清单"章节),基于 GB/T 7713.1-2006 等国标和多校通用惯例
注意:建议告知用户"当前使用通用默认规范,如需按特定院校规范检查,请提供学校官方的论文撰写规范文件"。
Phase 2: 规范文档解析
根据规范文档格式选择解析方式:
- .txt 文件:直接读取
- .docx 文件:使用 python-docx 提取文本
- .doc 文件(Windows):使用 pywin32 COM 接口转换
- .pdf 文件:使用可用的 PDF 提取工具
解析规范文档后,提取以下关键格式要求(参考 references/format_rules_template.md):
- 页面设置:页边距(上/下/左/右)、装订线、页眉距、页脚距
- 字体字号:各部分(封面/摘要/正文/标题/参考文献/致谢等)的中英文字体、字号、加粗/斜体
- 段落格式:对齐方式、首行缩进、悬挂缩进、行距、段前段后间距
- 页眉页脚:内容、字体、对齐、页码格式
- 标题格式:各级标题的字体字号、编号格式、段前段后
- 表格格式:三线表规则、边框粗细
- 图片格式:图题位置、字体字号
- 参考文献:著录格式(GB/T 7714)、缩进方式、文献标识
- 特殊部分:摘要、目录、致谢、附录的特殊格式要求
Phase 3: 论文格式全面检测
运行格式检测脚本 scripts/check_format.py 对论文文档进行全面扫描。检测脚本会输出以下信息:
- 页面设置信息(每个节的页边距、页眉页脚距、纸张方向)
- 文档样式定义(Normal、Heading 1-4、TOC 等关键样式)
- 段落详细格式(每个段落的样式、对齐、间距、缩进、字体信息)
- 表格格式信息(边框样式、粗细、对齐)
- 图片信息(尺寸、位置、上下文)
- 编号/列表定义
- 文档默认字体设置
执行方式:
python scripts/check_format.py <论文路径> <报告输出路径>
Phase 4: 问题诊断与分析
将检测报告与规范要求逐项比对,生成问题清单。每个问题包含:
| 字段 | 说明 |
|---|---|
| 位置 | 段落编号/节编号/表格编号 |
| 检查项 | 检查的格式属性 |
| 规范要求 | 对应的规范条款内容 |
| 当前值 | 论文中的实际值 |
| 严重程度 | 高/中/低 |
| 修复建议 | 具体的修复方案 |
严重程度分级标准:
- 高:页边距错误、标题字体字号错误、行距错误等影响整体排版的问题
- 中:缩进方式不当(固定厘米值 vs 字符单位)、段前段后间距缺失
- 低:需人工确认的内容性问题(参考文献格式、页眉横线等)
Phase 5: 自动修复
使用 scripts/fix_format.py 脚本模板自动修复可自动化的格式问题。
修复能力范围:
- ✅ 页面边距(上/下/左/右/页眉距/页脚距/装订线)
- ✅ 段落首行缩进(固定厘米值 → 字符单位)
- ✅ 段落悬挂缩进
- ✅ 段前段后间距
- ✅ 对齐方式(左/中/右/两端对齐)
- ✅ 字体设置(中文字体 + 西文字体 + 字号)
- ✅ 页眉内容和格式
- ✅ 表格三线表边框
- ✅ 标题字间距(如"参 考 文 献")
无法自动修复(需提示用户手动处理):
- ❌ 页眉横线(python-docx 限制)
- ❌ 参考文献编号内容(如添加 [1] [2])
- ❌ 目录更新(需在 Word 中操作)
- ❌ 图片/公式的精确位置调整
- ❌ 脚注格式
Phase 6: 对比报告生成
使用 scripts/generate_report.py(v5.0)生成修改前后对比报告(.docx 格式,A4 横向),包含:
- 报告标题:论文名称、修改日期、修改项数
- 对比表格(6列):序号 | 位置/定位 | 检查项 | 规范文档要求 | 修改前(原文件) | 修改后(已修复)
- 智能位置定位:
- 单个段落显示为"第N段"
- 多处同类修改合并显示范围"第88~394段(共166处)"
- 附带章节名称(如【研究背景和意义、国内外研究现状等】)
- 附带原文内容预览,便于快速定位修改位置
- 颜色区分:修改前红色文字、修改后绿色文字+绿色底纹
- 分类展示:按检查类别(页面设置/摘要/页眉/正文/参考文献等)分组,交替行背景色
- 修改统计:按分类显示已修复/总数,✅已完成 / ⚠️待确认
- 人工确认事项:列出无法自动修复的问题
- 修改依据:标注规范文档来源
两种调用接口:
create_report_from_records(output, title, subtitle, date, records)— ★推荐:从fix_format.repair_records自动生成,智能合并同类修改create_report(output, title, subtitle, date, total, categories)— 兼容v2.0:手动传入 categories
通用格式检查清单(默认规范)
以下为中国高校毕业论文常见的格式检查项,基于 GB/T 7713.1-2006 等国标和多校规范汇总。 当用户未提供规范文档时,按以下默认值执行检查和修复:
1. 页面设置(默认值)
- 纸张大小:A4 (210mm × 297mm)
- 页边距:上 2.8cm / 下 2.2cm / 左 3.0cm / 右 2.0cm
- 装订线:0mm(左侧)
- 页眉距:1.8cm
- 页脚距:1.4cm
2. 封面格式(默认值)
- 题目字体字号:三号黑体加粗,居中
- 学生信息字体字号:小四号宋体
- 对齐方式:居中
- 日期格式:中文格式
3. 摘要格式(默认值)
- "摘要"标题:三号黑体加粗,居中,字间 2 个汉字字距,段前段后各 1 行
- 摘要正文:小四号宋体/Times New Roman,首行缩进 2 字符,1.5 倍行距
- 关键词:"关键词"三字加粗,分号分隔,末尾无标点
- 英文摘要(Abstract)与中文摘要对应格式
4. 目录格式(默认值)
- "目录"标题:三号黑体加粗,居中,字间 2 个汉字字距
- 各级目录条目:小四号宋体
- 目录显示级数:3 级
5. 正文格式(默认值)
- 中文字体:小四号宋体
- 英文/数字字体:小四号 Times New Roman
- 行距:1.5 倍
- 首行缩进:2 字符
- 各级标题格式:一级 三号黑体 / 二级 小三号黑体 / 三级 四号黑体 / 四级 小四号黑体
6. 图表格式(默认值)
- 表格:一律三线表(上下粗线 1.5 磅,中间细线 1 磅)
- 图题:在图下方,五号宋体,居中
- 表题:在表上方,五号宋体,居中
- 续表标注
7. 参考文献(默认值)
- "参考文献"标题:三号黑体加粗,居中,字间加空格
- 著录格式:GB/T 7714-2015
- 文献类型标识:[M] [J] [D] [C] [P] [R] [S] [N] [EB/OL] 等
- 缩进方式:悬挂缩进 2 字符
- 字体:小四号宋体 / Times New Roman
8. 页眉页脚(默认值)
- 页眉内容:奇数页为论文题目,偶数页为学校名+论文类型(如有要求)
- 页眉字体字号:五号宋体 / Times New Roman,居中
- 页码格式:阿拉伯数字,底部居中
- 页眉横线:细线(0.5 磅)
9. 致谢/附录(默认值)
- 标题:三号黑体加粗,居中,字间加空格
- 内容字体字号:小四号宋体 / Times New Roman
- 段前段后间距:标题段前段后各 1 行
10. 其他规范性检查
- 标点符号规范(中文全角 vs 英文半角)
- 计量单位规范(国际单位制)
- 数字使用规范
- 缩写使用规范(首次出现写全称)
- 公式编号格式
- 脚注格式
- 中英文混排时的字体一致性
- 孤行控制(标题不在页末、段尾不在页首)
脚本设计注意事项
重要:在编写修复脚本时,必须注意以下问题,避免函数间的逻辑冲突。
1. 函数执行顺序与依赖问题
问题描述:多个修复函数之间存在隐式依赖,后执行的函数可能无法检测到已被修改的内容。
典型案例:
# 错误示例:fix_special_titles 先执行,修改了"参考文献"标题
def fix_special_titles(doc):
# 将 "参考文献" 改为 "参 考 文 献"(字间加空格)
...
def fix_references(doc):
# 用 '参考文献' in text 检测,但此时文本已被修改为 "参 考 文 献"
if '参考文献' in text and len(text) < 10: # 检测失败!
...
解决方案:
# 方案1:使用清理后的文本进行检测
clean_text = text.replace(' ', '')
if clean_text == '参考文献':
...
# 方案2:调整函数执行顺序,先检测再修改
# 1. 先执行需要检测原文本的函数(如 fix_references)
# 2. 再执行会修改文本的函数(如 fix_special_titles)
# 方案3:使用内置的 scripts/fix_format.py 函数,它们已处理好依赖关系
from fix_format import fix_page_setup, fix_special_titles, fix_references
2. 标题检测的精确性
问题描述:目录中可能包含类似标题的条目(如 致 谢\t43),导致误判。
典型案例:
# 错误示例:目录条目被误判为致谢标题
if '致谢' in text: # "致 谢\t43" 也包含 "致谢"
in_refs = False # 提前退出参考文献检测!
解决方案:
# 方案1:清理文本后精确匹配
clean_text = text.replace(' ', '').replace('\t', '')
if clean_text == '致谢' and len(text) < 15:
...
# 方案2:使用正则表达式匹配
import re
if re.match(r'^致\s*谢$', text.strip()) and len(text) < 15:
...
3. 修复记录的完整性
问题描述:修复操作没有添加到 repair_records,导致报告中缺少该类别。
典型案例:
# 错误示例:只修改,不记录
if para.alignment != WD_ALIGN_PARAGRAPH.CENTER:
para.alignment = WD_ALIGN_PARAGRAPH.CENTER # 没有调用 add_record
changes += 1
解决方案:
# 正确做法:每次修复都添加记录
if para.alignment != WD_ALIGN_PARAGRAPH.CENTER:
add_record('特殊标题', '对齐方式', location, text,
'居中', '非居中', '居中')
para.alignment = WD_ALIGN_PARAGRAPH.CENTER
changes += 1
4. 推荐的脚本结构
# 完整修复脚本模板
def main():
# 1. 初始化文档结构
init_structure(doc)
# 2. 按正确顺序执行修复(先检测后修改)
# 顺序:页面设置 → 段落格式 → 参考文献 → 特殊标题 → 页眉
fix_page_setup(doc) # 无文本依赖
fix_paragraph_indent(doc) # 依赖原文本
fix_references(doc) # 依赖原文本(必须在 fix_special_titles 之前)
fix_special_titles(doc) # 会修改文本
fix_header(doc) # 无依赖
# 3. 确保所有修复都有记录
print(f"修复记录数: {len(repair_records)}")
# 4. 生成报告
generate_report(...)
5. 调试技巧
# 在关键检测点添加调试输出
if '参考文献' in text.replace(' ', ''):
print(f" [参考文献] P{i}: 进入参考文献部分")
# 检查修复记录是否完整
for cat in ['页面设置', '特殊标题', '段落格式', '页眉', '参考文献']:
count = sum(1 for r in repair_records if r['category'] == cat)
print(f" {cat}: {count} 项")
关键技术要点
python-docx 缩进处理
重要经验:Word 文档中的首行缩进有两种单位:
- 固定厘米值(
firstLinein twips):不随字号变化,不同字号下显示效果不一致 - 字符单位(
firstLineChars):随字号自动调整,推荐使用
修复时应将固定厘米值转换为字符单位:
# 设首行缩进为 2 字符
ind.set(qn('w:firstLineChars'), '200') # 200 = 2字符 × 100
ind.set(qn('w:firstLine'), '480') # 配合值
Normal 样式继承
Normal 样式可能自带首行缩进。对于不需要缩进的段落(如居中标题),必须显式设置为 0,不能仅删除 <w:ind> 元素:
ind.set(qn('w:firstLine'), '0')
ind.set(qn('w:firstLineChars'), '0')
三线表实现
# 表级边框:上下粗线,无左右线,无内部线
# 标题行:通过单元格级别的 tcBorders 添加底部细线
页眉字体双重设置
页眉中文用宋体,西文用 Times New Roman,需要同时设置 w:eastAsia 和 w:ascii/w:hAnsi。
Resources
scripts/
check_format.py— v2.0 全面格式检测脚本,含 DocumentStructure 章节定位能力,扫描 docx 文件的所有格式属性fix_format.py— v2.0 格式修复脚本模板,包含各类fix_*函数,修复过程自动收集repair_records记录generate_report.py— v5.0 精简对比报告生成器(6列表格含位置/定位列,智能合并同类修改,颜色区分,A4横向)
references/
format_rules_template.md- 格式规则模板,用于结构化存储从规范文档解析出的格式要求common_issues.md- 常见格式问题汇总与修复方案(TOP 10 + python-docx 已知限制 + 修复优先级)
assets/
此 Skill 不包含静态资产文件。