Ejecución paso a paso y dependencias
- Sigue el flujo de trabajo de esta skill en orden. Antes de que un paso utilice una biblioteca, herramienta de línea de comandos, entorno de ejecución o fuente tipográfica, verifica solo las dependencias requeridas por ese paso; no asumas que están instaladas.
- Reutiliza las dependencias que estén disponibles. Si falta alguna, instala solo esa dependencia usando el sistema operativo actual y un gestor de paquetes disponible, luego verifícala y vuelve a intentar el paso original. No instales toda la lista de dependencias por adelantado.
- Usa el entorno Python activo (
python -m pip install <paquete>, o elpythoncorrespondiente); crea un entorno virtual local a la tarea si es necesario. Instala las bibliotecas Node.js en el proyecto de la tarea (npm install <paquete>) para que el script pueda resolverlas. Para herramientas del sistema y fuentes, usa el gestor de paquetes del sistema operativo disponible (por ejemplo, Homebrew en macOS, apt en Debian/Ubuntu o winget en Windows). - Sigue el flujo de permisos del anfitrión cuando la instalación requiera aprobación. Si el gestor de paquetes o el permiso requerido no está disponible, o la instalación/descarga falla, informa de la dependencia faltante y el paso afectado; no vuelvas a intentar indefinidamente ni afirmes que el paso se completó. Continúa con los pasos independientes cuando sea posible.
- Mantén el flujo de trabajo original y las comprobaciones de calidad. Verifica las fuentes solo cuando la representación las requiera. Los pasos que usan solo texto, herramientas integradas o HTML autocontenido no requieren instalación de paquetes; el acceso a herramientas externas o la autenticación debe manejarse a través del anfitrión, no de un gestor de paquetes.
Convenciones de ruta y entorno de ejecución (leer antes de ejecutar comandos)
- Comando Python: en esta máquina se usa
python(en Windows normalmente no existepython3). Todos los comandos a continuación usaránpythonde forma uniforme. - Ruta de scripts: los scripts de esta skill se encuentran en
AppData/skills/pptx/scripts/(relativo a la raíz del proyecto). Los comandos de scripts en este documento y en editing.md / pptxgenjs.md ya están escritos como rutas absolutas relativas a ese directorio base; se pueden ejecutar directamente desde la raíz del proyecto. - Directorio de trabajo: los comandos asumen que el directorio de trabajo actual es la raíz del proyecto. Si el directorio de trabajo es diferente (por ejemplo,
default_workdirse cambió a otro directorio), reemplazaAppData/skills/pptxcon la ruta absoluta del directorio de la skill. - Node.js: antes de ejecutar
npm/node(necesario para pptxgenjs), añade el directorio de Node.js al PATH según las reglas del proyecto.
PPTX Skill
Referencia rápida
| Tarea | Guía |
|---|---|
| Leer/analizar contenido | python -m markitdown presentacion.pptx |
| Editar o crear desde plantilla | Lee editing.md — QA: validate_layout.py + markitdown |
| Crear desde cero | 1. Planificar contenido → 2. Pre-generar activos → 3. Leer pptxgenjs.md |
| Evitar desbordamiento por diseño | Lee pptxgenjs.md |
| Generar sistema de diseño | python AppData/skills/pptx/scripts/design/search.py "<tema>" --design-system |
| Corrección post-generación | python AppData/skills/pptx/scripts/fix_pptx.py salida.pptx |
| QA de maquetación (crítico primero) | python AppData/skills/pptx/scripts/validate_layout.py presentacion.pptx |
Lectura de contenido
# Extracción de texto
python -m markitdown presentacion.pptx
# XML sin procesar
python AppData/skills/pptx/scripts/unpack.py presentacion.pptx desempaquetado/
Flujo de edición
Lee editing.md para obtener todos los detalles.
- Analiza la plantilla con
markitdown - Desempaqueta + verifica capa de estilo + plan de alineación de Tema y Estilo
- Manipula diapositivas → edita contenido → limpia → empaqueta
- ⚠️ QA de maquetación (puerta obligatoria):
python AppData/skills/pptx/scripts/validate_layout.py salida.pptx --slides <numeros_diapositivas_editadas> - ⚠️ QA de contenido (obligatorio):
python -m markitdown salida.pptx
Creación desde cero
Lee pptxgenjs.md para obtener todos los detalles.
Úsalo cuando no haya disponible una plantilla o presentación de referencia.
Estructura de diapositivas requerida (solo creación desde cero)
Al crear una presentación desde cero, DEBES seguir esta estructura:
- Diapositiva 1: Portada
- Diapositiva 2: Índice (agenda)
- Diapositiva 3 en adelante: Secciones de contenido en el orden exacto listado en la Diapositiva 2
- Diapositiva final: Cierre/página de agradecimiento
No omitas la diapositiva de índice. No coloques diapositivas de contenido antes del índice.
⚠️ No se permiten diapositivas en blanco
Toda diapositiva DEBE contener al menos un elemento visible (addText, addShape, addImage, addChart o addTable) dentro de la diapositiva. Una diapositiva con solo un color de fondo y sin elementos de contenido es un defecto de generación.
Causas comunes de diapositivas en blanco:
- Olvidar añadir contenido a diapositivas de separación de sección / transición
- Truncamiento de tokens a mitad de la generación que deja algunas diapositivas vacías
- Asumir que el diseño o patrón de diapositiva llenará automáticamente el contenido (no lo hará — pptxgenjs crea diseños mínimos sin formas heredadas)
Si tu intención es que una diapositiva sea un separador de sección, DEBES añadir elementos explícitamente — por ejemplo, un número de sección grande, texto de título y/o formas decorativas.
⚠️ OBLIGATORIO: Planificación previa a la generación
Antes de escribir cualquier código, DEBES completar estos pasos de planificación:
⚡ Ruta rápida para solicitudes simples: Cuando el usuario solicite una presentación corta/simple (≤ 6 páginas, un solo tema, sin diagramas complejos), omite el resultado formal de planificación y ve directamente al Paso 3 (escribe código) usando la estructura estándar Portada + Índice + (N-3) Contenido + Cierre. Ruta rápida = sin plan verboso en tu respuesta, solo construye y ejecuta el script.
Paso 1: Generar el plan de diseño de contenido
Presenta un plan estructurado que cubra:
-
Tema y estilo general
- Elección de paleta de colores (consulta la sección "Ideas de diseño")
- Combinación tipográfica
- Motivo visual que se repite en todas las diapositivas
-
Esquema diapositiva por diapositiva
Diapositiva 1: Portada - Tipo de diseño, elementos clave Diapositiva 2: Índice - Lista ordenada de secciones Diapositiva 3: [Sección 1 del índice] - Tipo de diseño, elementos clave, plan de información (si es visual) ... Diapositiva N: Cierre / Gracias - Tipo de diseño, elementos clave ... -
Inventario de elementos visuales
- Enumera todas las imágenes, iconos, gráficos y diagramas necesarios
- Marca cada uno como:
[Integrado](formas/gráficos de pptxgenjs) o[Externo](necesita pre-generación)
Ejemplo de resultado de planificación:
## Plan de presentación
**Tema:** Paleta Océano Gradiente (065A82, 1C7293, 21295C)
**Fuentes:** Georgia (títulos) + Calibri (cuerpo)
**Motivo:** Tarjetas redondeadas con borde de acento izquierdo
### Diapositivas:
1. Portada - Título centrado, fondo degradado
2. Índice - Resumen / Arquitectura / Métricas / Cronología
3. [Sección 1 del índice] - Tipo de diseño, elementos clave, plan de información (si es visual)
...
n. Cierre - Mensaje de cierre + contacto
⚠️ Después de generar tu plan, procede INMEDIATAMENTE al Paso 2 y Paso 3. No replanifiques, no repitas el mismo esquema con variaciones menores. Genera el plan UNA VEZ, luego comienza a escribir código pptxgenjs.
Paso 2: Pre-generar activos externos
Para las figuras marcadas como [Externo], genéralas ANTES de escribir el código pptxgenjs.
⚠️ CRÍTICO: Coherencia de color
Todos los diagramas y gráficos generados DEBEN usar la misma paleta de colores que la presentación. Define los colores al inicio de tu script de generación basándote en el tema elegido.
Opción A: Formas/gráficos nativos primero (predeterminado OBLIGATORIO)
TODOS los diagramas de arquitectura, diagramas de flujo, diagramas de procesos, organigramas y diagramas de relaciones DEBEN construirse con formas nativas de pptxgenjs (RECTANGLE, OVAL, LINE, conectores + addText). Consulta pptxgenjs.md "Construcción de diagramas con formas nativas" para ver patrones y ejemplos.
- Usa una diapositiva de plantilla sólida (proceso, comparación, 2 columnas, cuadrícula de iconos) cuando sea adecuado
- Usa formas nativas de pptxgenjs (cajas/flechas/líneas + texto) para flujos, arquitecturas y jerarquías
- Usa gráficos de pptxgenjs para gráficos de datos simples (barras, circulares, líneas, etc.)
Recurre a matplotlib solo para gráficos estadísticos complejos (mapas de calor, diagramas de dispersión, diagramas de caja) que los gráficos de pptxgenjs no pueden manejar. Recurre a Mermaid solo cuando el diagrama sea demasiado complejo para formas nativas E involucre muchas conexiones cruzadas.
Opción B: Gráficos Matplotlib/Python
Define la paleta de colores al inicio para que coincida con tu tema PPT:
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
# ============================================================
# PALETA DE COLORES - Coincide con tu tema PPT
# ============================================================
# Ejemplo: tema "Océano Gradiente"
COLORES = {
'primario': '#065A82',
'secundario': '#1C7293',
'acento': '#21295C',
'fondo': '#F0F7FA',
'texto': '#21295C',
'claro': '#E8F4F8',
}
# Ciclo de colores para múltiples series de datos
CICLO_COLORES = [COLORES['primario'], COLORES['secundario'], COLORES['acento'], '#4A90A4', '#2D5A6B']
# Aplica el tema globalmente
plt.rcParams.update({
'axes.prop_cycle': plt.cycler(color=CICLO_COLORES),
'axes.facecolor': 'none',
'axes.edgecolor': COLORES['texto'],
'axes.labelcolor': COLORES['texto'],
'text.color': COLORES['texto'],
'xtick.color': COLORES['texto'],
'ytick.color': COLORES['texto'],
'figure.facecolor': 'none',
'font.family': 'sans-serif',
'font.size': 12,
})
# ============================================================
# Crea gráfico con colores del tema
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
barras = ax.bar(['T1', 'T2', 'T3', 'T4'], [25, 40, 35, 50],
color=[COLORES['primario'], COLORES['secundario'], COLORES['primario'], COLORES['secundario']],
edgecolor=COLORES['acento'], linewidth=1.5)
ax.set_title('Ingresos Trimestrales', fontsize=16, fontweight='bold', color=COLORES['texto'])
ax.set_ylabel('Ingresos ($M)', color=COLORES['texto'])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.tight_layout()
ancho_px, alto_px = int(8 * 150), int(5 * 150)
plt.savefig(f'grafico_{ancho_px}x{alto_px}.png', dpi=150, transparent=True)
plt.close()
Plantillas de paleta Matplotlib:
# Ejecutivo Nocturno
COLORES = {'primario': '#1E2761', 'secundario': '#CADCFC', 'acento': '#FFFFFF', 'texto': '#1E2761'}
# Bosque y Musgo
COLORES = {'primario': '#2C5F2D', 'secundario': '#97BC62', 'acento': '#F5F5F5', 'texto': '#2C5F2D'}
# Energía Coral
COLORES = {'primario': '#F96167', 'secundario': '#F9E795', 'acento': '#2F3C7E', 'texto': '#2F3C7E'}
# Terracota Cálido
COLORES = {'primario': '#B85042', 'secundario': '#E7E8D1', 'acento': '#A7BEAE', 'texto': '#B85042'}
# Confianza Turquesa
COLORES = {'primario': '#028090', 'secundario': '#00A896', 'acento': '#02C39A', 'texto': '#028090'}
Úsalo para:
- Gráficos estadísticos complejos (barras, líneas, circulares, dispersión, radar, etc.)
- Visualizaciones personalizadas no compatibles con pptxgenjs
- Mapas de calor, diagramas de dispersión, diagramas de caja
⚠️ NO uses matplotlib para:
- Diagramas de arquitectura
- Diagramas de flujo / diagramas de procesos
- Organigramas / diagramas jerárquicos
- Diagramas de topología de red
- Cualquier diagrama que muestre principalmente relaciones entre componentes
Estos DEBEN construirse con formas nativas de pptxgenjs para que se representen como objetos PPT editables, no como imágenes rasterizadas.
matplotlib - Gráficos con soporte CJK
Al crear gráficos con matplotlib que incluyan texto en chino, DEBES configurar la fuente:
import os
import platform
import matplotlib.pyplot as plt
import matplotlib
def configurar_matplotlib_cjk():
"""Configura matplotlib para soportar caracteres CJK"""
sistema = platform.system()
if sistema == "Darwin": # macOS
nombres_fuentes = ['Arial Unicode MS', 'PingFang SC', 'Heiti SC', 'STHeiti']
elif sistema == "Windows":
nombres_fuentes = ['Microsoft YaHei', 'SimHei', 'SimSun']
else: # Linux
nombres_fuentes = ['Noto Sans CJK SC', 'WenQuanYi Zen Hei', 'Droid Sans Fallback']
# Encuentra fuente disponible
fuentes_disponibles = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
for nombre_fuente in nombres_fuentes:
if nombre_fuente in fuentes_disponibles:
plt.rcParams['font.sans-serif'] = [nombre_fuente] + plt.rcParams['font.sans-serif']
plt.rcParams['axes.unicode_minus'] = False # Corrige visualización del signo menos
return nombre_fuente
return None
# Configurar fuente CJK antes de crear gráficos
fuente_cjk = configurar_matplotlib_cjk()
# Crear un gráfico de barras con etiquetas en chino
categorias = ['第一季度', '第二季度', '第三季度', '第四季度']
valores = [120, 135, 142, 158]
plt.figure(figsize=(10, 6))
plt.bar(categorias, valores, color='steelblue')
plt.title('季度销售数据 Ventas Trimestrales', fontsize=16)
plt.xlabel('季度 Trimestre', fontsize=12)
plt.ylabel('销售额 Ventas', fontsize=12)
plt.tight_layout()
plt.savefig('grafico.png', dpi=150)
plt.close()
Opción C: Búsqueda web de imágenes
Busca imágenes relevantes cuando:
- Se necesiten fotos de stock o ilustraciones
- Se requieran iconos o logotipos
- Imágenes de referencia para conceptos
Opción D: Diagramas Mermaid (último recurso)
Úsalo solo cuando el diagrama no pueda representarse limpiamente con formas/diseños nativos, y mantenlo coherente con la presentación:
# Instalar si es necesario: npm install -g @mermaid-js/mermaid-cli
Crea un archivo de configuración de tema que coincida con tu paleta PPT:
// mermaid-config.json - Ejemplo para tema "Océano Gradiente"
{
"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 > diagram.mmd << 'EOF'
graph LR
A[Cliente] --> B[Puerta de enlace API]
B --> C[Servicio A]
B --> D[Servicio B]
EOF
# Prefiere exportación de alta resolución para uso en PPT
mmdc -i diagram.mmd -o diagram.png -c mermaid-config.json -b white -w 1600 --scale 2
Paso 3: Convención de nombres de imágenes (OBLIGATORIO)
Todas las imágenes generadas DEBEN incluir las dimensiones en el nombre del archivo:
{nombre}_{ancho}x{alto}.png
Ejemplos:
arquitectura_800x600.png- 800px de ancho, 600px de altocronologia_1200x400.png- 1200px de ancho, 400px de altografico_600x600.png- 600px cuadrado
Al guardar imágenes, incluye siempre las dimensiones:
# Ejemplo Matplotlib
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
# ... crea el gráfico ...
ancho_px = int(8 * 150) # 1200
alto_px = int(5 * 150) # 750
plt.savefig(f'grafico_{ancho_px}x{alto_px}.png', dpi=150, transparent=True)
# Generi
...
[truncado para traducción]