---

name: comp-paper-zh-docx

description: "数模竞赛/统计建模中文论文撰写（Word docx 模式），comp-paper-zh 的 docx 对应版，只产出 paper/main.md。"
argument-hint: [competition-type]

allowed-tools: Bash(*), Read, Write, Edit, Grep, Glob, Agent, WebSearch, WebFetch

---



# 中文竞赛论文撰写（docx 模式）



按竞赛规范结构生成中文论文，输出 Markdown 供 Word 导出：**$ARGUMENTS**



## ⚡ 快速模式检测（开头先跑）



```bash

FAST_MODE=0

grep -q 'MH_FAST_MODE=1' AGENTS.md 2>/dev/null && FAST_MODE=1

echo "FAST_MODE=$FAST_MODE"

```



**若 `FAST_MODE=1`（速度优先）：** 仍必须产出完整论文（各章齐全、子问题全覆盖、图表按 manifest 嵌入、正文页数达标、引用真实数据不编造、通过产出验证），但**跳过**：图文数值一致性逐句核对、溯源反查、发现小瑕疵后的反复润色重写。一次写成、结构与内容齐全即可。**若 `FAST_MODE=0`（默认）：** 后文一致性检查照常执行。



> docx 专用版本。保留 `comp-paper-zh` 全部写作纪律（章节结构、子问题分章节、上游验证、图表嵌入、引用纪律、模板复制后指纹校验在此简化为 markdown 框架对齐），但产物只有 **`paper/main.md`** 一个文件。

>

> ⛔ **绝不产 `.tex` / `.cls` / `.sty` / `.bib`，绝不调用 LaTeX 命令。**



## Constants



- **CONTEST_ID** — 逐字转录自 `contest_profile.contest_id`（规范 `comp_*` 档案键，仅 `status == "bound"` 时）。**无默认**：pending_binding/缺失/未知是错误，不回退国赛。

- **PAGE_CAP** — 有下发时逐字转录自 `contest_profile.gate_page_cap`。只准不超，无下限、**无默认值**；缺席 ⇒ 页数上限未知（待核实），不得假设 20。

- **CUSTOM_REQUIREMENTS** — 最高优先级



## Inputs



1. PROBLEM_ANALYSIS.md, MODELING_REPORT.md, RESULTS.md

2. figures/ — `.png` / `.pdf` / `latex_includes.tex`（仅作图编号 caption 参考）

3. code/, figures/all_results.json, figures/problem_*_results.json



## Load shared rules



```bash

cat _utils/writing_rules.md 2>/dev/null || cat skills/shared-scripts/writing_rules.md

```



> shared rules 中关于 LaTeX 的部分（`\begin`、`\input`、`gbt7714`、`thebibliography`）在 docx 模式下不适用，但写作哲学全部适用：claims-evidence、章节深度、扩写策略、图表是论据、de-AI polish。



## ⛔⛔⛔ 完成铁律（最高优先级）



**主产物**：`paper/main.md`（**单文件**，UTF-8，含完整论文，≥ 5KB）



**禁止产**：

- `paper/main.tex`、`paper/sections/*.tex`、`paper/references.bib`

- 任何 `.cls` / `.sty` / `.aux`

- 任何 LaTeX 命令（`\begin`、`\input`、`\cite`、`\label`、`\ref`、`\section`、`\includegraphics`、`\bibitem`）



**结束前必跑产出验证**：

```bash

echo "=== 产出验证（必须全部 ✅）==="

PASS=true



[ -f paper/main.md ] && SZ=$(wc -c < paper/main.md) || SZ=0

[ "$SZ" -ge 5120 ] && echo "✅ paper/main.md ($SZ bytes)" || { echo "❌ paper/main.md 缺失或过小"; PASS=false; }



# 上限口径由 PAGE_SCOPE 决定（正文/全文分开统计；附录与参考文献是否计入以档案为准）

# 按 "## 附录" 切开统计：正文 = 起到附录前；附录 = 附录之后（含代码 / 长数据表）

body_md=$(awk '/^## *附录/{exit} {print}' paper/main.md 2>/dev/null)

body_chars=$(echo "$body_md" | wc -m)

total_chars=$(wc -m < paper/main.md 2>/dev/null || echo 0)

appendix_chars=$((total_chars - body_chars))

est_body=$((body_chars / 800))

est_appendix=$((appendix_chars / 800))

if [ -n "$PAGE_CAP" ]; then
    echo "正文字符: $body_chars (~$est_body 页), 附录字符: $appendix_chars (~$est_appendix 页, 单独统计), 上限: <= $PAGE_CAP 页 (口径: ${PAGE_SCOPE:-未指明 -> 待核实})"
else
    echo "正文字符: $body_chars (~$est_body 页), 附录字符: $appendix_chars (~$est_appendix 页) — PAGE_CAP 未下发，页数上限未知（待核实），不设默认目标"
fi




# LaTeX 残留检查

if grep -qE '\\(begin|end|input|cite|ref|label|includegraphics|section|chapter|subsection|bibitem|usepackage|documentclass)\{' paper/main.md; then

    echo "❌ paper/main.md 残留 LaTeX 命令："

    grep -nE '\\(begin|end|input|cite|ref|label|includegraphics|section|chapter|subsection|bibitem|usepackage|documentclass)\{' paper/main.md | head -5

    PASS=false

fi



ls paper/*.tex paper/sections/*.tex 2>/dev/null | head -1 | grep -q . && { echo "❌ 检测到 .tex 文件"; PASS=false; } || true



if [ "$PASS" != true ]; then echo "⛔ 验证失败 — 必须修复后重跑"; exit 1; fi

```





## docx-cn-engine markdown 约定（必须遵守）



后续 `docx-export` 步骤用 `third_party/docx-cn-engine/md_to_docx.js` 把 main.md 转成 .docx：



### 1. 标题层级

- `# 论文标题` — 论文封面标题（**全文唯一**，居中加粗最大字号，引擎会按封面样式渲染）

- `## 摘要` / `## Abstract` — 触发居中摘要样式

- `## 1 问题重述` / `## 2 模型假设` — 一级章节

- `### 1.1 子章节` — 二级

- `#### 三级`



数模竞赛章节命名建议：

```

## 1 问题重述

## 2 模型假设

## 3 符号说明

## 4 问题一的建模与求解

## 5 问题二的建模与求解

## 6 问题三的建模与求解

## 7 灵敏度分析与模型检验

## 8 模型评价与推广

## 参考文献

## 附录 A：代码

```



统计建模用中文数字：「一、绪论」、「二、文献综述」...，按内容驱动设计 5-7 个中段章节。



### 2. 摘要

```markdown

## 摘要



[600-800 字（数模，硬范围、生成目标 680-760，单一契约 `_utils/abstract_writing_contract.md`）/ 500-700 字（统计建模）。**必须按问题分段**：

- 第 1 段：背景概述

- 第 2-4 段：分别针对问题一/二/三（方法 + 数值结果）

- 第 5 段：模型评价]



**关键词**：关键词1；关键词2；关键词3；关键词4；关键词5

```



⛔⛔ **摘要关键内容加粗（只在摘要正文，用 `**加粗**` markdown 语法）**：评审快速扫读摘要抓重点，把最关键的方法与结果加粗是加分项。**只加粗以下三类"结论锚点"**：

1. **关键结果数值**（最终答案数字）：如 最优值 `**2376.8**`、精度 `**98.7%**`、误差 `**<3%**`、最短路径 `**12.4 km**`

2. **核心方法/模型名**：如 `**NSGA-II**`、`**灰色预测 GM(1,1)**`、`**XGBoost**`——**每个方法名只在首次出现或结论处加粗一次**，不是每次提到都加

3. **关键结论的核心名词**（一句结论里最要害的那个词）



⛔ **加粗铁律（防加粗过多反而杂乱，宁少勿多）**：

- 每段 **1~3 处**加粗，全篇 **≤ 12 处**。超了就是错。

- **禁止**：整句加粗、背景铺垫加粗、连接词加粗、同一方法名反复加粗。

- ⛔ 只用 `**xxx**`（markdown），**不要用 `\textbf{}`**（那是 LaTeX，docx 里会原样显示成乱码）。

- ⛔ **不影响关键词行**：`**关键词**：` 那行的加粗是标签本身，照旧，不要动。

- ⛔ 加粗只是包一层 `**`，**数字本身必须仍从正文如实摘出**，不能因加粗而改动或编造数值。



正例：`本文针对调度问题构建 **NSGA-II** 多目标模型，求得最优成本 **2376.8 万元**，较基线降低 **12.3%**。`

反例（加粗过多，错）：`**本文针对调度问题构建 NSGA-II 多目标模型，求得最优成本 2376.8 万元，较基线降低 12.3%**。`（整句加粗＝没重点）



统计建模需另写英文摘要（350-500 词），紧跟在中文摘要后：

```markdown

## Abstract



[英文翻译，覆盖相同结构与全部数值]



**Keywords**: keyword1; keyword2; keyword3

```



⛔ 摘要必须**先写正文再写摘要**（在 Workflow Step 5.6）—— 摘要里的数字必须从正文摘出，不能编。



### 3. 公式

- 行内：`$x^2 + y^2 = r^2$`

- 独立：`$$E = mc^2$$`

- ⛔⛔ **每个独立（块级）公式都必须连续编号，编号一律写在公式内部，用 `\tag{n}`。多行块级公式的闭合 `$$` 必须独占一行、后面不许有任何字符。**

```markdown

模型可表示为：

$$\min_{\mathbf{x}} \sum_{i=1}^{n} c_i x_i \quad \text{s.t.} \quad \sum_i a_{ij} x_i \leq b_j \tag{1}$$

其中 $c_i$ 为第 $i$ 项成本系数。

```

> ⛔ **禁止 `$$ … (1)`（编号粘在闭合定界符前同行尾）与"闭合 `$$` 后仍有字符"**——任何带尾巴的块公式都是错形态，编号一律写进公式内部用 `\tag{n}`。
> Pandoc / Word 导出引擎不认带尾巴的 `$$` 为合法闭合，会从那一行起一路往后吞，
> 把后续正文、公式、`![](figures/xxx.png)` 图片引用全当成数学内容 →
> **公式一个字一个字竖排、图片加载失败**（实测一篇论文 17 处块级公式全中招）。
> `\tag{n}` 是 KaTeX / MathJax / Pandoc 通认的标准写法，右侧照样显示 (1)、(1′) 等编号。

⛔ **禁止 `\begin{equation}`、`\begin{align}`** —— 引擎不处理这些 LaTeX 环境。
⛔ **`\[...\]` 也不要用于独立公式** —— 引擎虽能识别，但会渲染成**行内**公式（不居中、不带编号），达不到独立公式的效果。

