XML興起後,HTML派生出了XHTML。雖然這只多了一個字母X,卻賦予了原來的HTML以無限的生命力。這生命力就來源於其無限的擴展能力(extensible)。舊有的HTML只有有限的標簽,而XHTML的標簽卻可以無限擴展,這要歸功於XML的命名空間(namespaces)的發明。在XHTML中,至少要加載XHTML命名空間,這樣我們就可以使用幾乎所有原來的Html標簽(當然有些已經被廢棄或者不贊成使用(deprecated))。在此基礎上,我們還可以加載其他命名空間,獲得擴展的功能,例如MathML可以使網頁能嵌入數學公式,這是一項非常實用的技術。MathML的官方文檔可以從W3C的MathML主頁找到。
XHtml嵌入MathML的方法
下面的例子說明XHtml 1.0和MathML推薦標准聯合使用的方法:
<html XMLns="http://www.w3.org/1999/xHtml" XML:lang="en" lang="en">
<head>
<title>A Math Example</title>
</head>
<body>
<p>The following is MathML markup:</p>
<math XMLns="http://www.w3.org/1998/Math/MathML">
<apply> <log/>
<logbase>
<cn> 3 </cn>
</logbase>
<ci> x </ci>
</apply>
</math>
</body>
</Html>
不過,上面這段代碼是不符合原來的XHTML的DTD實體定義的,因為多出了math等實體(或者說標簽)沒有在XHTML的DTD文檔中定義。W3C還正在努力解決該問題。目前一種解決辦法是使用“XHTML plus Math 1.1 DTD”作DTD定義,這是一種聯合使用XHtml 1.1和MathML 2.0的DTD定義。使用的時候文件頭的定義為:
<?XML version="1.0"?>
<!DOCTYPE html PUBLIC '-//W3C//DTD XHtml 1.1 plus MathML 2.0//EN'
'http://www.w3.org/TR/MathML2/dtd/xHtml-math11-f.dtd'
[<!ENTITY mathml 'http://www.w3.org/1998/Math/MathML'>]>
這樣就解決了DTD定義問題。
在浏覽器上顯示MathML
上面這種做法在把文件擴展名命名為xml(或者在服務器上輸出XML的文件頭)之後,已經測試能夠被Firefox 1.5正確解析,也能通過W3C標記語言驗證器驗證(當然文檔的其它部分要符合XHTML 1.1規范),但不能被IE 6(沒有安裝插件)正確解析。擴展名命名為Html時,則Firefox和IE均無能為力。但是擴展名為XML時,無法執行Javascript。
如果要IE能夠正確顯示MathML公式,可以加裝免費的MathPlayer插件。不過有另一種不需要加裝插件的方法,就是使用XSLT樣式表把MathML解析成普通的Html(需要IE 6版本)。具體的實現方法在:http://www.w3.org/Math/XSL/。
Firefox/Mozilla雖然有內建的MathML支持,但有時候會因缺字體而不能完全正確顯示MathML公式,這可以通過下載這些字體解決。這些字體的列表在:http://www.mozilla.org/projects/mathml/fonts/。為方便Windows用戶,MIT提供了這些字體的打包下載及使用指導。
兩種MathML表達式
MathML有兩種表達方式,一為表現式(Presentation MathML),一為內容式(Content MathML)。暫時發現表現式好像不太好用,例如沒有找到好使的絕對值符號(如果使用“|”,絕對值符號無法自動伸縮,當嵌套分式較多時絕對值符號就會變得太短)。暫時傾向於以使用內容式為主,表現式為輔。不過還需多學習才能真正比較出兩者的優劣。
學習資源
W3C的MathML官方主頁:http://www.w3.org/Math/
一個MathML入門教程:http://www.dessci.com/en/support/mathtype/tutorials/mathml/default.htm
一個MathML入門幻燈片:http://www.w3.org/Math/Documents/mathml-tutorial.pdf
MathML 2 語言參考:http://www.zvon.org/xxl/MathML/Output/
工具
MathCast:開源的所見即所得公式編輯器,能輸出MathML格式;官方主頁:http://mathcast.sourceforge.Net/
檢測浏覽器能否正確顯示xsl模式的MathML公式:
表現性MathML:http://www.w3.org/Math/XSL/pmathml2.XML
內容性MathML:http://www.w3.org/Math/XSL/csmall2.XML