用 8 個公式, 測試 LaTeX 筆記 App
今晚要整理一整頁的方程式,你手機上的筆記 App 說它支援 LaTeX。但同樣號稱支援 LaTeX 的筆記 App,底下其實有四種不同的做法,差別在第三個公式就會現形。
x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}
分數線要在上下兩部分之間,不是擠在旁邊。把八個測試公式貼進 App,看看顯示出來的結果。巢狀分數、上下限分別在上方和下方的求和、pmatrix 矩陣、可伸縮的括號、align 對齊區塊、cases 分段、\def 巨集,以及 \ce 化學式,能把真正的 LaTeX 筆記 App,和只會畫幾個行內分數的 App 區分開來。顯示成純文字,或變成無法編輯的圖片,都算不及格。
貼上這 八個 公式, 看看 顯示出 什麼
這項檢查不到一分鐘,也不需要帳號。把下面的區塊拷貝到你要評估的 App 裡的一則新筆記,一次貼一段或全部貼上都可以,再把結果和每段後面那一行比對。這裡的每一段都是 KaTeX 能正確顯示的有效 LaTeX,所以如果顯示失敗,問題出在 App,而不是輸入。
筆記 App 的 LaTeX 自我測試
一次貼一個區塊,和「正確結果」那一行比對。
1. 巢狀分數
\frac{1}{1 + \frac{1}{1 + \frac{1}{x}}}
正確結果:三條疊在一起的分數線,每條內層的線都比外層短,
字也比外層小。
2. 帶上下限的運算子
\sum_{n=1}^{\infty} \frac{1}{n^2} = \frac{\pi^2}{6}
正確結果:在獨立成行的顯示模式下,n=1 和無限大分別位在 sigma 的
正下方和正上方,而不是右邊,而且 sigma 比周圍的文字高。
3. 矩陣環境
\begin{pmatrix} a & b \\ c & d \end{pmatrix}^{-1} =
\frac{1}{ad - bc} \begin{pmatrix} d & -b \\ -c & a \end{pmatrix}
正確結果:兩列,圓括號長到和整個矩陣一樣高,
-1 升高在右括號的右上角。
4. 可伸縮的括號
\left( \sum_{i=1}^{n} a_i b_i \right)^2 \le
\left( \sum_{i=1}^{n} a_i^2 \right) \left( \sum_{i=1}^{n} b_i^2 \right)
正確結果:每個括號都長到和它包住的求和一樣高,
成對的兩個括號高度相同。
5. 對齊
\begin{align}
(a+b)^2 &= a^2 + 2ab + b^2 \\
(a-b)^2 &= a^2 - 2ab + b^2
\end{align}
正確結果:一個兩行的區塊,兩行的等號對齊在同一欄。
6. 分段函數
f(x) = \begin{cases}
x^2 & \text{if } x \ge 0 \\
-x^2 & \text{if } x < 0
\end{cases}
正確結果:一個大括號橫跨兩列,兩個條件用直立的正體文字,
而且條件自成一欄。
7. 巨集定義
\def\dd#1{\mathrm{d}#1}
\int_0^1 x^2 \dd{x} = \frac{1}{3}
正確結果:巨集會展開,所以 x 前面出現一個直立的 d,
積分符號上下是 0 和 1。
8. 化學式
\ce{H2SO4 + 2NaOH -> Na2SO4 + 2H2O}
正確結果:數字是下標,元素符號是直立的正體,而不是斜體的變數,
還有一個完整的反應箭頭。
八個公式之後
- 把游標放進顯示好的公式裡,選取其中一個字元。
如果做不到,這個公式就是一張圖片。
- 把系統切換成深色模式。公式如果還是黑色的,
代表它的淺色背景是直接做進去的。
- 把筆記設成最大的字級。圖片會變模糊,
排版出來的公式則依然清晰。 下載文字檔要看的是失敗的地方,而不是成功的地方。第 1 段告訴你,這個 App 做的是排版,還是字串替換。第 3 段和第 6 段,是靠一張簡短替換表運作的顯示方式會卡住的地方。第 7 段區分了真正的 LaTeX 解析器,和只是看起來像 LaTeX 的顯示,因為不理會 \def 的 App,會直接印出原始文字,或丟出解析錯誤。第 8 段需要 mhchem,這是疊在核心數學語法之上的套件,所以一個 App 可能通過前七段,卻在最後一段失敗。
App 說「支援 LaTeX」, 可能指四種 不同的事
兩個 App 可以在功能頁上都寫著 LaTeX,實際表現卻完全不同。下面四種做法,各自都有從外面就看得出來的失敗方式,不必讀任何人的原始碼。
| 層級 | 運作方式 | 怎麼認出來 | 會在哪裡出問題 |
|---|---|---|---|
| 行內子集 | 用一張簡短的替換表,處理錢字號之間的分數、上標和希臘字母 | 第 3 段顯示出來時,還看得到 pmatrix 這個字,或整個擠成一長行 | 你寫下的第一個矩陣、積分或分段函數 |
| 轉成圖片 | LaTeX 送到轉換器,傳回一張點陣圖或 SVG,放進筆記裡 | 游標放不進公式裡,字級放大時圖片會變模糊 | 深色模式下,黑色字形留在深色頁面上;要修改,就得重打原始碼 |
| 瀏覽器引擎 | 一個隱藏的 WebView,用 JavaScript 執行 KaTeX 或 MathJax | 每次開啟後的第一個公式,會比筆記其他內容晚一拍出現 | WebView 要吃掉 50 到 150 MB 的記憶體,第一個公式出現前還有啟動延遲 |
| 原生引擎 | TeX 的盒子與黏合(box-and-glue)規則,直接在 App 自己的程式碼裡執行,完全不經過瀏覽器 | 公式在那一行捲進畫面時就畫出來,並隨系統外觀改變顏色 | 待確認的變成涵蓋範圍,而不是速度,所以還是把八段都測一遍 |
第三列的數字出自 SwaTex 的 README,裡面形容常見的跨平台做法是:一個隱藏的 WebView 吃掉 50 到 150 MB 的記憶體、第一個公式出現前有啟動延遲,也無法保證離線可用。這是重複利用一個不是自己寫的 JavaScript 函式庫所付出的代價。第四種層級的開發成本高得多,但把瀏覽器從頁面裡拿掉了。
原生 排版 引擎有 什麼不 一樣
Phrase 用 SwaTex 顯示數學公式。SwaTex 是以純 Swift 寫成、與 KaTeX 相容的數學排版引擎,沒有 JavaScript、沒有 WebView,也沒有 DOM。它採用 MIT 授權,公開在 github.com/PhraseHQ/SwaTex,是從頭用 Swift 移植 RaTeX(以 Rust 寫成、與 KaTeX 相容的數學排版引擎)的成果。Phrase AI 筆記裡的每一個公式,都由 SwaTex 顯示。它的版面引擎依據內建的 KaTeX 字型度量來執行 TeX 的盒子與黏合規則,而不是依賴平台的文字 API,所以輸出結果和 KaTeX、RaTeX 逐字形一致。