✅ **`\begin{cases}` 与 `\begin{aligned}` 可以用**（写在 `$$ ... $$` 里面）—— 引擎会转成 OMML，
Word 里正常显示。0-1 变量定义和"目标函数 + s.t. 多条约束"这两种写法都靠它们，见下面优化模型章节。



#### ⛔⛔ 优化/规划类模型与求解章节写法（docx 公式引擎口径）

**适用范围**：模型里出现 `\min` / `\max`，或题目是"最优/最省/最大化/选址/指派/排班/路径/调度/配比"
这类决策问题时**必须**照此写。**统计建模（评价指标体系 / DEA / PCA / 回归 / 预测）不适用**。

> 依据：最优化问题的三要素就是**决策变量、目标函数、约束条件**。硬要求是三者各自清楚可辨；
> 三者糊成一坨，评委扫一眼找不到"你到底在决定什么"。惯用顺序是决策变量 → 目标函数 → 约束条件 →
> 变量取值范围；**不要求切成三个固定小节**——复杂模型分块或用三线表承载，简单模型一段文字 +
> 一个 `aligned` 公式就够，别为凑结构硬切（数模讲少而精，形式服务于内容）。

**小节标题要带模型信息**（只管子问题章内部小节，章级通行章名照原样保留）：

| ❌ 空标题 | ✅ 带信息的标题 |
|---|---|
| 模型建立 | 基于 0-1 整数规划的服务站选址模型 |
| 模型求解 | 分支切割法求解与最优选址方案 |
| 灵敏度分析（子问题内小节） | 预算上限变动对选址数量的影响 |

**① 决策变量** —— 交代**符号、含义、类型、下标范围、类型理由**五件事。0-1 变量必须用 `cases`
写清两种取值各自的现实含义，不许只写 `$y_j \in \{0,1\}$`：

$$x_{ij}=\begin{cases} 1, & \text{第 } i \text{ 个需求点由第 } j \text{ 个服务站服务} \\ 0, & \text{否则} \end{cases} \tag{1}$$

⛔ 类型理由不能省：取整因人数/车辆不可分，0-1 因选或不选无中间态，连续因可任意分割。

**② 目标函数** —— 独立成式，紧跟一句交代目标来源（引赛题原话，与 `MODELING_REPORT.md`
目标溯源表同口径）：

$$\min\ Z=\sum_{j=1}^{n} f_j y_j+\sum_{i=1}^{m}\sum_{j=1}^{n} c_{ij} d_i x_{ij} \tag{2}$$

多目标要说清怎么合并（加权/分层/Pareto）、权重怎么定、量纲怎么统一。

**③ 约束条件** —— 按容量、守恒、时间窗、逻辑联动等现实机理分组，每组用一个带编号的 `aligned`
公式纵向排开，组后用自然段解释各行业务含义；默认不在成品论文出现 `C1/H1`、"审计项"等内部标签：

$$\begin{aligned}\text{s.t.}\quad & \sum_{j=1}^{n} x_{ij}=1, && i=1,\dots,m \\ & \sum_{i=1}^{m} d_i x_{ij}\le Q_j y_j, && j=1,\dots,n \\ & x_{ij}\le y_j, && \forall i,j\end{aligned} \tag{3}$$

查漏清单：需求覆盖 / 资源预算上限 / 单点容量 / 固定总量 / 至多至少-k / 互斥 / 逻辑联动(big-M) /
时间窗 / 流量守恒 / 度约束与子回路消除。⛔ **线性化技巧必须解释**（big-M、分段线性、绝对值、
`max` 转约束：原非线性形态 + 等价理由；$M$ 取数据上界，不写 99999）。

**④ 变量取值范围 + 模型定性** —— 非负/整数/上下界单独列出；说明问题类型（LP/ILP/MILP/NLP/
多目标/动态规划）、**规模**（按下标范围算出的变量数与约束数）、**为什么用这个解法**（启发式须
说清精确解为何不可行）。⛔ 反例：只丢一串公式与 "使用 Gurobi 求解" 而符号无定义、约束不题面对应、
无类型无规模。**与上游一致性**：目标必须能在 `MODELING_REPORT.md` 溯源表找到对应行，约束条数不
少于建模登记的关键约束数；不新编、不悄漏。

**求解小节**：写的是**为什么这个解可信**，不是算法怎么工作——算法名 + 一句作用 + 引文。
要交代：求解难度与方法选择理由（规模/NP-hard/精确解可行性）、关键实现选择及依据（分解、线性化、
多起点）、**结果的解释边界**（多方法相对差异、与下界/基准对照、误差范围、最紧约束及余量）。
⛔ 不为篇幅写伪代码与复杂度分析（参数进附录表，正文一句"固定随机种子可复现，参数见附录"）；
⛔ 下界不是可行方案，差值不能解读成"优化空间"；⛔ 是否单独设节由题目定，没内容的小节标题比没有更糟；
硬比例：**"解为什么可信"的字数不得少于"算法怎么工作"**。扩写只往建模深度与结果可信度扩。

**创新点必须明确说出来**（位置不限：独立小节、并入优点、或写在结论章）：条数与判据以
`skills/_utils/innovation_contract.md` 为唯一真源——2-4 条，每条"常规做法 → 本文做法 → 差别"，
差别必须带 baseline 差值或消融证据；换任何题目都成立的表述不算本题创新。

### 4. 图片

```markdown

![图 1：技术路线图](figures/fig_roadmap.png)

```

- alt 文字 → 图注（居中加粗）

- 路径相对工作区根目录

- 优先 PNG（PDF 也支持但 Word 渲染不如 PNG）



### 5. 表格（三线表自动渲染）

```markdown

**表 1：问题一各算法对比**



| 算法 | 适应度 | 收敛代数 | 求解时间(s) |

|------|--------|----------|-------------|

| GA | 0.823 | 145 | 12.3 |

| PSO | 0.811 | 162 | 10.8 |

| 本文方法 | **0.917** | **88** | **9.4** |

```



⛔ 长表格（>15 行）：正文放摘要表（前 5 行 + 后 3 行 + 「⋮」省略），完整版放「## 附录 A：完整结果表」。



⛔ 如果 `figures/TABLE_*.md` 已存在（由 paper-figure 步骤产出），直接 `cat figures/TABLE_x.md` 嵌入对应章节。



### 6. 参考文献

```markdown

## 参考文献



[1] 作者. 标题[J]. 期刊, 年份, 卷(期): 页码.

[2] LeSage J P, Pace R K. Introduction to Spatial Econometrics[M]. CRC Press, 2009.

[3] Author A. Title[D]. 学校, 年份.

```



引擎检测到 `## 参考文献` / `## References` 后，下面以 `[N]` 开头的行自动套 hanging indent。



⛔ **正文引用用 `[1]`、`[1, 2]`、`[1-3]` 而不是 `\cite{}`**。

⛔ 引用编号必须按正文出现顺序排列（[1] 先于 [2] 先于 [3]），不能跳号。



## Workflow



### Step 0: 上游验证 + 续写检查



```bash

echo "=== 上游输出完整性检查 ==="

UPSTREAM_OK=true



# 1. 核心文件

for f in PROBLEM_ANALYSIS.md MODELING_REPORT.md RESULTS.md; do

    if [ -f "$f" ]; then

        sz=$(wc -c < "$f")

        echo "✅ $f ($sz 字符)"

        [ "$sz" -lt 500 ] && echo "  ⚠ 内容不完整"

    else

        echo "❌ $f 不存在！"; UPSTREAM_OK=false

    fi

done



# 2. 子问题覆盖度（统一口径，调 _utils/count_subproblems.sh，支持中文/阿拉伯/英文编号）

PROB_COUNT=$(bash _utils/count_subproblems.sh PROBLEM_ANALYSIS.md)

MODEL_COUNT=$(bash _utils/count_subproblems.sh MODELING_REPORT.md)

RESULT_FILES=$(ls figures/problem_*_results.json 2>/dev/null | wc -l)

echo "子问题数: 分析=$PROB_COUNT, 建模=$MODEL_COUNT, 结果=$RESULT_FILES"



# 3. 图表

PNG_COUNT=$(ls figures/*.png 2>/dev/null | wc -l)

PDF_COUNT=$(ls figures/*.pdf 2>/dev/null | wc -l)

echo "可嵌入图: PNG=$PNG_COUNT, PDF=$PDF_COUNT"

[ -f figures/all_results.json ] && echo "✅ all_results.json" || echo "⚠ 无 all_results.json"



# 4. 续写检查

if [ -f paper/main.md ]; then

    cp paper/main.md "paper/main-backup-$(date +%s).md.bak"

    echo "已存在 main.md，备份后进入续写"

fi



echo "=== 上游检查完成 ==="

```



**⛔⛔ 能力验收闸门（写论文前必做，承接全链合同的最后一环，零额度两模式都跑）：** Word 版同样是最终交付物，不能把没做到/做砸的能力写成成果：

```bash

FAST_MODE=0; grep -q 'MH_FAST_MODE=1' AGENTS.md 2>/dev/null && FAST_MODE=1

python _utils/paper_claim_check.py --audit CAPABILITY_AUDIT.md --checklist CAPABILITY_CHECKLIST.json --sections paper --fast $FAST_MODE

PCC=$?   # 0=全通过可写 1=有能力项未通过(不该写) 2=无总账跳过

```

> `PCC=1`：有能力项在编码阶段验收没通过，回 comp-code 做到 PASS 再写。⛔ 承上启下收口：赛题分析定合同→建模认领→编码实现验收→论文只如实书写验收通过的成果。（docx 正文在 `paper/main.md`，脚本会一并扫。）



### Step 1: 图表清单与嵌入计划



```bash

echo "=== 可用 PNG/PDF ==="

ls -la figures/*.png figures/*.pdf 2>/dev/null



echo "=== 可用 TABLE_*.md (Word 模式专用) ==="

ls -la figures/TABLE_*.md 2>/dev/null



echo "=== latex_includes.tex（仅作图编号 caption 参考）==="

cat figures/latex_includes.tex 2>/dev/null

```



**⛔ MANDATORY: 写章节前先建立图表嵌入计划：**



| 图/表 | 文件 | 嵌入位置 | 中文 caption |

|-------|------|----------|--------------|

| 1 | figures/fig_roadmap.png | 1 问题重述末尾 | 图 1：技术路线图 |

| 2 | figures/fig_flow_q1.png | 4 问题一-模型建立 | 图 2：问题一求解流程 |

| 3 | figures/fig_results_q1.png | 4 问题一-结果分析 | 图 3：问题一各算法对比 |

| 表 1 | figures/TABLE_results_q1.md | 4 问题一-结果分析 | 表 1：问题一最优解对比 |



**规则：**

- ⛔ 中文论文 caption 必须是中文。`latex_includes.tex` 里的英文 caption 嵌入时翻译

- ⛔ 必须使用真实存在的文件（先 ls 再嵌入）。`figures/` 仅含 `latex_includes.tex` 占位时跳过图嵌入

