-
Notifications
You must be signed in to change notification settings - Fork 0
Citation Tools zh
人文写作伴侣在 scripts/ 里放了一套小工具,把 SKILL.md 中"工程化严谨"这条原则真正落到地上。逻辑很朴素:AI 自觉性是软规范,脚本是硬机制。 提示词可以承诺"我不编造引用",但承诺总有松动的时候——这时候,一个会去敲 Crossref 的脚本,能把漏网的幻觉逮个正着。
这套工具的设计是零依赖 / 低依赖:
- Python 脚本只用 Python 3 标准库——不需要
pip install任何东西。 - Shell 脚本只用
bash+grep——什么都不用装。 - 一切都失败安全:文件不存在、没有匹配,都返回一句友好提示,绝不甩你一脸报错堆栈。
这一页是三个引用脚本的上手教程,外加两个文风卫生脚本的简介。每个脚本都讲清楚:做什么、怎么跑(确切命令)、真实的输入输出示例,以及它该插在写作流程的哪个环节(也就是 skill 的 A–K 模式)。
开始之前:先
cd进你的 skill 仓库,下面的scripts/路径才能对上。Python 脚本拿来即用;shell 脚本第一次可能要加执行权限(见首次配置)。
| 脚本 | 干什么 | 离线可用? | 流程归属 |
|---|---|---|---|
citation-consistency.py |
找出全文引用格式的不一致 | ✅ 是 | 模式 B / 投稿前 |
citation-format-convert.py |
把 BibTeX 库转成 Chicago / MLA / APA 7 / GB/T 7714 | ✅ 是 | 模式 K 前 / 多期刊切换 |
citation-verify.py |
逐条引用对 Crossref 核查(抓 AI 幻觉) | ❌ 需联网 | 模式 B 后、模式 G 前 |
ai-trace-scan.sh |
标记 AI 套话与堆砌的连接词 | ✅ 是 | 模式 F / 模式 B 前 |
pending-checks.sh |
汇总项目里所有未完成的标记 | ✅ 是 | 开工时 / 投稿前 |
这个脚本读完整篇草稿,只问一个问题:你是不是在每个地方都用同一种方式引用? 它不是规范检查器——它不知道、也不在乎你遵循的是 APA 还是 Chicago,只盯"漂移":第一章用了半角括号、第三章却变成全角;这里 &、那里 和。
它会找五类不一致:
-
括号类型混用——半角
()vs 全角() -
引用内逗号混用——
,vs, -
多作者连接词不统一——
&/and/与/和/、 - 同一文献姓名形式不一致(一处用中文译名,另一处用英文原姓)
-
页码格式不统一——
p. X/p.X/第 X 页
python3 scripts/citation-consistency.py path/to/paper/main.md接收单个 Markdown 文件。可以对准你拼好的总稿,也可以一章一章地查。
假设 draft.md 里混了几种写法:
观点 A(Foucault,1975)与观点 B (Scott, 1986) 并列。
中文引用(张三和李四,2020,第 33 页)。
另见 (王五 & Smith, 2019, p.12)。运行:
python3 scripts/citation-consistency.py draft.md输出:
=== 引用格式一致性扫描 / Citation-format consistency scan · draft.md ===
引用统计 / Citation counts:英文形式 / English form (Author, year) 1 / 中文形式 / Chinese form (作者,年份) 2
⚠ 括号类型混用 / Mixed parenthesis types:少数派占比 / minority share 50.0%(建议全文统一为一种 / recommend unifying to one form throughout)
⚠ 多作者连接词不统一 / Inconsistent multi-author connectors:{'&': 1, '和': 1}
建议根据所选引用格式(APA 用 & / GB/T 7714 用 , 等)统一全文
Recommend unifying throughout per the chosen citation style (APA uses & / GB/T 7714 uses , etc.)
⚠ 页码格式不统一 / Inconsistent page-number formats:{'p.X (无空格 / no space)': 1, '第 X 页': 1}
共发现约 3 处需要审查的格式问题 / About 3 format issue(s) need review
如果文件本身很干净,它会报 ✅ 未发现明显的格式不一致 / No obvious format inconsistencies found。当括号/逗号的错配出现在同一行时,报告会精确指到那一行——比如 L3: 全角括号 + 半角逗号 → (张三, 2020)。
- 完成一章后的局部一致性检查。
- 投稿前的全文统一性核验(模式 B 与最终一遍)。
- 引入新文献后的回归检查——新引用恰恰是漂移最容易钻进来的地方。
这个脚本查的是一致性,不是规范性。它会很乐意地告诉你:你的引用"统一地错着"。要检查格式本身对不对(APA / Chicago / GB/T 7714),请对照 _writing-config/引用格式速查.md 手动核。另外,扫描是启发式正则,偶尔会误报——结果需要人眼复核。
你手上有个 BibTeX 库,目标期刊却指定了某种参考文献格式。这个脚本把你的 .bib 转成一份干净的文献表,四选一,都是人文学科真正在用的:
- Chicago Author-Date —— 历史与人文学科的主力
- MLA 9 —— 文学、语言学
- APA 7 —— 教育、心理、部分社科
-
GB/T 7714(顺序编码制) —— 中文期刊国标,连
[M]/[J]/[C]/[D]文献类型标识、四位以上作者的等截断都给你处理好
支持的 BibTeX 条目类型:@book、@article、@incollection、@inbook、@inproceedings、@thesis、@phdthesis。
# 打印到终端
python3 scripts/citation-format-convert.py refs.bib --to chicago
# 写到文件
python3 scripts/citation-format-convert.py refs.bib --to apa --out refs-apa.txt
# 选排序方式:author(默认)、year、key、input
python3 scripts/citation-format-convert.py refs.bib --to mla --sort year--to 必填(chicago | mla | apa | gb7714)。--out 可选——不写就输出到 stdout。格式有问题的条目会报到 stderr,绝不悄悄丢掉。
给定 refs.bib:
@book{foucault1975,
author = {Michel Foucault},
title = {Surveiller et punir},
year = {1975},
address = {Paris},
publisher = {Gallimard}
}
@article{scott1986,
author = {Joan W. Scott},
title = {Gender: A Useful Category of Historical Analysis},
journal = {The American Historical Review},
volume = {91},
number = {5},
pages = {1053-1075},
year = {1986}
}Chicago Author-Date:
python3 scripts/citation-format-convert.py refs.bib --to chicagoFoucault, Michel. 1975. *Surveiller et punir*. Paris: Gallimard.
Scott, Joan W.. 1986. "Gender: A Useful Category of Historical Analysis." *The American Historical Review* 91, no. 5: 1053-1075.
APA 7:
Foucault, M. (1975). *Surveiller et punir*. Gallimard.
Scott, J. W. (1986). Gender: A Useful Category of Historical Analysis. *The American Historical Review*, *91*(5), 1053-1075.
GB/T 7714(顺序编码制):
Foucault M. Surveiller et punir[M]. Paris: Gallimard, 1975.
Scott JW. Gender: A Useful Category of Historical Analysis[J]. The American Historical Review, 1986,91(5):1053-1075.
注意 GB/T 7714 的几个约定:[M] / [J] 文献类型标识、姓与名首字母之间不加逗号、以及紧凑的 年,卷(期):页码 定位格式。
- 投稿前准备最终参考文献表(目标期刊有特定格式要求时)。
- 在同一论文投不同期刊间切换——几秒钟重新生成整份清单。
- 模式 K(AI 使用披露)输出之前,让你的文献表先变成目标期刊的格式。
它不是 BibLaTeX / CSL 的替代品。那些引擎能建模每个期刊的特异性变体;如果你的工具链能用 BibLaTeX,就用那个。这个脚本服务的是"飞行中"场景——你手上有 .bib,现在就要给这家期刊出一份清单。还有两条诚实的限制:
- 每种格式背后都藏着一丛微妙规则和期刊特异性变体。永远要把输出和目标期刊的 style guide 对照着核,把它当草稿而非定稿。
- 它只生成参考文献表——不会碰你正文里的 inline 引用,那需要理解文档结构。
这就是那个抓幻觉的工具。它扫描 Markdown 草稿里每一条 inline 引用,逐一在公共 Crossref API 中核查存在性。它最拿手的,是编造的期刊文章引用——LLM 凭"记忆"虚构出来、长得人模人样的 (作者, 年份)。
它能解析多种风格的引用——Chicago/APA 作者-年份制 (Foucault, 1975, p. 23)、叙述式 Foucault (1975)、以及中文 (福柯, 1975)——再把每条归入三种判定:
- ✓ FOUND —— Crossref 有高置信度匹配(相似度 ≥ 0.85)。通常可信。
- ⚠ FUZZY_MATCH —— 近似但不完全匹配(0.5–0.85)。可能是拼写错、年份错,或不同的同名作者著作。需复核。
- ✗ NOT_FOUND —— Crossref 无匹配。警惕,但别慌(见下方边界)。
# 人类可读报告
python3 scripts/citation-verify.py path/to/draft.md
# 静默 + JSON,用于 CI 或程序处理
python3 scripts/citation-verify.py path/to/draft.md --quiet --json因为要发真实网络请求,它礼貌地限速到每秒 1 次——一个有 30 条引用的章节大约跑半分钟。默认会把进度打到 stderr;--quiet 关掉进度,--json 把人类报告换成机器可读输出。
给定一篇草稿,一条真引用、一条编造的:
Scott (1986) reframed gender as a category of historical analysis.
A later study (Hallor, 2018) supposedly extended this to digital archives.运行:
python3 scripts/citation-verify.py draft.md报告(节选):
=== Citation verification (Crossref) ===
Total citations parsed: 2
✓ Found: 1
⚠ Fuzzy match: 0 ← review
✗ Not found: 1 ← review (or may be off-Crossref humanities work)
## ✗ NOT FOUND in Crossref (1)
(Hallor, 2018)
No Crossref match for (Hallor, 2018). This may be a humanities work outside
Crossref coverage (monograph, archival, classics, dissertation,
foreign-language), or it may not exist. Manually verify.
## ✓ FOUND (1)
(Scott, 1986) → Gender: A Useful Category of Historical Analysis
DOI: 10.2307/1864376
=== Reminders ===
· NOT_FOUND is expected for monographs, archival sources, classics, dissertations,
and non-English-language works. ...
· This script catches the LLM-hallucination case (made-up journal articles).
For monograph citations, use the [VERIFY] / [待核对] marker workflow.
这里的 DOI 仅作示意;确切元数据是运行时从 Crossref 实时取回的。
- 模式 B(章节级审读)之后,模式 G(盲读核对)之前。
- 任何 AI 起草的章节(模式 C 输出后跑一遍)。
- 投稿前的最终合规检查。
这是整页最重要的一条提醒:Crossref 不索引一切。 一大片人文学术——小型大学出版社的专著、未翻译的外文著作、学位论文、档案史料、古典文献——干脆就不在 Crossref 里。对这些,NOT_FOUND 是预期结果,什么问题都不说明。
所以要结合语境读判定结果。这个脚本对期刊文章的幻觉极其敏锐(Crossref 的强项),而对一条 19 世纪专著的引用近乎无用。专著、档案、古典学的引用,正确的工具是 SKILL.md 里描述的 [VERIFY] / [待核对] 标记协议——靠人去翻书架。脚本和标记协议是配合使用的,不是二选一。
目录里还有两个 shell 脚本,守的是文字而不是引用。
扫描单个文件或整个项目目录,找 references/ai-trace-checklist.md 里登记的 AI 痕迹:高频套话("值得注意的是""综上所述""本文旨在"……)一旦出现就标记;连接词("此外""同时""另外"……)只在堆砌超过阈值(每文件 >3 次)时才标记。
./scripts/ai-trace-scan.sh path/to/chapter.md # 单文件
./scripts/ai-trace-scan.sh path/to/paper/ # 整个项目(递归,*.md)何时跑: 模式 F 修订完一章之后、模式 B 审读之前,以及完稿前的最后一遍。它只找出嫌疑——某句话是不是真要改,由作者定夺;有些"套话"在特定语境下是有意识的选择。
把项目里所有未完成的标记一网打尽,免得有东西漏进投稿:
| 标记 | 含义 | 优先级 |
|---|---|---|
[待核对] |
AI 凭记忆引用 / 未核实事实 | 🔴 投稿前必须清零 |
❓ 待讨论 |
需要作者决定的选择 | 🟡 推进时处理 |
[AI 草稿,待作者审阅] |
AI 起草、尚未审阅 | 🟢 审阅后删除标记 |
>>> |
AI 起草时不确定的地方 | 🔵 起草后立即处理 |
[作者微调] |
作者对 AI 建议的二次调整 | 🟣 回写到写作风格档案 |
./scripts/pending-checks.sh path/to/paper/ # 整个项目
./scripts/pending-checks.sh path/to/chapter.md # 单文件何时跑: 每次开工时(还有什么没完成?)、投稿前的最终清单,以及跨对话恢复时的状态摘要。
你应该已经注意到输出是双语的——每份报告都中英并排打印。这是有意为之:伴侣是个双语项目,你用哪种语言都能顺手。
你还会注意到,检测模式是刻意用中文的。 套话清单、待办标记、以及若干引用模式,都是针对中文学术文体调校的,因为这正是这套脚本想补上的缺口。引用脚本依然能很好地处理英文引用和英文 BibTeX——但 AI 套话扫描器尤其在中文写作上最为锋利。这是特性,不是疏漏。
Python 脚本什么都不用装——靠标准库就能跑。Shell 脚本第一次可能要加执行权限:
chmod +x scripts/ai-trace-scan.sh scripts/pending-checks.sh之后,这一页里的每个脚本都只差一条命令。
一个"何时用哪个"的心智模型:
-
模式 B(章节审读): 依次跑
ai-trace-scan.sh→citation-consistency.py→citation-verify.py。 -
模式 C(AI 起草): 任何 AI 起草的章节都过一遍
citation-verify.py,再用pending-checks.sh扫一扫。 -
模式 F(底稿修订): 每章改完跑
ai-trace-scan.sh。 -
模式 K(AI 使用披露)/ 多期刊投稿前: 用
citation-format-convert.py按目标期刊格式重新生成文献表。 - 投稿前: 全套——一致性、真实性、待办标记清零、套话复核,一个不落。
还有一条从 skill 设计原则直接来的诚实主线:这些脚本都明确说清"做什么"以及不做什么,正是为了不让你产生"全勾上了就没问题了"的虚假安心。它们负责标记,你负责决定。
humanities-writing-companion · CC BY-NC 4.0 · DOI 10.5281/zenodo.20280773 · by Shen Cong (沈聪)
📘 English
Guides
- Getting Started
- The 11 Working Modes
- Paper End-to-End
- Discipline Guides
- FAQ & Troubleshooting
- Citation & Writing Tools
About the project
📗 中文
指南
关于项目