mcpField
P
pptx

pptx

github.com/panaversityドキュメント60 回インストール
リポジトリ

pptx について

pptx は、PowerPoint ファイルの作成、編集、分析を行うスキルです。原資料への忠実さ、筋の通った構成、網羅性の確認、意味面のレビューを重視し、テキスト抽出とプレゼン作成の手順を備えています。

主な機能

  1. 01PPTX の作成・編集・分析
  2. 02プレゼンのテキストを Markdown に抽出
  3. 03プレゼンの XML と素材を確認
  4. 04スライドの構成と網羅性を計画
  5. 05一貫性と事実への忠実さを確認

活用シーン

  1. 01原資料に基づくプレゼンの作成
  2. 02スライドの文章、ノート、デザイン情報の確認
  3. 03納品前の学習内容の網羅性確認

インストール

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

$npx skills add https://github.com/panaversity/agentfactory --skill pptx

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

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

LICENSE.txt
html2pptx.md
ooxml.md
ooxml/schemas/ISO-IEC29500-4_2016/
dml-chart.xsd
dml-chartDrawing.xsd
dml-diagram.xsd
dml-lockedCanvas.xsd
dml-main.xsd
dml-picture.xsd
dml-spreadsheetDrawing.xsd
dml-wordprocessingDrawing.xsd
pml.xsd
shared-additionalCharacteristics.xsd
shared-bibliography.xsd
shared-commonSimpleTypes.xsd
shared-customXmlDataProperties.xsd
shared-customXmlSchemaProperties.xsd
shared-documentPropertiesCustom.xsd
shared-documentPropertiesExtended.xsd
shared-documentPropertiesVariantTypes.xsd
shared-math.xsd
shared-relationshipReference.xsd
sml.xsd
vml-main.xsd
vml-officeDrawing.xsd
vml-presentationDrawing.xsd
vml-spreadsheetDrawing.xsd
vml-wordprocessingDrawing.xsd
wml.xsd
xml.xsd

詳細

PPTX の作成、編集、分析

運用契約(最初にお読みください — 必須事項)

このスキルでは、見栄えのよいスライドを作成する前に、一貫性のあるストーリーと忠実な内容の網羅を実現する必要があります。この SKILL.md の各セクション間に矛盾がある場合は、このセクションのルールを優先します。

1. 忠実性:事実を捏造しない
  • 元資料にそのまま記載されていない限り、指標、統計、ARR、価格、導入数を記載しないでください
  • 説明のために数値が必要な場合は、スピーカーノートに「例:約$X(プレースホルダー)」と明記してください
  • 事実が元資料に記載されているか確信が持てない場合は、省略してください
2. 範囲の固定:章の内容から逸脱しない

プレゼンテーションでは、その章の学習目標だけを扱います。それ以外の内容は扱いません。

禁止トピック(章の内容に明示的に含まれている場合を除く):

  • ビジネスモデル、価格戦略
  • ARR、MAU、収益予測
  • 「今すぐ販売する」、「収益化する」、市場規模の算定
  • 「Digital FTE Economics」の計算
  • 競合状況の分析

スライドが禁止トピックに逸脱した場合は、削除するか書き直してください。

3. 物語の軸は1つ(話題を行ったり来たりしない)

軸を1つ選び、最後まで一貫させてください。

軸の種類流れ
解説の軸問題 → 概念 → 仕組み → ワークフロー → 例 → 落とし穴 → まとめ → 次のステップ
章の軸導入 → 学習目標 → レッスンごと(概念 → 例 → 実践)→ まとめ → CTA

ルール:

  • すべてのスライドを、軸のステップ1つだけに対応させてください
  • A→B→Aのように話題を戻さないでください(トピックAを扱った後、後のスライドで再びAに戻らないでください)
  • 軸に合わないスライドは、削除するか、適切なステップに分割してください
4. 網羅性の要件

PPTX ファイルを生成する前に、以下の成果物を必ず用意してください。

成果物目的
workspace/content-audit.mdレッスンごとの調査メモ(既存)
workspace/slide-outline.md結論をタイトルにしたストーリーボード(既存)
workspace/coverage-matrix.md各レッスン/目標を1枚以上のスライドに対応付ける
workspace/semantic-qa.md最終的な一貫性チェックリスト

網羅性のルール:

  • すべてのレッスンを、少なくとも1枚のスライドで扱ってください
  • すべての学習目標に対応してください
  • すべてを網羅できない場合は、内容を縮めず、スライドを追加してください
  • 省略する場合は、その理由を coverage-matrix.md に明記してください
5. セマンティック QA のゲート(納品前に必ず合格すること)

最終プレゼンテーションを生成する前に、以下のチェックリストを使って workspace/semantic-qa.md を完成させてください。

  • スライドの順序が選択した軸に沿っている(A→B→Aのような話題の行き戻りがない)
  • すべてのスライドに、アウトラインに沿った明確な要点が1つある
  • 承認済みのアウトラインにない新しいトピックを持ち込んでいない
  • すべての用語を、使う前に導入している
  • 事実、指標、主張を捏造していない
  • 禁止トピックを含んでいない(セクション2を参照)
  • coverage-matrix でレッスンの網羅率が100%になっている

チェック項目に1つでも不合格がある場合は、修正して再生成してください。不合格のプレゼンテーションを納品してはいけません。

6. 内容の調整方針

内容が1枚のスライドに収まらない場合は、次の順で対応してください。

  1. スライドを分割して枚数を増やす(推奨)
  2. 詳細をスピーカーノートに移す
  3. テキストを図やビジュアルに置き換える
  4. それでも難しい場合に限り、表現を簡潔にする
  5. MIT のタイポグラフィ最小基準(本文24pt、タイトル40pt)を下回るサイズにテキストを縮小しないでください
7. 単独で成立する構成(デフォルト)

明示的に別の指定がない限り、プレゼンテーションは単独で成立する内容にしてください。

  • ❌ 誤り:「第5章:Claude Code の機能」(書籍を前提としている)
  • ✅ 正しい:「Claude Code:汎用エージェント」(どのような聴衆にも通用する)

ルール:

  • タイトルに章、セクション、レッスンの番号を入れないでください
  • 「レッスンXで説明したように」といった言及は避けてください
  • 元資料を読んだことがない人にも通じるプレゼンテーションにしてください
  • ユーザーが教育的な文脈を示すマーカーを求める場合は、明示的に依頼する必要があります
8. 親しみやすい言葉遣い

相手を萎縮させるのではなく、親しみを感じられる言葉を使います。

❌ 避ける表現✅ 代わりに使う表現
"習得する内容""このセッションの終了時点でできること"
"必ず知っておくべき前提知識""事前に知っておくと役立つこと"
"高度な概念""より深いパターン"
"専門家のテクニック""プロのヒント"

トーン:自信がありながらも親しみやすくします。見下したり、門戸を閉ざしたりすることは決してありません。

9. 目標ではなく、興味を引く内容から始める

最初のコンテンツスライドでは、学習成果を列挙するのではなく、好奇心をかき立てます。

スライドの順序:

  1. タイトルスライド(価値が伝わる魅力的なメッセージ)
  2. 興味を引くスライド(パラダイムシフト、挑発的な質問、または「もし〜だったら」)
  3. その後に学習目標

