论文排版与格式自检
三件事:参考文献按 GB/T 7714-2015 自动生成、正文结构一次排好、
交稿前用自检器扫一遍格式违规。全部用 python-docx(纯 Python),脚本自包含、复制即跑。
能力边界
- 本技能负责:docx 的格式排版、参考文献条目生成、格式合规检查
- 本技能不负责:论文内容写作、查重降重、期刊投稿系统操作、PDF 转版(LaTeX)
5 分钟上手
复制这段就能跑:按学校规范设置样式 → 写两段正文 → 自动生成 3 条参考文献 →
跑格式自检输出合规报告。产物是真实的 docx。
# RUN: fixture=empty
# 依赖:pip install python-docx
import pathlib, re
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.oxml.ns import qn
from docx.enum.text import WD_ALIGN_PARAGRAPH, WD_LINE_SPACING
OUT = pathlib.Path("out_paper"); OUT.mkdir(exist_ok=True)
def set_cn_font(style, west, east, size_pt):
"""中英文字体要分开设:font.name 管西文,eastAsia 属性管中文。漏掉 eastAsia,
Word 里中文会显示成默认字体(通常是等线),这是论文排版第一大翻车点。"""
style.font.name = west
style.font.size = Pt(size_pt)
style._element.rPr.rFonts.set(qn("w:eastAsia"), east)
doc = Document()
# ---- 常见本科规范:正文宋体小四 1.5 倍行距首行缩进 2 字符,一级标题黑体三号 ----
normal = doc.styles["Normal"]
set_cn_font(normal, "Times New Roman", "宋体", 12)
normal.paragraph_format.line_spacing = 1.5
normal.paragraph_format.first_line_indent = Pt(24) # 小四 2 字符 = 24pt
h1 = doc.styles["Heading 1"]
set_cn_font(h1, "Times New Roman", "黑体", 16) # 三号
h1.font.color.rgb = RGBColor(0, 0, 0) # Word 标题默认蓝色,必须改黑
h1.paragraph_format.first_line_indent = Pt(0) # 标题不缩进
doc.add_heading("1 引言", level=1)
doc.add_paragraph("随着深度学习的发展,图像识别精度持续提升[1]。")
doc.add_paragraph("然而现有方法在小样本场景下表现受限[2],本文提出一种改进方案[3]。")
# ---- GB/T 7714-2015 参考文献页 ----
doc.add_heading("参考文献", level=1)
refs = [
"[1] 张三, 李四. 基于深度学习的图像识别研究[J]. 计算机学报, 2023, 46(5): 123-135.",
"[2] Wang X, Li Y. Few-shot learning revisited[J]. IEEE TPAMI, 2022, 44(9): 5678-5690.",
"[3] 王五. 机器学习理论与实践[M]. 北京: 清华大学出版社, 2021: 88-102.",
]
for r in refs:
p = doc.add_paragraph(r)
p.paragraph_format.first_line_indent = Pt(0) # 文献条目不缩进
path = OUT / "论文样例.docx"
doc.save(path)
# ---- 格式自检(完整版见 references/format-check.md,这里是核心四项)----
d2 = Document(path)
def east_of(style):
return style._element.rPr.rFonts.get(qn("w:eastAsia"))
checks = [
("正文中文字体", east_of(d2.styles["Normal"]), "宋体"),
("正文字号", d2.styles["Normal"].font.size.pt, 12),
("正文行距", d2.styles["Normal"].paragraph_format.line_spacing, 1.5),
("一级标题中文字体", east_of(d2.styles["Heading 1"]), "黑体"),
("一级标题字号", d2.styles["Heading 1"].font.size.pt, 16),
]
bad = [(k, v, w) for k, v, w in checks if v != w]
for k, v, w in checks:
print(f" {'PASS' if v == w else 'FAIL'} {k}: {v}(要求 {w})")
ref_ps = [p.text for p in d2.paragraphs if re.match(r"^\[\d+\]", p.text)]
assert len(ref_ps) == 3, f"参考文献应为 3 条,实际 {len(ref_ps)}"
assert all(re.match(r"^\[\d+\] .+\[\w+(/OL)?\]\.", r) for r in ref_ps), "条目不符合 GB/T 7714"
assert not bad, f"格式违规:{bad}"
print(f"\n自检通过:格式 5 项全合规,参考文献 3 条符合 GB/T 7714 → {path}")
主流程
第 1 步:拿到学校的格式规范原文
不同学校/期刊差异极大(标题编号方式、摘要页位置、行距、页码起始)。
先要规范文件,逐条转成检查项,而不是凭经验排——自检器(references/format-check.md)
的规则表就是为这个准备的,把规范逐条填进去即可。
不问就排的常见后果:按上所学校的模板排完,规范要求"三级标题宋体四号加粗"完全没体现,返工。
第 2 步:搭结构(封面 → 摘要 → 目录 → 正文 → 参考文献 → 附录)
分节与页眉页脚、目录域、题注交叉引用的完整脚本见 references/layout.md。
关键点:摘要用罗马页码、正文用阿拉伯页码从 1 开始——这必须用分节符 + 页码格式重启。
第 3 步:填参考文献(references/gb7714.md)
- 手上有 BibTeX → 直接转换;没有 → 按条目类型填参数自动生成
- 文中标注
[1]与文末列表的对应关系要检查(自检器会查编号连续性)
第 4 步:交稿前跑格式自检(references/format-check.md)
逐项输出 PASS/FAIL 清单。自检过了再交——格式不合规范的论文,导师第一眼就会打回。
常见坑
| 现象 | 原因 | 处理 |
|---|---|---|
| 中文显示成等线/宋体不生效 | 只设了 font.name(西文),没设 w:eastAsia |
用 set_cn_font 两个都设 |
| 标题是蓝色的 | Word 内置 Heading 样式自带主题蓝 | 显式 font.color.rgb = RGBColor(0,0,0) |
| 目录页码全是错的 | 目录是域,生成后没刷新 | 打开 Word 全选 → F9;或打印预览自动刷新 |
| 交叉引用显示「错误!未找到引用源」 | 题注被手动删除或编号被改成手打数字 | 题注必须用 SEQ 域,引用必须用 REF 域 |
| 每章页码不重新计数 | 没分节,或分节后没设「起始页码」 | 分节符 + pgNumType start=1 |
| 参考文献悬挂缩进错乱 | 手打空格对齐 | 用段落悬挂缩进(left_indent + first_line_indent 负值) |
| 行距「固定值 20 磅」设了没反应 | 行距类型没改,仍是倍数 | line_spacing_rule = WD_LINE_SPACING.EXACTLY |
参考文件
references/gb7714.md:GB/T 7714-2015 参考文献生成器(期刊/专著/学位论文/会议/网页/标准,
自动处理 3 位以上作者截断「等/et al」、文内标注与列表排序校验)references/layout.md:论文结构排版(封面/中英摘要/目录域/分节页眉/罗马与阿拉伯页码/
图表题注与交叉引用)references/format-check.md:格式自检器——规则表驱动的合规扫描,输出逐项 PASS/FAIL 清单