- 需求
- 組好的考卷要匯出成 Word,因為老師會在上面微調:改個數字、換個條件、調整排版。如果公式是圖片,這些事全都做不到——而「把 LaTeX 轉成圖片」是最省事的做法,多數工具就停在那裡。
- 做法
- 自己寫 tokenizer 加遞迴下降解析器,把 LaTeX 直接轉成
docx的原生數學物件(OOXML 的oMath)。匯出的檔案在 Word 裡點開分數,游標會進到分子——那是 Word 自己的方程式編輯器,不是一張圖。 - 中介方案是我自己試過才淘汰的
- 第一版原型走的正是最常見的那條路:用 temml 把 LaTeX 轉成 MathML,再用字串包成 OOXML。那本質上是「MathML 標籤穿 OOXML 外衣」,Word 不保證接受,也就無法保證產出的是可編輯的原生方程式。所以這個決定不是先驗的偏好,是實測之後的淘汰。pandoc 也評估過,不採用的理由不同:它的單位是整份文件,而我的輸入是資料庫裡的題目片段,而且標題階層、題號、難度、換頁、答案區都要用物件模型逐段組裝——交給 pandoc 產檔之後就沒辦法再回頭插入版面元素,另外還會多一個每次請求都要
spawn的外部二進位相依。化學式則是先把\ce{…}轉成等價的一般 LaTeX,再交給同一個解析器。 - 驗證
- 範例檔是系統直接輸出、沒有手動修改的,裡面有 33 個原生方程式。解析器本身的測試釘住每一種結構的輸出;另外有一道公式閘門,規則修不好的題才交給模型,而模型改完的結果仍要再過一次解析器——改不動的就停在人工複核,不會把壞掉的公式寫進題庫。
- 邊界
- 自製解析器只支援 LaTeX 的一個子集,這是明確的代價:pandoc 的語法覆蓋率遠勝於它。換得的是零外部相依、版面完全可控,以及失敗可以局部降級——沒見過的指令退化成純文字,單一公式失敗不會害整份考卷匯不出來。這個取捨成立的前提是輸入域受控:題庫裡真正用到的指令可以枚舉。如果要處理任意來源的 LaTeX,這個選擇就不對了。
NOTE · · 應用於 教學出卷助手
匯出的 Word 公式要能點開編輯
把 LaTeX 轉成圖片貼進 Word 很容易,但老師改不動。我手寫了解析器,直接產生 Word 的原生數學物件。
看這篇筆記應用的作品
這篇筆記的實際應用

教學出卷助手
把散落在考卷裡的題目,變成能依學生需求組卷的題庫。
看個案研究 →