Exécution étape par étape et dépendances
- Suivez l'ordre de travail de cette compétence. Avant qu'une étape n'utilise une bibliothèque, un outil en ligne de commande, un runtime ou une police, vérifiez uniquement les dépendances requises par cette étape ; ne supposez pas qu'elles sont installées.
- Réutilisez les dépendances disponibles. Si l'une d'elles est manquante, installez uniquement cette dépendance en utilisant le système d'exploitation actuel et un gestionnaire de paquets disponible, puis vérifiez-la et réessayez l'étape initiale. N'installez pas toute la liste des dépendances à l'avance.
- Utilisez l'environnement Python actif (
python -m pip install <paquet>, ou lepythoncorrespondant) ; créez un environnement virtuel local à la tâche si nécessaire. Installez les bibliothèques Node.js dans le projet de la tâche (npm install <paquet>) afin que le script puisse les résoudre. Pour les outils système et les polices, utilisez le gestionnaire de paquets du système d'exploitation disponible (par exemple, Homebrew sur macOS, apt sur Debian/Ubuntu, ou winget sur Windows). - Suivez le flux d'autorisation de l'hôte lorsque l'installation nécessite une approbation. Si le gestionnaire de paquets ou l'autorisation requise est indisponible, ou si l'installation/téléchargement échoue, signalez la dépendance manquante et l'étape affectée ; ne réessayez pas indéfiniment et ne prétendez pas que l'étape a réussi. Continuez les étapes indépendantes lorsque cela est possible.
- Conservez le flux de travail original et les vérifications de qualité. Vérifiez les polices uniquement lorsque le rendu les nécessite. Les étapes utilisant uniquement du texte, des outils intégrés ou du HTML autonome ne nécessitent aucune installation de paquet ; l'accès à un outil externe ou l'authentification doivent être gérés via l'hôte, et non via un gestionnaire de paquets.
Conventions de chemin et d'environnement d'exécution (à lire avant d'exécuter des commandes)
- Commande Python : Sur cette machine, utilisez
python(sur Windows,python3n'existe généralement pas). Toutes les commandes ci-dessous utilisentpythonde manière uniforme. - Chemin des scripts : Les scripts de cette compétence se trouvent dans
AppData/skills/pptx/scripts/(relativement à la racine du projet). Les commandes de script dans les sections suivantes et dans editing.md / pptxgenjs.md sont écrites comme des chemins relatifs absolus à ce répertoire de base et peuvent être exécutées directement depuis la racine du projet. - Répertoire de travail : Les commandes supposent que le répertoire de travail actuel est la racine du projet. Si le répertoire de travail est différent (par exemple,
default_workdirmodifié vers un autre répertoire), remplacezAppData/skills/pptxpar le chemin absolu du répertoire de la compétence. - Node.js : Avant d'exécuter
npm/node(nécessaire pour pptxgenjs), ajoutez le répertoire Node.js au PATH conformément aux règles du projet.
Compétence PPTX
Référence rapide
| Tâche | Guide |
|---|---|
| Lire/analyser le contenu | python -m markitdown presentation.pptx |
| Modifier ou créer à partir d'un modèle | Lisez editing.md — QA : validate_layout.py + markitdown |
| Créer à partir de zéro | 1. Planifier le contenu → 2. Pré-générer les actifs → 3. Lire pptxgenjs.md |
| Prévenir les débordements par conception | Lisez pptxgenjs.md |
| Générer un système de design | python AppData/skills/pptx/scripts/design/search.py "<sujet>" --design-system |
| Correction post-génération | python AppData/skills/pptx/scripts/fix_pptx.py output.pptx |
| QA de mise en page (critique en premier) | python AppData/skills/pptx/scripts/validate_layout.py presentation.pptx |
Lecture du contenu
# Extraction de texte
python -m markitdown presentation.pptx
# XML brut
python AppData/skills/pptx/scripts/unpack.py presentation.pptx unpacked/
Workflow d'édition
Lisez editing.md pour les détails complets.
- Analysez le modèle avec
markitdown - Dépaquetez + vérification de la couche de style + plan d'alignement Thème et Style
- Manipulez les diapositives → modifiez le contenu → nettoyez → empaquetez
- ⚠️ QA de mise en page (étape obligatoire) :
python AppData/skills/pptx/scripts/validate_layout.py output.pptx --slides <numéros_des_diapositives_modifiées> - ⚠️ QA de contenu (obligatoire) :
python -m markitdown output.pptx
Création à partir de zéro
Lisez pptxgenjs.md pour les détails complets.
Utilisez cette approche lorsqu'aucun modèle ou présentation de référence n'est disponible.
Structure de diapositives requise (uniquement pour création à partir de zéro)
Lorsque vous créez une présentation à partir de zéro, vous DEVEZ suivre cette structure :
- Diapositive 1 : Page de couverture
- Diapositive 2 : Table des matières (ordre du jour)
- Diapositive 3 et suivantes : Sections de contenu dans l'ordre exact indiqué sur la diapositive 2
- Dernière diapositive : Page de clôture / remerciements
Ne sautez pas la diapositive de table des matières. Ne placez pas de diapositives de contenu avant la table des matières.
⚠️ Aucune diapositive vierge autorisée
Chaque diapositive DOIT contenir au moins un élément visible (addText, addShape, addImage, addChart ou addTable) à l'intérieur de la diapositive. Une diapositive avec uniquement une couleur d'arrière-plan et aucun élément de contenu est un défaut de génération.
Causes courantes des diapositives vierges :
- Oublier d'ajouter du contenu aux diapositives de séparation de section / de transition
- Troncature du jeton en cours de génération laissant certaines diapositives vides
- Supposer que la disposition ou le masque de diapositive remplira automatiquement le contenu (ce ne sera pas le cas — pptxgenjs crée des dispositions minimales sans formes héritées)
Si vous destinez une diapositive à être un séparateur de section, vous DEVEZ ajouter explicitement des éléments — par exemple, un grand numéro de section, un texte de titre et/ou des formes décoratives.
⚠️ OBLIGATOIRE : Planification avant génération
Avant d'écrire du code, vous DEVEZ effectuer ces étapes de planification :
⚡ Chemin rapide pour les demandes simples : Lorsque l'utilisateur demande un jeu de diapositives court/simple (≤ 6 pages, sujet unique, sans diagrammes complexes), sautez la sortie de planification formelle et passez directement à l'étape 3 (écrire le code) en utilisant la structure standard Couverture + TdM + (N-3) Contenu + Clôture. Chemin rapide = pas de plan verbeux dans le corps de votre réponse, construisez et exécutez simplement le script.
Étape 1 : Sortir le plan de conception du contenu
Présentez un plan structuré couvrant :
-
Thème et style généraux
- Choix de la palette de couleurs (référencez la section « Idées de conception »)
- Appariement typographique
- Motif visuel à décliner sur toutes les diapositives
-
Plan diapositive par diapositive
Diapositive 1 : Couverture - Type de disposition, éléments clés Diapositive 2 : Table des matières - Liste ordonnée des sections Diapositive 3 : [Section 1 de la TdM] - Type de disposition, éléments clés, plan d'informations (si visuel) ... Diapositive N : Clôture / Remerciements - Type de disposition, éléments clés ... -
Inventaire des éléments visuels
- Listez toutes les images, icônes, graphiques et diagrammes nécessaires
- Marquez chacun comme :
[Intégré](formes/graphiques pptxgenjs) ou[Externe](nécessite une pré-génération)
Exemple de sortie de planification :
## Plan de présentation
**Thème :** Palette Ocean Gradient (065A82, 1C7293, 21295C)
**Polices :** Georgia (titres) + Calibri (corps)
**Motif :** Cartes arrondies avec bordure d'accentuation à gauche
### Diapositives :
1. Diapositive de couverture - Titre centré, fond dégradé
2. Table des matières - Vue d'ensemble / Architecture / Métriques / Chronologie
3. [Section 1 de la TdM] - Type de disposition, éléments clés, plan d'informations (si visuel)
...
n. Remerciements - Déclaration de clôture + contact
⚠️ Après avoir sorti votre plan, passez IMMÉDIATEMENT à l'étape 2 et à l'étape 3. Ne replanifiez pas, ne reformulez pas le même plan avec des variations mineures. Sortez le plan UNE FOIS, puis commencez à écrire le code pptxgenjs.
Étape 2 : Pré-générer les actifs externes
Pour les figures marquées [Externe], générez-les AVANT d'écrire le code pptxgenjs.
⚠️ CRITIQUE : Cohérence des couleurs
Tous les diagrammes et graphiques générés DOIVENT utiliser la même palette de couleurs que la présentation. Définissez les couleurs en haut de votre script de génération en fonction de votre thème choisi.
Option A : Formes/Graphiques natifs en premier (DÉFAUT OBLIGATOIRE)
TOUS les diagrammes d'architecture, organigrammes, diagrammes de processus, organigrammes hiérarchiques et diagrammes de relations DOIVENT être construits avec les formes natives de pptxgenjs (RECTANGLE, OVALE, LIGNE, connecteurs + addText). Voir pptxgenjs.md « Building Diagrams with Native Shapes » pour les modèles et exemples.
- Utilisez une diapositive modèle solide (processus, comparaison, 2 colonnes, grille d'icônes) lorsqu'elle correspond
- Utilisez les formes natives pptxgenjs (boîtes/flèches/lignes + texte) pour les flux, architectures et hiérarchies
- Utilisez les graphiques pptxgenjs pour les graphiques de données simples (barres, secteurs, lignes, etc.)
Ne recourez à matplotlib que pour les graphiques statistiques complexes (heatmaps, nuages de points, boîtes à moustaches) que les graphiques pptxgenjs ne peuvent pas gérer. Ne recourez à Mermaid que lorsque le diagramme est trop complexe pour les formes natives ET implique de nombreuses liaisons croisées.
Option B : Graphiques Matplotlib/Python
Définissez la palette de couleurs au début pour correspondre à votre thème PPT :
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
# ============================================================
# PALETTE DE COULEURS - Correspond à votre thème PPT
# ============================================================
# Exemple : Thème « Ocean Gradient »
COULEURS = {
'primary': '#065A82',
'secondary': '#1C7293',
'accent': '#21295C',
'background': '#F0F7FA',
'text': '#21295C',
'light': '#E8F4F8',
}
# Cycle de couleurs pour plusieurs séries de données
CYCLE_COULEURS = [COULEURS['primary'], COULEURS['secondary'], COULEURS['accent'], '#4A90A4', '#2D5A6B']
# Appliquer le thème globalement
plt.rcParams.update({
'axes.prop_cycle': plt.cycler(color=CYCLE_COULEURS),
'axes.facecolor': 'none',
'axes.edgecolor': COULEURS['text'],
'axes.labelcolor': COULEURS['text'],
'text.color': COULEURS['text'],
'xtick.color': COULEURS['text'],
'ytick.color': COULEURS['text'],
'figure.facecolor': 'none',
'font.family': 'sans-serif',
'font.size': 12,
})
# ============================================================
# Créer un graphique avec les couleurs du thème
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
bars = ax.bar(['T1', 'T2', 'T3', 'T4'], [25, 40, 35, 50],
color=[COULEURS['primary'], COULEURS['secondary'], COULEURS['primary'], COULEURS['secondary']],
edgecolor=COULEURS['accent'], linewidth=1.5)
ax.set_title('Revenu trimestriel', fontsize=16, fontweight='bold', color=COULEURS['text'])
ax.set_ylabel('Revenu (M$)', color=COULEURS['text'])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
largeur_px, hauteur_px = int(8 * 150), int(5 * 150)
plt.savefig(f'graphique_{largeur_px}x{hauteur_px}.png', dpi=150, transparent=True)
plt.close()
Modèles de palette matplotlib :
# Midnight Executive (Exécutif Minuit)
COULEURS = {'primary': '#1E2761', 'secondary': '#CADCFC', 'accent': '#FFFFFF', 'text': '#1E2761'}
# Forest & Moss (Forêt et Mousse)
COULEURS = {'primary': '#2C5F2D', 'secondary': '#97BC62', 'accent': '#F5F5F5', 'text': '#2C5F2D'}
# Coral Energy (Énergie Corail)
COULEURS = {'primary': '#F96167', 'secondary': '#F9E795', 'accent': '#2F3C7E', 'text': '#2F3C7E'}
# Warm Terracotta (Terre Cuite Chaude)
COULEURS = {'primary': '#B85042', 'secondary': '#E7E8D1', 'accent': '#A7BEAE', 'text': '#B85042'}
# Teal Trust (Confiance Sarcelle)
COULEURS = {'primary': '#028090', 'secondary': '#00A896', 'accent': '#02C39A', 'text': '#028090'}
Utilisez pour :
- Graphiques statistiques complexes (barres, lignes, secteurs, nuages de points, radar, etc.)
- Visualisations personnalisées non prises en charge par pptxgenjs
- Heatmaps, nuages de points, boîtes à moustaches
⚠️ N'utilisez PAS matplotlib pour :
- Diagrammes d'architecture
- Organigrammes / diagrammes de processus
- Organigrammes hiérarchiques / diagrammes de hiérarchie
- Diagrammes de topologie réseau
- Tout diagramme qui montre principalement des relations entre composants
Ceux-ci DOIVENT être construits avec les formes natives de pptxgenjs afin qu'ils soient rendus comme des objets PPT modifiables — et non comme des images raster.
matplotlib - Graphiques avec support des langues CJK
Lors de la création de graphiques avec matplotlib qui incluent du texte en chinois, vous DEVEZ configurer la police :
import os
import platform
import matplotlib.pyplot as plt
import matplotlib
def configurer_matplotlib_cjk():
"""Configure matplotlib pour prendre en charge les caractères CJK"""
system = platform.system()
if system == "Darwin": # macOS
noms_polices = ['Arial Unicode MS', 'PingFang SC', 'Heiti SC', 'STHeiti']
elif system == "Windows":
noms_polices = ['Microsoft YaHei', 'SimHei', 'SimSun']
else: # Linux
noms_polices = ['Noto Sans CJK SC', 'WenQuanYi Zen Hei', 'Droid Sans Fallback']
# Trouver la police disponible
polices_disponibles = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
for nom_police in noms_polices:
if nom_police in polices_disponibles:
plt.rcParams['font.sans-serif'] = [nom_police] + plt.rcParams['font.sans-serif']
plt.rcParams['axes.unicode_minus'] = False # Correction de l'affichage du signe moins
return nom_police
return None
# Configurer la police CJK avant de créer des graphiques
police_cjk = configurer_matplotlib_cjk()
# Créer un graphique à barres avec des étiquettes en chinois
categories = ['Premier trimestre', 'Deuxième trimestre', 'Troisième trimestre', 'Quatrième trimestre']
valeurs = [120, 135, 142, 158]
plt.figure(figsize=(10, 6))
plt.bar(categories, valeurs, color='steelblue')
plt.title('Données de ventes trimestrielles', fontsize=16)
plt.xlabel('Trimestre', fontsize=12)
plt.ylabel('Ventes', fontsize=12)
plt.tight_layout()
plt.savefig('graphique.png', dpi=150)
plt.close()
Option C : Recherche Web d'images
Recherchez des images pertinentes lorsque :
- Des photos ou illustrations libres de droits sont nécessaires
- Des icônes ou logos sont requis
- Des images de référence pour des concepts
Option D : Diagrammes Mermaid (Dernier recours)
Utilisez uniquement lorsque le diagramme ne peut pas être représenté proprement avec des formes/layouts natifs, et maintenez la cohérence avec le jeu de diapositives :
# Installer si nécessaire : npm install -g @mermaid-js/mermaid-cli
Créez un fichier de configuration de thème correspondant à votre palette PPT :
// mermaid-config.json - Exemple pour le thème « Ocean Gradient »
{
"theme": "base",
"themeVariables": {
"primaryColor": "#065A82",
"primaryTextColor": "#FFFFFF",
"primaryBorderColor": "#21295C",
"secondaryColor": "#1C7293",
"secondaryTextColor": "#FFFFFF",
"secondaryBorderColor": "#065A82",
"tertiaryColor": "#E8F4F8",
"tertiaryTextColor": "#21295C",
"lineColor": "#21295C",
"textColor": "#21295C",
"mainBkg": "#E8F4F8",
"nodeBorder": "#065A82",
"clusterBkg": "#F0F7FA",
"titleColor": "#21295C",
"edgeLabelBackground": "#FFFFFF"
}
}
cat > diagramme.mmd << 'EOF'
graph LR
A[Client] --> B[Passerelle API]
B --> C[Service A]
B --> D[Service B]
EOF
# Privilégier l'export haute résolution pour utilisation dans PPT
mmdc -i diagramme.mmd -o diagramme.png -c mermaid-config.json -b white -w 1600 --scale 2
Étape 3 : Convention de nommage des images (OBLIGATOIRE)
Toutes les images générées DOIVENT inclure les dimensions dans le nom de fichier :
{nom}_{largeur}x{hauteur}.png
Exemples :
architecture_800x600.png- 800 px de large, 600 px de hauttimeline_1200x400.png- 1200 px de large, 400 px de hautgraphique_600x600.png- 600 px carré
Lors de l'enregistrement des images, incluez toujours les dimensions :
# Exemple Matplotlib
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
# ... créer le graphique ...
largeur_px = int(8 * 150) # 1200
hauteur_px = int(5 * 150) # 750
plt.savefig(f'graphique_{largeur_px}x{hauteur_px}.png', dpi=150, transparent=True)
# Géné...
… [tronqué pour la traduction]