# Ljg Present

> 演讲铸造器（Outline-Faithful）。基于 orgmode/markdown outline 层级 1:1 视觉化呈现——色块大字、ultra-bold 错位，原文不动只做美化。三档主题色 black/red/yellow（默认 black 或按 filetags 推断），可用 -r/-b/-y 显式覆盖；可用 --cyber 走黑底绿字 cyber-hacker 风。使用时用户会说：'讲这个'、'present'、'做成演讲'、'呈现一下'、'铸成演示'、'做个 slides'、'标语流'、'宣言体'、'slogan'、'manifesto'、'按 outline 美化'。输出单文件 HTML 到 ~/Downloads/。

- Skill: `azhi-ss/ljg-present` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add azhi-ss/ljg-present`
- Raw SKILL.md: https://api.skillmd.com/api/skills/azhi-ss/ljg-present/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: azhi-ss (https://skillmd.com/u/azhi-ss)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/azhi-ss/ljg-present

---


# ljg-present: 演讲铸造器

把 outline 铸成色块——视觉化渲染器，把舞台还给讲的人。

## 这不是什么

- **不是 manifesto 提炼器**——不抽"那句话"，不写"完整断言句"，不重组顺序
- **不是高桥流**——不削词到单字
- **不是 deck-style**——不是企业 PPT 那种规整版式

## 这是什么

**Outline → 视觉化渲染器**：

- 输入 = orgmode 文件（`*` `**` 层级 + 列表 + 表格 + 强调）
- 输出 = 视觉美化的 slogan-style HTML，**1:1 保留 outline 结构**
- 不抽提、不重写、不浓缩——只决定**怎么把这一行/这一节渲染为页面**

视觉语言（参考审美：Felipe Franco / BIG STUDIOS 的 manifesto 美学）：
- **整篇一个主题色**——red/black/yellow 三选一
- **left-aligned 舞台美学**——文字左对齐，超大字号自然撑屏
- **超大字 ultra-bold**——单字 70vmin、长句 11vmin
- **多行错位**——按 outline 嵌套深度自动 indent 0/1/2
- **关键词自动换色**——`*强调*` `~code~` 自动 hl
- **章节切换打节拍**——一级标题 `*` → emphasis 封面页，其余 → theme 页

## 核心哲学

**Outline 是真理。Skill 是渲染器。**

不动内容是一条铁律：
- **标题不改字**
- **段落不改字**
- **列表项不改字**
- **表格不改结构**
- **顺序不重排**

唯一允许的"动"是：**物理分页**（一段太长拆成多页），并保持视觉一致性。

## Orgmode → 页面映射规则

### 标题层级

| Org 元素 | 页面 |
|---|---|
| `* 一级标题` | 独占 **emphasis** 封面页（accent 底色） |
| `** 二级标题` | 独占 **theme** 页（大字标题独占一页） |
| `*** 三级标题`+ | 独占 theme 页（字号降一档） |

### 内容元素

| Org 元素 | 页面行为 |
|---|---|
| 段落 | theme 页，按句号/换行/字数分页 |
| `- 列表项` | theme 页，每项一行，indent 按嵌套深度（0/1/2） |
| `1. 编号列表` | 同上，保留序号前缀 |
| 嵌套列表 | 子项 indent +1（最多 indent=2） |
| `\| 表格 \|` | 单页或多页，保留表格结构（首行加粗） |
| `*强调*` | 自动 `hl: true` |
| `~code~` 或 `=verbatim=` | 自动 `hl: true` |
| `「」` 内的关键词 | 视觉单元（保留括号，不强制 hl） |
| 引用 `> ...` | theme 页，indent 1 显示 |
| 分隔符 `-----` | 独立 emphasis 休止页（无内容，纯色块） |
| `#+begin_example` 块 | 独立 pre 页（monospace 渲染 ASCII art） |

### 文件级元数据

| Org 元素 | 用途 |
|---|---|
| `#+title:` | → JSON `title`（浏览器 tab） |
| `#+author:` 或 `#+date:` | → JSON `subtitle`（页脚右下） |
| `#+filetags:` | 用于推断 theme（见下） |
| `#+identifier:` | 忽略 |

### Theme 推断

**优先级**：显式参数 > filetags 推断 > 默认 black

显式覆盖（参数）：
- `-r` / `--theme=red` → red
- `-b` / `--theme=black` → black
- `-y` / `--theme=yellow` → yellow
- `--cyber` → cyber-hacker（黑底绿字 + CRT 扫描线 + HUD + 终端光标）

filetags 自动推断：

| filetags 含 | theme | 调性 |
|---|---|---|
| `:share:` `:talk:` `:manifesto:` `:keynote:` | `red` | 宣言、号召 |
| `:essay:` `:think:` `:learn:` `:note:` | `black` | 沉思、论证 |
| `:critique:` `:warn:` `:rant:` | `yellow` | 反讽、警觉 |
| 都没有 | `black` | 默认沉思调 |

