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

mote 有一條絕對的規則。那就是不依賴網頁引擎。
在製作原型時,我發現了一件事。在這類應用程式中,內嵌瀏覽器引擎占了大部分成本。所以從一開始就決定把它拿掉。
問題出在數學公式。一般會把 KaTeX 或 MathJax 放進瀏覽器裡顯示公式。但這是 mote 無法採用的方法。
其他方法也不合適。如果使用自製的字型渲染器,字形就會和系統中的其他應用程式不一樣。因為 mote 已決定讓所有文字都由平台的文字引擎繪製。
最後,我們選擇了最困難的一條路。
排版由 mote 負責,文字由平台繪製
數學公式的語法採用了大家熟悉的方式。在句子裡以一對錢字號包住,獨立顯示時則以兩對錢字號包住。
開頭符號之後和結尾符號之前不能留空格。這是為了避免把 $5 和 $6 這類金額誤判為數學公式。在由人直接撰寫的 Markdown 中,這種細微的區分很重要。
顯示數學公式的工作被拆成兩部分。
mote 的核心會計算文字與線條的位置。實際的文字則由各平台的文字引擎繪製。
核心中納入了簡化的 TeX 排版規則。包括四種尺寸層級、將符號分成八類以決定彼此間距的表格、上下標、分數與根號的位置,以及會依內容調整大小的括號等。
但文字的實際大小並不是由核心決定。因為即使是同一個字元,也會因字型和平台而有不同的大小。核心詢問平台「以這個尺寸繪製這個字元時會有多大?」,平台就會回答。核心根據這個數值完成排版,而平台則在指定的位置繪製文字與線條。
如此一來,即使支援的平台增加,也只需要維護一套版面配置。
在編輯器中,原始文字也會原封不動地保留下來。即使在即時模式中顯示了數學公式,來源位元組仍然存在於該行之中。只在原本的位置保留與公式尺寸相同的空間。
因此,游標可以停在正確的位置,也能精確找到點選的字元。這遵守了即使修飾畫面,也不改動檔案的原則。閱讀模式和 PDF 也使用相同的版面配置。

斜體也不會被硬是傾斜。mote 使用 Unicode 數學字元,繪製字型中真正的數學字符。
不會隱藏無法辨識的數學公式
數學公式如果悄悄地顯示錯誤,就很難被發現。
若把不支援的命令顯示成空白,使用者就無法知道究竟是拼字錯誤,還是應用程式本身的限制。因此,mote 會將無法辨識的命令依照原名以紅色顯示。
即使括號不成對,應用程式也不會停止運作。這類輸入會被保留為測試案例,避免相同的問題再次發生。
效能方面的原則也獲得遵守。系統會依照數學公式和文字大小,最多儲存 512 筆計算結果。輸入文字時不會反覆計算相同的公式,而在使用者沒有進行任何操作時,也不會執行任何工作。
匯出成 HTML 時會使用 MathML。由於瀏覽器會直接顯示數學公式,因此不需要指令碼。即使沒有網際網路,公式也能照常顯示。
也有目前還做不到的事
mote 並不支援完整的 TeX。
目前還不支援使用者自訂命令、指定顏色、公式編號、多行上下標、文字上方的符號,以及箭頭上方的文字。
也沒有能依寬度延展的重音符號。寬的帽狀符號看起來也會像窄的一樣。大型總和與積分符號並未使用專用字符,而是放大至 1.45 倍來繪製。原本應該只在垂直方向延展的括號,也會同時在水平與垂直方向放大。
行內分數會像 TeX 一樣顯示得較小。若想顯示得更大,就必須透過另外的命令指定。
我不會假裝這些功能已經存在。收到相關需求時,再逐一加入。
我們沒有只因為一條數學公式,就改變整個應用程式的成本結構。相反地,我們改變了顯示數學公式的方式。
雖然這是一條更困難的路,但我相信它是一條能長久走下去的路。