每天一页 A4:练字(生字描红 + 古诗背诵)+ 英语单词背诵 + 抄写 + 算术 / 应用题。难度随孩子成长自动递进,10–15 分钟完成。
一页里有什么(见上图):
- 练字:每天 3 个新字 + 1 个到期复现,华文楷体先描红后临摹(内置 2000 常用字,按词频排序)
- 古诗背诵:每首背 7 天,标题标进度、含作者朝代与小字全文,长诗按句分段(约 350 首,唐为主 + 宋元明清必背,教材标准版校正)
- 英语单词背诵 + 抄写:每天 2 个新词(按人教版小学教材学习顺序),含中文释义与原创例句;背到一定量后每天再加 2 个巩固复现词(与练字同样的间隔复现机制)。新词下带四线三格(先描一遍浅灰范词、再空写一遍,与练字先描后临一致),可配置或关闭
- 算术:数据化难度阶梯 L1–L10(整数 → 多步混合 → 小数 → 分数 → 互化),按累计天数自动升档
- 应用题:与当天算术同档难度,从一步题起随成长变难
内容随累计天数逐步变难,并参考历史做新字优先 + 到期复现,每页留白自适应、稳定单页。
cd ~/daily-practice
python3 -m venv venv && . venv/bin/activate
pip install jinja2 pyyaml pytest playwright
playwright install chromium # 用于导出 PDF;不装也能用(见下)
# 仅在需要「重建字表/诗库」时才装(运行 gen.py 不依赖):pip install wordfreq zhconv
cp config.example.yaml config.yaml # 首次:复制配置模板,改成孩子的名字(config.yaml 已 gitignore)
python gen.py # 生成「今天」的一页
python gen.py --date 2026-07-02 # 指定日期
python gen.py --regenerate # 重出该日期:忽略已存快照、按新版式重算;内容与首次一致(幂等)产物在 output/:
YYYY-MM-DD.pdf—— 直接打印(需装了 Chromium)。YYYY-MM-DD.html—— 兜底:没装 Chromium 时,用浏览器打开后Cmd-P打印为 A4 即可。
中文字体需装在「生成 PDF 的机器」上。 字形在 Chromium 渲染 PDF 时就已固定进文件, 换机器打开不会再找字体。macOS/Windows 自带中文字体,开箱即用;Linux / WSL 默认无中文字体, 需先安装,否则 PDF 里中文会变成豆腐块/空白:
sudo apt install -y fonts-noto-cjk fonts-arphic-ukai # 正文黑体 + 描红楷体(AR PL UKai) fc-list :lang=zh | grep -i ukai # 验证楷体已就位
改 config.yaml,无需动代码:
child.name:孩子名字(打印在页眉)。daily.*字帖:new_chars每天新字数(默认 3)、review_chars每天到期旧字复现数(默认 1)、repeats_per_char每字写几遍(默认 5)、trace_per_char每字前几遍是浅灰描红范字(默认 2,其余临摹空写)、total_cells每行格数(默认 10)。默认即 (3 新 + 1 复现) = 4 字 × 5 遍 = 20 遍连续排、正好 2 行。调大total_cells(如 14)时田字格会自动缩小以适配 A4 页宽(默认 10 保持 1.6cm 大格不变),古诗也更容易缩成 2 行。- 想多复现/多新字:调整
new_chars与review_chars,保持两者之和 = 4 即维持 2 行单页(如2 + 2、4 + 0)。 - 古诗背诵:
poem_days一首背几天(默认 7,标题标「第 d/7 天」);poem_seg_rows长诗每天最多描几行(默认 3,超出按句分段、逐日轮流,如七律前 4 句/后 4 句)。每天都显示小字全文 + 作者 + 朝代供背诵。 poem_start_grade从几年级教材起背:默认null按诗库原序(由易到难,从《咏鹅》起);设3则从三年级教材古诗按教材顺序起背、跳过更低年级(详见下「古诗(背诵)」)。- 算术:
math_problems题数(默认 4)。每题下方的列竖式留白由程序按当天内容量自动计算并铺满一页——短诗日留白大、长诗日留白小,无需手动调。 - 英语:
include_english是否每天带英语(默认 true)、new_words每天新词数(默认 2)、review_words到量后每天巩固词数(默认 2)。另有顶层english.*:review_start_after_words开始加巩固词的已背词阈值(默认 30)、review_intervals_days巩固间隔(默认 1/3/7/15/30 天)、show_phonetic是否显示音标(默认关,Linux/WSL 上 IPA 可能缺字)、show_translation例句是否带中文(默认开)。 - 英语抄写:
english.copy_writing新词是否带四线三格抄写(默认 true;仅新词,巩固词只认读)、copy_trace_rows描摹行数(默认 1,浅灰范词供描)、copy_blank_rows临写留白行数(默认 1,自己写)。抄写会占版面:默认 1 描 1 临下,早期每天保留 4 道算式、应用题让位为 0;调大copy_blank_rows更练手写但算式/应用题会进一步减少。关掉抄写(copy_writing: false)即恢复算式 4 + 应用题 2。 - 版面每天自动铺满一页 A4 且不溢出:英语卡片与抄写行会挤占版面,程序据此自动微减应用题/算式题量以保持单页(先减应用题、再减算式,保留至少 2 道算式)。若大幅调大字数/遍数/题量,仍可能溢出;改完跑一次看
output/*.pdf是否单页即可。
- 想多复现/多新字:调整
math.manual_level:手动锁定难度档(如"L1");为null时按advance_every_days自动升档。writing.*:语料开关(常用字/教材/古诗)、字池放宽速度、间隔复现节奏。font.*:描红楷体字体族与浅灰颜色。
档位定义在 practice/math/levels.yaml,题型生成器在 practice/math/generators.py:
- L1(当前) 三位数以内加减(含进退位)+ 口诀表乘法
- L2 两位数×一位数 + 口诀表内整除
- L3 三位数×一位数、两位数×两位数、加减到 10000、有余除法
- L4 整数四则混合运算(多步、含小括号与 +−×÷,均保证整除/非负/整数)
- L5 小数加减 → L6 小数乘除 → L7 分数加减/乘除
- L8 小数四则混合 → L9 分数四则混合(含括号、多步)→ L10 分数小数互化
- 再往上(百分数、简易方程、几何)预留——加档位 + 注册生成器即可
应用题(practice/math/word_problems.py)作为题型融入每一档,用该档的数/运算,难度与算术统一:一步(加减乘除)→ 两步/比多比少 → 归一/平均/分数应用…。每天出几道由各档 word_problems.count 决定(默认 L1–L3 出 2 道、L4+ 出 1 道,题越难越少)。算术题数由 daily.math_problems(默认 4)控制。
加新题型:算术在 generators.py、应用题在 word_problems.py 写一个 gen_xxx(rng, params) 并注册,再到 levels.yaml 引用。
- 语料三源归一到一个有序字池(
practice/writing/corpus.py):教材字 > 常用字 > 古诗字。 - 常用字表
data/chars_common.txt:2000 字,由tools/build_charset.py用wordfreq词频生成、按频率降序(越靠前越常用=引入顺序)、GB2312 过滤为简体。重建:python tools/build_charset.py data/chars_common.txt 2000。 - 调度(
practice/writing/scheduler.py):未练过的按难度序引入(每天new_chars个);练过的按递增间隔(1→3→7→15→30 天)回来复现(默认review_chars: 1)。 - 教材字表:把生字粘到
data/textbook.txt,并在config.yaml设writing.use_textbook: true。
- 诗库
data/poems.yaml:约 350 首,= 《唐诗三百首》名篇(tools/build_poems.py从开源库 chinese-poetry 繁转简、过滤超长篇)+data/poems_extra.yaml精选补充(补齐唐诗三百首未收的必背名篇:咏鹅/悯农/咏柳/赠汪伦,以及宋/元/明/清:题西林壁/示儿/小池/天净沙·秋思/石灰吟/竹石…)。字段含title/author/dynasty/paragraphs,按篇幅升序(先短后长)。 - 教材标准版校正(准确性):
- 开源库用古本异文(如《静夜思》"床前看月光"),
build_poems.py的OVERRIDES把 17 首必背名篇覆盖为教材标准版并清理组诗标题。 data/poems_extra.yaml是人工录入的教材标准版补充集;同「标题+作者」以它为准。新增/修正古诗请改这个文件(照格式录入并核对文本),再重跑python tools/build_poems.py /tmp/tang300.json data/poems.yaml 64。
- 开源库用古本异文(如《静夜思》"床前看月光"),
- 从指定年级教材起背(
daily.poem_start_grade):默认null走诗库原序;设为N(如3)后,古诗改成「先按教材顺序背 grade≥N 的教材古诗(年级→学期→册内课序),再接库里其余诗作拓展」,并跳过更低年级的教材古诗。- 年级→篇目映射在
data/grades.yaml:每项[标题, 作者]必须与poems.yaml一致;校订篇目只改这个文件、不动代码。库里没有的教材诗要先补进poems.yaml(并同步poems_extra.yaml)。 - 同名不同诗用带首句的标题区分,如三下《绝句·迟日江山丽》与二下《绝句》(两个黄鹂)。
- 目前
grades.yaml收录到三年级(含三上/三下课文与日积月累,异文与日积月累篇目以课本为准);四~六年级按同格式续加即可。
- 年级→篇目映射在
- 每首背
poem_days天:每天显示整首小字全文(背)+ 当天段落的田字格描红(写);长诗按句分段、逐日轮流写。 - 想再上量(几百上千首):可导入更大开源数据集(如宋词三百首/全唐诗),但库本长尾有异文,建议仅对孩子会背的加入
poems_extra.yaml把关。
- 词表
data/words_en.yaml:按人教版小学教材学习顺序排列(列表顺序即引入顺序),含一二年级基础起步词 + 人教版 PEP 三至六年级全量(约 834 词,按 2 词/天够 1.5–2 年)。每词含word/meaning/phonetic与原创例句sentence/sentence_cn。 - 选词与复现(
practice/english/vocab.py,镜像练字调度):每天按顺序引入daily.new_words个新词;已背词数达english.review_start_after_words(默认 30)后,每天再加daily.review_words个巩固词——到期(review_intervals_days:1→3→7→15→30 天)的最优先,不足时用最久没复习的补足,保证每天固定巩固数。 - 抄写(四线三格):仅新词下带四线三格书写行,先描一遍浅灰范词、再空写一遍(与练字先描后临一致);复习/巩固词只认读不抄写。行数与开关由
english.copy_writing / copy_trace_rows / copy_blank_rows控制(详见上「怎么调」)。四线三格纯 CSS 绘制(static/page.css的.four-line),三格等高、描字用与练字相同的浅灰--trace色。- 描字手写体:描字用内嵌的 EduNSW 学校手写体子集(
static/fonts/edu-trace.woff2,约 8.5KB,渲染时以 data URI 内嵌进 PDF),其升/降部度量贴合手写「三区」,能在等高四线格里让升部近顶线、降部近底线、小写填满中格;单层 a/g 也更贴近手写教学写法。字体为 SIL OFL 1.1(见static/fonts/EduNSW-OFL.txt),仅子集内嵌、非以保留字体名分发;字体缺失时自动回退正文族。
- 描字手写体:描字用内嵌的 EduNSW 学校手写体子集(
- 数据来源与版权:单词/释义/音标源自教材词汇(事实性数据,三至六年级取自开源仓库 kajweb/dict 的 PEP 小学 JSON);例句全部为本项目原创的简单适龄句子(
tools/sentences_en.json),未复制任何第三方版权例句。 - 扩展到初中:把
PEPChuZhong7_1.json…加入tools/build_words_en.py的GRADE_FILES,在tools/sentences_en.json补齐对应原创例句,重跑python tools/build_words_en.py --src <kajweb JSON 目录>生成新的data/words_en.yaml。当前词表用完前追加即可(用完时当天新词自动少给、不报错)。
history/YYYY-MM-DD.json:每天内容快照,是调度的唯一真相——可追溯、可重印(对同一天再跑gen.py会复用快照)。- 调度状态不单独存盘(无
state.json):每次生成某天时,由「该日期之前」的快照按序回放推导出每字/每词的练习次数、最近日期、下次到期与累计天数。因推导只看更早的天、绝不含当天自己,重生成或删快照重跑都不改变当天内容(幂等),相邻两天也不会撞车。- 代价:若乱序生成(先出了后面的天,再回头改前面的天),后面那些已存快照不会自动回灌,需要对它们
--regenerate一次;正常「每天往后生成」无此问题。
- 代价:若乱序生成(先出了后面的天,再回头改前面的天),后面那些已存快照不会自动回灌,需要对它们
pytest -q # 覆盖各档生成器数值边界 + 练字调度 + 英语选词/复现逻辑- 自动化:cron 定时生成、生成后自动
lp打印或推送到手机。 - 数学 scope 向上延伸:百分数、简易方程、应用题、几何(后两者需引入文字/图形)。
- 形态升级:Web 小应用(浏览器预览 + 调档 + 一键打印)。