- ⛔ DrawIO 图（fig_roadmap / fig_flow_q1/q2/q3 / fig_pipeline）必须嵌入：技术路线图→问题重述末尾；子问题流程图→对应子问题章节开头

- ⛔ 所有 `figures/*.pdf` / `figures/*.png` 必须有归属，不能漏

- **⛔⛔ 图要由论证自然引出，而不是套模板句（铁律）**：每张图都嵌在行文里，让正文的论证顺理成章地引出它。判断标准只有一个——**读起来是流畅的承上启下，不是逐张贴标签**。

  - **✅ 要达到的三个目的（是目的，不是句式模板，也不是每张图都照抄的固定结构）**：让读者明白 ①这张图在讲什么、②它承接上文的什么、③它支撑什么结论。怎么把这三点织进段落、按什么顺序、用什么句式，由你按行文自由安排——先给结论再放图印证，或先描述现象再引出图解释都行。**要变的是"怎么写"（句式、切入角度、顺序），不变的是"写多深"。**

  - **⛔⛔ 图后解读的深度底线（铁律，本次要根治的第二个核心问题）**：每张图后面的解读**绝不能一句话带过**（像"见图 24：盘入螺线、两段圆弧与盘出螺线在切点处光滑连接"这样单句收尾就是失败）。每张图的配文（图前引导+图后解读合计）**必须落地这三样，缺一不可**：①**具体数值**——从图里读出的关键数字（极径 4.229m、缩短 7.59%、峰值 1.72 m/s 等），不是泛泛说"趋势明显"；②**对比或趋势**——和基准/其他方案/前一问的对照，或量沿某轴怎么变；③**推论或衔接**——这张图证明了什么、暴露了什么瓶颈、引出下文哪一步。做不到这三样，说明这张图对论证没用，那就不该放。

    - **❌ 敷衍反例（现在的通病，禁止）**：「弧长优化过程与对比见图 25：多起点收敛到同一最优邻域，最优值稳定低于基准。」——只有一句、没有数值、没有量化对比、戛然而止。

    - **✅ 标杆正例（要模仿的充实度）**：「由图 15 可见，碰撞半径随螺距增大严格单调下降：螺距由 0.4m 增至 0.55m 时，碰撞半径由 7.04m 单调降至 2.289m；数据点与 R_t=4.5m 阈值线的交点恰对应临界螺距 p_min=0.448m，交点左侧盘不进边界、右侧可盘入。曲线在交点附近斜率适中，说明临界螺距的反演稳定、二分求根条件良好。」——数值、单调趋势、阈值交点、稳定性推论俱全，且句式自然不套路。

  - **⛔⛔ 严禁句式套路化（本次要根治的核心问题）**：绝不许把每张图都写成同一骨架，尤其「【图类型】（如图 N）+ 动词 + 一句结论」这种统一开头（例："瀑布图（如图 33）把……"、"雷达图（如图 34）对比……"、"热力图（如图 35）表明……"——连续几张都这么起头就是失败）。**相邻的图、同一节里的图，切入角度和句式必须换着来**：有的从上文结论切入、有的从要回答的问题切入、有的从图里反常现象切入、有的把图揉进正在展开的论述里不单独起句。像好论文那样叙述，别给每张图发一张格式一样的说明卡。

  - **✅ 图号必须显式引用（学术规范，与"去套路化"并行不悖）**：每张图在正文里都要明确点名（"图 N"），让读者能把这段文字对应到是哪张图——这是硬规范，不能为了避免套路就把图号删掉。**要变的是引用的句式和位置，不是要不要引用**。在下面几种切入方式间轮换，相邻两张图别用同一种：句首带出（「图 3 所示流程中……」）／句中括注（「……基本成立（见图 2）：」）／动词引导（「观察图 4 中的三条曲线……」）／图作主语（「图 5 对比了……」）／后置印证（「……这一结论在图 6 中得到印证」）。图号一定要出现，但别让每张图都用「图 N + 动词 + 一句结论」这一种开头。

  - **⛔⛔ 图后解读段开头必须轮换（本次要根治：docx 图片就地嵌入，天然诱导每段都「图 N…」打头）**：图作主语开头（「图 3 的…」「图 4 中…」「图 5 展示了…」）**可以用，但不能连续、不能全用**。硬约束：**相邻两张图的图后解读段，不许都以「图 N…」起句**（连续两段都「图 N…」开头直接判违规）；整节里图号作主语打头的段落**占比不超过一半**。其余图改用 PDF 版那种「先讲发现、图号后置括注」或「由图 N 可见 / 从图 N 可以看出」的口吻——

    - ✅ 对标写法（把「图 N」从主语位挪走）：`长势峰值与亩产相关最强（r=0.759，见图 8）；气温（r=0.709）显著强于降水与日照……` ／ `由图 10 可读出，6 个特征的 VIF 远超 10……` ／ `碰撞半径随螺距增大严格单调下降（图 15）：螺距由 0.4m 增至 0.55m 时……`

    - ❌ 反例（现在的通病，连续图号打头）：`图 8 的相关热力图显示……` 紧接着 `图 9 定量刻画了……` 紧接着 `图 10(a) 的 VIF 条形图显示……`——连续「图 N…」起句，判违规。

  - **⛔ 严禁套话占位**："如图所示""下图展示了结果""这是本文流程图"这种换成任何一张图都成立的句子等于没写。说不出这张图独有的内容和作用，就不该放（"放进去要有用，不然不如不放"）。

  - **⛔ 图注（`![图注](path)` 里 alt 文字）只写简短标签（主体 ≤20 字，不含"图 N："前缀）**：只写这张图是什么的名词短语；判据、参数、坐标含义、结论移到正文图解读里，别塞进图注（Word 图注居中加粗，太长挤成多行很难看）。反例 `![图 3：覆盖半径几何示意：站点为圆心、R=3km 覆盖圆、区域出车距离与响应时间判据](...)` → 正例 `![图 3：站点覆盖半径几何示意](...)`。详见 `_utils/writing_rules.md` 图注长度总则；最终验证会扫图注长度，超限判违规。

  - **⛔ 严禁两张图片直接相邻**（一个 `![...](...)` 紧跟另一个、中间没有正文段落）。若确需连续展示两图，必须在中间写过渡正文，说清两图的逻辑关系。



### Step 1.5: 文献预检索



⛔ 写任何引用之前，先建立已验证的文献池：

```bash

PYTHON=""; for _c in "$MH_PYTHON" python python3; do [ -z "$_c" ] && continue; if $_c -c "import sys" >/dev/null 2>&1; then PYTHON="$_c"; break; fi; done; [ -z "$PYTHON" ] && PYTHON=python

mkdir -p _tmp

# 根据论文主题搜索（按选题调整）

#   $PYTHON "$SCHOLAR_SCRIPT" bibtex "整数规划 调度" --max 5

```



把搜索结果写到 `_tmp/_verified_refs.txt`，写正文时只引用池子里的论文。



### Step 2: 撰写论文（一次写到 paper/main.md）



写作顺序：

1. **先写正文**（问题重述 → 假设 → 符号 → 各子问题 → 灵敏度 → 评价）

2. **再写参考文献**

3. **最后写摘要**（必须最后写，这样数字可以从正文摘出）



**⛔ 动笔前先读获奖语料（六大板块通用：摘要/问题分析/建模推导/求解/检验/结论，一个都不能跳）：**

写每个板块前，读 `data/award_paper_exemplars.json`（国赛优秀论文范文精选包索引，2021-2025 共 62 篇，`priority_25` 为优先样本）中**同赛事/同题型 2-3 篇**的结构化条目，并对照 `skills/award-paper-mining/data/` 对应库取该板块的写法基准：摘要→`abstract_golden_structure.md`，句式与段落节奏→`sentence_pattern_library.md`，图表与版面→`figure_table_conventions.md` + `typography_spec.md`；原文页扫描件按 `all_by_year` 索引在 `assets-local/award-papers/` 取用。模仿其信息密度与节奏（一段承载几个论点、数值怎么嵌进叙述、推导怎么铺开）；**禁止照抄措辞**——照抄同时踩查重与 AI 痕迹两道闸。语料索引缺席或字段不全时如实说明并跳过对标，不虚构读过。



**⛔ 跨章上下文 + 图数据绑定（防"两张皮"）：**

- 全文写在一个 `main.md` 里也要前后连贯：**每写完一节就往工作区根目录 `_writing_context.md` 追加 3-5 行要点卡**（核心论点／关键数字／新定义的符号术语／已讨论的图表），后续章节先回读它，承接前文结论、复用已定义术语（不重复定义）、保持同一指标数字全文一致。详见 `_utils/writing_rules.md` 的 `<chapter_context_card>`。

- **写每张图/表的分析前**，先按 `<figure_data_binding>`：从 FIGURE_MANIFEST/latex_includes 认清"这张图画的是什么量" → 去 `RESULTS.md`／`figures/all_results.json` 定位它对应的真实数值 → 分析里只用这些真值，**禁止凭图形状/位置猜数、禁止编造坐标**。



总骨架（以国赛/华为杯/MathorCup 为例，一份完整 main.md）：



