Paper Video Cover
从论文目录生成 Gemini/SUSTech 16:10 封面。生成器仅在 LaTeX 编译和 PNG 转换都成功后安装输出。
包与设置
已安装的 uv 项目位于:
<SKILLS_DIR>/paper-video-cover
它管理其 Pillow 依赖项,并包含两个必需的主题:
<SKILLS_DIR>/paper-video-cover/templates/beamerthemegemini.sty
<SKILLS_DIR>/paper-video-cover/templates/beamercolorthemesustech.sty
LuaLaTeX 和 Poppler 的 pdftoppm 是外部工具。两者必须在生成之前解析。每个工具按顺序解析:显式 CLI 标志、LUALATEX 或 PDFTOPPM 环境变量,然后是 PATH。无效的高优先级覆盖会导致致命错误,不会绕过。
运行
uv run --project "<SKILLS_DIR>/paper-video-cover" `
"<SKILLS_DIR>/paper-video-cover/scripts/generate_poster.py" `
"<paper_dir>"
默认输出为 <paper_dir>/poster。使用以下命令选择其他目录:
uv run --project "<SKILLS_DIR>/paper-video-cover" `
"<SKILLS_DIR>/paper-video-cover/scripts/generate_poster.py" `
"<paper_dir>" --output-dir "<output_dir>"
选项:
--data <json>:可选的 JSON 覆盖。--scheme <default|lab|bilibili>:SUSTech 颜色方案(默认为default;实验室调研使用bilibili以匹配实验室调研 deck)。--title-font <points>:覆盖自动标题大小。--output-dir <directory>:最终输出目录。--lualatex <path-or-command>:显式的 LuaLaTeX 可执行文件。--pdftoppm <path-or-command>:显式的pdftoppm可执行文件。
PNG 生成是强制性的;成功的输出包含非空的 poster.tex、poster.pdf 和 poster.png,以及复制的主题和转换后的图表。构建发生在同级临时目录中,因此失败的构建不会替换现有的最终输出。
实验室调研海报生成器 (实验室调研, generate_lab_poster.py)
对于 实验室调研 调查,请使用 scripts/generate_lab_poster.py 代替通用路径——它会用 DECK 的 可视化分析 章节分隔符格式填充仓库海报模板(<TEMPLATE_DIR>/main_template_lab_poster.tex,真相来源;templates/ 中的后备副本):全出血 slides-beamer/figures/background.png(必需——如果缺失则致命;如果 deck 缺少此文件,请使用 paper-group-to-beamer/scripts/gen_viz_background.py –survey-dir "<LAB_DIR>" 构建)+ 四个白色圆角阴影框(行):实验室调研+日期对 / 机构块(品牌色眉毛 + 英文行) / 教授姓名 / 带强调规则的 title_2+title_3。无度量行、无简介、无实验室名称行。
注意(2026-08-07 默认更改):海报是实验室目录的必需工件(上传器在缺少海报/poster.png 时关闭失败),但 Bilibili 上传封面默认为 deck 的第一张幻灯片 (video/cover.png) —— 不要将海报复制到 video/cover.png;保持管道的 slide-001 渲染。请参阅 lab-survey-to-bilibili-runbook。
uv run --project "<SKILLS_DIR>/paper-video-cover" \
"<SKILLS_DIR>/paper-video-cover/scripts/generate_lab_poster.py" \
"<LAB_DIR>" --data "<LAB_DIR>/poster_data.json"
--data JSON:title_1_pi 是必需的(≤30 个字符)。命名约定:中文名 PI → xxx教授(如 李飞飞教授、刘华平教授); 非教授角色不加 Prof./教授(如 Sergey Levine 等联合创始人); 英文名教授 → Prof. First Last(如 Prof. Yann LeCun)。
title_1_uni 可选(宽度预算 40 个单位,CJK 字形 = 2 个单位,其他 = 1,例如 纽约大学 = 8,Physical Intelligence = 21;空则删除该行),title_1_uni_color 可选(#RRGGBB — 机构的 LOGO 品牌色,例如 NYU 57068B,Stanford 8C1515,CMU C41230,Berkeley 003262,Tsinghua 660874,SUSTech 2C5F7C,HKUST 003366;没有品牌色的机构默认为黑色 000000),title_1_uni_en 可选(≤40 个字符,例如 NEW YORK UNIVERSITY)—— 标题块将大学渲染为 机构品牌色眉毛(25pt 半粗体,使用 title_1_uni_color,生成器自动插入 0.25em CJK 字间距,侧边破折号 80×3px 占品牌色的 50%)、英文小行(13pt #8A8F98),然后是教授姓名(55pt 粉色粗体,单行)。title_2/title_3 可选(每个宽度预算 30 个单位,例如 从卷积网络到世界模型 = 18,IEEE Fellow 2026 = 15;空部分删除其行)。date(可选,默认为今天)填充日期块。来自 papers.json 的语料库统计信息仅供信息参考——缺失文件会降级并发出警告,绝不会导致运行失败。无实验室名称行、无简介行、无度量行、无 · 分隔符。
示例:title_1_uni="纽约大学",title_1_uni_en="NEW YORK UNIVERSITY",title_1_pi="Prof. Yann LeCun",title_2="从卷积网络到世界模型",title_3="图灵奖得主的40年深度学习谱系"。video_meta.json 中的上传标题独立保留完整的 {机构缩写} {PI姓名}教授:主题 — Hook 格式。
海报布局(带有投阴影的 tikz 圆角框,位于 deck 的 可视化分析 背景之上):一个 0.6971\textwidth 容器中的四行,绝对居中于页面(固定的顶部 0.107\textheight / 底部 0.103\textheight 偏移;堆叠约占据页面的 77%):第 1 行 = 实验室调研 + 〈DATE〉 对(每个 0.3092\textwidth 文本宽度,32pt,高度 0.1250\textheight);第 2 行 = 机构块 — NYU 紫色眉毛(25pt 半粗体,侧边破折号)+ 英文行 13pt(0.6706\textwidth,高度 0.1250\textheight);第 3 行 = 教授姓名块(55pt 粉色粗体单行,0.6706\textwidth,高度 0.1806\textheight);第 4 行 = title_2/title_3 + 37pt 规则(高度 0.2153\textheight)。间隙:水平 0.0258\textwidth / 垂直 0.0417\textheight(在 2324×1440 参考画布中双向均为 60 像素)。--scheme 默认为 bilibili(与 deck 匹配);--template/--theme-dir 覆盖仓库路径(deck 的 sustech-theme 被复制到构建中)。令牌契约(如果代码行上未替换则致命):〈DATE〉〈TITLE1UNI〉〈TITLE1UNIEN〉〈TITLE1PI〉〈TITLE2〉〈TITLE3〉。使用 xelatex 编译(两次传递;deck 主题仅支持 xelatex)并以 300 dpi 渲染 poster.png(32×20 cm 页面 → ~3780×2363 像素);输出 <LAB_DIR>/poster/。
陷阱 — 大标题文本中的空格:在 sustech 主题下,TikZ 节点 + \fontsize{72}{84} 会丢弃单词间空格(甚至 \ );因此生成器会将 title_1/2/3 中的普通空格转换为 \hspace{0.25em} 胶水(通过 pdftotext 验证:NYU Prof. Yann LeCun 保留其空格)。
陷阱 — 行居中和块宽度:(1) \hbox to \containerwidth 不是段落行,\centering 不会使其居中——行必须是 \hbox to \textwidth{\hss … \hss},以便内容在整行内居中。(2) 使用基于 \dimexpr 的宏的 tikz text width 可能会在 32 cm 纸张上引发 Dimension too large——请使用字面宽度(例如 0.44\textwidth)。(3) tikz 节点的外部宽度 = text width + 2×inner sep——从宽度宏中减去内边距,以使框边缘恰好落在容器边界上。
陷阱 — 全出血背景:海报几何设置必须是 \geometry{papersize={32cm,20cm},margin=0cm}。任何正边距都会将 beamer 的背景画布原点偏移到文本区域顶部,从而在顶部产生白色条带(margin=1.1cm 时约为 1.1 cm)并裁剪背景图像的顶部边缘。每次海报构建后验证:poster.png 的顶部/底部 3% 行必须具有约 0 个白色像素(PIL 扫描)。
实验室调研海报 (实验室调研)
支持中文标题(生成的序言加载了 ctex;beamer 标题回退不再剥离 CJK)。海报标题遵循上传标题格式 {机构缩写} {PI姓名}教授:主题 — Hook(例如 NYU 杨立昆教授:从卷积网络到世界模型 — 图灵奖得主的40年深度学习谱系 / 清华刘华平教授:机器人具身智能 — 从视触觉到操作学习)。使用 --scheme bilibili 和 --data JSON 运行:
{
"title_1_uni": "纽约大学",
"title_1_uni_en": "NEW YORK UNIVERSITY",
"title_1_uni_color": "57068B",
"title_1_pi": "Prof. Yann LeCun",
"title_2": "从卷积网络到世界模型",
"title_3": "图灵奖得主的40年深度学习谱系",
"date": "2026-08-06"
}
调色板的真相来源是 <TEMPLATE_DIR>/sustech-theme/beamercolorthemesustech.sty(默认蓝色 / 实验室红色 / bilibili 粉色);deck 主题被复制到构建中,帧在 xelatex 下编译(deck 的引擎)。背景 slides-beamer/figures/background.png 必须存在(deck 的 可视化分析 分隔符背景)——生成器在没有它的情况下关闭失败。
使用显式工具的示例:
uv run --project "<SKILLS_DIR>/paper-video-cover" `
"<SKILLS_DIR>/paper-video-cover/scripts/generate_poster.py" `
"<paper_dir>" `
--lualatex "C:/path/to/lualatex.exe" `
--pdftoppm "C:/path/to/pdftoppm.exe"
使用环境配置的示例:
$env:LUALATEX = "C:/path/to/lualatex.exe"
$env:PDFTOPPM = "C:/path/to/pdftoppm.exe"
uv run --project "<SKILLS_DIR>/paper-video-cover" `
"<SKILLS_DIR>/paper-video-cover/scripts/generate_poster.py" `
"<paper_dir>"
输入
生成器从 md_output/*/auto/ 下的第一个 MinerU markdown 文件提取标题、会议、项目 URL、图表和度量。如果基于标题的提取未找到任何图表,则搜索 slides-beamer/figures/、paper-source/image/、source/image/、Figures/,然后是 md_output/*/auto/images/。
支持 PNG、JPEG 和 PDF 源。PDF 使用已解析的 pdftoppm。缺少、不支持、为空或无法转换的引用图表是致命错误。
所有 JSON 字段都是可选的。figure_map 路径是绝对路径或相对于论文目录的路径:
{
"title": "Override Title",
"venue": "CVPR 2025",
"title_font": 220,
"cards_col1": [],
"cards_col2": [],
"figures": {"col1": ["fig1"], "col2": ["fig2"]},
"figure_map": {
"fig1": "md_output/1234.5678/auto/images/figure-1.png"
}
}
批量处理
使用 UTF-8 文件,每行一个论文目录;start 和 count 是可选的 positional arguments:
uv run --project "<SKILLS_DIR>/paper-video-cover" `
"<SKILLS_DIR>/paper-video-cover/scripts/batch_generate.py" `
"<papers_file>" 0 20
批处理使用 uv 选择的解释器,对每篇论文要求所有三个工件,如果任何项目失败则返回非零。
失败行为
如果缺少必需的可执行文件或打包的主题、子命令返回非零、或者必需的工件缺失或为空,则生成器返回非零。将任何非零结果视为无发布;失败的临时构建将被移除,之前的最终输出保持不变。
相关技能
- skill://lab-survey-to-bilibili-runbook
- skill://paper-group-to-beamer
- skill://lab-poster-deck-format
- skill://paper-bilibili-uploader
- skill://paper-lab-survey-to-bilibili
- skill://paper-to-bilibili