Back to skills
SkillHub ClubAnalyze Data & AIFull StackBackendDevOps

tech-manga-explainer

生成技术科普漫画,用对话形式解释复杂的技术概念。当用户请求「用漫画解释技术」「生成技术科普漫画」「把这个技术概念画成漫画」「漫画教程」「用漫画讲解 XXX」或类似需求时使用。适合 n8n、Kubernetes、AI、编程、架构等技术话题。通过 nanobanana + Gemini API 生成图片。

Packaged view

This page reorganizes the original catalog entry around fit, installability, and workflow context first. The original raw source lives below.

Stars
18
Hot score
87
Updated
March 20, 2026
Overall rating
C2.9
Composite score
2.9
Best-practice grade
C62.8

Install command

npx @skill-hub/cli install lqshow-claude-skills-tech-manga-explainer

Repository

lqshow/claude-skills

Skill path: tech-manga-explainer

生成技术科普漫画,用对话形式解释复杂的技术概念。当用户请求「用漫画解释技术」「生成技术科普漫画」「把这个技术概念画成漫画」「漫画教程」「用漫画讲解 XXX」或类似需求时使用。适合 n8n、Kubernetes、AI、编程、架构等技术话题。通过 nanobanana + Gemini API 生成图片。

Open repository

Best for

Primary workflow: Analyze Data & AI.

Technical facets: Full Stack, Backend, DevOps, Data / AI.

Target audience: everyone.

License: Unknown.

Original source

Catalog source: SkillHub Club.

Repository owner: lqshow.

This is still a mirrored public skill entry. Review the repository before installing into production workflows.

What it helps with

  • Install tech-manga-explainer into Claude Code, Codex CLI, Gemini CLI, or OpenCode workflows
  • Review https://github.com/lqshow/claude-skills before adding tech-manga-explainer to shared team environments
  • Use tech-manga-explainer for development workflows

Works across

Claude CodeCodex CLIGemini CLIOpenCode

Favorites: 0.

Sub-skills: 0.

Aggregator: No.

Original source / Raw SKILL.md

---
name: tech-manga-explainer
description: 生成技术科普漫画,用对话形式解释复杂的技术概念。当用户请求「用漫画解释技术」「生成技术科普漫画」「把这个技术概念画成漫画」「漫画教程」「用漫画讲解 XXX」或类似需求时使用。适合 n8n、Kubernetes、AI、编程、架构等技术话题。通过 nanobanana + Gemini API 生成图片。
---

# Tech Manga Explainer

用漫画对话形式将复杂技术概念变得通俗易懂。

## 核心特点

- **目标读者**:成年技术学习者、编程新手、想了解技术的非技术人员
- **表达形式**:漫画对话,老手带新手,边问边答
- **画风选择**:日式漫画、简约线条、赛博朋克、手绘涂鸦
- **角色组合**:支持多套角色,默认火影师徒(卡卡西 & 鸣人)
- **适用主题**:编程、架构、AI、自动化、云原生、数据库等技术概念

## ⚠️ 角色一致性规则(重要)

全套漫画必须保持角色外观完全一致。每一页 prompt 都会自动包含完整角色卡。

### 可选角色组

| 角色组 | 参数 | 导师 | 学员 | 风格特点 |
|-------|------|------|------|---------|
| 火影师徒 | `--preset naruto` | 😷 卡卡西 | 🍥 鸣人 | 热血修行、师徒传承、循序渐进(默认) |
| 程序员搭档 | `--preset coder` | 👨‍💻 码叔 | 🧑 小新 | 职场日常、轻松幽默 |

### 默认角色卡:火影师徒

**卡卡西(Kakashi)- 技术导师**
```
FACE & HEAD:
- Japanese male ninja, around 30 years old, tall and lean
- HAIR: Spiky SILVER/WHITE hair, gravity-defying, pointing up and left
- LEFT EYE: Covered by TILTED forehead protector (hitai-ate)
- RIGHT EYE: Relaxed, half-lidded, slightly bored
- MASK: ALWAYS wearing dark navy blue FACE MASK covering nose and mouth

CLOTHING (NEVER CHANGES):
- HEAD: Konoha forehead protector worn TILTED to cover left eye
- TOP: Green/olive JONIN VEST (flak jacket) with scroll pouches
- UNDER: Dark navy blue long-sleeve shirt with built-in mask
- PANTS: Dark navy blue ninja pants
- SHOES: Standard blue ninja sandals

⚠️ 必须出现的特征:银白刺猬头、遮左眼的护额、深蓝色面罩、绿色马甲、慵懒眼神
```

