mcpField
P
ppt-editing-skill

ppt-editing-skill

github.com/minimax-aiドキュメント13.7k73 回インストール28 週間前に更新
リポジトリ

ppt-editing-skill について

テンプレートを使ってPowerPointプレゼンテーションを編集するスキルです。既存のデッキを改変する人向けに、構成変更、XMLの内容編集、パッケージ化、検証の手順を示します。

主な機能

  1. 01テンプレート分析とスライド割り当て
  2. 02スライドの追加・削除・並べ替え
  3. 03スライドXMLの内容編集
  4. 04プレゼンテーションの整理とパッケージ化
  5. 05内容と書式の確認

活用シーン

  1. 01既存デッキを新しい内容に合わせて編集
  2. 02テンプレートのスライド順変更や削除
  3. 03プレースホルダーの置換と出力の検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/minimax-ai/skills --skill ppt-editing-skill

インストール後、Claude Code で/ppt-editing-skillを入力して読み込まれたか確認します。

詳細

プレゼンテーションの編集

テンプレートベースのワークフロー

既存のプレゼンテーションをテンプレートとして使用する場合:

  1. コピーして分析する:

    cp /path/to/user-provided.pptx template.pptx
    python -m markitdown template.pptx > template.md
    

    template.md を確認し、プレースホルダーテキストとスライド構成を把握します。

  2. スライドの割り当てを計画する:各コンテンツセクションに、テンプレートのスライドを選びます。

    ⚠️ レイアウトに変化をつける — 単調なプレゼンテーションはよくある失敗例です。基本的なタイトル+箇条書きのスライドばかりにしないでください。次のようなレイアウトを積極的に検討してください。

    • 複数列のレイアウト(2列、3列)
    • 画像+テキストの組み合わせ
    • テキストを重ねた全面画像
    • 引用やコールアウトのスライド
    • セクション区切り
    • 統計値や数値を強調するコールアウト
    • アイコンのグリッド、またはアイコン+テキストの行

    避けること: すべてのスライドで、同じテキスト中心のレイアウトを繰り返すこと。

    コンテンツの種類に合わせてレイアウトのスタイルを選びます(例:重要なポイント → 箇条書きのスライド、チーム情報 → 複数列のレイアウト、推薦の声 → 引用のスライド)。

  3. 展開する

  4. プレゼンテーションを構築する(サブエージェントではなく、自分で行ってください):

    • 不要なスライドを削除する(<p:sldIdLst> から削除)
    • 再利用するスライドを複製する(add_slide.py)
    • <p:sldIdLst> 内でスライドの順序を変更する
    • 手順5の前に、構造の変更をすべて完了する
  5. コンテンツを編集する:各 slide{N}.xml のテキストを更新します。 利用可能であれば、ここでサブエージェントを使用してください — スライドは個別の XML ファイルなので、サブエージェントで並行して編集できます。

  6. クリーンアップする

  7. パッケージ化する

出力構成

ユーザーから提供されたファイルを、作業ディレクトリ内の template.pptx にコピーします。これにより元のファイルが保持され、後続のすべてのスクリプトで予測可能な名前を使用できます。

cp /path/to/user-provided.pptx template.pptx
./
├── template.pptx               # Copy of user-provided file (never modified)
├── template.md                 # markitdown extraction
├── unpacked/                   # Editable XML tree
└── edited.pptx                 # Final repacked deck

最低限必要な成果物:edited.pptx。


スクリプト

スクリプト目的
unpack.pyPPTX を展開して整形する
add_slide.pyスライドを複製する、またはレイアウトから作成する
clean.py孤立したファイルを削除する
pack.py検証して再パッケージ化する

<p:sldIdLst> に含まれないスライド、参照されていないメディア、孤立したリレーションシップを削除します。

必ず最初に /tmp/ に書き込み、その後、最終パスにコピーしてください。Python の zipfile モジュールは内部で seek を使用しますが、一部のボリュームマウント(例:Docker のバインドマウント)では失敗します。ローカルの一時パスに書き込むことで、この問題を回避できます。

検証、修復、XML の圧縮、スマートクォートの再エンコードを行います。


スライドの操作

スライドの順序は ppt/presentation.xml → <p:sldIdLst> に記載されています。

順序の変更:<p:sldId> 要素を並べ替えます。

削除:<p:sldId> を削除し、その後 clean.py を実行します。

追加:add_slide.py を使用します。スライドファイルを手動でコピーしてはいけません。このスクリプトは、手動コピーでは漏れてしまうノートの参照、Content_Types.xml、リレーションシップ ID を処理します。


コンテンツの編集

サブエージェント: 利用可能であれば、ここで(手順4を完了した後に)使用してください。各スライドは個別の XML ファイルなので、サブエージェントで並行して編集できます。サブエージェントへのプロンプトには、以下を含めてください。

  • 編集するスライドのファイルパス
  • 「すべての変更に Edit ツールを使用する」
  • 以下の書式ルールとよくある落とし穴

各スライドについて:

  1. スライドの XML を読み取る
  2. すべてのプレースホルダーコンテンツ(テキスト、画像、グラフ、アイコン、キャプション)を特定する
  3. 各プレースホルダーを最終コンテンツに置き換える

sed や Python スクリプトではなく、Edit ツールを使用してください。 Edit ツールを使用すると、何をどこで置き換えるかを明確に指定できるため、信頼性が高まります。

書式ルール
  • すべてのヘッダー、小見出し、インラインラベルを太字にする:<a:rPr> に b="1" を使用します。以下が含まれます。
    • スライドのタイトル
    • スライド内のセクションヘッダー
    • 行頭のインラインラベル(例:「Status:」、「Description:」)
  • Unicode の箇条書き(•)は使用しない:<a:buChar> または <a:buAutoNum> を使って、正しいリスト書式を指定します。
  • 箇条書きの一貫性:箇条書きはレイアウトから継承させます。<a:buChar> または <a:buNone> のみを指定してください。

よくある落とし穴

テンプレートの調整

ソースコンテンツの項目数がテンプレートより少ない場合:

  • 余分な要素は完全に削除します(画像、図形、テキストボックス)。テキストを消去するだけにしないでください
  • テキストを消去した後、不要なビジュアル要素が残っていないか確認します
  • markitdown でコンテンツの QA を実行し、項目数の不一致を検出します

テキストを異なる長さのコンテンツに置き換える場合:

  • 短い置き換え:通常は問題ありません
  • 長い置き換え:はみ出したり、予期せず折り返されたりする可能性があります
  • テキストを変更した後、markitdown で確認します
  • テンプレートのデザイン上の制約に収まるよう、コンテンツを短縮するか、分割することを検討します

テンプレートのスロット数 ≠ ソースの項目数:テンプレートにチームメンバーが 4 人分あり、ソースのユーザーが 3 人の場合は、4 人目のメンバーのグループ全体(画像+テキストボックス)を削除します。テキストだけを削除しないでください。

複数項目のコンテンツ

ソースに複数の項目(番号付きリスト、複数のセクションなど)がある場合は、項目ごとに個別の <a:p> 要素を作成します。決して 1 つの文字列に連結しないでください。

❌ 誤り — すべての項目を 1 つの段落にまとめる:

<a:p>
  <a:r><a:rPr .../><a:t>Step 1: Do the first thing. Step 2: Do the second thing.</a:t></a:r>
</a:p>

✅ 正しい — 太字の見出しを付けて段落を分ける:

<a:p>
  <a:pPr algn="l"><a:lnSpc><a:spcPts val="3919"/></a:lnSpc></a:pPr>
  <a:r><a:rPr lang="en-US" sz="2799" b="1" .../><a:t>Step 1</a:t></a:r>
</a:p>
<a:p>
  <a:pPr algn="l"><a:lnSpc><a:spcPts val="3919"/></a:lnSpc></a:pPr>
  <a:r><a:rPr lang="en-US" sz="2799" .../><a:t>Do the first thing.</a:t></a:r>
</a:p>
<a:p>
  <a:pPr algn="l"><a:lnSpc><a:spcPts val="3919"/></a:lnSpc></a:pPr>
  <a:r><a:rPr lang="en-US" sz="2799" b="1" .../><a:t>Step 2</a:t></a:r>
</a:p>

行間を維持するため、元の段落から <a:pPr> をコピーします。見出しには b="1" を使用します。

スマートクォート

unpack/pack で自動的に処理されます。ただし、Edit ツールはスマートクォートを ASCII に変換します。

引用符を含む新しいテキストを追加する場合は、XML エンティティを使用します:

<a:t>the &#x201C;Agreement&#x201D;</a:t>
文字名前UnicodeXML エンティティ
"左二重引用符U+201C&#x201C;
"右二重引用符U+201D&#x201D;
'左一重引用符U+2018&#x2018;
'右一重引用符U+2019&#x2019;
その他
  • 空白:先頭または末尾に空白がある <a:t> には xml:space="preserve" を使用します
  • XML の解析:xml.etree.ElementTree(名前空間を破損します)ではなく、defusedxml.minidom を使用します

コメント