数学标记语言

**數學標示語言**（Mathematical Markup Language，MathML），是一種基於 XML 的標準，用來描述數學符號和公式。它的目標是把數學公式整合到全球資訊網和其他文件中。從 2015 年開始，MathML 成為了 HTML5 的一部分和 ISO 標準。

由於數學符號和公式的結構複雜且符號與符號之間存在多種邏輯關係，MathML 的格式十分繁瑣。因此，大多數人都不會去手寫 MathML，而是利用其它的工具來編寫，其中包括 TeX 到 MathML 的轉換器。

## 歷史

它是由 W3C 的數學工作群組提出的。語言規格 1.01 版於 1999 年 7 月公布，2.0 版於 2001 年 2 月出現。W3C 的數學工作群組在 2003 年 10 月發布了 MathML 2.0 的第二版，之後又在 2010 年 10 月發布了 MathML 3.0.

## 結構和語法

MathML 十分類似 HTML，但非常繁瑣。它繼承了角括號和雙標籤（<標籤> 內容 </ 標籤>）的用法。

MathML 不但規定數學式子的**表現**，而且也規定數學數字的**含義**（前者叫做「Presentation MathML」，後者叫做「Content MathML」)。由於數學式子的意義與表現是分離開的，如何交流內容留給了使用者。例如，內嵌 MathML 的網頁可以讓許多瀏覽器按照正常的網頁一樣瀏覽。但是視覺受損者也可以用相同的 MathML，通過螢幕閱讀器（例如 IE 瀏覽器的 MathPlayer 外掛程式、Opera 瀏覽器 9.50 構建號 9656+、火狐瀏覽器的 Fire Vox 附加元件）有聲朗讀出來。

### Presentation MathML

Presentation MathML 側重於如何顯示一個數學式子，大約有 30 個元素。元素名字全部以 `m` 開頭。構建 Presentation MathML 表達式的記號是有一些更高層的元素組合而成的，這些元素控制它們的介面（大約有 50 個屬性，基本很好地控制了細節）。

記號元素只包含文字（沒有其他元素），它們有：

* `<mi>x</mi>` —— 識別碼
* `<mo>+</mo>` —— 運算子
* `<mn>2</mn>` —— 數字
* `<mtext>non zero</mtext>` —— 文字

注意到儘管這些記號元素能用於表示擴充要點，允許用宿主語言來標記。HTML5 的 MathML 幾乎允許在 mtext 中行內 HTML 標記，可以把 HTML 標記放在 MathML 中來標記內嵌文字（在例子中使得第一個單詞加粗）。並且

* `<mtext><b>non</b> zero</mtext>`

是合格的。

這些是布局元素，它們都只能包含元素。它們有：

* `<mrow>` —— 水平的一行
* `<msup>`、 `<munderover>` 等等 —— 上標，規定上下運算子，就像求和號等等一樣
* `<mfrac>` —— 分數
* `<msqrt>` 和 `<mroot>` —— 方根
* `<mfenced>` —— 用柵隔離開內容，例如括號

與 HTML 和 XML 一樣，有許多實體來指定特殊符號，例如 `&pi;` 和 `&RightArrow;`。有趣的是，通常不可見運算子也依然存在實體，例如 `&InvisibleTimes;` 用於表示乘法運算中被省略的乘號。這些不可見運算子是：

* U+2061 函式應用
* U+2062 不可見乘號
* U+2063 不可見分隔符
* U+2064 不可見加號

MathML 的完整實體說明在標準的第七章，並且和 HTML 與 XML 的協調在 [1] （頁面存檔備份，存於網際網路檔案館）。

所以，表達式 $ax^{2}+bx+c$ 需要兩個元素：一個是建立總體的水平行，另一個建立上標的指數。只有元素和（沒有標記的）裸記號的布局的結構如下：

然而，單個記號也必須用識別碼（mi）、運算子（mo）或數字（mn）表示。添加到記號標記，完整的形式如下：

有效的 MathML 文件需要包含 XML 聲明、DOCTYPE 聲明和文件元素。
文件體包含位於 <math> 元素內的 MathML 表達式。通常，MathML 會被內嵌於多種通用文件中，例如 HTML、DocBook，獲知其它的 XML 模式。一個包含如上 MathML 的完整的文件顯示如下：

### Content MathML

Content MathML 側重於表達式的語意，而不是布局。中間的 Content MathML 是用 `<apply>` 元素來表示功能的具體應用。被應用的功能的長子元素放在 `<apply>` 下，並且它的運算元或參數是剩下來的子元素， Content MathML 只有少許屬性。

識別碼和數字之類的記號被單獨標記，就像 Presentation MathML 一樣，但是元素類似 `ci` 和 `cn`。不同於僅僅是另一個類型的記號，運算子表示具體的元素。它們的數學語意可以從 MathML 中的製鞋符號中看出來：`times`、`power` 等等。為不同的功能和運算子超過 100 個不同的元素（見標準第四章）。

例如，`<apply><sin/><ci>x</ci></apply>` 代表 $\sin x$ ，而 `<apply><plus/><ci>x</ci><cn>5</cn></apply>` 代表 $x+5$ 。表示運算子和功能的元素是空元素，因為它們的運算元是其它在下面包含有 `<apply>` 的元素。