**鸣人(Naruto)- 热血学习者**
```
FACE & HEAD:
- Japanese male ninja, around 16 years old (Shippuden era)
- HAIR: Bright SPIKY BLONDE/YELLOW hair, messy, sticking out everywhere
- EYES: Big bright BLUE eyes, very expressive
- FACE: THREE WHISKER MARKS on each cheek (6 total)

CLOTHING (NEVER CHANGES - Shippuden outfit):
- HEAD: Konoha forehead protector worn on FOREHEAD (black cloth)
- TOP: Orange and BLACK TRACKSUIT jacket with zipper
- INSIDE: Black t-shirt visible at collar
- PANTS: Orange tracksuit pants
- SHOES: Black ninja sandals
- ACCESSORIES: Small green crystal necklace

⚠️ 必须出现的特征:金色刺猬头、蓝色眼睛、每边脸3道胡须印记、橙黑运动服、正戴护额
```

### 备选角色卡:程序员搭档

**码叔(Ma Shu)- 技术导师**
```
⚠️ 必须出现的特征:秃顶+两侧有发、银框眼镜、红黑格子衬衫、灰色帽衫堆在脖子后、络腮胡
```

**小新(Xiao Xin)- 技术新手**
```
⚠️ 必须出现的特征:蘑菇头黑发、黑色拉链卫衣敞开、白T恤、灰背包+像素机器人挂件
```

## 工作流程

### 第一步:技术概念分析与页数判断

1. 理解用户想要解释的技术概念
2. **🚨 必须:分析内容复杂度,根据下方标准确定合适的页数(禁止默认6页)**
3. 拆解知识点,为每个知识点设计「问-答」对话
4. 确定合适的比喻和类比(可用忍术类比技术概念)

#### ⚠️ 页数判断标准(强制执行)

**核心原则**:
- ❌ 禁止:不分析内容就默认生成 6 页
- ✅ 必须:先数核心概念数量,再用公式计算页数
- ✅ 必须:在规划中写明「复杂度判断理由」

**计算公式**:
```
总页数 = 开头引入(1页) + 核心概念数 × 1.5页 + 结尾总结(1页)

示例:3个核心概念 → 1 + 3×1.5 + 1 = 6.5 → 取整为 6-7 页
示例:7个核心概念 → 1 + 7×1.5 + 1 = 12.5 → 取整为 12-13 页
```

| 复杂度 | 页数范围 | 核心概念数 | 判断标准 | 示例 |
|-------|---------|-----------|---------|------|
| 简单 | 3-4页 | 1-2个 | 单一概念,无需深入原理 | "什么是API"、"环境变量" |
| 中等 | 5-8页 | 3-5个 | 需要解释原理+应用 | "Docker入门"、"什么是RAG" |
| 复杂 | 9-15页 | 6-10个 | 多个子概念相互关联 | "K8s架构全解"、"Transformer原理" |
| 系统性 | 15-25页 | 10+个 | 完整教程或论文解读 | "从零理解LLM"、"论文完整解读" |

**判断流程(必须执行)**:
1. 列出需要解释的核心概念/知识点
2. 数一数有几个核心概念
3. 根据上表确定复杂度和页数范围
4. 在规划中明确写出判断理由

**判断示例**:

示例1:用户要求「用漫画解释什么是 Pod」
- 核心概念:Pod的定义(1个)
- 判断:简单概念 → 3-4页
- 结构:引入 → Pod概念 → 与Container关系 → 总结

示例2:用户要求「用漫画讲解 Kubernetes 的 Pod、Node、Cluster」
- 核心概念:Pod + Node + Cluster + 三者关系 = 4个概念
- 判断:中等复杂度 → 6-7页
- 结构:引入 → Pod → Node → Cluster → 三者关系 → 实际应用 → 总结

示例3:用户要求「把这篇 Transformer 论文变成漫画」
- 核心概念:注意力机制 + Self-Attention + Multi-Head + Encoder + Decoder + 位置编码 + 训练过程 = 7+个概念
- 判断:复杂内容 → 12-15页
- 结构:引入 → 逐个概念讲解(每个1-2页) → 整体架构 → 应用场景 → 总结

### 第二步:漫画结构规划

**必须先输出规划,等用户确认后再生成图片。**

