Communitygithub.com

Windy-X211/pptx

PowerPoint(.pptx)プレゼンテーションの作成、編集、分析を行います。新規作成(pptxgenjs)、テンプレート編集(OOXMLの展開/編集/パッケージ化)、コンテンツとレイアウトの品質保証をカバーします。

pptx とは?

このスキルは、PowerPoint(.pptx)プレゼンテーションをプログラムで作成、編集、分析するための包括的なツールです。新規作成にはpptxgenjsライブラリを使用し、テンプレート編集ではOOXMLを展開・編集・再パッケージ化する高度なワークフローを提供します。また、マークダウン変換によるコンテンツ抽出、レイアウト検証、画像生成(MatplotlibやMermaid対応)など、品質保証のための複数のチェックポイントが組み込まれています。主にAIエージェント(Claude Code、Cursorなど)向けに設計されており、ユーザーが「PPTを作って」「スライドを編集して」などの自然言語リクエストをした際に自動的にロードされます。このスキルは依存関係の段階的なインストールをサポートし、Python、Node.js両方の環境で動作します。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Windy-X211/AgentCluster-Market/tree/HEAD/skills/pptx

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

段階的な実行と依存関係

  1. このスキルのワークフローは順序に従って実行してください。各ステップでライブラリ、コマンドラインツール、ランタイム、フォントを使用する前に、そのステップに必要な依存関係のみを確認し、事前にインストールされていると想定しないでください。
  2. 利用可能な依存関係は再利用してください。不足しているものがあれば、その依存関係のみを現在のOSと利用可能なパッケージマネージャーを使用してインストールし、検証後に元のステップを再試行してください。依存関係リスト全体を事前にインストールしないでください。
  3. アクティブなPython環境を使用し(python -m pip install <package> または対応する python)、必要に応じてタスクローカルな仮想環境を作成してください。Node.jsライブラリはタスクプロジェクト内にインストールし(npm install <package>)、スクリプトが解決できるようにしてください。システムツールやフォントには、利用可能なOSパッケージマネージャー(例:macOSではHomebrew、Debian/Ubuntuではapt、Windowsではwinget)を使用してください。
  4. インストールに承認が必要な場合は、ホストの許可フローに従ってください。パッケージマネージャーや必要な権限が利用できない場合、またはインストール/ダウンロードが失敗した場合は、不足している依存関係と影響を受けるステップを報告し、無期限に再試行したり、ステップが成功したと主張しないでください。独立したステップは可能な限り続行してください。
  5. 元のワークフローと品質チェックを維持してください。フォントはレンダリングに必要な場合のみ確認してください。テキスト、組み込みツール、自己完結型のHTMLのみを使用するステップはパッケージインストールを必要としません。外部ツールへのアクセスや認証は、パッケージマネージャーではなく、ホストを介して処理する必要があります。

パスと実行環境の约定(コマンド実行前に必読)

  • Python コマンド:このマシンでは python を使用します(Windows には python3 は通常ありません)。以下のすべてのコマンドは統一して python を使用します。
  • スクリプトパス:このスキルのスクリプトは AppData/skills/pptx/scripts/ にあります(プロジェクトルートからの相対パス)。以下および editing.md / pptxgenjs.md 内のスクリプトコマンドは、すべてこのベースディレクトリからの絶対相対パスで記述されているため、プロジェクトルートから直接実行できます。
  • 作業ディレクトリ:コマンドは現在の作業ディレクトリがプロジェクトルートであることを前提としています。作業ディレクトリが異なる場合(例:default_workdir が別のディレクトリに変更されている場合)、AppData/skills/pptx をスキルディレクトリの絶対パスに置き換えてください。
  • Node.js:npm/node(pptxgenjs が必要とする)を実行する前に、プロジェクトのルールに従って Node.js ディレクトリを PATH に追加してください。

PPTX スキル

クイックリファレンス

タスクガイド
コンテンツの読み取り/分析python -m markitdown presentation.pptx
テンプレートからの編集または作成editing.md を参照 — QA:validate_layout.py + markitdown
ゼロからの作成1. コンテンツ計画 → 2. アセットの事前生成 → 3. pptxgenjs.md を参照
デザインによるオーバーフローの防止pptxgenjs.md を参照
デザインシステムの生成python AppData/skills/pptx/scripts/design/search.py "<topic>" --design-system
生成後の修正python AppData/skills/pptx/scripts/fix_pptx.py output.pptx
レイアウトQA(最初に重要)python AppData/skills/pptx/scripts/validate_layout.py presentation.pptx

コンテンツの読み取り

# テキスト抽出
python -m markitdown presentation.pptx

# 生XML
python AppData/skills/pptx/scripts/unpack.py presentation.pptx unpacked/

編集ワークフロー

詳細は editing.md を参照してください。

  1. markitdown でテンプレートを分析
  2. 展開 + スタイルレイヤーチェック + テーマ&スタイルの調整計画
  3. スライド操作 → コンテンツ編集 → クリーンアップ → パッケージ化
  4. ⚠️ レイアウトQA(必須ゲート):python AppData/skills/pptx/scripts/validate_layout.py output.pptx --slides <編集したスライド番号>
  5. ⚠️ コンテンツQA(必須):python -m markitdown output.pptx

ゼロからの作成

詳細は pptxgenjs.md を参照してください。

テンプレートや参照用プレゼンテーションが利用できない場合に使用します。

必須スライド構成(ゼロからの作成時のみ)

プレゼンテーションをゼロから作成する場合、以下の構成に従う必要があります。

  1. スライド1:表紙ページ
  2. スライド2:目次(アジェンダ)
  3. スライド3以降:スライド2に記載された順序通りのコンテンツセクション
  4. 最終スライド:クロージング/お礼ページ

目次スライドを省略しないでください。目次の前にコンテンツスライドを配置しないでください。

⚠️ 空白スライド禁止

すべてのスライドには、スライド内に少なくとも1つの表示要素(addText、addShape、addImage、addChart、または addTable)が含まれている必要があります。背景色のみでコンテンツ要素がないスライドは生成不良です。

空白スライドの一般的な原因:

  • セクション区切り/トランジションスライドへのコンテンツ追加を忘れる
  • 生成途中のトークン切り捨てにより一部のスライドが空になる
  • スライドレイアウトやマスターがコンテンツを自動入力すると想定している(実際にはそうならない — pptxgenjs は継承されたシェイプのない最小限のレイアウトを作成します)

スライドをセクション区切りとして意図する場合でも、大きなセクション番号、タイトルテキスト、装飾シェイプなどの要素を明示的に追加する必要があります。


⚠️ 必須:生成前計画

コードを記述する前に、以下の計画ステップを完了する必要があります。

⚡ 簡易リクエストのクイックパス: ユーザーが短い/簡単なデッキ(6ページ以下、単一トピック、複雑な図なし)を要求した場合、正式な計画出力をスキップし、標準の 表紙 + 目次 + (N-3) コンテンツ + クロージング 構成を使用して、ステップ3(コード作成)に直接進んでください。クイックパス = 応答本文に詳細な計画を含めず、スクリプトを構築して実行するだけです。

ステップ1:コンテンツデザイン計画の出力

以下の内容をカバーする構造化計画を提示します。

  1. 全体テーマとスタイル

    • カラーパレットの選択(「デザインアイデア」セクションを参照)
    • タイポグラフィの組み合わせ
    • スライド全体で一貫するビジュアルモチーフ
  2. スライドごとの概要

    スライド1:表紙 - レイアウトタイプ、主要要素
    スライド2:目次 - 順序付きセクションリスト
    スライド3:[目次のセクション1] - レイアウトタイプ、主要要素、インサイト計画(ビジュアルの場合)
    ...
    スライドN:クロージング/ありがとう - レイアウトタイプ、主要要素
    ...
    
  3. ビジュアル要素インベントリ

    • 必要なすべての画像、アイコン、チャート、図をリストアップ
    • それぞれを [組み込み](pptxgenjs のシェイプ/チャート)または [外部](事前生成が必要)としてマーク

計画出力例:

## プレゼンテーション計画

**テーマ:** オーシャングラデーション パレット(065A82, 1C7293, 21295C)
**フォント:** Georgia(見出し)+ Calibri(本文)
**モチーフ:** 左アクセントボーダー付きの角丸カード

### スライド:
1. 表紙スライド - 中央揃えタイトル、グラデーション背景
2. 目次 - 概要 / アーキテクチャ / メトリクス / タイムライン
3. [目次のセクション1] - レイアウトタイプ、主要要素、インサイト計画(ビジュアルの場合)
...
n. ありがとう - クロージングステートメント + 連絡先

⚠️ 計画を出力したら、すぐにステップ2とステップ3に進みます。再計画したり、同じ概要を微妙なバリエーションで言い換えたりしないでください。計画はONCEだけ出力し、その後 pptxgenjs コードの作成を開始します。

ステップ2:外部アセットの事前生成

[外部] とマークされた図については、pptxgenjs コードを作成する前に生成します。

⚠️ 重要:色の一貫性

生成されるすべての図やチャートは、プレゼンテーションと同じカラーパレットを使用する必要があります。選択したテーマに基づき、生成スクリプトの先頭で色を定義します。

オプションA:ネイティブシェイプ/チャートを優先(必須デフォルト)

すべてのアーキテクチャ図、フローチャート、プロセス図、組織図、関係図は、pptxgenjs のネイティブシェイプ(RECTANGLE、OVAL、LINE、コネクタ + addText)で構築する必要があります。パターンと例については、pptxgenjs.md の「ネイティブシェイプによる図の構築」を参照してください。

  • テンプレートスライド(プロセス、比較、2カラム、アイコングリッド)が適している場合はそれを使用
  • フロー、アーキテクチャ、階層には pptxgenjs ネイティブシェイプ(ボックス/矢印/ライン + テキスト)を使用
  • 単純なデータチャート(棒、円、折れ線など)には pptxgenjs チャートを使用

複雑な統計チャート(ヒートマップ、散布図、箱ひげ図)で pptxgenjs チャートが処理できない場合にのみ、matplotlib にフォールバックします。 図がネイティブシェイプには複雑すぎて、かつ多数のクロスリンクを含む場合にのみ、Mermaid にフォールバックします。

オプションB:Matplotlib/Python チャート

PPTテーマに合わせて、最初にカラーパレットを定義します。

import matplotlib.pyplot as plt
import matplotlib.colors as mcolors

# ============================================================
# カラーパレット - PPTテーマに合わせる
# ============================================================
# 例:「オーシャングラデーション」テーマ
COLORS = {
    'primary': '#065A82',
    'secondary': '#1C7293',
    'accent': '#21295C',
    'background': '#F0F7FA',
    'text': '#21295C',
    'light': '#E8F4F8',
}

# 複数データ系列のカラーサイクル
COLOR_CYCLE = [COLORS['primary'], COLORS['secondary'], COLORS['accent'], '#4A90A4', '#2D5A6B']

# テーマをグローバルに適用
plt.rcParams.update({
    'axes.prop_cycle': plt.cycler(color=COLOR_CYCLE),
    'axes.facecolor': 'none',
    'axes.edgecolor': COLORS['text'],
    'axes.labelcolor': COLORS['text'],
    'text.color': COLORS['text'],
    'xtick.color': COLORS['text'],
    'ytick.color': COLORS['text'],
    'figure.facecolor': 'none',
    'font.family': 'sans-serif',
    'font.size': 12,
})
# ============================================================

# テーマカラーでチャート作成
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
bars = ax.bar(['Q1', 'Q2', 'Q3', 'Q4'], [25, 40, 35, 50],
              color=[COLORS['primary'], COLORS['secondary'], COLORS['primary'], COLORS['secondary']],
              edgecolor=COLORS['accent'], linewidth=1.5)
ax.set_title('四半期収益', fontsize=16, fontweight='bold', color=COLORS['text'])
ax.set_ylabel('収益(百万$)', color=COLORS['text'])
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

plt.tight_layout()
width_px, height_px = int(8 * 150), int(5 * 150)
plt.savefig(f'chart_{width_px}x{height_px}.png', dpi=150, transparent=True)
plt.close()

Matplotlib パレットテンプレート:

# ミッドナイト エグゼクティブ
COLORS = {'primary': '#1E2761', 'secondary': '#CADCFC', 'accent': '#FFFFFF', 'text': '#1E2761'}

# フォレスト&モス
COLORS = {'primary': '#2C5F2D', 'secondary': '#97BC62', 'accent': '#F5F5F5', 'text': '#2C5F2D'}

# コーラル エナジー
COLORS = {'primary': '#F96167', 'secondary': '#F9E795', 'accent': '#2F3C7E', 'text': '#2F3C7E'}

# ウォーム テラコッタ
COLORS = {'primary': '#B85042', 'secondary': '#E7E8D1', 'accent': '#A7BEAE', 'text': '#B85042'}

