# Oral Math Worksheet

> 生成（并可直接打印）100以内口算练习 PDF，支持加法、减法、乘法、连加、连减、加减混合、乘加、乘减八种题型，按百分比占比混排，可多套多页、可出带答案的批改卷。Whenever the user wants oral-math / mental-math / arithmetic practice worksheets — 口算题、口算练习、算术练习卷、给孩子出题、打印练习卷、100以内加减乘 — use this skill, even if they don't say "PDF" or "skill". Also use it when an automation agent (OpenClaw / WorkBuddy) needs a programmatic entry point to auto-generate or auto-print such worksheets.

- Skill: `gebilaoman/oral-math-worksheet` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add gebilaoman/oral-math-worksheet`
- Raw SKILL.md: https://api.skillmd.com/api/skills/gebilaoman/oral-math-worksheet/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: gebilaoman (https://skillmd.com/u/gebilaoman)
- Updated: 2026-09-22
- Page: https://skillmd.com/skills/gebilaoman/oral-math-worksheet

---


# 口算练习 PDF 生成器

生成 100 以内口算练习卷 PDF。核心工具是 `scripts/oral_math.py`：一个自包含的命令行程序，
中文字体已内嵌（不依赖系统字体、不依赖浏览器，离线可用），只需 `reportlab` 一个依赖。

## 何时用
- 用户想要口算 / 心算 / 算术练习题、练习卷，或要给孩子出题、打印练习卷。
- 用户要求某种题型组合（如"加减为主掺点乘法"、"只要乘加乘减"）或指定题量/套数。
- 自动化工具需要一个可脚本化的入口来批量生成或直接打印。

## 一次性准备
```bash
pip install reportlab
```

## 用法
先确保 `scripts/oral_math.py` 可用，然后按需要调用：
```bash
python scripts/oral_math.py --out out.pdf                       # 默认 50 题、1 套、随机、无答案
python scripts/oral_math.py --count 50 --sets 10 --out ten.pdf  # 10 套 = 10 页
python scripts/oral_math.py --answers --out answer.pdf          # 带答案（批改卷）
python scripts/oral_math.py --order grouped --out g.pdf         # 按题型排列（默认 shuffle 随机打乱）
python scripts/oral_math.py --weights add=30,sub=30,mul=20,muladd=10,mulsub=10 --out w.pdf
python scripts/oral_math.py --seed 42 --out fixed.pdf           # 固定种子，可复现
python scripts/oral_math.py --sets 5 --print                    # 生成后送默认打印机(lp)
python scripts/oral_math.py --sets 5 --print --printer Canon_XXX
```
程序把生成的 PDF 路径打印到 stdout，便于自动化捕获。生成后用 `present_files` 交付给用户。

### 参数
| 参数 | 说明 | 默认 |
|---|---|---|
| `--count` | 每套题量 | 50 |
| `--sets` | 套数 / 页数 | 1 |
| `--answers` | 显示答案 | 关 |
| `--order` | `shuffle` 随机 / `grouped` 按题型排列 | shuffle |
| `--weights` | 各题型占比，逗号分隔；**自动归一，不必凑满 100** | 内置默认 |
| `--seed` | 随机种子，可复现 | 每次不同 |
| `--out` | 输出 PDF 路径 | 口算练习.pdf |
| `--print` / `--printer` | 生成后调用系统 `lp` 打印 / 指定打印机 | 关 |

题型 key：`add 加法 / sub 减法 / mul 乘法 / add3 连加 / sub3 连减 / mix 加减混合 / muladd 乘加 / mulsub 乘减`。

**连加（add3）、连减（sub3）、加减混合（mix）默认占比为 0，即默认不出这三类题**；需要时显式给占比，如 `--weights add3=10,sub3=10,mix=10`。

## 作为 Python 模块调用
```python
import sys; sys.path.insert(0, "scripts")
from oral_math import generate
generate(dict(count=50, sets=10, answers=False, order="shuffle",
              weights={"add":30,"sub":30,"mul":20,"muladd":10,"mulsub":10}), "out.pdf")
```

## 改题（只改算法，不动渲染）
出题逻辑全部集中在 `scripts/oral_math.py` 顶部的 **【口算算法区】**：
- 改某题型取值范围 → 改对应 `make_*` 函数；
- 加新题型 → 写一个返回 `("题面 =", 答案)` 的函数，并在 `TYPES` 里加一行 `(key, 名称, 函数, 默认占比%)`；
- 调默认配比 / 标题 / 每页列数 → 改 `TYPES` 的占比、`TITLE`/`SUBTITLE`/`COLUMNS`。

约定：题面以 ` =` 结尾，结果保持在 0–100。渲染、字体、分页、打印均无需改动。

## 说明
- 八种题型占比自动归一（不必凑满 100）。默认：加32/减32/乘18/乘加9/乘减9；连加、连减、加减混合默认 0（不出题）。
- 减号在内嵌字体中映射到标准算术连字符，保证任何机器上都能正确打印，不出空框。