#### ⚠️ 规划硬性要求

1. **禁止合并页数**:不能写"第2-3页",必须每页单独规划
2. **必须包含试错环节**:至少有1页是「鸣人犯错→卡卡西纠正」
3. **技术图示必须漫画化**:不能写抽象描述,要转化为具体画面

输出规划格式:

```
## 漫画规划

主题:[技术概念名称]
复杂度判断:[简单/中等/复杂/系统性] - [判断理由]
总页数:[X页]
画风:[manga/minimal/cyberpunk/sketch]
角色组:[naruto/coder] - 默认火影师徒

### 核心比喻
[主比喻] = [忍术/火影世界事物]
理由:[为什么这个比喻合适]
例:Docker = 封印卷轴,把整个环境封印进去,随时随地都能召唤

### 知识点拆解(每个概念单独一行)
1. [知识点1] - 第X页
2. [知识点2] - 第X页
3. 【试错环节】鸣人的理解错误 - 第X页 ← 必须有这一行
4. ...

### 第1页 - 引入问题
- 场景:[具体场景,如:木叶村情报分析室,鸣人对着一堆卷轴抓狂]
- 鸣人:「[用口癖开头,如:可恶!/卡卡西老师!]...」
- 卡卡西:「[用口癖开头,如:嘛嘛...]...」
- 画面要点:[具体视觉元素]

### 第2页 - [知识点1标题]
- 场景:[具体场景]
- 鸣人:「...」
- 卡卡西:「...」
- 技术图示:[漫画化描述,如:卡卡西手持三个卷轴,分别写着Q/K/V,箭头汇聚成发光球]
- 画面要点:[具体视觉元素]

### 第X页 - 鸣人的理解错误【必须有】
- 场景:[鸣人自信尝试的场景]
- 鸣人:「哦!我懂了!就是XXX对吧!(开始乱搞)」
- 卡卡西:「等等...你还没...」
- 画面要点:[失败/爆炸/报错特效]

### 第X+1页 - 卡卡西纠正
- 场景:[卡卡西认真讲解的场景]
- 卡卡西:「不对不对。关键点是...」
- 鸣人:「原来是这样...」
- 技术图示:[正确理解的可视化]
- 画面要点:[对比错误和正确的做法]

### 第N页 - 总结应用
- 场景:[成功场景,如:夕阳下的训练场]
- 鸣人:「哦哦!我懂了![用自己的话总结,带上忍术类比]」
- 卡卡西:「嘛,差不多是这个意思(翻开小橙书)」
- 画面要点:[成就感、成长氛围]
```

**规划完成后询问用户**:
> 以上是漫画结构规划,共X页(包含1个试错学习环节)。确认无误后我将开始生成图片,或者你可以告诉我需要调整的地方。

### 第三步:生成漫画图片

使用脚本逐页生成:

```bash
# 默认使用卡卡西 & 鸣人
python3 /mnt/skills/user/tech-manga-explainer/scripts/generate_tech_manga.py \
  --style manga \
  --prompt "木叶村训练场,卡卡西在白板前讲解" \
  --dialogue "鸣人:这个 Docker 到底是什么啊!|卡卡西:嘛嘛,你想想忍者出任务时为什么要带卷轴?" \
  --tech-diagram "Docker 容器结构示意图" \
  --output page_01.png

# 使用程序员角色组
python3 /mnt/skills/user/tech-manga-explainer/scripts/generate_tech_manga.py \
  --preset coder \
  --style manga \
  --prompt "办公室场景,码叔在白板前" \
  --dialogue "小新:Pod是什么?|码叔:就像一个集装箱..." \
  --output page_01.png
```

## 画风参数

| 风格代码 | 风格名称 | 特点 | 适合主题 |
|---------|---------|------|---------|
| manga | 日式漫画 | 清晰线条、网点背景、动态表情 | 通用,最推荐 |
| minimal | 简约线条 | 黑白为主、极简、专业感 | 架构、流程讲解 |
| cyberpunk | 赛博朋克 | 霓虹色、科技感、暗色调 | AI、云原生、未来技术 |
| sketch | 手绘涂鸦 | 轻松随意、像白板画 | 快速原型、头脑风暴 |

## 角色组参数

| 角色组 | 参数 | 特点 | 对话风格 |
|-------|------|------|---------|
| naruto | `--preset naruto` | 热血修行、师徒传承 | 鸣人冲动提问,卡卡西慵懒解答 |
| coder | `--preset coder` | 职场日常、轻松幽默 | 小新虚心请教,码叔耐心讲解 |

