# Paper Maker

> 把题目图片或文档（PDF/Word/Markdown/文本）整理成带 LaTeX 公式和配图的试卷 PDF，并交付可编辑的 .tex 源文件。当用户说"把图片转成文档"、"提取图片中的题目"、"整理题目"、"把文档转成试卷"、"提取文档里的题目"，或提到图片转文字、题目提取等关键词时使用。

- Skill: `alizeisnotalice/paper-maker` (Agent Skill, multi-file: 7 files)
- Install (CLI): `npx skillmds@latest add alizeisnotalice/paper-maker`
- Raw SKILL.md: https://api.skillmd.com/api/skills/alizeisnotalice/paper-maker/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: alizeisnotalice (https://skillmd.com/u/alizeisnotalice)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/alizeisnotalice/paper-maker

---


# 题目图片/文档转试卷 PDF

## 0. 视觉能力预检（图片输入必做）

- 判断当前会话是否**实际支持图像输入与理解**，不能只根据模型名称猜测。DeepSeek V4 Flash Vision 可作为经济型视觉模型；任何确认支持图像输入的模型均使用同一视觉流程。
- 支持图像时：以原图为准，高分辨率逐图读取；复杂扫描页先按题块/图块处理，不把整页当作一张配图。
- 不支持图像时，先向用户明确提示：**“当前模型无法直接识图，已切换 OCR 兜底；文字、公式和图像边界需人工核对。”** 然后才可运行系统 OCR。OCR 得出的文字、公式、图形边界均标注为「待核对」；看不清的字符仍写「？」。
- 识别每个题块时先建立可复核记录：`题干`、`选项`、`公式`、`示意图区域`（原图坐标 x,y,w,h）、`置信度/待核对项`。不要根据该记录猜测或补全原图未出现的信息。
- 对 DeepSeek V4 Flash Vision，先要求它返回上述识别清单和可验证区域坐标，确认区域只含示意图后才裁剪；不得把模型输出直接视为已核对结果。其他多模态模型复用完全相同的输入和输出约定。

## 工作流程

### 1. 输入类型判断

- 输入是图片或图片文件夹 → 直接进入第 4 步「图片处理」。
- 输入是文档（.pdf / .docx / .md / .txt）→ 运行 `scripts/extract_document.py <文档> -o <输出目录>`，然后读取输出的 `content.txt`（全文+占位符）和 `pages.txt`（轻量索引）。
- 遇到旧版 .doc 或其他不支持格式 → 告知用户另存为 .docx，或说明不支持。

### 2. 简单判断，确定题目部分

- 只做快速判断，不逐字精读：
  - 图片输入：快速浏览/抽样识别每张图，区分题目图与无关图（封面、答案页、说明图），确定处理范围与顺序。
  - 文档输入：先读 `pages.txt`，根据页首行、题号/题型标记、图片分布，判断题目所在的页/段落范围。
- 排除封面、目录、考试说明、答案页、水印等非题目内容，只保留题目部分。
- 判断不明确时，标记疑问并询问用户，不擅自猜测。

### 3. 内容分流

- 情况① 图文混合文档：`content.txt` 的文本可直接使用（无需 OCR），但公式要校正为 LaTeX 数学模式；用视觉筛选 `images/` 中真正的题目配图（丢弃装饰图），需要时裁剪/清理（规则见第 4 步）→ 进入第 5 步。
- 情况② 纯文字文档：直接用文本识别题干、公式、选项（公式转 LaTeX 数学模式）→ 进入第 5 步（无配图）。
- 情况③ 纯图片文档（扫描版 PDF / 图片型文档）：`extract_document.py` 已拆分为页图片（PDF 渲染到 pages/，DOCX 提取到 images/）→ 进入第 4 步按图片流程处理。
- 输入本身是图片/文件夹 → 直接进入第 4 步。

### 4. 图片处理（图片输入 / 情况③ / 情况① 的配图）

1. 清点图片顺序与数量；内容相同的重复图片合并为一道题。原图优先，不能用缩略图或聊天预览图替代。
2. 逐题块识别并完成「视觉能力预检」规定的记录。默认只保留几何图、坐标图、表格、实验装置等示意图；题干、选项和可识别公式转为 LaTeX，不作为配图保存。
3. 先用视觉模型给出的 `x,y,w,h` 定位单独示意图，再运行：
   `scripts/tighten_crop.py <原图> -o <配图> --region x,y,w,h --manifest <配图>.crop.json`
   - 脚本会收紧边界、保护细线/箭头/坐标轴，并默认清理内容保护区外的中性灰底；需要保留原背景时加 `--no-clean-background`，暗角影响边界时调低 `--threshold`（如 200）。禁止手工截图。
   - 每张裁剪图与 `.crop.json` 必须目视复核：四周留白接近默认 8px、不含题干文字、不裁掉图形内容。初始 `review_status` 必须是 `pending`；复核合格才重跑脚本并写 `--review-status approved`。不合格时调整区域重裁，无法安全裁剪则保留原图并标「待核对」。
4. 将已复核的题目文字与配图一一对应；OCR 或未批准裁剪不得作为无条件可信的依据。

### 5. 排版（所有情况通用）

- 复制 `assets/gaokao-template.tex` 作为排版模板，按需微调 `\questionitemfig` 中配图的宽度和高度（默认：宽 85% 行宽、高不超过页面 30%），替换其中的内容；仿照高考版式，相同题型放在一起，选择/填空题之间空一行；解答题之间用 `\workarea{5}` 留出 5 行作答区。

### 6. 编译

