數學置標語言

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

由於數學符號和公式的結構複雜且符號與符號之間存在多種邏輯關係，MathML的格式十分繁瑣。因此，大多數人都不會去手寫MathML，而是利用其它的工具來編寫，其中包括到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中來標記內嵌文本（在例子中使得第一個單詞加粗）。並且

- `&lt;mtext&gt;&lt;b&gt;non&lt;/b&gt; zero&lt;/mtext&gt;`

是合格的。

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

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

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

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

MathML的完整實體說明在標準的第七章，並且和HTML與XML的協調在。

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

```xml
    <mrow>
      a &InvisibleTimes; <msup>x 2</msup>
      + b &InvisibleTimes; x
      + c
    </mrow>
```

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

```xml
    <mrow>
      <mi>a</mi> <mo>&InvisibleTimes;</mo> <msup><mi>x</mi><mn>2</mn></msup>
      <mo>+</mo><mi>b</mi><mo>&InvisibleTimes;</mo><mi>x</mi>
      <mo>+</mo><mi>c</mi>
    </mrow>
```

有效的MathML文檔需要包含XML聲明、DOCTYPE聲明和文檔元素。

文檔體包含位於元素內的MathML表達式。通常，MathML會被內嵌於多種通用文檔中，例如HTML、DocBook，獲知其它的XML模式。一個包含如上MathML的完整的文檔顯示如下：

```html
 <?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE math PUBLIC "-//W3C//DTD MathML 2.0//EN"
           "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd">
  <math xmlns="http://www.w3.org/1998/Math/MathML">
    <mrow>
      <mi>a</mi>
      <mo>&InvisibleTimes;</mo>
      <msup>
        <mi>x</mi>
        <mn>2</mn>
      </msup>
      <mo>+</mo>
      <mi>b</mi>
      <mo>&InvisibleTimes; </mo>
      <mi>x</mi>
      <mo>+</mo>
      <mi>c</mi>
    </mrow>
  </math>
```

### 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$可以被表示為：

```xml
<math>
    <apply>
        <plus/>
        <apply>
            <times/>
            <ci>a</ci>
            <apply>
                <power/>
                <ci>x</ci>
                <cn>2</cn>
            </apply>
        </apply>
        <apply>
            <times/>
            <ci>b</ci>
            <ci>x</ci>
        </apply>
        <ci>c</ci>
    </apply>
</math>
```

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

```Scheme
  (plus
    (times a (power x 2))
    (times b x)
    c)
```

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

## 與其它格式的對比

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

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

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

```latex
x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
```

若用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，則需要：

```xml
<math mode="display" xmlns="http://www.w3.org/1998/Math/MathML">
  <mrow>
    <mi>x</mi>
    <mo>=</mo>
    <mfrac>
      <mrow>
        <mo form="prefix">&#x2212;<!-- − --></mo>
        <mi>b</mi>
        <mo>&#x00B1;<!-- &PlusMinus; --></mo>
        <msqrt>
          <msup>
            <mi>b</mi>
            <mn>2</mn>
          </msup>
          <mo>&#x2212;<!-- − --></mo>
          <mn>4</mn>
          <mo>&#x2062;<!-- &InvisibleTimes; --></mo>
          <mi>a</mi>
          <mo>&#x2062;<!-- &InvisibleTimes; --></mo>
          <mi>c</mi>
        </msqrt>
      </mrow>
      <mrow>
        <mn>2</mn>
        <mo>&#x2062;<!-- &InvisibleTimes; --></mo>
        <mi>a</mi>
      </mrow>
    </mfrac>
  </mrow>
  <annotation encoding="TeX">
     x=\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
  </annotation>
  <annotation encoding="StarMath 5.0">
     x={-b plusminus sqrt {b^2 - 4 ac}} over {2 a}
  </annotation>
</math>
```

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

## 在XHTML或HTML5文件中內嵌MathML

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

