編輯器與公式

用 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 區分開來。顯示成純文字,或變成無法編輯的圖片,都算不及格。

01

貼上這八個公式,看看顯示出什麼

這項檢查不到一分鐘,也不需要帳號。把下面的區塊拷貝到你要評估的 App 裡的一則新筆記,一次貼一段或全部貼上都可以,再把結果和每段後面那一行比對。這裡的每一段都是 KaTeX 能正確顯示的有效 LaTeX,所以如果顯示失敗,問題出在 App,而不是輸入。

八個公式的 LaTeX 自我測試
筆記 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 可能通過前七段,卻在最後一段失敗。

02

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 函式庫所付出的代價。第四種層級的開發成本高得多,但把瀏覽器從頁面裡拿掉了。

03

原生排版引擎有什麼不一樣

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 逐字形一致。

Phrase 裡一則完成的會議筆記:摘要、畫成流程圖的開店計畫、損益兩平公式和待辦事項。
iPhone 上的一則 Phrase 筆記:SwaTex 排版的損益兩平公式,旁邊是一張流程圖。

涵蓋範圍是 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 µs105 ns(約 390×)
編輯器捲動沒有對應的數據字形點陣化 0 次(updateLayer)

一致性是經過檢查的,不只是宣稱。儲存庫附有 scripts/diff_layout.py,用 1000 多條公式的基準集,比對 LayoutDump 工具和 RaTeX 版面程式的輸出差異;測試套件也把 RaTeX 自己的詞法分析器、解析器、環境、mhchem 和版面測試移植到 Swift。把公式畫出來,只解決了編輯器問題的一半。公式區塊還需要準確的高度,也要在畫面重複利用時保持正確,這正是公式區塊的高度怎麼算,以及讓計算緊貼著說明這兩篇文章的主題。

筆記寫好之後,就可以請助理用它做出一份作品。訂閱 Pro,Phrase 就能把一則筆記做成簡報、頁面、儀表板、字卡、測驗和心智圖,而一頁寫好的推導,正適合拿來做測驗或一組字卡。有方程式的上課筆記也一樣。

04

SwaTex 唯一不顯示的項目

缺少的項目是 \includegraphics,也就是 1008 個項目中唯一的例外,而 KaTeX 本身也把這個指令放在 trust 設定之後。這個指令會把外部圖片拉進公式裡,所以上游把它當成權限問題,而不是排版問題。另外有四個 \html* 指令會顯示內容,但捨棄只對 DOM 有意義的屬性,因為原生的排版引擎沒有 DOM 可以讓這些屬性描述。

KaTeX 支援表 1008 個項目中的 1007 個

  • 可以顯示1003
  • 可以顯示,但捨棄只對 DOM 有意義的屬性(四個 \html* 指令)4
  • 不顯示:\includegraphics,KaTeX 本身也把它放在 trust 設定之後1
SwaTex 能顯示 KaTeX 支援表 1008 個項目中的 1007 個。唯一的缺口是 \includegraphics,KaTeX 本身也把它放在 trust 設定之後。
  • 最低部署版本是 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。

Phrase Mac 版:筆記資料庫旁是一份咖啡館開店計畫,附照片、摘要、流程圖和損益兩平公式。
Phrase Mac 版裡的同類筆記;Mac 版需要 macOS 26 或以上版本。
05

關於筆記 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 更新而改變。

由 Phrase 的開發團隊 Eversight 發布。我們的編輯原則 · 回報錯誤