@topmindspace/topmind-writing-skills 0.8.36 → 0.8.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [0.8.37] - 2026-10-16
2
+
3
+ > 根包 0.8.36 → **0.8.37**(patch);技能版本:topmind-cover 0.4.8 → 0.4.9;其余技能不变。
4
+
5
+ ### 变更(topmind-cover 深度优化 + 示例图全量刷新)
6
+
7
+ - 新增 `references/scene-builder.md`:七层场景配方、风格组合、六维评分与重做门槛。
8
+ - 新增 `scripts/overlay-title.py`:场景图生成后脚本叠中文标题(简体 CJK 字体,描边 / 阴影 / 胶囊副标签),避免生图模型写错字。
9
+ - `typography-system.md` 扩到 24 种标题花式(T13–T24);`cover-styles.md` 构图骨架扩到 10 种(L5–L10);`cover-prompts.md` 新增 2.8;`impact-language.md`、negative_tests、evals(cover-5~7)同步。
10
+ - `assets/examples/` 55 张示例图 + `overview.png` 按新配方全部重画:先出无字场景,再用 `overlay-title.py` 叠字;尺寸、文件名不变。`docs/assets/writing-cover.png` 同步刷新。
11
+ - 文档口径修正:标题花式 24 种、示例图 55 张。
12
+
1
13
  ## [0.8.36] - 2026-10-14
2
14
 
3
15
  > 根包 0.8.35 → **0.8.36**(patch);技能版本:topmind-briefs 0.2.18 → 0.2.19、topmind-format 0.1.3 → 0.1.4、topmind-viral-posts 0.3.10 → 0.3.11、