表達式 $ax^{2}+bx+c$ 可以被表示為：

Content MathML 近乎是同構於一個功能語言（例如 Scheme）中的表達式。`<apply>...</apply>` 的數量就是 Scheme 的 `(...)`，而且許多運算子和功能元素的就是 Scheme 的函式。有了這些精細的文字轉換，外加去標籤的單獨記號，上面的例子就成為：

這放映出 XML 元素結構和 LISP 或 Scheme 的 S - 表達式的長期的親密關係。

## 與其它格式的對比

例如，書寫以下的二次方程求根公式：

　
: $x={\frac {-b\pm {\sqrt {b^{2}-4ac}}}{2a}}$

若用 LaTeX，則只需要一行代碼：

若用 eqn，則也只需一行代碼

```
x={-b +- sqrt{b sup 2 – 4ac}} over 2a
```

若用 Apache OpenOffice Math 和 LibreOffice Math，則也只需要一行代碼（以下三種均可）：

```
x={-b plusminus sqrt {b^2 – 4 ac}} over {2 a}
x={-b ± sqrt {b^2 – 4ac}} over 2a
x={-b +- sqrt {b^2 – 4ac}} over 2a
```

若用 ASCIIMathML （頁面存檔備份，存於網際網路檔案館），則也只需要一行代碼

```
x = (-b +- sqrt(b^2 – 4ac)) / (2a)
```

但用 MathML，則需要：

雖然如此，由於 MathML 是嚴格遵守 XML 規範的語言，很多已經運用 XML 的軟體可以輕易的讀懂 MathML。這也是這種語言的製作者 W3C 組織寧可選擇複雜的句法也要和標準一致的一個重要原因。

## 在 XHTML 或 HTML5 檔案中內嵌 MathML

MathML 是一種 XML，可以通過使用 XML 命名空間來嵌入 XML 檔案中，例如 XHTML 檔案。現代瀏覽器例如火狐瀏覽器版本 3 以上版本和 Opera 瀏覽器 9.6 以上版本（不完全支援）可以展示 XHTML 內嵌的 MathML。

例如 math-test.xhtml:

而行內 MathML 同樣被 HTML5 檔案支援。支援的瀏覽器有目前版本的 WebKit（Safari）和 Gecko（Firefox）。

例如： math-test.htm

## 軟體支援

### 瀏覽器

在現在幾個主要的網頁瀏覽器中，基於 Gecko 的瀏覽器（如 Firefox）有最完備的原生支援。

而 WebKit 排版引擎有針對 MathML 的開發版，這一特性只出現在 Safari 5.1 及更高版本、Chrome 24，但是不在後來的 Chrome 版本裡面。Google 移除了 MathML 支援，宣稱架構上的安全問題和低使用量不會證明他們的維護時間有理。截至 2013 年 10 月年 (2013 年 10 月 - Missing required parameter 1=_month_!)，WebKit/Safari 的實現存在多個 bug。

Opera 9.5—12 支援 MathML CSS 組態，但不能使附加符號正確放置。9.5 之前需要使用者指令碼或樣式以類比 MathML 支援。從 Opera 14 開始，Opera 通過遷移到 Chromium 25 引擎移除了 MathML 支援。

Internet Explorer 原生不支援 MathML。IE6 到 IE9 在安裝了 MathPlayer 外掛程式後也可以辨識 MathML。IE10 使用 MathPlayer 時存在一些崩潰 bug，並且微軟決定在 IE11 完全禁止 MathPlayer 所需的二進位外掛程式介面。MathPlayer 有協定條款會限制在商用頁面或軟體上面的使用或發行。使用或發行 MathPlayer 外掛程式以通過商用軟體中的 WebBrowser 控制項顯示 HTML 內容也有可能受到禁止。

基於 KHTML 的 Konqueror 不提供對 MathML 的支援。

### 編輯器

MathML 還得到了主要辦公軟體的支援，如 Apache OpenOffice、LibreOffice、Microsoft Office，以及數學軟體的支援，如 Mathematica、Maple。

Firemath 是火狐瀏覽器的附加元件，提供 WYSIWYG 的 MathML 編輯器。

### 手寫辨識

Windows 7 內建工具名叫 Math Input Panel。可以把手寫輸入轉換為 MathML。

## 參考文獻

## 外部連結

* W3C MathML （頁面存檔備份，存於網際網路檔案館） （英文）
* MathPlayer （頁面存檔備份，存於網際網路檔案館） （英文） －Internet Explorer 的外掛程式。
* MathML in Mozilla （頁面存檔備份，存於網際網路檔案館） （英文） －Mozilla 的 MathML 計劃。
* WYSIWYG Equation editor （頁面存檔備份，存於網際網路檔案館） （英文）
* Pavi, Sandhu. The Mathml Handbook. Charles River Media. December 12, 2002 [2015-11-05]. （原始內容存檔於 2015-11-07）.

## 參見

* HTML
* XML
* TeX
* LaTeX
* W3C