一個排版軟體與語言的實作+TeXBook筆記
原文於2025-01-31首貼於PTT LaTeX版
其實我快二十年前的高中時期,就對LaTeX這套時而複雜,卻功能強大的語言很感興趣。
後來也曾經想完成類似LaTeX這樣的排版軟體,也曾經試過使用Typst、SILE等同類
排版語言。中途也曾經想做過排版語言產生PDF的編譯器,但一直失敗。
後來我看了TeXBook的前半段(雙彎路標示的就略過了),做了一些筆記,連結:
https://kianting.info/wiki/w/TeXBook%E7%AD%86%E8%A8%98 (個人筆記)
也藉之瞭解plainTeX的原理,於是最近這幾個禮拜,加上利用春節長達九天的連續假期,
想說把這個排版語言的雛形做完。
選用語言
我不想用靜態型別語言寫這個(處理演算法和debug夠煩了懶得處理型別問題),Python
又比較慢,於是採用雖然相對少用但聲稱效率比較快的Julia語言。
因為Julia語言有好用的ParserCombinator函式庫,加上取用二進位C生成的函式庫也有
打包binding的工具,加上libharu這個C的PDF函式庫,不僅彌補Julia沒有生成PDF函式
庫的問題,還支援UTF-8(只是印出右向左文字,比如希伯來文,就效果不好,阿拉伯文
我沒實驗過,但想必更慘,我猜不會顯示詞內字母型態),因為初期目標不想要過於複
雜,所以就優先考慮支援漢字和英文就好。
實作的功能
- Knuth-Liang 斷字演算法(TeXBook 附錄H,但我沒看)
- 最小崎嶇(ragged)度斷行演算法,但是因為時間等因素,
還沒有實作出Glue的fill填空功能 - 用ParserCombinator.jl函式庫作出語言分析器(parser),語言有點像是Wikipedia
的排版語言和LISP,只是用直線符號「|」做分隔。 - 操作AST的Pass,所以可以支援中文換行
- 加入英文的斷字pattern
直譯器(其實應該是編譯器,畢竟產生PDF)- 也加入類似Glue這樣的東西,但是目前只是作為斷行用,沒有浮動padding
- 生成PDF
已知使用Library
- ArgParse 命令列指令分析器
- fontconfig 猜字體路徑
- libfreetype 量字圖(glyph)尺寸
- libharu PDF生成
- ParserCombinator.jl 分析器
- Match.jl 模式比對
已知問題
- 一些token/term(編譯器界的術語)還沒被解析
- 速度太慢
- 有些測試print沒刪除
- 四則運算等primitive指令沒實作
下載點與其他說明
請到我的個人repo:
https://repo.kianting.info/yoxem/uahgi
備註
因為這個板應該是最接近這篇文的主旨的看板,所以貼這,如果有問題,
請通知我刪除,感謝。
補充圖片
輸入排版語法範例:
輸出PDF截圖: