present-paper について
present-paperは、対象者と発表の場に合わせて論文発表を準備するClaudeスキルです。論文分析、アウトライン確認、参考文献の検証、台本作成に加え、編集可能なスライドの作成や発表者ノートの追加を支援します。
主な機能
- 01論文分析と時間配分付き構成案
- 02対象者と発表形式に応じた調整
- 03補足文献の検証
- 04時間目安付き台本の作成
- 05編集可能なスライド作成またはノート追加
活用シーン
- 01学会発表の準備
- 02ジャーナルクラブの批評スライド作成
- 03既存プレゼンテーションへの発表者ノート追加
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aperivue/ medsci-skills --skill present-paperインストール後、Claude Code で/present-paperを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/ai_slide_tells.mdgenerate_pptx_templates.pygenerated_illustrations.mdmedical_presentation_templates.mdpresentation_archetypes.mdpresentation_design_guidelines.mdslide_design_principles.mdspoken_notes_and_bilingual.mdworkflow-checklist.mdreferences/critic_rubrics/slide.mdreferences/slide_visual_styles/CATALOG.mdclinical_blue.mddark_modern.mdeditorial_mono.mdinstitutional_brand.mdnature_lancet.mdscripts/check_deck_budget.pycheck_diagram_edges.pycheck_font_portability.pycheck_slide_tells.pyscripts/check_deck_budget_challenge/make_fixtures.pyverify.shscripts/check_diagram_edges_challenge/make_fixtures.pyverify.shscripts/check_font_portability_challenge/make_fixtures.pyverify.shscripts/check_slide_tells_challenge/make_fixtures.pyverify.shscripts/check_text_overflow_challenge/make_fixtures.pyverify.sh詳細
Present-Paper スキル
フェーズ 0:初期化とアウトライン
ステップ 0a — デザインの参考資料を読み込む(アウトラインの作成前に読む)
ファイルを3つ、今すぐすべて読んでください。残りの資料は、Q0/Q2への回答によって必要なものがわかってから読みます。講演の開催場所とスタイルはそれぞれ1つであり、ほかの資料を読んでも活用できることはありません。
今すぐ読む(必須):
A. references/ai_slide_tells.md — 生成されたスライド資料に残る特徴です。最初に、すべて読んでください。
これを基準に作成することで、後から修正する必要がなくなります。すり抜けたものは scripts/check_slide_tells.py
が検出します(ステップ 3.6)。ほかの参考資料と矛盾する場合は、この資料を優先します。すべての
スライドに眉見出しラベルとブランドのフッターを付けることは、最もよく指摘される視覚的特徴です。
B. references/presentation_archetypes.md — 話者が立つ場によって選ぶ骨格です。学会での口頭発表、ジャーナルクラブでの批評、症例を軸としたグランドラウンズ、教育講義、学位審査、基調講演(Duarteのスパークライン、JobsのSTARモーメント、Takahashi/Lessig)、一般向け講演、意思決定のためのブリーフィング(Mintoのピラミッド、アクションタイトル、Kawasakiの10/20/30)があります。アーキタイプ(講演で何をする必要があるか)とビジュアルスタイル(どのように見えるか)は独立した選択肢です。**スキンは好みによりますが、骨格はそうではありません。**その機械的な側面は scripts/check_deck_budget.py で確認できます。
C. references/presentation_design_guidelines.md — 適用すべきルール(主張を示す見出し、最小24 pt、ネガティブスペース、色は3色以下、色覚多様性に配慮したパレット、スクリーンショットではなく描き直すこと、アニメーションの適切な運用)と、フェーズ 3.5 の批評者が採点に使うG1–G10の自己チェック項目をまとめています。
必要に応じて読む — Q0/Q2への回答で必要な資料がわかってから:
| ファイル | 読むタイミング |
|---|---|
references/medical_presentation_templates.md | 医療分野の5つの開催形式のいずれかに該当する場合。その場合は該当するセクションのみ読みます |
references/slide_visual_styles/CATALOG.md → いずれか1つのスタイルファイル | Q2でスタイルを選んだ場合 |
references/slide_design_principles.md | スライドがうまく伝わらない理由がわからず行き詰まった場合 — Cのルールの背景にあるReynolds / Duarte / Knaflic / Tufteの理論を確認します |
references/generated_illustrations.md | スライド用の画像を生成しようとしている場合、またはテキストのみのスライドが批評者の評価を通らない場合。この資料の最初のルール(医療画像を決して生成しないこと)は任意ではありません |
references/spoken_notes_and_bilingual.md | 発表者ノートを作成する場合、またはスライド資料が単一言語ではない場合 |
必須入力項目
開始前に以下の情報を集めてください。対象読者を定義するまでは、下書きを作成しないでください。
| 入力項目 | 理由 |
|---|---|
| 論文 | PDFのパス、DOI、またはPMID |
| 発表時間 | 内容の深さとスライド枚数を決めます |
| 対象読者 | 専門分野の構成、知識レベル — 用語の詳しさを調整します |
| コンテキスト | コース名、学会、ジャーナルクラブの形式、以前のセッションのトピック |
| テンプレート/ビジュアルスタイル | 記入する機関のテンプレート(.pptx/.potx)、または生成に使うビジュアルスタイル。デフォルト:確認する(ステップ 0b) |
| 追加セクション | 含める任意のトピック(例:AIの方向性、臨床的意義)。デフォルト:なし |
ステップ 0b — テンプレートとビジュアルスタイルの選択
アウトラインを作成する前に、デッキの見た目を決めます。質問してください(AskUserQuestion を使用し、依頼ですでに回答されている質問は省略します)。
Q0 —「どこで、何分間発表しますか?」(会場+時間)
これによって、見た目について質問する前にアーキタイプ(骨格)を決定します。references/presentation_archetypes.md の選択表を使って回答を割り当て、archetype と minutes を引き継ぎます。ステップ 3.6 で、作成したデッキがそれらに合っているかを確認します。
ユーザーがトピックだけを伝え、会場について触れていない場合は、質問してください。推測してはいけません。特定の会場を想定せずに作成したデッキは、どのレビュアーにもすぐわかるほどありきたりになります。
Q1 —「使用する機関指定またはブランドのテンプレートはありますか?」
- はい → ユーザーから
.pptx/.potxを受け取ります。モード C(フェーズ 3、「機関指定のテンプレートに入力」)に切り替えます。Q2 も質問してはいけません。テンプレートのテーマが、そのままスタイルになります。 - いいえ/ありません → Q2 を質問します。
Q2 —「どのビジュアルスタイルで作成しますか?」 CATALOG.md のメニューを、それぞれ一行のプレビューとともに提示します(推奨オプションを先頭にし、推奨と表示します)。
| オプション | 一行プレビュー |
|---|---|
| Nature / Lancet (医学系の学術発表におすすめ) | 白、ネイビー+コーラルのアクセント、細い区切り線、Inter/Pretendard — 控えめなエディトリアル調の学術スタイル |
| Clinical Blue | 白/ライトブルー、ネイビーとティール、落ち着きと信頼感のある配色、色覚多様性に配慮 — グランドラウンド/CME |
| Editorial Mono | 白地に黒の高コントラスト、大きな文字、アクセントカラー 1 色 — 大きなメッセージを伝える基調講演向け |
| Dark Modern | 濃いスレート色の背景、オフホワイトの文字、鮮やかなアクセント — AI/手法/テクノロジー関連の発表 |
| その他 | 配色や雰囲気を説明するか、模倣したいジャーナル/ブランドを指定 |
選択を記録し、対応するスタイル仕様をフェーズ 3 に渡します。希望が指定されておらず、医学系の学術発表の場合は、Nature / Lancet をデフォルトにします。スタイルが変わるのはフェーズ 3 のレンダリングのみで、アウトライン、台本、Q&A は変わりません。
Q3 — 学会発表のデッキのみ:スライド 1 は投稿時の要件ですか? 多くの学会では、タイトルスライドにタイトル、著者、所属、国を抄録投稿時に入力したとおりに記載する必要があります。情報量チェックに合わせて短縮してはいけません。要件を優先します。投稿ポータルから各項目をコピーし、その理由で意図的に適用を見送ったものとして、スライド 1 に SLIDE_TOO_DENSE を記録します。
論文分析
論文を読み、構造化された分析を作成します。
## Paper Analysis
### Citation
[Full citation with DOI]
### Background
- What gap does this paper address?
- What was known vs. unknown before this study?
### Study Design
- Type: [RCT / cohort / case series / meta-analysis / etc.]
- Subjects: [n, inclusion/exclusion]
- Methods: [key methodological choices]
- Primary outcome: [what was measured]
### Key Results
1. [Finding 1 with effect size and CI/p-value]
2. [Finding 2]
### Patient/Case Summary Table
[If applicable — structured table of individual cases or subgroups]
### Limitations
1. [Limitation 1]
### Significance
- Why does this matter? What changes because of this paper?
スライドアウトライン
時間配分を含む、スライドごとのアウトラインを作成します。
## Slide Outline ([N] slides, [M] minutes)
| # | Title | Time | Key Content |
|---|-------|------|-------------|
| 1 | Title slide | 0:30 | Paper citation, presenter |
| 2 | Context / Prior sessions | 1:00 | How this connects to prior knowledge |
| ... | ... | ... | ... |
| N | Take-home messages | 0:30 | 3-5 key points |
ゲート:先に進む前に、ユーザーのアウトライン承認を得ます。
フェーズ 1:補足調査
補足資料は 5~8 件に限定し、承認済みアウトラインで必要なカテゴリーのみを調査します。追跡研究(再現または拡張されたものか)、知見を位置づける大規模臨床試験データ、トピックの枠組みを示す総説、バランスの取れた Q&A のための相反するエビデンスを調べます。見つかった論文をすべて要約してはいけません。スライドに必要なデータポイント(発生率、OR/HR、AUC)、主要論文を裏付ける、または異議を唱える知見、およびその重要性を示す背景情報のみを抽出します。
/search-lit で各参考文献を検証し、DOI または PMID が確認できたことを確かめます。検証できないものには [UNVERIFIED - NEEDS MANUAL CHECK] と記します。
## Verified References
### Main Paper
1. [Citation] — PMID: XXXXX, DOI: XX.XXXX/XXXXX
### Supporting References
2. [Citation] — PMID: XXXXX
→ Used for: [specific data point or context]
### Key Data for Slides
- [Statistic 1]: [value] — Source: [Ref #]
フェーズ 2:台本とコンテンツ
発表者用スクリプト
完全な発表者用スクリプトを作成します。
- 言語:ナレーションにはユーザーの希望する言語を使用し、専門用語は英語にします。
- 聴衆に合わせた調整:詳しさはフェーズ 0 の聴衆プロフィールに合わせます。聴衆が混在する場合は、専門用語に平易な一行の説明を加えます(「FLAIR シーケンス — 浮腫を際立たせるために液体信号を抑制する MRI 技術」)。
- 発音ガイド:薬剤名と略語について、ユーザーの言語での発音ガイドを記載します(「lecanemab(leh-KAN-eh-mab)」)。
- スライドごとの時間マーカー:スクリプトの長さは割り当てられた時間に合わせます(学術発表では、1 分あたりおよそ 130~150 語)。
- つなぎの表現:ストーリーの流れに沿ってスライドをつなぐ表現を入れます。
臨床上の定義、診断基準、ガイドラインの推奨事項を決して捏造しないでください。不確かな内容には [VERIFY] を付け、ユーザーに確認してください。
文章の組み立て方(メモは読み上げるのではなく、話し言葉として使います)と、単一言語ではないスライド資料における言語の使い分けについては、references/spoken_notes_and_bilingual.md に記載されています。いずれかに該当する場合は、作成前にお読みください。
## Speaker Script
### Slide 1: Title (0:30)
"[Opening — introduce yourself and the paper]"
### Slide N: Take-home Messages (0:30)
"[Summarize 3-5 key points. Thank audience. Invite questions.]"
拡張セクション(任意)
フェーズ 0 でユーザーが希望した場合のみ追加します。例:AI/計算論的な方向性、臨床実践や政策への示唆、ユーザー自身の研究とのつながり。
条件:先にユーザーがスクリプトを確認します。
フェーズ 3:スライドとノート
3 つのモード
モード A = 選択したビジュアルスタイルで新しいスライド資料を作成します。モード B = 既存のスライド資料にノートを追加します。モード C = ユーザーの組織用/ブランド設定済みテンプレート(ステップ 0b で選択)に内容を入力します。ステップ 0b の回答に基づいてモードを選択してください。
モード A:新しいスライド資料を作成
構造化されたインラインデータから python-pptx を使用して、完全に編集可能な PPTX を生成します。テンプレートライブラリは 2 つあります。
${CLAUDE_SKILL_DIR}/references/generate_pptx_templates.py— 汎用の T_lead / T_text / T_table / T_image_right / … テンプレート(一覧は docstring に記載されています。各テンプレートはbuild_demo_slides()で使用例を確認できます)。ジャーナルクラブ、グランドラウンド、学会発表、短い論文紹介に使用します。${CLAUDE_SKILL_DIR}/templates/build_pptx_nature_lancet.py— Nature/Lancet スタイル(仕様:references/slide_visual_styles/nature_lancet.md)。複数の論文を扱う学術講義のサーベイ(テンプレート #5)に使用します。関数:new_presentation、add_title_slide、add_toc_slide、add_section_divider、add_transition_slide、add_content_slide、add_glossary_slide、add_closing_slide、さらにapply_fonts(prs, en=..., ko=...)とfix_app_xml()。
Nature/Lancet スタイルの既定値では、本文、サブタイトル、用語集の項目に 20 pt の文字サイズを使用します。conference_oral、critique、case_anchored、didactic、defence の予算プロフィールには、内容を簡潔にすれば適しています。keynote、lay_talk、decision_brief では文字を大きくし、レイアウトを調整する必要があります。チェッカーでプロフィールを選択しても、スライド資料のスタイルは変更されません。容量の上限内であっても、読みやすい密度や収まりが保証されるわけではありません。実際の内容をレンダリングして確認してください。
PDF から図を抽出する場合(/make-figures の出力ではない場合)は、${CLAUDE_SKILL_DIR}/scripts/extract_pdf_figures.py を使用してください(pdftoppm と PIL による、0~1 に正規化したボックスを使ったトリミングに対応。単一トリミング用 CLI または YAML の一括処理設定を使用できます)。その後、複数パネルの図や表の行を損なわずに、trim_caption.py でジャーナルのヘッダー、キャプション、周囲の余白を取り除きます。
python3 "${CLAUDE_SKILL_DIR}/scripts/trim_caption.py" \
--in-dir figures/extracted \
--out-dir figures/cropped
build_pptx_nature_lancet.py の既定のように、スロットが図の本体のみを想定している場合は、FIG_DIR をトリミング後の出力ディレクトリに指定してください。
HLA を多く含むスライド資料向けの単語境界対応 Markdown パーサー(必須)
スライド本文またはノート内の **太字**/*斜体* を解析するビルドスクリプトでは、単語境界の先読み・後読みを使用する必要があります。これを使わないと、アスタリスクを含む科学用語(DRB1*07:01、HLA-A*02:01、SNP ID、脚注マーカー)が斜体の区切り文字として誤認され、スライド資料内のすべてのアレルが気づかれないまま破損します。
import re
pattern = re.compile(
r"(\*\*(?:(?!\*\*).)+?\*\*" # bold; inner single * allowed
r"|(?<![A-Za-z0-9])\*[^*\n]+?\*(?![A-Za-z0-9]))" # italic (word-boundary)
)
太字のルールでは、内側に単一の * があっても許容されるため、**DRB1*04:02** はひとつの太字範囲として保持されます。この正規表現を、すべての Nature/Lancet スタイルのビルドスクリプトにある add_styled()(または同等の関数)に追加してください。
非ネイティブの発表者向け発音の自動補足
発表者が頭字語、著者名、薬剤名、遺伝子記号の発音に自信がない場合は、各スライドのノートに [ Pronunciation ] セクションを追加します(発表者ビューのみ)。
python3 "${CLAUDE_SKILL_DIR}/scripts/inject_pronunciation_notes.py" \
input.pptx output.pptx \
--dict pron_dict.yaml \
--header "[ 발음 ]" # or any header you like
聴衆の言語に合わせて作成した YAML/JSON の辞書(用語 → [読み方, 正式名称])を指定します。一致判定は単語境界に基づくため、短い頭字語(AE、OR)は単独で使われている場合にのみ一致します。アレルトークンの読み方は、対応する基本アレルの項目から合成されます。すでにこの見出しがあるスライドはスキップされるため、再実行しても安全です。
スピーカーノートの統計情報の密度
スライド本文に正確な OR / 95% CI / p 値がすでに示されている場合、ノートでそれらを繰り返してはいけません。発表者が統計情報を声に出して読み上げることになり、聴衆がついていけなくなります。ノートは、正確な数値については「正確な数値はスライド本文を参照」という一文を添えた説明文にします。正確な数値は本文と脚注に記載します。統計トークンが 5 個以上含まれる状態で 1,000 文字を超える場合は、文章を圧縮します。測定用スニペットは references/spoken_notes_and_bilingual.md Part D §8 にあります。
ノート内の数値は、声に出して読み上げる数値です
- ノート内の外部数値はすべて、本文の数値と同様に、出典と照合します。 記憶を頼りに入力したベンチマーク(出典では 87%、148 of 171 だったのに「152 モデルの 95% が高リスクと評価された」など)は、参考文献一覧が正しく引用されていても残ってしまいます。覚えていたのは数字だけだからです。
- 生成テキストを編集するとき、挿入式の数は減らしてはいけません。 ビルドスクリプトがアーティファクトから数値を取得する箇所(
f"{N['primary']}")では、文章を圧縮すると、それらがリテラルに置き換わってしまうことがあります。本文はチェックを通ったままなのに、ノートの数値だけがひそかに食い違うことになります。編集前と編集後:
import re
len(re.findall(r"\{N\[", src)) # must not decrease across a rewrite
同じ正規表現を反転させて、挿入式の内側にない数値をすべて抽出します。これらは誰かが入力したリテラルであり、照合が必要です。
共有用のノート削除版
デッキを共有する前(たとえば教授からスライドを求められた場合)にノートを削除することは必須です。ノートには、第二言語での説明、発音のヒント、「Prof. ○○ が……について質問しそうです」といった発表者向けのメモが含まれているためです。
python3 "${CLAUDE_SKILL_DIR}/scripts/strip_notes_for_sharing.py" \
presenter_v9.pptx share/<topic>_<initials>.pptx
すべてのノートページにあるすべての図形のテキスト(ノートのプレースホルダーだけではありません)を消去し、レビューコメントを削除し、docProps/core.xml の作成者/最終更新者/コメントの各フィールドを空欄にして、docProps/app.xml のカウントを同期します。さらに、書き出したファイルの生の XML と照合して、これらすべてを検証します(本文と図表は変更しません)。非表示スライドがあるデッキは、--drop-hidden(共有用コピーから削除)または --keep-hidden を選ぶまで、終了コード 2 で停止します。<topic>_<initials>.pptx(スライド再利用のために用意した旨をカバーメールに記載)、<topic>_<initials>.pdf(LibreOffice の --convert-to pdf は消去済みのノートページを除外します)、必要に応じて <topic>_<initials>_references.zip(添付ファイルの上限を超える場合は Drive のリンク)を共有します。
同行ドキュメントもスライド資料と一緒に配布されます — そちらも確認してください
_qa_prep.md、_quick_review.md、配布資料はどれもノートと同じ資料をもとに作成され、
さらに広く配布されます。いずれかを配布する前に、次の点を確認してください。
- 古い数値。 スライド資料に対するチェックが、関連ドキュメントにも適用されるわけではありません。スライドでは一時期26.3%と記載されていた一方、発表者が質問への回答に使うレビューシートには、依然として54.1%と記載されていました。スライドの数値を変更したら、関連する
.mdファイルもすべて確認し、更新前の数値を探してください。意図的に古い数値を引用する場合は、ファイルを例外扱いにするのではなく、``で囲んでください。 - 聴衆向けドキュメントに記載された運営者向け資料。 あなたの準備用に書かれた短い資料(「相手が異議を唱えるポイント」「代替案」「分刻みの進行計画」など)は、記述対象の相手に渡ると、相手をどう動かすかという戦略として受け取られます。ドキュメントを2つに分けてください。想定される状況への対応を記載した内部向けのものと、調査結果と相手に確認を求める事項を記載した中立的なものです。
- その場限りの演出と、それを指す記述。 再配布されるスライド資料はデスクで読まれます。休憩用スライド、タイマー、「演習で今見たように」といった記述を削除してください。そのうえで、スライド本文とノートの両方を含む資料全体を grep し、それらに言及する文が残っていないか確認してください。 上流プロジェクトについて資料に記載した内容(インストールコマンド、件数、バージョンなど)は、数か月前の手元のコピーではなく、そのプロジェクト自身のソースで再確認してください。
アーキテクチャ
各スライドは、明示的なインラインデータを使ったテンプレート関数の呼び出しであり、ネイティブで編集可能なテキストフレームを生成します。スライドを安定させるため、次の3つのルールを守ってください。
- Markdownを解析しない。 Markdownをスライドに自動解析すると、再生成のたびにレイアウトがずれていきます。
cur_topで累積位置を追跡しない。generate_pptx_templates.pyの先頭で定義されている固定座標ゾーンを使用してください。cur_topは丸め誤差が蓄積し、約10枚を超えるとレイアウトが崩れます。- Marpを使わない。 Marpは画像としてレンダリングするため、スライド資料が編集できなくなり、レビュー担当者がテキストをコピーしたり、スタイルを変更したりできません。
図のソース形式(/make-figuresの出力を使用する場合)
- 推奨:
add_picture()を使い、300 dpi以上のPNGを使用します。13.33 × 7.5インチのレイアウトで図がスライド幅の40%以上を占めるよう、img_pct(T_image_right)を設定してください。 - ベクターソース:挿入する前に、PDFを目標のDPIでPNGに変換します(
pdftoppm -r 300 input.pdf out_prefix)。python-pptxによるPDFの埋め込みは、PowerPointのバージョンによって動作が不安定です。 - 使用禁止:TIFF(Mac版PowerPointでは警告なく削除されます)、線画へのJPEGの使用(斜線にアーティファクトが生じます)、生のSVG(Mac版PowerPointでは動作に一貫性がありません)。
- キャプション:学術誌の凡例ではなく、5~10秒ほどしか注意を向けない聞き手向けに書き直してください。
- 主張はラスター画像ではなくスライドに記載してください。 結論や見出しとなる数値をPNGに描き込むと、その上にある箇条書きを編集した時点で、発表内容との整合性が取れなくなり、テキスト検索でも見つけられません。数値や結論はスライド自体のテキストに記載してください。
- 生成イラスト:使うのは概念や場面の描写に限り、測定結果と誤認される可能性のあるものは使用しないでください。生成したCT、MRI、組織画像、X線画像は、「イラストとして」使う場合も含め、使用しないでください。最初のプロンプトを作成する前に、
references/generated_illustrations.mdを読んでください。
図とプロットはコードとして作成し、挿入します(オートシェイプから作成しません)
厳守事項であり、このスキルで最も効果の高いルールです。 PPT ツールで組み立てたエージェント作成のスライドは、ほとんどの場合うまくいきません。広く使われているツールで図やプロットをコードとして描画し、その結果を挿入する方法が有効です。
| 内容 | 作成方法 | 使用しないもの |
|---|---|---|
| あらゆるグラフ | matplotlib / R(/make-figures) | グラフのように見せかけた手動配置の図形 |
| フロー、メカニズム、パイプライン、階層 | matplotlib、またはグラフ自体が主題の場合は Graphviz DOT | python-pptx のオートシェイプ |
| 研究フロー(STROBE/PRISMA) | /make-figures のフロービルダー | ボックスを1つずつ描画すること |
次に、描画した PNG(300 dpi 以上)を add_picture() で挿入します。
挿入する前に、描画した PNG を確認してください。 図の境界に重ねた線は、描画時に半分が切れてしまい、スライドでは片側が欠けたボックスに見えます。
python3 scripts/check_diagram_edges.py diagrams/ --json qc/diagram_edges.json
DIAGRAM_EDGE_CLIP は画像の境界から数ピクセル以内にある描画内容を検出しますが、全面表示画像には影響しません。savefig の直後に実行してください。修正するには内側に余白を設け、bbox_inches="tight" とパディングを指定します。PNG ができてからでは、トリミングしても線は戻せません。
禁止する理由。 オートシェイプの図は、AI らしさを示す特徴を2つ同時に生み出します。つまり、ラベルのない矢印(ARROW_NO_SEMANTICS)でつながれた、同じ形の角丸長方形(SHAPE_MONOTONY)です。Graphviz では、エッジにその意味を示す言葉を記述します。
digraph mechanism {
rankdir=LR; node [shape=box, fontname="Inter"];
catheter -> tract [label="seeds along"];
tract -> nodule [label="grows into"]; // an arrow that says what it means
}
矢印は主張を表します。引き起こす、変化する、流れ込む、比較される、予測するといった意味です。ラベルがなければ、その場にいる人それぞれが異なる動詞を当てはめてしまいます。references/ai_slide_tells.md §4–5 を参照してください。
唯一の例外:アクセントとして意図的に使う、ラベル付きの単一の図形(コールアウトボックスやハイライト枠など)です。図形1つは選択ですが、同じ図形を8つ並べるのは自動生成です。
フォントは好みではなく、配布時の判断です
発表に使うマシンにない書体は、通知なしに置き換えられます。メトリクスが変わり、行が再配置され、収まっていたボックスに収まらなくなります。作成時のマシンでは気づきませんが、プロジェクターでは目に見えます。
python3 scripts/check_font_portability.py output/presentation.pptx --json qc/font_portability.json
FONT_NOT_PORTABLE は、一方のオペレーティングシステムには含まれ、もう一方には含まれない書体を、フォントごとの件数とともに示します。これは許可リストではなくブロックリストです(ライセンスされたブランド書体は対象外です)。デッキに埋め込まれているフォントは対象から除外し、テーマレベルのデフォルトフォントは、そのスロットが対応する文字体系のテキストがデッキに含まれるまで無効として扱います。合格しても、フォントのインストールやレンダラーによる置き換えは検証されません。Nature/Lancet ビルダーでは、スライドを追加した後、保存する前に apply_fonts を呼び出し、インストール済みのラテン文字用および東アジア言語用の書体を選択してください(フォントの埋め込みや、画像、表、グラフ内のフォントの変更は行いません)。エクスポートした PDF では、レイアウトだけでなくフォントも確認してください。
安全に対応する方法は2つあります。
- フォントを埋め込みます(PowerPoint:保存 > ファイルにフォントを埋め込む)。ライセンスで許可されている場合に限ります。
- PDF を用意します — ただし、PDF では埋め込み動画が失われるため、動画クリップを含むデッキでは MP4 ファイルを別途同梱する必要があります。
ビルドスクリプトの役割
ゼロから生成するスクリプトでは、次のことを行う必要があります。
- すべての入力をプレゼンテーションディレクトリからの相対パスで指定し、アーティファクトの生成に使った入力をすべてその中に保管します。 セッション用の作業ディレクトリや一時ディレクトリは翌週には消え、図に埋め込まれたラベルを修正できなくなります。図の生成スクリプトはデッキと同じ場所に保存してください。
- 4つすべてのプレースホルダー座標をまとめて設定します(Step 3.7)。
add_pictureの前に TIFF 画像を PNG に変換し、iPhone の写真は EXIF に基づいて向きを補正します(補正しないと90°回転します)。- スライドの挿入または削除後、
docProps/app.xml(<Slides>、<Notes>、HeadingPairs、TitlesOfParts)を実際の数に同期します。同期しないと、PowerPoint Mac で開くときに復旧ダイアログが表示されます。 <a:srcRect>は別のデッキからそのままコピーします。値の単位は 1/1000 パーセント(上限は 100000)で、EMU ではありません。ここで単位換算を誤ると、画像の99%がスライドの外に切り取られます。- 最後に、スライド数、ノート数、ファイルサイズ、編集可能かどうかの確認結果を出力します。
再構築ではなくパッチ適用 — 既存の PPTX を編集する
提供されたデッキに対する細かな編集(テキストボックスの幅、画像のトリミング、フォントの置き換え、sp3d の削除)には、python-pptx で再生成するのではなく、展開した XML に正規表現や sed でパッチを適用してください。一から再構築すると、<a:srcRect> のトリミング、意図的に設定された <a:sp3d> / <a:scene3d>、マスター/レイアウト/テーマの詳細、app.xml / core.xml のメタデータが失われます。
unzip -q original.pptx -d /tmp/work
python3 -c "
from pathlib import Path
p = Path('/tmp/work/ppt/slides/slide23.xml')
p.write_text(p.read_text().replace('cx=\"9504720\"', 'cx=\"11200000\"'))
"
cd /tmp/work && zip -rq ../patched.pptx . -x '*.DS_Store'
python-pptx を使用するのは、(a)上記のテンプレートを使って新しいデッキを作成する場合と、(b)slide.notes_slide.notes_text_frame.text で発表者ノートを追加する場合に限ります。scripts/inject_speaker_notes.py は、(b)の標準的な例です。デフォルトでは、インラインの **bold** / *italic* を解析してランレベルのスタイルに変換します(python-pptx はテキストをそのまま保存するため、変換しないとマーカーが発表者ビューにそのまま表示されます)。従来どおりのプレーンテキストにするには、--no-markdown を渡してください。各ノートのランはすべて --font-pt の値(デフォルトは 18)で書き込まれます。指定しない場合、ノートはノートマスターの 12 pt を継承します。再現可能なチェックは tests/test_speaker_notes_markdown.py にあります。
出力
output/presentation.pptx に保存してください。発表者ノートはノートペインのみに追加し、ノートを追加する際にスライドのデザインは決して変更しないでください。
ステップ 3.5 — スライド批評(デッキを納品する前に実行)
PPTX をエクスポートした後、各スライドを references/critic_rubrics/slide.md に照らして PASS / PARTIAL / FAIL で評価し、デッキを完成とみなす前に、FAIL または PARTIAL の項目すべてに対して具体的な修正を行ってください。
デッキ全体に関する Mac PowerPoint のチェック(ルーブリックのセクション F:TIFF がないこと、<a:sp3d> がないこと、app.xml のカウントが同期されていること、srcRect の値が 100000 を超えないこと)は必須です。ルーブリックには、それぞれの検出コマンドと修正方法が記載されています。PDF エクスポートと Mac PowerPoint の両方で検証してください。どちらか一方だけでは、4 項目すべてを検出できません。PDF では sp3d の輪郭線と srcRect の破損を検出できません。
_quick_review.md に critic_pass: yes | partial | no と refine_rounds: N を記録してください。
ステップ 3.6 — AI らしさの監査(決定論的。ビルドスクリプトではなく、ビルド済みのデッキで実行)
python3 scripts/check_slide_tells.py output/presentation.pptx --json qc/slide_tells.json
python3 scripts/check_deck_budget.py output/presentation.pptx --json qc/deck_budget.json \
--archetype <from Q0> --minutes <from Q0>
--json はターミナルだけでなく、プロジェクト独自の qc/ ディレクトリに保存してください。スクロールバックにしか存在しない判定は後から数えられず、チェックがどのくらいの頻度で発生するかだけが、残す価値のあるチェックかどうかを示す証拠になります。
check_deck_budget.py は、アーキタイプの機械的な側面を担います。時間に対するスライド数(DECK_OVER_BUDGET)、この部屋で聴きながら理解できる分量に対するスライドごとの単語数(SLIDE_TOO_DENSE)、後方の席でも読める文字サイズの下限(TYPE_TOO_SMALL)をチェックします。--list で予算が表示されます。また、ほかの3つのチェックに意味があるかどうかを判定する ZERO_AREA_TEXT も報告します。詳しくはステップ 3.7 を参照してください。表のテキストはほかのテキストとあわせて測定されますが、チャートや SmartArt のテキストは個別のパーツに含まれるため、測定されません。短い見出しが「Backup」、「Appendix」、「Q&A」、「Reserve」、「Supplementary」のいずれかで始まる最初のスライドで時間計測が終了し、出力には終了したスライドが表示されます。バックアップの開始位置がそこではない場合は、--backup-from N を指定してください。
既知の制限:「Appendix perforation in children」のように、これらの単語のいずれかで始まる短い指摘もバックアップの区切りとみなされ、そこで時間計測が終了します。clock: stops at slide N の行を確認し、誤っている場合は --backup-from N を指定してください。
スライドに現れる兆候を示す判定は6つあり、それぞれレビュー担当者がすぐに気づく特徴です。すべて解消するか、理由を記録したうえで意識的に例外とする必要があります。
| 判定 | 検出内容 | 修正方法 |
|---|---|---|
CHROME_ON_EVERY_SLIDE | スライドの60%以上にある小見出しラベル/ブランドのフッター | ページ番号と区切りスライドは残します。それ以外は削除します。 |
SCAFFOLD_PHRASE | スライド(またはノート)に、自らの構成を説明する文がある — 「要約すると」、「重要なポイントは…」 | その文を削除し、指し示していた内容を直接伝えます。 |
TOPIC_TITLE | 結果を述べず、「Results」のようなタイトルを付けたコンテンツスライド | 断定的な見出しにします:「補助的アブレーションにより局所再発が半減(12% 対 26%)。」 |
SHAPE_MONOTONY | 同じサイズの同じボックスを8回使用 | 並列するアイデアは1つの表にまとめます。並列しないアイデアには異なる図形を使います。 |
DEAD_SPACE_BAND | 中央に穴が空いたように、ほとんど何もないスライド | 情報を増やすか、1つのことを大きく示します。 |
ARROW_NO_SEMANTICS | ラベルのない矢印が2本以上ある | すべての矢印にラベルを付けるか、凡例を追加します。矢印は主張を表します。 |
検出機能は標準ライブラリのみを使用し、同僚から受け取ったデッキを含む任意の .pptx を読み込みます。これはスタイルに関する意見ではなく、「AIが使われたかどうか」を検出するものでもありません。AIを補助として使えば、これらの兆候は残りません。ボタンのように使えば、すべて残ります。
ステップ 3.7 — プレースホルダーはジオメトリを継承します:4つの座標をすべて指定するか、どれも指定しない
レイアウトプレースホルダーは、位置とサイズをレイアウトから取得します。片方だけを割り当てると —
title.width = Inches(11.5) # ← and nothing else
— python-pptx はその値を保持する <a:xfrm> を生成し、残りの値は継承されず、ゼロまたは未設定として記録します。その結果、ボックスの高さまたは幅がなくなり、テキストはファイル内に存在してもスライドには表示されません。
shape.left, shape.top, shape.width, shape.height = ( # all four, together
Inches(0.8), Inches(0.6), Inches(11.5), Inches(1.0))
このような図形には <a:off> もないため、デッキリーダーは図形を破棄します。テキストと文字サイズは check_deck_budget に届きません。実際に、69語を11.5 ptで載せたタイトルスライドが、この方法で予算チェックを通過したことがあります。まず ZERO_AREA_TEXT がこれを報告します。検出された場合はジオメトリを修正し、チェックを再実行してください。最初の実行でほかの項目が何も報告されなかった場合は、合格ではなく、未読み取りとして扱ってください。
ステップ 3.8 — 収まるか?レンダリングを測定し、推測しない
python-pptx は、ボックスに表示できる量を超えるテキストを書き込んでも、何も知らせません。PDF をエクスポートし(Mac 互換性チェックの半分を兼ね、ポータブルな代替手段でもあります)、測定してください。
soffice --headless --convert-to pdf output/presentation.pptx
python3 scripts/check_text_overflow.py output/presentation.pptx --pdf output/presentation.pdf \
--json qc/text_overflow.json
OFF_SLIDE は、スライド下部の予約帯にかかる行です。CARD は、その行が配置されている塗りつぶしブロックの下端を、テキストの下端が越えている行です。どちらも測定距離を報告します(0.03 in と 0.6 in では、必要な修正が異なります)。UNRENDERED は、冒頭部分がスライドのページに存在しない段落(12 文字以上の英字または数字)です。行全体がスライドの外に押し出されると、測定できる矩形が残りません。レンダリングなしでチェックすると、合格を報告するのではなく、測定できなかったため、終了コード 2 で終了します。
pdftotext -bbox-layout の行矩形を使用します。すべての交差、上端や右端でのクリッピング、別の図形に覆われたテキストを検証するものではありません。長いキャプションやタイトルも含め、レンダリング結果をスライドのソースと照らし合わせて確認してください。
計算(フォントサイズ × 行間 × 行数)で代用しないでください。計算は両方向に失敗します。行の高さを 1.42 と定数化すると、CJK 本文がフッターにはみ出しました(レンダリングでの測定値は 1.60 でした)。1.62 に上げると、問題なくレンダリングされた約 290 箇所が却下されました。また、PowerPoint が加える約 1.2 の行送りを考慮しないと、21 行のリストに必要な高さは 5.1 in なのに、計算値は 4.1 in になりました。
モード B:既存スライドにノートを追加する(より一般的)
デッキに手を加える前に、渡されたデッキに対してステップ 3.6 の 2 つのチェックを実行し、結果を報告してください。「スタイルを直すだけ」では診断になりません。SLIDE_TOO_DENSE、TYPE_TOO_SMALL、SCAFFOLD_PHRASE、TOPIC_TITLE があれば、「コンテンツの問題か、デザインの問題か?」を数秒で判断できます。結果をユーザーに伝え、どこに取り組むかを選んでもらってください。デザインに問題がないこともよくあります。
次に行います。
- 既存の PPTX を読み込み、スライドの構成と枚数を把握する
- スピーカースクリプトの各セクションを該当するスライドに対応付ける
- プレゼンテーションに合わせた
inject_notes.pyスクリプトを生成する
ノート挿入スクリプト
${CLAUDE_SKILL_DIR}/scripts/inject_speaker_notes.py のパターンに従い、プレゼンテーションに合わせた inject_notes.py を生成します。生成するスクリプトには、このプレゼンテーション用にカスタマイズした notes ディクショナリと、テンプレートのメイン挿入ループのみを含めてください。
重要なルール
スピーカーノートは、スライドのデザイン、レイアウト、テキスト、画像を変更せずに挿入されます。 スクリプトが変更するのはノートペインだけです。変更前と変更後のスライド内容を比較して確認してください。
モード C:機関・ブランドのテンプレートに内容を入力する
ステップ 0b でユーザーから .pptx/.potx が提供された場合は、デザインを作り直さず、そのテンプレートに内容を入力してください。一から Presentation() を作成すると、機関のマスター、テーマ、ロゴが失われます(「上から作り直すより、上にパッチを当てる」を参照)。
コードのパターン、使用可能な本文レイアウトがない場合のフォールバック、検証の詳細は
references/slide_visual_styles/institutional_brand.md を参照してください。
- 確認:
python3 ${CLAUDE_SKILL_DIR}/scripts/inspect_pptx_template.py <template>を実行すると、すべてのレイアウト(インデックス、名前)、プレースホルダー(idx、種類、サイズ)、テーマのフォント/色が一覧表示されます。テンプレートには、すでに要素が描画されています。学会のレイアウトでは、画面全体に広がる背景画像の色帯がヘッダーを兼ねており、マスターにタイトル枠がすでにあることもよくあります。プレースホルダーを削除して独自のボックスを描画すると、タイトルが色帯に半分かかり、半分は外れてしまいます。既存のデザイン領域(プレースホルダーの矩形、または描画済みヘッダーの色が変わる位置)を見つけ、その内側にテキストを配置してください。 - 割り当て:アウトラインの各スライドを、テンプレートに既存のレイアウト(タイトル/タイトル+コンテンツ/セクションヘッダー/クロージング)のいずれかに割り当てます。レイアウトを新たに作成しないでください。
- 入力:
placeholder_format.idxを使って入力し、機関のフォント、サイズ、ロゴを引き継ぎます。タイトルや本文用にフリーテキストボックスを追加しないでください。 - ノート:通常どおり
scripts/inject_speaker_notes.pyで挿入します。 - 検証:Mac 版 PowerPoint で開き(修復ダイアログが表示されないこと、すべてのスライドにロゴがあること、フォントが保たれていること)、ロゴのメディアが引き続き埋め込まれていることを確認します。スライドの追加・削除後は
docProps/app.xmlを同期してください。
コンテンツのルール(presentation_design_guidelines.md)はブランドの中でも適用されます。1 スライドにつき 1 つのアイデア、表は描き直し、色は機関のパレット内で 3 色以下にします。
フェーズ 4:Q&A の準備
質問の生成
4 つの視点から質問を生成します。方法論への批判者(「なぜこの設計なのですか? なぜ…ではないのですか?」)、分野の専門家(技術的に深い質問)、一般の人(「これは臨床実践にとってどういう意味がありますか?」)、学生・研修生(なじみのない概念についての確認)。
回答の構成
Acknowledge → Evidence → Conclude
"That's an important limitation. [Acknowledge the concern honestly.]
However, [cite specific supporting evidence — author, year, finding].
So while [restate limitation], [conclude with the paper's contribution despite it]."
クイックレビューシート
直前の確認に使う 1 ページの資料:
## Quick Review
### Must-Know Numbers
| Metric | Value | Source |
|--------|-------|--------|
| [Key stat 1] | [value] | [Ref] |
### Common Pitfalls
- Don't confuse [X] with [Y]
- [Classification A] and [Classification B] are independent frameworks
- Slide says [rounded value], precise value is [exact value]
### Key Takeaways (memorize these)
1. [Point 1]
2. [Point 2]
3. [Point 3]
出力ファイルの構成
すべての出力を、ユーザーのプレゼンテーション用ディレクトリに保存します。
{presentation_dir}/
├── _analysis.md # Phase 0: Paper analysis + outline
├── _references.md # Phase 1: Verified references + key data
├── _script.md # Phase 2: Speaker script
├── _qa_prep.md # Phase 4: Expected Q&A
├── _quick_review.md # Phase 4: Pre-presentation review sheet + critic_pass record
├── _slide_critic.md # Phase 3.5: Slide rubric scores per slide
├── inject_notes.py # Phase 3: Tailored note injection script
├── figures/ # Extracted paper figures (if needed)
└── reference/ # Supporting paper PDFs (if downloaded)
スキル間の連携
| タイミング | 使用するもの | 理由 |
|---|---|---|
| スライドに図(ROC、フォレストプロット、KM、フロー図)が必要な場合 | まず /make-figures を使い、その後で埋め込む | 図とスライド、それぞれの作成手法は、同じ Reynolds/Knaflic/Tufte の原則に基づいています |
| 論文の報告チェックリストと並行して確認する場合 | 同じ論文に対して /check-reporting を使う | 論文のプレゼンテーションでは、論文の改訂内容を反映することがよくあります。報告ガイドラインの不足は Q&A で表面化します |
| ビジュアルアブストラクト/セントラルイラストレーション | /make-figures のビジュアルアブストラクト用テンプレート | その後、投稿先ジャーナルの AI 画像ポリシーを確認してください(JACC は禁止、Radiology は開示すれば使用可能) |
| スライドに参考文献を載せる場合 | 納品前に /verify-refs(監査のみ)を使う | 論文の参考文献と同じ、ハルシネーションを防ぐチェック機能です |