```markdown

# [论文标题]



## 摘要



[占位：Step 5 最后填写]



**关键词**：...



## 1 问题重述



[用自己的话重述，不抄题目原文。1-2 段背景 + 各子问题概述]



[先用一两段把三个子问题之间的递进关系讲清楚，让读者明白整体求解思路，行文自然收束到"整条技术路线可概括如下"再放图——不要用"如图1所示"起句]



![图 1：技术路线图](figures/fig_roadmap.png)



[图后承接：点出这条路线里最关键的一环，引出下文第一个子问题。示例句式仅供参考，务必每张图换不同的切入方式，切忌"如图X所示/图X显示"千篇一律]



## 2 模型假设



为简化建模，本文做出以下假设：



（1）[假设内容]。该假设的合理性在于... [1-2 句]

（2）[假设内容]。... 

（3）...

（4）...

（5）...



⛔ 4-6 条，每条 1-2 句。不要写成长段落，不要超过 6 条。



## 3 符号说明



**表 1：主要符号说明**



| 符号 | 含义 | 单位 |

|------|------|------|

| $N$ | 总数量 | 个 |

| $x_i$ | 第 $i$ 个变量 | --- |

| ... | ... | ... |



⛔ 15-20 个符号以内，只列正文实际使用的核心变量。



## 4 问题一的建模与求解



### 4.1 问题分析



[1-2 段，分析问题特点、关键约束、采用的求解思路]



### 4.2 模型建立



[从上一小节的问题分析自然过渡：既然问题的关键在于X，求解就需要分几步走——把流程讲出来后引出图。换一种起句，不要又是"如图2所示"]



![图 2：问题一求解流程](figures/fig_flow_q1.png)



记 $x_i$ 为决策变量，则模型可表示为：



$$\min \sum_{i=1}^n c_i x_i \quad (1)$$



$$\text{s.t.} \quad \sum_i a_{ij} x_i \leq b_j, \quad j=1,\dots,m \quad (2)$$



[公式后必须有 ≥ 5 行说明：每个符号物理意义、约束条件含义、目标函数解释]



### 4.3 求解算法



[算法步骤说明 + 复杂度分析。可用「（1）...（2）...（3）...」行内编号]



### 4.4 结果分析



**表 2：问题一最优解**



| 算法 | 适应度 | 求解时间(s) |

|------|--------|-------------|

| GA | 0.823 | 12.3 |

| PSO | 0.811 | 10.8 |

| 本文方法 | **0.917** | **9.4** |



由表 2 可见，本文方法在适应度上比 GA 高 11.4%，求解时间比 PSO 减少 13.0%。... [≥ 2 段数值解读 + 原因分析]



![图 3：问题一各算法收敛曲线](figures/fig_results_q1.png)



[这里再换一种切入：可以先抛出"表 2 的差距从何而来"这个问题，再用收敛曲线回答，把图揉进正在展开的论证里，而不是"图3显示…"式贴标签。图后给出足够的数值解读与原因分析，说透为止]



## 5 问题二的建模与求解



[同问题一结构]



## 6 问题三的建模与求解



[同问题一结构]



## 7 灵敏度分析与模型检验



[选 ≥ 2 个关键参数，每个参数的变化曲线 + 分析段落]



## 8 模型评价与推广



### 8.1 优点



[3-4 条优点，每条 1 段说明]



### 8.2 不足



[2-3 条不足，每条 1 段说明]



### 8.3 推广



[1-2 段推广到其他场景的可能性]



## 参考文献



[1] LeSage J P, Pace R K. Introduction to Spatial Econometrics[M]. CRC Press, 2009.

[2] ...



## 附录 A：代码



```python

# 代码片段或文件清单

```

```



### Step 3: 写作纪律（每章节都遵守）



**⛔ 写作风格铁律：**

- **禁止用 markdown bullet（`-`、`*`）或编号列表（`1.`、`2.`）作为正文叙述。** 只在「输入清单 / 评价指标定义 / 软件依赖 / 模型假设条目」这种枚举性场景使用。正文叙述必须用连贯段落。

- **每段至少 3-5 句话。**

- **连续段落不能以相同句式开头。** 三段都「本文...」开头必须改。

- **段落长短错落。** 相邻段落字数几乎相等（差 <20%）说明节奏单一，是 AI 结构痕迹；长段展开论证、短段给结论，写作时自查。

- **图题（图注 alt）写发现，不写「XX 对比图」。** 图注优先以 ≤20 字承载发现或发现式名词短语（如「误差随噪声水平升高」），禁止「XX 对比图 / XX 结果图」式空标签；放不下的结论移正文图解读段（与图注长度门禁同向）。

- **关键数据给误差范围或置信区间，禁止全文统一四位小数。** 所有数值一刀切同一精度是机器输出痕迹；按量纲与误差水平取有效位，关键估计量附 ± 区间或置信区间。

- **结论章禁止复述摘要。** 不复述各问数值结果，必须给出局限性与适用边界（模型在哪类场景失效、对哪个假设/参数最敏感、结论在什么范围内成立）。

- **图号必须显式引用、句式换着来（标准优秀论文口径）。** 每张图都要点名「图 N」让读者对上号（硬规范，别为避免套路删图号）；要禁的是「图 X 展示了……从图中可以看出……」这种图作主语+空话的单调重复，不是禁止一切图作主语。相邻两图引用句式必须不同，在括号旁注（首选）／句首带出／动词引导／图作主语（带实质结论时用，整节最多一次）／后置印证间轮换；**相邻两段都以「图 N…」起句直接判违规**。术语与内部代号（如 C4、blend、脊线分布、弱监督自洽上界）首次出现必须先用大白话解释再用，不能把流水线黑话直接搬进正文。

- **元叙述泄露禁止。** 正文不能出现"参赛者"、"参赛队伍"、"RESULTS.md"、"figures/all_results.json"、"AGENTS.md"等内部文件名。



**⛔ 数值来源规则：**

所有数值（适应度、最优解、求解时间、各项指标）必须来自 `figures/all_results.json` / `figures/problem_*_results.json` / `RESULTS.md`。



**⛔ 禁止 `cat figures/*_results.json`。** 这些结果文件常含全精度时序数组（可达数十 MB / 数十万行），整读会撑爆上下文——本地大模型直接失败、经中转的 GPT 因协议翻译超长反复 `api_retry` 卡死。**论文正文只用标量数值（适应度/最优解/求解时间/各项指标），巨型数组是给图表用的、不进正文。** 写每个章节前，用下面的 `summarize` 脚本拿 KB 级摘要（标量原样显示、精度零损失，只把大数组压成「长度+范围+前3样本」）：



```bash

[ -f RESULTS.md ] && cat RESULTS.md

python3 - <<'PY'

import json, os, glob

def summarize(v, depth=0):

    if isinstance(v, list):

        n=len(v); nums=[x for x in v if isinstance(x,(int,float))]

        if nums: return f'list[{n}] range=[{min(nums):.4g},{max(nums):.4g}] sample={v[:3]}'

        if v and isinstance(v[0], (list,dict)): return f'list[{n}] of {type(v[0]).__name__}, first_shape={len(v[0]) if hasattr(v[0],"__len__") else "?"}'

        return f'list[{n}] sample={str(v[:3])[:80]}'

    if isinstance(v, dict) and depth<2:

        return 'dict{'+', '.join(f'{k}: {summarize(x,depth+1)}' for k,x in list(v.items())[:6])+'}'

    return f'{type(v).__name__}={str(v)[:60]}'

for f in sorted(glob.glob('figures/*_results.json')):

    sz=os.path.getsize(f); d=json.load(open(f,encoding='utf-8'))

    print(f'\n=== {os.path.basename(f)} ({sz//1024}KB) ===')

    if isinstance(d, dict):

        for k,v in d.items(): print(f'  {k}: {summarize(v)}')

    else: print(f'  {summarize(d)}')

PY

```

论文要引的标量都在 `RESULTS.md` 和上面摘要的 range/sample 里；若某个标量摘要没显示全，用 `python3 -c "import json;d=json.load(open('figures/all_results.json'));print(d['键名'])"` 定点取那一个值，仍然不要整读。原样复制数字，不要凭记忆估算或四舍五入。



**⛔ 图文并茂硬规则：**

- 每张图/表后面必须有 ≥ 5 行分析（数值解读 + 对比 + 原因），然后才能放下一张图

- 绝对禁止两张图连续出现中间没有分析段落

- 图片 alt 文字（caption）必须中文



**⛔ 长表格处理：**

- ≤ 15 行：直接放正文

- > 15 行：正文放摘要表（前 5 行 + 后 3 行 + 「⋮」省略）+ 末尾的「## 附录 A」放完整表

- caption 注明「（部分，完整结果见附录）」

⛔⛔ **例外：符号说明表必须完整列出，不许用「⋮」省略、也不许挪进附录。** 它是全文符号的唯一索引，
省掉中间行那些符号就再无处可查（实测事故：26 行被截成 8 行）。Word 表格本身能自动跨页。



每写完一章后检查字数：

```bash

chars=$(wc -m < paper/main.md)

echo "main.md: $chars 字符"

```



### Step 4: 引用整理



写完正文后整理引用编号：



```bash

# 提取正文所有 [N]

grep -oE '\[[0-9]+(-[0-9]+)?(, *[0-9]+)*\]' paper/main.md | sort -u > _tmp/_cited.txt

echo "正文引用编号:"

cat _tmp/_cited.txt



# 检查参考文献条目数

ref_count=$(awk '/^## 参考文献/,0' paper/main.md | grep -cE '^\[[0-9]+\]')

echo "参考文献条目: $ref_count"

```



⛔ 引用编号必须连续递增（[1], [2], [3], [4]... 按首次出现顺序），不能跳号、不能回退。

⛔ 多引用合并：编号相邻 → 用 `[1, 2, 3]`；编号不相邻或跨度大 → 分别写 `[1][5]`。

⛔ 数模 ≥ 10 篇，统计建模 ≥ 20 篇。**⛔ 真实性优先**：这是真实检索的目标量，禁止为凑数编造文献；真检索不足就如实少写，不许编。



### Step 4.5: 用 scholar_fetch 验证文献（必跑）



⛔ **所有参考文献必须用 scholar_fetch.py 工具获取真实 BibTeX。禁止凭记忆编造。**



写正文时用**描述性 citation key**便于后续搜索：`作者姓_年份_主题关键词`。

- ✅ `wang_2023_供应链韧性` 

- ❌ `wang2023supply`（无法回搜）

- 不确定作者/年份 → `TODO__` 前缀：`TODO__整数规划_车辆调度`



写完正文后逐个验证：



```bash

PYTHON=""; for _c in "$MH_PYTHON" python python3; do [ -z "$_c" ] && continue; if $_c -c "import sys" >/dev/null 2>&1; then PYTHON="$_c"; break; fi; done; [ -z "$PYTHON" ] && PYTHON=python

SCHOLAR_SCRIPT="tools/scholar_fetch.py"

mkdir -p _tmp



# 把每个引用的描述性 key 列到 _tmp/_topics.txt

while IFS= read -r key; do

    query=$(echo "$key" | sed 's/^TODO__//; s/_/ /g')

    echo "--- 搜索: $key (query: $query) ---"

    $PYTHON "$SCHOLAR_SCRIPT" bibtex "$query" --max 3

    sleep 0.5

done < _tmp/_topics.txt

```



处理每个搜索结果：

1. 检查 `match_label`：`"good"` → 直接用。`"partial"` → 核对标题。`"low"` → 重新搜索或用 WebSearch。

2. `match_score` < 0.3 说明可能搜错，不要盲目使用。

3. 把搜到的真实文献按 GB/T 7714 格式写入末尾的「## 参考文献」章节，顺序与正文 `[N]` **首次出现**顺序一致。



**兜底**：搜不到或 `match_label="low"`，用 WebSearch 在 Google Scholar / Semantic Scholar 网站手动核实标题+作者+年份。



### Step 4.6: Claims-Evidence 矩阵核对



写每个章节前重读 PROBLEM_ANALYSIS.md / MODELING_REPORT.md 中的 claims-evidence 矩阵：



```bash

grep -A 100 'Claims-Evidence\|claim.*evidence\|claim-evidence\|观点.*证据' PROBLEM_ANALYSIS.md MODELING_REPORT.md PAPER_PLAN.md 2>/dev/null | head -50

```



写作纪律：

- 论文中每个论断必须对应到规划中的某一行