# ティール トラスト
COLORS = {'primary': '#028090', 'secondary': '#00A896', 'accent': '#02C39A', 'text': '#028090'}

用途:

  • 複雑な統計チャート(棒、折れ線、円、散布、レーダーなど)
  • pptxgenjs がサポートしていないカスタムビジュアライゼーション
  • ヒートマップ、散布図、箱ひげ図

⚠️ matplotlib を以下の用途に使用しないでください:

  • アーキテクチャ図
  • フローチャート / プロセス図
  • 組織図 / 階層図
  • ネットワークトポロジ図
  • コンポーネント間の関係を主に示す図

これらは pptxgenjs のネイティブシェイプで構築し、編集可能なPPTオブジェクトとしてレンダリングされる必要があります(ラスター画像ではありません)。

matplotlib - CJKサポート付きチャート

中国語テキストを含む matplotlib チャート/グラフを作成する場合は、フォントを設定する必要があります。

import os
import platform
import matplotlib.pyplot as plt
import matplotlib

def setup_matplotlib_cjk():
    """CJK文字をサポートするように matplotlib を設定"""
    system = platform.system()

    if system == "Darwin":  # macOS
        font_names = ['Arial Unicode MS', 'PingFang SC', 'Heiti SC', 'STHeiti']
    elif system == "Windows":
        font_names = ['Microsoft YaHei', 'SimHei', 'SimSun']
    else:  # Linux
        font_names = ['Noto Sans CJK SC', 'WenQuanYi Zen Hei', 'Droid Sans Fallback']

    # 利用可能なフォントを検索
    available_fonts = [f.name for f in matplotlib.font_manager.fontManager.ttflist]
    for font_name in font_names:
        if font_name in available_fonts:
            plt.rcParams['font.sans-serif'] = [font_name] + plt.rcParams['font.sans-serif']
            plt.rcParams['axes.unicode_minus'] = False  # マイナス記号の表示を修正
            return font_name
    return None

# チャート作成前にCJKフォントを設定
cjk_font = setup_matplotlib_cjk()

# 中国語ラベル付き棒グラフを作成
categories = ['第一季度', '第二季度', '第三季度', '第四季度']
values = [120, 135, 142, 158]

plt.figure(figsize=(10, 6))
plt.bar(categories, values, color='steelblue')
plt.title('四半期販売データ Quarterly Sales', fontsize=16)
plt.xlabel('四半期 Quarter', fontsize=12)
plt.ylabel('売上 Sales', fontsize=12)
plt.tight_layout()
plt.savefig('chart.png', dpi=150)
plt.close()

オプションC:画像のウェブ検索

以下の場合に関連画像を検索します:
- ストックフォトやイラストが必要な場合
- アイコンやロゴが必要な場合
- コンセプトの参照画像が必要な場合

オプションD:Mermaid 図(最終手段)

図がネイティブシェイプ/レイアウトでクリーンに表現できない場合にのみ使用し、デッキと一貫性を保ちます。

# 必要に応じてインストール:npm install -g @mermaid-js/mermaid-cli

PPTパレットに合わせたテーマ設定ファイルを作成します。

// mermaid-config.json - 「オーシャングラデーション」テーマの例
{
  "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[クライアント] --> B[APIゲートウェイ]
    B --> C[サービスA]
    B --> D[サービスB]
EOF

# PPT使用には高解像度エクスポートを推奨
mmdc -i diagram.mmd -o diagram.png -c mermaid-config.json -b white -w 1600 --scale 2

ステップ3:画像命名規則(必須)

生成されるすべての画像は、ファイル名に寸法を含める必要があります。

{name}_{width}x{height}.png

例:

  • architecture_800x600.png - 幅800px、高さ600px
  • timeline_1200x400.png - 幅1200px、高さ400px
  • chart_600x600.png - 600pxの正方形

画像を保存する際は、常に寸法を含めてください。

# Matplotlib の例
fig, ax = plt.subplots(figsize=(8, 5), dpi=150)
# ... チャートを作成 ...
width_px = int(8 * 150)   # 1200
height_px = int(5 * 150)  # 750
plt.savefig(f'chart_{width_px}x{height_px}.png', dpi=150, transparent=True)
# 一般的な画像生成コマンド(該当する場合)
# ```
# ...
# filename="diagram_1600x900.png"
# ...
# ```

関連スキル