功能價格文件部落格
取得 mote
← 部落格
工程·2026年7月14日·閱讀時間 4 分鐘

不用網頁引擎,快速渲染數學公式的方法

有很多應用程式只為了顯示一條數學公式,就把整套瀏覽器引擎帶在身上。mote 走不了這條路,所以必須另尋他法。

m
mote
閱讀模式中的數學公式。混在句子裡的行內公式,以及置於下方中央的區塊公式,都由同一套版面配置引擎產生。
閱讀模式中的數學公式。混在句子裡的行內公式,以及置於下方中央的區塊公式,都由同一套版面配置引擎產生。

mote 有一條絕對的規則。那就是不依賴網頁引擎。

在製作原型時,我發現了一件事。在這類應用程式中,內嵌瀏覽器引擎占了大部分成本。所以從一開始就決定把它拿掉。

問題出在數學公式。一般會把 KaTeX 或 MathJax 放進瀏覽器裡顯示公式。但這是 mote 無法採用的方法。

其他方法也不合適。如果使用自製的字型渲染器,字形就會和系統中的其他應用程式不一樣。因為 mote 已決定讓所有文字都由平台的文字引擎繪製。

最後,我們選擇了最困難的一條路。

排版由 mote 負責,文字由平台繪製

數學公式的語法採用了大家熟悉的方式。在句子裡以一對錢字號包住,獨立顯示時則以兩對錢字號包住。

開頭符號之後和結尾符號之前不能留空格。這是為了避免把 $5$6 這類金額誤判為數學公式。在由人直接撰寫的 Markdown 中,這種細微的區分很重要。

顯示數學公式的工作被拆成兩部分。

mote 的核心會計算文字與線條的位置。實際的文字則由各平台的文字引擎繪製。

核心中納入了簡化的 TeX 排版規則。包括四種尺寸層級、將符號分成八類以決定彼此間距的表格、上下標、分數與根號的位置,以及會依內容調整大小的括號等。

但文字的實際大小並不是由核心決定。因為即使是同一個字元,也會因字型和平台而有不同的大小。核心詢問平台「以這個尺寸繪製這個字元時會有多大?」,平台就會回答。核心根據這個數值完成排版,而平台則在指定的位置繪製文字與線條。

如此一來,即使支援的平台增加,也只需要維護一套版面配置。

在編輯器中,原始文字也會原封不動地保留下來。即使在即時模式中顯示了數學公式,來源位元組仍然存在於該行之中。只在原本的位置保留與公式尺寸相同的空間。

因此,游標可以停在正確的位置,也能精確找到點選的字元。這遵守了即使修飾畫面,也不改動檔案的原則。閱讀模式和 PDF 也使用相同的版面配置。

即時模式中游標所在的行——行內公式會以原始文字 그대로顯示,下方的區塊公式則會顯示為排版完成的分數
即時模式中游標所在的行——行內公式會以原始文字 그대로顯示,下方的區塊公式則會顯示為排版完成的分數

斜體也不會被硬是傾斜。mote 使用 Unicode 數學字元,繪製字型中真正的數學字符。

不會隱藏無法辨識的數學公式

數學公式如果悄悄地顯示錯誤,就很難被發現。

若把不支援的命令顯示成空白,使用者就無法知道究竟是拼字錯誤,還是應用程式本身的限制。因此,mote 會將無法辨識的命令依照原名以紅色顯示。

即使括號不成對,應用程式也不會停止運作。這類輸入會被保留為測試案例,避免相同的問題再次發生。

效能方面的原則也獲得遵守。系統會依照數學公式和文字大小,最多儲存 512 筆計算結果。輸入文字時不會反覆計算相同的公式,而在使用者沒有進行任何操作時,也不會執行任何工作。

匯出成 HTML 時會使用 MathML。由於瀏覽器會直接顯示數學公式,因此不需要指令碼。即使沒有網際網路,公式也能照常顯示。

也有目前還做不到的事

mote 並不支援完整的 TeX。

目前還不支援使用者自訂命令、指定顏色、公式編號、多行上下標、文字上方的符號,以及箭頭上方的文字。

也沒有能依寬度延展的重音符號。寬的帽狀符號看起來也會像窄的一樣。大型總和與積分符號並未使用專用字符,而是放大至 1.45 倍來繪製。原本應該只在垂直方向延展的括號,也會同時在水平與垂直方向放大。

行內分數會像 TeX 一樣顯示得較小。若想顯示得更大,就必須透過另外的命令指定。

我不會假裝這些功能已經存在。收到相關需求時,再逐一加入。

我們沒有只因為一條數學公式,就改變整個應用程式的成本結構。相反地,我們改變了顯示數學公式的方式。

雖然這是一條更困難的路,但我相信它是一條能長久走下去的路。

← 較舊為了在其他工具中也顯示為相同段落,我們訂下了 Enter 鍵的規則較新 →0.9.0-beta.1:首次公開測試版包含了什麼
透過 RSS 持續關注。
只留下文字。
繁體中文
© 2026 mote