- 不要添加规划外的新论断（如有新发现，先更新 MODELING_REPORT.md）

- 不要跳过规划中的论断（即使是负面结果也要如实报告）

- 每个论断的数值证据必须与 `figures/all_results.json` 一致



如果某个规划中的论断在数据中找不到证据，诚实写「初步结果提示 X，更严谨的验证留待未来工作」，不要编造证据。



### Step 5: De-AI polish



参见 `_utils/writing_rules.md` 的 `<de_ai_polish>`。重点：

- 删除「本文提出 / 我们提出」类套话开头

- 用具体动词替换「探索 / 研究 / 调查」

- 控制「本文 / 我们」频次

- 去掉 AI 写作痕迹（"值得注意的是" / "综上所述" 为硬拦套话，出现即按替代说法改写）

**⛔ 机检必跑（人工通读会漏，必须机器扫）**：

```bash
AITELL=""
for f in _utils/ai_tell_check.py skills/shared-scripts/ai_tell_check.py; do
  [ -f "$f" ] && { AITELL="$f"; break; }
done
[ -n "$AITELL" ] && python "$AITELL" --strict paper/main.md
# 退出码：0=干净  1=查出禁用语汇(必修)  2=没找到正文(跳过不阻塞)
```

工程/质检语汇（口径/闭环/台账等）与中文套话（值得注意的是/综上所述/不难发现/显而易见/在此基础上/随着…的发展）同为**硬拦**，exit 1 逐条按替代说法改写后重跑；剩余空话（由此可见/换言之等）在 `--strict` 下也计失败。



### Step 5.5: 交叉评审（可选）



```bash

mkdir -p _tmp

cat << 'REVIEW_EOF' > _tmp/_review_prompt.txt

请评审这篇竞赛论文草稿。重点关注：

1. 子问题覆盖完整性（每个子问题是否给出明确数值结果？）

2. 论点-证据对齐（每个结论是否有数据支撑？）

3. 章节结构与竞赛规范一致性

4. 写作清晰度（是否有元叙述泄露 / 套话开头）

5. 评分 1-10 + 最需改进的 3 个方面



## 论文正文：

REVIEW_EOF

cat paper/main.md >> _tmp/_review_prompt.txt

PYTHON=""; for _c in "$MH_PYTHON" python python3; do [ -z "$_c" ] && continue; if $_c -c "import sys" >/dev/null 2>&1; then PYTHON="$_c"; break; fi; done; [ -z "$PYTHON" ] && PYTHON=python

REVIEWER_SCRIPT="tools/reviewer_client.py"

$PYTHON "$REVIEWER_SCRIPT" --prompt-file _tmp/_review_prompt.txt --thread-file _tmp/_reviewer_thread.json 2>&1 | tee _tmp/_cross_review.txt

```



如评审脚本不可用则跳过。



### Step 5.6: 最后写摘要



⛔ **MANDATORY: 现在才写摘要。** 之前是占位符。

⛔ **摘要写法两条硬要求**：① 每问开头一句话交代「要解决什么 + 怎么解决 + 量化结果」，评委按问快速核对；② 禁止「随着…的发展」式空背景开头（AI 套话，ai_tell_check 硬拦）——首句直接给现实矛盾或数据事实。动笔前先对照 `data/award_paper_exemplars.json` 同赛事 2-3 篇 + `skills/award-paper-mining/data/abstract_golden_structure.md`（摘要黄金结构），模仿信息密度与节奏、禁止照抄措辞。



读 RESULTS.md / figures/all_results.json / 已写完的各子问题章节，把每个子问题的具体数值结果摘出来填进摘要：



```markdown

## 摘要



[第 1 段] 本文针对... 的问题，建立了... 模型... [背景与思路概述]



[第 2 段] 针对问题一，本文采用... 算法，最优解为... 适应度达到 0.917，求解时间 9.4 秒。... [问题一具体方法+数值]



[第 3 段] 针对问题二，本文构建... 模型... [问题二具体方法+数值]



[第 4 段] 针对问题三，本文... [问题三具体方法+数值]



[第 5 段] 灵敏度分析表明... 模型评价显示... [模型评价+推广]



**关键词**：关键词1；关键词2；关键词3；关键词4；关键词5

```



⛔ 摘要字数（按 AGENTS.md 关键词触发）：

- 通用数模竞赛：**600-800 字**（硬范围，生成目标 680-760；单一契约 `_utils/abstract_writing_contract.md`），按问题分段

- 统计建模：**500-700 字**

- **丰满模式**：**摘要规范不变**——仍按 **600-800 字**、同一物理页、每问一段执行（契约 `_utils/abstract_writing_contract.md`：丰满模式只增加正文建模/求解/结果论证深度，不得用它绕过摘要单页质量门）；触发条件：`CONTEST_ID = comp_huawei`（华为杯默认，赛事判据=下发的规范赛事 ID）或 `AGENTS.md` 含用户开关 `丰满模式` / `rich_mode`

  ```bash

  # 检测：[ "$CONTEST_ID" = "comp_huawei" ] || grep -qiE "丰满模式|rich_mode" AGENTS.md

  ```



⛔⛔ **每个"针对问题 X"必须独立成段，与上下段之间用 markdown 空行隔开**（一个连续段落里只能有一个"针对问题 X"，绝不允许两个或更多挤在同一段）：



```markdown

（正确 ✅）

针对问题一，...具体方法+数值。



针对问题二，...具体方法+数值。



针对问题三，...具体方法+数值。

```



```markdown

（错误 ❌ — Word 导出后会变成"问题三/四/五挤一段"）

针对问题三，...4.413m。针对问题四，...88.9%。针对问题五，...246m/s。

```



⛔ **写完摘要后跑自检**（按 markdown 空行拆段，扫每段是否多次"针对问题"；用 `python` 不是 `python3`）：

```bash

python - <<'PY'

import re, sys

text = open('paper/main.md', encoding='utf-8').read()

# 抽取 ## 摘要 章节（到下一个 ## 标题为止）

m = re.search(r'^##\s*(摘要|Abstract)[\s\S]*?(?=^##\s|\Z)', text, re.MULTILINE)

if not m:

    print('⚠ 未找到 ## 摘要 章节'); sys.exit(0)

section = m.group(0)

bad = []

for i, para in enumerate(re.split(r'\n\s*\n', section), 1):

    if len(re.findall(r'针对问题', para)) > 1:

        bad.append((i, para.strip()[:80]))

if bad:

    print(f"❌ 摘要中 {len(bad)} 个段落包含多个'针对问题' — 必须每个独立成段（用空行分隔）")

    for i, snippet in bad:

        print(f"  段 {i}: {snippet}...")

    sys.exit(1)

print('✓ 摘要分段正确')

PY

```

⛔ **闭环规则：若自检 `exit 1`（检测到挤段），立即回到 `paper/main.md` 的 `## 摘要` 章节，在每个"针对问题 X"前补一个 markdown 空行拆成独立段落，然后重跑上面的自检，直到输出"✓ 摘要分段正确"为止，方可进入下一步。**



⛔ 统计建模额外写英文摘要（350-500 词），结构和数值与中文一一对应。



### Step 6: 最终验证



