數學標示語言

基於XML顯示數學公式的標記語言

數學標示語言Mathematical Markup LanguageMathML),是一種基於XML的標準,用來描述數學符號和公式。它的目標是把數學公式整合到萬維網和其他文件中。從2015年開始,MathML成為了HTML5的一部分和ISO標準。

數學標示語言(MathML)
網路媒體型式application/mathml+xml、​application/mathml-presentation+xml、​application/mathml-content+xml、​math/mml
開發者萬維網聯盟(W3C)
格式類型標示語言
延伸自XML
標準Mathematical Markup Language (MathML) Version 3.0 2nd Edition
網站W3C MathML

由於數學符號和公式的結構複雜且符號與符號之間存在多種邏輯關係,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英語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]頁面存檔備份,存於互聯網檔案館)。

所以,表達式 需要兩個元素:一個是建立總體的水平行,另一個建立上標的指數。只有元素和(沒有標記的)裸記號的佈局的結構如下:

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

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

    <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聲明和文件元素。 文件體包含位於<math>元素內的MathML表達式。通常,MathML會被內嵌於多種通用文件中,例如HTMLDocBook,獲知其它的XML模式。一個包含如上MathML的完整的文件顯示如下:

 <?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 一樣,但是元素類似 cicn。不同於僅僅是另一個類型的記號,運算子表示具體的元素。它們的數學語意可以從MathML中的製鞋符號中看出來:timespower等等。為不同的功能和運算子超過100個不同的元素(見標準第四章)。

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

表達式 可以被表示為:

<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的函數。有了這些精細的文字轉換,外加去標籤的單獨記號,上面的例子就成為:[1]

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

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

[4]

與其它格式的對比

例如,書寫以下的二次方程求根公式:

 

若用LaTeX,則只需要一行代碼:

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

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

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

若用Apache OpenOffice MathLibreOffice 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,則需要:

<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 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>
 
使用帶有 STIX英語STIX Fonts project Beta字型的 火狐瀏覽器3.5版顯示MathML的圖片例子 (math-test.xhtml)

而行內MathML同樣被HTML5檔案支援。支援的瀏覽器有目前版本的WebKitSafari)和GeckoFirefox)。

例如: math-test.htm

<!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)有最完備的原生支援。[5][6]

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

Opera 9.5—12支援MathML CSS組態,[14][15]但不能使附加符號正確放置。[16]9.5之前需要用戶指令碼或樣式以模擬MathML支援。[17]Opera 14開始,Opera通過遷移到Chromium 25引擎移除了MathML支援。[18]

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

基於KHTMLKonqueror不提供對MathML的支援。[21]

編輯器

MathML還得到了主要辦公軟件的支援,如Apache OpenOfficeLibreOfficeMicrosoft Office,以及數學軟件的支援,如MathematicaMaple

Firemath英語Firemath火狐瀏覽器的附加元件,提供WYSIWYG的MathML編輯器。

手寫辨識

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

參考文獻

  1. ^ Calculadora Alicia. [2022-11-10]. (原始內容存檔於2023-12-29). 
  2. ^ Steven DeRose. The SGML FAQ Book: Understanding the Relationship of SGML and XML, Kluwer Academic Publishers, 1997. ISBN 978-0-7923-9943-8.
  3. ^ Canonical S-expressions#cite note-0英語Canonical S-expressions#cite note-0
  4. ^ Calculadora Alicia. [2022-11-10]. (原始內容存檔於2023-12-29). 
  5. ^ Wang, Frédéric, Mozilla MathML Status, Mozilla, [2018-07-11], (原始內容存檔於2013-04-09) 
  6. ^ Sidje, Roger B., Authoring MathML for Mozilla, Mozilla, [2018-07-11], (原始內容存檔於2010-03-24) 
  7. ^ Bug 3251 – Implement MathML (master bug), WebKit, [2018-07-11], (原始內容存檔於2018-07-11)  . . . (However, "see also") https://trac.webkit.org/wiki/MathML%20Status頁面存檔備份,存於互聯網檔案館
  8. ^ Safari 5.1 and math, [2018-07-11], (原始內容存檔於2018-07-26) 
  9. ^ MathML Support Coming To Chrome, BrowserFame, [16 October 2012], (原始內容存檔於2012-10-14)  已忽略未知參數|archive- url= (幫助)
  10. ^ Stable Chrome 24 supports MathML and closes security holes, The H Online, [11 January 2013], (原始內容存檔於2017-04-21) 
  11. ^ Stable Channel Update, [7 April 2013], (原始內容存檔於2016-11-04) 
  12. ^ Google subtracts MathML from Chrome, and anger multiplies. CNET. [22 November 2014]. (原始內容存檔於2018-07-11). 
  13. ^ Frédéric Wang. Funding MathML Developments in Gecko and WebKit - Blog de Frédéric. maths-informatique-jeux.com. [22 November 2014]. (原始內容存檔於2014-12-14). 
  14. ^ McCathieNevile, Charles, Can Kestrels do Math? MathML support in Opera Kestrel, Opera, 27 September 2007 [2018-07-11], (原始內容存檔於2012-03-12) 
  15. ^ Olsen, Tommy A., Even more work, Opera, 16 November 2007, (原始內容存檔於18 November 2007) 
  16. ^ MathML – The Opera MathML blog. My.opera.com (1 November 2007). Retrieved on 9 May 2012.
  17. ^ UserJS for MathML 2.0. My.opera.com. Retrieved on 9 May 2012.
  18. ^ Opera 14 beta for Android is out, (原始內容存檔於2013-03-08) 
  19. ^ MathPlayer – version history, [2018-07-11], (原始內容存檔於2018-07-11) 
  20. ^ Microsoft cripples the display of math in IE10 & 11. dessci.com. [22 November 2014]. (原始內容存檔於2014年7月1日). 
  21. ^ Bug 30526 – MathML support for Konqi, [2018-07-11], (原始內容存檔於2018-06-10) 

外部連結

參見