一個排版軟體與語言的實作+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截圖: