mcpField
C
cheatsheet-generator

cheatsheet-generator

github.com/evan715823文档处理222389 次安装29 周前更新
代码仓库

关于 cheatsheet-generator

Cheatsheet Generator 是面向大学生的学习资料转 LaTeX 速查表技能,可读取课程文件并生成适用于 Overleaf、使用 XeLaTeX 编译的彩色高密度文档。生成后可通过编辑器服务根据反馈迭代修改。

主要功能

  1. 01扫描 PDF、PPTX、Markdown、文本和图片
  2. 02提取文档文字与视觉信息
  3. 03按配置生成 LaTeX 速查表
  4. 04支持多种颜色方案和版面设置
  5. 05通过编辑器请求迭代修改

适用场景

  1. 01将课程讲义整理为考试速查表
  2. 02从含图表的 PDF 或幻灯片提取知识
  3. 03按指定版面和颜色生成 LaTeX 文档
  4. 04根据预览反馈修改速查表内容

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/evan715823/cheatsheet-generator-skill --skill cheatsheet-generator

安装后在 Claude Code 中输入/cheatsheet-generator确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

examples/
sample_output.tex
scripts/
config_server.py
editor_server.py
templates/
cheatsheet_base.tex
config_form.html
editor_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)提取文本和视觉内容:

    1. 文本提取 — 提取每一页上的所有文本:
      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>"
      
    2. 页面渲染 — 将包含图表、图形或手写内容的页面渲染为 PNG 图片,然后通过 Read 工具查看(你具备多模态能力):
      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>"
      
      然后使用 Read 工具查看渲染后的 PNG 图片,以查看图表、图片中的公式、图形和手写内容。 对于较大的 PDF(>20 页),只渲染可能包含视觉内容(图表、插图)的页面——已通过步骤 1 获取文本的纯文本页面可跳过。

    结合文本和视觉信息,全面理解内容。

  • PPTX 文件:.pptx 是包含 XML 幻灯片和媒体文件的 zip 归档。使用以下两步提取流程:

    1. 文本提取 — 运行使用 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>"
      
    2. 图片提取 — 从 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_sizeletterpaper
%%MARGIN%%layout.margin_mm + mm4mm
%%FONT_FAMILY%%layout.font_familyVerdana
%%FONT_SIZE%%layout.font_size_pt + pt6pt
%%LINE_HEIGHT%%与字体大小相同6pt
%%COLUMNS%%layout.columns5
%%COLOR_DEFINITIONS%%查阅下方的 colors.schemeOcean 色彩块
%%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}
内容生成规则 — 严格遵守

目标:制作一份极高密度的速查表,填满整页。页面底部留白的速查表浪费了学生的考试资源。请尽可能多地写入相关内容。

  1. 所有内容都使用颜色编码命令:

    • \concept{term} — 青色,用于关键定义和概念
    • \process{term} — 紫色,用于流程名称、算法、程序
    • \category{term} — 绿色,用于分类标签、类型、类别
    • \important{text} — 黄色高亮,用于关键公式和必知事实
    • 节标题(\section{})会自动以深蓝色呈现
  2. 极高密度排版:

    • 使用 \\ 换行,不要使用 \par 或空行
    • 列表:\begin{itemize}...\end{itemize}(已配置为零间距)
    • 内容项之间不要有空行 — 只使用 \\
    • 积极使用缩写:thm、def、prop、iff、w/、s.t.、wrt、WLOG 等
    • 节标题:全部大写,最多 3-5 个词
  3. 公式 — 避免超出栏宽:

    • 简短公式使用行内 $...$
    • 关键公式使用 \important{$formula$}(黄色背景)
    • 绝不要使用 \begin{equation} — 浪费空间
    • 公式过宽时:\resizebox{\linewidth}{!}{$...$}
    • \important{} 会自动适应栏宽换行(内部使用 \parbox), 因此其中的长文本或公式不会溢出
    • 多行公式:在 \[...\] 中使用 aligned
  4. 表格:最小内边距: \begin{tabular}{@{}ll@{}} — 不添加额外间距

  5. 定理:完整写出。 不要缩写定理陈述。使用 \important{} 突出显示定理。

  6. 详细程度(来自配置):

    • concise:仅使用要点和公式,不写说明文字
    • moderate:用 1-2 句说明,包含直观解释
    • detailed:展示推导步骤、边界情况和完整示例
  7. 内容开关:

    • include_proofs:撰写证明概要
    • include_examples:在定义后添加具体示例
    • include_derivations:展示推导步骤
  8. 按主题层级组织内容,不要按源文件顺序组织。将相关概念归组。exam_focus 中的主题应占用最多篇幅。

  9. 完全填满页面。 持续补充内容,直到覆盖材料中的所有主题。如果仍有空间,则添加更多示例、边界情况或相关概念。

  10. 使用 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 — 编辑循环

循环执行:

  1. 等待请求(会一直阻塞,直到用户操作):

    curl -s http://127.0.0.1:<PORT>/wait_for_request
    

    使用 timeout: 600000。

  2. 如果是 {"type": "quit"} → 退出循环。 如果是 {"type": "request", "text": "...", "images": [...]} → 处理该请求。

  3. 处理:读取当前 tex,应用更改,并写入更新后的 tex。 如果 images 数组不为空,则读取每个图片路径——你具备多模态能力, 可以查看图片。利用图片中的视觉信息来指导编辑 (例如,用户上传了要添加的公式截图)。

  4. 发布结果(使用 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 @-
    
  5. 返回步骤 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 编译。祝你考试顺利!

评论

支持 Markdown