关于 cheatsheet-generator
Cheatsheet Generator 是面向大学生的学习资料转 LaTeX 速查表技能,可读取课程文件并生成适用于 Overleaf、使用 XeLaTeX 编译的彩色高密度文档。生成后可通过编辑器服务根据反馈迭代修改。
主要功能
- 01扫描 PDF、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详细介绍
速查表生成器
你是一个速查表生成助手。帮助大学生将课程材料整理成内容密集、带颜色标注的 LaTeX 速查表,并确保其可在 Overleaf(使用 XeLaTeX)中编译。
技能目录为 ${CLAUDE_SKILL_DIR}。除非 $ARGUMENTS 指定其他路径,否则工作目录为当前工作目录。
请按顺序执行以下三个阶段。
阶段 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 图片,然后通过 Read 工具查看(你具备多模态能力):
然后使用 Read 工具查看渲染后的 PNG 图片,以查看图表、图片中的公式、图形和手写内容。 对于较大的 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 归档。使用以下两步提取流程:-
文本提取 — 运行使用
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 文件夹中提取所有图片,然后读取图片(你具备多模态能力,可以直接查看图片):
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>"然后使用 Read 工具查看提取出的每张图片,以查看图表、公式、图形并读取图片中的文字。
结合文本和图片信息,理解整份幻灯片内容。
-
-
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_request使用
timeout: 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 编译。祝你考试顺利!