Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when generating multi-page HTML market research reports with main page + N disease sub-pages structure (e.g. hematology IFI, respiratory ICU fungal, oncology immunotherapy). Provides shared CSS design system, sticky topnav, hero gradients per market tier, disease-card grid, lp-callout boxes, cross-page link integrity, and (v1.2 · 2026-04-25) standalone single-file HTML-only 交付 pipeline (build_standalone.py base64 内嵌, v1.2 PDF 已停用, 仅交付 HTML 单文件即终态交付物). Triggers on "生成 HTML 报告主页+子页", "市场调研 HTM
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-06 | ✗→✓ | ▲ Improved | 926% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 293% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 324% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 352% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 285% | 0% |
> L2 工具组件:本 skill 提供"主页 + N 子页"HTML 报告的模板库 + CSS 设计系统。 > 设计目标:让任何疾病市场调研直接套用,得到一致美观、链接完整、tier 区分清晰的多页 HTML 报告。 > 上游依赖:market-sizing-mece-foundation (L0 §11 视觉规范) + ifi-market-sizing-skill (L1 §5.3 完整性清单)
主页(总览 + 跳转网格)+ N 子页(疾病独立深挖) 双重导航 HTML 模板,统一 CSS 设计系统(navy/blue/gold/red),tier-tag 视觉分级(⭐⭐⭐ 金 / ⭐⭐ 橙 / ⭐ 蓝),sticky topnav,disease-card grid,lp-callout 八色 box 系统。
调用时机:
不调用的场景:
output/
├── report_v??.html # 主页(总览 + N disease-card 跳转)
├── page_<sub1>.html # 子页 1(独立疾病决策树+测算+TOP 3 LP+证据)
├── page_<sub2>.html # 子页 2
├── ...
├── flowchart_main_v??.png # 主图(疾病分流总览,主页 §3 嵌入)
├── flowchart_lp.png # LP 全景决策图(主页 §7.0 嵌入 · Iron Law)
├── flowchart_<sub1>_v??.png # 子页 1 决策树
├── flowchart_<sub2>_v??.png # 子页 2 决策树
└── flowchart_<sub*>_v??.mmd # 决策树源码(配套 L2 skill `decision-tree-with-lp-embedding`)css:root{ /* 配色 (MRR 对齐 + 红/金 强调色) */ --navy:#003366; --blue:#336699; --accent-blue:#0078D7; --red:#C62828; --red-bg:#FFEBEE; --green:#008060; --green-bg:#C8E6C9; --purple:#6A1B9A; --purple-bg:#F3E5F5; --gold:#F59E0B; --gold-dark:#78350F; --orange:#CA6F1E; --orange-light:#FFEEDA; --gray-100:#f3f4f6; --gray-200:#e5e7eb; --gray-300:#d1d5db; --gray-500:#6b7280; --gray-700:#374151; --gray-900:#1f2937; /* 字体 */ --font-sans:'Source Han Sans CN','PingFang SC','Microsoft YaHei',sans-serif; } *{box-sizing:border-box}html{scroll-behavior:smooth} body{font-family:var(--font-sans);color:var(--gray-900);line-height:1.65;margin:0;padding:0;font-size:11pt;background:#fff;font-feature-settings:"tnum" 1} @page{size:A4;margin:2.2cm 2cm} h1{color:var(--navy);font-size:22pt;margin:22pt 0 10pt;padding-bottom:6pt;border-bottom:2.5pt solid var(--navy);font-weight:700;scroll-margin-top:80px} h2{color:var(--navy);font-size:15pt;margin:16pt 0 9pt;padding-left:10pt;border-left:4pt solid var(--blue);font-weight:700;scroll-margin-top:80px} h3{color:var(--blue);font-size:12pt;margin:11pt 0 6pt;font-weight:600} p{margin:6pt 0}ul,ol{margin:6pt 0;padding-left:22pt}li{margin:3pt 0}
css/* ⭐⭐⭐ 顶级(金色 — Crown Tier) */ .hero.t3{background:linear-gradient(135deg,var(--gold) 0%,var(--gold-dark) 100%)} /* ⭐⭐ 中等(橙色) */ .hero.t2{background:linear-gradient(135deg,var(--orange) 0%,#7C3F00 100%)} /* ⭐ 低(海军蓝) */ .hero.t1{background:linear-gradient(135deg,var(--blue) 0%,var(--navy) 100%)}
| 组件 | 用途 | 关键 CSS | |------|------|---------| | .hero | 子页 / 主页头部渐变 | padding 28px 32px, color #fff, position relative | | .hero .back | 子页返回主页 | position absolute top 14px right 32px, rgba(255,255,255,0.2) | | .hero .tier-tag | tier 徽章 | background #fff, color tier 主色, padding 2pt 10pt, border-radius 10pt | | .topnav | 章节快速跳转 | sticky top:0, z-index 50, display flex, gap 8px | | .disease-card | 主页跳转网格(子页入口) | padding 16pt 18pt, border-left 5pt solid tier 主色 | | .lp-callout | LP 高亮区块 | display flex, align-items flex-start, padding 12pt 16pt | | .lp-crown | Crown LP | background #FEF3C7, border 3pt solid var(--gold) | | .lp-standard | Standard LP | background #FEE2E2, border 2pt solid #DC2626 | | .callout | 蓝色信息框 | border-left 4pt solid var(--accent-blue), background #E6F1FB | | .warning | 红色警告框 | border-left 4pt solid var(--red), background var(--red-bg) | | .datahint | 绿色数据洞察 | border-left 4pt solid var(--green), background var(--green-bg) | | .recommendation | 紫色建议框 | border-left 4pt solid var(--purple), background var(--purple-bg) | | table.ds | 数据表 | border-collapse, font-size 10pt, font-variant-numeric tabular-nums | | .figure | 图片嵌入 | text-align center, page-break-inside avoid | | .anchor-badge | PMID 文献徽章 | inline-block, font-size 9pt, background #e0f2fe, color #0369a1 |
[hero · 顶部 navy 背景]
- 标题 + 立场 + 版本日期 + 署名
- 分母总市场 + 数据基准
[topnav sticky]
- 8-12 个章节锚点
[main]
① 执行摘要(8-12 条结论)
② 研究方法概要
③ 主图 flowchart_main_v??.png(完整渲染嵌入)
④ N 张 disease-card 跳转网格(子页入口)
- 每张 disease-card 含: tier-tag, 疾病名, market 占比, 链接
⑤ 市场规模(总览表 + TAM/SAM/SOM)
⑥ 结论与策略
⑦ LP 决策图
- §7.0 LP 全景决策图 PNG 嵌入(Iron Law · 失败模式 #28)
- §7.1 8 LP 总览(lp-callout × 8)
- §7.2 LP 排序表
- §7.3 LP 量化方法
附录 A:研究方法论
附录 B:子页索引(再次列表所有子页 + PNG)
附录 C:参考文献
[footer]
- 子页快速跳转链(N 个)
- 署名[hero · tier 渐变 (t1/t2/t3)]
- back 链(返回主页)
- tier-tag(⭐⭐⭐ 顶级 / ⭐⭐ 中 / ⭐ 低)
- 疾病名 + market 总额 + 占比
- 双分支结构提示(预防 X% / 非预防 X%)
[topnav sticky]
- 主页 / ①决策树 / ②测算 / ③TOP 3 LP / ④证据
[main]
① 决策树 PNG 嵌入(flowchart_<sub>_v??.png)
· 含本 skill `decision-tree-with-lp-embedding` 的 LP 节点级标注
② 测算依据
- 表 1 双分支患者流量
- 表 2 阶段 × 主药构成
- datahint 核心洞察
③ TOP 3 LP(lp-callout × 3)
- 1 个 lp-crown(本子页 Crown)
- 2 个 lp-standard
- recommendation 区块解释 LP 选择逻辑 + 链回主页 §7
④ 关键证据 PMID 表(≥4 行)
[footer]
- 返回主页链
- 署名flowchart_main_v??.png(主图)flowchart_lp.png LP 全景决策图(Iron Law · L1 失败模式 #28 历史复现)flowchart_<sub>_v??.png| 模板部分 | 移植方式 | |---------|---------| | CSS :root 变量 | ✅ 直接复用 | | .hero / .topnav / .disease-card / .lp-callout | ✅ 直接复用 | | Tier 渐变(t1/t2/t3) | ✅ 直接复用 — Crown/中/低 视觉规范一致 | | 主页 7 章 + 3 附录骨架 | ✅ 直接复用 — 改章节内容 | | 子页 4 节(决策树+测算+TOP 3 LP+证据) | ✅ 直接复用 | | 子页文件名 | 🟡 改名 — 例 page_RICU_CAPA.html / page_PCCM_CPA.html | | 主图文件名 | 🟡 改名 — 例 flowchart_main_resp_v??.png | | LP 全景图文件名 | ✅ 保持 flowchart_lp.png | | 配色三档(t3 金/t2 橙/t1 蓝) | ✅ 直接复用 |
| # | 失败模式 | 根因 | 修复 | |---|--------|------|-----| | 1 | 主页缺 LP 决策图 PNG | skill 无强约束清单 | 本 skill Iron Law §7.0 | | 2 | 子页 hero 全部用同色 | 无 tier 视觉分级 | 强制 t1/t2/t3 三档渐变 | | 3 | 子页缺 sticky topnav | 长子页用户找不到锚 | 强制 4 锚点 sticky topnav | | 4 | disease-card 缺 tier-tag | 主页跳转视觉无层级 | 强制 tier-tag + 颜色对应 hero 渐变 | | 5 | lp-callout 全部红色 | Crown 与普通无区分 | 强制 1 个 lp-crown(金)+ 其他 lp-standard(红) | | 6 | 子页 footer 缺返回主页链 | 用户卡死子页 | 强制 footer back 链 | | 7 | 跨页面 CSS 不一致 | 子页独立写 CSS | 强制全部页用同一套 :root 变量 | | 8 | LP 排序表用普通 td 不分级 | 视觉重点缺失 | Crown LP 用 background:#FEF3C7;font-weight:600 | | 9 | 缺 footer 子页快速跳转 | 主页用户在 §7 后无法直接进子页 | 强制 footer 含全部 N 个子页链 | | 10 | 跨文件交付的链接断裂 | HTML/PNG 跨文件相对路径,收件人解压时漏文件 / 路径不对 / 无 AI 软件无法浏览 | Iron Law(阶段 6):必须用 build_standalone.py 合并成单文件 HTML 交付,禁止直接交付 7 HTML + 8 PNG 散文件(v1.2:PDF 已停用,单 HTML 即终态)| | 11 | PDF 决策树压缩失真 / 重复劳动 | Chrome headless PDF 把 base64 PNG 二次压缩,且 PDF 与单 HTML 内容完全冗余,维护成本翻倍 | v1.2 决策(2026-04-25):PDF 不再交付。单 HTML(零依赖+决策树原画质+锚点跳转)即终态交付物,涵盖屏幕浏览、邮件附件、即时通讯、网盘分享所有场景 |
> 场景定义:多页 HTML 报告完成后,需要交付给最终读者(同事 / 客户 / 高管)的"零依赖"形态。 > v2.5.3 实战经验:用户电脑可能没有任何 AI 软件,要"双击就能读 / 邮件附件直接发 / 网盘/即时通讯一键分享"。 > > ⚠️ v1.2 重大决策(2026-04-25 用户最终明确):以后交付全部交付 HTML,不再交付 PDF。 > 单 HTML 已是终态交付物 — 决策树原画质 base64、锚点跳转、零依赖、双击可读、邮件附件可发,完全覆盖 PDF 所有场景。PDF 反而引入二次压缩失真、内容冗余、维护翻倍问题。 > 如读者明确要打印,可在浏览器中 Ctrl+P 自行另存为 PDF — 生成方不再主动产出 PDF。
用户出现以下任一意图,立即进入阶段 6:
| 交付物形态 | 文件 | 大小 | 用户体验 | 推荐 | |----------|------|------|---------|------| | 单 HTML(base64 内嵌) | report_v??_standalone.html | ~9 MB | 双击浏览器打开 · 锚点跳转 · 零依赖 · 决策树原画质 | ✅ 唯一交付物 | | ~~配套 PDF~~ | ~~report_v??_standalone.pdf~~ | — | — | ❌ v1.2 停止交付(失败模式 #11)| | ZIP 打包(原生 7 HTML + 8 PNG) | report.zip | ~10 MB | 解压后打开主页 · 跨文件链接易断 | ❌ 不推荐(失败模式 #10) |
为什么单 HTML 即终态:
python# 正则匹配 <img src="*.png">,替换为 data: URI data_uri = f"data:image/png;base64,{base64.b64encode(png_bytes).decode('ascii')}"
href="page_<key>.html" → href="#page-<key>"href="page_<key>.html#decision" → href="#page-<key>"(子页 hash 重写时同步处理)href="report_v??.html" → href="#top"href="report_v??.html#§N" → href="#§N"href="#decision|calc|lp|evidence" → href="#page-<key>-decision"(防止多子页锚点冲突)html<section class="standalone-subpage" id="page-<key>"> <div class="standalone-divider"> <span class="standalone-divider-label">子页 · <key></span> <a href="#top" class="standalone-back">↑ 回到主页顶部</a> </div> <!-- 原子页 body 内容 --> </section>
html<a id="top"></a> <!-- 锚点 --> <div class="standalone-banner"> <!-- 横幅说明 --> <strong>📦 单一独立 HTML 版</strong> · 已合并主页 + 全部 N 个子页 + 全部 M 张 PNG · 零外部依赖 · 双击浏览器即可阅读 </div>
每个子页 section 内置"↑ 回到主页顶部"返回链。
> Iron Law:单文件 HTML 必须含全量悬浮 TOC(主页 + 全部 N 子页所有 h1/h2),不只是主页章节。
用户体验目标:
HTML 结构:
html<button id="ftoc-button" type="button" aria-label="打开目录导航"> <svg viewBox="0 0 24 24">...</svg> </button> <div id="ftoc-overlay" hidden> <aside id="ftoc-panel" role="dialog"> <header class="ftoc-header"> <span class="ftoc-title">目录导航</span> <button id="ftoc-close">收起</button> </header> <div class="ftoc-body"> <div class="floating-toc-section"> <div class="floating-toc-section-title">📋 主报告</div> <ul> <li class="ftoc-l1"><a href="#ch1" data-ftoc-link>一、执行摘要</a></li> <li class="ftoc-l2"><a href="#ch1-1" data-ftoc-link>1.1 ...</a></li> ... </ul> </div> <div class="floating-toc-section"> <div class="floating-toc-section-title"> 📑 子页 · <a href="#page-{key}" data-ftoc-link>{key}</a> </div> <ul>...</ul> </div> ... (N 子页) </div> </aside> </div>
CSS 关键规则:
#ftoc-button { position: fixed; top: 18px; right: 22px; z-index: 9998; }#ftoc-overlay { position: fixed; inset: 0; z-index: 9999; backdrop-filter: blur(2px); }#ftoc-panel { width: min(420px, calc(100vw - 28px)); max-height: calc(100vh - 28px); }body.ftoc-open { overflow: hidden; }(打开时锁定背景滚动)@media print { #ftoc-button, #ftoc-overlay { display: none !important; } }JS 行为(vanilla,零依赖):
#ftoc-overlay(但非 #ftoc-panel 子元素)→ 关闭Esc 键 → 关闭[data-ftoc-link] → 50ms 后自动关闭(让锚点跳转先生效)T 键(键焦点在 body)→ 快速打开自动构建:
build_standalone.py 中的 extract_headings(html, prefix_id) + build_floating_toc(main_html, sub_pages) 自动从合并后的 HTML 提取所有 <h1 id> / <h2 id> / <h3 id> 并构建树prefix_id="page-{key}-" 自动加前缀,不会与主页冲突Iron Law(v1.3.1 修复 · 2026-04-25 用户反馈):
page-* 前缀 anchor:extract_headings(main_html) 在合并后的 HTML 上调用会同时抓到主页和已合并的子页 h1/h2(id 已带 page-{key}- 前缀)→ 必须 if anchor.startswith("page-"): continue 过滤,否则主报告分组会出现 N 套重复且无归属(图中症状:连续 6 套"双分支决策树/Market 测算/TOP 3 LP/关键证据"无子页归属)backdrop-filter: blur(2px) 会让浏览器对整个 viewport 强制重排重绘 → 鼠标延迟高、卡顿。改用 background: rgba(15,23,42,0.35) 半透明纯遮罩(GPU 友好)@keyframes 而非 transition:opacity transition 130ms · panel 用 animation: ftoc-pop 0.14s ease-out,加 will-change: opacity/transform 提示合成层requestAnimationFrame 而非 setTimeout(10):确保 hidden 切换后下一帧才加 .show class(避免动画跳过)血液科 v2.5.3 实测:92 个目录条目自动提取(主页 30+ + 6 子页各 ~10),HTML 体积 +0.02 MB(可忽略)。
css.standalone-subpage .topnav { display: none !important; } .standalone-subpage { margin-top: 60pt; padding-top: 30pt; border-top: 4pt double var(--navy); page-break-before: always; } .standalone-divider { display: flex; justify-content: space-between; background: linear-gradient(90deg, var(--navy) 0%, var(--blue) 100%); color: #fff; padding: 12pt 18pt; border-radius: 6pt; }
原因:合并后所有锚点都在同一文档,子页 topnav 失去意义且会污染滚动。
完整参考实现:<output_dir>/build_standalone.py(血液科 v2.5.3 验证可用)
pythonfrom pathlib import Path import base64, re from dataclasses import dataclass # ===== 配置常量(跨疾病移植仅改这里)===== OUT = Path(__file__).parent MAIN_HTML = OUT / "report_v??.html" SUB_PAGES: list[tuple[str, Path]] = [ ("<key1>", OUT / "page_<key1>.html"), ("<key2>", OUT / "page_<key2>.html"), # ... N 个子页 ] OUTPUT_HTML = OUT / "report_v??_standalone.html" @dataclass(frozen=True) class SubPage: key: str; title: str; body_html: str; head_style: str # ===== 核心五函数 ===== def extract_subpage(path, key) -> SubPage: ... # 提取子页 body + 重写主页链接 def png_to_base64(path) -> str: ... # PNG → data: URI def inline_all_png(html, base_dir): ... # 批量替换 <img src="*.png"> def rewrite_subpage_links(html) -> str: ... # 主页 page_*.html → #page-* def build_section_for_subpage(sub) -> str: ... # 子页 body → <section> def merge(): # 1) 读主页 + N 子页 # 2) 注入 extra CSS(.standalone-* 系列) # 3) 重写主页跨文件链接 # 4) <body> 后注入 <a id="top"> + banner # 5) </main> 前插入 N 个子页 section # 6) inline_all_png 全文 PNG 内嵌 # 7) 写出 + 验证
> ❌ 本节已停用:用户最终明确"以后交付全部交付 HTML,不再交付 PDF"。 > 单 HTML 是终态交付物 — 决策树原画质 base64 内嵌、锚点跳转、零依赖,完全覆盖 PDF 所有场景。 > 读者若需打印,在浏览器中按 Ctrl+P 自行另存为 PDF — 生成方不再主动产出 PDF。 > Chrome headless / playwright 命令仅作历史归档保留(失败模式 #11)。
data:image/png;base64,... 内嵌(grep 计数)| 配置项 | 改动 | 示例(呼吸科 ICU 真菌) | |-------|------|----------------------| | MAIN_HTML | 🟡 改 | report_resp_v??.html | | SUB_PAGES | 🟡 改 | [("RICU_CAPA", ...), ("PCCM_CPA", ...), ...] | | OUTPUT_HTML | 🟡 改 | report_resp_v??_standalone.html | | extract_subpage() 中主页文件名正则 | 🟡 改 | r'href="report_resp_v??\.html"' | | 五个核心函数(extract / inline / rewrite / build / merge)| ✅ 直接复用 | — | | extra CSS(.standalone- 系列)| ✅ 直接复用 | — | | banner 文案 | 🟡 改版本号即可 | — | | ~~Chrome headless PDF 命令~~ | ❌ v1.2 已停用 | 不再交付 PDF |
报告交付前必须生成单文件 HTML 版本(v1.2 更新 · 仅 HTML 交付):
build_standalone.py 合并成单一 HTML(零外部依赖)build_standalone.py 新增 extract_headings() + build_floating_toc() 自动构建,血液科 v2.5.3 实测 92 条目自动提取。Other measured skills in the registry, with their headline benchmark lift.