登壇スライドに載せる図・構成図・挿絵の作り方。情報量の絞り方、SVGの描き方、文字サイズの下限、挿絵の置き方、書き出し後の検査。「図を作って」「構成図を描いて」「図が見づらい」「挿絵を入れて」と言われたら読む。
npx skills add https://github.com/minorun365/minorun-marp-skill --skill slide-figures
AIが作る図の失敗は、ほぼすべて「いらない情報を足しすぎ」に集約される。スライドの版面は思っているより狭く、要素を足すより大きくするほうが効く。
図を主役にするか、文字を主役にするか、どちらかに決める。図が主役のスライドは、テキストを見出しと導入の1行までにして、図を版面の幅いっぱいに使う。文字が主役のスライドは、図を挿絵の大きさ(幅100〜330px)に留めて隅へ置く。両方を立てようとすると、図は縮み本文は詰まる。
仕組みの図は1スライドで完成させない。同じ図を3〜5スライドに割り、要素を1つずつ足していく。聞き手の認知負荷が下がり、話し手も説明の順序に迷わない。
足す前に「これが無いと図が読めなくなるか」を問う。「あると親切」で足したものが、結果として図全体を小さくする。
図の中の文字は、書き出したPDFの実寸で16pt以上にする。会場の後ろの席から読める下限である。SVGのソースに font-size: 21px と書いてあっても、Marpで ![center w:820] と縮めて貼れば13ptになる。目安として、viewBoxの幅が1000のSVGを w:1000 で貼るなら、箱のラベルは19〜22pxにする。
文字と箱の縁のあいだは14px以上あける。
収まらないときの直す順番は、文言を短くする、箱を広げる、図の幅を上げる、font-sizeを上げる、の順である。長い文言を大きくしても箱に入らない。文言を削れば、同じ箱で13ptから17ptまで上げられる。
ソースの数字から「この幅なら収まるはず」と計算しない。実際の字幅はソースに書かれておらず、font-size × 文字数 × 0.6 のような見積もりは2割ほど外れる。縮小したページ画像を見て「収まっている」と判断するのも、同じくらい当てにならない。数pxのはみ出しは見えない。
描画してから getBBox() で測る。tools/check-svg-box-fit.mjs がこれを行う。
箱の中にアイコンを入れると、そのぶん文字が押し出される。飾りのアイコンなら外すのが正解で、フォントを1〜2px下げても解決しない。
SVGの <marker> は既定が markerUnits="strokeWidth" なので、矢尻の実寸は markerWidth × stroke-width になる。8 × 4 なら32pxで、42pxの線の両端に付けると軸が消えて矢尻だけが残る。
markerUnits="userSpaceOnUse" で18px前後に固定するstroke にグラデーションを指定すると、線が描画されない。線のbboxの片方の辺が0になり、objectBoundingBox のグラデーションが定義できないためである。線と marker の中は単色にする。斜めの線と曲線には使ってよいgradientUnits="userSpaceOnUse" にして、x1 と x2 に図全体の座標を入れる。既定のままだと箱ごとにグラデーションが完結して、同じ柄が繰り返されるmarker-end:url(#id) のid文字列まで書き換わって矢尻が消えることがある。置換したら矢印の先端まで目で確かめるviewBox で切る。viewBox="0 50 1000 320" のように中身の無い帯を落としてから幅を上げる作者は「いらすとや」の素材をよく使う。画像はこのリポジトリに同梱していないので、必要なものを都度サイトから取得する。
https://www.irasutoya.com/search?q=<語> で探す。見た目の語(ロボット)より用途の語(AI 会話)のほうが当たるcurl -sL -o "images/irasutoya-<内容>.png" "<直URL>" で保存する利用条件(点数の上限や禁止される使い方)は、いらすとやの「ご利用について」で各自確かめる。
手元に保存した素材が色落ちしていたり低解像度だったりしたら、着色や拡大でごまかさず、元の記事を探して取り直す。
絵が本文の名詞そのものを描いているかで決める。「待つ」のスライドに待つ人、「馬車」の比喩に馬車、は通る。雰囲気合わせ(AIっぽい、仕事っぽい、OKっぽい)で選んだ絵は全部外す。合う絵が無いスライドには置かない。
人物の格を本文の意味に合わせる。「優秀な部下」の喩えに、やんちゃな子どもの絵を置かない。
事例、製品、リポジトリを紹介するスライドは、挿絵ではなく実物のスクリーンショットを使う。
<img> にインラインの style 属性を書いても効かない。Marpのパーサーが属性を落とすためで、PDFを書き出して見るまで気づけない。大きさの違うクラスを用意する。
.ill { position: absolute; right: 118px; bottom: 200px; width: 200px; }
.ill.sm { width: 160px; bottom: 95px; }
.ill.md { width: 180px; bottom: 110px; }
bottom の値はスライドごとに、本文の下端からスライドの下端までの空きを測って決める。
DOMから画像のURLを抜いて直接ダウンロードするのを、最初の手にしない。レスポンシブなサイトは同じ図の縦積み版と横並び版を両方持っていることがあり、URLだけ拾うと縦積み版を掴む。スライドは16:9なので、必要なのはほぼ常に横並び版である。
tools/check-reuse-diff.py で流用元と突き合わせる機械検査と目視は、見ているものが違う。両方やる。
python3 tools/check-figure-text.py deck.pdf # 16pt未満の文字、箱の縁まで14px未満の文字
node tools/check-svg-box-fit.mjs images/*.svg # SVGを描画して文字と枠の余白を実測
機械検査は「存在する要素」を測るので、要素が丸ごと描かれなかった崩れは検出できない。図を触ったページは150dpi以上で1ページずつ焼いて見る。見るのは、文字と図形の重なり、矢印の軸、線の合流部、枠の角、文字が箱からはみ出していないか、である。
1つの図を指摘されたら、同じデッキの全図へ同じ検査を当ててから直す。指摘は1つでも、同じ条件に当てはまる図はたいてい複数ある。
報告には、通した検査の名前をそのまま並べる(check-figure-text.py OK、全ページ目視 OK)。「書き出しました」だけでは、通していない検査が見えなくなる。
Take minorun365/slide-figures from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.