mcpField
P
paper-write

paper-write

github.com/wanshuiyin文档处理18.2k547 次安装4 天前更新
代码仓库

关于 paper-write

paper-write 是面向研究者的 LaTeX 论文分节撰写技能,依据研究叙述、论文计划、图表和文献生成论文项目。它包含会议与 IEEE 格式设置,并通过 DBLP/CrossRef 获取文献条目。

主要功能

  1. 01按论文计划生成 LaTeX 分节
  2. 02适配会议及 IEEE 模板
  3. 03整合图表、公式和引用
  4. 04从 DBLP/CrossRef 获取 BibTeX
  5. 05备份项目并清理过期分节

适用场景

  1. 01将研究叙述整理为完整论文草稿
  2. 02按目标会议格式建立论文目录
  3. 03根据证据缺口标记待补内容

MCP 相关

该技能为每个评审环节解析评审路由,并可使用 Codex MCP 进行分节评审;它本身不是 MCP 服务。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/wanshuiyin/auto-claude-code-research-in-sleep --skill paper-write

安装后在 Claude Code 中输入/paper-write确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

templates/
iclr2026.tex
icml2025.tex
ieee_conference.tex
ieee_journal.tex
IEEEtran.bst
IEEEtran.cls
math_commands.tex
neurips2025.tex

详细介绍

论文撰写:逐节生成 LaTeX

每次审稿人审核前,请遵循 可选审稿人: 依次解析调用 → .aris/reviewer.json → 默认使用 Claude Code(Codex MCP), 并通过规范的辅助解析器使用 reviewer_route.py,同时保留此审核环节的 层级、新鲜上下文、源文件/图像输入和确定性关卡。 下方的 Codex 示例/固定配置仅适用于 backend=codex;其他路由使用各自的 首次调用/回复约定。保存路由和实际返回的身份;不可用的选项记为 REVIEW_UNAVAILABLE。根据实际的类别/完成状态/范围对验收情况进行分类。 将调用时指定的审稿人/模型/工作量覆盖参数传递给包含审稿人的子任务。 生成工作进程保持不变。

根据以下内容起草一篇 LaTeX 论文:$ARGUMENTS

常量

  • REVIEWER_MODEL = gpt-6-astra — 通过 Codex MCP 用于章节审稿的模型。对于 backend=codex,请使用 OpenAI 模型。
  • TARGET_VENUE = ICLR — 默认会议。支持:ICLR、NeurIPS、ICML、CVPR(也包括 ICCV/ECCV)、ACL(也包括 EMNLP/NAACL)、AAAI、ACM(ACM MM、SIGIR、KDD、CHI 等)、IEEE_JOURNAL(IEEE Transactions / Letters,例如 T-PAMI、JSAC、TWC、TCOM、TSP、TIP)、IEEE_CONF(IEEE 会议,例如 ICC、GLOBECOM、INFOCOM、ICASSP)。此项决定样式文件和格式。
  • ANONYMOUS = true — 若为 true,使用匿名作者栏。用于最终定稿时设为 false。注意:大多数 IEEE 会议不采用匿名投稿,IEEE 会议请设为 false。
  • MAX_PAGES = 9 — 正文页数上限。对于机器学习会议:从首页计算至结论章节结束,不包括参考文献和附录。对于 IEEE 会议:参考文献计入页数上限。 常见页数上限:IEEE 期刊没有严格限制(但 Transactions 通常为 12–14 页,Letters 通常为 4–5 页),IEEE 会议为 5–8 页,包含参考文献。
  • DBLP_BIBTEX = true — 从 DBLP/CrossRef 获取真实的 BibTeX,而非由大模型生成条目。这可避免引用内容幻觉,且无需安装。设为 false 可使用旧版行为(由大模型搜索 + [VERIFY] 标记)。

输入

  1. PAPER_PLAN.md — 包含论点-证据矩阵、章节计划和图表计划的大纲(来自 /paper-plan)
  2. NARRATIVE_REPORT.md — 研究叙述(主要内容来源)
  3. 生成的图表 — figures/ 目录中的 PDF/PNG 文件(来自 /paper-figure)
  4. LaTeX 包含文件 — figures/latex_includes.tex(来自 /paper-figure)
  5. 参考文献 — 现有的 .bib 文件,或新建一个

如果不存在 PAPER_PLAN.md,请让用户先运行 /paper-plan,或提供简要大纲。

Orchestra 指导的写作补充

保留现有的 insleep 工作流、文件布局和默认设置。仅在有助于提升写作质量时使用以下共享参考资料:

  • 起草摘要、引言、相关工作,或文字显得笼统时,请先阅读 ../shared-references/writing-principles.md。
  • 在最终撰写和投稿就绪检查期间,请阅读 ../shared-references/venue-checklists.md。
  • 仅当内置的 DBLP/CrossRef 工作流无法满足需求时,才阅读 ../shared-references/citation-discipline.md。

这些参考资料是辅助材料,不会增加额外的工作流阶段。

可选:风格参考(— style-ref: <source>,选择启用)