```bash

echo "=== 最终验证 ==="



# 1. 主产物

[ -f paper/main.md ] && SZ=$(wc -c < paper/main.md) || SZ=0

echo "paper/main.md: $SZ bytes"



# 2. 正文 vs 附录 分离统计（正文/附录分开报告）

body_md=$(awk '/^## *附录/{exit} {print}' paper/main.md 2>/dev/null)

body_chars=$(echo "$body_md" | wc -m)

total_chars=$(wc -m < paper/main.md 2>/dev/null || echo 0)

appendix_chars=$((total_chars - body_chars))

est_body=$((body_chars / 800))

est_appendix=$((appendix_chars / 800))

if [ -n "$PAGE_CAP" ]; then
    echo "正文字符: $body_chars (~$est_body 页), 附录字符: $appendix_chars (~$est_appendix 页, 单独统计), 上限: <= $PAGE_CAP 页 (口径: ${PAGE_SCOPE:-未指明 -> 待核实})"
else
    echo "正文字符: $body_chars (~$est_body 页), 附录字符: $appendix_chars (~$est_appendix 页) — PAGE_CAP 未下发，页数上限未知（待核实），不设默认目标"
fi

# 篇幅随建模与论证需要自然形成：无每章/每子问题页数配额，无"低于目标80%必须扩写"类下限
# （华为杯单题配额"每子问题 ≥8-10 页+≥6-8图"已废止——非已证官方规则）。确需扩充时遵守防幻觉约束：
#   补公式只能从 MODELING_REPORT.md 抄推导，不能凭印象编新公式 / 编数字；
#   增过程图必须真画 PNG（不能占位符）；加灵敏度必须真跑 sensitivity 代码（不能编数字）；
#   扩展后强制重跑 python3 _utils/facts_audit.py paper（FAIL 不允许结束）



# 3. 顶级章节数

sec_count=$(grep -cE '^## ' paper/main.md)

echo "顶级章节数: $sec_count"



# 4. 子问题覆盖度

for n in 一 二 三; do

    if grep -qE "^## [0-9]+ 问题${n}" paper/main.md; then

        echo "✅ 问题${n}章节存在"

    else

        echo "⚠ 问题${n}章节缺失"

    fi

done



# 5. 图嵌入检查

echo "--- 图嵌入检查 ---"

missing_img=0

for img in figures/*.png figures/*.pdf; do

    [ -f "$img" ] || continue

    bn=$(basename "$img")

    [ "$bn" = "latex_includes.tex" ] && continue

    if ! grep -q "$bn" paper/main.md; then

        echo "⚠ 未嵌入: $bn"

        missing_img=$((missing_img + 1))

    fi

done

echo "未嵌入图: $missing_img"

[ "$missing_img" -gt 0 ] && echo "⛔ 必须把缺失的图嵌入到对应章节"



# 5.4 ⛔ 图连排检查（防「两张图连在一起中间没文字」）

echo "--- 图连排检查 ---"

python - paper/main.md << 'PYEOF'

import re, sys

try:

    t = open(sys.argv[1], encoding='utf-8', errors='ignore').read()

except FileNotFoundError:

    sys.exit(0)

# 抓所有 markdown 图片 ![...](...) 的位置，检测两图之间的实际正文

imgs = list(re.finditer(r'!\[[^\]]*\]\([^)]*\)', t))

bad = 0

for i in range(len(imgs) - 1):

    gap = t[imgs[i].end():imgs[i+1].start()]

    body = re.sub(r'\s+', '', gap)          # 去空白

    if len(body) < 80:                      # 两图夹缝实际正文 < 80 字符 → 敷衍（连排或一句话带过）

        bad += 1

if bad:

    print("  X paper/main.md: 有 %d 处图间正文过少（<80字，疑似敷衍/一句话带过），每张图后必须有充分解读：具体数值+对比或趋势+推论或衔接，不许单句收尾" % bad)

PYEOF

echo "（无输出=未发现连排）"



# 5.5 ⛔ FIGURE_MANIFEST 对账: 规划的每张图既要存在又要被引用

echo "--- FIGURE_MANIFEST 对账 ---"

PLAN_FILE=""

for f in PROBLEM_ANALYSIS.md PAPER_PLAN.md MODELING_REPORT.md; do

  [ -f "$f" ] && grep -q '<!-- BEGIN FIGURE_MANIFEST -->' "$f" && { PLAN_FILE="$f"; break; }

done

if [ -n "$PLAN_FILE" ]; then

    START=$(grep -n '<!-- BEGIN FIGURE_MANIFEST -->' "$PLAN_FILE" | head -1 | cut -d: -f1)

    END=$(grep -n '<!-- END FIGURE_MANIFEST -->' "$PLAN_FILE" | head -1 | cut -d: -f1)

    EXPECTED_FIGS=$(sed -n "${START},${END}p" "$PLAN_FILE" | grep -oE '^[[:space:]]*-[[:space:]]+(fig_[a-zA-Z0-9_]+|tikz_[a-zA-Z0-9_]+)' | sed 's/^[[:space:]]*-[[:space:]]*//')

    manifest_missing=0

    for name in $EXPECTED_FIGS; do

        # 既要文件在 figures/ 下存在 (任意一种格式), 又要 paper/main.md 引用

        if ! ls figures/${name}.png figures/${name}.pdf figures/${name}.drawio 2>/dev/null | head -1 | grep -q .; then

            echo "❌ MANIFEST 规划的 $name 文件不存在"

            manifest_missing=$((manifest_missing + 1))

        elif ! grep -qE "${name}\.(png|pdf)" paper/main.md; then

            echo "❌ MANIFEST 规划的 $name 文件存在但 paper/main.md 没引用"

            manifest_missing=$((manifest_missing + 1))

        fi

    done

    if [ "$manifest_missing" -gt 0 ]; then

        echo "⛔ FIGURE_MANIFEST 对账失败 ($manifest_missing 张): 必须在正文嵌入这些图后才能结束"

    else

        echo "✅ FIGURE_MANIFEST 全部嵌入"

    fi

else

    echo "(没有 FIGURE_MANIFEST, 跳过对账)"

fi



# 6. 引用编号检查

max_cited=$(grep -oE '\[[0-9]+\]' paper/main.md | grep -v '^## ' | tr -d '[]' | sort -n | tail -1)

ref_lines=$(awk '/^## 参考文献/,0' paper/main.md | grep -cE '^\[[0-9]+\]')

echo "正文最大引用编号: ${max_cited:-0}, 参考文献条目: $ref_lines"

[ -n "$max_cited" ] && [ "$ref_lines" -lt "$max_cited" ] && echo "⛔ 参考文献条目少于正文引用编号"



# 7. LaTeX 残留检查

if grep -qE '\\(begin|end|input|cite|ref|label|includegraphics|section|chapter)\{' paper/main.md; then

    echo "⛔ LaTeX 残留："

    grep -nE '\\(begin|end|input|cite|ref|label|includegraphics|section|chapter)\{' paper/main.md | head -5

fi



# 8. .tex 残留检查

ls paper/*.tex paper/sections/*.tex 2>/dev/null | head -1 | grep -q . && echo "⛔ 检测到 .tex" || echo "✅ 无 .tex"



# 9. 摘要是否真写了（不是占位符）

if grep -A 3 '^## 摘要' paper/main.md | grep -qE '占位|placeholder|待|TODO'; then

    echo "⛔ 摘要还是占位符，必须填写"

fi



# 10. ⛔ 图号起句去套路化检测（Word 版专属：LaTeX 竞赛流程由 writing_check.sh 兜底，docx 流程此前没有，导致

#     正文里每张图都写成"图 N 显示…/图 N 中…"这种单调开头。这里补上，与 LaTeX 版口径一致。）

echo "--- 图号起句去套路化检测 ---"

PYTHONIOENCODING=utf-8 python - paper/main.md << 'PYEOF'

import re, sys

try:

    text = open(sys.argv[1], encoding='utf-8', errors='ignore').read().replace('\r\n', '\n')

except FileNotFoundError:

    sys.exit(0)

# 只查正文：截到"## 附录"/"## 参考文献"为止（附录代码/参考文献里的图号不算）

m = re.search(r'\n##\s*(附录|参考文献|Appendix|References)', text)

body = text[:m.start()] if m else text

# 以"图 N…/表 N…"起句 = 最单调的 AI 痕迹（"如图/从图/由图/见图/观察图"这类带出式不算，它们把图号沉在句中）

open_re = re.compile(r'^(图|表)\s*\d')

def is_prose(p):

    s = p.strip()

    if len(s) < 15:                      # 太短：多半是题注残行/单行标签

        return False

    if s[0] in '#>|`!*-\\%{}$&':         # 标题/引用/表格/代码/图片(![)/列表/加粗/LaTeX 命令，非分析散文

        return False

    if re.match(r'^\d+\.', s):           # 有序列表 "1."

        return False

    return True

# 按顶级章节 (## ) 分组，段内按空行拆

sections = re.split(r'(?m)^##\s', body)

adj_pairs = 0        # 相邻两分析段都图号起句（硬违规，继承 LaTeX 版口径）

heavy_secs = []      # 单节图号起句 >=3（交替盲区：每图配一个"图N开头"段，中间隔带出段也算）

for sec in sections:

    flags = [bool(open_re.match(p.strip())) for p in re.split(r'\n\s*\n', sec) if is_prose(p)]

    adj_pairs += sum(1 for i in range(len(flags) - 1) if flags[i] and flags[i + 1])

    n_open = sum(flags)

    if n_open >= 3:

        heavy_secs.append(n_open)

bad = adj_pairs > 0 or bool(heavy_secs)

if bad:

    if adj_pairs:

        print(f"  X {adj_pairs} 处相邻段落都以「图 N…/表 N…」起句 — 最刺眼的套路，必须把图号沉到句中或句末括号")

    if heavy_secs:

        print(f"  X {len(heavy_secs)} 个章节里图号起句段 >=3（{heavy_secs}）— 每张图都'图N开头'太单调，须换切入方式")

    print("  修复：改成 括号旁注(首选，如『……（图 3）』)／动词引导(『观察图 4 中……』)／后置印证(『……在图 5 得到印证』)；「图作主语」整节最多一次")

    sys.exit(3)

print("  OK: 图号引用句式无套路化")

PYEOF

fig_rc=$?

[ "$fig_rc" -eq 3 ] && echo "⛔ 图号起句套路化：按上面提示改写后，重跑本检测直到输出 ✅ 才能结束"



# 11. ⛔ 图注超长检测（图注 alt 文字只写简短标签，判据/参数/结论移入正文）

echo "--- 图注超长检测 ---"

python - paper/main.md << 'PYEOF'

import re, sys

LIMIT = 20  # 剥掉"图 N："前缀后的中文字上限（与规范一致，超 20 字判违规）

try:

    text = open(sys.argv[1], encoding='utf-8', errors='ignore').read()

except FileNotFoundError:

    sys.exit(0)

# 只查正文（截到附录/参考文献为止），与 writing_source_check.py 题注检查口径一致（>20 汉字或 >14 英文词告警）

m = re.search(r'(?m)^##\s*(附录|参考文献|Appendix|References)', text)

body_text = text[:m.start()] if m else text

bad = []

for alt in re.findall(r'!\[([^\]]*)\]\([^)]*\)', body_text):

    body = re.sub(r'^\s*[图表]\s*\d+\s*[:：.、]?\s*', '', alt)   # 剥"图/表 N："编号前缀

    cn = re.findall(r'[一-鿿]', body)                 # 只数中文字

    if len(cn) > LIMIT:

        bad.append((len(cn), ''.join(cn)[:30]))

if bad:

    for n, preview in bad:

        print(f"  ❌ 图注主体 {n} 字（>{LIMIT}）: {preview}...")

    print(f"  共 {len(bad)} 处图注过长 — alt 文字只写简短标签(≤20字)，判据/参数/结论移入正文")

    sys.exit(3)

print("  ✅ 图注长度合规")

PYEOF

cap_rc=$?

[ "$cap_rc" -eq 3 ] && echo "⛔ 图注过长：把 alt 文字压成简短标签、细节移入正文后，重跑本检测直到输出 ✅ 才能结束"



# 12. ⛔ docx 收尾格式探针（管页码域/身份泄漏/行距三查；docx 在场才跑，缺席 SKIP 不冒充通过）

DOCX_PROBE=""

for f in _utils/docx_format_probe.py skills/shared-scripts/docx_format_probe.py; do

  [ -f "$f" ] && { DOCX_PROBE="$f"; break; }

done

PROBE_RC=0

[ -n "$DOCX_PROBE" ] && { python "$DOCX_PROBE" .; PROBE_RC=$?; }

[ "$PROBE_RC" -eq 1 ] && echo "⛔ docx 格式探针 FAIL（页码缺域/身份泄漏）：按上面 [页码域]/[身份泄漏] 提示修复后重跑本探针直到退出码 0 才能结束（rc=2 无 docx 为 SKIP，不冒充通过）"

# 退出码：0=干净  1=有 FAIL（⛔ 行硬拦，修完重跑）  2=无 docx（SKIP，不冒充通过）

```



如果任何 ⛔ 出现，回到对应步骤修复。



⛔ **图号起句检测是"检测→修复→再检测"闭环**：只要上面第 10 项报 ❌（`exit 3`），就必须回到 `paper/main.md`，把被点名的"图 N…/表 N…"开头段改成括号旁注／动词引导／后置印证等切入方式（「图作主语」整节最多一次），然后**重跑第 10 项检测，直到输出「✅ 图号引用句式无套路化」为止**，方可结束。这条与 LaTeX 竞赛流程 `writing_check.sh` 的相邻图号检测口径一致，确保 Word 导出与 PDF 导出质量对齐。



## 统计建模专属：章节设计指南（仅 stats 类型适用）



数模竞赛章节固定（问题重述 → 假设 → 符号 → 各子问题 → 灵敏度 → 评价），但**统计建模章节由内容驱动**，没有固定模板。看 `MODELING_REPORT.md` / `TOPIC_PLAN.md` 后自主设计 5-7 个中段章节。



### 固定骨架（必须保留）



```

摘要（中英文，分页）

一、绪论/前言（研究背景 + 文献综述 + 研究目标）

  ↓

  [中段章节：内容驱动，3-5 章]

  ↓

N、结论与建议（结论 + 建议 + 创新与不足）

参考文献

致谢

附录（代码）