## 脚本参数

```bash
python3 generate_tech_manga.py [选项]

必需参数:
  --prompt       场景描述

核心参数:
  --dialogue     对话内容,格式:角色:内容|角色:内容
  --preset       角色组 [naruto|coder],默认 naruto(卡卡西&鸣人)
  --style        画风 [manga|minimal|cyberpunk|sketch],默认 manga
  
可选参数:
  --tech-diagram 需要在画面中展示的技术图示描述
  --output       输出文件名,默认 tech_manga_page.png
  --size         图片尺寸,默认 1024x1024(推荐竖版 768x1024)
  --show-prompt  仅显示提示词,不生成图片
  --list-styles  列出所有可用画风
  --list-presets 列出所有可用角色组
```

## 使用示例

### 示例1:卡卡西 & 鸣人讲解 Docker(默认角色)

```bash
# 第1页 - 引入
python3 generate_tech_manga.py \
  --style manga \
  --prompt "木叶村训练场,鸣人在电脑前抓狂,卡卡西慵懒地走过来" \
  --dialogue "鸣人:卡卡西老师!这个 Docker 到底是什么啊!跑了一天都报错!|卡卡西:嘛嘛,别着急。你想想,忍者出任务时为什么要带卷轴?" \
  --output docker_01.png

# 第2页 - 核心比喻
python3 generate_tech_manga.py \
  --style manga \
  --prompt "卡卡西拿出一个卷轴展示,上面画着封印术式" \
  --dialogue "鸣人:因为...可以随时召唤需要的武器?|卡卡西:没错。Docker 就是你的封印卷轴,把整个运行环境封印进去,到哪里都能完美还原" \
  --tech-diagram "卷轴里封印着:代码 + 依赖 + 配置 = 容器" \
  --output docker_02.png

# 第3页 - 理解确认
python3 generate_tech_manga.py \
  --style manga \
  --prompt "鸣人眼睛发光,双手握拳,卡卡西眼神带笑" \
  --dialogue "鸣人:哦!我懂了!这就像我把影分身术封印在卷轴里,走到哪都能用!|卡卡西:差不多是这个意思(翻开小橙书)" \
  --output docker_03.png
```

### 示例2:程序员搭档讲解 Kubernetes Pod

```bash
python3 generate_tech_manga.py \
  --preset coder \
  --style manga \
  --prompt "办公室场景,小新对着电脑挠头,码叔端着咖啡杯走过来" \
  --dialogue "小新:码叔,这个 Pod 到底是啥?文档看得我头大|码叔:来,我给你打个比方" \
  --output k8s_pod_01.png
```

### 示例3:赛博朋克风格讲 AI Agent

```bash
python3 generate_tech_manga.py \
  --style cyberpunk \
  --prompt "霓虹灯闪烁的未来城市背景,卡卡西和鸣人站在一个全息投影前" \
  --dialogue "鸣人:AI Agent 和普通聊天机器人有什么区别?|卡卡西:Agent 能自己思考、规划、还能动手干活,就像上忍和下忍的区别" \
  --tech-diagram "Agent 循环图:感知→思考→规划→执行" \
  --output agent_01.png
```

## 对话设计技巧

好的技术漫画对话应该:

### 火影师徒风格(默认)

#### 🎭 角色语言特点(必须遵守)

**卡卡西的说话习惯:**
- 口癖:「嘛嘛...」「嘛,差不多是这个意思」
- 语气:慵懒、不紧不慢,但关键时刻一针见血
- 特点:喜欢用反问引导思考,偶尔翻小橙书
- 常用句式:
  - 「嘛嘛,别着急。你想想...」
  - 「这就是为什么...(叹气)」
  - 「不对不对,你理解错了。关键是...」
  - 「差不多是这个意思(眼神带笑)」

**鸣人的说话习惯:**
- 口癖:「我说啊!」「可恶!」「哦哦!我懂了!」
- 语气:热血、冲动、容易激动
- 特点:经常先犯错再理解,喜欢用自己的话总结
- 常用句式:
  - 「卡卡西老师!这个XXX到底是什么啊!」
  - 「可恶!又报错了!」
  - 「等等...我好像有点懂了...就是说...」
  - 「哦!我懂了!这就像XXX!」

#### 📝 对话示例对比