例如 math-test.xhtml:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/xhtml-math11-f.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
	<head>
		<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
		<title>Example of MathML embedded in an XHTML file</title>
		<meta name="description" content="Example of MathML embedded in an XHTML file" />
		<meta name="keywords" content="Example of MathML embedded in an XHTML file" />
	</head>
	<body>
		<h1>Example of MathML embedded in an XHTML file</h1>
		<p>
			Given the quadratic equation
			<math xmlns="http://www.w3.org/1998/Math/MathML">
				<mrow>
					<mi>a</mi>
					<mo>&#x2062;<!-- &InvisibleTimes; --></mo>
					<msup>
						<mi>x</mi>
						<mn>2</mn>
					</msup>
					<mo>+</mo>
					<mi>b</mi>
					<mo>&#x2062;<!-- &InvisibleTimes; --></mo>
					<mi>x</mi>
					<mo>+</mo>
					<mi>c</mi>
					<mo>=</mo>
					<mi>0</mi>
				</mrow>
			</math>
			, the roots are given by
			<math xmlns="http://www.w3.org/1998/Math/MathML">
				<mrow>
					<mi>x</mi>
				<mo>=</mo>
					<mfrac>
						<mrow>
							<mo form="prefix">&#x2212;<!-- − --></mo>
							<mi>b</mi>
							<mo>&#x00B1;<!-- &PlusMinus; --></mo>
							<msqrt>
								<msup>
									<mi>b</mi>
									<mn>2</mn>
								</msup>
								<mo>&#x2212;<!-- − --></mo>
								<mn>4</mn>
								<mo>&#x2062;<!-- &InvisibleTimes; --></mo>
								<mi>a</mi>
								<mo>&#x2062;<!-- &InvisibleTimes; --></mo>
								<mi>c</mi>
							</msqrt>
						</mrow>
						<mrow>
							<mn>2</mn>
							<mo>&#x2062;<!-- &InvisibleTimes; --></mo>
							<mi>a</mi>
						</mrow>
					</mfrac>
				</mrow>
			</math>
			.
		</p>
	</body>
</html>
```

而內聯MathML同樣被HTML5文件支持。支持的瀏覽器有當前版本的WebKit（Safari）和Gecko（Firefox）。

例如： math-test.htm

```html5
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>Example of MathML embedded in an HTML5 file</title>
	</head>

	<body>
		<h1>Example of 
			<abbr title="Mathematical Markup Language">MathML</abbr>
			embedded in an 
			<abbr title="HyperText Markup Language">HTML</abbr>
			5 file
		</h1>
		<p>
			Given the quadratic equation
			<math>
				<mrow>
					<mi>a</mi>
					<mo>&InvisibleTimes;</mo>
					<msup>
						<mi>x</mi>
						<mn>2</mn>
					</msup>
					<mo>+</mo>
					<mi>b</mi>
					<mo>&InvisibleTimes;</mo>
					<mi>x</mi>
					<mo>+</mo>
					<mi>c</mi>
					<mo>=</mo>
					<mi>0</mi>
				</mrow>
			</math>
			, the roots are given by
			<math>
				<mrow>
					<mi>x</mi>
					<mo>=</mo>
					<mfrac>
						<mrow>
							<mo form="prefix">−</mo>
							<mi>b</mi>
							<mo>&PlusMinus;</mo>
							<msqrt>
								<msup>
									<mi>b</mi>
									<mn>2</mn>
								</msup>
								<mo>−</mo>
								<mn>4</mn>
								<mo>&InvisibleTimes;</mo>
								<mi>a</mi>
								<mo>&InvisibleTimes;</mo>
								<mi>c</mi>
							</msqrt>
						</mrow>
						<mrow>
							<mn>2</mn>
							<mo>&InvisibleTimes;</mo>
							<mi>a</mi>
						</mrow>
					</mfrac>
				</mrow>
			</math>
			.
		</p>
	</body>
</html>
```

## 軟體支持

### 瀏覽器

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

而WebKit排版引擎有針對MathML的開發版，這一特性只出現在Safari 5.1及更高版本、Chrome 24，但是不在後來的Chrome版本裡面。Google移除了MathML支持，宣稱架構上的安全問題和低使用量不會證明他們的維護時間有理。2013年10月，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

## 基本資料

- 日語原文：數學標記語言（MathML）
- 所有者：全球資訊網聯盟（W3C）
- 類型：標記語言
- 擴展自：XML
- 標準： Mathematical Markup Language (MathML) Version 3.0 2nd Edition
- 網站： W3C MathML