Couverture vidéo d'article
Génère une couverture 16:10 (Gemini/SUSTech) à partir d'un dossier d'article. Le générateur n'installe la sortie qu'après la réussite de la compilation LaTeX et de la conversion PNG.
Package et configuration
Le projet uv installé est :
<SKILLS_DIR>/paper-video-cover
Il gère sa dépendance Pillow et inclut les deux thèmes requis :
<SKILLS_DIR>/paper-video-cover/templates/beamerthemegemini.sty
<SKILLS_DIR>/paper-video-cover/templates/beamercolorthemesustech.sty
LuaLaTeX et Poppler pdftoppm sont des outils externes. Les deux doivent être disponibles avant la génération. Chaque outil est résolu dans l'ordre : indicateur CLI explicite, variable d'environnement LUALATEX ou PDFTOPPM, puis PATH. Une priorité élevée invalide est fatale et ne peut être contournée.
Exécution
uv run --project "<SKILLS_DIR>/paper-video-cover" `
"<SKILLS_DIR>/paper-video-cover/scripts/generate_poster.py" `
"<paper_dir>"
La sortie par défaut est <paper_dir>/poster. Sélectionnez un autre dossier avec :
uv run --project "<SKILLS_DIR>/paper-video-cover" `
"<SKILLS_DIR>/paper-video-cover/scripts/generate_poster.py" `
"<paper_dir>" --output-dir "<output_dir>"
Options :
--data <json>: surcharges JSON facultatives.--scheme <default|lab|bilibili>: jeu de couleurs SUSTech (par défautdefault; 实验室调研 utilisebilibilipour correspondre au deck d'enquête de laboratoire).--title-font <points>: remplace la taille automatique du titre.--output-dir <directory>: répertoire de sortie final.--lualatex <path-or-command>: exécutable LuaLaTeX explicite.--pdftoppm <path-or-command>: exécutablepdftoppmexplicite.
La génération PNG est obligatoire ; une sortie réussie contient poster.tex, poster.pdf et poster.png non vides, ainsi que les thèmes copiés et les figures converties. La construction a lieu dans un répertoire temporaire frère, donc une construction échouée ne remplace pas une sortie finale existante.
Générateur d'affiche d'enquête de laboratoire (实验室调研, generate_lab_poster.py)
Pour les enquêtes 实验室调研, utilisez scripts/generate_lab_poster.py au lieu du chemin générique — il remplit le modèle d'affiche du dépôt (<TEMPLATE_DIR>/main_template_lab_poster.tex, source de vérité ; copie de secours dans templates/) avec le format de section-division 可视化分析 du DECK : fond slides-beamer/figures/background.png en plein écran (OBLIGATOIRE — fatal si manquant ; si le deck en manque un, construisez-le avec paper-group-to-beamer/scripts/gen_viz_background.py --survey-dir "<LAB_DIR>") + QUATRE boîtes d'ombre arrondies blanches (rangées) : paire 实验室调研+date / bloc institut (sourcil couleur de marque + ligne anglaise) / nom du Prof. / title_2+title_3 avec règle emph. AUCUNE rangée métrique, AUCUN blurb, AUCUNE ligne de nom de laboratoire.
REMARQUE (changement par défaut 2026-08-07) : l'affiche est l'ARTEFACT OBLIGATOIRE pour les dossiers de laboratoire (l'uploader échoue fermé sans poster/poster.png), mais la COUVERTURE Bilibili UPLOAD par défaut est la PREMIÈRE DIAPOSITIVE du deck (video/cover.png) — ne COPIEZ PAS l'affiche sur video/cover.png ; conservez le rendu slide-001 du pipeline. Voir 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"
JSON --data : title_1_pi est OBLIGATOIRE (≤30 caractères). Conventions de nommage : nom chinois PI → xxx教授 (ex. 李飞飞教授, 刘华平教授) ; rôles non professeurs sans Prof./教授 (ex. Sergey Levine 等联合创始人) ; nom anglais professeur → Prof. First Last (ex. Prof. Yann LeCun). title_1_uni facultatif (budget largeur 40 unités, glyphe CJK = 2 unités, autre = 1, ex. 纽约大学 = 8, Physical Intelligence = 21 ; vide → ligne supprimée), title_1_uni_color facultatif (#RRGGBB — couleur de marque LOGO de l'institut, ex. NYU 57068B, Stanford 8C1515, CMU C41230, Berkeley 003262, Tsinghua 660874, SUSTech 2C5F7C, HKUST 003366 ; instituts sans couleur de marque par défaut noir 000000), title_1_uni_en facultatif (≤40 caractères, ex. NEW YORK UNIVERSITY) — le bloc de titre affiche l'université comme un sourcil de couleur de marque (25pt semigras dans title_1_uni_color, espacement CJK 0.25em inséré automatiquement par le générateur, tirets latéraux 80×3px à 50% de la couleur de marque), la ligne anglaise petite (13pt #8A8F98), puis le nom du Prof. (55pt rose gras, une seule ligne). title_2/title_3 facultatifs (budget largeur 30 unités chacun, ex. 从卷积网络到世界模型 = 18, IEEE Fellow 2026 = 15 ; parties vides suppriment leur ligne). date (facultatif, aujourd'hui par défaut) remplit le bloc de date. Les statistiques du corpus à partir de papers.json sont informatives uniquement — un fichier manquant dégrade avec un avertissement, jamais ne fait échouer. AUCUNE ligne de nom de labo, AUCUNE ligne de blurb, AUCUNE rangée métrique, et AUCUN séparateur ·. Exemple : title_1_uni="纽约大学", title_1_uni_en="NEW YORK UNIVERSITY", title_1_pi="Prof. Yann LeCun", title_2="从卷积网络到世界模型", title_3="图灵奖得主的40年深度学习谱系". Le titre d'upload dans video_meta.json conserve indépendamment le format complet {Abréviation institution} {Nom PI}教授:主题 — Hook. Disposition de l'affiche (boîtes tikz arrondies avec ombres portées sur le fond 可视化分析 du deck) : QUATRE rangées dans un conteneur 0.6971\textwidth, absolument centré sur la page (décalages fixes haut 0.107\textheight / bas 0.103\textheight ; pile ≈ 77% de la page) : rangée 1 = paire 实验室调研 + 〈DATE〉 (largeur texte 0.3092\textwidth chacune, 32pt, hauteur 0.1250\textheight) ; rangée 2 = bloc institut — sourcil NYU Purple (25pt semigras, tirets latéraux) + ligne anglaise 13pt (0.6706\textwidth, hauteur 0.1250\textheight) ; rangée 3 = bloc nom Prof. (55pt rose gras une ligne, 0.6706\textwidth, hauteur 0.1806\textheight) ; rangée 4 = title_2/title_3 + règle à 37pt (hauteur 0.2153\textheight). Espaces : horizontal 0.0258\textwidth / vertical 0.0417\textheight (60 px dans les deux sens sur le canevas de référence 2324×1440). --scheme par défaut bilibili (correspondance du deck) ; --template/--theme-dir remplacent les chemins du dépôt (le thème sustech-theme du deck est copié dans la construction). Contrat de jeton (fatal si non remplacé sur les lignes de code) : 〈DATE〉〈TITLE1UNI〉〈TITLE1UNIEN〉〈TITLE1PI〉〈TITLE2〉〈TITLE3〉. Compile avec xelatex (deux passes ; le thème du deck est xelatex uniquement) et rend poster.png à 300 dpi (page 32×20 cm → ~3780×2363 px) ; sortie <LAB_DIR>/poster/.
Piège — espaces dans le grand texte du titre : les nœuds TikZ + \fontsize{72}{84} sous le thème sustech suppriment les espaces entre mots (même \ ) ; le générateur convertit donc les espaces simples dans title_1/2/3 en colle \hspace{0.25em} (vérifié via pdftotext : NYU Prof. Yann LeCun garde ses espaces).
Piège — centrage des rangées et largeurs des blocs : (1) un \hbox to \containerwidth n'est PAS une ligne de paragraphe et \centering ne le centrera pas — les rangées doivent être \hbox to \textwidth{\hss … \hss} pour que le contenu se centre à l'intérieur de la ligne entière. (2) text width de tikz avec une macro basée sur \dimexpr peut lever Dimension too large sur le papier 32 cm — utilisez des largeurs littérales (ex. 0.44\textwidth). (3) la largeur extérieure d'un nœud tikz = text width + 2×inner sep — soustrayez le remplissage du sep des macros de largeur pour que les bords de la boîte atterrissent exactement sur le conteneur.
Piège — fond plein écran : la géométrie de l'affiche DOIT être \geometry{papersize={32cm,20cm},margin=0cm}. Toute marge positive décale l'origine du canevas de fond de beamer vers le haut de la zone de texte, produisant une bande blanche en haut (~1,1 cm pour margin=1,1 cm) et coupant le bord supérieur de l'image de fond. Vérifiez après chaque construction d'affiche : les rangées supérieures/inférieures à 3% de poster.png doivent avoir ~0 pixels blancs (scan PIL).
Affiches d'enquête de laboratoire (实验室调研)
Les titres chinois sont pris en charge (le préambule généré charge ctex ; le fallback du titre beamer ne supprime plus CJK). Le titre de l'affiche suit le format du titre d'upload {Abréviation institution} {Nom PI}教授:主题 — Hook (ex. NYU 杨立昆教授:从卷积网络到世界模型 — 图灵奖得主的40年深度学习谱系 / 清华刘华平教授:机器人具身智能 — 从视触觉到操作学习). Exécutez avec --scheme bilibili et un JSON --data :
{
"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"
}
La source de vérité de la palette est <TEMPLATE_DIR>/sustech-theme/beamercolorthemesustech.sty (bleu par défaut / rouge lab / rose bilibili) ; le thème du deck est copié dans la construction et le cadre compile sous xelatex (le moteur du deck). Le fond slides-beamer/figures/background.png doit exister (le fond de séparation 可视化分析 du deck) — le générateur échoue fermé sans lui.
Exemple avec outils explicites :
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"
Exemple avec configuration d'environnement :
$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>"
Entrées
Le générateur extrait le titre, le lieu, l'URL du projet, les figures et les métriques du premier fichier Markdown MinerU sous md_output/*/auto/. Si l'extraction basée sur les légendes ne trouve aucune figure, il recherche dans slides-beamer/figures/, paper-source/image/, source/image/, Figures/, puis md_output/*/auto/images/.
Les sources PNG, JPEG et PDF sont prises en charge. Les PDF utilisent pdftoppm résolu. Les figures référencées manquantes, non prises en charge, vides ou non convertibles sont fatales.
Tous les champs JSON sont facultatifs. Les chemins figure_map sont absolus ou relatifs au dossier de l'article :
{
"title": "Titre de remplacement",
"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"
}
}
Traitement par lots
Utilisez un fichier UTF-8 avec un dossier d'article par ligne ; start et count sont des arguments positionnels facultatifs :
uv run --project "<SKILLS_DIR>/paper-video-cover" `
"<SKILLS_DIR>/paper-video-cover/scripts/batch_generate.py" `
"<papers_file>" 0 20
Le lot utilise l'interpréteur sélectionné par uv, nécessite les trois artefacts pour chaque article et renvoie un code non nul si un élément échoue.
Comportement en cas d'échec
Le générateur renvoie un code non nul si un exécutable requis ou un thème packagé est manquant, si une commande enfant renvoie un code non nul, ou si un artefact requis est manquant ou vide. Traitez tout résultat non nul comme une non-publication ; la construction temporaire échouée est supprimée et la sortie finale précédente reste inchangée.
Compétences associées
- 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