❌ 誤った導入:スライド2=「学習内容:1. インストールする… 2. 設定する…」 ✅ 正しい導入:スライド2=「1つの汎用エージェントで、すべてのカスタムエージェントを構築できるとしたら?」


概要

ユーザーは、.pptx ファイルの内容の作成、編集、分析を依頼することがあります。.pptx ファイルは基本的に、読み取りや編集が可能な XML ファイルやその他のリソースを含む ZIP アーカイブです。タスクに応じて、さまざまなツールやワークフローを利用できます。

内容の読み取りと分析

テキストの抽出

プレゼンテーションのテキスト内容を読むだけであれば、ドキュメントを Markdown に変換します。

# Convert document to markdown
python -m markitdown path-to-file.pptx
生の XML へのアクセス

コメント、発表者ノート、スライドレイアウト、アニメーション、デザイン要素、複雑な書式を扱うには、生の XML へのアクセスが必要です。これらの機能を扱う場合は、プレゼンテーションを展開して、生の XML 内容を読み取ります。

ファイルの展開

python ooxml/scripts/unpack.py <office_file> <output_dir>

注:unpack.py スクリプトは、プロジェクトのルートからの相対パス skills/pptx/ooxml/scripts/unpack.py にあります。このパスにスクリプトがない場合は、find . -name "unpack.py" を使って場所を特定します。

主要なファイル構成
  • ppt/presentation.xml - プレゼンテーションの主なメタデータとスライド参照
  • ppt/slides/slide{N}.xml - 個々のスライドの内容(slide1.xml、slide2.xml など)
  • ppt/notesSlides/notesSlide{N}.xml - 各スライドの発表者ノート
  • ppt/comments/modernComment_*.xml - 特定のスライドのコメント
  • ppt/slideLayouts/ - スライドのレイアウトテンプレート
  • ppt/slideMasters/ - スライドマスターテンプレート
  • ppt/theme/ - テーマとスタイルの情報
  • ppt/media/ - 画像やその他のメディアファイル
タイポグラフィと色の抽出

参考デザインを再現する場合:以下の方法で、まずプレゼンテーションのタイポグラフィと色を必ず分析します。

  1. テーマファイルを読む:色(<a:clrScheme>)とフォント(<a:fontScheme>)を確認するため、ppt/theme/theme1.xml を調べます
  2. スライドの内容を確認する:実際に使われているフォント(<a:rPr>)と色を確認するため、ppt/slides/slide1.xml を調べます
  3. パターンを検索する:すべての XML ファイルから、grep を使って色(<a:solidFill>、<a:srgbClr>)とフォントの参照を検索します

テンプレートなしで新しい PowerPoint プレゼンテーションを作成する

PowerPoint プレゼンテーションを一から作成する場合は、HTML スライドを正確な位置に配置して PowerPoint に変換する html2pptx ワークフローを使用します。

デザイン原則

重要:プレゼンテーションを作成する前に、内容を分析し、適切なデザイン要素を選んでください。

  1. 主題を考慮する:このプレゼンテーションのテーマは何ですか? どのようなトーン、業界、雰囲気が想起されますか?
  2. ブランディングを確認する:ユーザーが企業や組織に言及している場合は、そのブランドカラーやアイデンティティを考慮してください。
  3. 内容に合わせてパレットを選ぶ:主題を反映する色を選んでください。
  4. 方針を示す:コードを書く前に、デザイン上の選択について説明してください。

要件:

  • ✅ コードを書く前に、内容に基づいたデザイン方針を示してください。
  • ✅ Web セーフフォントのみを使用してください:Arial、Helvetica、Times New Roman、Georgia、Courier New、Verdana、Tahoma、Trebuchet MS、Impact
  • ✅ サイズ、太さ、色を通じて明確な視覚的階層を作成してください。
  • ✅ 読みやすさを確保してください:十分なコントラスト、適切な文字サイズ、整った配置。
  • ✅ 一貫性を保ってください:スライド全体でパターン、余白、ビジュアル表現を統一してください。
必須のデザイン宣言

コードを書く前に、必ず次のようなデザイン宣言を出力してください。

## Design Approach

**Content analysis**: This presentation covers [topic]. The content suggests [mood/tone/energy].

**Color palette**: [Palette name] because [reason tied to content]
- Primary: #XXXXXX — [purpose, e.g., "titles, key statements"]
- Accent 1: #XXXXXX — [purpose, e.g., "highlights, CTAs"]
- Accent 2: #XXXXXX — [purpose, e.g., "secondary elements"]
- Background: #XXXXXX — light for projection

**Visual approach**: [e.g., "Accent bars on left edge, colored by topic"]

❌ この宣言を省略してはいけません — 宣言を飛ばしてすぐにコードを書くと、ありきたりで印象に残らないプレゼンテーションになります。

