Skip to content

fboostr/daily-practice-sheet

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

daily-practice-sheet · 每日练习单

每天一页 A4:练字(生字描红 + 古诗背诵)+ 英语单词背诵 + 抄写 + 算术 / 应用题。难度随孩子成长自动递进,10–15 分钟完成。

license python output

示例:某天自动生成的练习单

一页里有什么(见上图):

  • 练字:每天 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_charsreview_chars,保持两者之和 = 4 即维持 2 行单页(如 2 + 24 + 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.txt2000 字,由 tools/build_charset.pywordfreq 词频生成、按频率降序(越靠前越常用=引入顺序)、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.yamlwriting.use_textbook: true

古诗(背诵)

  • 诗库 data/poems.yaml约 350 首,= 《唐诗三百首》名篇(tools/build_poems.py 从开源库 chinese-poetry 繁转简、过滤超长篇)+ data/poems_extra.yaml 精选补充(补齐唐诗三百首未收的必背名篇:咏鹅/悯农/咏柳/赠汪伦,以及宋/元/明/清:题西林壁/示儿/小池/天净沙·秋思/石灰吟/竹石…)。字段含 title/author/dynasty/paragraphs,按篇幅升序(先短后长)。
  • 教材标准版校正(准确性)
    • 开源库用古本异文(如《静夜思》"床前看月光"),build_poems.pyOVERRIDES 把 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),仅子集内嵌、非以保留字体名分发;字体缺失时自动回退正文族。
  • 数据来源与版权:单词/释义/音标源自教材词汇(事实性数据,三至六年级取自开源仓库 kajweb/dict 的 PEP 小学 JSON);例句全部为本项目原创的简单适龄句子tools/sentences_en.json),未复制任何第三方版权例句。
  • 扩展到初中:把 PEPChuZhong7_1.json… 加入 tools/build_words_en.pyGRADE_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 小应用(浏览器预览 + 调档 + 一键打印)。

About

每天一页 A4:练字(生字描红+古诗背诵)+ 算术/应用题 练习单生成器,难度随成长自动递进

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors