← 返回 Siami 首頁

Pandoc 滿 20 歲了:一位哲學教授用 Haskell 寫出的文件轉換神器,如何撐起現代寫作基礎建設

▲ 139 💬 18
Pandoc 滿 20 歲了:一位哲學教授用 Haskell 寫出的文件轉換神器,如何撐起現代寫作基礎建設

編按:本文綜合整理自 pandoc.org 二十年回顧LWN.net 報導Hacker News 討論串pandoc GitHub 倉庫Wikipedia Pandoc 條目,並加入 Siami 編輯部觀點與分析。

一位哲學教授的副產品,如何變成寫作圈的瑞士刀

2026 年 8 月 3 日,是文件轉換工具 Pandoc 上線滿 20 年的日子。創辦人 John MacFarlane 是加州大學柏克萊分校的哲學教授,他在 個人回顧文章 中坦白承認,Pandoc 一開始只是「Haskell 學習過程中的副產品」,完全沒預料到會演變成全球安裝量數百萬、撐起無數學術與技術寫作流程的開源基礎建設。

故事開始於 MacFarlane 讀了哲學界友人 Greg Restall 推薦的 Haskell 入門書。他想找一個練手專案,於是把目標鎖定在 Markdown 解析器——當時市面上的 Markdown 實作(Perl、Python、Ruby、PHP)幾乎都是用一連串正則表達式直接轉 HTML,充滿各種邊角案例 bug。MacFarlane 改用 parser combinator 把 Markdown 解析成真正的抽象語法樹(AST),再透過 N 個 reader × M 個 writer 支援 N×M 種轉換——這個架構決定了 Pandoc 之後 20 年的擴展路線。

2006 年 8 月 3 日,Pandoc 0.1 釋出,僅約 3,000 行 Haskell 程式碼、無外部依賴、僅在作者個人網站上公告。沒想到這個「沒做行銷」的小工具,被 Debian 開發者 Recai Oktaş 主動打包、登上 Hackage,並被學術圈的講議與部落格採用,從此一發不可收拾。


20 年的技術里程碑:從 Markdown 工具到跨格式基礎建設

Pandoc 的發展可分為四個明確階段,每個階段都解鎖了當時尚未存在的功能。

Pandoc 0.x(2006–2008):從個人專案到 Debian 套件

  • 0.3 版加入 DocBook writer 與後來成為 Markdown 標準的腳註語法
  • 0.4 版加入 Markdown 表格、定義清單、上下標、groff man pages 與 ConTeXt writer
  • 0.4 是第一個登上 Hackage 的版本,讓外部依賴管理變得可能

Pandoc 1.x(2008–2017):從單純轉換器到學術寫作引擎

這是 Pandoc 功能爆炸的十年,也是 CommonMark 標準誕生的年代:

  • 1.0 加入 MediaWiki、GNU Texinfo、OpenDocument、ODT writer 與 fenced code blocks
  • 1.4 引入彈性 template 系統(2010 年),大幅提升輸出客製化能力
  • 1.9(2012)首度支援 docx 輸出,並加入 Beamer 與 DZSlides
  • 1.13 同時集結 Albert Krewinkel(Org-mode)、Jesse Rosenthal(docx reader)、Matthew Pickering(EPUB、texmath)三位長期貢獻者的成果
  • 1.14(2015)開始支援 CommonMark——這是 MacFarlane 為了解決 Markdown 語意歧義而發起的標準化專案

Pandoc 2.x(2017–2023):架構重構與學術整合

  • 2.0 引入 PandocMonad typeclass,讓 reader/writer 可在純函式或允許 I/O 的環境中執行
  • 同樣在 2.0 引入 Lua filters(Albert Krewinkel 主導),效能遠勝 JSON filters
  • 2.11 重寫 citation 處理,改用 MacFarlane 從零打造的 citeproc library
  • 2.15 加入 --sandbox 選項,保證 parser/renderer 沒有 I/O 副作用
  • 2018 年獲得 Handshake 捐贈 10 萬美元,用於支付維護者津貼

Pandoc 3.x(2023–至今):模組化與 WASM

Pandoc 3.0 把專案拆成四個獨立套件:pandoc(核心 library)、pandoc-lua-engine(Lua 整合)、pandoc-server(HTTP API)、pandoc-cli(命令列工具,可選擇不打包 Lua 與伺服器)。3.1.3 加入 Typst reader/writer,3.1.12 開始支援 MacFarlane 自己設計的新標記語言 djot,而 2026 年 2 月發布的 3.9 版更把整套編譯成 WASM——這意味著使用者現在可以在瀏覽器裡直接跑完整版 Pandoc(GUI 介面「Pandoc for the People」由 Claude Opus 協助設計)。

「MacFarlane 二十年前埋下的『AST 中介』設計哲學,讓 Pandoc 從一個 Haskell 練習作業變成整個文件處理生態的底層。從 Quarto 到 Jupyter Notebook,從 RStudio 到学术期刊投影片系統,背後都有 Pandoc 在跑。」


為什麼這件事重要:Pandoc 撐起了什麼