让用户引导结构风格(章节排序、定理密度、句子节奏、图示密度、参考文献风格),使其贴近参考论文。默认关闭——如果用户没有传入 — style-ref,则与之前相比不做任何改变。

只有当 $ARGUMENTS 中出现 — style-ref: <source> 时,才先运行辅助程序,再开始起草:

# Resolve $STYLE_HELPER via the canonical strict-safe chain (see
# shared-references/integration-contract.md §2). Policy A — gate:
# unresolved helper means --style-ref cannot be satisfied, so abort.
cd "$(git rev-parse --show-toplevel 2>/dev/null || pwd)" || exit 1
if [ -z "${ARIS_REPO:-}" ] && [ -f .aris/installed-skills.txt ]; then
    ARIS_REPO=$(awk -F'\t' '$1=="repo_root"{print $2; exit}' .aris/installed-skills.txt 2>/dev/null) || true
fi
if [ -z "${ARIS_REPO:-}" ] && [ -f "$HOME/.aris/repo" ]; then
    ARIS_REPO=$(cat "$HOME/.aris/repo" 2>/dev/null) || true
fi
STYLE_HELPER=".aris/tools/extract_paper_style.py"
[ -f "$STYLE_HELPER" ] || STYLE_HELPER="tools/extract_paper_style.py"
[ -f "$STYLE_HELPER" ] || { [ -n "${ARIS_REPO:-}" ] && STYLE_HELPER="$ARIS_REPO/tools/extract_paper_style.py"; }
[ -f "$STYLE_HELPER" ] || {
  echo "ERROR: extract_paper_style.py not resolved at .aris/tools/, tools/, \$ARIS_REPO/tools/, or via ~/.aris/repo." >&2
  echo "       Fix: rerun bash tools/install_aris.sh or smart_update.sh (refreshes ~/.aris/repo), export ARIS_REPO, or copy the helper to tools/." >&2
  echo "       --style-ref cannot be satisfied; aborting." >&2
  exit 1
}
STYLE_STATUS=0
CACHE=$(python3 "$STYLE_HELPER" --source "<source>") || STYLE_STATUS=$?
case "$STYLE_STATUS" in
  0) ;;                                       # use $CACHE/style_profile.md as structural guidance
  2) echo "warning: style-ref skipped (missing optional dep)" >&2 ;;
  3) echo "error: --style-ref source failed; aborting draft" >&2 ; exit 1 ;;
  *) echo "error: helper failed unexpectedly; aborting draft" >&2 ; exit 1 ;;
esac

可接受的来源:本地 TeX 目录/文件、本地 PDF、arXiv 编号(2501.12345 或 arxiv:2501.12345)、http(s) URL。拒绝 Overleaf URL 和项目 ID——请先通过 /overleaf-sync setup <id> 克隆,然后传入本地克隆路径。

严格规则(完整约定见 tools/extract_paper_style.py 文档字符串):

  • 仅将 style_profile.md 用作结构指导。匹配章节数量、章节排序倾向、定理环境密度、图注长度分布、句子节奏、数学公式展示比例和引用风格。
  • **绝不从缓存中可访问的任何内容复制文字、论断、示例或术语。**此配置文件有意采用汇总形式;如需实质内容,请使用用户自己的提纲。
  • **绝不向审阅者/审计员子 Agent 传递 — style-ref(或缓存内容)。**跨模型审查独立性(../shared-references/reviewer-independence.md)要求审阅者只能看到产出内容和用户提示词,不能看到作者的风格背景。
`` 标记(存在 GAP_REPORT.md 时)

如果 /paper-plan 使用 — style-ref: 运行,它会在 PAPER_PLAN.md 旁生成 GAP_REPORT.md。此文件列出示例论文暗示、但用户没有证据支撑的结构性槽位(消融表、扩展实验、失败案例分析等)。

当 GAP_REPORT.md 存在,且某个章节槽位的分类为 status: missing 时:

  1. 不要编造数值结果、图表引用或定性论断来填补该槽位。

  2. 在缺失内容应出现的准确位置输出 HTML 注释占位符:

  3. 槽位 ID 和单行描述必须直接取自 GAP_REPORT.md。**绝不编造槽位 ID。**绝不将描述改写得比报告更肯定。

  4. 此标记特意使用 HTML 注释,使其在渲染后的 PDF 中不可见,但可通过 grep -r "DATA_NEEDED" sec/ 搜索,以供人工分流/后续 /experiment-bridge 处理。

  5. 对于 status: partial,写出用户已有的内容,并在同一段的缺口处输出 ``(不要拆分章节)。

**“不使用占位符”规则的例外。**默认的 /paper-write 规范(不使用“见补充材料”或“TBD”之类的占位符)仍然适用于所有内容,GAP_REPORT 列出的缺失槽位除外。此标记是呈现真实证据缺口、同时不损害论断可信度的合理方式。

创意来源:@zhangpelf,见 #217。

模板

会议专用设置

此技能在 templates/ 中包含会议模板。请根据 TARGET_VENUE 选择:

