一、每頁 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 就是丟掉的道數。
讀完這一頁的分頁程式碼,最大的收穫是別把「每張紙放多少題」當常數查表:它同時吃字號、頁邊距、資訊欄、行距題距,還吃最長那道題的寬度。紙面生成這一類站內還有一篇把裝箱逐格量過的舊文,字帖分頁那篇,說的是另一套控制項、另一筆帳。