Pandoc 的影響力遠超過它本身的安裝數量,因為它已經成為下游工具鏈的通用轉接頭

  • 學術寫作:Quarto 與 R Markdown 把 Pandoc 當成核心引擎,把 .qmd.Rmd 編譯成論文、書籍、簡報、網站
  • 資料科學:Jupyter Notebook 的 .ipynb 支援(2019 年加入)讓 Pandoc 進入資料科學工作流
  • 文獻管理:CSL 引用處理、EndNote 與 BibTeX bibliography 格式互轉,幾乎所有學術寫作工具都依賴 Pandoc 的 citeproc 處理
  • 新型態語言橋樑:Typst(LaTeX 替代品)能在三年內快速普及,正是因為 Pandoc 3.1.3 起提供完整的 reader/writer 支援
  • 瀏覽器原生:Pandoc 3.9 的 WASM 版本讓文件轉換不再需要伺服器,前端應用可以直接呼叫

從安裝數來看,Pandoc 出現在幾乎每一個主流 Linux 發行版的套件庫、在 macOS 與 Windows 有官方 installer、在 Docker Hub 有現成映像。GitHub 上已有 7,346 個 issue 被解決、600+ 位貢獻者參與。


數據解讀:Haskell 的選擇、貢獻者集中度與 LLM 時代的定位

這次回顧中有幾個值得深入解讀的數字與技術決策。

為什麼選 Haskell:作者本人的反思

MacFarlane 在文章最後一節「Retrospective: the choice of Haskell」坦承,當年選 Haskell 不是因為經過嚴格技術評估,而是哲學友人 Greg Restall 推薦的結果。但他回頭看認為 Haskell 的三個特性確實救了這個專案:

  • Algebraic data types 提供乾淨的 AST 表示
  • 強型別系統讓重構變得安全——編譯器會指出所有需要修改的地方
  • 純函式語意--sandbox 模式可以嚴格保證 reader/writer 不會存取檔案系統

他評估過 Rust 作為替代方案,結論是 Rust「更快、更省記憶體」,但 Haskell 在「表達抽象」與「輔助開發者思考」上更貼近他心中理想語言的位置。

貢獻者高度集中:前三人佔九成變更

從作者提供的 20 年貢獻者統計可以看出極端集中度:

貢獻者變更行數活躍年份
John MacFarlane372,3172006–
Albert Krewinkel77,1362014–
Jesse Rosenthal39,6642014–
Christian Despres15,3142019–2021

前三人的變更行數佔總量 90% 以上。這反映兩個事實:(1) 創始人長期主導(MacFarlane 二十年如一日),(2) Haskell 生態對貢獻者的高技術門檻讓新手難以加入。Handshake 的 10 萬美元捐贈雖然緩解了部分維護壓力,但整體仍高度依賴少數核心成員。

LLM 能取代 Pandoc 嗎?作者親自回答

MacFarlane 在「Whither Pandoc」一節直接面對這個問題:他承認 LLM 在 Markdown→HTML 這類任務上表現不錯,但 Pandoc 仍有三大不可取代的優勢:

  1. 能源效率——純轉換比呼叫 LLM 省電幾個數量級
  2. 確定性輸出——同一份文件永遠產生相同結果,可預測、可重現
  3. 當前可靠性——LLM 對複雜格式(如嵌套 emphasis、表格欄寬)仍會出包

他自己也承認,未來某天 LLM 可能會比 Pandoc 更可靠,就像當年 CommonMark 設計時遇到的「人類語意理解的極限」問題——「在我們的程式有 AI 之前,總會有這些 edge case;到某個點我們必須接受並停止設計更複雜的規則」。


寫在 20 週年之後:Pandoc 的下一步

MacFarlane 在文末表示,他仍然幾乎每天都在維護 Pandoc,但工作內容已經從「重大功能開發」轉向「修 bug、審 PR、處理基礎建設、回應使用者」。這種「成熟開源專案的日常」其實是另一種工程紀律的展現。

對於使用者,Pandoc 20 週年最值得記住的是:

  • Pandoc 3.9 的 WASM 版本讓 pandoc.org/try 可以在瀏覽器裡跑完整版(不用裝任何東西)
  • djot 作為 MacFarlane 自己設計的下一代輕量標記語言,Pandoc 已原生支援
  • Typst 整合讓學術 PDF 排版正式脫離 LaTeX 的束縛

當被問到「Pandoc 還能做什麼不同的事」時,MacFarlane 的回答或許最能總結這個專案的精神:「繼續改進它。在我看來,還有很多可以改進的地方。

Pandoc 20 年證明了一件事:真正持久的開源工具,往往不是解決熱門問題的那個,而是願意把一個冷門問題持續打磨二十年的那個。在 LLM 鋪天蓋地重新發明所有軟體的今天,這種「長期主義的工程美學」反而顯得格外珍貴。

網友熱門留言 (4)

#1 Hacker News 讀者(lwn 轉錄) ▲ 92
這是至今仍在維護的最具生產力的開源工具之一,每天都在用來把 Markdown 轉成 PDF 與 docx。
#2 Hacker News 讀者(typst 文件支援) ▲ 67
Typst + pandoc 的組合拯救了我的學術寫作流程,期待 3.x 系列把 Typst reader 做得更完整。
#3 Hacker News 讀者(Haskell 純度) ▲ 58
MacFarlane 把 Haskell 的 algebraic data types 拿來表達文件 AST,比 OOP 結構乾淨太多,這也是 pandoc 二十年仍能持續演進的關鍵。
#4 Hacker News 讀者(LLM 對照) ▲ 44
作者自己也點出 LLM 文件轉換的能耗與不確定性問題——pandoc 在能源效率與可重現性上仍然完勝。