在掌握了Typst的初级用法和文稿纸实现之后,就开始继续摸索Typst在给娃出题上的功效。

娃二年级学加减法的时候,我用Vibe Coding的方式,基于HTML做过一个加减法练习题生成器,每页纸竖式计算20题,可以选择几位数加几位数,要不要进位。

不过,HTML毕竟是排版网页的,制作A4打印试卷,不仅对尺寸麻烦,而且排版上也是超级麻烦。

所以这次掌握了Typst这个利器之后,就尝试改用新思路了。

做法

关于 Typst还要多说两句,这是一个新兴的排版系统,可以理解为“更现代的 LaTeX”:语法简洁、编译飞快、一条命令出 PDF。它最大的好处是模板即代码,出题逻辑可以直接写在文档里,不需要先跑脚本生成数据再排版。

模板下载:mult_practice.typ

最终效果:

试卷预览

A4 一页 20 道竖式题,顶部留着班级/姓名/日期栏。

默认一次出10页,页脚自动编页码。每道题都保证计算过程至少出现一次进位。

使用

电脑上装好 Typst 后,一条命令出一份卷子:

1
typst compile mult_practice.typ out.pdf --input seed=42 --input pages=10

seed 是随机数种子,pages 是页数。同一份模板,换不同的种子,出来的题目就完全不同。

写的过程中发现 Typst 有个刻意的设计:文档只能拿到当前日期拿不到当前时间,也没有随机数。这是为了保证同一份源码任何时候编译出来都一模一样(可复现构建)。

所以这个思路,做不到每次编译自动换一批题,尤其是在VS Code下预览,每次刷新结果不变,必须手动从命令行把时间戳或随机数喂进去:

1
typst compile mult_practice.typ out.pdf --input seed=$(date +%s)

也正是这个原因,我把原来每次编译生成1页,改成每次生成10页。代码生成页面好处就在这,从1页到10页乃至100页,就是一个循环的参数,不似之前HTML版,我是生成一页打印一页,略繁琐。

一次生成10页之后,隔一天再生成,就能自动取日期生成不一样的题目了,当然真需要用随机数强制生成新试卷也行。不过我想想,对普通娃,一天20道也够了,10页能做一段时间了。

PS:Typst是个上限挺高的排版系统,用我上面这个模板,交给AI修改,加减乘除这类题型,都可以快速改出来,还是很方便。