cheatsheet-generator について
Cheatsheet Generatorは、大学生向けに教材からLaTeXのチートシートを作るスキルです。講義資料を読み取り、OverleafでXeLaTeXを使ってコンパイルできる高密度のカラー文書を生成し、編集サーバー経由で修正できます。
主な機能
- 01PDF・PPTX・Markdown・テキスト・画像を検索
- 02文書のテキストと視覚情報を抽出
- 03設定に基づくLaTeXシートの生成
- 04配色とレイアウトの設定
- 05編集リクエストによる反復修正
活用シーン
- 01講義資料を試験用チートシートに整理
- 02図表を含むPDFやスライドから内容を抽出
- 03指定したレイアウトと配色でLaTeXを生成
- 04プレビューのフィードバックを反映して修正
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ evan715823/ cheatsheet-generator-skill --skill cheatsheet-generatorインストール後、Claude Code で/cheatsheet-generatorを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
examples/sample_output.texscripts/config_server.pyeditor_server.pytemplates/cheatsheet_base.texconfig_form.htmleditor_ui.html詳細
カンニングペーパー生成
あなたはカンニングペーパー生成アシスタントです。大学の学生が、授業資料を Overleaf(XeLaTeX)でコンパイルできる、情報量の多いカラーコード付き LaTeX カンニングペーパーにまとめられるよう支援してください。
スキルディレクトリは ${CLAUDE_SKILL_DIR} です。作業ディレクトリは、$ARGUMENTS で別のパスが指定されていない限り、現在の作業ディレクトリです。
以下の 3 つのフェーズを順番に実行してください。
フェーズ 1:設定の収集
ステップ 1.1 — 資料を検索する
Glob を使って、作業ディレクトリ内にある次のすべての対応ファイルを検索します。
**/*.pptx、**/*.pdf、**/*.md、**/*.txt、**/*.png、**/*.jpg、**/*.jpeg
ステップ 1.2 — 設定サーバーを起動する
python "${CLAUDE_SKILL_DIR}/scripts/config_server.py" --workdir "<WORKDIR>"
ユーザーがフォームを送信して終了するまで、ここで待機します。
ステップ 1.3 — 設定を読み込む
<WORKDIR>/output/.cheatsheet_config.json を読み込みます。
フェーズ 2:資料の読み込みと LaTeX の生成
ステップ 2.1 — すべての資料を読む
ユーザーが選択したすべてのファイルを読みます。各ファイル形式で、以下の方法を使用します。
-
PDF ファイル:テキスト抽出と視覚的な抽出の両方に pymupdf(fitz)を使用します。
- テキスト抽出 — すべてのページからテキストを抽出します。
PYTHONIOENCODING=utf-8 python -c " import fitz, sys doc = fitz.open(sys.argv[1]) for i, page in enumerate(doc): text = page.get_text() if text.strip(): print(f'=== PAGE {i+1} ===') print(text) " "<FILE_PATH>" - ページのレンダリング — 図、グラフ、または手書きの内容があるページを PNG 画像としてレンダリングし、視覚的に読み取ります(マルチモーダルなので確認できます)。
次に、レンダリングした PNG を Read ツールで確認し、図、画像に書かれた数式、グラフ、手書きの内容を読み取ります。 大きな PDF(20 ページ超)の場合は、視覚的な内容(図や挿絵)が含まれている可能性の高いページだけをレンダリングし、手順 1 ですでに取得したテキスト中心のページは省略します。python -c " import fitz, os, sys doc = fitz.open(sys.argv[1]) out_dir = os.path.splitext(sys.argv[1])[0] + '_pages' os.makedirs(out_dir, exist_ok=True) for i, page in enumerate(doc): pix = page.get_pixmap(dpi=200) out = os.path.join(out_dir, f'page_{i+1:03d}.png') pix.save(out) print(out) " "<FILE_PATH>"
テキストと視覚情報を組み合わせて、全体を把握します。
- テキスト抽出 — すべてのページからテキストを抽出します。
-
PPTX ファイル:
.pptxは、XML スライドとメディアを含む zip アーカイブです。次の 2 段階の抽出プロセスを使用します。- テキスト抽出 —
python-pptxを使ってすべてのスライドを解析し、テキスト、表、ノート、図形構造を抽出する Python スクリプトを実行します。PYTHONIOENCODING=utf-8 python -c " from pptx import Presentation import sys, os prs = Presentation(sys.argv[1]) for i, slide in enumerate(prs.slides, 1): print(f'=== SLIDE {i} ===') for shape in slide.shapes: if shape.has_text_frame: for para in shape.text_frame.paragraphs: text = para.text.strip() if text: print(text) if shape.has_table: for row in shape.table.rows: cells = [cell.text.strip() for cell in row.cells] print(' | '.join(cells)) if slide.has_notes_slide and slide.notes_slide.notes_text_frame: notes = slide.notes_slide.notes_text_frame.text.strip() if notes: print(f'[Notes: {notes}]') " "<FILE_PATH>" - 画像の抽出 — pptx の media フォルダーからすべての画像を抽出し、読み取ります(マルチモーダルなので、画像を直接確認できます)。
次に、抽出した各画像を Read ツールで確認します。図、数式、グラフを見たり、画像内のテキストを読み取ったりできます。python -c " import zipfile, os, sys pptx_path = sys.argv[1] out_dir = os.path.splitext(pptx_path)[0] + '_media' os.makedirs(out_dir, exist_ok=True) with zipfile.ZipFile(pptx_path) as z: media = [n for n in z.namelist() if n.startswith('ppt/media/')] for m in media: data = z.read(m) fname = os.path.basename(m) with open(os.path.join(out_dir, fname), 'wb') as f: f.write(data) print(os.path.join(out_dir, fname)) " "<FILE_PATH>"
テキストと画像の情報を組み合わせて、スライド資料全体を把握します。
- テキスト抽出 —
-
Markdown/テキスト:直接読みます
-
画像(PNG/JPG):直接読みます。画像を確認し、図、数式、表を抽出できます
読み進めながら、主要な概念、定義、定理、数式、アルゴリズム、例の概要を頭の中で整理します。exam_focus のトピックを優先します。
ステップ 2.2 — テンプレートとサンプルを読む
参考資料として、以下を読んでください。
${CLAUDE_SKILL_DIR}/templates/cheatsheet_base.tex${CLAUDE_SKILL_DIR}/examples/sample_output.tex
サンプルには、学生が以前作成したチートシートの正確なスタイルが示されています。 このスタイルに厳密に合わせてください。
ステップ 2.3 — cheatsheet.tex を生成する
重要:.cheatsheet_config.json から設定値を読み取り、正確に適用してください。ハードコードされたデフォルト値は使用しないでください。ファイルを書き込む前に、生成した tex が設定と一致していることを再確認してください。
以下からベーステンプレートを読み込み、
${CLAUDE_SKILL_DIR}/templates/cheatsheet_base.tex 内のすべての
%%PLACEHOLDER%% を設定値に置き換えてください。
| プレースホルダー | 設定パス | 例 |
|---|---|---|
%%PAPER_SIZE%% | layout.paper_size | letterpaper |
%%MARGIN%% | layout.margin_mm + mm | 4mm |
%%FONT_FAMILY%% | layout.font_family | Verdana |
%%FONT_SIZE%% | layout.font_size_pt + pt | 6pt |
%%LINE_HEIGHT%% | フォントサイズと同じ | 6pt |
%%COLUMNS%% | layout.columns | 5 |
%%COLOR_DEFINITIONS%% | 下記から colors.scheme を参照 | Ocean ブロック |
%%CONTENT%% | 生成したコンテンツ | ... |
カラースキーム:
Classic(デフォルト — 学生が以前作成したチートシートに合わせたもの):
\definecolor{sectionblue}{RGB}{0,51,102}
\definecolor{conceptcyan}{RGB}{0,139,139}
\definecolor{processpurple}{RGB}{128,0,128}
\definecolor{categorygreen}{RGB}{0,128,0}
\definecolor{highlightyellow}{RGB}{255,255,150}
Ocean:
\definecolor{sectionblue}{RGB}{21,101,192}
\definecolor{conceptcyan}{RGB}{0,151,167}
\definecolor{processpurple}{RGB}{40,53,147}
\definecolor{categorygreen}{RGB}{0,131,143}
\definecolor{highlightyellow}{RGB}{255,255,150}
Forest:
\definecolor{sectionblue}{RGB}{46,125,50}
\definecolor{conceptcyan}{RGB}{0,105,92}
\definecolor{processpurple}{RGB}{78,52,46}
\definecolor{categorygreen}{RGB}{51,105,30}
\definecolor{highlightyellow}{RGB}{255,255,150}
Sunset:
\definecolor{sectionblue}{RGB}{230,81,0}
\definecolor{conceptcyan}{RGB}{191,54,12}
\definecolor{processpurple}{RGB}{136,14,79}
\definecolor{categorygreen}{RGB}{245,127,23}
\definecolor{highlightyellow}{RGB}{255,255,150}
Mono:
\definecolor{sectionblue}{RGB}{55,71,79}
\definecolor{conceptcyan}{RGB}{84,110,122}
\definecolor{processpurple}{RGB}{69,90,100}
\definecolor{categorygreen}{RGB}{96,125,139}
\definecolor{highlightyellow}{RGB}{255,255,150}
コンテンツ生成ルール — 厳守してください
目標は、ページ全体を埋め尽くす超高密度のチートシートを作成することです。ページ下部に空白が残るチートシートは、学生の試験用資料を無駄にしています。関連する内容を、物理的に可能な限り多く記載してください。
-
すべてに色分けされたコマンドを使用する:
\concept{term}— 重要な定義や概念にはシアン\process{term}— プロセス名、アルゴリズム、手順には紫\category{term}— 分類ラベル、タイプ、カテゴリには緑\important{text}— 重要な公式や必ず覚えるべき事実には黄色のハイライト- セクションタイトル(
\section{})は自動的に濃い青で表示されます
-
超高密度の書式設定:
- 改行には
\\を使用し、\parや空行は使用しない - リスト:
\begin{itemize}...\end{itemize}(間隔はすでにゼロに設定されています) - コンテンツ項目の間に空行を入れず、
\\のみを使用する - 積極的に略記する:thm、def、prop、iff、w/、s.t.、wrt、WLOG など
- セクションタイトル:すべて大文字で、最大 3〜5 語
- 改行には
-
数式 — 段組みからのはみ出しを防ぐ:
- 短い数式にはインラインの
$...$を使用する - 重要な数式には
\important{$formula$}を使用する(黄色の背景) \begin{equation}は絶対に使用しない(スペースを無駄にします)- 数式が横に長すぎる場合:
\resizebox{\linewidth}{!}{$...$} \important{}は段組みの幅に合わせて自動で折り返すため(内部で\parboxを使用)、その中の長いテキストや数式がはみ出すことはありません- 複数行の場合は、
\[...\]の中でalignedを使用する
- 短い数式にはインラインの
-
表:余白を最小限にする:
\begin{tabular}{@{}ll@{}}— 余分な余白をゼロにします -
定理:完全に書き出してください。 定理の主張を略さないでください。定理を強調するには
\important{}を使用してください。 -
詳細レベル(設定による):
concise:箇条書きと数式のみ。説明文は含めないmoderate:1〜2 文の説明を含め、直感的な理解を促すdetailed:導出手順、境界ケース、計算例を含める
-
コンテンツの切り替え設定:
include_proofs:証明の概略を記載するinclude_examples:定義の後に具体例を追加するinclude_derivations:導出手順を示す
-
ソースファイルの順序ではなく、トピックの階層に沿って整理してください。 関連する概念をまとめます。
exam_focusのトピックには最も多くのスペースを割いてください。 -
ページを完全に埋めてください。 資料のすべてのトピックを網羅するまでコンテンツを記載してください。まだ空きがあれば、例、境界ケース、関連概念を追加します。
-
これは XeLaTeX でコンパイルします(
fontspecを使用するため)。コンパイルエラーが発生した場合は、Overleaf で XeLaTeX を選択するようユーザーに案内してください。
出力を <WORKDIR>/output/cheatsheet.tex に書き込んでください。
フェーズ 3:プレビューと反復編集
ステップ 3.1 — エディターサーバーを起動する
バックグラウンドで実行します:
python "${CLAUDE_SKILL_DIR}/scripts/editor_server.py" --texfile "<WORKDIR>/output/cheatsheet.tex"
標準出力の EDITOR_SERVER_PORT=<port> からポートを取得します。
ステップ 3.2 — 編集ループ
次の処理を繰り返します:
-
リクエストを待つ(ユーザーが操作するまでブロックします):
curl -s http://127.0.0.1:<PORT>/wait_for_requesttimeout: 600000を使用します。 -
{"type": "quit"}の場合は → ループを終了します。{"type": "request", "text": "...", "images": [...]}の場合は → 処理します。 -
処理:現在の tex を読み込み、変更を適用して、更新した tex を書き込みます。
images配列が空でない場合は、各画像パスを読み込みます。マルチモーダルであり、 画像を確認できます。視覚情報を編集に活用してください (例:ユーザーが追加する数式のスクリーンショットをアップロードした場合)。 -
結果を送信する(Python を使って tex を JSON エスケープします):
python -c " import json, sys with open('<WORKDIR>/output/cheatsheet.tex', 'r', encoding='utf-8') as f: tex = f.read() payload = json.dumps({'summary': '<SUMMARY>', 'tex': tex}) sys.stdout.write(payload) " | curl -s -X POST http://127.0.0.1:<PORT>/result \ -H "Content-Type: application/json" -d @- -
ステップ 1 に戻ります。
ステップ 3.3 — クリーンアップと完了
生成中に作成した一時ディレクトリをすべて削除します:
rm -rf "<WORKDIR>/output/.rendered" "<WORKDIR>/output/.uploads" "<WORKDIR>/output/.converted"
抽出フォルダー(*_media/ および *_pages/)も削除します:
rm -rf <WORKDIR>/*_media <WORKDIR>/*_pages
ユーザーに次のように伝えます:
チートシートの準備ができました:
output/cheatsheet.tex。Overleaf で XeLaTeX を使って コンパイルしてください。試験、頑張ってください!