涵蓋範圍是 KaTeX 官方支援表 1008 個項目中的 1007 個。其中包括 pmatrix、align、cases 和 CD 這些環境,以及可伸縮的括號、重音符號,和 \def、\newcommand、\expandafter 這類巨集。化學式透過 \ce 和 \pu 完整支援 mhchem;這部分以狀態機移植而來,並在 253 個測試案例上驗證與 RaTeX 逐位元組一致。證明樹則用 bussproofs 風格的 prooftree,處理推論規則和相繼式演算。上面的第 3、5、6、7、8 段,全都在這個範圍內。
下面的速度數據,是在同一台機器上、用完全相同的測試集,和 Rust 參考引擎比較的結果,取 3 次執行的中位數;兩個引擎在全部 2,541 條基準公式上的輸出逐位元一致。每個數字都能用儲存庫中 BENCHMARKS.md 的指令重現。
| 工作項目 | RaTeX(Rust) | SwaTex |
|---|---|---|
| 從解析、版面到顯示清單 | 41.4 µs/公式 | 12.5 µs/公式(3.3×) |
| PNG 批次輸出,100 條公式 @40px 2× | 約 200 µs/公式 | 實際 34 µs(平行處理,5.9×) |
| 重複的公式,命中編輯器快取 | 41.4 µs | 105 ns(約 390×) |
| 編輯器捲動 | 沒有對應的數據 | 字形點陣化 0 次(updateLayer) |
一致性是經過檢查的,不只是宣稱。儲存庫附有 scripts/diff_layout.py,用 1000 多條公式的基準集,比對 LayoutDump 工具和 RaTeX 版面程式的輸出差異;測試套件也把 RaTeX 自己的詞法分析器、解析器、環境、mhchem 和版面測試移植到 Swift。把公式畫出來,只解決了編輯器問題的一半。公式區塊還需要準確的高度,也要在畫面重複利用時保持正確,這正是公式區塊的高度怎麼算,以及讓計算緊貼著說明這兩篇文章的主題。
筆記寫好之後,就可以請助理用它做出一份作品。訂閱 Pro,Phrase 就能把一則筆記做成簡報、頁面、儀表板、字卡、測驗和心智圖,而一頁寫好的推導,正適合拿來做測驗或一組字卡。有方程式的上課筆記也一樣。
SwaTex 唯一不 顯示的 項目
缺少的項目是 \includegraphics,也就是 1008 個項目中唯一的例外,而 KaTeX 本身也把這個指令放在 trust 設定之後。這個指令會把外部圖片拉進公式裡,所以上游把它當成權限問題,而不是排版問題。另外有四個 \html* 指令會顯示內容,但捨棄只對 DOM 有意義的屬性,因為原生的排版引擎沒有 DOM 可以讓這些屬性描述。
KaTeX 支援表 1008 個項目中的 1007 個
- 可以顯示1003
- 可以顯示,但捨棄只對 DOM 有意義的屬性(四個 \html* 指令)4
- 不顯示:\includegraphics,KaTeX 本身也把它放在 trust 設定之後1
- 最低部署版本是 iOS 18、macOS 15、tvOS 18、watchOS 11 和 visionOS 2,由 Synchronization.Mutex 決定。以更舊系統版本為目標的 App,目前還無法採用 SwaTex。
- 只支援 Apple 原生平台。沒有 React Native、Flutter 或 Web 的封裝。
- 有少數行為刻意和 RaTeX 不同,每一項都有回歸測試固定下來。沒有結尾的 \verb 和 x\limits^2 會是解析錯誤,而不是默默被接受。
- 層層巢狀的輸入,有遞迴次數和堆疊餘裕的保護,只會產生解析錯誤,絕不會當機。惡意輸入仍應由使用它的 App 限制長度。
這一頁有兩件事沒談。手寫數學是另一個問題,因為 Phrase 處理的是打字、錄音和匯入的內容,而不是手寫筆跡。圖表和程式碼區塊則是和公式分開的問題,上面連結的兩篇技術文章,說明了它們怎麼放在同一個編輯器裡。
還有一組事實要分清楚。SwaTex 可以為 macOS 15 建置,而 Phrase Mac 版需要 macOS 26 或以上版本。一個引擎能在某個平台上編譯,並不代表 App 支援哪些系統。Phrase 可以在 iPhone、iPad 和 Mac 上使用,三者都用 SwaTex 顯示公式;另有一個用來錄音的 Apple Watch App。


