不用寫程式也能有出題後台:我用 Gemini Canvas 做出 B4 直書國文段考卷
2026-11-08
阿茲
61
段考出題真正花時間的不是命題,是排版、改格式、對答案。這篇記錄我怎麼用一段「萬用 Canvas Prompt」請 Gemini 生出單一 HTML 檔的出題後台:左側深色控制台、右側 B4 橫式直書考卷、每次重新抽題都換新題目、一鍵切換教師版紅字解答並下載 PDF,以及十次來回裡真正卡住的四個地方:直書方向、注音字型、題目重複、答案錯位。
今年我拿這件事去試 Gemini 的 Canvas。不是叫它「幫我出一份考卷」,而是叫它直接做一個出題後台:我勾章節、拉題數、按一顆按鈕,它把卷子產出來。
底下是實際跑出來的結果,以及十輪對話裡真正卡住的地方。
出題最花時間的,從來不是出題
先把痛點講清楚。一份國中八年級國文段考卷,規格大概是這樣:
- 章節範圍要對上這次段考,第一課到第四課,各版本略有差異
- 六大題型、配分固定:國字注音、注釋、改錯字、成語填寫、單一選擇、素養閱讀題組
- B4 紙張、橫式、文字直書(由上而下、行序由右往左)
- 需要注音的欄位要用特定字型,不然注音符號會歪掉
- 一次段考要出兩三份:正式卷、補考卷、資源班一份
這些條件分開看都不難,湊在一起就變成一份每次都要重排的工作。而且重排的時候最容易出錯的地方,剛好是最不明顯的地方:題號重複、答案對錯題、注音漏標。
成品長什麼樣:左邊控制台,右邊考卷
最後做出來的東西是一個單一 HTML 檔,不用主機、不用資料庫,雙擊就能開。整個畫面切成左右兩欄。