色のアンチパターン(絶対に避けること)
❌ アンチパターン問題点✅ 代わりに行うこと
ネイビー(#1a1a2e)+グレー(#666)「無難な企業カラー」は印象に残りません内容に合った鮮やかなパレットを使う
デフォルトの青(#0066cc)テンプレートの仮置き色のように見えます意味を持たせた色を選ぶ
白地に黒文字のみ視覚的な活気がまったくありません色付きのタイトルやアクセント要素を使う
宣言を省略する自動的な選択につながります常に最初に方針を示す
カラーパレットの選択

創造的な色選び:

  • 既定の選択肢にとらわれない:この特定のテーマに本当に合う色は何でしょうか? 惰性で選ぶのは避けましょう。
  • さまざまな角度から検討する:テーマ、業界、雰囲気、エネルギーの度合い、対象読者、ブランドアイデンティティ(言及されている場合)
  • 大胆に試す:意外な組み合わせを試してみましょう。医療関連のプレゼンテーションに必ずしも緑を使う必要はなく、金融関連に必ずしもネイビーを使う必要もありません。
  • パレットを作る:組み合わせて使える色を3~5色選びます(メインカラー+補助色+アクセントカラー)。
  • コントラストを確保する:背景に対してテキストがはっきり読めるようにします。

カラーパレットの例(創造性を引き出す参考にしてください。いずれかを選ぶ、調整する、または独自のパレットを作成できます):

  1. クラシックブルー:ディープネイビー(#1C2833)、スレートグレー(#2E4053)、シルバー(#AAB7B8)、オフホワイト(#F4F6F6)
  2. ティール&コーラル:ティール(#5EA8A7)、ディープティール(#277884)、コーラル(#FE4447)、ホワイト(#FFFFFF)
  3. 鮮やかなレッド:レッド(#C0392B)、ブライトレッド(#E74C3C)、オレンジ(#F39C12)、イエロー(#F1C40F)、グリーン(#2ECC71)
  4. 温かみのあるブラッシュ:モーブ(#A49393)、ブラッシュ(#EED6D3)、ローズ(#E8B4B8)、クリーム(#FAF7F2)
  5. バーガンディ&ラグジュアリー:バーガンディ(#5D1D2E)、クリムゾン(#951233)、ラスト(#C15937)、ゴールド(#997929)
  6. ディープパープル&エメラルド:パープル(#B165FB)、ダークブルー(#181B24)、エメラルド(#40695B)、ホワイト(#FFFFFF)
  7. クリーム&フォレストグリーン:クリーム(#FFE1C7)、フォレストグリーン(#40695B)、ホワイト(#FCFCFC)
  8. ピンク&パープル:ピンク(#F8275B)、コーラル(#FF574A)、ローズ(#FF737D)、パープル(#3D2F68)
  9. ライム&プラム:ライム(#C5DE82)、プラム(#7C3A5F)、コーラル(#FD8C6E)、ブルーグレー(#98ACB5)
  10. ブラック&ゴールド:ゴールド(#BF9A4A)、ブラック(#000000)、クリーム(#F4F6F6)
  11. セージ&テラコッタ:セージ(#87A96B)、テラコッタ(#E07A5F)、クリーム(#F4F1DE)、チャコール(#2C2C2C)
  12. チャコール&レッド:チャコール(#292929)、レッド(#E33737)、ライトグレー(#CCCBCB)
  13. 鮮やかなオレンジ:オレンジ(#F96D00)、ライトグレー(#F2F2F2)、チャコール(#222831)
  14. フォレストグリーン:ブラック(#191A19)、グリーン(#4E9F3D)、ダークグリーン(#1E5128)、ホワイト(#FFFFFF)
  15. レトロレインボー:パープル(#722880)、ピンク(#D72D51)、オレンジ(#EB5C18)、アンバー(#F08800)、ゴールド(#DEB600)
  16. ヴィンテージアースカラー:マスタード(#E3B448)、セージ(#CBD18F)、フォレストグリーン(#3A6B35)、クリーム(#F4F1DE)
  17. コースタルローズ:オールドローズ(#AD7670)、ビーバー(#B49886)、エッグシェル(#F3ECDC)、アッシュグレー(#BFD5BE)
  18. オレンジ&ターコイズ:ライトオレンジ(#FC993E)、グレイッシュターコイズ(#667C6F)、ホワイト(#FCFCFC)
ビジュアルの詳細設定

幾何学模様:

  • 水平ではなく斜めのセクション区切り
  • 非対称なカラム幅(30/70、40/60、25/75)
  • 90°または270°に回転させた見出しテキスト
  • 画像に円形または六角形のフレームを使用
  • 角に三角形のアクセント形状を配置
  • 奥行きを出すために図形を重ねる

境界線とフレームの処理:

  • 片側だけに太い単色の境界線(10-20pt)を配置
  • 対照的な色を使った二重線の境界線
  • フルフレームの代わりにコーナーブラケットを使用
  • L字型の境界線(上+左、または下+右)
  • 見出しの下に下線のアクセント(太さ3-5pt)を配置

タイポグラフィの処理:

  • 極端なサイズ差(見出しは72pt、本文は11pt)
  • 文字間隔を広くしたすべて大文字の見出し
  • 特大のディスプレイ書体による番号付きセクション
  • データ/統計/技術的な内容には等幅フォント(Courier New)を使用
  • 情報量の多い箇所にはコンデンスフォント(Arial Narrow)を使用
  • 強調するテキストに輪郭線を付ける

チャートとデータのスタイル:

  • 重要なデータにはアクセントカラーを1色だけ使ったモノクロのチャート
  • 縦棒グラフではなく横棒グラフを使用
  • 棒グラフではなくドットプロットを使用
  • グリッド線は最小限にするか、使用しない
  • 凡例を使わず、要素に直接データラベルを付ける
  • 重要な指標は数字を大きく表示する

レイアウトの工夫:

  • 画像をスライド全体に広げ、テキストを重ねる
  • ナビゲーション/コンテキスト用のサイドバーカラム(幅20-30%)
  • モジュール式グリッドシステム(3×3、4×4のブロック)
  • ZパターンまたはFパターンのコンテンツフロー
  • 色付きの図形にテキストボックスを浮かべる
  • 雑誌風の複数カラムレイアウト

背景の処理:

  • スライドの40-60%を占める単色ブロック
  • グラデーション塗りつぶし(縦方向または斜め方向のみ)
  • 背景を2色に分割(斜めまたは縦方向)
  • 端から端まで広がるカラーバンド
  • デザイン要素としてネガティブスペースを活用する
MIT標準のタイポグラフィ要件

すべてのプレゼンテーションで必須です。これらは妥協できない品質基準です。

フォントサイズのルール
要素最小推奨理由
スライドタイトル40pt44pt大講堂の後方からも見える
本文24pt28ptプロフェッショナルな場面におけるMITの最小サイズ
箇条書きのテキスト24pt28pt本文と同じサイズ。箇条書きだけ小さくしない
コードブロック18pt20pt等幅フォントは多少小さくても可
キャプション/脚注16pt18pt重要度の低い詳細に限る

徹底事項:スライドを完成させる前に、すべてのテキストがこれらの最小サイズを満たしていることを確認してください。キャプションを除き、24pt未満のテキストがあれば大きくしてください。

コンテンツ密度のルール
  1. スライド1枚につきアイデアは1つ — 各スライドで伝える要点を1つにします
  2. 箇条書きは最大4項目 — インパクトを高めるため、MITの6項目より厳しくします
  3. 箇条書き1項目あたり最大6語 — 簡潔さを徹底します
  4. スライド1枚あたり最大50語 — スライドは文書ではなく視覚的な補助資料です
  5. タイトルは結論にする — 「データがXを証明」。「データ分析」ではありません
視覚的階層の原則
  • サイズで重要度を伝える:最も大きな要素を主な焦点にします
  • 色を使いすぎない:最大3色(黒/白を除く)
  • 意図的な余白:20%以上のパディングでゆとりを確保します
  • 明るい背景:投影には明るい背景が重要です(ダークモードは投影時に見えにくくなります)
  • 一貫した配置:グリッドベースで予測しやすいパターンにします
自己検証チェックリスト

プレゼンテーションを納品する前に、必ず以下を確認してください。

  • すべてのタイトルが実行可能な結論になっている(ラベルではない)
  • 24pt未満のテキストがない(キャプションを除く)
  • 箇条書きが4項目を超えるスライドがない
  • 6語を超える箇条書きがない
  • スライドの少なくとも30%に視覚要素がある
  • カラーパレットが3色+黒/白に制限されている
  • 全体を通して明るい背景を使用している
  • コード例にシンタックスハイライトを使用している
「活気のある」プレゼンテーションの作成

機械的なスライドと、聞き手を引き込むスライドの違い:

機械的なスライド(避ける):

  • 一般的なタイトル:「はじめに」「概要」「まとめ」
  • 箇条書きの羅列:リストに項目が8個以上
  • テキストのみ:図や視覚的な要素がない
  • 均一な情報量:すべてのスライドに同じ量のコンテンツがある
  • デフォルトの色:意図のない基本的な青やグレー

活気のあるスライド(目指すもの):

  • 行動につながるタイトル:「スキルによって出力のブレが80%減少」
  • 内容を絞る:アイデアは1つ、裏付けるポイントは最大3~4個
  • 視覚的なストーリーテリング:図、フローチャート、比較
  • 内容に応じた情報量:複雑なトピックにはスライドを多く使う
  • 意図的な配色:レイヤー、トピック、雰囲気に合わせる
「活気」のテスト

仕上げる前に、次の点を確認してください:

  1. タイトルだけで要点を理解できますか?
  2. 各スライドには、明確な視覚的な焦点がありますか?
  3. KubeCon/Strange Loopの講演で使っても、プロフェッショナルに見えますか?
  4. すべてのスライドに余白(ホワイトスペース)がありますか?
レイアウトのヒント

グラフや表を含むスライドを作成する場合:

  • 2カラムレイアウト(推奨):全幅に広がるヘッダーを配置し、その下を2つのカラムに分けます。一方のカラムにはテキストや箇条書き、もう一方にはメインコンテンツを配置します。これによりバランスが良くなり、グラフや表も読みやすくなります。コンテンツの種類ごとにスペースを最適化できるよう、幅が異なるカラム(例:40%/60%)のフレックスボックスを使用してください。
  • 全スライドレイアウト:インパクトと読みやすさを最大限に高めるため、メインコンテンツ(グラフや表)をスライド全体に配置します。
  • 縦に積み重ねるのは絶対に避けてください:グラフや表をテキストの下に単一カラムで配置しないでください。読みやすさが損なわれ、レイアウトにも問題が生じます。
ワークフロー
  1. 必須 — ファイル全体を読む:html2pptx.mdを最初から最後まで完全に読んでください。このファイルを読むときに範囲を指定しないでください。 プレゼンテーションの作成に進む前に、詳細な構文、重要な書式設定ルール、ベストプラクティスを把握するため、ファイルの全内容を読んでください。
  2. 各スライド用に、適切な寸法(例:16:9の場合は720pt × 405pt)のHTMLファイルを作成します。
    • すべてのテキストコンテンツに<p>、<h1>~<h6>、<ul>、<ol>を使用します。
    • グラフや表を追加する領域にはclass="placeholder"を使用します(視認できるよう、グレーの背景でレンダリングします)。
    • 重要:グラデーションとアイコンは、まずSharpを使ってPNG画像にラスタライズしてから、HTMLで参照してください。
    • レイアウト:グラフ、表、画像を含むスライドでは、読みやすさを高めるため、全スライドレイアウトまたは2カラムレイアウトを使用します。
  3. html2pptx.jsライブラリを使ってHTMLスライドをPowerPointに変換し、プレゼンテーションを保存するJavaScriptファイルを作成して実行します。
    • html2pptx()関数を使って、各HTMLファイルを処理します。
    • PptxGenJS APIを使って、プレースホルダー領域にグラフや表を追加します。
    • pptx.writeFile()を使ってプレゼンテーションを保存します。
  4. 視覚的な検証:サムネイルを生成し、レイアウトの問題がないか確認します。
    • サムネイルの一覧を作成します:python scripts/thumbnail.py output.pptx workspace/thumbnails --cols 4
    • サムネイル画像を読み込み、次の問題がないか注意深く確認します。
      • テキストの切れ:ヘッダーバー、図形、スライドの端によってテキストが切れていないか
      • テキストの重なり:テキスト同士、またはテキストと図形が重なっていないか
      • 配置の問題:コンテンツがスライドの境界や他の要素に近すぎないか
      • コントラストの問題:テキストと背景のコントラストが不十分でないか
    • 問題が見つかった場合は、HTMLのマージン、間隔、色を調整し、プレゼンテーションを再生成します。
    • すべてのスライドが視覚的に適切になるまで繰り返します。

既存のPowerPointプレゼンテーションの編集

既存のPowerPointプレゼンテーションのスライドを編集する場合は、Office Open XML(OOXML)の生の形式を扱う必要があります。これには、.pptxファイルを展開し、XMLコンテンツを編集して、再度パッケージ化する作業が含まれます。

ワークフロー
  1. 必須 — ファイル全体を読む:ooxml.md(約500行)を最初から最後まで完全に読んでください。このファイルを読む際に、範囲を指定することは絶対に避けてください。 プレゼンテーションの編集を始める前に、OOXML の構造と編集ワークフローに関する詳細なガイダンスを得るため、ファイル全体の内容を読んでください。
  2. プレゼンテーションを展開します:python ooxml/scripts/unpack.py <office_file> <output_dir>
  3. XML ファイル(主に ppt/slides/slide{N}.xml と関連ファイル)を編集します。
  4. 重要:編集するたびに、すぐに検証し、先に進む前に検証エラーを修正してください:python ooxml/scripts/validate.py <dir> --original <file>
  5. 最終版のプレゼンテーションをパッキングします:python ooxml/scripts/pack.py <input_directory> <office_file>

テンプレートを使用した新しい PowerPoint プレゼンテーションの作成

既存のテンプレートのデザインに沿ったプレゼンテーションを作成するには、プレースホルダーの内容を置き換える前に、テンプレートのスライドを複製して並べ替える必要があります。

ワークフロー
  1. テンプレートのテキストを抽出し、サムネイルのグリッドも作成します:

    • テキストを抽出します:python -m markitdown template.pptx > template-content.md
    • template-content.md を読みます:テンプレートのプレゼンテーションの内容を把握するため、ファイル全体を読んでください。このファイルを読む際に、範囲を指定することは絶対に避けてください。
    • サムネイルのグリッドを作成します:python scripts/thumbnail.py template.pptx
    • 詳細については、サムネイルグリッドの作成のセクションを参照してください。
  2. テンプレートを分析し、インベントリをファイルに保存します:

    • 視覚分析:サムネイルのグリッドを確認し、スライドのレイアウト、デザインパターン、視覚的な構成を把握します。
    • template-inventory.md にテンプレートのインベントリファイルを作成し、保存します:
      # テンプレートインベントリ分析
      **スライドの合計数:[count]**
      **重要:スライドのインデックスは0始まりです(最初のスライド=0、最後のスライド=count-1)**
      
      ## [Category Name]
      - Slide 0: [Layout code if available] - Description/purpose
      - Slide 1: [Layout code] - Description/purpose
      - Slide 2: [Layout code] - Description/purpose
      [... すべてのスライドをインデックス付きで個別に記載してください ...]
      
    • サムネイルのグリッドを使用:視覚的なサムネイルを参照して、次の項目を確認します:
      • レイアウトパターン(タイトルスライド、コンテンツレイアウト、セクション区切り)
      • 画像プレースホルダーの位置と数
      • スライドグループ間のデザインの一貫性
      • 視覚的な階層と構成
    • 次の手順で適切なテンプレートを選択するには、このインベントリファイルが必須です。
  3. テンプレートの一覧に基づいてプレゼンテーションのアウトラインを作成する:

    • 手順 2 で確認した利用可能なテンプレートを確認します。
    • 最初のスライドには、イントロまたはタイトル用のテンプレートを選びます。これは最初のほうにあるテンプレートを使ってください。
    • ほかのスライドには、安全なテキストベースのレイアウトを選びます。
    • 重要:レイアウトの構成を実際のコンテンツに合わせてください:
      • 1 列のレイアウト:一貫した説明や単一のトピックに使用します。
      • 2 列のレイアウト:異なる項目や概念がちょうど 2 つある場合にのみ使用します。
      • 3 列のレイアウト:異なる項目や概念がちょうど 3 つある場合にのみ使用します。
      • 画像+テキストのレイアウト:挿入する実際の画像がある場合にのみ使用します。
      • 引用レイアウト:実際の人物の発言(出典付き)にのみ使用し、強調のためには使わないでください。
      • コンテンツの数を超えるプレースホルダーがあるレイアウトは使わないでください。
      • 項目が 2 つの場合、無理に 3 列のレイアウトに当てはめないでください。
      • 項目が 4 つ以上ある場合は、複数のスライドに分けるか、リスト形式の使用を検討してください。
    • レイアウトを選ぶ前に、実際のコンテンツの数を数えます。
    • 選んだレイアウトの各プレースホルダーに、意味のあるコンテンツを入れられることを確認します。
    • コンテンツの各セクションに最適なレイアウトを 1 つ選びます。
    • 利用可能なデザインを活用したコンテンツとテンプレートの対応を含めて、outline.md を保存します。
    • テンプレートの対応例:
      # 使用するテンプレートスライド(0 始まりのインデックス)
      # 警告:インデックスが範囲内にあることを確認してください!スライドが 73 枚のテンプレートでは、インデックスは 0~72 です
      # 対応:アウトラインのスライド番号 -> テンプレートスライドのインデックス
      template_mapping = [
          0,   # スライド 0 を使用(タイトル/表紙)
          34,  # スライド 34 を使用(B1:タイトルと本文)
          34,  # スライド 34 を再度使用(2 つ目の B1 用に複製)
          50,  # スライド 50 を使用(E1:引用)
          54,  # スライド 54 を使用(F2:クロージング+テキスト)
      ]
      
  4. rearrange.py を使ってスライドを複製、並べ替え、削除する:

    • scripts/rearrange.py スクリプトを使って、スライドを希望の順序に並べた新しいプレゼンテーションを作成します:
      python scripts/rearrange.py template.pptx working.pptx 0,34,34,50,52
      
    • このスクリプトは、スライドの複製、未使用スライドの削除、並べ替えを自動的に処理します。
    • スライドのインデックスは 0 始まりです(最初のスライドは 0、2 枚目は 1 など)。
    • 同じスライドインデックスを複数回指定すると、そのスライドが複製されます。
  5. inventory.py スクリプトを使ってすべてのテキストを抽出する:

    • インベントリの抽出を実行します:

      python scripts/inventory.py working.pptx text-inventory.json
      
    • text-inventory.json を読み取ります:すべての図形とそのプロパティを把握するため、text-inventory.json ファイル全体を読み取ります。このファイルを読み取る際に、範囲制限を絶対に設定しないでください。

    • インベントリ JSON の構造:

        {
          "slide-0": {
            "shape-0": {
              "placeholder_type": "TITLE",  // or null for non-placeholders
              "left": 1.5,                  // position in inches
              "top": 2.0,
              "width": 7.5,
              "height": 1.2,
              "paragraphs": [
                {
                  "text": "Paragraph text",
                  // Optional properties (only included when non-default):
                  "bullet": true,           // explicit bullet detected
                  "level": 0,               // only included when bullet is true
                  "alignment": "CENTER",    // CENTER, RIGHT (not LEFT)
                  "space_before": 10.0,     // space before paragraph in points
                  "space_after": 6.0,       // space after paragraph in points
                  "line_spacing": 22.4,     // line spacing in points
                  "font_name": "Arial",     // from first run
                  "font_size": 14.0,        // in points
                  "bold": true,
                  "italic": false,
                  "underline": false,
                  "color": "FF0000"         // RGB color
                }
              ]
            }
          }
        }
      
    • 主な機能:

      • スライド:「slide-0」、「slide-1」などの名前が付けられます。
      • 図形:視覚的な位置(上から下、左から右)の順に「shape-0」、「shape-1」などの名前が付けられます。
      • プレースホルダーの種類:TITLE、CENTER_TITLE、SUBTITLE、BODY、OBJECT、または null
      • 既定のフォントサイズ:利用可能な場合、レイアウトのプレースホルダーから抽出されたポイント単位の default_font_size
      • スライド番号は除外:SLIDE_NUMBER プレースホルダータイプの図形は、インベントリから自動的に除外されます。
      • 箇条書き:bullet: true の場合、level は常に含まれます(0 の場合も含みます)。
      • 間隔:ポイント単位の space_before、space_after、line_spacing(設定されている場合のみ含まれます)
      • 色:RGB カラーの color(例:「FF0000」)、テーマカラーの theme_color(例:「DARK_1」)
      • プロパティ:既定値以外の値のみが出力に含まれます。
  6. 置き換えテキストを生成し、データを JSON ファイルに保存する 前の手順で作成したテキスト一覧に基づいて、次の操作を行います。

    • 重要:まず、一覧にどの図形があるかを確認してください。実際に存在する図形のみを参照してください
    • 検証:replace.py スクリプトは、置き換え用 JSON 内のすべての図形が一覧に存在するかを検証します
      • 存在しない図形を参照すると、利用可能な図形を示すエラーが表示されます
      • 存在しないスライドを参照すると、そのスライドが存在しないことを示すエラーが表示されます
      • スクリプトの終了前に、すべての検証エラーがまとめて表示されます
    • 重要:replace.py スクリプトは、すべてのテキスト図形を特定するために、内部で inventory.py を使用します
    • 自動クリア:「paragraphs」を指定しない限り、一覧にあるすべてのテキスト図形のテキストがクリアされます
    • コンテンツが必要な図形には、「replacement_paragraphs」ではなく「paragraphs」フィールドを追加してください
    • 置き換え用 JSON に「paragraphs」がない図形は、テキストが自動的にクリアされます
    • 箇条書き付きの段落は自動的に左揃えになります。「bullet」が「true」の場合は、「alignment」プロパティを設定しないでください
    • プレースホルダーテキストに適した置き換えコンテンツを生成してください
    • 図形のサイズを基準に、適切なコンテンツの長さを判断してください
    • 重要:元の一覧にある段落プロパティを含めてください。テキストだけを指定しないでください
    • 重要:「bullet: true」の場合、テキストに箇条書き記号(•、-、*)を含めないでください。記号は自動的に追加されます
    • 書式設定に関する必須ルール:
      • 見出しやタイトルには、通常「"bold": true」を指定してください
      • リスト項目には「"bullet": true, "level": 0」を指定してください(bullet が true の場合、level は必須です)
      • 配置プロパティ(中央揃えテキストの「"alignment": "CENTER"」など)を保持してください
      • デフォルトと異なる場合は、フォントプロパティ(「"font_size": 14.0」、「"font_name": "Lora"」など)を含めてください
      • 色:RGB には「"color": "FF0000"」、テーマカラーには「"theme_color": "DARK_1"」を使用してください
      • 置き換えスクリプトでは、テキスト文字列だけでなく、適切に書式設定された段落が必要です
      • 重なり合う図形:デフォルトの font_size が大きい図形、または placeholder_type がより適切な図形を優先してください
    • 置き換え内容を含む更新済み一覧を replacement-text.json に保存してください
    • 警告:テンプレートのレイアウトによって図形の数は異なります。置き換え内容を作成する前に、必ず実際の一覧を確認してください

    適切に書式設定された「paragraphs」フィールドの例:

    "paragraphs": [
      {
        "text": "New presentation title text",
        "alignment": "CENTER",
        "bold": true
      },
      {
        "text": "Section Header",
        "bold": true
      },
      {
        "text": "First bullet point without bullet symbol",
        "bullet": true,
        "level": 0
      },
      {
        "text": "Red colored text",
        "color": "FF0000"
      },
      {
        "text": "Theme colored text",
        "theme_color": "DARK_1"
      },
      {
        "text": "Regular paragraph text without special formatting"
      }
    ]
    

    置き換え用 JSON に記載されていない図形は、自動的にクリアされます:

    {
      "slide-0": {
        "shape-0": {
          "paragraphs": [...] // This shape gets new text
        }
        // shape-1 and shape-2 from inventory will be cleared automatically
      }
    }
    

    プレゼンテーションでよく使われる書式パターン:

    • タイトルスライド:太字テキスト。中央揃えの場合もあります
    • スライド内のセクション見出し:太字テキスト
    • 箇条書きリスト:各項目に「"bullet": true, "level": 0」が必要です
    • 本文:通常、特別なプロパティは不要です
    • 引用:配置やフォントに関する特別なプロパティが必要な場合があります
  7. replace.py スクリプトを使用して置き換えを適用する

    python scripts/replace.py working.pptx replacement-text.json output.pptx
    

    スクリプトは次の処理を行います。

    • まず、inventory.py の関数を使用して、すべてのテキスト図形の一覧を抽出します
    • 置き換え用 JSON 内のすべての図形が一覧に存在するかを検証します
    • 一覧で特定されたすべての図形のテキストをクリアします
    • 置き換え用 JSON で「paragraphs」が定義されている図形にのみ、新しいテキストを適用します
    • JSON の段落プロパティを適用して、書式を保持します
    • 箇条書き、配置、フォントプロパティ、色を自動的に処理します
    • 更新済みのプレゼンテーションを保存します

    検証エラーの例:

    ERROR: Invalid shapes in replacement JSON:
      - Shape 'shape-99' not found on 'slide-0'. Available shapes: shape-0, shape-1, shape-4
      - Slide 'slide-999' not found in inventory
    
    ERROR: Replacement text made overflow worse in these shapes:
      - slide-0/shape-2: overflow worsened by 1.25" (was 0.00", now 1.25")
    

サムネイルグリッドの作成

PowerPoint スライドのサムネイルグリッドを作成し、すばやく分析、参照できます。

python scripts/thumbnail.py template.pptx [output_prefix]

機能:

  • 作成されるファイル:thumbnails.jpg(大規模なデッキでは thumbnails-1.jpg、thumbnails-2.jpg など)
  • デフォルト:5 列、グリッドあたり最大 30 枚のスライド(5×6)
  • カスタムプレフィックス:python scripts/thumbnail.py template.pptx my-grid
    • 注:特定のディレクトリに出力する場合は、出力プレフィックスにパスを含めてください(例:workspace/my-grid)
  • 列数の調整:--cols 4(範囲:3~6、グリッドあたりのスライド数に影響します)
  • グリッドの上限:3 列=グリッドあたり 12 枚、4 列=20 枚、5 列=30 枚、6 列=42 枚
  • スライドはゼロ始まりです(スライド 0、スライド 1 など)

ユースケース:

  • テンプレート分析:スライドのレイアウトやデザインパターンをすばやく把握します
  • コンテンツのレビュー:プレゼンテーション全体を視覚的に確認します
  • ナビゲーションの参照:見た目から特定のスライドを探します
  • 品質チェック:すべてのスライドが適切にフォーマットされていることを確認します

例:

# Basic usage
python scripts/thumbnail.py presentation.pptx

# Combine options: custom name, columns
python scripts/thumbnail.py template.pptx analysis --cols 4

教材のチャプターからプレゼンテーションを作成する

チャプターのスライド作成を依頼された場合(例:「Chapter 5 のスライドを作成して」):

ワークスペースの構成

すべての作業ファイルは workspace/ ディレクトリ(プロジェクトのルートまたは指定した場所に作成)に保存します。

workspace/
├── content-audit.md      ← Phase 1: Research notes
├── slide-outline.md      ← Phase 2: Storyboard (user approves)
├── draft-v1.pptx         ← Phase 4: First draft
├── draft-v2.pptx         ← Phase 5: After fixes
├── review/               ← Phase 5: Thumbnail grids
│   └── thumbnails.jpg
└── [chapter]-slides.pptx ← Phase 6: Final delivery
フェーズ 0:チャプターのパスを特定する

重要:CLAUDE.md の CHAPTER/PART RESOLUTION PROTOCOL に従ってください。

  1. 入力を解析する:ch X = Chapter X、part X = Part X、数字のみの X =ユーザーに確認
  2. ファイルシステムを使ってパスを特定する(信頼できる情報源):
    # For chapter:
    ls -d apps/learn-app/docs/*/05-*/   # Chapter 5
    
    # For part:
    ls -d apps/learn-app/docs/05-*/     # Part 5
    
  3. コンテンツを数える:
    ls apps/learn-app/docs/02-AI-Tool-Landscape/05-*/*.md | wc -l
    
  4. ワークスペースを作成する:mkdir -p workspace
  5. 続行する前にユーザーに確認する

例:「ch 5」→ ls -d apps/learn-app/docs/*/05-*/ → 02-AI-Tool-Landscape/05-claude-code-features-and-workflows/

フェーズ 1:調査と内容の把握

目標:スライドの計画を立てる前に、コンテンツを深く理解します。

成果物:workspace/content-audit.md に保存します。

  1. チャプターの README を読む:学習目標と範囲を確認します
  2. 各レッスンを最後まで読み、構造化されたメモを取ります:
    # Content Audit: [Chapter Name]
    
    **Chapter path**: [discovered path]
    **Total lessons**: [N]
    **Pedagogical layer**: [L1/L2/L3/L4]
    
    ---
    
    ## Lesson 1: [Title]
    - **Core concept**: [One sentence]
    - **Key takeaways**: [3-5 bullets]
    - **Needs diagram**: [Yes/No - what kind?]
    - **Memorable quote/example**: [If any]
    - **Word count**: [X words]
    
    ## Lesson 2: [Title]
    ...
    
    ---
    
    ## Narrative Arc
    - **Problem this chapter solves**: [...]
    - **The "aha moment"**: [...]
    - **What to remember a week later**: [...]
    
  3. ストーリーの流れを把握する:
    • このチャプターでは、どのような問題を解決しますか?
    • 「なるほど」と思える瞬間はどこですか?
    • 1 週間後にも覚えていてほしいことは何ですか?
  4. フロントマターから教育レイヤー(L1~L4)を確認します
フェーズ 2:ストーリーボードと計画

目標:スライドを生成する前に、スライドの概要をすべて作成します。

成果物:workspace/slide-outline.md に保存します。

ステップ 2a:スライド数の目安を決める
コンテンツの種類1000 語あたりのスライド数特徴
概念的(L1)6~8図やたとえを多用
手順的(L2)8~10手順を追ったビジュアル
技術的(L3~L4)5~7コード例、アーキテクチャ
ステップ 2b:スライドごとの概要を作成する

workspace/slide-outline.md に詳細なストーリーボードを作成します。

# Chapter X Presentation Outline

**Total slides**: [N]
**Estimated duration**: [N slides × 1-2 min = X minutes]
**Primary color**: [Layer color]

## Opening (Slides 1-3)
1. **Title**: "[Chapter Title]" — [Type: Title]
2. **Hook**: "[Provocative question or problem statement]" — [Type: Hook]
3. **Roadmap**: "What you'll learn" — [Type: Concept, 3 bullets max]

## Lesson 1: [Title] (Slides 4-8)
4. **[Slide title as conclusion]** — [Type: Concept]
   - Key point 1
   - Key point 2
   - Visual: [diagram description]
5. **[Next conclusion]** — [Type: Comparison]
   - Left: [Option A]
   - Right: [Option B]
...

## Closing (Slides N-2 to N)
- **Summary**: "3 Things to Remember" — [Type: Summary]
- **Call to Action**: "[What to do next]" — [Type: Title]
ステップ 2c:「それで、何が重要なのか?」を確認する

概要の各スライドについて、次の点を確認します。

  • 一番伝えたいことは何ですか?(明確でなければ、分割するか削除します)
  • 聴衆にとって、なぜ重要ですか?(聴衆の目標につなげます)
  • ビジュアルで表現できますか?(箇条書きより図を優先します)
ステップ 2d:ユーザーの承認を得る

作業を止めて、概要をユーザーに提示します。

  • スライドの合計枚数
  • ストーリーの流れの概要
  • 省略するコンテンツ(およびその理由)
  • 強調する内容や対象となる聴衆についての質問

ユーザーが概要を承認するまで、生成に進まないでください。

ステップ 2e:カバレッジマトリックスを作成する

ユーザーの承認後、カバレッジを漏れなく確認するために workspace/coverage-matrix.md を作成します。

# Coverage Matrix: [Chapter Name]

**Chosen spine**: [Teaching / Chapter]

| # | Lesson Title | Key Concepts | Slide(s) | Status |
|---|--------------|--------------|----------|--------|
| 1 | [Lesson 1 title] | [Main concepts] | 4, 5 | ✓ Covered |
| 2 | [Lesson 2 title] | [Main concepts] | 6, 7, 8 | ✓ Covered |
| ... | ... | ... | ... | ... |

## Learning Objectives Coverage

| Objective | Slide(s) | Status |
|-----------|----------|--------|
| [Objective 1] | 3 | ✓ |
| [Objective 2] | 5, 6 | ✓ |

## Omissions (must justify)

- None / [Reason for any excluded content]

ルール:

  • 各レッスンに 1 枚以上のスライドを割り当てる
  • 各学習目標を含める
  • 省略する場合は、必ず理由を明記する
  • カバレッジが不十分な場合:内容を圧縮せず、スライドを追加する
フェーズ 3:デザインシステムを適用する
教育レイヤーの色
レイヤーメインカラーアクセントカラー用途
L1#4472C4 (Blue)#2E5C9A基礎、初めて触れる内容
L2#70AD47 (Green)#548235AI との協働
L3#9B59B6 (Purple)#7D3C98スキル、MCP、自動化
L4#ED7D31 (Orange)#C65911総仕上げ、実用コード
スライドの種類とパターン
種類使用する場面視覚表現
タイトルオープニングスライド大きな中央揃えのテキスト、レイヤーの色
導入物語形式のオープニング引用または挑発的な問い
概念定義/フレームワーク図 + 最大 2~3 個の箇条書き
比較選択肢の対比横並びの表
プロセス手順の説明番号付きの手順/フローチャート
例コード/デモ出力付きのダークなコードブロック
AI と試すインタラクティブなプロンプトチャット/ターミナルカードとしてスタイリング
まとめ重要なポイント番号付きの結論 3 つ
フェーズ 4:ドラフトを生成する

出力:workspace/draft-v1.pptx に保存します

  1. 承認済みのアウトラインに沿ってスライドを生成します
  2. MIT のタイポグラフィ規則(最小 24pt、箇条書きは最大 4 個)を適用します
  3. workspace/draft-v1.pptx として保存します
フェーズ 5:検証ループ(二層構成)

このフェーズには 2 つのレイヤーがあります。レイヤー 2(視覚)の前に、レイヤー 1(意味)の合格が必須です。

┌──────────────────────────────────────────────────────────────────────┐
│                                                                      │
│  Draft → Semantic QA → Pass? ─No─→ Revise outline/content            │
│              │                           │                           │
│             Yes                          │                           │
│              ↓                           │                           │
│        Thumbnails → Visual QA → Pass? ─No─→ Fix layout/typography    │
│              │                       │                               │
│             Yes                      │                               │
│              ↓                       │                               │
│            Done ←────────────────────┘                               │
│                                                                      │
└──────────────────────────────────────────────────────────────────────┘

レイヤー 1:意味の検証(最初に実施)

サムネイルを生成する前に、プレゼンテーションが一貫したストーリーを伝えているか検証します。

ステップ 5a:意味の QA チェックリストを作成する

workspace/semantic-qa.md を作成します:

# Semantic QA: [Chapter Name] Presentation

**Chosen spine**: [Teaching / Chapter]
**Date**: [YYYY-MM-DD]

## Checklist

| Check | Pass? | Issue (if any) |
|-------|-------|----------------|
| Slides follow chosen spine (no A→B→A jumps) | | |
| Each slide has ONE clear takeaway | | |
| No topics introduced outside approved outline | | |
| All terminology introduced before use | | |
| No invented facts, metrics, or claims | | |
| No forbidden topics (pricing, revenue, market size) | | |
| Coverage-matrix shows 100% lesson coverage | | |

## Slide-by-Slide Review

| Slide | Title | Spine Role | Takeaway | Issues |
|-------|-------|------------|----------|--------|
| 1 | | Title | | |
| 2 | | Hook | | |
| 3 | | Roadmap | | |
| ... | | | | |

## Flagged Issues

1. [Issue description and which slide]
2. ...

## Decision

- [ ] **PASS** — Ready for visual QA (Layer 2)
- [ ] **FAIL** — Must revise (see flagged issues above)
ステップ 5b:意味の基準に照らして評価する

各スライドについて、以下を確認します:

  1. ストーリーラインとの整合性:このスライドは物語の流れに含めるべきですか?
  2. 単一の要点:1 文で唯一の要点を述べられますか?
  3. ソースへの忠実性:すべての事実を章の内容までたどれますか?
  4. 範囲の遵守:禁止されているトピック(価格、収益など)が含まれていませんか?
ステップ 5c:意味上の違反を修正する

意味のチェックに 1 つでも不合格があった場合:

  1. どのスライドがどのルールに違反しているか特定します
  2. 必要であればアウトラインを修正します
  3. 該当するスライドを再生成します
  4. すべてのチェックに合格するまでレイヤー 1 を再実行します

レイヤー 1 に合格するまで、レイヤー 2 に進まないでください。


レイヤー 2:視覚的な検証

レイヤー 1 に合格した後に限り、視覚的な品質を検証します。

ステップ 5d:サムネイル一覧を生成する
python scripts/thumbnail.py workspace/draft-v1.pptx workspace/review --cols 4
ステップ 5e:視覚的な確認チェックリスト

各サムネイルを確認し、以下をチェックします:

チェック項目合格?必要な修正
すべてのタイトルが結論になっている(ラベルではない)
本文より小さいテキストがない
箇条書きが 4 個を超えるスライドがない
2 行以上に折り返される箇条書きがない(長すぎる)
すべてのスライドで視覚的な階層が明確である
全体を通して明るい背景になっている
カラーパレットに一貫性がある
テキストが切れたり、重なったりしていない
十分な余白がある(窮屈でない)
ステップ 5f:視覚上の違反を修正する

不合格となったチェック項目ごとに:

  1. スライド番号と問題を記録します
  2. 根本原因を特定します(内容が密集しすぎているか、フォントが小さすぎるかなど)
  3. ソースの HTML/コードを修正します
  4. 該当するスライドを再生成します
ステップ 5g:反復する

以下を満たすまでステップ 5d~5f を繰り返します:

  • 視覚的なチェックリストの項目にすべて合格する
  • サムネイルの確認でプロフェッショナルな品質が認められる
  • 「KubeCon の講演」テストに合格する
フェーズ 6:最終成果物の納品

出力:workspace/[chapter-name]-slides.pptx に保存します

  1. workspace/draft-vN.pptx を workspace/[chapter-name]-slides.pptx に名前を変更します
  2. ユーザー確認用の最終サムネイル一覧を生成します:
    python scripts/thumbnail.py workspace/[chapter-name]-slides.pptx workspace/final --cols 4
    
  3. 以下を添えてユーザーに提示します:
    • 最終的なスライド枚数
    • 承認済みのアウトラインからの変更点(およびその理由)
    • サムネイル一覧の画像(workspace/final-thumbnails.jpg)
よくある間違いと回避方法

これらの間違いは、実際にプレゼンテーションの失敗につながりました。繰り返さないでください。

間違い起きたこと防止策
デザイン方針の宣言を省略するいきなりコードに進み、ありきたりなネイビー/グレーの配色になった必ず最初にデザインアプローチを提示する
タイトルに「Chapter X」を使う単独では成立せず、書籍の文脈を前提としてしまう指示がない限り、あらゆる聴衆に向けた構成にする
目的から始める単調で、引きつける要素がなく、聴衆の関心が薄れるパラダイムシフトや挑発的な質問から始める
学術的な言葉遣い「習得する」「前提条件」は、敷居が高い印象を与える「最後までに……」のような親しみやすい表現を使う
既定の色を使うネイビー+グレーでは、企業向けテンプレートのように見える内容に合った、鮮やかで意図のある配色にする
サムネイルの確認を省略するビジュアル上の問題が、ユーザーに指摘されて初めて見つかる納品前にサムネイルを生成して確認する
意味上の QA を簡略化する網羅性の不足やストーリーラインの逸脱を見逃すスライドごとの完全な監査を行う
python-pptx を直接使う手作業での配置が必要になり、反復作業が難しくなる新しいプレゼンテーションでは html2pptx を優先する

ルール:ユーザーがデザインや構成の問題を修正しなければならないなら、そのスキルは失敗です。最初の納品で正しく仕上げてください。

スライドを画像に変換する

PowerPoint のスライドを視覚的に分析するには、次の 2 段階の手順で画像に変換します。

  1. PPTX を PDF に変換する:

    soffice --headless --convert-to pdf template.pptx
    
  2. PDF のページを JPEG 画像に変換する:

    pdftoppm -jpeg -r 150 template.pdf slide
    

    slide-1.jpg、slide-2.jpg などのファイルが作成されます。

オプション:

  • -r 150:解像度を 150 DPI に設定します(品質とファイルサイズのバランスに応じて調整してください)
  • -jpeg:出力形式を JPEG にします(希望する場合は -png で PNG にできます)
  • -f N:変換する最初のページを指定します(例:-f 2 は 2 ページ目から開始します)
  • -l N:変換する最後のページを指定します(例:-l 5 は 5 ページ目で終了します)
  • slide:出力ファイルのプレフィックス

特定の範囲を指定する例:

pdftoppm -jpeg -r 150 -f 2 -l 5 template.pdf slide  # Converts only pages 2-5

コードスタイルのガイドライン

重要:PPTX 操作用のコードを生成する場合:

  • 簡潔なコードを書く
  • 冗長な変数名や重複する処理を避ける
  • 不要な print 文を避ける

依存関係

必要な依存関係(すでにインストールされているはずです):

  • markitdown:pip install "markitdown[pptx]"(プレゼンテーションからテキストを抽出するため)
  • pptxgenjs:npm install -g pptxgenjs(html2pptx 経由でプレゼンテーションを作成するため)
  • playwright:npm install -g playwright(html2pptx で HTML をレンダリングするため)
  • react-icons:npm install -g react-icons react react-dom(アイコン用)
  • sharp:npm install -g sharp(SVG のラスタライズと画像処理用)
  • LibreOffice:sudo apt-get install libreoffice(PDF 変換用)
  • Poppler:sudo apt-get install poppler-utils(PDF を画像に変換する pdftoppm 用)
  • defusedxml:pip install defusedxml(安全な XML 解析用)

成果物テンプレート

必要なワークスペース成果物を作成する際は、これらのテンプレートをコピーしてください。

coverage-matrix.md テンプレート
# Coverage Matrix: [Chapter Name]

**Chapter path**: [apps/learn-app/docs/.../XX-chapter-name/]
**Chosen spine**: [Teaching / Chapter]
**Date**: [YYYY-MM-DD]

## Lesson Coverage

| # | Lesson Title | Key Concepts | Slide(s) | Status |
|---|--------------|--------------|----------|--------|
| 1 | | | | |
| 2 | | | | |
| 3 | | | | |
| ... | | | | |

## Learning Objectives Coverage

| Objective (from chapter README) | Slide(s) | Status |
|---------------------------------|----------|--------|
| | | |
| | | |

## Omissions

List any content intentionally excluded and justify why:

- **None** — all content covered

OR

- **[Topic]**: [Reason for exclusion]

## Verification

- [ ] Every lesson has ≥1 slide
- [ ] Every learning objective is addressed
- [ ] All omissions are justified above
semantic-qa.md テンプレート
# Semantic QA: [Chapter Name] Presentation

**Chosen spine**: [Teaching / Chapter]
**Date**: [YYYY-MM-DD]
**Reviewer**: Claude

## Semantic Checklist

| # | Check | Pass? | Issue (if failed) |
|---|-------|-------|-------------------|
| 1 | Slides follow chosen spine (no A→B→A jumps) | | |
| 2 | Each slide has ONE clear takeaway | | |
| 3 | No topics introduced outside approved outline | | |
| 4 | All terminology introduced before use | | |
| 5 | No invented facts, metrics, or claims | | |
| 6 | No forbidden topics (pricing, revenue, market size) | | |
| 7 | Coverage-matrix shows 100% lesson coverage | | |

## Slide-by-Slide Audit

| Slide | Title | Spine Role | Single Takeaway | Issues |
|-------|-------|------------|-----------------|--------|
| 1 | | | | |
| 2 | | | | |
| 3 | | | | |
| ... | | | | |

## Flagged Issues

List all issues found during review:

1. [None found]

OR

1. **Slide X**: [Description of issue]
2. **Slide Y**: [Description of issue]

## Forbidden Topic Scan

Searched for and found:

- [ ] Business models / pricing → **Not found** / Found on slide(s): ___
- [ ] ARR / MAU / revenue → **Not found** / Found on slide(s): ___
- [ ] Market sizing → **Not found** / Found on slide(s): ___
- [ ] "Digital FTE economics" → **Not found** / Found on slide(s): ___

## Final Decision

- [ ] **PASS** — All semantic checks pass. Ready for Layer 2 (visual QA).
- [ ] **FAIL** — Issues found above must be fixed before proceeding.

### If FAIL, action plan:

1. [What needs to change]
2. [Which slides to regenerate]

コメント