---
name: cy-carousel
description: 制作 AI 科技类小红书图文轮播（封面＋10张内页，1440×1920，暗底或浅色纸底，电子青强调色）：讲一个 AI 概念、一篇论文或一个产品，体裁是「AI 学习笔记」。查证一手出处、找开放授权素材（论文原文、真实截图、人物照），用 scripts/手排.py 照 ELIZA 的做法逐页手排（毛笔双色标题、原文纸条放大加红圈、电子青大数字、问句贴条），再用 render.py 渲染、check_all.py 检查、package.py 打包。用户要做 AI/科技/论文/产品类图文，或复用、精修这类轮播时使用。
---

# AI 科技图文轮播

讲清一个 AI 概念、一篇论文或一个产品。读者不是专业人士，要让他一张张翻下去：反差钩子 → 一个看得懂的大例子 → 一句话定义 → 三条编号思考。样板（用户认定最好的两篇，先看它们的节奏和密度）：`examples/01-ELIZA`（暗底）、`examples/02-Dots`（浅色纸底）。另有 `examples/03-聪明汉斯`（老照片＋原书书页＋论文，含完整手排脚本）、`examples/04-AI幻觉`（一场官司讲清一个概念：案卷原文纸条、聊天截图、大字定义）。

## 红线（违反任何一条就不合格）

1. **事实可回溯**：每个数字、引文、日期都回到论文原文、官方页面或一手史料，写进 `research/事实表.md`（陈述、原句、页码/URL、状态、用在哪页）。数字的主语要对（哪个模型、在什么考卷上）；单篇论文的案例不能写成「AI 都这样」；流传但没证据的说法不写。
2. **只用开放授权素材**：公有领域、CC0、CC BY、CC BY-SA，或开放获取论文。记下原链接、许可、SHA256 和用页。不用生成的人物、无关古画、可辨认的陌生人；同一个真实人物含封面最多 3 页。
3. **图上不写出处、授权说明**。出处放置顶评论和 `来源.md`，CC BY 素材在置顶评论里署名。可以有黑底白字的人名/物件小标签；后来年份的照片要在标签里写清，别让人当成事件现场。
4. **不改原文**：纸条和截图是原样裁切，红圈、下划线是后加的标注。为了去掉半个词或无关的前后句可以涂白，置顶评论里说明。位图最多放大 1.25 倍。
5. **不用 `build.py` 的自动版式库**排页面，那套出来的页面「不如之前做的」。`build.py` 只作为渲染和断行的底层库。
6. **不发布**：脚本只出文件，不上传。
7. **参照图不外传**：参照账号/对标作者的图只在本机看和量，不上传到任何外部网站（以图搜图、在线 OCR、图床等），除非用户在对话里明确同意。

## 版式

- **底色**：暗底 `#080808`（`check_all` 只认 ≤8 为纯黑），或浅色纸底（例 02 Dots）；一篇只用一种，不混。浅底上字直接压底，不加白框。拼贴层透明底；整页压暗的照片用 `backdrop()`，darken 0.30–0.70，不要烤进拼贴。
- **标题**：马善政毛笔两行，第一行米白 `#F3F1E9`，第二行电子青 `#00E5FF`，立体投影；英文和数字自动换黑体（`render.py` 的 `latin_font`，`headline()` 已设好）。离页面上边 ≥40px。
- **原文纸条**：论文用 `strip()` 按目标宽度矢量渲染；扫描书页用 `scan_strip()`，词框由 macOS Vision 找（`scripts/ocrfind.swift`，首次自动编译）。只截含关键词的 1–2 行，满宽贴边、不倾斜。关键词画红圈；行距密时改用下划线（`unders`）或页边红竖线（`bars`）；切进来的半个词、半行、无关前后句涂白（`whiteout`）。
- **照片和截图**：`photo()` 不倾斜，`put(..., bleed='right'|'left'|'full')` 贴页边出血，一页一个主角。
- **大字**：关键数字用 `big()`，电子青黑体 120–220px；定义页可以排成大字公式（例 01 第 7 页、例 03 第 7 页）。
- **问句贴条**：`sticker()`，青底深字，每页最多一个，≤20 字。
- **正文**：`body()` 52–66px，每页最多两段、每段 ≤60 字。**字体按题材选**：`body(font=...)` 候选 宋体粗（默认）/宋体/仿宋/楷体/文楷/苹方细；先用 `S.font_sample(同一句, 'out.png')` 出同字对比小样再定，**一篇内只用一款**（标题照旧是毛笔）。
- **排字规则**：`body(..., typo=True)`：「——」画成两段带间隙细线（每段 0.74em、推进 0.86em）、省略号画三个等距圆点、【】约 0.44em、「·」约 0.3em、正文里的数字和拉丁字母换 Times（非 macOS 找不到时回退随包 Noto Serif SC 并警告）并放大 1.07（`latin_scale` 1.05–1.10）。`justify=True` 两端对齐（增量肉眼几乎看不出：字缝最多加 0.05em、空格最多 0.5em，超了整行左对齐；先用标点挤压吸收余量）。`hscale` 横向压缩文字层（参照账号正文约 0.95，默认 1.0）；`headline/big` 也有 `hscale`。数值和原理见 `references/排字细节.md`。
- **图层顺序**：默认文字压在图上。要图片压住文字边缘时用 `Canvas(split_shadow=True)` ＋ `page(..., layer_order='text-under-images')`，顺序变成「底色 → 投影 → 文字 → 图片」。
- **emoji**：组合 emoji（1️⃣ 2️⃣ 👉）用 `S.emoji('1️⃣', 64)` 出透明 PNG 再 `put`，不要塞进正文让字体去画。
- **收尾**：毛笔金句＋三条编号思考；署名只写账号名（水印）。

