学术科研
从 Overleaf 论文生成可打印学术会议海报时使用:用…
适用于需要把 Overleaf 论文源码快速制作成可交互排版、最终打印为 PDF 的学术会议海报。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
从 Overleaf 论文生成可打印学术特定
解决思路
- 安装:运行 `git clone git@github.com:ethanweber/posterskill.git poster`,然后 `cd poster`。
- 准备论文源:运行 `git clone https://git.overleaf.com/YOUR_PROJECT_ID overleaf`。
- 可选风格参考:运行 `cp ~/Downloads/some_reference_poster.pdf references/` 把参考海报 PDF 放入 `references/`。
- 启动 Claude Code:运行 `claude`。
- 触发技能:输入 `/make-poster`。
- 按 Claude 询问提供项目网站 URL 和格式规范,随后生成 `poster/` 目录及其中的 `index.html`。
- 按目录结构准备:`.claude/commands/make-poster.md` 是技能命令;`overleaf/` 放克隆的 Overleaf 项目;`references/` 放可选参考 PDF;`poster/` 为生成输出,含 `index.html` 和 `logos/`。
- 生成物:`poster/index.html` 是通过 CDN 加载的 React 应用,内含 `CARD_REGISTRY`、`DEFAULT_LAYOUT`、`DEFAULT_LOGOS` 和 `window.posterAPI`。
- 在 Chrome 打开 `poster/index.html` 以使用内置可视化编辑器。
- 调整列宽:左右拖动列分隔线。
- 调整卡片高度:在列内上下拖动行分隔线。
- 交换卡片:点击一个菱形手柄,再点击另一个。
- 移动或插入卡片:点击一个手柄,再点击放置区。
- 调整字号:点击工具栏的 `A-` / `A+` 按钮。
- 预览打印布局:点击 `Preview` 按钮。
- 导出布局:点击 `Copy Config` 获取 JSON。
- 在浏览器控制台或 Playwright 中使用 `window.posterAPI`。
- 交换两张卡片:`posterAPI.swapCards('method', 'results')`。
- 把卡片移动到指定列和位置:`posterAPI.moveCard('quant', 'col1', 2)`。
- 设置列宽(单位 mm):`posterAPI.setColumnWidth('col1', 280)`。
- 设置指定卡片高度(单位 mm):`posterAPI.setCardHeight('method', 150)`。
- 全局缩放文字:`posterAPI.setFontScale(1.5)`。
- 测量空白浪费(越低布局越好):`posterAPI.getWaste()`。
- 获取当前布局对象:`posterAPI.getLayout()`。
- 获取完整配置 JSON 以粘贴回 Claude:`posterAPI.getConfig()`。
- 重置为默认布局:`posterAPI.resetLayout()`。
- 迭代工作流第 1 步:让 Claude 生成初稿并在浏览器打开 `poster/index.html`。
- 迭代工作流第 2 步:在浏览器中拖动分隔线、交换卡片、调整列宽来编辑。
- 迭代工作流第 3 步:点击工具栏 `Copy Config` 导出布局 JSON。
- 迭代工作流第 4 步:把 JSON 粘贴回 Claude,让其更新 HTML 中的 `DEFAULT_LAYOUT`。
- 迭代工作流第 5 步:重复直到布局满意。
- 迭代工作流第 6 步:打印为 PDF:`File → Print`,`Margins: None`,`Background Graphics: On`。
- Playwright 自动化:Claude 内部用它验证布局,你也可以用;引入 `const { chromium } = require('playwright');`。
- Playwright:`const browser = await chromium.launch();` 和 `const page = await browser.newPage();`。
- Playwright:`await page.goto(`file://${__dirname}/poster/index.html`);`。
- Playwright:用 `const waste = await page.evaluate(() => posterAPI.getWaste());` 获取空白浪费并打印。
- Playwright:用 `await page.evaluate(() => posterAPI.setColumnWidth('col1', 300));` 调整列宽。
- Playwright:用 `await page.screenshot({ path: 'poster-preview.png', fullPage: true });` 截图做视觉验证。
- Playwright:用 `await page.pdf({ path: 'poster.pdf', width: '841mm', height: '1189mm', printBackground: true });` 生成打印分辨率 PDF。
- Playwright:最后 `await browser.close();`。
- 在 `CARD_REGISTRY` 中为每张卡片定义 `title`、`color` 和 `body`。
- 卡片 `body` 支持完整 JSX,可包含 `<strong>`、`<em>`、行内数学、图片、表格等。
- 在 `DEFAULT_LAYOUT` 中定义 `columns`,每列包含 `id`、`widthMm`、`cards` 数组。
- 参考默认布局:`col1` 宽 `280`,卡片 `['abstract', 'method']`;`col2` 宽 `320`,卡片 `['results', 'quant']`;`col3` 宽 `280`,卡片 `['conclusion', 'references']`。
- 输入项:论文内容来自 `overleaf/` 目录,必需。
- 输入项:项目网站 URL 在运行时询问,必需。
- 输入项:参考海报 `references/*.pdf` 可选。
- 输入项:作者网站 URL 可选,用于品牌匹配。
- 输入项:格式规范从会议 URL 或文本获取;缺失时会询问。
- 输入项:Logo 自动下载到 `poster/logos/`。
- 添加自定义图片卡片:在 `CARD_REGISTRY` 新增如 `custom_fig`,设置 `title`、`color`、`body`;body 可用 grid 放两张图并加说明。
- 把自定义卡片加入 `DEFAULT_LAYOUT`,如 `{ id: 'col2', widthMm: 320, cards: ['results', 'custom_fig'] }`。
- 配置 Logo:定义 `DEFAULT_LOGOS` 数组,每项含 `src` 和 `height`,如 `logos/university.png` 高 `60`、`logos/lab.png` 高 `50`、`logos/sponsor.png` 高 `45`。
- 打印为 PDF:在 Chrome 打开 `poster/index.html`。
- 打印为 PDF:点击 `Preview` 验证布局。
- 打印为 PDF:按 `Ctrl+P` / `Cmd+P`。
- 打印为 PDF:设置 `Margins: None`。
- 打印为 PDF:启用 `Background graphics`。
- 打印为 PDF:把纸张尺寸设为会议规格(如 A0、36×48in 等)。
- 打印为 PDF:另存为 PDF。
- 故障排查:打印与浏览器不一致时,使用 Chrome 而不是 Firefox/Safari,并在打印对话框启用 `Background graphics`。
- 故障排查:图片不加载时,确保 HTML 中图片路径相对 `poster/index.html`;Claude 会把图片复制到 `poster/figures/`,检查目录存在。
- 故障排查:Logo 未获取时,Claude 用 Playwright 从项目网站下载;失败则手动复制 logo 到 `poster/logos/` 并更新 `DEFAULT_LOGOS` 路径。
- 故障排查:粘贴后布局配置未更新时,确保粘贴 `Copy Config` 的完整 JSON;Claude 需要完整 `DEFAULT_LAYOUT` 和 `DEFAULT_LOGOS` 对象来替换。
- 故障排查:字体对海报尺寸太小/太大时,在控制台用 `posterAPI.setFontScale(1.2)` 或点击 `A+` / `A-`,再 `Copy Config` 粘贴给 Claude。
- 故障排查:卡片间空白时,在控制台运行 `posterAPI.getWaste()` 量化;用 `posterAPI.setCardHeight('cardId', heightMm)` 调整卡片高度,或手动拖动行分隔线。
适用边界 · 注意事项
- 没有 Overleaf 论文源码,或无法使用 Claude Code 技能时,不适用。
- 需要完全离线、无法使用 CDN/Playwright 或浏览器打印 PDF 的环境不适用。
- 只需非学术海报或简单图片拼接时,直接用其他排版工具更合适。