在掌握了Typst的初级用法和文稿纸实现之后,就开始继续摸索Typst在给娃出题上的功效。
娃二年级学加减法的时候,我用Vibe Coding的方式,基于HTML做过一个加减法练习题生成器,每页纸竖式计算20题,可以选择几位数加几位数,要不要进位。
不过,HTML毕竟是排版网页的,制作A4打印试卷,不仅对尺寸麻烦,而且排版上也是超级麻烦。
所以这次掌握了Typst这个利器之后,就尝试改用新思路了。
做法
关于 Typst还要多说两句,这是一个新兴的排版系统,可以理解为“更现代的 LaTeX”:语法简洁、编译飞快、一条命令出 PDF。它最大的好处是模板即代码,出题逻辑可以直接写在文档里,不需要先跑脚本生成数据再排版。
模板下载:mult_practice.typ
最终效果:

A4 一页 20 道竖式题,顶部留着班级/姓名/日期栏。
默认一次出10页,页脚自动编页码。每道题都保证计算过程至少出现一次进位。
使用
电脑上装好 Typst 后,一条命令出一份卷子:
|
|
seed 是随机数种子,pages 是页数。同一份模板,换不同的种子,出来的题目就完全不同。
写的过程中发现 Typst 有个刻意的设计:文档只能拿到当前日期拿不到当前时间,也没有随机数。这是为了保证同一份源码任何时候编译出来都一模一样(可复现构建)。
所以这个思路,做不到每次编译自动换一批题,尤其是在VS Code下预览,每次刷新结果不变,必须手动从命令行把时间戳或随机数喂进去:
|
|
也正是这个原因,我把原来每次编译生成1页,改成每次生成10页。代码生成页面好处就在这,从1页到10页乃至100页,就是一个循环的参数,不似之前HTML版,我是生成一页打印一页,略繁琐。
一次生成10页之后,隔一天再生成,就能自动取日期生成不一样的题目了,当然真需要用随机数强制生成新试卷也行。不过我想想,对普通娃,一天20道也够了,10页能做一段时间了。
PS:Typst是个上限挺高的排版系统,用我上面这个模板,交给AI修改,加减乘除这类题型,都可以快速改出来,还是很方便。