### 分页规则（内容多时）

**铁律：拆分后保持视觉一致性。同一逻辑块的页用同样的字号档位/底色/缩进规则。**

| 情形 | 拆法 |
|---|---|
| 段落 ≤ 30 字 | 单页 |
| 段落 30-80 字，含多句号 | 每句一页（每页 medium 档字号） |
| 段落 > 80 字 | 按 ~30 字一页拆，加 `⋯` 续标 |
| 列表 ≤ 4 项 | 单页全部展示（错位 indent） |
| 列表 5-8 项 | 拆 2 页，每页 3-4 项（保持每页项数接近） |
| 列表 > 8 项 | 拆多页，每页 4 项 |
| 嵌套列表（如 4 革命×4 属性）| 父项 1 页 + 每个子项独立成组（标题 1 页 + 子项 1 页） |
| 表格 ≤ 6 行 | 单页 |
| 表格 > 6 行 | 拆多页，每页保留表头 |

**一致性检查**：拆完后扫一遍——同源拆分的页要长得像同一种东西，字号/缩进/底色都对齐。

### 自动 emphasis（节拍）

- 所有 `* 一级标题` → emphasis 封面页
- 文件首页（标题或第一行非空文本）→ emphasis 开场页（如已是一级标题则合并）
- 文件末页（最后一段或最后一项）→ emphasis 收束页
- `-----` 分隔符 → emphasis 休止页
- 其他全是 theme 页

不要为了凑节奏强行加 emphasis——一级标题就是天然的章节断点。

### 自动 hl（高亮）

- org `*强调*` → `hl: true`
- org `~code~` `=verbatim=` → `hl: true`
- emphasis 页内的 hl 自动忽略（CSS `color: inherit`）

## 映射举例

**输入**（org 节选）：

```org
#+title: 美团分享
#+filetags: :share:

* AI

** 为什么说 AI 是一次革命？

人类革命：能力让渡的层级跃迁

- 「人之为人」重新定义
- 社会组织重排
```

**映射结果**：

| # | 类型 | 内容 | 来源 |
|---|---|---|---|
| 1 | emphasis | 「AI」 | `* AI`（一级标题封面） |
| 2 | theme | 「为什么说 AI 是一次革命？」 | `** ...` 二级标题独占页 |
| 3 | theme | 「人类革命：能力让渡的层级跃迁」 | 段落，单句 |
| 4 | theme | 两行错位：「『人之为人』重新定义」/「社会组织重排」 | 列表 ≤4 项一页 |

theme 自动选 `red`（filetags `:share:`），title=`美团分享`。

## 视觉规范

### 色板（仅 4 色）

```
--c-black:  #1A1A1A
--c-red:    #E63956
--c-yellow: #FFD400
--c-white:  #FFFFFF
--c-gold:   #FFE082
```

### 主题映射（一篇只用 ≤3 色）

| theme | 默认页 | emphasis 页 | hl 色（仅 theme 页） |
|---|---|---|---|
| **black** 沉思 | 黑底白字 | 红底白字 | 红色 #E63956 |
| **red** 宣言 | 红底白字 | 黑底白字 | 柔金黄 #FFE082 |
| **yellow** 反讽 | 黄底黑字 | 黑底白字 | 红色 #E63956 |
| **cyber** 终端 | 黑底矩阵绿 | 绿底黑字 | 白色 #FFFFFF（带绿光 + CRT 扫描线 + 顶部 HUD） |

### 字体栈

```
"Helvetica Neue", "Arial Black", "Inter", "PingFang SC", "Heiti SC", -apple-system, sans-serif
font-weight: 900
letter-spacing: -0.05em
```

cyber 主题额外字体（用于 HUD/footer/pre）：

```
"JetBrains Mono", "Fira Code", "IBM Plex Mono", "Source Code Pro", "Menlo", monospace
```

### 字号自适应

按本页"最长那一行"的字符数（CJK 字符按 1.8 计权）自动分档：

| 档位 | 字符数 | 字号 |
|---|---|---|
| single | ≤ 2  | 70vmin |
| short  | 3-6 | 48vmin |
| medium | 7-14 | 28vmin |
| long   | 15-26 | 16vmin |
| xlong  | 27+ | 10vmin |

多行页自动降一档。

### 排版

- 内容区域 padding 6vmin 7vmin（贴近边缘，让大字有撑满感）
- **lines 块水平居中 + 行内左对齐**——`align-items: center` 让 lines 块整体在屏幕水平居中（消除 16:9 右侧空白），但每一行的文字仍是 left-aligned 起始，indent 0/1/2 在块内制造错位
- letter-spacing `-0.05em`——ultra-bold 应有的字字挤压感
- line-height `1.05`、行间 gap `0.15em`——多行折行也有呼吸空间
- 文字垂直方向：居中
- 页脚：左下页码 + 右下副标题，13px monospace，opacity 0.5

