$npx -y skills add QuZhan51496/paper2anything --skill paper2wechat把学术论文 PDF 转成微信公众号深度解读推文(长文 + 配图 + 封面)。你主导设计的协调式:机械活(MinerU 解析 PDF、生成封面、md2wechat 发布草稿箱)交给 scripts/ 下的小工具,论文理解、文章结构、长文撰写由你亲自完成并在关键点与用户确认。当用户说“论文转公众号”、“paper2wechat”、“把论文写成公众号文章”、“论文转微信推文”、“PDF 转公众号”时触发。
| 1 | # paper2wechat — 论文转公众号深度解读(你主导的协调式) |
| 2 | |
| 3 | 把一篇论文 PDF 写成**学术深度解读型**公众号长文。**你是主笔**:这份文件是配方, |
| 4 | 不是全自动脚本——没有 `main.py`。机械步骤(解析 / 封面 / 排版)调用 `scripts/` 下的小工具; |
| 5 | **论文理解、文章结构、长文撰写由你亲自完成**,并在关键点用 `AskUserQuestion` 与用户确认。 |
| 6 | |
| 7 | 目标读者:有 AI/ML 背景的研究者、工程师、学生——读得懂方法细节、关心贡献与局限。 |
| 8 | |
| 9 | ```text |
| 10 | |
| 11 | → 解析 (parse_pdf.py:MinerU → parsed/ + figures/,含表格) |
| 12 | → 你读懂论文 (读 parsed/ + 看 figures/) → understanding/paper_understanding.json [确认切入角度] |
| 13 | → 你写深度解读长文 (结构自由、配图、忠实准确) → wechat_article.md + .json [确认] |
| 14 | → 封面 (cover.py:默认 API 生图 gpt-image-2 横版 900×383;无 key/key 不可用回退本地合成复用原图) |
| 15 | → 发布草稿箱 (publish.py:md2wechat 直推公众号草稿箱;无凭据/失败→本地样式化 HTML) |
| 16 | → 公众号推文 |
| 17 | ``` |
| 18 | |
| 19 | ## 运行方式 |
| 20 | |
| 21 | 1. **一步步来**:机械步骤用 `Bash` 调脚本,创作步骤你自己用 `Read` / `Write` 做。 |
| 22 | 2. **每个 Bash 块开头就地算 `WORKDIR`**(各 Bash 调用是独立 shell、不共享变量): |
| 23 | ```bash |
| 24 | WORKDIR="$(dirname "$pdf_path")/.paper2anything/wechat/$(basename "${pdf_path%.*}")" |
| 25 | ``` |
| 26 | `$pdf_path` 是用户给的论文 PDF(每块重设一次)。脚本在 `${SKILL_DIR}/scripts`——`SKILL_DIR` |
| 27 | 是**本 skill 的目录**(见本 skill 顶部注入的 "Base directory for this skill: …");各 Bash 块独立 shell, |
| 28 | 用到它的块开头按需 `export SKILL_DIR=<那个目录>` 一次(和 `WORKDIR` 一样每块现设)。 |
| 29 | 3. **两个决策点用 `AskUserQuestion` 暂停**:① 读懂论文后确认“切入角度/深度/篇幅”;② 长文成稿后确认。 |
| 30 | 4. **深度解读 = 读懂后用自己的话讲清楚**:可以加直觉解释、类比、背景、应用与局限,让有背景的读者快速吃透这篇论文——但**忠实于论文、不夸大、不编造数据**。 |
| 31 | |
| 32 | --- |
| 33 | |
| 34 | ## Step 0:环境与凭据 |
| 35 | |
| 36 | > **统一环境**:所有 `python` 命令都在 paper2anything 的统一 conda 环境(顶层 `environment.yml`),以 `conda run -n paper2anything --no-capture-output` 为前缀。md2wechat 已含在该环境中。 |
| 37 | |
| 38 | 凭据集中在包根 `.env`(从 `.env.example` 复制,已 gitignore),每个新 shell 先导出一次: |
| 39 | |
| 40 | ```bash |
| 41 | set -a; source <paper2anything 包根>/.env; set +a |
| 42 | ``` |
| 43 | |
| 44 | 本 skill 用到的 key(**理解与撰文由你亲自做,不调用任何 LLM API**): |
| 45 | - `MINERU_API_TOKEN` — 解析 PDF(必填) |
| 46 | - `OPENAI_API_KEY`(+ `OPENAI_BASE_URL`) — 封面默认走它生图(gpt-image-2);无 key 或 key 不可用时回退本地合成(复用论文原图) |
| 47 | - `WECHAT_APPID` / `WECHAT_APP_SECRET` — 直推公众号草稿箱用(md2wechat 调官方 API;获取见「排错」);**留空则降级**为本地生成样式化 HTML 供手动粘贴 |
| 48 | - `MD2WECHAT_THEME` — 排版样式(默认 `default`→学术灰,另有 `tech`/`festival`/`announcement`) |
| 49 | |
| 50 | 依赖自检(缺啥按提示装;依赖统一在 `environment.yml`): |
| 51 | |
| 52 | ```bash |
| 53 | conda run -n paper2anything --no-capture-output python -c "import requests, rich, dotenv" 2>&1 |
| 54 | md2wechat --help >/dev/null 2>&1 && echo "md2wechat 就绪" || echo "md2wechat 未就绪(可后置;缺它 Step 5 会降级为本地样式化 HTML 供手动粘贴)" |
| 55 | ``` |
| 56 | |
| 57 | --- |
| 58 | |
| 59 | ## Step 1:解析 PDF(脚本) |
| 60 | |
| 61 | ```bash |
| 62 | pdf_path="/path/to/paper.pdf" # ← 用户的论文 PDF |
| 63 | WORKDIR="$(dirname "$pdf_path")/.paper2anything/wechat/$(basename "${pdf_path%.*}")" |
| 64 | conda run -n paper2anything --no-capture-output \ |
| 65 | python "${SKILL_DIR}/scripts/parse_pdf.py" "$pdf_path" --workdir "$WORKDIR" |
| 66 | ``` |
| 67 | |
| 68 | 产出(`$WORKDIR` 下):`parsed/paper_meta.json`、`parsed/sections.json`、`parsed/figures_index.json`、`parsed/tables_index.json`(`[{table_id, caption, html, image_path, page}]`)、`parsed/references.json`,以及 `figures/*`(含表格图)。 |
| 69 | |
| 70 | 解析完,`Read` `parsed/sections.json` 与 `parsed/paper_meta.json` 通读全文。 |
| 71 | |
| 72 | --- |
| 73 | |
| 74 | ## Step 2:读懂论文 → 写 understanding(你来做)[确认] |
| 75 | |
| 76 | 深度解读的地基,**你自己做判断**: |
| 77 | |
| 78 | 1. `Read` `parsed/sections.json`(全文)+ `paper_meta.json`;`Read` `figures_index.json` / `tables_index.json` 的图注表注(个别 caption 可能为空,以实际看图为准),并**实际 `Read` 关键图**(`figures/` 下)判断哪些值得内嵌、哪张适合做横版封面。 |
| 79 | 2. 用 `Write` 落 `understanding/paper_understanding.json`: |
| 80 | ```json |
| 81 | { |
| 82 | "paper_title": "...", "method_name": "方法简称", |
| 83 | "one_sentence_summary": "一句话讲清贡献", |
| 84 | "problem": "背景与要解决的问题", "method": "核心方法(技术要点,用文字不用公式)", |
| 85 | "method_intuition": "直觉性解释/类比,帮读者吃透", |
| 86 | "contributions": ["贡献1", "贡献2"], |
| 87 | "comparison": "与主要 baseline 的关键差异", |
| 88 | "experiment_results": ["关键数据(含具体数字)", "..."], |
| 89 | "limitations": "论文承认的局限或潜在不足", |
| 90 | "keywords": ["关键词", "..."], |
| 91 | "cover_palette": {"bg": "#F4F5F7", "accent": "#2E86AB"}, |
| 92 | "important_figures": [ |
| 93 | {"figure_id": "fig_1", "image_path": "<figures_index.json 里的真实路径>", |
| 94 | "suitable_for_cover": true, "importance_score": 0.9, |
| 95 | "wechat_caption": "图1:……(≤50字中文图注)", "description": "图说明"} |
| 96 | ] |
| 97 | } |
| 98 | ``` |
| 99 | - `important_figures` 必须含 `image_path`(取自 `figures_index.json`,真实存在)、`suitable_for_cover`、`importance_score`——封面默认走 API 生图(gpt-image-2),仅当 `OPENAI_API_KEY` 未配/不可用时回退本地合成、靠它选横版原图;漏了则回退时无图 → 封面 `skipped`。 |
| 100 | - `cover_palette`(可选):本地合成回退路径的配色,按论文领域选 `bg`(浅色打底) + `accent`(强调色),标题字色随底色深浅自动适配。参考浅色调:通用 `#F4F5F7`+`#2E86AB`、生物 `#EEF6F0`+`#2D8A5F`、物理数学 `#F1ECF8`+`#6A30C2`、工程 `#FBF0EC`+`#D85A3C`、社科 `#F4EEF2`+`#8A5A78`、化学 `#EAF4F8`+`#0E86C0`。 |
| 101 | 3. 用 `AskUserQuestion` 与用户确认**切入角度 / 深度 / 目标篇幅**(如:偏方法细节还是偏直觉科普、约 1500 还是 2500 字)。 |
| 102 | |
| 103 | --- |
| 104 | |
| 105 | ## Step 3:写深度解读长文(你来做)[确认] |
| 106 | |
| 107 | 按公众号深度解读风格**亲自撰写**,用 `Write` 落 `wechat_article.md` 和 `wechat_article.json`。 |
| 108 | |
| 109 | **公众号深度解读规则(领域知识):** |
| 110 | - **篇幅**约 1500–2500 字(按论文复杂度和 Step 2 的约定增减)。 |
| 111 | - **结构自由、随论文走**——不强求固定四节。一个好用的骨架: |
| 112 | 1. 导语:这篇为什么值得读(1 段,抛出问题或亮点钩子) |
| 113 | 2. 背景与问题:现有方法的不足 |
| 114 | 3. 核心方法:讲清思路,**配框架图**,可用类比/直觉解释 |
| 115 | 4. 关键实验与结果:摆具体数字,**配结果图/表** |
| 116 | 5. 意义、应用与 |