# Per-Paragraph Font Matching（2026-07-13 消防设施检测合同教训）

## 问题
同一份合同中，不同段落的原文runs可能有完全不同的字体属性方案：
- P20 runs: `ascii=宋体, hAnsi=宋体, cs=宋体, sz=24, eastAsia=None, hint=None`
- P36/P41 runs: `rPr=None`（完全无字体属性，靠docDefaults/style继承）

如果对所有WB INS runs统一设置一种字体属性，必然导致某些段落mismatch。

## 错误做法
```python
# ❌ 全局统一设置
for ins in all_wb_ins:
    rf.set('ascii', '宋体')
    rf.set('sz', '24')
```

## 正确做法
```python
# ✅ 按段落匹配原文第一个非INS/非DEL run的rPr
for p in paras:
    # 找到同段落的第一个orig run
    orig_run = None
    for child in p:
        if child.tag == f'{WNS}r':
            orig_run = child
            break
    
    if orig_run is None:
        continue  # 整段INS，无参照
    
    orig_rpr = orig_run.find(f'{WNS}rPr')
    orig_rf = orig_rpr.find(f'{WNS}rFonts') if orig_rpr is not None else None
    
    # INS的rPr应该与orig_run的rPr完全匹配
    # 如果orig没有rFonts → INS也不该有
    # 如果orig有ascii=宋体但没有eastAsia → INS也是这样
```

## 整段INS段落（无同段原文可比）
- wb-ins-font-verify.py会报"MISSING HINT (无同段原文可比)"
- 这是**已知假阳性**，不算真问题
- 整段INS段落的字体应参照**相邻段落**（前后各2段）的原文run格式
- 如果相邻原文runs有explicit属性(ascii=宋体 sz=24)，INS也设
- 如果相邻原文runs无rPr，INS也不设

## 2026-07-13 消防设施检测合同实证
- 第一次修复：全局strip eastAsia/hint → P20报ASCII MISMATCH（原文有ascii=宋体）
- 第二次修复：全局设ascii=宋体 → P36/P41报ASCII MISMATCH（原文无rFonts）
- 正确修复：per-paragraph检查orig_run是否有ascii → 有则INS也设，无则INS也不设