ICLR:

\documentclass{article}
\usepackage{iclr2026_conference,times}
% \iclrfinalcopy  % Uncomment for camera-ready

NeurIPS:

\documentclass{article}
\usepackage[preprint]{neurips_2025}
% \usepackage[final]{neurips_2025}  % Camera-ready

ICML:

\documentclass[accepted]{icml2025}
% Use [accepted] for camera-ready

IEEE 期刊(Transactions、Letters):

\documentclass[journal]{IEEEtran}
\usepackage{cite}  % IEEE uses \cite{}, NOT natbib
% Author block uses \author{Name~\IEEEmembership{Member,~IEEE}}

IEEE 会议(ICC、GLOBECOM、INFOCOM、ICASSP 等):

\documentclass[conference]{IEEEtran}
\usepackage{cite}  % IEEE uses \cite{}, NOT natbib
% Author block uses \IEEEauthorblockN / \IEEEauthorblockA
项目结构

生成以下文件结构:

paper/
├── main.tex                    # master file (includes sections)
├── iclr2026_conference.sty     # or neurips_2025.sty / icml2025.sty / IEEEtran.cls + IEEEtran.bst
├── math_commands.tex           # shared math macros
├── references.bib              # bibliography (filtered — only cited entries)
├── sections/
│   ├── 0_abstract.tex
│   ├── 1_introduction.tex
│   ├── 2_related_work.tex
│   ├── 3_method.tex            # or preliminaries, setup, etc.
│   ├── 4_experiments.tex
│   ├── 5_conclusion.tex
│   └── A_appendix.tex          # proof details, extra experiments
└── figures/                    # symlink or copy from project figures/

章节文件可灵活调整:如果论文计划有 6-8 个章节,请创建相应文件(例如 4_theory.tex、5_experiments.tex、6_analysis.tex、7_conclusion.tex)。

工作流

步骤 0:备份并清理

如果 paper/ 已存在,请先备份至 paper-backup-{timestamp}/,再进行覆盖。绝不要悄悄销毁现有成果。

**重要:清理过时文件。**更改章节结构时(例如从 5 个章节改为 7 个章节),请删除 main.tex 中不再引用的章节文件。过时文件(例如结论移至 7_conclusion.tex 后遗留的旧 5_conclusion.tex)会造成混淆并浪费空间。

步骤 1:初始化项目
  1. 创建 paper/ 目录
  2. 从 templates/ 复制会议模板 — 该模板已包含:
    • 所有标准软件包(amsmath、hyperref、cleveref、booktabs 等)
    • 定理环境,以及修复 \crefname{assumption} 的设置
    • 匿名作者信息块
  3. 根据论文的具体符号生成 math_commands.tex
  4. 创建与 PAPER_PLAN 结构相对应的章节文件

作者信息块(匿名模式):

\author{Anonymous Authors}
步骤 2:生成 math_commands.tex

根据论文的符号创建共享的数学宏:

% math_commands.tex — shared notation
\newcommand{\R}{\mathbb{R}}
\newcommand{\E}{\mathbb{E}}
\DeclareMathOperator*{\argmin}{arg\,min}
\DeclareMathOperator*{\argmax}{arg\,max}
% Add paper-specific notation here
步骤 3:撰写各章节

按顺序处理各章节。对于每个章节:

  1. 阅读计划 — 了解此处应包含哪些论断、证据和引用
  2. 阅读 NARRATIVE_REPORT.md — 提取相关内容、发现和量化结果
  3. 起草内容 — 撰写完整的 LaTeX(不得使用编造的占位内容)。**例外:**如果 GAP_REPORT.md 存在,且该章节包含 status: missing 的内容项,则在这些位置输出 ``,而不是编造数据 — 参见上文的 DATA_NEEDED 标记小节。
  4. 插入图表 — 使用 figures/latex_includes.tex 中的代码片段
  5. 添加引用 — 对于 ML 会议(ICLR/NeurIPS/ICML/CVPR/ACL/AAAI):使用 \citep{} / \citet{}(natbib)。**对于 IEEE 会议:**使用 \cite{}(通过 cite 软件包实现数字引用样式)。切勿混用 natbib 和 cite 命令。

起草前置部分之前,请重新阅读 PAPER_PLAN.md 中的一句话贡献概述。摘要和引言应在读者读到完整方法之前,清楚地传达这一核心观点。

各部分具体指南

§0 摘要:

  • 使用 ../shared-references/writing-principles.md 中的五部分流程:内容、难点、方法、证据、最有力的结果
  • 必须独立成篇(无需阅读论文即可理解)
  • 开篇介绍论文的具体贡献,而非领域层面的泛泛背景
  • 包含一个具体的定量结果
  • 150-250 词(请核对投稿 venue 的限制)
  • 不使用引用,不使用未定义的缩写
  • 不要使用 \begin{abstract} —— 该内容已在 main.tex 中