## JSON Schema

```jsonc
{
  "theme": "black|red|yellow|cyber",      // 主题色（必选，决定整篇调性）
  "title": "演讲标题（浏览器 tab）",
  "subtitle": "副标题/品牌（页脚右下，可选）",
  "slides": [
    // 默认 theme 页
    {
      "lines": [                          // 1-N 行
        {
          "indent": 0,                    // 0/1/2 缩进档（按 outline 嵌套深度）
          "align": "left|center|right",   // 可选，默认 left
          "chunks": [                     // 行内片段
            {"t": "句子前段"},
            {"t": "高亮词", "hl": true},  // 仅 theme 页生效
            {"t": "句子后段"}
          ]
        }
      ]
    },
    // emphasis 页（accent 底色，整页就是高亮，不允许 inline hl）
    { "emphasis": true, "lines": [...] },
    // pre 页（ASCII art / 预格式化块）
    { "preTitle": "diagram_name", "pre": "...preformatted text..." }
  ]
}
```

**字段省略约定**：
- 不写 `emphasis` = 默认 theme 页
- emphasis 页内 `chunks[].hl: true` 会被忽略
- 写 `pre` 字段则该页为 ASCII art 页（monospace 渲染）

## 调用流程

1. **获取内容**（文件 → Read / 粘贴 → 直接用 / URL → WebFetch）
2. **解析 outline**：
   - org：识别 `*` `**` 标题层级、`-` `1.` 列表、`|...|` 表格、`*强调*` / `~code~`、`#+begin_example` 块
   - markdown（兼容）：`#` `##` 标题、`-` `*` 列表、`|` 表格、`**强调**`、` ``` ` 代码块
   - 纯文本（fallback）：按空行分段，每段一页
3. **推断 theme**：显式参数 > `#+filetags:` > 默认 black
4. **应用映射规则**生成 slides 数组：
   - `*` 标题 → emphasis 封面
   - `**`+ 标题 → theme 独占页
   - 段落 → theme 页（按分页规则）
   - 列表 → theme 页（错位 indent + 分页规则）
   - 表格 → theme 页（保留结构 + 分页规则）
   - 强调 → 自动 hl
   - example 块 → 独立 pre 页
5. **Read** `assets/slogan_template.html`（cyber 主题需在模板基础上注入扫描线/HUD/光标 CSS）
6. **替换占位符**：
   - `{{TITLE}}` → 文件 `#+title:` 或显式参数
   - `{{SUBTITLE}}` → `#+author:` `#+date:` 拼接，或留空
   - `{{THEME}}` → 推断或显式参数（black|red|yellow|cyber）
   - `{{SLIDES_JSON}}` → JSON.stringify(slides)
7. **写文件**到 `~/Downloads/{name}.html`（`{name}` 取自 `#+title:` 或文件名，去标点，≤ 20 字）
8. **报告路径** + 翻页键 `→ ← Space F Home End`

## 品味准则

- **outline 是真理**——不动字、不抽提、不重写、不重排
- **一级标题 = emphasis 封面**——天然的章节断点，自动节拍
- **二级标题 = 独占 theme 页**——给标题应有的重量
- **列表错位**——靠 indent 0/1/2 体现 outline 嵌套深度
- **`*强调*` 自动 hl**——尊重作者的标记意图
- **拆页保持一致**——同一逻辑块的视觉处理一致（字号档位/缩进/底色）
- **页脚保留**——页码 + 副标题不要删，那是品牌的冷气
- **左对齐不居中**——VACAT 美学的灵魂

## 禁区

- **不抽 manifesto**——不要"找钉子"，作者已经写好了 outline
- **不写新句子**——不要"完整断言句"重组
- **不重排顺序**——按 outline 顺序输出，作者怎么排就怎么呈现
- **不删内容**——所有列表项/段落都要呈现，不挑挑拣拣
- **不放图片/图标**——色块就是图（cyber 主题的 HUD/扫描线除外，那是主题的一部分）
- **不用过渡动画**——硬切
- **不在 emphasis 页用 inline hl**——emphasis 整页就是高亮，再 hl 就乱了
- **不混用多个 theme**——一篇一个气质，不切换
- **不要副标题字过大**——页脚 13px，气场不能抢主标
- **不擅自加 emphasis**——只有一级标题、首末页、`-----` 是 emphasis，别的不要

## 中文默认

默认输出中文。除非原文是英文且用户要求保留英文。

## 通用交互

- `→` `Space` `Enter` `j` `PageDown`：下一页（含蓝牙翻页笔）
- `←` `k` `PageUp`：上一页（含蓝牙翻页笔）
- `Home`/`End`：跳首末
- `f`/`F`：全屏切换
- 触屏左右滑：翻页
- 点击右半屏：下一页；点击左半屏：上一页