- 用 `which xelatex` 检测系统环境；有则用 xelatex 编译**两遍**（页脚"共 N 页"需要两遍才正确），或使用 `latexmk -pdf`；没有 xelatex 则用 Tectonic；两者都没有时按「无本地 LaTeX 的替代方案」处理（优先在线编译，HTML 兜底须人工核对）。

### 7. 渲染检查（交付前必做）

- 运行 `scripts/render_check.py` 把 PDF 逐页渲染成图片，检查溢出、重叠、公式错误、配图裁剪是否准确，并检查编译日志没有 `Missing character` 警告；同时检查页首没有孤立分隔线、题号不孤悬在页尾、每题尽量不跨页；发现问题则修改后重新编译并再次检查。

### 8. 交付

- 交付 .tex 源文件和 PDF（同名、同一目录，如 `试卷.tex` 与 `试卷.pdf`）。
- 若目标用户没有本地 LaTeX，交付时附上在线编译说明：把 `试卷.tex` 与 `figures/`（如有）一起打包，上传到 Overleaf 或 TeXPage 新建项目即可编译。

## 无本地 LaTeX 的替代方案

- **在线编译/编辑（推荐，零安装）**：把 `试卷.tex` 与 `figures/` 配图目录打包，上传到 Overleaf（overleaf.com）或 TeXPage（texpage.com，中文友好、支持 ctex）新建项目编译。模板自包含（宏定义都在 .tex 内），无需修改即可出 PDF，也可直接在浏览器里编辑题目。
- **仅查看/打印**：直接把已生成的 PDF 发给用户即可，不需要任何 LaTeX 环境。
- **需要 Word 编辑**：若环境装有 pandoc，可执行 `pandoc 试卷.tex -o 试卷.docx --resource-path=.` 生成可编辑 Word（公式转为 OMML，需人工核对）；没有 pandoc 时建议用在线编辑器修改 LaTeX 后重新导出。
- **本机无 LaTeX 的兜底**：可生成含 MathJax 的 HTML 用浏览器打开并打印为 PDF，但复杂 ctex 模板与自定义宏可能无法完整还原，必须人工核对后才能交付。

## 试卷版式规范（九科通用）

- A4 单栏；正文小四宋体（12pt）、约 1.18 倍行距（紧凑排版）、数字/字母 Times New Roman——模板已内置，不要改动这些设置。
- 试卷标题用二号黑体、学科/时间/分值行用三号黑体（通过模板的 `\examtitle` 实现）。
- 层级序数按"一、 → 1. →（1）→ ①"逐级使用；① 只用于正文，禁止出现在标题或加粗文字中（会缺字形）。
- 选择题选项序号用大写英文字母（A. B. C. D.）。

### 科目特例

- 语文：阅读材料用楷体（`{\kaishu ...}`）；作文题用 `\workarea{20}` 留足作答空间。
- 英语：题干与选项中的英文走 Times New Roman（模板已设置）；写作题用 `\workarea` 留足作答空间。
- 化学：化学方程式/离子式用 `\ce{}`（需在导言区加 `\usepackage{mhchem}`），如 `\ce{2H2 + O2 -> 2H2O}`。
- 政治/历史/地理：材料题引文用楷体（`{\kaishu ...}`）。
- 数学/物理/化学/生物：公式一律用数学模式；物理量斜体、单位正体（见排版规则）。

## 排版与规则

- 题干用 LaTeX 排版，公式、分数、上下标、希腊字母一律用数学模式。
- 有配图的题目：题干在上、配图在下（配图居中，宽 85% 行宽、高不超过页面 30%）；无配图则单栏排版。
- 相同题型（选择、填空、解答）连续排列，不要打乱。
- 选择题和填空题之间留一行空格，解答题之间用 `\workarea{5}` 留 5 行供作答。
- 填空题统一用 `\underline{\qquad}`（或 `\underline{\hspace{2cm}}` 指定宽度），禁止使用裸下划线 `____`（会编译报错）。
- 物理量、向量用加粗斜体（`\boldsymbol{}`）；单位用正体 `\mathrm{}`（如 $\mathrm{kg}$、$\mathrm{m/s^{2}}$）。
- 正文中的 `% _ & # $` 等特殊字符必须转义（`\% \_ \& \# \$`）；从文档提取的文本要逐项检查转义。
- 长公式用 `aligned`/`split` 换行，不允许超出页边。
- 数据表用 booktabs 风格（`\toprule` / `\midrule` / `\bottomrule`）。

## 防幻觉红线

- 看不清的字标「？」或「来源未知」，严禁推测、补全或编造内容。
- 只识别图片中真实存在的内容，不自行添加原题没有的信息。
- 题目范围判断不明确时询问用户，不擅自猜测。

## 资源

- `assets/gaokao-template.tex`：九科规范 LaTeX 模板（A4 单栏、小四宋体、紧凑行距、二号黑体标题、页脚页码、booktabs 表格、Times New Roman 数字字母）。排版时复制它，替换 `\begin{document}` 与 `\end{document}` 之间的内容。
- `scripts/extract_document.py`：文档提取脚本。把 PDF/Word/Markdown/文本 提取为 `content.txt`（全文+[图N]占位符）、`pages.txt`（轻量索引：页首行、题号/题型标记、类型判断）和 `images/`（嵌入图片）。
- `scripts/render_check.py`：把 PDF 每页渲染成 PNG，用于交付前的逐页核对（渲染工具自动回退：pdftoppm → pdf2image → PyMuPDF → sips）。
- `scripts/tighten_crop.py`：紧贴内容边界的配图裁剪脚本。视觉模型先给出只含示意图的 `--region x,y,w,h`（支持像素或归一化坐标）；脚本保护细线并输出可追溯的 `--manifest` JSON，默认待人工复核。