§1 引言:

  • 以引人入胜的切入点开篇(用 1-2 句话说明问题动机)
  • 清晰指出研究空白(“然而,……”)
  • 在读者陷入细节之前,简要概述方法
  • 以编号或项目符号列表列出 2-4 项具体、可证伪的贡献
  • 尽早呈现最有力的结果,不要留到实验部分
  • 以简短的结构安排说明结尾(“本文余下部分安排如下……”)
  • 如果篇幅允许,加入主要结果图
  • 目标篇幅:1-1.5 页
  • 方法部分最迟应从第 2-3 页开始

§2 相关工作:

  • 至少 1 整页(3-4 个实质性段落)。相关工作部分过短是评审常见的批评意见。
  • 按类别组织,使用 \paragraph{Category Name.}
  • 按方法、假设类别或研究问题组织;不要逐篇撰写论文摘要
  • 每个类别:用 1 段概述该方向的研究,再用 1-2 句话说明本文的定位
  • 不要只罗列论文——应进行综合比较
  • 每段结尾都要说明本文与相关工作的联系或区别

§3 方法 / 预备知识 / 设置:

  • 尽早定义符号(参照 math_commands.tex)
  • 正式陈述使用 \begin{definition}、\begin{theorem} 环境
  • 对理论论文:在正文中简要证明关键结果,并在附录中给出完整证明
  • 对理论论文:加入一张对比表,比较已有界与本文结果
  • 适用时加入算法伪代码(algorithm2e 或 algorithmic)
  • 目标篇幅:1.5-2 页

§4 实验:

  • 从实验设置开始(数据集、基线、指标、实现细节)
  • 首先呈现主要结果表格/图
  • 然后介绍消融实验与分析
  • 引言中的每项主张都必须在此处得到证据支持
  • 对于每项主要实验,明确说明它支持哪项主张,以及读者应注意什么
  • 目标篇幅:2.5-3 页

§5 结论:

  • 总结贡献(不要直接复制引言内容,应换一种表述)
  • 局限性(列出 2-4 项实质且具体的限制,例如数据集规模、计算资源范围、假设 X;只写真实存在的限制,切勿为凑数而编造。本节是讨论泛泛注意事项的唯一位置)
  • 未来工作(1-2 个具体方向)
  • 伦理声明和可复现性声明(如投稿 venue 要求)
  • 目标篇幅:0.5 页

附录:

  • 证明细节(正文中定理的完整证明)
  • 补充实验、消融实验
  • 实现细节、超参数表
  • 补充可视化
第 3.5 步:理论论文一致性检查(仅限理论论文)

在起草完所有章节后、构建参考文献之前运行此检查。

**触发启发式规则:**如果 PAPER_PLAN.md 将论文标记为理论/分析类,或已起草的章节中包含 5 个或更多正式结果环境(\begin{theorem}、\begin{lemma}、\begin{proposition}、\begin{corollary}),则将论文视为理论性较强的论文。

**证明来源搜索:**在工作区中搜索独立的完整证明源文件,其文件名或内容表明这是规范的证明版本(proof、appendix、full、complete、supplement、supplementary)。如果存在此类文件,请原样向用户询问:

Inline full proofs from {file}? [Y/n]

默认选择 Y。

如果用户接受:

  • 将完整的定理/引理陈述及证明块导入附录源文件(A_appendix.tex 或计划中指定的附录文件)
  • 以正文中的定理陈述作为规范的公开陈述;除非在同一轮检查中修改正文陈述,否则附录中的副本必须与其一致
  • 不要留下诸如“参见补充证明文档”或“为简洁起见省略证明”之类的占位内容
  • 完全保留定理标签、公式标签和证明结构
  • 正文中的证明概要应简短,但如果存在完整证明源文件,附录绝不能只保留证明概要占位内容

如果不存在独立的完整证明源文件:

  • 仅在证明概要确实按概要形式撰写时才使用证明概要,不要使用占位内容
  • 不要捏造外部证明文档的引用

重述审查:

  • 将附录中重述的每个定理/引理/命题陈述与正文版本进行比较
  • 不比较证明正文;只审查陈述、假设、分类讨论、量词、定义域、符号、变量名以及已定义对象的术语
  • 除非有明确说明,否则将 stationary 与 terminal 的差异、假设名称变更或分类讨论缺失视为不一致
  • 如果附录需要采用不同措辞,应添加明确的符号说明,而不是悄然重命名概念
  • 在进入第 4 步之前解决所有不一致

**经验动机:**在一次真实的理论论文运行中,默认行为在附录中生成了“参见补充证明文档”占位内容。作者不得不手动从独立的证明文件(例如 proof_full.tex)中提取数百行完整证明。若没有此检查,理论论文可能会以只有证明概要的附录投稿,无法满足理论类会议的要求。

第 4 步:构建参考文献