| 场景 | ❌ 错误写法(太正式) | ✅ 正确写法(火影风格) |
|------|---------------------|----------------------|
| 提问 | "请问 Docker 的定义是什么?" | "卡卡西老师!这个 Docker 到底是什么啊!我搞了一天都跑不起来!" |
| 回答 | "Docker 是一种容器化技术" | "嘛嘛,别着急。你想想,忍者出任务时为什么要带卷轴?" |
| 犯错 | "我理解错了" | "可恶!我以为直接复制就行了!" |
| 纠正 | "不对,应该是这样的" | "不对不对。你用的是下忍的方法。看好了...(单手结印)" |
| 理解 | "我明白了" | "哦哦!我懂了!这就像把影分身术封印在卷轴里!" |
| 确认 | "是的,你理解正确" | "嘛,差不多是这个意思(翻开小橙书)" |

#### 🥷 忍术类比技术概念(推荐映射表)

**基础设施类:**
| 技术概念 | 忍术类比 | 类比理由 |
|---------|---------|---------|
| Docker | 封印卷轴 | 把整个环境封印进去,随时召唤 |
| Kubernetes | 火影 | 调度管理所有忍者(容器),分配任务 |
| Container | 影分身 | 可以复制多个,每个都能独立工作 |
| 虚拟机 | 变身术 | 整个人变成另一个样子,开销大 |
| 镜像 | 卷轴原本 | 可以复制,但原本不变 |

**架构类:**
| 技术概念 | 忍术类比 | 类比理由 |
|---------|---------|---------|
| API | 通灵术 | 召唤其他服务来帮忙 |
| 微服务 | 木叶十二小强 | 各有专长,协同作战 |
| 负载均衡 | 分身协调 | 把任务分给多个分身 |
| 缓存 | 写轮眼记忆 | 看过一次就记住,下次直接用 |
| 消息队列 | 飞雷神标记 | 先做标记,之后再传送 |

**AI/ML类:**
| 技术概念 | 忍术类比 | 类比理由 |
|---------|---------|---------|
| 注意力机制 | 白眼 | 360度同时观察所有信息的关系 |
| Self-Attention | 白眼观察队友 | 每个人同时观察所有队友的状态 |
| Multi-Head | 影分身分析 | 多个分身从不同角度同时分析 |
| Encoder | 山中一族读心 | 理解输入信息的含义 |
| Decoder | 写轮眼复制 | 基于理解生成输出 |
| 神经网络 | 经络系统 | 信息像查克拉一样在网络中流动 |
| 训练 | 修行 | 反复练习直到掌握 |
| 过拟合 | 只会对付一个敌人 | 训练太单一,换个对手就不行了 |

#### ⚠️ 必须包含「试错学习」环节

**火影的核心是成长,每个教程都应该有鸣人犯错→被纠正的桥段:**

```
【试错学习模板】

第X页 - 鸣人的理解错误(必须有这一页)
- 场景:鸣人自信地尝试,结果失败
- 鸣人:"我懂了!就是XXX对吧!(开始乱搞)"
- 卡卡西:"等等...你还没学会基础就..."
- 画面要点:鸣人自信满满 → 爆炸/报错特效

第X+1页 - 卡卡西纠正
- 场景:卡卡西解释正确做法
- 卡卡西:"不对不对。你理解错了关键点。XXX不是YYY,而是ZZZ。"
- 鸣人:"原来是这样...那应该怎么做?"
- 画面要点:卡卡西认真讲解,鸣人虚心听讲
```

**常见的「犯错点」设计:**
1. 把相似概念搞混(Container vs Image)
2. 跳过基础直接上手(不看文档就开干)
3. 字面理解而非本质理解("注意力"就是"看一遍")
4. 过度简化("就是XXX嘛,很简单")

### 程序员搭档风格

**码叔的说话习惯:**
- 语气:耐心、幽默、偶尔自嘲
- 特点:喜欢用生活化比喻,喝咖啡
- 常用句式:「来,我给你打个比方...」「我当年也是这么踩坑的...」

**小新的说话习惯:**
- 语气:好奇、虚心、偶尔冒傻气
- 特点:认真记笔记,喜欢确认理解
- 常用句式:「所以说...」「等等,让我理一下...」

### 通用原则

- **每页对话不超过3轮**:漫画是视觉媒介,文字太多会挤压画面
- **禁止合并页数**:必须每页单独规划,不能写"第2-3页"
- **每个概念至少1页**:宁可多拆不要压缩

