口算练习 PDF 生成器
生成 100 以内口算练习卷 PDF。核心工具是 scripts/oral_math.py:一个自包含的命令行程序,
中文字体已内嵌(不依赖系统字体、不依赖浏览器,离线可用),只需 reportlab 一个依赖。
何时用
- 用户想要口算 / 心算 / 算术练习题、练习卷,或要给孩子出题、打印练习卷。
- 用户要求某种题型组合(如"加减为主掺点乘法"、"只要乘加乘减")或指定题量/套数。
- 自动化工具需要一个可脚本化的入口来批量生成或直接打印。
一次性准备
pip install reportlab
用法
先确保 scripts/oral_math.py 可用,然后按需要调用:
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 模块调用
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(不出题)。
- 减号在内嵌字体中映射到标准算术连字符,保证任何机器上都能正确打印,不出空框。