关键:仅包含论文中实际引用的条目。

  1. 扫描已起草章节中的所有引文引用(ML 会议使用 \citep{}/\citet{},IEEE 会议使用 \cite{})
  2. 建立引文键列表
  3. 对每个引文键:
    • 检查项目/叙述文档中现有的 .bib 文件
    • 如果未找到且 DBLP_BIBTEX = true,使用下方经过验证的获取流程
    • 如果未找到且 DBLP_BIBTEX = false,搜索 arXiv/Scholar 以获取正确的 BibTeX
    • 绝不捏造 BibTeX 条目——对未知条目添加 [VERIFY] 注释
  4. 编写 references.bib,其中仅包含已引用的条目(不得包含冗余内容)
已验证的 BibTeX 获取(当 DBLP_BIBTEX = true 时)

三步回退链——无需安装、无需认证,获取的都是真实 BibTeX:

步骤 A:DBLP(质量最佳——包含完整会议信息、页码和编辑者)

# 1. Search by title + first author
curl -s "https://dblp.org/search/publ/api?q=TITLE+AUTHOR&format=json&h=3"
# 2. Extract DBLP key from result (e.g., conf/nips/VaswaniSPUJGKP17)
# 3. Fetch real BibTeX
curl -s "https://dblp.org/rec/{key}.bib"

步骤 B:CrossRef DOI(回退方案——适用于 arXiv 预印本)

# If paper has a DOI or arXiv ID (arXiv DOI = 10.48550/arXiv.{id})
curl -sLH "Accept: application/x-bibtex" "https://doi.org/{doi}"

步骤 C:标记 [VERIFY](最后手段) 如果 DBLP 和 CrossRef 都没有返回结果,就在条目中添加 % [VERIFY] 注释。切勿伪造。

为何这很重要: 大模型生成的 BibTeX 经常会臆造会议名称、页码,甚至合著者。DBLP 和 CrossRef 返回经出版方验证的元数据。上游技能(/research-lit、/novelty-check)可能会提及大模型记忆中的论文——此获取链就是一道关卡,可防止虚构引用进入最终的 .bib 文件。

如果 DBLP/CrossRef 流程还不够,请在添加占位符前加载 ../shared-references/citation-discipline.md,以遵循更严格的回退规则。

自动清理 Bib——使用此 Python 模式仅提取被引用的条目:

import re
# 1. Grep all \citep{...}, \citet{...}, and \cite{...} from all .tex files
# 2. Extract unique keys (handle multi-cite like \citep{a,b,c} or \cite{a,b,c})
# 3. Parse the full .bib file, keep only entries whose key is in the cited set
# 4. Write the filtered bib

这样可避免 Bib 变得臃肿(例如,测试中从 948 行缩减到 215 行)。

强制执行的 Bib 清洁度验证——筛选后的 references.bib 写入后立即运行。

python3 - <<'PY'
import io, json, re, sys, urllib.parse, urllib.request
from pathlib import Path

try:
    import bibtexparser
except ImportError:
    sys.exit("Missing dependency: pip install bibtexparser")

ROOT = Path("paper")
tex_paths = [ROOT / "main.tex", *sorted((ROOT / "sections").glob("*.tex"))]
tex = "\n".join(p.read_text(errors="ignore") for p in tex_paths if p.exists())

cited = set()
for m in re.finditer(r'\\cite[a-zA-Z]*\{([^}]*)\}', tex):
    cited.update(k.strip() for k in m.group(1).split(',') if k.strip())

with (ROOT / "references.bib").open() as fh:
    bib = bibtexparser.load(fh)

entries = {e["ID"]: e for e in bib.entries}
dead = sorted(set(entries) - cited)
if dead:
    print("DEAD ENTRIES:")
    for key in dead:
        print("  ", key)

def norm(s):
    return re.sub(r'[^a-z0-9]+', ' ', (s or '').lower()).strip()

def dblp_hits(title):
    q = urllib.parse.quote(title)
    url = f"https://dblp.org/search/publ/api?q={q}&format=json&h=3"
    with urllib.request.urlopen(url, timeout=20) as r:
        data = json.load(r)
    return [h.get("info", {}) for h in data.get("result", {}).get("hits", {}).get("hit", [])]

def crossref_entry(doi):
    req = urllib.request.Request(f"https://doi.org/{doi}", headers={"Accept": "application/x-bibtex"})
    with urllib.request.urlopen(req, timeout=20) as r:
        parsed = bibtexparser.loads(r.read().decode("utf-8", "ignore"))
    return parsed.entries[0] if parsed.entries else {}

for key in sorted(cited & set(entries)):
    e = entries[key]
    title = e.get("title", "").strip("{}")
    hits = dblp_hits(title) if title else []
    hit = hits[0] if hits else None
    source = "DBLP"
    if hit is None and e.get("doi"):
        try:
            hit = crossref_entry(e["doi"])
            source = "CrossRef"
        except Exception:
            hit = None
    if hit is None:
        print(f"VERIFY {key}: no DBLP/CrossRef hit")
        continue

    issues = []
    year_a = str(e.get("year", "")).strip()
    year_b = str(hit.get("year", "")).strip()
    if year_a and year_b and year_a != year_b:
        issues.append(f"year {year_a} != {year_b}")

    venue_a = e.get("journal") or e.get("booktitle") or ""
    venue_b = hit.get("journal") or hit.get("booktitle") or hit.get("venue") or ""
    if norm(venue_a) and norm(venue_b) and norm(venue_a) != norm(venue_b):
        issues.append(f"venue {venue_a} != {venue_b}")

    authors_a = [norm(a) for a in re.split(r'\s+and\s+', e.get("author", "")) if a.strip()]
    authors_b = [norm(a) for a in re.split(r'\s+and\s+', hit.get("author", "")) if a.strip()]
    if authors_a and authors_b and authors_a[:2] != authors_b[:2]:
        issues.append("author list differs")

    if issues:
        print(f"MISMATCH {key} ({source}): " + "; ".join(issues))
