visual-poster-set — 一组竖版视觉海报
用途:把一份长报告变成一组(默认 5 张)竖版海报,供读者快速抓核心结论。
产物:Ardot 画布(可继续编辑)+ 一组 PNG(1080×1620,2x 导出)。
这个 skill 的本质不是"设计",是"结构化重排":作者写的字一个都不改,只把它摆到读者一眼能看懂的位置上。多数失败都源于把它做成了"自己写一段漂亮文案"——那是错的。
一、五条铁律(违反任何一条,产出都会被退回)
1. 禁止改写——海报上每个字都必须能在原文里找到
只允许摘取、删减、拼接原文片段。不许概括、润色、造句、提炼"更好的标题"。
- ❌ "我们脚下的世界是量子力学造的"(自造)
- ❌ "ZP 测算:五年 96 亿元"(把原文"五年采购合计约 96 亿元"改写成标题腔)
- ✅ 直接用作者给的小节名当大标题(如"量子计算为什么重要")
- ✅ 从正文里摘一句当金句
交付前逐句自问:"这句话在他哪个文件里?"答不上来就删掉。
大标题也是原文——用户会要求改。内容不够就回原稿找,不是自己编。
1.1 例外与补充:源材料是逐字稿 / 会议录音时(2026-09-23 实测发现)
逐字稿(ASR 转写)不能照搬——转写错误会把药名、公司名、数字直接写错到海报上。
遇到这类源材料,按三条处理,并在大纲里明确标出:
- 术语归一(属纠错,不属改写):把 ASR 错字改回标准写法。
例:"斯美格鲁肽·四美" → 司美格鲁肽|"河泰·利特尔伯泰" → 替尔泊肽|"李来·米莱" → 礼来|"马士度泰" → 玛仕度肽。
只改专有名词与计量单位,不改句子结构、不改表述、不改语气。 - 只摘承载事实的句子:数字、因果、结论。丢掉口语寒暄、重复、语气词、跑题段落。
- 讲话人自陈不确定的内容不上图:凡出现"我不太记得了""你最好再确认一下""我不知道"的内容,
标记为待核,不上海报。同一事实被反复修正时(如价格先说"1000"、后说"1000 出头"),取最后一次口述的版本。
逐字稿往往还缺现成的标题和小节名,此时由 Step 2 从讲话人自己给出的框架里提取——
讲话人通常会在某个时点说"我大概几个点来讲,第一个……第二个……",那就是他的结构,照抄,不要自创。
2. 先出大纲,审核通过再动手
禁止"边想边画"。必须先交付一份逐页大纲(格式见 Step 3),等用户点头。跳过这一步,做完了也大概率全废。
3. 一页一形态,不允许每页长一样
先判定每页的信息结构,再决定形态。八种已验证形态见 references/structure-patterns.md。
"几张图都没区别"是最常见的返工原因。
4. 骨架固定,中间灵活
- 固定:画布尺寸、大标题字号档位、页脚版式、配色、字体
- 灵活:内容区的块数、形态、留白、强调色
5. 改完立刻导出,导出前先清空目录
画布改完 ≠ 磁盘更新。改完必须:清空输出目录 → export_nodes → 下载覆盖 → 列目录确认无 (2) 重名副本。
否则用户打开文件夹看到的还是几个版本以前的图,会直接问"你在干什么"。
二、工作流
Step 0 — 判定能力链(模板约束优先)
| 情形 | 走哪条链 |
|---|---|
用户从「视觉海报」模板发起(@scene#32:"视觉海报" 之类) |
design-router → Ardot 家族 → 加载 ardot-design-core + ardot-poster(本 skill 与之并列,负责流程与版式约定) |
| 用户直接要求"做一组海报图" | 同上,Ardot 家族 |
| 要求 .pptx 文件 | 不走本 skill,走 pptx 技能 |
| 只要 1 张 | 不走本 skill,走 ardot-poster |
模板是硬约束。 用户从某个模板发起时,不要回去用本地 skill 或换工具——用户会质问"参考模板啊"。
Step 1 — 收取四项输入(缺一项不往下走)
动手前必须拿到这四样。 用户没给全,就用下面这段话直接问(不要只挑一部分问):
> 开始前需要你给我四样东西,不然做出来一定返工:
> 1. 每张图的标题 —— 直接用你原文里的小节名最好;
> 2. 每张图要放哪些核心内容、这些内容是什么结构(并列?递进?对照?名单?测算?)—— 结构决定图长什么样;
> 3. 报告全文 / 口播稿全文(文件路径或直接贴)—— 我只从里面摘字,不会自己写;
> 4. 可选:品牌色 / 尺寸 / 张数 / 有没有需要配的图表。
>
> 拿到后我先出一份逐页大纲给你审,你确认了我再画。
同时确认:
- 张数(默认 5)
- 画布尺寸(默认 1080×1620 竖版)
- 是否放资料来源(默认不放,页脚只留系列标记)
Step 2 — 逐页拆结构(最容易翻车的一步)
拿到报告后逐页判定信息结构,不要只处理用户点名的例子。用户原话:"我说的几个只是例子,每一页都要梳理清楚"。
对每一页回答三个问题:
1. 这一页的核心判断是什么?
2. 支撑它的内容是什么关系(并列 / 递进 / 对照 / 枚举 / 推导 / 时序)?
3. 原文里哪些句子可以直接搬上去?
→ 对照 references/structure-patterns.md 选定形态。
→ 需要补信息时回原稿找,不要自己写。
Step 3 — 出大纲给用户审核(硬门禁)
按下面格式逐页列出。每块文字都标明摘自原文哪句,让用户一眼能查。
### 01|量子计算为什么重要
- 形态:因果箭头链(N 行"原理→应用",末行留白跳色)
- 大标题(原文小节名):量子计算为什么重要
- 引言(摘自 L31):生活在今天的人可能意识不到……
- 内容:
行1 光电效应 → 数码摄像 (摘自 L32)
行2 核裂变 → 原子弹、核电站 (摘自 L40)
行3 激光 → 光纤通信、互联网 (摘自 L45)
行4 能带理论 → 半导体 (摘自 L51)
行5 量子计算 → ? (留白,跳色)
- 收口块:
"我们无法想象量子计算突破算力极限后会把人类带向何方" (L7 摘)
"我们能想象的例子:创新药——……" (L7 摘)
### 02|……
用户点头后才进入 Step 4。若用户说"你直接生成吧",仍要先给大纲,除非他明确说"跳过审稿"。
Step 4 — 建画布
用 create_design 建文件(或沿用用户已有的)。逐页建根 frame:
根 frame:1080 × 1620,layout vertical,gap 0,fill #FFFFFF
├─ 正文区:1080 × 1524,layout vertical,padding 64/64/44/20,gap 22–40
│ └─ 主标题 → …内容块…(形态自由)
└─ 页脚:1080 × 96,layout vertical,padding 72/72/0/0,fill #D9D9D9
├─ 来源 text(content: "",本项目约定不放来源)
└─ 页码 text:"<系列名> · 01 / 05"
页面在画布上的排布(竖版并排):
- 五张根 frame 的 y 坐标相隔 1760(1620 高 + 140 间距),x 统一为 0
完整常量见 references/layout-constants.md(字号档位、配色、几何、Ardot 陷阱)。
Step 5 — 制图
按 Step 2 选定的形态逐块搭建。要点:
- 所有容器与文本一律
height: "hug_contents",绝不写死高度 - 文本节点必须显式给
width+height:"hug_contents"+textAutoResize:"HEIGHT" - 每批
batch_edit≤ 25 个操作;绑定名每批作废,不要跨批复用 - 一行多列时:列宽之和 + 左右 padding ≤ 容器宽
- 需要柱状图 / 趋势图时,用
scripts/poster_chart.py出 PNG,再按references/layout-constants.md§6 塞进画布
Step 6 — 自检
capture_layout(problemsOnly: true)—— 看OUTSIDE_PARENT(内容溢出画布)、LARGE_EMPTY_AREA(大片空白)capture_screenshot—— 视觉确认(同一批修复只截一次,先读完图再改)- 逐项排查:内容是否溢出 / 分栏是否等重 / 字号是否低于地板 / 是否有重复文案 / 徽章里的数字是否真在方块里
关于"底部空白":逐页看 LARGE_EMPTY_AREA 报的空白高度。竖版海报正文区 1524px,
底部空白超过 25% 就要处理——把整页字号档位往上提一档、padding 与 gap 同步放大;
内容确实不够时回原稿找(这一步也是更好的手机阅读体验:字号越大越好读)。
页面之间的空白率要大致齐平,不要一页挤一页空。
Step 7 — 导出并覆盖(不许省)
# ① 清空输出目录(**先确认里面只有本组海报**,见下方删除禁令)
Get-ChildItem "<输出目录>" # 先看一眼,确认内容
Get-ChildItem "<输出目录>" -Filter "0*_*.png" | Remove-Item -Force
# ② export_nodes 拿 URL(format png, scale 2)
# ③ 逐个下载
Invoke-WebRequest -Uri "<url>" -OutFile "<输出目录>\01_<标题>.png"
# ④ 列目录确认,不允许出现 "(2)" 这类重名副本
Get-ChildItem "<输出目录>" -Filter *.png | Sort-Object Name |
Select-Object Name,@{n='KB';e={[math]::Round($_.Length/1KB,1)}} |
Out-File -Encoding utf8 "<清单文件>"
> 删除禁令:只对本组海报的专属输出目录执行清空(通常是报告目录下的 海报\ 子目录)。
> 绝不对桌面、下载目录、项目根目录,或任何混有其他文件的目录执行 Remove-Item *.png。
> 若目录里还有其他 PNG,改为按确切文件名逐个删除(01_xxx.png … 05_xxx.png),不要用通配符扫。
命名:01_<大标题>.png … 05_<大标题>.png。
最后用 present_files 交付。
三、配套文件
| 文件 | 什么时候读 |
|---|---|
references/layout-constants.md |
Step 4 / Step 5 —— 版式常量、配色、字体、换机器字体兜底、Ardot 陷阱、本地图上传步骤 |
references/structure-patterns.md |
Step 2 —— 信息结构 → 图形态对照表(八种已验证形态) |
scripts/poster_chart.py |
需要柱状图 / 趋势图时 —— 出 ZP 风格 PNG 再上传画布 |
四、分发给同事:前置依赖与自检
同事拿到 zip 后:解压到 ~/.workbuddy/skills/(C:\Users\<用户名>\.workbuddy\skills\)即可,无需其他配置。
三条前置依赖,缺一条就跑不动:
| 依赖 | 必需程度 | 说明 / 自检 |
|---|---|---|
| Ardot 画布能力(MCP 已连接) | 必需 | 本 skill 的产物是 Ardot 画布 + PNG。没有它只能出 HTML,不能交付可编辑稿 |
| 中文字体 | 必需 | 默认 Sarasa Gothic SC;换机器必须先跑 get_available_fonts 确认,按 layout-constants.md 的兜底表选替代字体 |
| matplotlib | 仅配图表时需要 | 出柱状图才用。优先复用已有 venv:& "…\python\envs\qc\Scripts\python.exe" scripts\poster_chart.py "<输出.png>";没有就 -m venv 建隔离环境再装,不要全局 pip install |
装完自检(30 秒):随便找一份文档,问一句"把这份文档做一组海报"——
正常表现是先回一段四项输入的话术,而不是直接开画。直接开画说明 skill 没加载。
若字体查不到,会看到海报上中文变成方块或空白,按兜底表改字体即可。
本 skill 不含任何本机路径(脚本与文档里的 Python 路径都写成 C:\Users\<user>\… 占位),
也不读取任何凭证、不联网、不删除无关文件。
五、历史教训(都在真实项目里踩过)
- 只做用户点名的例子 → 用户:"我说的几个只是例子,每一页都要梳理清楚,你读懂文章没有"。
- 每页都长一样 → 用户:"这几张图都没区别啊……不要都每页都一样"。
- 弄错信息归属页 → 把融资信息加到了第 5 页,用户:"融资不是 p4 表格里的吗,怎么是 page5 了"。动手前先确认这块信息归哪一页。
- 改完没导出 → 用户:"我现在看到的图是之前删除掉的版本?????"。见铁律 5。
- 资料来源行放回去了 → 用户要求去除后必须把
content置空,不要"为了完整"再填回来。 - 固定高度容器 → 子项溢出压到下方文字上,看起来像乱码重叠。一律
hug_contents。 - 把信息写成散文 → "为什么重要"这类页要画对照表 / 箭头链,让读者自己看出规律,不要写段落。