公式很多的頁面要拿來複習的話,可以用一組你已經寫好的推導,照著筆記做成一疊字卡的方法練習一遍。
關於 筆記 App 裡的 LaTeX, 常見的 問題
Apple 的「備忘錄」能寫數學嗎?與其相信一年前寫的說法,不如直接在你手上的 App 做這份自我測試。Apple 在自己的支援頁面說明「備忘錄」能做什麼,而答案會隨著 iOS 版本改變。第 1 段和第 3 段,大約十秒就能見分曉。
可以在 Apple「備忘錄」裡寫 LaTeX 方程式嗎?輸入 LaTeX 和顯示 LaTeX 是兩個不同的問題。任何 App 都能把 \frac{a}{b} 這幾個字元當作文字存著。重點是會不會出現一條橫線,上面是 a、下面是 b,而這正是第 1 段要檢查的。
支援 LaTeX 的筆記 App,應該處理得了哪些東西?用 KaTeX 支援表當作共同的量尺,因為它是公開的,共有 1008 個項目。能處理環境、可伸縮括號、巨集和 mhchem 的 App,和參考實作用的是同一套語法。只處理行內分數的 App,做的事情就小得多。
數學筆記 App 需要網路連線才能畫出公式嗎?要看是哪一種層級。傳回圖片的轉換器需要來回傳送;WebView 引擎在第一個公式出現前有啟動成本。SwaTex 則在 App 自己的程式碼裡解析和排版,完全不經過瀏覽器。
出處與 編輯 說明
出處核對日期:2026年9月25日。Apple 功能的步驟依照 Apple 目前的說明文件,連結附在下方。這些條件會隨每次 iOS 更新而改變。
- SwaTex:以純 Swift 寫成、與 KaTeX 相容的數學排版引擎 涵蓋 KaTeX 1008 個項目中的 1007 個、\includegraphics 這個例外、透過 \ce 和 \pu 支援的 mhchem、效能測試表,以及最低部署版本。核對日期:2026 年 9 月 20 日。
- KaTeX:支援的函式與支援表 涵蓋率所依據的 1008 項支援表,以及 \includegraphics 的 trust 設定限制。
- mhchem for MathJax:\ce 和 \pu 語法 自我測試第 8 段使用的化學式語法。
