# 诉讼文书：法条原文脚注 + 母版克隆建新文书 + 字体规范化

contract-editor 库在诉讼文书上的三组技法，2026-06-23/24 邹家「情况反映」（给法院监督部门的程序违法反映材料）制作中验证，全部 OnlyOffice x2t 渲染逐页核对过。与 `litigation-doc-tracked-changes.md`（修订态技法）互补——本文是**脚注 + 新建文书 + 字体**层面。

---

## 一、法条原文脚注（Doro 偏好：引用法律规定一律用脚注呈现原文，不删改不概括）

Doro 对引用法条的文书要求：**法条原文（一字不改、不归纳）用脚注方式写进去**。监督申请书 v9 已是这个体例，情况反映照搬。这是可复用的整套做法。

### 1. 脚注格式从同族已有文书克隆，不自造
申请书 v9 的 `word/footnotes.xml` 是现成模板。提取三样：
- **两个特殊脚注** `type=separator` / `type=continuationSeparator`（id=-1/0）——分隔线，照搬。
- **一个内容脚注的段落骨架**（id=1 的 `<w:p>`）——拿它的 `pPr`（脚注段 `spacing line=240`）和三种 run 的 `rPr` 模板：
  - **mark rPr**：带 `<w:rStyle w:val="affb"/>` + Times New Roman + **sz18**（9pt 脚注体，不是正文 sz24）——脚注区那个序号。
  - **bold rPr**：`<w:b/>` + sz18——法名加粗用。
  - **plain rPr**：sz18 无 rStyle 无 b——条号+原文用。
- 正文里的脚注引用标（`footnoteReference` 承载 run）的 rPr 另取：从 v9 **正文** 里找 `r/footnoteReference` 那个 run 的 rPr（`rStyle=affb` + Times + **sz24**，跟正文同号，上标由 affb 样式控制）。

每条脚注 `<w:footnote id=N>` 段落结构：`[footnoteRef(mark rPr)][空格(plain)][法名(bold rPr)][条号+原文(plain rPr)]`。条号与原文之间用**全角空格**（如「第七十一条　证据应当…」）。

### 2. 目标 docx 已支持脚注则零配置
情况反映是从 v9 编辑来的，本就带 `word/footnotes.xml`、rels 里有 footnotes 关系、`[Content_Types].xml` 有 `footnotes+xml`、styles.xml 有 `affb` 样式——直接覆盖 footnotes.xml + 在 document.xml 插引用标即可，**不用补 rels/CT/style**。动手前先 grep 确认这四样齐全；若是从无脚注的 docx 起步，才需要补全四处。

### 3. 插入引用标的位置铁律 + 多 run 锚点陷阱（本次踩坑）
脚注上标要紧贴**法条号正后方**（如「第七十一条¹之规定」「第五十一条第二款³所定」），不要落在句末或下游词上。统一体例：四个脚注全部「条号后挂注」最整齐。

**陷阱**：`第五十一条第二款` 这种锚点在 docx XML 里常**跨多个 w:r**（编号、款号被拆在不同 run）。若按"找到 anchor 所在 run、在该 run 后插引用"的粗定位，会把上标插到 anchor **下游某个 run 后**——本次 ³ 错插到了「承办部门」后（隔了好几个词）。OnlyOffice 渲染出来才发现，vision 核对抓到的。

**正解：字符流 + split run 精确定位**：
```python
# 1) 拼接段落所有 w:t 成 full，建 map: full每个字符 -> (t_element, idx_in_t)
# 2) end = full.find(anchor) + len(anchor) - 1   # 锚点最后一个字符
# 3) t_end, k_end = map[end]；把 t_end 文本 split：head=s[:k_end+1], tail=s[k_end+1:]
# 4) t_end.text=head；在 t_end 所在 run 之后 addnext 一个新 run(脚注引用)；
#    若 tail 非空，再 addnext 一个同 rPr 的 run 承载 tail
```
这样上标精确落在锚点最后一字之后，不受 run 边界影响。容错：`第五十一条第二款` 找不到时退化找 `第五十一条`。