package/README.en.md CHANGED
@@ -72,7 +72,7 @@ Checks: `lint_x_post.py` (E1–E9 Markdown leftovers; E10–E12 URLs / source li
72
72
 
73
73
  ### topmind-cover · Cover art generation
74
74
 
75
- Shared cover art for X long-form and WeChat: striking, eye-catching, theme-focused. **Pick a style → check the example → compose the prompt from the recipe**, then one-click crop to both platform sizes with `crop-cover.py` (X 1500×600, WeChat 900×383). 22-style index and recipes: [`references/cover-styles.md`](./topmind-cover/references/cover-styles.md).
75
+ Shared cover art for X long-form and WeChat: striking, eye-catching, theme-focused. **Theme → seven-layer scene recipe → 2–3 style-combo options → layered prompt → six-dimension score** (long titles: scene + `overlay-title.py` overlay), then one-click crop to both platform sizes with `crop-cover.py` (X 1500×600, WeChat 900×383). 22-style index and recipes: [`references/cover-styles.md`](./topmind-cover/references/cover-styles.md).
76
76
 
77
77
  ```bash
78
78
  npx @topmindspace/topmind-writing-skills install topmind-cover
@@ -104,13 +104,13 @@ npx @topmindspace/topmind-writing-skills install topmind-poster
104
104
  |-------|---------|--------------|
105
105
  | [`topmind-wechat-post`](./topmind-wechat-post/) | **0.3.11** | WeChat article lifecycle: package, review, 3 quality gates, inline typography & publish checklist |
106
106
  | [`topmind-x-article`](./topmind-x-article/) | **0.4.17** | X long-form one-click publish: Markdown → one-click-copy HTML (images/prompt copy, click-to-zoom images) / plain-text fallback + cover + checklist |
107
- | [`topmind-cover`](./topmind-cover/) | **0.4.8** | Cover art for X / WeChat (X master 1500×600 / 5:2): striking, theme-focused; 22-style cover style library + 16:9 X short-post cover scene + 12 title treatments + 55 example images (22 styles × 2 sizes + 11 variant samples) + 1 style overview |
107
+ | [`topmind-cover`](./topmind-cover/) | **0.4.9** | Cover art for X / WeChat (X master 1500×600 / 5:2): striking, theme-focused; 22-style cover style library + 16:9 X short-post cover scene + 24 title treatments + 7-layer scene recipe + 55 example images (22 styles × 2 sizes + 11 variant samples) + 1 style overview |
108
108
  | [`topmind-briefs`](./topmind-briefs/) | **0.2.19** | Short-form briefs (WeChat + X): one topic, one chart; data rankings / paper explainers / product alerts / mechanism explainers; sources → images → content → layout; one copy-ready plain-text X block (no HTML by default, emoji optional, no AI tone), links / images sent separately; asks before generating any image |
109
109
  | [`topmind-viral-posts`](./topmind-viral-posts/) | **0.3.11** | X viral short posts: 18 template types + combinations, duanzi layout (blank lines, no emoji, plain bullet lines), one copy-ready plain-text block per post with hashtags last, links / images sent separately, classification tags listed separately; asks before generating an image |
110
110
  | [`topmind-format`](./topmind-format/) | **0.1.4** | X plain-text formatter: to duanzi (blank lines, no emoji) / to short post (paragraphing + sensible lists, emoji optional); layout only, words unchanged, with a fidelity check; one copy-ready plain-text body, links / images sent separately |
111
111
  | [`topmind-poster`](./topmind-poster/) | **0.1.5** | HTML+CSS → high-res long image / poster / infographic PNG: headless Chrome 2× screenshot + auto-trim; "one image per section" batch workflow (generator + renderer) |
112
112
 
113
- Installer [`@topmindspace/topmind-writing-skills`](https://www.npmjs.com/package/@topmindspace/topmind-writing-skills) is **0.8.36** (whole-repo same-tag releases).
113
+ Installer [`@topmindspace/topmind-writing-skills`](https://www.npmjs.com/package/@topmindspace/topmind-writing-skills) is **0.8.37** (whole-repo same-tag releases).
114
114
 
115
115
  ### Which skill, and how they combine
116
116
 
package/README.md CHANGED
@@ -72,7 +72,7 @@ npx @topmindspace/topmind-writing-skills install topmind-format
72
72
 
73
73
  ### topmind-cover · 封面配图生成
74
74
 
75
- X 长文与公众号共用的封面图:震撼、醒目、主题突出。**选风格 → 看示例 → 按配方组 prompt** 三步出图,`crop-cover.py` 一键裁出双平台尺寸(X 1500×600、公众号 900×383),`--preset x-post` 落盘 X 短文封面(1200×675)。22 种风格索引与配方见 [`references/cover-styles.md`](./topmind-cover/references/cover-styles.md)。
75
+ X 长文与公众号共用的封面图:震撼、醒目、主题突出。**主题 → 七层场景配方 → 2–3 个风格组合方案 → 分层 prompt → 六维评分** 出图(标题长时场景图 + `overlay-title.py` 叠字),`crop-cover.py` 一键裁出双平台尺寸(X 1500×600、公众号 900×383),`--preset x-post` 落盘 X 短文封面(1200×675)。22 种风格索引与配方见 [`references/cover-styles.md`](./topmind-cover/references/cover-styles.md)。
76
76
 
77
77
  ```bash
78
78
  npx @topmindspace/topmind-writing-skills install topmind-cover
@@ -104,13 +104,13 @@ npx @topmindspace/topmind-writing-skills install topmind-poster
104
104
  |------|------|--------|
105
105
  | [`topmind-wechat-post`](./topmind-wechat-post/) | **0.3.11** | 公众号文章全生命周期:交付包、审校改写、质量三关、微信内联排版与发布清单 |
106
106
  | [`topmind-x-article`](./topmind-x-article/) | **0.4.17** | X 长文一键发布:Markdown 原稿 → 一键复制 HTML(含配图/提示词复制、图片点击放大)/ 纯文本兜底 + 封面图 + 发布清单 |
107
- | [`topmind-cover`](./topmind-cover/) | **0.4.8** | 文章封面配图(X / 公众号共用,X 主尺寸 1500×600 / 5:2):震撼醒目主题突出;22 种封面风格库 + X 短文 16:9 封面场景 + 12 种标题花式 + 55 张示例图(22 种风格 × 2 尺寸 + 11 张变体样张) + 1 张风格总览图 |
107
+ | [`topmind-cover`](./topmind-cover/) | **0.4.9** | 文章封面配图(X / 公众号共用,X 主尺寸 1500×600 / 5:2):震撼醒目主题突出;22 种封面风格库 + X 短文 16:9 封面场景 + 24 种标题花式 + 七层场景配方 + 55 张示例图(22 种风格 × 2 尺寸 + 11 张变体样张) + 1 张风格总览图 |
108
108
  | [`topmind-briefs`](./topmind-briefs/) | **0.2.19** | 干货短文(公众号 + X 双平台):一件事讲透,数据榜单/论文解读/新品速递;信源 → 原图 → 内容 → 排版;X 版交付一段可复制纯文本(默认不出 HTML,emoji 可选,去 AI 味),链接 / 原图 / 配图另发,无原图先询问配图 |
109
109
  | [`topmind-viral-posts`](./topmind-viral-posts/) | **0.3.11** | X 引流段子/爆款短篇:18 大类型模板 + 组合玩法,段子体(行间空行,零 emoji,分点不加符号)、每条一段可复制纯文本、话题标签在末行,链接 / 原图另发、分类标签另列;无原图先询问再走 topmind-cover |
110
110
  | [`topmind-format`](./topmind-format/) | **0.1.4** | X 纯文本格式化:转段子(行间空行,零 emoji)/ 格式化成短文(分段 + 合理列表,emoji 可选),只动排版不改字,带原文保真校验;交付一段可复制纯文本,链接 / 原图另发 |
111
111
  | [`topmind-poster`](./topmind-poster/) | **0.1.5** | HTML+CSS → 高清长图 / 海报 / 信息图 PNG:无头 Chrome 2× 截图 + 自动裁白;「一段一图」分段图批量出图(生成器 + 渲染器) |
112
112
 
113
- 安装器 [`@topmindspace/topmind-writing-skills`](https://www.npmjs.com/package/@topmindspace/topmind-writing-skills) 为 **0.8.36**(整仓同 tag 发版)。
113
+ 安装器 [`@topmindspace/topmind-writing-skills`](https://www.npmjs.com/package/@topmindspace/topmind-writing-skills) 为 **0.8.37**(整仓同 tag 发版)。
114
114
 
115
115
  ### 怎么选、怎么组合
116
116
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topmindspace/topmind-writing-skills",
3
- "version": "0.8.36",
3
+ "version": "0.8.37",
4
4
  "description": "TopMindSpace 写作技能合集 — 通过 npm / npx 安装技能(公众号长文、X 长文、干货短文、X 引流短帖、封面图、长图海报)。只出稿与发布包,不代发。",
5
5
  "license": "MIT",
6
6
  "author": "TopMindspace",
@@ -7,7 +7,7 @@ A brief is not a long-form article — **no HTML by default**: the workflow is v
7
7
  The X version is one copy-ready plain-text block (emoji optional); **links (including sources), original images and any generated images are sent separately**, never mixed into the body.
8
8
  The WeChat version is ~300–800 Chinese characters of Markdown. With no original image it asks before generating one.
9
9
 
10
- - Version: **v0.2.19** (ships with `@topmindspace/topmind-writing-skills@0.8.36`)
10
+ - Version: **v0.2.19** (ships with `@topmindspace/topmind-writing-skills@0.8.37`)
11
11
 
12
12
  ## Install
13
13
 
@@ -7,7 +7,7 @@
7
7
  X 版交付一段可直接复制的纯文本(emoji 可选),**链接(含来源)、原图、配图另发**,不和正文混在一起;公众号版约 300–800 字 Markdown。
8
8
  没有原图时先问要不要配图(`topmind-cover`);链接那一条写明来源名称、发布时间与 URL。
9
9
 
10
- - 版本:**v0.2.19**(随 `@topmindspace/topmind-writing-skills@0.8.36` 发布)
10
+ - 版本:**v0.2.19**(随 `@topmindspace/topmind-writing-skills@0.8.37` 发布)
11
11
 
12
12
  ## 安装
13
13
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  A reusable skill for generating cover art for X long-form posts and WeChat articles. Goal: **striking, eye-catching, theme-focused**.
6
6
 
7
- - Version: **v0.4.8** (ships with `@topmindspace/topmind-writing-skills@0.8.36`)
7
+ - Version: **v0.4.9** (ships with `@topmindspace/topmind-writing-skills@0.8.37`)
8
8
 
9
9
  ## Style gallery
10
10
 
@@ -22,12 +22,12 @@ npx @topmindspace/topmind-writing-skills install topmind-cover
22
22
 
23
23
  ## Usage
24
24
 
25
- 0. **Pick a style**: choose 1 of 22 styles from `references/cover-styles.md` by topic (light-first) → check the example image to confirm the visual language.
26
- 1. **Refine the title**: lock the title copy first (usually ≤ 10 chars) using that style's title rules; rewrite until it lands — no drawing yet.
27
- 2. **Composition brief**: one-sentence brief (theme / audience / mood / visual metaphor / palette direction) before composing the prompt.
28
- 3. Input: article title + 3 theme keywords + platform (x / wechat / both, default both).
29
- 4. Generate with the agent's image-generation capability (landscape 5:2, 8% margin on all sides).
30
- 5. **Impact self-check** (required): pass every item in the [impact self-check list](./SKILL.md#冲击力自检清单); on failure, tweak the prompt and regenerate, max 3 attempts.
25
+ 0. **Pick a style combo**: choose a main style (1 of 22, light-first) from `references/cover-styles.md`, then a secondary style from section 4 of [`references/scene-builder.md`](./references/scene-builder.md); check the example image.
26
+ 1. **Refine the title**: lock the title copy first (usually ≤ 10 chars, split into 2–3 lines with size contrast) using that style's title rules; no drawing yet.
27
+ 2. **Seven-layer scene recipe**: theme → metaphor / conflict → hero (optionally the TopMind chick / cat / plant IP) → an action that interacts with the title → 2–4 props → ≥3 background layers → light. No recognizable real people.
28
+ 3. **2–3 options by default**: option card `Option A | metaphor | style: main + secondary | layout: L1–L10 | palette`, differing in at least three of the four; never repeat the main style on consecutive covers.
29
+ 4. **Compose and generate**: fill every slot of the layered CN/EN template in `scene-builder.md`; pick 1 main + 1 secondary title treatment from the 24 in `typography-system.md`, plus chips / buttons / corner badges. For long titles or misrendered text use path B: generate the scene with a clean title area, then overlay the title with `scripts/overlay-title.py`.
30
+ 5. **Score and self-check** (required): six-dimension score (richness / topic fit / title treatment / depth / readability / texture) must total ≥ 20 with no item ≤ 2, then pass the [impact self-check list](./SKILL.md#冲击力自检清单); otherwise revise and regenerate (max 3), then switch options.
31
31
  6. Crop and save:
32
32
 
33
33
  ```bash
@@ -37,6 +37,9 @@ python3 scripts/crop-cover.py <main-image> --out-dir <package>/images/
37
37
  # X short-post cover: generate a separate 16:9 master
38
38
  python3 scripts/crop-cover.py <16:9-image> --preset x-post --out-dir <dir>
39
39
  # produces 00-封面-X短文.png (1200x675)
40
+
41
+ # Path B: scene background + scripted title overlay (line sizes, keyword color, stroke, shadow, marker underline, chips)
42
+ python3 scripts/overlay-title.py <background> <spec.json> --out <cover> [--font <font>]
40
43
  ```
41
44
 
42
45
  ## Sizes
@@ -4,7 +4,7 @@
4
4
 
5
5
  为 X 长文和公众号文章生成封面图的可复用技能。目标:**震撼、醒目、主题突出**。
6
6
 
7
- - 版本:**v0.4.8**(随 `@topmindspace/topmind-writing-skills@0.8.36` 发布)
7
+ - 版本:**v0.4.9**(随 `@topmindspace/topmind-writing-skills@0.8.37` 发布)
8
8
 
9
9
  ## 风格样张
10
10
 
@@ -22,12 +22,12 @@ npx @topmindspace/topmind-writing-skills install topmind-cover
22
22
 
23
23
  ## 用法
24
24
 
25
- 0. **选风格**:按题材从 `references/cover-styles.md` 选 1 种(11 选 1,浅色优先)→ 看示例图确认视觉语言。
26
- 1. **标题提炼**:先定标题文案(一般 ≤10 字),用该风格章节的标题写法规范;不满意重写,不先画图。
27
- 2. **构图简报**:一句话 brief(主题/受众/情绪/视觉隐喻/配色方向),组 prompt 前先写。
28
- 3. 输入文章标题 + 3 个主题关键词 + 平台(x / wechat / both,默认 both)。
29
- 4. 用 agent 的图片生成能力出图(横构图 5:2,四周留白 8%)。
30
- 5. **冲击力自检**(必做):按 [SKILL.md 冲击力自检清单](./SKILL.md#冲击力自检清单) 逐项过;不通过→调 prompt 重生成,最多 3 次。
25
+ 0. **选风格与组合**:按题材从 `references/cover-styles.md` 选主风格(22 选 1,浅色优先),再按 [`references/scene-builder.md`](./references/scene-builder.md) 第四节配一个辅风格;看示例图确认视觉语言。
26
+ 1. **标题提炼**:先定标题文案(一般 ≤10 字,拆 2–3 行做大小对比),用该风格章节的标题写法规范;不满意重写,不先画图。
27
+ 2. **七层场景配方**:主题 → 隐喻 / 冲突 → 主角(可用 TopMind 小鸡 / 小猫 / 小植物 IP)→ 与标题互动的动作 → 2–4 个道具 → ≥3 层背景 → 光线;不画可识别的真实人物。
28
+ 3. **默认出 2–3 个方案**:方案卡 `方案 A|隐喻|风格:主 + 辅|骨架:L1–L10|配色`,四项至少换三项;相邻封面不重复主风格。
29
+ 4. **组 prompt 并出图**:用 `scene-builder.md` 的中英分层模板(槽位填满),标题花式从 `typography-system.md` 的 24 种里选 1 主 1 辅,副信息用胶囊 / 按钮 / 角标。标题长或模型错字时走双路径 B:场景图留白,再用 `scripts/overlay-title.py` 叠字。
30
+ 5. **评分与自检**(必做):六维评分(丰富度 / 主题贴合 / 标题花式 / 层次 / 可读性 / 质感)总分 ≥20 且无项 ≤2,再过 [SKILL.md 冲击力自检清单](./SKILL.md#冲击力自检清单);不通过→改 prompt 重生成,最多 3 次,仍不过就换方案。
31
31
  6. 裁剪落盘:
32
32
 
33
33
  ```bash
@@ -37,6 +37,9 @@ python3 scripts/crop-cover.py <主图> --out-dir <包>/images/
37
37
  # X 短文 / 短帖封面:16:9 主图单独生成
38
38
  python3 scripts/crop-cover.py <16:9 主图> --preset x-post --out-dir <目录>
39
39
  # 产出 00-封面-X短文.png (1200×675)
40
+
41
+ # 双路径 B:场景底图 + 脚本叠字(多行字号、关键词变色、描边、投影、手绘底线、胶囊)
42
+ python3 scripts/overlay-title.py <底图> <spec.json> --out <成图> [--font <字体>]
40
43
  ```
41
44
 
42
45
  ## 尺寸
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: topmind-cover
3
- description: "文章封面配图生成:X 长文与公众号共用,也为 X 短文 / 短帖在没有原图时出 16:9 首图,并供 topmind-briefs、topmind-viral-posts 的配图环节调用。震撼、醒目、主题突出;平台尺寸规范、22 种风格模板、场景→风格匹配、12 种标题花式、背景库、4 种构图骨架、命名落盘、成图检查全流程覆盖。Use when 文章封面、封面图、X 短文封面、短帖封面、头图、题图、首图、X 长文头图、公众号封面、公众号头图、封面风格、banner、cover、thumbnail。Do NOT use for 正文插图、长图、海报与信息图(→ topmind-poster)、短文与段子写稿(→ topmind-briefs / topmind-viral-posts)、PPT/报告封面与多页演示(→ topmind-presentation)。"
3
+ description: "文章封面配图生成:X 长文与公众号共用,也为 X 短文 / 短帖在没有原图时出 16:9 首图,并供 topmind-briefs、topmind-viral-posts 的配图环节调用。震撼、醒目、主题突出;平台尺寸规范、22 种风格模板与风格组合、七层场景配方与中英提示词模板、默认 2–3 个方案、24 种标题花式与副信息组件、分层背景库、10 种构图骨架、TopMind IP 主角、六维评分重做门槛、生图 + 脚本叠字双路径、命名落盘全流程覆盖。Use when 文章封面、封面图、X 短文封面、短帖封面、头图、题图、首图、X 长文头图、公众号封面、公众号头图、封面风格、banner、cover、thumbnail。Do NOT use for 正文插图、长图、海报与信息图(→ topmind-poster)、短文与段子写稿(→ topmind-briefs / topmind-viral-posts)、PPT/报告封面与多页演示(→ topmind-presentation)。"
4
4
  license: MIT
5
5
  metadata:
6
- version: "0.4.8"
6
+ version: "0.4.9"
7
7
  action_category: "write"
8
8
  triggers: "封面, 封面图, X 短文封面, 短帖封面, 头图, 题图, 首图, 封面配图, 缩略图, banner, cover, thumbnail, 公众号封面, 公众号题图, 公众号头图, X 封面, X 首图, X 长文头图, 文章封面, 封面风格"
9
9
  author: "TopMindSpace"
@@ -20,7 +20,7 @@ metadata:
20
20
  再叠加 22 种风格的设计手法。详见 [`references/md3-foundation.md`](references/md3-foundation.md)。
21
21
 
22
22
  ```
23
- 标题提炼 → MD3 配色/字体定调 → 构图简报 → 风格模板 → 生成 → 冲击力自检 → 裁剪双尺寸 → 落盘命名
23
+ 标题提炼 → 七层场景配方 → 2–3 个方案(风格组合 + 骨架 + 配色)→ 分层 prompt → 生成(或场景图 + 脚本叠字)→ 六维评分 + 冲击力自检 → 裁剪双尺寸 → 落盘命名
24
24
  ```
25
25
 
26
26
  ## 风格索引(22 种,浅色优先)
@@ -53,8 +53,9 @@ metadata:
53
53
  | 深色 | 赛博霓虹 `cyber-neon` | AI前沿、科幻、极客、游戏 |
54
54
 
55
55
  适用场景细则、配色故事、prompt 配方见 `references/cover-styles.md`;单风格大图 `assets/examples/<style>.png`(git clone / Release zip 安装才有;npm 包为瘦身不含单风格样张,本地没有时看 overview.png 加 `cover-styles.md` 文字配方即可,或打开 GitHub 仓库同路径)。
56
- 构图骨架(4 种)与文案排版密码见 `references/cover-styles.md` 末尾章节;12 种标题花式与背景库见 `references/typography-system.md`;
57
- 可直接粘贴的完整提示词(22 种风格 + X 短文封面 + 场景示例)见 `references/cover-prompts.md`。
56
+ 构图骨架(10 种)与文案排版密码见 `references/cover-styles.md` 末尾章节;24 种标题花式、副信息组件、字体气质与背景库见 `references/typography-system.md`;
57
+ 场景配方、风格组合、主题 → 隐喻速查、IP 主角规则、六维评分与双路径见 `references/scene-builder.md`;
58
+ 可直接粘贴的完整提示词(22 种风格 + X 短文封面 + 场景示例 + 场景配方多方案示例)见 `references/cover-prompts.md`。
58
59
 
59
60
  ## 场景 → 风格 → 标题花式(选型速查)
60
61
 
@@ -120,23 +121,27 @@ X 短文、X 短帖**原图优先**:有官方截图、基准图、后台截图
120
121
  宏大体系 → `diorama-book`;严肃研究 → `academic-print`;
121
122
  清新震撼 → `white-clean`(纯白底 + 超大标题 + 撞色关键词 + 场景插图))→ 注入 10% 安全区约束。
122
123
  **选风格(三步,必做)**:① 按题材从 `references/cover-styles.md` 选 1 种(22 选 1,浅色优先)→ ② 看 `assets/examples/<style>.png` 确认视觉语言(本地没有该图时看 `overview.png` 对应格子)→ ③ 看该风格章节的标题写法规范,心里有标题雏形。
123
- **选骨架**:从 `cover-styles.md` 的 4 种构图骨架选 1 种(L1 左文右图 / L2 公式流 / L3 场景嵌字 / L4 报刊网格)。
124
+ **选骨架**:从 `cover-styles.md` 的 10 种构图骨架选 1 种(L1–L4 基础:左文右图 / 公式流 / 场景嵌字 / 报刊网格;L5–L10 场景互动:左字右角色互动 / 中字两侧道具 / 上字下场景 / 流程卡片铺陈 / 举牌 / 掀纸破框)。
125
+ **风格组合**:主风格 + 辅风格各取一个层(主角、背景、标题处理),组合表见 `references/scene-builder.md` 第四节;只用单一风格时也要满足下面的丰富度底线。
124
126
  1. **标题提炼**(先定文案,不画图):用所选风格在 `cover-styles.md` 对应章节的标题写法规范提炼标题(一般 ≤10 字);不满意就重写,满意再进下一步。
125
127
  - 坏:"关于 Manus 2.0 的一些思考与体验"(长、没钩子)→ 好:"Manus 2.0 实测"(短、有断言)
126
- 2. **构图简报**(一句话 brief,组 prompt 前先写):主题 + 受众 + 情绪 + 视觉隐喻 + 配色方向。
127
- - 例:"给 AI 从业者看的 Manus 2.0 实测封面,情绪'震撼但可信',视觉隐喻是破壳而出的机械手,深空黑底 + 电光蓝强调。"
128
- 3. **输入与组 prompt**:用步骤 1 定下的标题 + 3 个主题关键词 + 平台(`x` / `wechat` / `both`,默认 both;平台只影响 prompt 侧重,裁剪落盘永远产出双尺寸)。按风格配方组装 prompt,标题逐字写明(防 AI 自造错别字)。
129
- 4. **生成**:`media.generate_image`,`name` 用 `<slug>-cover`。
128
+ 2. **场景配方(必做,替代过去的一句话 brief)**:按 `references/scene-builder.md` 七层填写:主题 → 隐喻 / 冲突 → 主角 → 与标题互动的动作 → 道具 → 背景 → 光线。
129
+ - 丰富度底线:1 个主角 + 1 个与标题互动的动作 + 2–4 个主题道具 + 1–3 处装饰 + 背景 ≥3 层 + 标题 1 主 1 辅花式;上限:主角 ≤2、强调色 ≤2、焦点只有一个。
130
+ - 主角可选 TopMind IP(小鸡 / 小猫 / 小植物,3D 黏土、毛绒、像素或手绘);不画可识别的真实人物长相;资讯与事实类原图优先。
131
+ 3. **出 2–3 个方案(默认)**:每个方案一张方案卡 `方案 A|隐喻|风格:主 + 辅|骨架:L?|配色`,四项里至少换三项;用户说「直接出」就各出一张。相邻封面不重复主风格。
132
+ 4. **组 prompt**:用 `scene-builder.md` 第三节的中文 / 英文分层模板,槽位全部填满;标题逐字写明(防 AI 自造错别字),再加 `cover-prompts.md` 第五章的负面词。平台(`x` / `wechat` / `both`,默认 both)只影响画幅与安全区。
133
+ 5. **生成**:`media.generate_image`,`name` 用 `<slug>-cover`。
134
+ **双路径**:A 让模型直接出字;标题长、有生僻字、要精确多行花式,或 A 路径错字 2 次时走 B:prompt 里留干净标题区、禁止生成文字,出图后用 `scripts/overlay-title.py <底图> <spec.json> --out <成图>` 叠字(支持多行字号、关键词变色、描边、投影、手绘底线、胶囊标签)。
130
135
  **多样性**:同一系列或同一天连发的封面,相邻两张至少在「风格 / 标题花式 / 背景」三项中换两项;同一风格内也要换主体和构图骨架。
131
- 5. **冲击力自检**(必做):过下方自检清单 11 项;不通过→调整 prompt 重生成,最多 3 次;3 次仍不过→换一种风格,或回步骤 1 重写标题。
132
- 6. **裁剪落盘**:
136
+ 6. **评分与自检**(必做):先按 `scene-builder.md` 第八节六维评分(丰富度 / 主题贴合 / 标题花式 / 层次 / 可读性 / 质感,各 1–5):**总分 ≥20 且没有一项 ≤2 才交付**;再过下方冲击力自检 11 项。不通过→按低分项改 prompt 重生成,最多 3 次;3 次仍不过→换方案,或回步骤 1 重写标题。
137
+ 7. **裁剪落盘**:
133
138
  ```bash
134
139
  python3 scripts/crop-cover.py <主图> --out-dir <包>/images/
135
140
  ```
136
141
  产出 `00-封面.png`(1500×600,X/公众号共用主文件)与 `00-封面-公众号.png`(900×383);
137
142
  X 短文封面加 `--preset x-post`,产出 `00-封面-X短文.png`(1200×675)。
138
143
  公众号包规约:正文引用 `images/00-封面.png`,`图片上传清单.md` 登记两版。
139
- 7. **系列感**:同一系列固定色系 + 版式语言,prompt 复用同一风格模板。
144
+ 8. **系列感**:同一系列固定色系 + 版式语言;系列内仍要换隐喻、主角动作和道具,不能只换标题字。
140
145
 
141
146
  ## 冲击力自检清单
142
147
 
@@ -152,16 +157,17 @@ X 短文、X 短帖**原图优先**:有官方截图、基准图、后台截图
152
157
  | 6 | 标题字逐字正确:无 AI 自造错字/乱码/笔画粘连(含装饰导致) | 有错字/粘连→减装饰、缩短标题或修正标题写法后重生成 |
153
158
  | 7 | 标题与关键主体落在中央垂直 60% 安全区(900×383 裁剪不切字) | 把元素收拢进安全区 |
154
159
  | 8 | `references/impact-language.md` 20 条原则快速勾选 | 按"保守陷阱清单"逐项纠正 |
155
- | 9 | 装饰手法 ≤ 该风格指定数量(多了即乱;minimal 只许 1 种) | 超量→删掉最弱的一种装饰再生成 |
160
+ | 9 | 丰富但单焦点:装饰 1–3 处、道具 2–4 个、只有一个视觉焦点(minimal 风格装饰仍只许 1 种) | 太空→按场景配方补道具 / 背景层;太乱→删最弱的道具或装饰 |
156
161
  | 10 | 记忆点动作化:3 秒后能描述出"一个具体的东西 + 一个动作"(如"小熊破纸而出"),不能只描述出"一张白底图" | 记忆点只有静态物体→加动作:压字/破框/攀爬/托举,让角色与标题互动 |
157
162
  | 11 | 高级感:标题有字体设计(非 plain font block)、有角度变化(非全正面平视)、景深≥4层、光有方向 | 按 `cover-styles.md` 高级感设计系统 4 维度(字体/角度/景深/光影)选 2~4 种手法重生成 |
158
163
 
159
164
  ## 设计铁律
160
165
 
161
- - 一图一主题;主体占画面 40% 以上,居中或三分法
162
- - 大标题 ≤10 字;对比与字高见冲击力自检 #2/#3
166
+ - 一图一主题、一个焦点;主角与标题合计占画面 60% 以上,主角必须对标题做动作
167
+ - 丰富而有层次:前景道具 / 中景主角与标题 / 背景 ≥3 层;不是单色底 + 一行字
168
+ - 大标题 ≤10 字,2–3 行大小对比;对比与字高见冲击力自检 #2/#3
163
169
  - 四周 8% 安全边距,标题不贴边(中央 60% 安全区见自检 #7)
164
- - 忌:元素堆砌、小字密排、多主体打架
170
+ - 忌:单调(一行黑体 + 纯色底 + 孤立图标);也忌小字密排、多主体打架、强调色超过 2 个
165
171
 
166
172
  ## 外部依赖 / 规约来源
167
173
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "topmind-cover",
3
- "version": "0.4.8",
3
+ "version": "0.4.9",
4
4
  "private": true,
5
5
  "description": "文章封面配图生成(X 长文 / 公众号共用):震撼醒目主题突出,尺寸规范 + 11 种风格模板 + 裁剪落盘。",
6
6
  "license": "MIT",
@@ -6,13 +6,13 @@
6
6
  > 这份是**完整、可直接粘贴**的提示词,变量用【】标出,选好、填好、粘贴、生成。
7
7
  >
8
8
  > 配套:`cover-styles.md`(22 风格技能配方)· `impact-language.md`(20 条冲击力设计语言)·
9
- > `typography-system.md`(12 种标题花式 + 背景库)· `assets/examples/`(55 张原创样张)
9
+ > `typography-system.md`(24 种标题花式 + 副信息组件 + 背景库)· `scene-builder.md`(七层场景配方 + 风格组合 + 评分)· `assets/examples/`(55 张原创样张)
10
10
 
11
11
  ---
12
12
 
13
13
  ## 0. 使用说明:三步替换法
14
14
 
15
- 1. **选一条**:第 1 章按风格选;X 短文 / 短帖封面看第 2 章;不确定就按第 4 章的内容类型查推荐。
15
+ 1. **选一条**:第 1 章按风格选;X 短文 / 短帖封面看第 2 章;想要场景更丰富、一次出 2–3 个方案,照 2.8 的写法;不确定就按第 4 章的内容类型查推荐。
16
16
  2. **填**:把【标题】等变量换成你的真实文案(**必须是真实的**,不要编造数据)。
17
17
  3. **粘贴生成**:全文(含"绝不"段)一起粘贴。尺寸见下表。
18
18
 
@@ -441,6 +441,72 @@ IP 趣味风中文封面。纯色柠檬黄 #FFE14D 底,带细噪点,画面
441
441
  | 观点评论 | 2.5 | 标题「慢一点 / 反而快」;小物件「一只半埋在字后的沙漏」 |
442
442
  | 运营段子 | 2.6 | 标题「今日打卡」;橘猫「戴着小耳机敲键盘」 |
443
443
 
444
+ ### 2.8 场景配方多方案示例(虚构主题,演示写法)
445
+
446
+ > 按 `scene-builder.md` 七层配方写,每个主题出 3 张方案卡,四项(隐喻 / 风格组合 / 骨架 / 配色)至少换三项。
447
+ > 完整 prompt 只示范每个主题的方案 A;B、C 照同一模板替换槽位即可。
448
+
449
+ **主题一:本地部署开源大模型**(标题「把大模型 / 搬回家」)
450
+
451
+ | 方案 | 隐喻 | 风格:主 + 辅 | 骨架 | 配色 |
452
+ |---|---|---|---|---|
453
+ | A | 小鸡工程师把一朵云塞进桌面机箱 | 3D IP + 暗色 SaaS | L5 左字右角色互动 | 深灰 + 机箱冷蓝光 + 暖台灯橙 |
454
+ | B | 云端与家里之间的网线被剪断,另一端接进书架上的小服务器 | 硬核立体字 + 微缩场景 | L6 中字两侧道具 | 牛皮纸米白 + 墨黑 + 信号绿 |
455
+ | C | 终端窗口里一行命令变成一座小房子的地基 | 手绘插画 + 流程卡片 | L8 流程卡片铺陈(下载 → 配置 → 运行) | 浅暖白 + 品牌蓝 + 荧光黄底线 |
456
+
457
+ 方案 A 中文 prompt:
458
+
459
+ ```
460
+ 横构图 16:9(1200×675),X 短文封面。
461
+ 主题:本地部署开源大模型;隐喻:把云端的大模型搬回自己家。
462
+ 主角:一只 3D 黏土质感的小鸡工程师,戴黄色安全帽和护目镜,表情专注。
463
+ 动作:小鸡双手把一朵发光的蓝白色云朵往一台打开侧板的桌面机箱里推,身体前倾,一只脚蹬地;云朵的一角压到标题第二行边缘。
464
+ 道具:打开侧板的机箱(内部显卡亮冷蓝光)、桌上一块显示终端绿色光标的小屏幕、一卷网线、一盏暖橙台灯。
465
+ 装饰:几颗从云朵飘出的小光点;标题下一道手绘荧光黄底线。
466
+ 背景:远景是虚化的书房书架;承载面是木纹桌面;深灰墙面带细噪点;前景一角虚化的键盘。
467
+ 光线:台灯暖橙主光从右上打下,机箱冷蓝光作轮廓光,温暖而有科技感。
468
+ 配色:主色深灰,辅色冷蓝,文字色白,强调色暖橙(共 4 种)。
469
+ 标题(逐字准确,单独成行):
470
+ 「把大模型」
471
+ 「搬回家」
472
+ 标题排版:L5,标题在左 50%;T13 大小行对比(第二行字号是第一行 1.6 倍)+ T14「搬回家」暖橙描边变色;辅手法 T17 手绘底线。
473
+ 副信息:左上胶囊「开源 · 离线 · 免费」。
474
+ 除标题与副信息外画面无其他可读文字;标题与主角在中央 80% 宽、上下各留 10% 的安全区内。
475
+ 绝不:错别字或多字少字;可识别的真实人物长相;假 logo、假截图、假数据;元素堆满没有焦点;塑料感油腻高光;标题被道具遮挡笔画。
476
+ ```
477
+
478
+ **主题二:AI 写作去 AI 味**(标题「删掉 / AI 腔」)
479
+
480
+ | 方案 | 隐喻 | 风格:主 + 辅 | 骨架 | 配色 |
481
+ |---|---|---|---|---|
482
+ | A | 小猫编辑举着红笔,把稿纸上一串套话圈掉划掉 | 3D IP + 纸张拼贴 | L10 掀纸破框 | 米白稿纸 + 墨黑 + 批改红 |
483
+ | B | 一块大橡皮把机器人形状的墨迹擦成一行手写字 | 卡通素描 + 资讯快报 | L7 上字下场景 | 牛皮纸 + 铅笔灰 + 番茄红 |
484
+ | C | 「AI 腔 ≠ 好文章」,天平一端是一堆金属零件,一端是一张手写便签 | 资讯快报 + 硬核立体字 | L6 中字两侧道具 | 米白 + 墨蓝 + 红色 ≠ 符号 |
485
+
486
+ 方案 A 英文 prompt(标题走 B 路径:留白后用 `scripts/overlay-title.py` 叠中文):
487
+
488
+ ```
489
+ Wide 16:9 cover (1200x675) for an article about removing robotic AI tone from writing.
490
+ Metaphor: an editor cat peeling back a sheet of manuscript and crossing out stiff boilerplate.
491
+ Hero: an original 3D clay-style ginger cat editor with round glasses, confident expression.
492
+ Action: the cat lifts the top-right corner of a large cream paper sheet with one paw and holds a red pen in the other, mid-stroke circling a scribbled line.
493
+ Props: a stack of manuscript pages with red correction marks (no readable text), a rubber eraser with crumbs, a vintage typewriter partly in frame.
494
+ Decoration: two small red hand-drawn check marks, a strip of washi tape at the paper corner.
495
+ Background: soft-focus desk with warm wood grain; subtle paper fiber texture; a blurred potted plant in the far corner.
496
+ Light: warm window light from the upper left, soft shadow under the lifted paper, cozy and crisp.
497
+ Palette: cream, ink black, correction red (3 colors).
498
+ Leave a clean, flat cream area on the left 50% of the frame for the title overlay. Do not render any text, letters or logos.
499
+ Avoid: recognizable real people, fake UI, cluttered layout with no focal point, plastic glossy highlights, deformed paws.
500
+ ```
501
+
502
+ 叠字 spec 示例(`overlay-title.py` 读取):
503
+
504
+ ```json
505
+ {"lines": [{"text": "删掉", "size": 120}, {"text": "AI 腔", "size": 190, "color": "#D83A2E", "underline": "#F2C230"}],
506
+ "x": 80, "y": 150, "color": "#1E1E1E", "stroke": 8, "stroke_color": "#FFFFFF", "shadow": true,
507
+ "chips": ["写作", "去 AI 味", "实操"]}
508
+ ```
509
+
444
510
  ## 3. 外部调研:全平台爆款封面流派
445
511
 
446
512
  > 2026-09 调研总结。核心结论:**所有平台的爆款封面都在做同一件事——3 秒内让标题被读懂**。
@@ -607,4 +673,4 @@ film grain, or a light halo).
607
673
  ---
608
674
 
609
675
  *文档版本:2026-10-14 · 与 topmind-cover 的 22 种风格同步:第 1 章 23 条提示词覆盖全部 22 种风格(白色清新有干货、人物两版),
610
- 第 2 章为 X 短文 16:9 封面的 6 条场景提示词。新增风格或示例时,请同步更新第 1、2、4 章。*
676
+ 第 2 章为 X 短文 16:9 封面的 6 条场景提示词,2.8 为场景配方多方案示例。新增风格或示例时,请同步更新第 1、2、4 章。*
@@ -26,7 +26,7 @@ X 与公众号在手机端信息流里,左右边缘可能被平台图标/时
26
26
  **版式与配色也不得与第三方封面构成实质相似:只学原则,不学版式。**
27
27
  禁止照抄任何第三方封面的文案、形象、版式结构与配色组合——包括但不限于
28
28
  标题文字、数字、品牌词、IP 形象、署名,以及"左文右图""底部标签条""两行撞色标题"
29
- 这类可辨识的构图公式。`assets/examples/` 中的 26 张风格示例图均为原创设计,
29
+ 这类可辨识的构图公式。`assets/examples/` 中的 55 张风格示例图(另附 overview.png)均为原创设计,
30
30
  其标题/数字/品牌/署名(如"深蓝 OS 2.0""提示词避坑指南""读书打卡计划""@书山有路")
31
31
  均为虚构演示内容,仅用于演示设计原则。
32
32
  用本库组 prompt 时,标题、形象、版式细节必须自己原创;
@@ -915,9 +915,9 @@ X 与公众号在手机端信息流里,左右边缘可能被平台图标/时
915
915
  | cyber-neon | 赛博霓虹 + 全息投影 + 故障艺术,未来科技感 | 1/4~1/3 | AI前沿/科幻/极客/游戏 |
916
916
  ---
917
917
 
918
- ## 构图骨架(4 种 Layout Template)
918
+ ## 构图骨架(10 种 Layout Template)
919
919
 
920
- 风格决定"长什么样",骨架决定"怎么摆"。选风格后,再选一种骨架:
920
+ 风格决定"长什么样",骨架决定"怎么摆"。选风格后,再选一种骨架。L1–L4 是基础骨架,L5–L10 是「主角与标题互动」的场景骨架(配合 `scene-builder.md` 的七层配方用);同一账号相邻两张封面不用同一骨架。
921
921
 
922
922
  ### L1. 左文右图 / 黄金分割
923
923
 
@@ -948,6 +948,42 @@ X 与公众号在手机端信息流里,左右边缘可能被平台图标/时
948
948
  - **适用风格**:gallery-grid、academic-print、paper-collage、news-flash。
949
949
  - **铁律**:网格线必须对齐,错一位即廉价。
950
950
 
951
+ ### L5. 左字右角色互动
952
+
953
+ - **结构**:左 50%–55% 是 2–3 行大小对比的标题;右侧主角侧身朝向标题,**用手指、箭头或视线指向关键词**;主角与标题之间放 1–2 个主题道具(如浏览器窗口、产品卡片)做桥。
954
+ - **适用**:建站、产品、教程、个人 IP 连载。风格:3D IP、ip-fun、white-clean、dark-saas。
955
+ - **铁律**:主角动作必须指向标题;道具可压到标题区边缘,但不遮笔画。
956
+
957
+ ### L6. 中字两侧道具
958
+
959
+ - **结构**:标题居中占中央 50%–60%;左右两侧各一组主题道具或两个对立物(断开线缆的两端、两扇门、旧 vs 新),形成「A ≠ B / A → B」的叙事。
960
+ - **适用**:对比、认知纠偏、发布、等式型标题。风格:news-flash、hard-core-type、brand-launch、paper-collage。
961
+ - **铁律**:两侧重量大致平衡;关系符号(≠ → ×)放在标题里或两侧道具之间,只出现一次。
962
+
963
+ ### L7. 上字下场景
964
+
965
+ - **结构**:上 40%–50% 是标题(可横跨全宽),下半部分是一条完整场景带:桌面、地平线、片场、流水线;主角站在场景带里,对标题做动作(举手托住、拍摄、仰望)。
966
+ - **适用**:发布、视频、行业现场、宏大主题。风格:cinematic-flow、brand-launch、diorama-book、bg-blur。
967
+ - **铁律**:场景带必须有承载面(地面 / 桌面 / 地平线),不能是漂浮的物件。
968
+
969
+ ### L8. 流程卡片铺陈
970
+
971
+ - **结构**:标题占左上或左侧;右侧 3–5 张编号卡片沿 Z 形或弧形排开,每张卡片只有图标 + 2–4 字;主角在卡片旁做讲解手势。
972
+ - **适用**:方法论、实操流程、工作流、选题方法。风格:tutorial-steps、anime-desk、sketch-cartoon、dark-saas。
973
+ - **铁律**:卡片 ≤5 张、卡片里的字 ≤4 个,否则缩到手机宽度就成了小字密排。
974
+
975
+ ### L9. 举牌 / 拉横幅
976
+
977
+ - **结构**:主角双手举一块牌子、拉一条横幅或撑一张纸,**标题就写在牌子上**;牌子占画面 50%–60%,主角在一侧露出半身。
978
+ - **适用**:涨粉、运营、口号型短标题(≤6 字)。风格:ip-fun、像素风、chao-wan-3d、big-type。
979
+ - **铁律**:牌面平整、正对镜头,字不随牌子透视变形。
980
+
981
+ ### L10. 掀纸 / 破框
982
+
983
+ - **结构**:标题印在一张大纸、海报或屏幕上,主角从一角掀起纸边、撕开纸面或从画框里探出身,露出后面的场景或道具。
984
+ - **适用**:揭秘、教程开篇、「如何做出…」类问题标题。风格:paper-collage、chao-wan-3d、sketch-cartoon、news-flash。
985
+ - **铁律**:掀起的部分不能挡住标题;纸张要有厚度和投影,才像真的被掀开。
986
+
951
987
  ---
952
988
 
953
989
  ## 文案排版密码(Typography Rules)
@@ -46,7 +46,7 @@
46
46
  | 1 | 标题太小(字高 <1/5 画面) | 先定标题字高目标 1/3(底线 ≥1/4),再摆其他元素;标题是视觉重心,不是配角 |
47
47
  | 2 | 对比太弱(灰底灰字、强调色饱和度不足) | 字色底色明度差拉满;强调色敢用高饱和,但只用一处 |
48
48
  | 3 | 画面太平(元素平均用力、无重心、无动线) | 先定一条主阅读动线和一个最大元素,其他全部让路 |
49
- | 4 | 元素太多太碎(>5 个、装饰无节制) | 每加一个元素就问"删掉它会损失什么",答不上来就删 |
49
+ | 4 | 元素太碎、没有焦点(道具 >4、强调色 >2、两个主角抢戏) | 每个元素都要服务同一个隐喻;删掉它会损失什么答不上来就删。反过来,只剩单色底 + 一行字同样不合格,按 `scene-builder.md` 丰富度底线补 |
50
50
  | 5 | 数字不敢放大(数据藏在角落小字里) | 真实数字是天然钩子,值得给最大字号或最跳的颜色(只给一处) |
51
51
  | 6 | 质感不敢加(纯色底一片死平) | 至少加一层纸纹/噪点/光影,放在背景层 |
52
52
  | 7 | 情绪不敢给(断言、感叹全磨平) | 在标题或背书层保留一处情绪支点(断言/感叹/反问三选一),只一处 |
@@ -54,7 +54,7 @@
54
54
 
55
55
  ## 七、文字装饰系统(第九轮新增:文字排印与装饰)
56
56
 
57
- **总原则:中文正确性永远优先于花样。**图像模型对中文大字的渲染能力有限,任何装饰不得导致错字、乱码、笔画粘连。装饰是"放大记忆点"的手段,不是"堆花样"的目的——每张图选 2~3 种装饰,用到就够,多一种就问自己一次"删掉它会损失什么"(参见第四条规则)。
57
+ **总原则:中文正确性永远优先于花样。**图像模型对中文大字的渲染能力有限,任何装饰不得导致错字、乱码、笔画粘连。装饰是"放大记忆点"的手段,不是"堆花样"的目的——每张图的文字装饰选 2~3 种(标题 1 主 1 辅花式 + 至多 1 种点缀,与 `scene-builder.md` 丰富度底线一致;场景道具与背景层另计),用到就够,多一种就问自己一次"删掉它会损失什么"(参见第四条规则)。
58
58
 
59
59
  ### 7.1 六种可靠装饰(按优先级从高到低)
60
60
 
@@ -0,0 +1,187 @@
1
+ # 场景构建配方(Scene Builder)
2
+
3
+ > **为什么要有这份**:只给生图模型「风格名 + 标题 + 一个主体」,出来的封面就是「纯色底 + 一行字 + 一个摆拍角色」,单调。
4
+ > 好封面是**一个场景在讲标题这句话**:主角在对标题做动作,周围有主题道具,背景有层次,标题本身有花式。
5
+ > 本文给出:场景配方(七层)→ 丰富度下限 → 分层提示词模板(中 / 英)→ 风格组合与多方案 → 主题映射 → 配色与背景层次 → IP 与人物 → 评分门槛 → 双路径出字。
6
+ > 风格配方见 `cover-styles.md`,标题花式见 `typography-system.md`,构图骨架见 `cover-styles.md`「构图骨架」。
7
+
8
+ ## 一、场景配方:七层,从主题推到画面
9
+
10
+ 先写配方,再写提示词。七层逐层填,每层一句话。
11
+
12
+ | 层 | 要回答的问题 | 例(虚构主题「本地部署开源大模型」) |
13
+ |---|---|---|
14
+ | 1. 主题 | 这篇讲什么、给谁看、读者看完得到什么 | 给开发者:在自己电脑上跑开源大模型,不花 API 钱 |
15
+ | 2. 核心隐喻 / 冲突 | 用哪个具体画面把主题「演」出来?冲突、反差、对比、转变、动作瞬间 | 「把云搬回家」:一朵云被装进家用主机机箱 |
16
+ | 3. 主角 | 谁来演?IP 角色 / 原创人物(不可识别真人)/ 拟人物件 | 原创 3D 小鸡工程师,戴安全帽 |
17
+ | 4. 动作与标题互动 | 主角对标题做什么?指、举牌、掀纸、坐在字上、推字、拍摄、拉横幅、从字后探头 | 小鸡用手推车把一朵发光的云推向标题,另一只手指着「本地」二字 |
18
+ | 5. 主题道具(2–4 个) | 哪些物件一看就知道是这个主题?优先「行业里的人一眼认得」的东西 | 机箱(侧透能看到显卡)、终端窗口卡片、散热风扇、网线 |
19
+ | 6. 背景环境 | 主角在哪里?承载面(桌面 / 地面 / 舞台 / 纸面)+ 远景 + 纹理 | 深夜书房桌面,远处窗外城市灯火虚化,桌面有木纹 |
20
+ | 7. 氛围光 | 光从哪来、什么颜色、什么情绪 | 机箱 RGB 冷光从下往上打 + 台灯暖光,冷暖对撞 |
21
+
22
+ 写隐喻时的五个来源(挑一个最贴的):
23
+
24
+ 1. **字面动作化**:标题里的动词直接演出来(「破圈」→ 角色撞破一张纸;「搬家」→ 推车)。
25
+ 2. **反差 / 等式**:A ≠ B、A → B、小 vs 大(「会写代码 ≠ 会做产品」→ 一根断开的网线两端各连一个世界)。
26
+ 3. **行业道具实体化**:把抽象工具做成实物(工作流 → 一排流程卡片;知识库 → 抽屉柜;模型 → 一颗芯片)。
27
+ 4. **场景置换**:把话题放进一个大家熟悉的场景(旅行地标、电影片场、报纸头版、实验室、厨房)。
28
+ 5. **结果糊脸**:真实可展示的成果(数据面板、收益截图)——**必须是真实素材**,用原图或打码的用户截图,不让模型编数字。
29
+
30
+ ## 二、丰富度下限(必填,少一项不出图)
31
+
32
+ | 槽位 | 下限 | 说明 |
33
+ |---|---|---|
34
+ | 主角 | 1 个 | 角色、人物或拟人物件;**有表情或姿态**,不是证件照 |
35
+ | 主角动作 | 1 个,且与标题互动 | 指、举、掀、推、坐、拍、拉、探头、托举之一;「站着微笑」不算 |
36
+ | 主题道具 | 2–4 个 | 与主题强相关、能叫出名字;纯星星、光点、气泡不算道具 |
37
+ | 装饰 | 1–3 处 | 箭头、手绘圈、贴纸、胶带、印章、光效、纸片;跟主风格走 |
38
+ | 背景层次 | ≥3 层 | 远景(虚化环境 / 渐变)+ 中景承载面(桌面 / 地面 / 纸面)+ 纹理或光效;可再加前景虚化 |
39
+ | 标题花式 | 1 主 + 1 辅 | 见 `typography-system.md` 第七、九节,至少有「关键词强调」 |
40
+ | 副信息 | 0–2 个 | 副标题、标签胶囊、按钮、角标、地标签,**内容必须真实**,不写假编号假署名 |
41
+
42
+ **上限(防止元素大乱斗)**:主角 ≤2、道具 ≤4、强调色 ≤2、标题外可读文字 ≤2 处;画面只能有**一个第一视觉焦点**(标题或主角之一),另一个排第二。丰富 ≠ 堆砌:每个元素都要回答「它为什么在这里」。
43
+
44
+ ## 三、分层提示词模板
45
+
46
+ 把七层配方填进槽位,**按层顺序写**,标题单独一行逐字写出。【】为必填槽位。
47
+
48
+ ### 中文模板
49
+
50
+ ```
51
+ 【风格组合】风格的中文封面,横构图【比例,如 16:9 / 1200×675 或 5:2 / 1500×600】。
52
+ 画面讲一件事:【核心隐喻一句话】。
53
+ 主角:【主角,外观 + 材质 + 表情】,位于画面【左 / 右 / 下方】,正在【动作】,【动作如何与标题互动:指向 / 举着 / 掀开 / 坐在标题上】。
54
+ 主题道具:【道具 1】、【道具 2】、【道具 3】,围绕主角摆放,有真实投影,与主题一眼相关。
55
+ 背景:远景【远景】;承载面【承载面】;纹理【纹理】;【可选前景虚化】。
56
+ 光线:【主光方向与颜色】+【辅光 / 轮廓光】,情绪【情绪词】。
57
+ 配色:主色【主色】、辅色【辅色】、文字色【文字色】、强调色【强调色】(共 2–4 种)。
58
+ 标题(逐字准确,单独成行):
59
+ 「【第一行】」
60
+ 「【第二行,可选】」
61
+ 标题排版:【布局骨架 L1–L10 之一与位置】;主手法【标题花式,如 T13 大小行对比 + T14 关键词描边变色】;辅手法【如 T17 手绘底线】;关键词「【关键词】」用【强调色】并放大 1.3 倍。
62
+ 副信息:【副标题 / 标签胶囊 / 按钮 / 角标,逐字写出;没有就写「无」】。
63
+ 装饰:【1–3 处装饰】。
64
+ 除标题与副信息外画面无其他可读文字。标题与主角在中央安全区内(16:9:中央 80% 宽、上下各留 10%;5:2:中央 60%)。
65
+ 绝不:错别字或多字少字;可识别的真实人物长相;假 logo、假截图、假数据;元素堆满没有焦点;塑料感油腻高光;比例崩坏的手和脸;标题被道具遮挡笔画。
66
+ ```
67
+
68
+ ### English template
69
+
70
+ ```
71
+ A Chinese-language cover in a 【style combo】 style, landscape 【ratio, e.g. 16:9 1200x675 or 5:2 1500x600】.
72
+ The image tells one idea: 【core metaphor in one sentence】.
73
+ Hero: 【hero — look, material, expression】 on the 【left / right / bottom】, 【action】, physically interacting with the title (【points at / holds up / peels back / sits on】 it).
74
+ Theme props: 【prop 1】, 【prop 2】, 【prop 3】, arranged around the hero with real contact shadows, instantly recognizable for this topic.
75
+ Background: far layer 【far layer】; ground plane 【ground】; texture 【texture】; 【optional blurred foreground】.
76
+ Lighting: 【key light direction and color】 plus 【rim / fill light】, mood 【mood】.
77
+ Palette: main 【main】, secondary 【secondary】, text 【text】, accent 【accent】 (2–4 colors total).
78
+ Title (render these exact Chinese characters, each line on its own):
79
+ "【line 1】"
80
+ "【line 2, optional】"
81
+ Title treatment: 【layout id and position】; main treatment 【e.g. keyword in accent color with thick outline】; secondary 【e.g. hand-drawn underline】; keyword "【keyword】" in 【accent】, 1.3x larger.
82
+ Secondary text: 【subtitle / chips / button / corner badge, exact text, or "none"】.
83
+ Decorations: 【1–3 decorations】.
84
+ No other readable text. Keep title and hero inside the central safe area.
85
+ Never: misspelled, missing or extra characters; recognizable real people's faces; fake logos, screenshots or numbers; clutter without a single focal point; greasy plastic sheen; broken hands or faces; props covering title strokes.
86
+ ```
87
+
88
+ > 生图模型对中文大字不稳时,把「标题」两行改成「在【位置】留出干净的标题区(【底色】、无纹理干扰),不要生成任何文字」,再走第九节的叠字路径。
89
+
90
+ ## 四、风格组合与多方案
91
+
92
+ **主风格 + 辅风格**:主风格定主角和光影的材质,辅风格定背景与装饰的质感。组合时只借辅风格的 1–2 个手法,不把两套配方全叠上去。
93
+
94
+ | 组合 | 主风格给 | 辅风格给 | 适合 |
95
+ |---|---|---|---|
96
+ | 3D IP + 纸张拼贴 | `chao-wan-3d` 的毛绒 / 黏土主角 | `paper-collage` 的撕纸、胶带、便签 | 教程、合集、新手向 |
97
+ | 复古报纸 + 电影剧照 | `news-flash` 的报头、网点、黑红 | `cinematic-flow` 的剧照光影、胶片颗粒 | 行业内幕、热点评论、反差暴论 |
98
+ | 浏览器 UI + 3D IP | `dark-saas` / `white-clean` 的窗口卡片 | `ip-fun` 的角色指向动作 | 产品、建站、工具测评 |
99
+ | 像素 + 纯色撞色 | 像素风角色(8-bit) | `big-type` 的巨字压版 | 涨粉、运营、游戏化话题 |
100
+ | 旅行实景 + 3D IP | `bg-blur` 的真实地标虚化 | `chao-wan-3d` 的角色 | 消费、旅行、地域差价 |
101
+ | 手绘插画 + 流程卡片 | `sketch-cartoon` / `anime-desk` 的人物 | `tutorial-steps` 的步骤卡 | 方法论、实操流程 |
102
+ | 发光科技 + 品牌渐变 | `cinematic-flow` 的光带、地平线 | `brand-launch` 的品牌色与按钮 | 模型 / 产品发布 |
103
+ | 暗黑报纸 + 硬核立体字 | `news-flash` 的暗版报纸 | `hard-core-type` 的立体大字 | 警示、风险、争议 |
104
+ | 学院版画 + 微缩场景 | `academic-print` 的线稿 | `diorama-book` 的移轴小场景 | 论文、原理、知识地图 |
105
+
106
+ **同主题多方案(默认)**:每次给 **2–3 个明显不同的方案**让用户挑(或按用户要求只出 1 张)。「明显不同」= 下面四项里至少换三项:
107
+
108
+ 1. 核心隐喻(换一个画面讲同一句话)
109
+ 2. 风格组合
110
+ 3. 布局骨架
111
+ 4. 主色调(冷 / 暖 / 黑白红之类)
112
+
113
+ 每个方案先给一句话方案卡:`方案 A|隐喻:…|风格:主 + 辅|骨架:L?|配色:…`,用户选定后再出图;用户说「直接出」就各出一张。
114
+
115
+ **禁止连续重复**:同一账号相邻两张封面不用同一主风格;同一主风格连续出现时,必须换隐喻、骨架和配色。查不到历史时,问一句「最近一张封面用了什么风格?」或直接避开本次方案里已用过的。
116
+
117
+ ## 五、主题 → 隐喻 / 风格组合 / 配色速查
118
+
119
+ | 主题 | 常用隐喻与道具 | 推荐风格组合(轮换) | 配色方向 |
120
+ |---|---|---|---|
121
+ | AI 模型 / 产品发布 | 地平线日出、发光图标、展台、按钮 | 发光科技 + 品牌渐变;暗色 SaaS + 3D IP | 深蓝 → 品牌渐变,白字,一处高光 |
122
+ | 本地部署 / 开源 | 把云装进机箱、终端窗口、显卡、网线 | 3D IP + 暗色 SaaS;硬核立体字 + 微缩场景 | 深灰 + 机箱冷光 + 暖台灯点缀 |
123
+ | 写作 / 去 AI 味 | 红笔圈改稿纸、橡皮擦掉套话、打字机、便签 | 3D IP + 纸张拼贴;卡通素描 + 资讯快报 | 米白纸 + 墨黑 + 批改红 |
124
+ | 教程 / 方法论 / 流程 | 编号流程卡、清单、路线图、工具箱 | 手绘插画 + 流程卡片;白色清新 + 3D IP | 浅暖白 + 品牌蓝 + 荧光黄底线 |
125
+ | 建站 / 独立开发 / 副业 | 浏览器窗口、个人主页卡片、访客头像、增长箭头 | 浏览器 UI + 3D IP | 奶油橙光 + 白窗口 + 橙红标题 |
126
+ | 视频 / 内容创作 | 摄影机、胶片带、分镜卡、场记板 | 复古报纸 + 电影剧照;3D IP + 纸张拼贴 | 米白复古 + 墨绿 / 墨黑 |
127
+ | 行业内幕 / 暴利 / 风险 | 暗巷交易、报纸头版、警示胶带、数据红线 | 暗黑报纸 + 硬核立体字 | 黑红警示,米白报纸点缀 |
128
+ | 涨粉 / 运营 / 打卡 | 举牌、喇叭、进度条、粉丝气泡 | 像素 + 纯色撞色;IP 趣味 + 贴纸 | 柠檬黄 / 番茄红 + 黑字 |
129
+ | 消费 / 旅行 / 差价 | 地标实景、行李箱、价签、地图钉 | 旅行实景 + 3D IP | 晴空蓝 + 暖阳 + 红色数字 |
130
+ | 电商 / 支付 / 增长 | 购物袋、结账按钮、信息流卡片 | 发光科技 + 霓虹渐变;3D IP + 暗色 | 深黑 + 品红 → 青渐变 + 黄色按钮 |
131
+ | 对比 / 认知纠偏 | 断开的线缆、天平、≠ 符号、两扇门 | 资讯快报 + 硬核立体字;纸张拼贴 | 米白 + 墨蓝 + 红色符号 |
132
+ | 论文 / 原理 | 铜版线稿、显微镜、坐标纸、公式卡 | 学院版画 + 微缩场景 | 牛皮纸 + 墨黑 + 朱红印章 |
133
+
134
+ ## 六、配色与背景层次
135
+
136
+ **配色逻辑**(来自概念海报方法论,见文末出处):2–4 种颜色——「1 个强主色 + 1 个纸感浅色或低彩中性色 + 1 个深色支撑 + 极少量强调色」。颜色由情绪决定:
137
+
138
+ | 情绪 | 配色 | 背景纹理 |
139
+ |---|---|---|
140
+ | 警示 / 内幕 / 冲突 | 黑 + 正红 + 米白 | 报纸网点、旧纸褶皱、暗光 |
141
+ | 活泼 / 运营 / 涨粉 | 柠檬黄 / 番茄红 + 黑 + 白 | 纯色细噪点、像素格 |
142
+ | 复古 / 人文 / 视频 | 米白 + 墨绿或墨黑 + 赭石 | 牛皮纸、胶片颗粒 |
143
+ | 科技 / 发布 | 深蓝 / 深黑 + 品牌渐变 + 白 | 地平线光、粒子、细网格 |
144
+ | 温暖 / 生活 / 副业 | 奶油 + 暖橙 + 深棕 | 柔光虚化、植物剪影 |
145
+ | 清爽 / 教程 | 白 + 品牌蓝 + 荧光黄 | 方格纸、桌面实物、浅阴影 |
146
+ | 理性 / 学术 | 牛皮纸 + 墨黑 + 朱红 | 坐标纸、铜版线条 |
147
+
148
+ **背景四层**(至少用三层):
149
+
150
+ 1. **远景**:虚化环境(城市、书房、地标、展厅)或大面积渐变。
151
+ 2. **承载面**:让主角「站住」的横向结构——桌面、地面、舞台、纸面、台阶、地平线。
152
+ 3. **纹理**:纸纹、网点、胶片颗粒、噪点、方格。
153
+ 4. **光效 / 粒子**:体积光、轮廓光、光斑、尘埃、扫描线;前景可加一处虚化物(树叶、纸片、镜头光斑)制造镜头感。
154
+
155
+ ## 七、IP 与人物
156
+
157
+ - **TopMind 人设可作主角**:鸡(🐔 小鸡)、猫(🐱)、植物(🌱)三个原创形象,和 `topmind-briefs` / `topmind-viral-posts` 共用的 emoji 人设一致。可做 3D 黏土 / 毛绒 / 像素 / 手绘四种材质;同一系列固定一种材质,保持辨识度。
158
+ - **原创角色**:可以新造(戴墨镜的小狗、拿红笔的机器人),但**不照抄现有 IP**,不用第三方品牌吉祥物。
159
+ - **真人**:不生成可识别的真实人物长相。需要「人」时用原创卡通人物、背影、剪影或手部特写;要真人出镜就用用户自己提供的照片。
160
+ - **热点贴合**:重大热点或产品发布时,可以去掉自家 IP,改用贴合该产品的视觉语言(官方配色、产品气质),但不用对方的 logo 与吉祥物原图,除非是用户提供的官方素材。
161
+ - **事实类资讯原图优先**:有官方图、截图时用原图当首图,不另画封面;封面里的数字、价格、日期必须在正文有出处。
162
+
163
+ ## 八、成图评分(每项 1–5 分,总分 ≥20 且无单项 ≤2 才交付)
164
+
165
+ | 维度 | 5 分的样子 | ≤2 分的样子 | 低分怎么改 |
166
+ |---|---|---|---|
167
+ | 丰富度 | 主角 + 动作 + 2–4 道具 + 装饰 + ≥3 层背景,全部到位 | 纯色底 + 字 + 一个摆拍角色 | 回到第二节补槽位 |
168
+ | 主题贴合度 | 遮住标题也能猜出主题 | 换个标题照样能用 | 换成第五节的行业道具 / 隐喻 |
169
+ | 标题花式 | 多行大小对比 + 关键词强调 + 1 处辅手法 | 一行黑体居中 | 按 `typography-system.md` 第九节加手法 |
170
+ | 层次 | 一个第一焦点,前中远景分明,光有方向 | 元素平铺、互相抢戏或全部一样亮 | 删弱元素、加承载面和光 |
171
+ | 信息可读性 | 缩到 120px 宽仍能读出标题,字逐字正确 | 错字、糊字、被遮挡、小字密排 | 缩短标题、减装饰,或改走叠字路径 |
172
+ | 质感 | 材质真实,无塑料油光,比例正常 | 劣质 AI 感、手脸崩坏 | 换材质描述、降低复杂度,宁可退到极简大字 |
173
+
174
+ 这份评分和 `SKILL.md` 的冲击力自检一起用:先过自检,再打分。不达标最多重做 3 次,仍不达标就换方案(隐喻或风格组合)。
175
+
176
+ ## 九、双路径出字
177
+
178
+ | 路径 | 什么时候用 | 做法 |
179
+ |---|---|---|
180
+ | A. 生图直出字 | 标题 ≤10 字、常用字、模型中文可靠 | 按第三节模板写标题槽位,逐字检查 |
181
+ | B. 生图做场景 + 脚本叠字 | 标题长、有生僻字、需要多行花式与精确配色、或 A 错字 2 次 | 提示词里留干净标题区、禁止生成文字;出图后用 `scripts/overlay-title.py` 按 JSON 叠标题、关键词变色、描边、投影、手绘底线、标签胶囊;需要更复杂的版式时用 HTML + `topmind-poster` 的截图流程 |
182
+
183
+ `overlay-title.py` 用法见脚本头部说明;叠完再过一遍第八节评分。
184
+
185
+ ---
186
+
187
+ 出处:封面流派与提示词结构参考 X 长文《为什么有的长文内容极好,阅读量却惨淡?》(https://x.com/noahduck283/article/2108529022174998814)——四类流派(夸张动作 + 直球价值承诺 / 名梗与视觉隐喻 / 极简排版 + 绝对一致性 / 硬核数据结果糊脸)、三个死穴(小字塞满、廉价塑料 AI 感、元素大乱斗没有焦点)、IP 取舍(真人 / 虚拟 IP / 热点去 IP),以及文中附录概念海报提示词的结构(语义理解 → 承载面 + 1–3 个演绎主体 + 巨型文字骨架 + 文字嵌入 → 2–4 色配色 → 辅助文字必须相关 → 每个元素都要说明为什么在这里)。本文只吸收方法,未照搬原文与提示词。
@@ -1,7 +1,8 @@
1
1
  # 字体排印系统(Typography System)
2
2
 
3
3
  > 标题字体不能单一。变化来自:字形、字号、颜色、高亮、衬条、装饰——
4
- > 六选二,组合出丰富度。第七节的 12 种标题花式与第八节的背景库,用于让同一账号的封面保持变化。
4
+ > 六选二,组合出丰富度。第七节的 12 种基础花式、第九节的 12 种强调手法(T13–T24)、第十节的副信息组件与第十一节的字体气质表,
5
+ > 用于让标题不再是「一行黑体居中」。场景与标题的配合见 `scene-builder.md`。
5
6
 
6
7
  ## 一、字形变化(6 种)
7
8
 
@@ -23,7 +24,7 @@
23
24
  - Title(0.4):胶囊/标签
24
25
  - Label(0.3):英文点缀/小字
25
26
 
26
- ## 三、高亮手法(5 种,三选一)
27
+ ## 三、高亮手法(5 种基础手法;更多见第九节)
27
28
 
28
29
  1. **撞色**:点题词换主色(如 #0B57D0)
29
30
  2. **色块衬底**:点题词压色块(白字 on 主色块,全圆角)
@@ -31,7 +32,7 @@
31
32
  4. **描边**:双层描边(外白 3px + 内色 1px)
32
33
  5. **立体**:真 3D 挤压(5-10px,仅 2-4 字)
33
34
 
34
- **禁忌**:全标题高亮 = 没高亮;超过 2 个高亮词即乱。
35
+ **规则**:一个关键词用 1 种主手法,可再叠 1 种辅手法(如「变色 + 手绘底线」);**禁忌**:全标题高亮 = 没高亮;超过 2 个高亮词即乱。
35
36
 
36
37
  ## 四、背景衬条(4 种)
37
38
 
@@ -96,3 +97,53 @@
96
97
  | 纯色撞色 | 单一高饱和底色(柠檬黄、克莱因蓝、番茄红)+ 细噪点 | 观点金句、段子 |
97
98
 
98
99
  原则:背景只承担气氛,不承载信息;背景里不出现第二处可读文字;同一账号同周的封面背景类型不重复超过 2 次。
100
+
101
+ ## 九、关键词强调与多行层级(T13–T24)
102
+
103
+ > 标题常见的单调:一行、一个字号、一个颜色、居中。下面的手法让标题有「节奏 + 重点」。
104
+ > 每张封面:**多行层级 1 种 + 关键词强调 1–2 种**。写进 prompt 时照「做法」一列原样写;字本身逐字不变。
105
+
106
+ | 编号 | 手法 | 做法(写进 prompt) | 适合 |
107
+ |---|---|---|---|
108
+ | T13 | 大小行对比 | 标题 2–3 行,最重要的一行字号是其余行的 1.5–2 倍,行距收紧 | 几乎所有,默认首选 |
109
+ | T14 | 关键词变色描边 | 关键词换强调色(橙红 / 品牌色),外加 6–10px 深色或白色描边 + 轻投影 | 3D IP、运营、教程 |
110
+ | T15 | 硬投影 | 标题加同色系深色硬投影(右下偏移 4–8px,无模糊),像丝网印刷错版 | 复古、报纸、像素 |
111
+ | T16 | 手绘圈注 | 关键词外画一个手绘椭圆圈,线条略不闭合,颜色用批改红 | 写作、纠错、清单 |
112
+ | T17 | 手绘底线 | 关键词下一条手绘弧线或波浪线(马克笔质感),比字略宽 | 教程、观点、生活 |
113
+ | T18 | 符号替换 | 标题里的关系词换成大号符号:≠ → × + ?,符号可断裂、发光或换色 | 对比、纠偏、流程 |
114
+ | T19 | 问号 / 感叹号放大 | 句末问号放大到字高 1.3 倍并换强调色,可略微倾斜 | 疑问、悬念、差价 |
115
+ | T20 | 斜切色块 | 关键词压在一块倾斜 3–6° 的纯色块上(白字 on 色块),块边缘直切 | 资讯、发布、警示 |
116
+ | T21 | 贴纸块 | 副标题或关键词做成圆角贴纸,白色描边 + 轻投影,旋转 5–10° | 合集、运营、旅行 |
117
+ | T22 | 双色拼字 | 同一行前半段墨黑、后半段强调色(如「本地部署 / 开源大模型」) | 中英混排、产品名 |
118
+ | T23 | 渐变大字 | 英文或产品名用品牌渐变(如蓝 → 紫 → 橙),中文保持纯色 | 发布、品牌 |
119
+ | T24 | 字中嵌物 | 一个笔画或字母被道具替换(「O」换成芯片、点换成小鸡头),只换 1 处,保证可读 | 极简、概念海报 |
120
+
121
+ **多行排法**:
122
+
123
+ - 上小下大:首行是引子(小一号,可手写体),第二行是主标题(大字)。适合「如何…?」「为什么…」。
124
+ - 上大下小:首行主标题,第二行是三个关键词(`选型 · 安装 · 调优` 式)。适合教程、系列课。
125
+ - 左对齐三行阶梯:每行略缩进或加大,形成阶梯,最后一行放问号或数字。适合观点、差价。
126
+ - 左右分立:标题拆成前后两半,分列主角左右两侧,中间是主角。适合冲突、反差。
127
+
128
+ ## 十、副信息组件(标题之外的点缀,0–2 个)
129
+
130
+ | 组件 | 做法 | 要求 |
131
+ |---|---|---|
132
+ | 眉题 / 系列角标 | 左上一块小圆角色块写「第 3 期」「入门篇」 | 真实的系列信息 |
133
+ | 标签胶囊 | 2–3 个圆角胶囊,浅底深字或描边 | 每个 ≤6 字,真实 |
134
+ | 按钮 | 一个品牌色圆角按钮「开始使用 →」式,轻投影 | 只用于发布 / 产品类 |
135
+ | 地标签 | 图钉图标 + 地名胶囊 | 只用于地点相关主题 |
136
+ | 引子手写条 | 标题上方一行手写体问句,带手绘底线 | ≤12 字 |
137
+ | 流程小字 | 「下载 → 配置 → 运行」式三段,箭头分隔 | 每段 ≤4 字 |
138
+
139
+ ## 十一、字体气质与主题匹配
140
+
141
+ | 主题气质 | 主标题字体描述 | 辅助字体 |
142
+ |---|---|---|
143
+ | 运营 / 涨粉 / 活泼 | 超粗圆黑,边角圆润,贴纸描边 | 手写体 |
144
+ | 科技 / 发布 | 几何无衬线粗体(英文)+ 现代黑体(中文) | 细体英文,字距拉开 |
145
+ | 警示 / 内幕 | 压缩超粗黑体,字距极紧,可做旧印刷 | 等宽小字 |
146
+ | 复古 / 视频 / 人文 | 粗黑体带轻微做旧,或复古海报体 | 衬线宋体 |
147
+ | 教程 / 方法论 | 中粗黑体,清晰稳重 | 手写批注体 |
148
+ | 学术 / 论文 | 高对比衬线宋体 | 细体英文 |
149
+ | 写作 / 手作 | 粗黑体 + 局部手写替换 | 钢笔手写体 |
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # -*- coding: utf-8 -*-
3
- """topmind-cover 异常输入测试:crop-cover.py 错误路径干净(任一失败 → 退出码 1)。"""
3
+ """topmind-cover 异常输入测试:crop-cover.py 与 overlay-title.py 错误路径干净、正常路径出图(任一失败 → 退出码 1)。"""
4
4
  from __future__ import annotations
5
5
 
6
6
  import subprocess
@@ -15,6 +15,7 @@ except Exception:
15
15
 
16
16
  ROOT = Path(__file__).resolve().parent.parent
17
17
  CROP = ROOT / "scripts" / "crop-cover.py"
18
+ OVERLAY = ROOT / "scripts" / "overlay-title.py"
18
19
  PY = sys.executable
19
20
  fails: list[str] = []
20
21
 
@@ -23,6 +24,10 @@ def run(args: list[str]) -> subprocess.CompletedProcess:
23
24
  return subprocess.run([PY, str(CROP), *args], capture_output=True, text=True, timeout=60)
24
25
 
25
26
 
27
+ def run_overlay(args: list[str]) -> subprocess.CompletedProcess:
28
+ return subprocess.run([PY, str(OVERLAY), *args], capture_output=True, text=True, timeout=60)
29
+
30
+
26
31
  def check(name: str, cond: bool, detail: str = "") -> None:
27
32
  print((" ✓ " if cond else " ✗ ") + name + (f" — {detail}" if detail and not cond else ""))
28
33
  if not cond:
@@ -61,6 +66,34 @@ def main() -> None:
61
66
  except ImportError:
62
67
  print(" - 跳过图片生成测试(无 Pillow)")
63
68
 
69
+ # 4. overlay-title:缺失底图 / 坏 spec → 干净报错
70
+ (td / "spec_bad.json").write_text("{not json", encoding="utf-8")
71
+ r = run_overlay([str(td / "nope.png"), str(td / "spec_bad.json"), "--out", str(td / "x.png")])
72
+ check("叠字:缺失底图干净报错", r.returncode != 0 and "Traceback" not in r.stderr, r.stderr[:100])
73
+ try:
74
+ from PIL import Image
75
+ Image.new("RGB", (1200, 675), (245, 240, 230)).save(td / "bg.png")
76
+ r = run_overlay([str(td / "bg.png"), str(td / "spec_bad.json"), "--out", str(td / "x.png")])
77
+ check("叠字:坏 JSON 干净报错", r.returncode != 0 and "Traceback" not in r.stderr, r.stderr[:100])
78
+ (td / "spec_empty.json").write_text('{"lines": []}', encoding="utf-8")
79
+ r = run_overlay([str(td / "bg.png"), str(td / "spec_empty.json"), "--out", str(td / "x.png")])
80
+ check("叠字:空 lines 干净报错", r.returncode != 0 and "Traceback" not in r.stderr, r.stderr[:100])
81
+ (td / "spec_ok.json").write_text(
82
+ '{"lines": [{"text": "Local LLM", "size": 90}, {"text": "AT HOME", "size": 140, '
83
+ '"color": "#D83A2E", "underline": "#F2C230"}], "stroke": 6, "shadow": true, "chips": ["a", "b"]}',
84
+ encoding="utf-8")
85
+ r = run_overlay([str(td / "bg.png"), str(td / "spec_ok.json"), "--out", str(td / "ok_overlay.png")])
86
+ if r.returncode != 0 and "字体" in r.stderr:
87
+ print(" - 跳过叠字出图测试(本机无可用字体)")
88
+ else:
89
+ ok = r.returncode == 0 and (td / "ok_overlay.png").exists()
90
+ check("叠字:正常出图", ok, r.stderr[:100])
91
+ if ok:
92
+ size = Image.open(td / "ok_overlay.png").size
93
+ check("叠字:尺寸与底图一致", size == (1200, 675), f"实 {size}")
94
+ except ImportError:
95
+ print(" - 跳过叠字测试(无 Pillow)")
96
+
64
97
  if fails:
65
98
  print(f"\n[negative_tests] {len(fails)} 项失败")
66
99
  sys.exit(1)
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env python3
2
+ """Overlay a multi-line title onto a cover background (path B of the dual path).
3
+
4
+ Usage:
5
+ python3 scripts/overlay-title.py <background.png> <spec.json> --out <cover.png> [--font <font file>]
6
+
7
+ spec.json fields (all optional except lines):
8
+ lines list of {"text", "size", "color", "underline", "stroke", "stroke_color"}
9
+ or plain strings; each line can override the global values
10
+ x, y top-left of the title block in pixels (default: 7% of width, 22% of height)
11
+ align "left" (default) or "center" (centered on the image)
12
+ color default text color (default "#1E1E1E")
13
+ stroke outline width in px (default 0); stroke_color (default "#FFFFFF")
14
+ shadow true for a hard drop shadow; shadow_color, shadow_offset (default 6)
15
+ line_gap extra pixels between lines (default 12)
16
+ chips list of short strings drawn as rounded pills under the title
17
+ chip_bg, chip_color, chip_size pill colors and text size (defaults "#1E1E1E", "#FFFFFF", 30)
18
+ underline a line's "underline" color draws a hand-marker bar under that line
19
+
20
+ The output keeps the background's size. Text is drawn exactly as given; check it before publishing.
21
+ """
22
+ import argparse
23
+ import json
24
+ import os
25
+ import sys
26
+
27
+ FONT_CANDIDATES = [
28
+ "/usr/share/fonts/opentype/noto/NotoSansCJK-Black.ttc",
29
+ "/usr/share/fonts/opentype/noto/NotoSansCJK-Bold.ttc",
30
+ "/usr/share/fonts/opentype/noto/NotoSerifCJK-Bold.ttc",
31
+ "/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc",
32
+ "/System/Library/Fonts/PingFang.ttc",
33
+ "/System/Library/Fonts/STHeiti Medium.ttc",
34
+ "C:/Windows/Fonts/msyhbd.ttc",
35
+ "C:/Windows/Fonts/msyh.ttc",
36
+ ]
37
+
38
+
39
+ def fail(msg):
40
+ print("错误:" + msg, file=sys.stderr)
41
+ sys.exit(1)
42
+
43
+
44
+ def find_font(explicit):
45
+ if explicit:
46
+ if not os.path.isfile(explicit):
47
+ fail("找不到字体文件:%s" % explicit)
48
+ return explicit
49
+ for path in FONT_CANDIDATES:
50
+ if os.path.isfile(path):
51
+ return path
52
+ fail("没找到中文字体,请用 --font 指定一个 .ttf/.ttc/.otf 文件")
53
+
54
+
55
+ def main():
56
+ ap = argparse.ArgumentParser(description="在封面底图上叠加多行标题")
57
+ ap.add_argument("background")
58
+ ap.add_argument("spec")
59
+ ap.add_argument("--out", required=True)
60
+ ap.add_argument("--font")
61
+ args = ap.parse_args()
62
+
63
+ try:
64
+ from PIL import Image, ImageDraw, ImageFont
65
+ except ImportError:
66
+ fail("需要 Pillow:pip install Pillow")
67
+
68
+ if not os.path.isfile(args.background):
69
+ fail("找不到底图:%s" % args.background)
70
+ if not os.path.isfile(args.spec):
71
+ fail("找不到 spec 文件:%s" % args.spec)
72
+ try:
73
+ with open(args.spec, encoding="utf-8") as f:
74
+ spec = json.load(f)
75
+ except (ValueError, OSError) as e:
76
+ fail("spec 不是合法 JSON:%s" % e)
77
+ if not isinstance(spec, dict) or not spec.get("lines"):
78
+ fail("spec 里必须有非空的 lines 列表")
79
+ try:
80
+ img = Image.open(args.background).convert("RGBA")
81
+ except Exception:
82
+ fail("底图不是可读取的图片:%s" % args.background)
83
+
84
+ font_path = find_font(args.font)
85
+ W, H = img.size
86
+ draw = ImageDraw.Draw(img)
87
+
88
+ def font(size):
89
+ try:
90
+ index = 2 if "CJK" in os.path.basename(font_path) and font_path.endswith(".ttc") else 0
91
+ return ImageFont.truetype(font_path, int(size), index=index)
92
+ except Exception:
93
+ fail("字体无法加载:%s" % font_path)
94
+
95
+ color = spec.get("color", "#1E1E1E")
96
+ stroke = int(spec.get("stroke", 0))
97
+ stroke_color = spec.get("stroke_color", "#FFFFFF")
98
+ shadow = bool(spec.get("shadow", False))
99
+ shadow_color = spec.get("shadow_color", "#00000088")
100
+ off = int(spec.get("shadow_offset", 6))
101
+ gap = int(spec.get("line_gap", 12))
102
+ align = spec.get("align", "left")
103
+ x0 = int(spec.get("x", W * 0.07))
104
+ y = int(spec.get("y", H * 0.22))
105
+
106
+ try:
107
+ for raw in spec["lines"]:
108
+ line = {"text": raw} if isinstance(raw, str) else dict(raw)
109
+ text = str(line.get("text", ""))
110
+ if not text:
111
+ continue
112
+ f = font(line.get("size", H * 0.16))
113
+ sw = int(line.get("stroke", stroke))
114
+ l, t, r, b = draw.textbbox((0, 0), text, font=f, stroke_width=sw)
115
+ w, h = r - l, b - t
116
+ x = (W - w) // 2 if align == "center" else x0
117
+ if line.get("underline"):
118
+ bar_h = max(8, h // 5)
119
+ draw.rounded_rectangle([x - 6, y + h - bar_h // 2 - t, x + w + 6, y + h + bar_h // 2 - t],
120
+ radius=bar_h // 2, fill=line["underline"])
121
+ if shadow:
122
+ draw.text((x - l + off, y - t + off), text, font=f, fill=shadow_color,
123
+ stroke_width=sw, stroke_fill=shadow_color)
124
+ draw.text((x - l, y - t), text, font=f, fill=line.get("color", color),
125
+ stroke_width=sw, stroke_fill=line.get("stroke_color", stroke_color))
126
+ y += h + gap
127
+
128
+ chips = spec.get("chips") or []
129
+ if chips:
130
+ cf = font(spec.get("chip_size", 30))
131
+ cx, y = x0, y + gap * 2
132
+ for chip in chips:
133
+ l, t, r, b = draw.textbbox((0, 0), str(chip), font=cf)
134
+ pw, ph = (r - l) + 36, (b - t) + 20
135
+ if align == "center" and cx == x0:
136
+ total = sum(draw.textbbox((0, 0), str(c), font=cf)[2] + 52 for c in chips)
137
+ cx = (W - total) // 2
138
+ draw.rounded_rectangle([cx, y, cx + pw, y + ph], radius=ph // 2,
139
+ fill=spec.get("chip_bg", "#1E1E1E"))
140
+ draw.text((cx + 18 - l, y + 10 - t), str(chip), font=cf, fill=spec.get("chip_color", "#FFFFFF"))
141
+ cx += pw + 16
142
+ except ValueError as e:
143
+ fail("颜色或数值写法不对:%s" % e)
144
+
145
+ out_dir = os.path.dirname(os.path.abspath(args.out))
146
+ os.makedirs(out_dir, exist_ok=True)
147
+ img.convert("RGB").save(args.out)
148
+ print("已输出:%s(%d×%d)" % (args.out, W, H))
149
+
150
+
151
+ if __name__ == "__main__":
152
+ main()
@@ -4,7 +4,7 @@
4
4
 
5
5
  Lays out existing text for X: **duanzi mode** (one sentence per line, a blank line between every line, no emoji at all, bullets without symbols) or **short-post mode** (paragraphing; lists become 「·」/「1)」 or, optionally, emoji bullets; title emoji and motifs are optional). Layout only — the words are never changed; a fidelity check enforces it. Links, source lines and image notes are pulled out of the body so it stays one copy-ready plain-text block; links and images are sent separately.
6
6
 
7
- - Version: **v0.1.4** (ships with `@topmindspace/topmind-writing-skills@0.8.36`)
7
+ - Version: **v0.1.4** (ships with `@topmindspace/topmind-writing-skills@0.8.37`)
8
8
 
9
9
  ## Install
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  把现成的文字排成 X 上好读的样子:**转段子**(每句一行、行间空一行,完全不用 emoji,分点不加符号)或**格式化成短文**(合理分段换行、列表改「·」「1)」或 emoji,标题 emoji 与人设点缀可选)。只动排版,不改字,自带原文保真校验;正文里的链接、来源行、配图行会拿出来另列,交付一段可直接复制的纯文本,链接和图片另发。
6
6
 
7
- - 版本:**v0.1.4**(随 `@topmindspace/topmind-writing-skills@0.8.36` 发布)
7
+ - 版本:**v0.1.4**(随 `@topmindspace/topmind-writing-skills@0.8.37` 发布)
8
8
 
9
9
  ## 安装
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  Rankings, infographics, monthly-report long images, posters — plus the "one image per section" workflow for splitting a long article into N shareable images. Text is 100% controllable, diffable, and iterable.
6
6
 
7
- - Version: **v0.1.5** (ships with `@topmindspace/topmind-writing-skills@0.8.36`)
7
+ - Version: **v0.1.5** (ships with `@topmindspace/topmind-writing-skills@0.8.37`)
8
8
 
9
9
  ## Install
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  榜单、信息图、月报长图、海报,以及「一段一图」的分段图批量出图。文本 100% 可控、可 diff、可迭代。
6
6
 
7
- - 版本:**v0.1.5**(随 `@topmindspace/topmind-writing-skills@0.8.36` 发布)
7
+ - 版本:**v0.1.5**(随 `@topmindspace/topmind-writing-skills@0.8.37` 发布)
8
8
 
9
9
  ## 安装
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  Short, real, hooked — read in 3 seconds, impossible not to like/comment/follow. 18 post types plus hook × body × closer combinations, summarised from common high-engagement writing patterns in the Chinese X community (all examples are original). Posts default to "duanzi" layout (one sentence per line, a blank line between lines), original images first, plus a hashtag set and classification tags. Existing text → `topmind-format`.
6
6
 
7
- - Version: **v0.3.11** (ships with `@topmindspace/topmind-writing-skills@0.8.36`)
7
+ - Version: **v0.3.11** (ships with `@topmindspace/topmind-writing-skills@0.8.37`)
8
8
 
9
9
  ## Install
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  短、真、钩子——3 秒看完,忍不住点赞/评论/关注。基于对 X 中文区常见高互动写法的归纳,提供 18 类型模板 + 钩子×主体×收尾组合玩法(示例均为自编),默认段子体排版(一句一行、行间空一行),配图原图优先,并附话题标签与分类标签。
6
6
 
7
- - 版本:**v0.3.11**(随 `@topmindspace/topmind-writing-skills@0.8.36` 发布)
7
+ - 版本:**v0.3.11**(随 `@topmindspace/topmind-writing-skills@0.8.37` 发布)
8
8
 
9
9
  ## 安装
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  Full lifecycle for WeChat articles: delivery package, review & rewrite, three quality gates, status sync, WeChat inline typography, and publish checklist.
6
6
 
7
- - Version: **v0.3.11** (ships with `@topmindspace/topmind-writing-skills@0.8.36`)
7
+ - Version: **v0.3.11** (ships with `@topmindspace/topmind-writing-skills@0.8.37`)
8
8
 
9
9
  ## Install
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  公众号文章全生命周期:交付包、审校改写、质量三关、状态同步、微信内联排版与发布清单。
6
6
 
7
- - 版本:**v0.3.11**(随 `@topmindspace/topmind-writing-skills@0.8.36` 发布)
7
+ - 版本:**v0.3.11**(随 `@topmindspace/topmind-writing-skills@0.8.37` 发布)
8
8
 
9
9
  ## 安装
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  Turn a Markdown draft into a "copy → paste → publish" X long-form (Article) package.
6
6
 
7
- - Version: **v0.4.17** (ships with `@topmindspace/topmind-writing-skills@0.8.36`)
7
+ - Version: **v0.4.17** (ships with `@topmindspace/topmind-writing-skills@0.8.37`)
8
8
 
9
9
  ## Install
10
10
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  把 Markdown 原稿变成"复制 → 粘贴 → 发"的 X 长文(Article)发布包。
6
6
 
7
- - 版本:**v0.4.17**(随 `@topmindspace/topmind-writing-skills@0.8.36` 发布)
7
+ - 版本:**v0.4.17**(随 `@topmindspace/topmind-writing-skills@0.8.37` 发布)
8
8
 
9
9
  ## 安装
10
10