## 技术图示设计(漫画化)

技术图示不能太抽象,必须转化为漫画场景:

### ❌ 错误写法(太抽象)
```
技术图示:注意力权重计算图(Query, Key, Value)
```

### ✅ 正确写法(漫画化)
```
技术图示:三个鸣人分身分别拿着写有"Q/K/V"的卷轴,
箭头汇聚到中间一个发光的结果球,
旁边标注"注意力分数"
```

### 图示漫画化转换表

| 抽象图示 | 漫画化描述 |
|---------|-----------|
| 架构图(方块+箭头) | 忍者村落地图,建筑=组件,道路=数据流 |
| 流程图 | 任务卷轴,步骤用忍术手印表示 |
| 神经网络图 | 经络系统图,节点=穴位,连线=查克拉流动 |
| 数据流图 | 情报传递路线,情报=数据,忍者=处理节点 |
| 对比图 | 左边下忍做法(错误),右边上忍做法(正确) |

## 📦 第四步:生成交互式 HTML 漫画(必须执行)

**所有图片生成完成后,必须生成一个交互式 HTML 文件**,将所有页面整合成可浏览的漫画教程。

### HTML 模板文件

模板文件位于 `assets/` 目录:

```
assets/
├── manga_template.html      # 主模板(完整页面结构,深色技术风格)
├── page_template.html       # 单页模板(循环生成每页)
└── dialogue_template.html   # 对话模板(角色对话块)
```

### 模板占位符说明

**主模板 `manga_template.html`:**

| 占位符 | 说明 | 示例 |
|-------|------|------|
| `{{TITLE}}` | 教程标题 | Docker 入门:封印卷轴的秘密 |
| `{{COMPLEXITY}}` | 复杂度 | 简单/中等/复杂 |
| `{{PAGE_COUNT}}` | 总页数 | 6 |
| `{{STYLE}}` | 画风名称 | 日式漫画 |
| `{{ANALOGY_TITLE}}` | 核心比喻标题 | 本教程的核心比喻 |
| `{{ANALOGY_DESC}}` | 核心比喻描述 | Docker = 封印卷轴 |
| `{{PAGES}}` | 页面内容(循环生成) | - |

**单页模板 `page_template.html`:**

| 占位符 | 说明 |
|-------|------|
| `{{PAGE_NUM}}` | 页码 |
| `{{PAGE_TITLE}}` | 页面标题 |
| `{{IMAGE_FILE}}` | 图片文件名 |
| `{{DIALOGUES}}` | 对话内容(循环生成) |
| `{{TECH_POINT}}` | 技术要点 |

**对话模板 `dialogue_template.html`:**

| 占位符 | 说明 |
|-------|------|
| `{{CLASS}}` | CSS类名:mashu / xiaoxin |
| `{{EMOJI}}` | 角色 emoji:👨‍🏫 / 🧑 |
| `{{NAME}}` | 角色名称:码叔 / 小新 |
| `{{CONTENT}}` | 对话内容 |

### 生成流程

1. 读取 `assets/manga_template.html` 主模板
2. 对每一页,读取 `assets/page_template.html` 并填充内容
3. 对每段对话,读取 `assets/dialogue_template.html` 并填充
4. 将所有页面内容插入主模板的 `{{PAGES}}` 位置
5. 保存为 `[主题]_manga.html`

### 生成要求

1. **文件命名**:`[主题]_manga.html`
2. **图片引用**:使用相对路径引用生成的图片
3. **代码高亮**:技术术语用 `<code>` 标签包裹
4. **技术要点**:每页的核心知识点单独展示
5. **响应式**:确保手机端也能正常浏览

### 完成提示

生成 HTML 后,告知用户:
> ✅ 技术漫画已完成!共生成 [N] 张图片和 1 个交互式 HTML 文件。
> 
> 📁 文件列表:
> - page_01.png ~ page_0N.png(漫画图片)
> - [主题]_manga.html(交互式漫画,可在浏览器中打开)
>
> 💡 提示:将 HTML 文件和所有图片放在同一文件夹,用浏览器打开 HTML 即可阅读完整漫画教程。

## 依赖

- nanobanana skill(提供 Gemini 图像生成能力)
- Python 3
- 环境变量:通过 nanobanana 配置 GEMINI_API_KEY


---

## Referenced Files

> The following files are referenced in this skill and included for context.