### 4. 款数存疑时，脚注放全条原文
Doro 引「第五十一条**第二款**」，但权威原文里"普通程序不少于十五日"实际在**第一款**。**不擅改他的款数**——脚注内容放该条**全文（含两款）**，无论款数对错，原文都完整覆盖、不断章；款数是否要改回原文里报给 Doro 定，不自己动。

---

## 二、母版克隆建新诉讼文书（保证与同案既有文书同源）

新建一份配套文书（情况反映 vs 已有的监督申请书），要让字体/字号/页边距/样式与同案既有文书**完全同源**——直接拿那份已交付的 docx 当母版。

- **段落模板克隆**：从母版 body 抓代表性段落各一份 deepcopy 当模板——title（居中 bold sz30）、body（首行缩进 fl480 sz24）、recip（机关名顶格 bold sz24）、sign（右对齐 sz24）、date（右对齐）、attt（附件标题顶格 bold）、att（附件项 fl480）。`mk(模板, 文本, bold, no_indent)`：克隆模板→清空其 run/ins/del→（按需删 numPr/ind）→`force_font`(eastAsia=仿宋, ascii/hAnsi=Times)→写新 run。
- **清空原 body 段落**，把新段落 insert 到 `sectPr` 之前（保页边距/分节设置不变）。
- **关 trackRevisions**：新建文书是全新成稿、非修订态，settings.xml 删 `<w:trackRevisions/>`。
- **页眉错配必须清**（本次踩坑）：母版（监督申请书）的 `header1.xml` 带"申请监督民事诉讼案号/受理法院"这种**本文书类型专属抬头**，套到情况反映上不对路。处理：清空 header 所有 run 的文字。
- **页眉横线 = pBdr，单清文字不够**：清了页眉文字后 OnlyOffice 仍渲出一条横线——来自页眉段落的 `<w:pBdr>`（段落下边框）。遍历 header 所有 `pPr` 删 `pBdr`（本例 2 段），并去掉可能带边框的 `pStyle` 引用。styles.xml 里的 Header 样式若也挂 pBdr 一并清。重渲确认顶部纯白到标题。

---

## 三、字体规范化：源文档丢了显式 eastAsia 字体

**症状**：用户编辑过的 docx，正文中文 run 的 `rFonts` **没有 eastAsia 属性**（eastAsia=None），docDefaults 也没设。OnlyOffice 靠底层回退仍渲成仿宋，但**显式字体属性缺失**不符合"中文必须显式仿宋"的交付标准。本次 Doro 改的情况反映 1283 个中文字符全是 eastAsia=None。

**判断边界（重要）**：先比对**用户原版**——若原版本就是 eastAsia=None（不是你的编辑引入的），补齐属于**格式规范化（不改字形、不改一个文字、不动他的内容编辑）**，与历史上的字体规范化同类，可做。若是你的操作把字体搞丢的，那是 bug 要修源头。

**修法**：遍历所有含文字的 run，`rFonts` 设 `eastAsia=仿宋`，缺 ascii/hAnsi 则补 Times New Roman；再给 `docDefaults/rPrDefault/rPr/rFonts` 补 eastAsia=仿宋 兜底。改完 OnlyOffice **重渲**确认无字形回退（字体改动必重渲，vision 核"全文仿宋、无方框、无回退乱码"）。核验：zipfile 统计 CJK→仿宋、LATIN→Times New Roman 计数全覆盖。

---

## 验收三件套（脚注版）
1. **正文脚注引用数** == 预期（`sum(r.find(footnoteReference) for r in runs)`）。
2. **footnotes.xml 内容数** == 引用数，逐条 print 前 50 字核法名+条号+原文。
3. **OnlyOffice x2t 渲染逐页 vision 核**：每个上标在**正确法条号正后方**（重点查多 run 锚点那条没错位）、页脚脚注区原文完整无截断、脚注字号 < 正文、法名加粗、无乱码。脚注主要落在前两页，逐页都要看。

## 一句话
法条脚注：格式克隆同族文书的 footnotes.xml（separator+内容模板，mark/bold/plain 三 rPr），引用标用 split-run 精确插在条号后（多 run 锚点必踩坑），款数存疑放全条原文不擅改。建新文书：克隆母版段落模板保同源，清错配页眉+pBdr 横线。字体：源档丢 eastAsia 时补齐属于规范化（先确认是原档状态不是自己搞丢的），改完必重渲。
