Shann's Introduction to MathML

MathML (Mathematics Markup Language) 是 W3C (WWW Consortium) 的一個特別任務小組 (W3C HTML-Math Working Group), 企圖制訂的一套標準語言. MathML 和 HTML 一樣, 是一種在 WWW 網路上呈現多媒體超文資訊的【文件加註語言】. 有關 W3C 和 HTML 的基本觀念, 請參閱 上一頁 (Showing Mathematics on the Web).

在數學界 (和一大部分的科學文件寫作者), 大部分人已經知道 TeX (或 LaTeX) 這種文件加註語言. 從語法的結構性而言, TeX 是非常地不結構化, LaTeX 比較結構化, MathML 是絕對的結構化. 比如說在 TeX 我們說 ${1 \over x+y}$, 在 LaTeX 我們說 $\frac{1}{x+y}$, 在 MathML 我們必須說 <MFRAC> <MROW> <MN>1</MN> </MROW> <MROW> <MI>x</MI> <MO>+</MO> <MI>y</MI> </MROW> </MFRAC>.

從上面這個例子, 我們可以領略 MathML 的品味. <MFRAC> </MFRAC> 指定一個分式的結構. 這個結構中必須有兩個子結構; 第一個放分子, 第二個放分母. 這一部分倒是和 LaTeX 的結構一致. 在此例子中, 分子和分母分別各是一個普通的數學列式 <MROW> </MROW> 而 <MN>1</MN> 說明 1 是個常數, 它的意義就是一般數字的意義; <MI>x</MI> 說明 x 是個變數, y 也是的; <MO>+</MO> 說明 + 是個運算符號.

為什麼要這麼麻煩呢? 因為 MathML 的設計不只是為了排版的目的 (當初設計 TeX 和 LaTeX 的時候, 其目的只有排版而已). 它希望表達的, 不僅僅是版面的配置, 而是盡可能地記錄那數學式子裡面的意義. 仔細想想, 數學表達符號的使用是非常不明確的. 讀者必須從前後文當中去理解那些符號所代表的不同意義. 比如說, x2 其中的 2 到底代表 x 的平方呢, 還是 x 的上標? 比如說, h(f,g) 到底是將 f 和 g 代入雙變數函數 h 呢, 還是 h 乘上 f 與 g 的內積? 比如說, A-1 到底是 A 的逆算子呢, 還是 A 的倒數? 如果讀者根本不能理解前後文的意義, 那麼這些符號當然是沒有意義的. 如果讀者是個電腦, 與其要它理解前後文的意義, 還不如盡量說明這些符號本身的意義. 這就是為什麼 MathML 這麼複雜的原因.

為什麼要記錄數學表達式中的意義呢? 目前我們至少看到兩種目的. 第一, 在意義清楚的情況下, 才方便做格式的轉換. 我們希望能明確地將 MathML 的敘述轉換 (進出) 成別的語言, 比如說轉成 TeX 語言, 使其可以在紙張上印出漂亮的文件; 比如說轉成 Maple 語言, 使其可以在符號計算軟體中運算; 比如說藉由語音合成系統, 將這些數學表達式唸出來. 就像前面說的 h(f,g), 如果意義明確, 我們就知道是應該唸成 h of f and g, 還是 h times the inner product of f and g. 第二, 在意義清楚的情況下, 才有希望製造一個數學事實資料庫. 數學中的變數名稱是沒有固定意義的. 這是初級的數學學生最需要掌握的事情. 比如說, (x+y)2 = x2 + 2xy + y2, 而同樣地 (a+b)2 = a2 + 2ab + b2. 這裡的 x, y 和 a, b 本身沒有不同的意義. 他們的名字不重要, 他們的關係才是重要的. 一個數學資料庫, 必須能夠瞭解這一點, 才可能是有用的資料庫.

所以我們現在看的出來 MathML 在設計上的用心良苦. 但是, 這麼複雜的加註語言, 有誰願意寫啊? 這倒也許不必慌張. 如果它一旦被接受成為普遍的標準 (如同 HTML), 那麼總會有些特別功能的軟體幫我們簡化輸入的程序. 比如說現在的 Microsoft Word 文書處理程式就可以輸出 HTML 格式的文件, 而符號計算軟體, 諸如 Maple 和 Mathematica, 也都可以輸出 LaTeX 格式的文件.

MathML 的加註語言可以粗分成兩大族群: 呈現導向 (Presentation) 和內容導向 (Content). 像前面舉的 <MFRAC> ... </MFRAC> 那個例子, 就是呈現導向的加註指令. 同樣的式子, 如果用內容導向的語言寫來, 就應該是 <EXPR> 1 <OVER/> <EXPR> x <PLUS/> y </EXPR> </EXPR>. (反而變得有點像 TeX 了).

在 1997 年 5 月發布的第一份草案中, MathML 所提供的內容導向之指令, 已經足夠表達大學二年級以前的數學教科書內容. 這包括基本的算術與代數, 微積分, 線性代數, 統計, 集合論和數理邏輯. 這些數學內容, 在今天已經大致上穩定. 所以它們所使用的符號通常比較有固定 (可預期) 的用法與意義, 所以才能設計其內容導向的加註語言.

新的數學可能引入新的符號, 或是將舊符號付予新的用法與意義. 這就是為什麼除了內容導向之外, 我們還需要呈現導向的加註語言. 比如說, 要表達 x 的平方, 內容導向的寫法是 <EXPR> x <POWER/> 2 </EXPR> 而呈現導向的寫法是 <MSUP> <MI>x</MI> <MN>2</MN> </MSUP>. 在這種情況, 前者的寫法顯然比較簡單. 但是後者的寫法有更多的彈性. 除此之外, MathML 還預留了擴充其語言的機能. 利用所謂 <SEMANTICS> 結構, 使用者可以在 MathML 中添加外來的格式或呈現方法. 確實的使用法牽涉到將來的實現方式 (implementation), 所以現在還不清楚.

目前 (1997 年 6 月) 還沒有任何真正支援 MathML 的流灠器. W3C 真正公布 MathML 標準的時間, 預定在 1998 年. 這期間供大家討論, 回饋, 並且也給有意的業者一個公平競爭的機會. 已經有意支援 MathML 的流灠程式 (非獨立的流灠器) 有明尼蘇達大學的 WebEQ 和 IBM 公司的 techexplorer. 這兩種軟體目前都是借用 TeX 或 LaTeX 的加註語言來呈現數學. 有關這兩個程式, 請看上一頁 (Showing Mathematics on the Web) 的 WebEQTechexplorer 部分.


Created: Jun 6, 1997
Last Revised: Jun 6, 1997
© Copyright 1997 Wei-Chang Shann

shann@math.ncu.edu.tw