### assets/manga_template.html

```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{{TITLE}} - 技术漫画</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }

        body {
            font-family: 'Microsoft YaHei', 'PingFang SC', sans-serif;
            background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
            color: #eee;
            padding: 20px;
            min-height: 100vh;
        }

        .container {
            max-width: 1200px;
            margin: 0 auto;
            background: rgba(255,255,255,0.03);
            border-radius: 20px;
            padding: 40px;
            border: 2px solid #4CAF50;
            box-shadow: 0 0 40px rgba(76, 175, 80, 0.1);
        }

        header {
            text-align: center;
            margin-bottom: 40px;
            padding-bottom: 30px;
            border-bottom: 2px solid rgba(76, 175, 80, 0.3);
        }

        h1 {
            color: #4CAF50;
            font-size: 2.8em;
            margin-bottom: 10px;
            text-shadow: 0 0 20px rgba(76, 175, 80, 0.3);
        }

        .subtitle {
            color: #888;
            font-size: 1.3em;
            margin-bottom: 20px;
        }

        .meta-info {
            display: flex;
            justify-content: center;
            gap: 20px;
            margin-top: 25px;
            flex-wrap: wrap;
        }

        .badge {
            background: linear-gradient(45deg, #4CAF50, #45a049);
            color: white;
            padding: 10px 25px;
            border-radius: 25px;
            font-size: 0.95em;
            font-weight: 500;
            box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3);
        }

        .badge.complexity {
            background: linear-gradient(45deg, #FF9800, #F57C00);
        }

        .badge.style {
            background: linear-gradient(45deg, #2196F3, #1976D2);
        }

        .intro-box {
            background: rgba(76, 175, 80, 0.1);
            border: 1px solid rgba(76, 175, 80, 0.3);
            border-radius: 15px;
            padding: 25px;
            margin-bottom: 40px;
            text-align: center;
        }

        .intro-box h3 {
            color: #4CAF50;
            margin-bottom: 10px;
            font-size: 1.4em;
        }

        .intro-box p {
            color: #aaa;
            font-size: 1.1em;
        }

        .page {
            margin: 40px 0;
            padding: 30px;
            border-radius: 15px;
            background: rgba(255,255,255,0.02);
            border-left: 5px solid #4CAF50;
            box-shadow: 0 5px 20px rgba(0,0,0,0.2);
            transition: all 0.3s ease;
        }

        .page:hover {
            transform: translateX(5px);
            box-shadow: 0 8px 30px rgba(76, 175, 80, 0.2);
        }

        .page:nth-child(even) {
            border-left-color: #FF9800;
        }

        .page-header {
            display: flex;
            align-items: center;
            gap: 20px;
            margin-bottom: 25px;
        }

        .page-number {
            background: linear-gradient(45deg, #4CAF50, #45a049);
            color: white;
            width: 50px;
            height: 50px;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            font-size: 1.4em;
            font-weight: bold;
            box-shadow: 0 4px 15px rgba(76, 175, 80, 0.4);
            flex-shrink: 0;
        }

        .page:nth-child(even) .page-number {
            background: linear-gradient(45deg, #FF9800, #F57C00);
            box-shadow: 0 4px 15px rgba(255, 152, 0, 0.4);
        }

        .page-title {
            color: #4CAF50;
            font-size: 1.6em;
            font-weight: bold;
        }

        .page:nth-child(even) .page-title {
            color: #FF9800;
        }

        .page-content {
            display: flex;
            flex-wrap: wrap;
            gap: 30px;
            align-items: flex-start;
        }

        .page-image {
            flex: 1;
            min-width: 300px;
            border-radius: 12px;
            overflow: hidden;
            box-shadow: 0 10px 30px rgba(0,0,0,0.3);
            border: 2px solid rgba(255,255,255,0.1);
            transition: all 0.3s ease;
        }

        .page-image:hover {
            transform: scale(1.02);
            box-shadow: 0 15px 40px rgba(76, 175, 80, 0.3);
        }

        .page-image img {
            width: 100%;
            height: auto;
            display: block;
        }

        .page-text {
            flex: 1;
            min-width: 300px;
        }

        .dialogue {
            margin: 15px 0;
            padding: 18px;
            border-radius: 12px;
            border-left: 4px solid;
            background: rgba(255,255,255,0.03);
        }

        /* 卡卡西 - 银灰色系 */
        .kakashi {
            border-left-color: #78909C;
            background: rgba(120, 144, 156, 0.08);
        }

        /* 鸣人 - 橙色系 */
        .naruto {
            border-left-color: #FF9800;
            background: rgba(255, 152, 0, 0.08);
        }

        /* 码叔 - 绿色系 */
        .mashu {
            border-left-color: #4CAF50;
            background: rgba(76, 175, 80, 0.08);
        }

        /* 小新 - 橙色系 */
        .xiaoxin {
            border-left-color: #FF9800;
            background: rgba(255, 152, 0, 0.08);
        }

        .character-name {
            font-weight: bold;
            margin-bottom: 10px;
            font-size: 1.1em;
            display: flex;
            align-items: center;
            gap: 8px;
        }

        .kakashi .character-name { color: #78909C; }
        .naruto .character-name { color: #FF9800; }
        .mashu .character-name { color: #4CAF50; }
        .xiaoxin .character-name { color: #FF9800; }

        .dialogue-content {
            color: #ddd;
            line-height: 1.7;
        }

        .tech-point {
            background: rgba(33, 150, 243, 0.1);
            border: 1px solid rgba(33, 150, 243, 0.3);
            padding: 20px;
            border-radius: 12px;
            margin-top: 20px;
        }

        .tech-point h4 {
            color: #2196F3;
            margin-bottom: 12px;
            font-size: 1.1em;
            display: flex;
            align-items: center;
            gap: 10px;
        }

        .tech-point h4::before {
            content: "💡";
        }

        .tech-point p {
            color: #bbb;
            line-height: 1.7;
        }

        .tech-point code {
            background: rgba(0,0,0,0.3);
            padding: 3px 8px;
            border-radius: 4px;
            font-family: 'Consolas', 'Monaco', monospace;
            color: #4CAF50;
            font-size: 0.95em;
        }

        footer {
            text-align: center;
            margin-top: 50px;
            padding-top: 30px;
            border-top: 1px solid rgba(255,255,255,0.1);
            color: #666;
        }

        .footer-icons {
            display: flex;
            justify-content: center;
            gap: 15px;
            margin-bottom: 15px;
            font-size: 1.5em;
        }

        @media (max-width: 768px) {
            .page-content {
                flex-direction: column;
            }

            .page-image, .page-text {
                min-width: 100%;
            }

            h1 {
                font-size: 2em;
            }

            .page-title {
                font-size: 1.3em;
            }

            .meta-info {
                flex-direction: column;
                align-items: center;
            }
        }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>{{TITLE}}</h1>
            <p class="subtitle">码叔带你学技术</p>
            <div class="meta-info">
                <span class="badge complexity">复杂度:{{COMPLEXITY}}</span>
                <span class="badge">共 {{PAGE_COUNT}} 页</span>
                <span class="badge style">画风:{{STYLE}}</span>
            </div>
        </header>

        <div class="intro-box">
            <h3>📖 {{ANALOGY_TITLE}}</h3>
            <p>{{ANALOGY_DESC}}</p>
        </div>

        <!-- ===== 页面内容区域 ===== -->
        {{PAGES}}
        <!-- ===== 页面内容结束 ===== -->

        <footer>
            <div class="footer-icons">
                💻 🎨 📚 🚀 💡
            </div>
            <p>🎨 由技术漫画生成器创作 | 让技术学习更有趣!</p>
        </footer>
    </div>
</body>
</html>

```

### assets/page_template.html

```html
<!-- 单页模板,用于循环生成每一页 -->
<div class="page">
    <div class="page-header">
        <div class="page-number">{{PAGE_NUM}}</div>
        <div class="page-title">{{PAGE_TITLE}}</div>
    </div>
    <div class="page-content">
        <div class="page-image">
            <img src="{{IMAGE_FILE}}" alt="第{{PAGE_NUM}}页">
        </div>
        <div class="page-text">
            {{DIALOGUES}}
            <div class="tech-point">
                <h4>技术要点</h4>
                <p>{{TECH_POINT}}</p>
            </div>
        </div>
    </div>
</div>

```

### assets/dialogue_template.html

```html
<!-- 角色对话模板 -->
<!-- class 可选: mashu, xiaoxin -->
<div class="dialogue {{CLASS}}">
    <div class="character-name">{{EMOJI}} {{NAME}}</div>
    <div class="dialogue-content">{{CONTENT}}</div>
</div>

```

tech-manga-explainer | SkillHub