## 流程

1. **选题**：先列 2–4 个候选，比素材（人物照/截图够不够清晰、许可干不干净、能否凑够 12 份以上不同原素材）、体裁（是不是「什么是 X」或反常识）、事实风险（有没有一手出处、争议多不多），选一个。
2. **查证**：建事实表，写「不写的内容」和「争议与写法」两节。论文用 PyMuPDF 定位要上版面的原句（页码＋0–1 框）。
3. **找素材**：下载原图和论文 PDF，记许可和 SHA256，逐张看图（画面、人脸位置、能不能裁 3:4）。Wikimedia 请求放慢，遇 429 等一分钟。
4. **手排**：先出同字对比小样定正文字体；写 `制作.py`，`import 手排 as S`，`S.init(笔记目录)`；逐页用 `Canvas().put()` 摆图和纸条，用 `headline/big/body/sticker/label` 写字，`page(..., backdrop=...)` 组页，最后 `S.write_script(题目, '制作.py')` 生成 `页面脚本.json`。完整写法见 `examples/03-聪明汉斯/制作.py`。
5. **渲染**：`python3 scripts/render.py 页面脚本.json --out pages --assets-root .`；`S.preview('pages', '全套预览.jpg')` 出缩略图，逐页看：文字出界、压字、红圈标错、纸条带半截字、大块空白。
6. **对照**（有参照页时）：`python3 scripts/对照.py 参照.jpg pages/p03.png` 出左右并排图（同高）和文字行偏差表（四边、字高，1440 宽 px 与 %，超 1% 标红），按表调字号和位置再渲染。
7. **检查**：`python3 scripts/check_all.py 页面脚本.json --pages pages --assets-root .`，`errors` 必须为零。可选严格视觉：加 `--strict-visual`（或页面脚本 `config.visual_gate: true`）后，留白超标和「与前页骨架相同」会列入 `visual_blockers` 并使退出码非零；色彩丰富度、原图数量等依赖体裁的建议项不参与。仅适用于正式稿的暗色调；三页小样和浅色调不跑这两项，会在 `checks.strict_visual` 写明不适用并在终端提示，`visual_blockers` 为空不代表通过。留白/骨架检查自身出错时也计入阻断。默认关闭。风格指标只作参考，别为凑指标改版式。
8. **给用户看**：全套预览、对照图、小样复制到会话工作目录，直接把图发给用户（用户看不到文件面板的预览）。
9. **文稿**：标题 3 个（≤20 字）、正文、置顶评论（一手出处、几处说明、逐页配图出处）、`来源.md`。打包（`package.py`）要求笔记目录里有分别命名的非空 UTF-8 文件 `标题.txt`、`正文.txt`、`置顶评论.txt`、`来源.md`，合并成一份「帖子文案.txt」不行。`素材清单.json`（可选）顶层必须是对象：`{"assets":[{"path":"assets/a.png","sha256":"…"}]}`，写成数组会报错。`check_all` / `package` 的「技术通过」不等于视觉验收，输出里的 `visual_acceptance` 字段始终是「未验收」，advisory 建议项要人工逐页看原尺寸图后处理。
10. **打包**：`python3 scripts/package.py --note . --pages pages --out 交付 --assets-root .`。严格视觉模式下加 `--strict-visual`，有阻断项会拒绝交付；逐页目检确认没问题后用 `--accept-visual "理由"` 放行，理由和被放行的阻断项写入 `交付清单.json` 的 `visual_accepted`。

## 常见坑

- 封面毛笔字里的「AI」要用黑体，否则像「刈」：用 `headline()` 就不会。
- 扫描书页常把数字认错（「14」认成「I4」），找不到词时直接传 0–1 框。
- 整页压暗底图上的文字要避开图里的关键部位（比如马鼻子和数字卡）。
- iCloud 同步目录在磁盘快满时会把文件清出本地（读文件卡死）：长任务前先看 `df -h`；被清出时先 `brctl download <路径>`，或把工程复制到本地临时目录跑，跑完再同步回来。
- 换了正文字体后标点默认用字库自带的全角标点（`tight=False`），只有宋体粗按墨迹收紧；破折号、省略号别用字库字形，开 `typo=True`。
- `hscale` 只压文字，不压图片；位图仍然只能等比缩放。
