---
name: quote
description: 为 shiji-kb wiki 页面补全「史记引文」节。搜索实体标注文件中对该页面实体的真实引用（而非裸字符匹配），展开已知 PN 的完整段落，过滤已引，输出新增候选。当用户说 /quote PAGE 时触发。
---

# /quote — 史记引文补全

## 用法

```
/quote PAGE         → 查找并补全该页面的史记引文
```

## 执行步骤

**第一步：运行脚本（获取候选引文）**

从仓库根运行：

```bash
python3 .claude/skills/quote/scripts/quote_page.py PAGE
# 限制输出条数（高频词地名可能有上百条）
python3 .claude/skills/quote/scripts/quote_page.py PAGE --max 30
```

脚本逻辑：
1. 读页面 frontmatter：`type`、`label`、`pn`、`aliases`
2. 按 `type` 生成实体搜索正则（地名用 `〖=NAME〗`，人名用 `〖@NAME〗` 或 `〖@DISPLAY|NAME〗`，国名用 `〖◆NAME〗`）
3. 扫描所有 `chapter_md/*.tagged.md`，找实体标注出现的段落号
4. 已有 `pn:` 字段中的 PN 也一并展开（即使尚无对应引文）
5. 过滤页面已引用的 PN，输出新增候选

**第二步：评估候选、取舍**

候选列表可能很长（高频地名有几十条），需要按以下标准取舍：

| 保留 | 跳过 |
|------|------|
| 该实体是段落叙述的主角/核心 | 仅路过性提及（"经过X"、"至X而还"） |
| 有具体历史事件 | 年表流水账（仅时间+事件列举，无叙述） |
| 与页面主题直接相关 | 同名异地/同名异人（注意辨别） |
| 引文简短、完整（＜150字为佳） | 超长段落（＞300字）且核心内容少 |

**第三步：读取页面，更新史记引文节**

读页面现有 `## 史记引文` 节，**append-only**：
- 若已有引文（以 `> 出自` 开头），只在最后追加新条目
- 若无引文节，新建该节并添加
- 引文格式：

```markdown
> 出自 [[NNN_章节名|章节名]] （NNN-N）：原文……（150字以内，超长可截断加"……"）
```

- 同一章节多条引文，相邻排列（不重复写章节头）
- 引文按章节号升序排列

**第四步（可选）：更新 pn 字段**

如果脚本发现的重要 PN 不在 frontmatter `pn:` 里，可追加到 `pn:` 字段。

**第五步：记录修订（必须）**

```bash
python3 wiki/scripts/butler/record_revision.py PAGE \
    --summary "quote: 补引文N条（章节名/章节名...）" \
    --author quote
```

只要实际向页面写入了新引文，此步骤不得省略。

## 实体类型与搜索模式

| page type | 搜索正则 | 示例 |
|-----------|----------|------|
| place     | `〖=NAME〗` | `〖=邯郸〗` |
| person    | `〖@NAME〗` 或 `〖@.*\|NAME〗` | `〖@蔺相如〗` `〖@相如\|蔺相如〗` |
| state     | `〖◆NAME〗` | `〖◆赵〗` |
| role/title | `〖;NAME〗` | `〖;丞相〗` |
| story/event | 不做实体扫描，仅展开已知 pn | — |

## 注意事项

- **同名异义**：如"邯郸"既是地名也是人名（侯），脚本按 page type 过滤，但仍需目视确认
- **年表行**：`r` 型 PN（如 `019-r85`）是表格行，不在句子索引，脚本跳过，无需手动追加
- **已有引文格式多样**：页面可能有 `### 章节 (chap-N) [PN:[N]]` 格式（kg/events 导入风格）或 `> 出自` 风格，两种都算"已引"，不重复添加
- **引文内容**：使用句子索引重建的原文（已去标注符号），非 tagged 原始标注文本