PY

如果打印出 DEAD ENTRIES,请在继续前从 references.bib 中删除这些键。 如果打印出 VERIFY 或 MISMATCH,请勿编造元数据:

  • DBLP 返回明确结果时,优先采用 DBLP
  • 如果 DBLP 未找到且有 DOI,则改用 CrossRef
  • 如果两者不一致或仍无法验证,仅保留条目并添加 % [VERIFY] 标记
  • 未被引用的条目必须删除,不能留作无用的参考文献臃肿内容

引用可达性规则: 如果某个条目的键未出现在 paper/main.tex 或任何 paper/sections/*.tex 文件中的 \cite...{} 命令里,该条目即为无用条目。

经验依据: 在一次真实投稿过程中,references.bib 中有几个无用条目在多轮改进中一直未被清除,且至少有一个条目的键与年份不匹配。现有的自动清理都没有发现这些问题。

引用验证规则(来自 claude-scholar + Imbad0202):

  1. 每个 BibTeX 条目都必须包含:作者、标题、年份、会议或期刊
  2. 如果论文已发表,优先使用已发表的会议版本,而非 arXiv 预印本
  3. 使用统一的键格式:{firstauthor}{year}{keyword}(例如,ho2020denoising)
  4. 仔细核对每个条目的年份和会议或期刊
  5. 删除重复条目(同一篇论文使用不同的键)
第 5 步:科学写作质量审查(5 轮审查)

完成所有章节的初稿后,按顺序进行五轮审查。遵循 Sainani 的《Writing in the Sciences》方法:每个词都必须发挥作用。

第 1 轮:删减冗余——将句子精简为最清晰的组成部分。

冗长表达替换为
Due to the fact thatBecause
In order toTo
A number ofSeveral
It is worth noting that(删除——直接陈述要点)
It is important to note that(删除)
At the present timeNow
On the basis ofBased on
In light of the fact thatBecause
Have an effect onAffect
Give rise toCause

同时删除重复表达:“completely eliminate” → “eliminate”,“future plans” → “plans”,“unexpected surprise” → “surprise”。

删除 AI 套话:delve、pivotal、landscape、tapestry、underscore、noteworthy、intriguingly。

第 2 轮:主动语态与动词活力——明确谁做了什么。

  • 识别被动语态:“to-be”动词 + 过去分词(“was observed”、“were analyzed”)
  • 转换:找出动作执行者,重构为主语—动词—宾语结构
  • 将名词化表达还原为有力动词:
    • “We made an investigation” → “We investigated”
    • “Failure of the system occurs” → “The system fails”
    • “Provides a description of” → “Describes”

以下情况可以使用被动语态:既定事实、执行者无关紧要的方法,或出版规范要求使用被动语态。

第 3 轮:句子架构——调整结构与行文。改变段落形态: 如果每个段落都是“问题 → 方法 → 优点 → 总结”,这种套路会让 读者感到麻木——打破它。

  • 标出超过 40 个词的句子,并拆分
  • 确保主语和动词靠近(不要在两者之间插入冗长的括号内容)
  • 先交代熟悉的背景,再引入新信息
  • 将最重要的要点放在句末附近
  • 每个段落只承担一个任务
  • 不要让连续的句子都以“This”或“We”开头
  • 检查段落衔接——每段的首句都应与上一段相连

第 4 轮:关键词一致性——香蕉规则。

**不要为了避免重复,而把“香蕉”称作“细长的黄色水果”。**如果 Methods 中使用“obese group”,Results 就不应换成“heavier group”。技术术语的同义替换会让读者疑惑是否引入了新类别。

  • 从 Methods 部分提取所有关键词(组名、变量名、技术名称、缩写)
  • 确认 Results、Discussion、表格和图注中都使用完全相同的术语
  • 标出所有对已定义术语的同义替换
  • 缩写从简:标出仅为方便而创造的非标准缩写;确认每个缩写都在首次出现时定义

第 5 轮:数值与引文完整性

  • 摘要中的样本量(N)是否与 Table 1 一致?
  • Results 中的百分比是否与表格中的原始数字一致?
  • 有效数字是否一致且恰当?
  • 图中的数值是否与表格一致?
  • 标出仅引用二手来源(综述、教科书)的统计数据——建议核实原始来源
第 6 步:与 REVIEWER_MODEL 交叉评审

将完整初稿发送给 GPT-6-Astra xhigh:

请先解决这个审稿意见栏;以下是 backend=codex 示例。

mcp__codex__codex:
  model: gpt-6-astra
  config: {"model_reasoning_effort": "xhigh"}
  prompt: |
    Review this [VENUE] paper draft (main body, excluding appendix).

    Judge claim calibration in BOTH directions. Recommend narrowing only when the
    current scope or modality exceeds the evidence; do not ask for extra hedges
    around a supported result. Flag stacked hedges, self-defence ("we do not
    claim"), instruction confessions ("we do not address X"), and generic caveats
    outside Limitations as writing defects to remove. Tone fixes must never alter
    facts, negation, modality, scope, comparison direction, or numbers.

    Focus on:
    1. Does each claim from the intro have supporting evidence?
    2. Is the writing clear, concise, and free of AI-isms?
    3. Any logical gaps or unclear explanations?
    4. Does it fit within [MAX_PAGES] pages (to end of Conclusion)?
    5. Is related work sufficiently comprehensive (≥1 page)?
    6. For theory papers: are proof sketches adequate?
    7. Are figures/tables clearly described and properly referenced?
    8. Would a skim reader understand the contribution from the title, abstract, introduction, and Figure 1?

    For each issue, specify: severity (CRITICAL/MAJOR/MINOR), location, and fix.

    [paste full draft text]

应用 CRITICAL 和 MAJOR 级别的修正。将 MINOR 问题记录下来,供用户参考。

第 7 步:反向提纲测试(来自 Research-Paper-Writing-Skills)

完成所有章节的初稿后:

  1. 提取主题句——找出每个段落的第一句
  2. 按顺序阅读——这些句子单独读起来也应构成连贯的叙述
  3. 检查论点覆盖情况——Claims-Evidence Matrix 中的每项论点都必须出现
  4. 检查证据对应关系——每项实验/每幅图都必须支持一个明确陈述的论点
  5. 修补缺漏——如果主题句没有推进论述,就重写该段落
步骤 8:最终检查

在宣布完成之前:

  • 所有 \ref{} 和 \label{} 均匹配(没有未定义的引用)
  • 所有引用命令(ML 会议使用 \citep{}/\citet{},IEEE 使用 \cite{})均有对应的 BibTeX 条目
  • 匿名模式下不含作者信息
  • 图表编号正确
  • 页数不超过 MAX_PAGES(正文截至结论部分末尾)
  • 文中没有遗留 TODO/FIXME/XXX 标记
  • 没有未核实的 [VERIFY] 标记
  • 摘要内容完整,无需阅读论文即可理解
  • 标题具体且信息明确(不笼统)
  • 相关工作部分至少有 1 页完整内容
  • references.bib 仅包含文中引用的条目(无冗余)
  • 没有过时的章节文件 — sections/ 中的每个 .tex 文件都已由 main.tex 使用 \input 引入
  • 章节文件与 main.tex 一致 — 文件编号和 \input 路径相互一致
  • 满足会议特定的必需章节/清单要求(如有需要,请阅读 ../shared-references/venue-checklists.md)
  • 快速浏览的读者能从标题、摘要、引言和图 1/图注中把握主要论点

关键规则

=== 自信表达,诚实说明局限(绝不夸大主张)===

  1. 根据证据的实际范围和模态校准每项主张,然后直接陈述校准后的主张。必要的假设、不确定性和范围都属于主张本身;层层叠加的保留说法和防御性的铺垫则不属于。
  2. 如果当前主张缺乏证据支持,就将其缩小到证据能够支持的版本,或直接删去。不要用听起来更委婉的同义词代替对范围、模态、比较关系或聚合方式的修正。
  3. 将通用的注意事项和更广泛的边界讨论集中放在一个 Limitations 部分。除此之外,删去“仍需进一步研究”“可能无法推广”“应谨慎解读”等通用免责声明。定义主张的范围、假设和统计限定,应保留在使主张成立的对应表述中。
  4. 以 2–4 项重要且具体的局限为目标(数据集规模、计算条件、假设 X)。只写真实存在的局限——绝不为凑数而捏造,绝不泛泛道歉,也不要在论文中反复陈述同一项局限。
  5. 写作指示不属于稿件内容。“不要提及 X”意味着省略 X,而不是写“我们不讨论/声称/涉及 X”。绝不要在稿件正文中透露起草指示、要求省略的内容、审稿意见或修订历史。
  6. 将自我辩护(“我们不声称”“我们的目标仅仅是”)改为正面陈述论文确实证明了什么,并与证据相符。如果防御性句子包含真实的边界,就将该边界保留在主张中或 Limitations 部分;不要删去会影响真值的内容。
  7. 仅调整语气的编辑绝不改变事实、否定、模态、范围、假设、比较方向、聚合方式、数字、公式或引文。确实存在的过度主张仍须收窄;有证据支持、却被多余谨慎措辞包裹的主张,应直接陈述。
  8. 围绕一条因果主线展开:缺口 -> 问题 -> 洞见 -> 后果 -> 证据 -> 含义。每个部分都应推动这条主线。让方法显得顺理成章:缺口引出一个具体问题,关键洞见回答该问题,方法由此推导而出,每项主要实验都检验其某项后果,结论则准确说明证据确立了什么。突出贡献;绝不叙述起草或修订过程。
  9. 论文应当是一次亮相,而不是进度报告。围绕这项工作的最强真实优势组织叙述——新的能力、问题、机制或视角、更广泛的适用性、更低的成本,或更好的权衡。不构成优势的内容不要放在主线中。如果结果支撑不了原先的故事,就围绕最有力的证据重塑故事,而不是为原故事辩护。
  10. 选定论文胜出的比较维度。不要围绕方法并不领先的指标构建叙述;应围绕反映方法用途的任务定义、评估维度或约束展开比较,并明确说明它在哪一方面胜出。不利数字仍须呈现——表格必须完整。在证据支持的情况下,将这些数字解释为目标差异或有意为之的权衡,而不是描述为失败(“表现不佳”“未能超越”);若证据不支持这种解释,就中性地陈述表现不佳,收窄主张,并在其影响重大时将其列入 Limitations。绝不要把局部观察上升为对整个方法的判定,也绝不要编造权衡来掩盖弱点。
  11. 每项实验都必须承担论证任务:证明方法有效、证明增益来自关键机制、证明方法在目标场景中的价值,或排除最可能的替代解释。没有承担上述任何任务的实验,应删去、缩短、移至附录或重新设计。实验部分应是一段论证,而不是结果仓库。
  12. 主动说明优势——优势在哪些条件下出现、为何出现、解决了什么问题——而不是指望审稿人从表格中自行发现。摘要和引言应以亮相式的方式开篇:一个重要但尚未解决的问题、现有方法的缺口、本文的独特思路,以及最有力的结果。结论应强化解决了什么、提出并证明了什么,以及为何重要;最后一段不得新增自我否定或扩大局限。
  • 大型文件处理:如果 Write 工具因文件大小而失败,请立即改用 Bash(cat << 'EOF' > file)分块写入。不要征求用户许可——直接静默执行。
  • 不要编造作者姓名、电子邮件或所属机构——使用匿名区块或占位符
  • 撰写完整章节,而非大纲——输出应为可编译的 LaTeX
  • 每个章节单独存放一个文件——采用模块化结构,便于编辑
  • 每项论断都必须引用证据——交叉参照 Claims-Evidence Matrix
  • 可直接编译——输出应能通过 latexmk 编译且无错误(缺少图表除外)
  • 校准表述,而非含糊其辞——使每项论断与其证据的实际范围和模态相符,然后直接陈述;一般性保留意见只放在 Limitations 中(上文的 CONFIDENT PROSE, HONEST LIMITS 区块是约定)
  • 呈现成果,而非汇报进度——围绕最有力的真实优势组织内容,选定论文最具胜算的竞争点,让每项实验都有论证上的作用;不利数据保留在表格中,有证据支持时将其解释为权衡,不支持时则中性陈述——绝不将其描述为失败,也绝不将其包装成并非如此的权衡(见上文规则 9-12)
  • 会议风格很重要——ML 会议(ICLR/NeurIPS/ICML)使用 natbib(\citep/\citet);IEEE 会议使用 cite 包(\cite{},数字引用)。切勿混用。
  • 不同会议的页数限制规则不同——ML 会议:正文截至 Conclusion,参考文献和附录不计入页数。IEEE:参考文献计入页数限制。
  • 保持参考文献干净——references.bib 中只能包含实际通过 \cite 引用的条目
  • 章节数量灵活——遵循 PAPER_PLAN 的结构,不要强行拆分为 5 个章节
  • 覆盖前先备份——覆盖前务必备份现有的 paper/ 目录
  • 将贡献前置——不要把关键成果拖到实验或附录才揭示
  • 按论证顺序排列结果,而非按实验记录顺序——按照最能逐步建立论据的顺序呈现实验,切勿按实际运行顺序排列
  • 将对照实验和消融实验放在其检验的论断旁边——不要集中放在相距甚远的小节中,让读者忘记待验证的问题

写作质量参考

  • ../shared-references/writing-principles.md — 故事框架、摘要与引言模式、句子层面的清晰度、审稿人阅读顺序
  • ../shared-references/venue-checklists.md — 宣布完成前需要核对的 ICLR/NeurIPS/ICML/IEEE 投稿要求
  • ../shared-references/citation-discipline.md — 用于处理含糊引用的更严格后备规范

继续使用上文主要工作流中的反向大纲测试和反夸大润色;这些共享参考资料旨在提升质量,不会增加新的阶段。

致谢

写作方法改编自 Research-Paper-Writing-Skills(荣获 CCF 奖项的方法)。引用核验来自 claude-scholar 和 Imbad0202/academic-research-skills。此混合工具包的写作指导补充内容改编自 Orchestra Research 的论文写作资料。

评论

支持 Markdown