左側是深色控制台
固定寬 380px、深藍黑底(#111625),從上到下依序是:版本切換(康軒/翰林/南一)、冊別、難度(基礎 A/基礎 B)、段考快捷(第一次段考/第二次段考/期末考/全冊總複習)、章節勾選清單、六大題型的題數與配分(自動加總成 100 分)。
底部四顆按鈕是整個系統的核心:重新隨機抽題(同觀念變形換題)、顯示教師版紅字解答與解析、AI 深度變形出題、直接下載 PDF。
右側是真正的考卷
右邊不是示意圖,是可以直接印的版面。第一頁有標題、測驗範圍、班級座號姓名欄與得分框;內容超過一頁時,由自動分頁引擎接到下一張紙,續頁帶大題標頭與頁碼。這份國文卷是 B4 橫式、文字直書,行序由右往左,跟學校印出來的一模一樣。
PDF 不靠瀏覽器列印
這點我特別寫進 Prompt:用 html2canvas 加 jsPDF 把每一張考卷直接轉成 PDF,不要只給一顆 window.print()。原因是這個系統常被嵌在 iframe 裡(例如在 Gemini 的 Canvas 預覽中),window.print() 會被擋掉。另外附一份「可列印 HTML」當備援,PDF 產不出來時還有路走。
核心不是題庫,是「同觀念變形」
多數人叫 AI 出題,會得到一個固定陣列:題目寫死十題,每次執行都印一樣的東西。這樣的系統只有第一次有用。
我在 Prompt 裡要求它用參數化隨機變形函數,不要死板陣列。核心考點不變,但例子、數據、人物情境、選項順序(①②③④)每次重新洗牌或重新計算。同一個章節可以生出好幾份不重複的卷子,補考卷不會被學生一眼看出是同一題換個包裝。
這件事對教學現場的意義比看起來大:同一份教材,可以同時給不同程度的班級不同版本的練習,老師不用自己再剪貼一次。
關鍵那一招:把需求寫成一張萬用 Prompt
整段對話裡最省時間的東西,不是後面每一次修正,而是最前面那份 Prompt。我把它拆成「主模板加科目替換包」兩層。
主模板寫規格,替換包寫題型
- 主模板:單一 HTML 檔(Tailwind CSS、原生 JS、html2canvas、jsPDF)、左右雙欄、紙張尺寸、自動分頁、四顆按鈕、變形邏輯
- 替換包:國語文、英語、自然、社會各自的題型與配分。以國語文為例,寫國字或注音每題 2 分、改錯字 3 分、選詞填寫 3 分、字義與修辭選擇 4 分、造句 5 分、素養閱讀題組每組 12 分
要換科目,只換中間那一段,其餘不動。這也是為什麼我後來可以一個下午生出英文卷的版本。
三個一定要寫進去的規格
- 尺寸寫死。 每張考卷固定 794×1123(A4 比例)或 B4 實際尺寸,不要讓 AI 自由發揮,它會很樂意幫你發明一個「差不多」的大小
- PDF 自己產。 指定 html2canvas 加 jsPDF,不要依賴 window.print()
- 難度分流。 基礎 A 是標準模式,基礎 B 是鷹架扶弱模式:切過去之後每題下方自動出現淺藍色的解題步驟提示框,後段學生也動得了筆
十次來回裡,真正卡住我的四件事
整段對話大概十輪。前兩輪很順,後面幾乎都在修同一件事:AI 以為它懂我要的格式。
一、橫式與直書:我連自己要什麼都講錯
我第一句寫「文字從左而右、從上而下」,AI 照做,出來是現代橫書。第二句我改口:「說錯,是右往左、上往下」,它才切到直書模式。
這件事的教訓不是 AI 笨,是「橫式」與「直書」在華語世界有兩套約定,我用了對方的詞、講了自己的意思。要它做直書,直接寫「writing-mode: vertical-rl、行序由右往左」比任何形容詞都準。
二、字型與裝訂線:現場的細節只有你知道
國文考卷要注音,注音要對得漂亮,得用文鼎標準楷體注音這類字型,我手上是 .ttc 檔。另外 B4 的國文卷不需要中央裝訂線,那是雙面印刷裝訂用的,國文卷沒有。
這兩件事 Prompt 裡沒寫,AI 不會自己想到。它預設給你一個「看起來很專業」的雙欄加虛線版面,實際上跟學校要的格式差很遠。
三、題目重複與答案錯位:AI 會「看起來對」
第三輪之後問題開始出現:同一份卷子裡題目重複,選填題不管改哪一題,答案都顯示 ①。
原因是抽題用固定陣列、答案依陣列索引寫死,選項一洗牌就對不上。後來要求它改成不重複洗牌抽樣(洗牌後取前 N 題),並在洗牌當下同步追蹤正解的新位置,教師版紅字才會對得準。題庫也順便擴充:28 道國字注音、16 道注釋、18 道改錯字、10 道成語選填、16 道單選、4 篇素養閱讀。
這一段的代價最高,因為錯誤是安靜的。卷子印出來、答案卡發下去,才會有人發現第五題和第十二題是同一題。
四、.ttc 注音字型與那個 SyntaxError
上傳字型時跳出 Invalid font data in ArrayBuffer。原因是瀏覽器的 FontFace API 不吃 .ttc 合集封裝(開頭是 ttcf 標頭)。解法是在瀏覽器端把 .ttc 拆解、抽出裡面的字型資料表,重組成獨立 .ttf 再餵給 FontFace,順便做成下拉選單讓你切子字型。
最後一輪是單純的語法錯誤:missing ) after argument list。改 A 的時候把 B 的括號弄壞了。這種錯誤人眼看不出來,貼回錯誤訊息讓它自己找,兩分鐘解決。
把 AI 當外包團隊:需求單、驗收、回饋
這十輪跑完,我發現它跟發包給外部廠商的流程幾乎一樣,只是速度快很多。
- 需求單要能驗收。 尺寸、字型、配分、頁碼這些寫得出來的東西,就不要用形容詞交差
- 一次只改一件事。 我曾經一次丟三個問題進去,它只修了兩個,第三個被順手改壞
- 出錯貼原文。 貼錯誤訊息比說「壞掉了」有用十倍
- 卡住要講清楚差在哪。 「這整個差太多了」可以講,但要接著說:方向錯、還是細節錯
最貴的成本不是 AI 的算力,是我自己沒想清楚要什麼。這句話在傳統外包也成立,只是以前要花兩週才會痛,現在兩分鐘就痛一次。
這套做法可以搬去哪裡
同樣的骨架,把題庫換掉,就是一張會自己長出來的表格。我想到的幾個場景:
- 教育訓練單位的課前測驗與課後評量,同一個觀念每次換不同情境
- 門市稽核表、設備點檢表:題型換成檢查項目,變形邏輯換成不同門市與不同機台
- 報價單、出貨單這類固定格式文件:版面固定、內容每次換
- 內部 SOP 的抽考題,新人訓練直接發一份
判斷標準很簡單:這份文件是不是「固定格式、重複產生、每次內容要換」。三個條件都成立,就值得做成一個單頁工具,而不是每次重排。
寫在最後
我沒有要說 AI 能取代老師出題。題目好不好、難不難、有沒有對到課程目標,還是人的判斷。這次真正被省下來的是排版、對答案、改格式這些明明有規則、卻很花時間的事。
如果要我用一句話總結這十輪:AI 不是幫你做完,是幫你把重複的部分做完,剩下的判斷留給你。
