一、一页 90 道不是写死的
想给一(2)班出一份口算周练,第一版按默认 5.2 mm 字号打出来,一页正好 90 道。我原以为「一张 A4 放多少题」是这页工具里写死的常量,把字号从最小推到最大、把题数从 40 调到 80 才知道不是:字号 3.4 mm 每页 105,9.0 mm 只剩 39;字号不动、只把题数从 40 调到 80,每行题数就从 5 掉到 4,每页题数从 90 变 72。
这页是 儿童口算题卡生成,首屏那组初值还被一年级预设覆写过一遍。生效的排版参数是 A4 纵向、页边距 10 mm、信息栏每页都印、行距 8、题距 6、字号 5.2 mm、每行最多 5 题:实测每题占位 30.41 mm 宽 × 14.34 mm 高,正好铺成 5 列 × 18 行,状态栏那行写「每行 5 题 · 每页 90 题」。
纸张、方向、页边距、信息栏各动一档,其余照首屏,实测的 cols × rows 长这样。
| 纸张与方向 | 字号 mm | 每行题数 | 行数 | 每页题数 |
|---|---|---|---|---|
| A4 纵向(首屏默认) | 5.2 | 5 | 18 | 90 |
| A4 纵向 | 3.4 | 5 | 21 | 105 |
| A4 纵向 | 9.0 | 3 | 13 | 39 |
| A4 纵向 · 页边距 15 mm | 5.2 | 5 | 17 | 85 |
| A4 纵向 · 信息栏不显示 | 5.2 | 5 | 19 | 95 |
| A4 横向 | 5.2 | 5 | 12 | 60 |
| A5 纵向 | 5.2 | 3 | 12 | 36 |
| A5 横向 | 5.2 | 5 | 7 | 35 |
二、每页题数是算出来的:cols × rows
分页口径这几行来自横式排版那段代码:
cols = floor((usableW + colGap) / (itemW + colGap)) rows = floor((usableH + rowGap) / lineH) perPage = cols × rows itemW = maxSlots × 0.66 × font
拿 5.2 mm 那一档整链走一遍:20 以内加减的题面「□ + □ =」标称 8.86 个字槽,itemW 就是 8.86 × 0.66 × 5.2 = 30.41;A4 纵、页边距 10 mm 时 usableW 实测 190,于是 floor(196 / 36.41) = 5 列,那 196 是 usableW 加题距、36.41 是格宽加题距。行高 lineH 取 5.2 × 1.22 加行距 8 = 14.34;usableH 实测 251.6,floor(259.6 / 14.34) = 18 行;5 × 18 = 90。usableH 扣的是上下页边距、信息栏那 13 mm 带 2 mm 间隔,以及上下各一条安全带。
每个因子都能单独挪走每页题数。字号推到最小 3.4 mm,lineH 只剩 12.15、rows 涨到 21,每页 105;列数却没跟着涨——名义上 floor(196 / 25.88) 已经够 7 列,被「每行最多几题」这个输入的 5 夹住。推到最大 9.0 mm,itemW 涨到 52.63,列数掉成 3、rows 变 13,每页 39。页边距与信息栏那两档见上表:信息栏改「仅首页」不动每页题数,那三档只决定它画在哪几页、单页扣掉的高度一样。
图 1:A4 纵向,每页题数随字号
三、题目本身变宽,也会把列数挤掉
最难想到的是题目自己的宽度。默认那档最宽的题占 8.86 个槽;题数调到 80,卷面冒出两位数,槽位升到 9.86,格宽从 30.41 涨到 33.84,5 列就塞不进 190 的可用宽,cols 变 4、perPage 从 90 降到 72。同一张纸同一个字号,每页题数还会随题量自己变。
四、版面只是分母,题池是分子
第二版我把题数继续加,才发现更早到顶的不是纸,是题池。默认「不出重复,交换律算同一题」下,20 以内加减能枚举出的不重复题共 290 道;改成只看题面,24+15 与 15+24 记两道,池子涨到 380;同时勾上必须进位和必须退位,只剩 97 道;操作数上限设成 5 的幼儿园加减只有 25 道。池子不够时它不静默塞重复:给幼儿园出 40 道,25 道的池子先放宽「重复题」这一档,告警原文是「为了凑满题量,「重复题」已放宽成允许重复」。
五、三道硬上限,触顶都写明丢了几道
还有三道写死的上限:横式单卷 200 题、竖式单卷 80 题、页数 10 页。撞到顶它会写明:A5 横向、9.0 mm 字号出 200 题,perPage 只剩 15,10 页只装得下 150 道,告警直接写「已达到 10 页上限,后面 50 道题没有排版进去」;竖式卷里把题数敲成 120,会先被夹回 80 并提示已按 80 道出卷。
六、同种子可复现,换一套题是种子加 1
出题这头可复现:种子保持 20261028、参数不动,连着生成两次,题面和排列一字不差,首三题恒为「1 + 8」「19 − 4」「13 − 12」。「换一套题」其实是种子加 1,换到 20261029 那一版与旧卷只重叠 7 道;「打乱顺序」只换排列不换题,40 个位置全动过、题面集合一道不变。
七、导出的字节、dpi 和选不中的字
默认参数下单页 PDF 实测 205367 字节,拆开是内嵌那张 JPEG 204557 加容器开销 810;三页 200 题的 PDF 887532 字节。PDF 里字体对象数为 0,也就是不嵌字体——卷面上每个数字都是一张位图,选中、复制、检索都做不到。分辨率分两套:直接打印走 8 px/mm、约 203 dpi,导出走 12 px/mm、页面提示写 305 dpi。多页导 PNG 会自动打包,200 题 3 页那个 ZIP 实测 1253618 字节。打印店要求压小时,压的只是这张位图,与每页题数无关,可走 图片压缩。
这一页说明区那 8 个头条数逐条回测全部命中,一条没被推翻;唯一偏差是单页 PDF 那条:宣传约 207 KB,实测 205.4 KB,高约 0.8%,仍在「约」字里。
八、三个卡过我的问题
Q:一张 A4 到底能放多少题,能不能给个数?
给不了单一值。5 列 × 18 行 = 90 只是 A4 纵向、5.2 mm、页边距 10 mm 这一档的实测;字号 3.4 mm 变 105、9.0 mm 变 39,A5 纵向 36,题数调到 80 又掉到 72。要准数就按自己那张纸出一版。
Q:想让一页多塞题,先动字号还是动题距?
先动字号,但列数有天花板。3.4 mm 那档每页 105 靠的是行数涨到 21,列数仍被「每行最多几题」的 5 夹住;这个输入夹在 1 到 8,不抬上去,按宽度算出的 7 列落不了地。
Q:印出来少了几道题,是丢在页面上还是丢在题池里?
两种都会写明。题池不够时告警会说按现在的上限不重复题一共只有几道;撞到 10 页时写后面 N 道题没有排版进去,N 就是丢掉的道数。
读完这页分页代码,最大的收获是别把「每张纸放多少题」当常量查表:它同时吃字号、页边距、信息栏、行距题距,还吃最长那道题的宽度。纸面生成这一类站内还有一篇把装箱逐格量过的旧文,字帖分页那篇,是另一套控件、另一笔账。