```



### 中段章节设计原则



**原则 1：章节标题必须具体，不要泛化**

- ✗ 「四、模型构建」 → ✓ 「四、基于 CNN 的水质预测模型构建与评价」

- ✗ 「五、实证分析」 → ✓ 「五、生育意愿的影响因素 — 集成学习模型」



**原则 2：按研究逻辑链组织，不按教科书方法论**

- 多子问题/多模型 → 每个模型一章

- 单方法深入分析 → 按分析步骤组织



**原则 3：数据与方法可合并或拆分**

- 数据简单（一个数据集）→ 合并「数据与方法」

- 数据复杂（多源、重预处理）→ 单独「数据描述与预处理」



### 4 个获奖论文结构示例（参考，不要照抄）



**示例 A — 分类 + 路径分析（生育意愿）**：

前言 → 模型构建（集成 + Bayesian Network） → 数据与预处理 → 探索性特征分析 → 影响因素（集成结果） → 影响路径（贝叶斯网络结果） → 结论



**示例 B — 混合建模（数据要素与经济增长）**：

研究背景+文献 → 研究思路 → 理论分析 → 模型构建（生产函数 + 回归 + ARIMA，每个一节） → 模型应用（GDP 预测） → 总结建议 → 创新与不足



**示例 C — DEA 评价（经济可持续性）**：

绪论 → 文献综述 → 研究区域概况 → 评价指标体系 → 数据优化处理（标准化 + PCA） → DEA 模型建立 → 结论建议



**示例 D — 深度学习预测（CNN 水质）**：

绪论 → 模型构建思路与创新 → 数据描述 → 主成分分析 → CNN 模型构建（含模型对比） → 结论展望



**关键观察**：

- 没有任何获奖论文用「基线回归 → 稳健性 → 异质性」结构（除非主题就是因果推断）

- 章节数 5-7，由内容决定

- 「模型介绍/理论基础」可在数据章节前或后

- 「创新与不足」可在结论里或单独一章



### 章节设计自查（写之前必跑）



- [ ] 每章标题是否含具体研究内容（不是「模型构建」这种泛化）？

- [ ] 章节顺序是否符合研究逻辑链？

- [ ] 核心分析章节（模型结果）是否占 40-50%？

- [ ] 是否有数据描述/探索性分析专章？

- [ ] 结论是否含「创新」「不足」？



中文数字章节（一、二、三...），子节用（一）（二）（三）。**不要**用 1、2、3 或 1.1、1.2。



## 写作深度参考（按竞赛类型）



| 类型 | 页数 | 字符数（markdown） | 文献数 |

|------|------|--------------------|--------|

| 数模国赛 (30p) | 25-30 | 18000-25000 | ≥ 10 |

| 华为杯 | 40-50 | 30000-40000 | ≥ 15 |

| MathorCup | 35-40 | 25000-35000 | ≥ 10 |

| 华中杯 | 25-30 | 18000-25000 | ≥ 10 |

| 五一杯 | 25-30 | 18000-25000 | ≥ 10 |

| 统计建模 | 35-40 | 25000-35000 | ≥ 20 |



### 数模竞赛各章字数（参考，1 字 ≈ 1 字符）



- 问题重述+分析：2-3 页（用自己话重述，不抄题目）

- 模型假设+符号说明：2 页（5-7 假设，每条含理由；15-25 符号一表）

- 每个子问题：5-7 页（建模 2p + 求解 1.5p + 结果表+图 1p + 分析 0.5-1.5p）

- 灵敏度分析：2-3 页（≥ 2 个关键参数，每个变化曲线 + 分析段）

- 模型评价：2 页（3-4 优点 + 2-3 不足 + 推广，纯文字无图）

以上页数/字数只是体量参考而非配额；各板块的信息密度与节奏动笔前对标 `data/award_paper_exemplars.json` 同赛事 2-3 篇（见 Step 2 语料指令），不为凑量注水。



### 统计建模各章字数（参考）



- 绪论/前言：4-8 页（背景 + 文献综述按 3-4 主题分组每组 3-5 篇 + 研究目标）

- 数据描述与预处理：6-8 页（数据源 + 变量表 + 描述统计 + 探索性分析）

- 模型/方法章节：6-10 页（理论基础 + 公式推导 + 参数 + 实现）

- 核心结果分析：10-16 页（**最重要**，每个结果 2-3 段解读）

- 结论建议：3-5 页



### 获奖论文共性



- 扎实的探索性分析（交叉表 + 分组对比 + 丰富可视化）

- 核心分析章节占 40-50%，每个数值结果有深度解读

- 章节标题具体（「基于集成学习的生育意愿影响因素分析」而非「模型构建」）

- 含「创新与不足」讨论（评审加分项）



### 图表使用原则



**统计建模**：图先于表。图表选择由实际方法决定 — 回归用 forest plot + 系数表；预测用预测对比图 + 准确率表；分类用混淆矩阵 + ROC；评价用雷达图 + 排名表。每个分析步骤必有对应图/表。



**数模竞赛**：「字不如表，表不如图」。每个子问题必有独立结果展示（表 + 图）。



不强求图表（纯文献综述、纯理论推导可不放图）。



## 引用规则（中文竞赛论文必须遵守）



### 上标格式



中文竞赛论文**必须用上标引用**：正文用 `[1]`（自动渲染为上标 ¹），不要用 `[1]` 平排显示。



### 编号递增（严格，不可违反）



写正文时每个引用编号必须比之前所有已出现的编号大：

- ✅ 正确：全文第一个引用 `[1]`，第二个 `[2]`，第三个 `[3]`...

- ❌ 错误：先出现 `[3]`，后出现 `[8]`，又回到 `[1]` — 编号跳跃

- ❌ 错误：前文 `[5]`，后文新引用为 `[3]` — 编号回退



### 多引用合并规则



同一处引用多篇文献时：

- ✅ 正确：`方法A [1, 2, 3]` — 编号升序

- ✅ 正确：`方法A [1] [5]` — 编号不相邻可分开

- ❌ 错误：`方法A [1] [2] [3]` — 连续相邻应合并为 `[1, 2, 3]`

- ❌ 错误：`方法A [3, 1, 2]` — 顺序错乱

- ❌ 错误：`方法A [3, 1]` — 编号降序



合并判定规则（严格）：

1. 多引用里编号必须升序

2. 编号不相邻（差 > 1）建议合并保持整洁

3. 不能保证升序，宁愿分开写也不要错序合并



### 数模 ≥ 10 篇，统计建模 ≥ 20 篇



## 长表格处理（>15 行结果表必须遵守）



如果某个结果表（调度方案、路径规划、逐日预测等）超过 15 行数据，**不要**完整放正文，会挤压正文空间。



正确做法：



1. **正文摘要表**：前 5 行 + 后 3 行 + 「⋮」省略 + 汇总统计（均值/最优/总计）。caption 注「（部分，完整结果见附录表 X）」。

2. **附录完整表**：在「## 附录 A」放完整表格。



```markdown

**表 N：问题一调度方案（部分，完整结果见附录表 X）**



| 任务 | 设备 | 开始 | 结束 |

|------|------|------|------|

| 1 | A | 0 | 5 |

| 2 | B | 2 | 8 |

| 3 | A | 5 | 12 |

| ⋮ | ⋮ | ⋮ | ⋮ |

| 28 | C | 45 | 52 |

| 29 | A | 48 | 55 |

| 30 | B | 50 | 58 |



注：完整调度方案（30 条）见附录表 X。Makespan = 58。

```



判断标准：表格行数 > 15 → 用摘要 + 附录方案。



## 数模竞赛章节铁律（写之前必读）



**⛔ 数模竞赛严格按章节顺序：**

```

## 1 问题重述（用自己的话，不抄题目原文）

## 2 模型假设（5-7 条，每条含内容 + 合理性说明）

## 3 符号说明（15-20 个核心变量，三线表）

## 4 问题一的建模与求解

## 5 问题二的建模与求解

## 6 问题三的建模与求解

## 7 灵敏度分析与模型检验

## 8 模型评价与推广

## 参考文献

## 附录 A：代码

```



**⛔ 模型假设数量控制**：4-5 条，不超过 6 条。每条 1-2 句话（假设内容 + 合理性说明），不写长段落。假设太多说明问题没简化好。



**⛔ 符号说明表格控制**：15-20 个变量以内。只列正文实际使用的核心变量，不要把所有中间变量都列进去。



**⛔ MathorCup 必须用 `MathorCupmodeling` 模板的章节命名**（队伍编号 + 题号 + 题目放在文档开头，不要单独封面页）。markdown 用对应一级标题表达即可，docx 引擎会按 profile 渲染。



**⛔ 华中杯特殊**：参考文献用编号 `[1]`，docx 引擎会按 profile 渲染。



## 图文一致性规则（写每章前必读）



**⛔ 图文数值一致性规则**：描述图表内容时（如"从图 X 可以看出，模型 A 的 RMSE 为 0.023"），数值必须从 `figures/*.json` / `RESULTS.md` 读取，不要凭记忆。



**⛔ 图片大小**：markdown 图片自动按页面宽度渲染（docx 引擎处理），写作时不需要手动指定尺寸。但描述图表前后必须有 ≥ 5 行分析文字（数值解读 + 对比 + 结论）。



## 约束一致性检查（写完正文必跑）



读 PROBLEM_ANALYSIS.md 检查每个数值结果是否满足题目约束：



```

=== 论文-题目约束一致性检查 ===

1. 读取题目里所有约束（容量、预算、时间窗、数量限制等）

2. 逐个检查论文正文中的结果是否满足这些约束

   例：题目说"车辆载重上限 6000kg"，论文写"装载 7344kg" → 矛盾，必须修

   例：题目说"30 个省份"，论文分析了 28 个 → 不完整，必须补

3. 摘要中的数字与正文一致？

4. 同一结果在多处出现时数字完全相同？

   （如问题一最优解在摘要、正文、结论 3 次出现，必须完全相同）

```



如果发现矛盾，**修改论文**而不是改约束。如果代码结果本身违反约束，回到 comp-code 修复。



## 各章节写作要点（通用，适配研究逻辑）



**⛔ 写作风格铁律（所有章节都遵守）：**

- **禁止用 markdown bullet/编号列表作为正文叙述。** bullet 仅用于「输入清单 / 评价指标定义 / 软件依赖 / 模型假设条目」。正文叙述必须连贯段落。

  - 列举用「（1）...（2）...（3）...」行内编号，或改写为自然衔接的连贯段落（不用「首先/其次/最后」机械过渡链——过程式骨架是 AI 痕迹）

- **每段至少 3-5 句话。** 不写 1-2 句的短段落。

- **连续段落不能以相同句式开头。** 三段都「本文...」开头必须改。

- **段落长短错落。** 相邻段落字数几乎相等（差 <20%）说明节奏单一，是 AI 结构痕迹；长段展开论证、短段给结论，写作时自查。

- **图题（图注 alt）写发现，不写「XX 对比图」。** 图注优先以 ≤20 字承载发现或发现式名词短语（如「误差随噪声水平升高」），禁止「XX 对比图 / XX 结果图」式空标签；放不下的结论移正文图解读段（与图注长度门禁同向）。

- **关键数据给误差范围或置信区间，禁止全文统一四位小数。** 所有数值一刀切同一精度是机器输出痕迹；按量纲与误差水平取有效位，关键估计量附 ± 区间或置信区间。

- **图号必须显式引用、句式换着来（标准优秀论文口径）。** 每张图都要点名「图 N」让读者对上号（硬规范，别为避免套路删图号）；要禁的是「图 X 展示了……从图中可以看出……」这种图作主语+空话的单调重复，不是禁止一切图作主语。相邻两图引用句式必须不同，在括号旁注（首选）／句首带出／动词引导／图作主语（带实质结论时用，整节最多一次）／后置印证间轮换；**相邻两段都以「图 N…」起句直接判违规**。术语与内部代号（如 C4、blend、脊线分布、弱监督自洽上界）首次出现必须先用大白话解释再用，不能把流水线黑话直接搬进正文。

- **禁止元叙述泄露。** 正文不能出现"参赛者"、"参赛队伍"、"RESULTS.md"、"figures/all_results.json"、"AGENTS.md"等内部文件名或工作流术语。



### 绪论/前言（所有论文）

- 研究背景（问题为什么重要）→ 文献综述 / 研究现状（别人做了什么，差距在哪）→ 研究目标 / 内容 / 贡献 → 论文结构

- 文献综述按主题分组（≥ 15 引用），不要按时间顺序罗列



### 数据与预处理（几乎所有论文都要）

- 数据源 → 样本描述（时间范围 / 样本量 / 变量数）→ 变量定义 / 编码表 → 缺失值 / 异常值处理 → 探索性分析（分布图 / 趋势图 / 交叉表）

- 探索性分析是给评审看能力的关键，不要跳过



### 模型/方法章节（按实际研究内容组织）

- 每个模型/方法：理论基础（1-2 段）→ 数学公式 → 参数设定依据 → 实现细节

- 多模型：可以先介绍所有模型再展示结果（示例 B 风格），或每个模型一章带结果（示例 A 风格）

**⛔ 每个模型的建模小节必答「人类痕迹四问」**（评审实测反馈：「模型建立过程一点没有」「找不到公式」——答不上来就是 AI 式建模，只把公式摆出来）：

1. **为什么选这个方法**：对比过哪些替代方案、各自为何不合适（一两句写进正文）；
2. **参数从哪来**：数据估计、文献取值还是标定实验，给出处与取值依据，不凭空落数；
3. **完整推导链**：从假设到结论逐步呈现，关键一步一行，读者能跟着验算；禁止只给终式；
4. **这个模型哪里脆弱**：哪里可能失真、对哪个假设或参数最敏感——检验章节（灵敏度/误差界）必须回应这一问。

正反对照（建模小节开头怎么写）：

- ❌ AI 式：直接抛公式。"建立 XGBoost 模型：[公式]。参数取 n_estimators=500。"——看不见选择理由、参数依据与推导过程，评委有理由怀疑模型是抄的。

- ✅ 人类式：先说约束冲突，再引出建模选择。"样本特征含连续与类别两类量纲，直接最小二乘会被类别维度主导，故先将类别量做目标编码，再以梯度提升树拟合非线性项：[公式]。树深与学习率按 5 折交叉验证在训练段标定；弱学习器个数受样本量约束取 500（附录参数表）。该模型对编码泄露最敏感，第 X 章灵敏度分析单独检验。"



### 结果分析章节（核心，占 40-50%）

- 每个结果必须有：数值呈现（表/图）→ 解读（2-3 段，不只是「如表所示」）→ 与预期/其他方法对比 → 原因分析

- 多模型对比：横向对比表 + 选最优模型的理由



### 结论与建议

- 主要结论（呼应研究目标）→ 政策/应用建议（具体可执行）→ 创新点 → 不足与未来工作

- 「创新与不足」可在结论里或单独一章（示例 B 风格）

- ⛔ 结论章禁止复述摘要：不复述各问数值结果，必须给出局限性与适用边界（模型在哪类场景失效、对哪个假设/参数最敏感、结论在什么范围内成立）



## 扩写策略（实质内容，不是注水）



- 公式列出但没推导 → 加分步推导 + 物理意义

- 结果只「如表所示」 → 加 2-3 段（数值含义 + 与预期对比 + 原因 + 与其他方法对比）

- 假设光秃秃列表 → 每条加合理性说明

- 算法只伪代码 → 加关键步骤说明 + 复杂度 + 收敛性讨论

- 文献综述只罗列 → 每篇加方法摘要 + 与本工作的联系



## Key Rules（docx 模式专属）



- **唯一主产物**：`paper/main.md`

- **绝不产**：`.tex` / `.bib` / `.cls` / `.sty` / `.aux`

- **公式**：`$...$` / `$$...$$`，禁止 `\begin{equation}` / `\[...\]` / `\begin{align}`

- **图嵌入**：`![中文 caption](path)`，禁止 `\includegraphics`

- **表格**：markdown pipe table，禁止 `\begin{table}` / `\input{TABLE_x.tex}`

- **引用**：`[N]`，禁止 `\cite{}`

- **参考文献**：以文本形式直接写在 `## 参考文献` 章节，禁止 `\bibitem` / `.bib`

- 数模摘要按问题分段（4-5 段，每段对应一个子问题）

- 中文 caption（不要英文）

- 篇幅随建模与论证需要自然形成（无字符数下限配额）；不超过下发的 PAGE_CAP

- 数值必须来自 `figures/all_results.json` / `figures/problem_*_results.json` / `RESULTS.md`，禁止编造

- 长表格 (>15 行) 用「正文摘要 + 附录完整版」

- 引用编号按首次出现顺序，不跳号不回退

- 备份现有 `paper/main.md` 后再覆盖



<!-- 测试自动更新 v1.0.3 -->

<!-- v1.0.5 测试 -->

<!-- v1.0.7 测试 -->

<!-- v1.0.8 测试 -->

<!-- v1.0.9 测试 -->



## ⛔ 数据可追溯性（写稿强制规则）



> 防止「图文表面自洽但数据是历史版本」的 bug。详见 `_utils/error_prevention.md` 第九章。



正文/图表/附录引用的**每一个具体数字**必须满足：

1. 能在当前 `results.json` 或 `figures/all_results.json` 里 `grep` 到

2. RESULTS.md 末尾有 `<!-- AUDIT_OK source=results.json rechecked_at=<timestamp> -->` 凭证

3. 工作区没有 `results_v*.json` / `results_old.json` 等历史文件残留

4. 描述任何"依赖载体 / 上游变量动态变化的派生属性"（作用范围 / 时变参数 / 状态依赖容量 / 时变转化率等）时，**禁止**简化成"以静态点为中心的固定区域"或"取均值后当常数"，除非确为静态实体且已显式声明简化条件



写完正文前自检：

```bash

# 1. 检查 RESULTS.md 末尾凭证 + 可疑虚构数字清零

grep -q '<!-- AUDIT_OK source=' RESULTS.md || { echo "❌ 缺 AUDIT_OK 凭证 — 先回 comp-code 跑约束审计"; }

if grep -q 'n_suspicious_numbers=' RESULTS.md; then

    grep -qE 'n_suspicious_numbers=0([^0-9]|$)' RESULTS.md \

        && echo "✅ 审计凭证完整（含虚构数字清零确认）" \

        || echo "❌ 凭证里 n_suspicious_numbers > 0，存在虚构嫌疑数字，先回 comp-code 跑 facts_audit_v2 清理"

else

    echo "✅ 审计凭证存在（旧版凭证，未含虚构数字字段）"

fi



# 1c. ⛔ 参数密集型题目必跑：正文结论 vs results.json 一致性

if [ -f PROBLEM_FACTS.json ]; then

    python3 _utils/facts_audit.py --stage paper 2>&1 | tee -a AUDIT_REPORT.md

    PAPER_RC=$?

    if [ $PAPER_RC -eq 1 ]; then

        echo "❌ Step 5 结论审计失败：正文结论性陈述与 results.json 不一致。先修正文，再导出 docx。"

    fi

fi



# 1d. ⛔ 含多种事件源的题目必查（防"写稿脑补事件源"）

#     凡是涉及"谁做了什么 N 次"的指向性陈述，必须能在 results.json 的 verb_to_sources

#     映射 + events 列表里反推；不允许凭计数器变量名脑补来源。

#     facts_audit --stage paper 的 [14] 项会自动跑事件源归属审计；若 results.json

#     未声明 verb_to_sources/events 字段，本检查跳过（本题不涉及多事件源）。

echo "(事件源归属审计已包含在 facts_audit --stage paper 的 [14] 项里)"



# 2. 检查历史文件残留

HIST=$(ls results_v*.json results_old.json *_backup.json 2>/dev/null | wc -l)

[ "$HIST" -gt 0 ] && echo "⚠ 发现 $HIST 个历史 JSON 文件，可能造成版本漂移：$(ls results_v*.json results_old.json *_backup.json 2>/dev/null)" || echo "✅ 无历史 JSON 残留"



# 3. 检查正文里的数字能否在 results.json 找到（采样 30 个）

python3 -c "

import os, re, json

# docx 路线候选正文：markdown 中间稿 / RESULTS.md（docx 本身二进制无法 grep，必须看 md 源）

text = ''

for p in ('paper/main.md', 'RESULTS.md', 'main.md', 'paper.md'):

    if os.path.exists(p):

        text = open(p, encoding='utf-8').read()

        print(f'读取正文: {p}')

        break

if not text:

    print('⚠ 未找到 markdown 源稿（paper/main.md / RESULTS.md / main.md），跳过数字溯源检查')

    raise SystemExit(0)

# 合并多份结果 JSON

results_str = ''

for p in ('results.json', 'figures/all_results.json', 'figures/results.json'):

    if os.path.exists(p):

        try:

            results_str += json.dumps(json.load(open(p, encoding='utf-8')), ensure_ascii=False)

        except Exception as e:

            print(f'⚠ 读取 {p} 失败: {e}')

if not results_str:

    print('⚠ 未找到 results.json / figures/all_results.json，无法做数字溯源校验')

    raise SystemExit(0)

nums = re.findall(r'[-+]?\d+\.\d{2,}', text)[:30]

miss = [n for n in nums if n not in results_str]

print(f'抽样 {len(nums)} 个数字，{len(nums)-len(miss)} 个能在结果 JSON 中找到')

if miss:

    print(f'⚠ 找不到的: {miss[:5]}{\"...\" if len(miss)>5 else \"\"}')

"

```



