MathML: 描述数学表达式

许多STM(Scientific, Technical, and Medical)用户都要在网页中准确地嵌套数学公式,以往,他们的做法是借助各色的公式编辑器生成目标公式,并设法将公式转换成JPG、GIF和PNG图像,最终将其显示在网页。这样做,灵活性、扩展性、可控性与互操作性都不是很好。幸好,我们现在有了MathML,它可以帮助我们在Web以及字处理器中显示、操作和共享数学表达式。

本文要求读者掌握最基本的HTML和XML知识。本文并没有排斥其它一些可以在Web网页中嵌入数学公式的方法,例如Java applet。

一、MathML?

无疑,数学的描述和分析能力从某方面可以说是源自于以记号表达思想的方式。很早的时候,埃及人、巴比伦人、希腊人和我们中国人就已经懂得了用绳结、刻痕、鱼骨等方法来计数。现在我们使用的数学标记大概也已经有一百到五百年的历史了,这些标记经过了Leibniz,Euler,Peano等许多先哲不断的改进才逐步形成今天的模样的。


图1 巴比伦人的石刻,他们已经掌握了位置计数法

有了之前的历史奠定基础,到了计算机时代,我们要求做到,象自然语言于人一样使计算机可以理解数学知识。经过多年艰苦的努力,终于出现了象Mathemetica和Matlab这样的软件,近似地做到了这一点,它们设法使机器理解数学公式,进而完成一些初等和高等数学运算。但现在同样的问题又出现在网络面前,怎样在线显示和控制那些数学表达式:古老的和现代的?原先的HTML还能够胜任吗?

实际上,普通的HTML里也已包含了一部分支持公式描述的标记。例如简单如同ax2+by2+c,它的HTML源码是:

<I>ax</I><SUP>2</SUP>+<I>by</I><SUP>2</SUP>+<I>c</I>

但是这些标记的功能实在是有限,连高等数学中的微分、积分都不能表示,仅依靠HTML肯定是无法达到我们的要求的。即便再加入Symbol、Windings 3或Euclid symbol这样字体以及ASCII码和Unicode码的支持,实现的功能也受限,勉强成功,也颇费周折。加之如果他人的机器上没有安装你所使用的字体,情况就会变得更糟。这还只是显示的问题,假如说在要操作或修改已显示的数学公式,则每次都要完成诸如位置纠准、符号选取等大量的编辑工作。无可避免,在Web页面上如何显示和控制数学公式就成为了一个扰人的问题。


图2 使用ASCII码表示的一个数学公式

幸好,我们现在有了MathML,它可以帮助我们在Web以及字处理器中显示、操作和共享数学表达式。

MathML于1997年首先由W3C提出WG内部版本,到了2001年2月给出了2.0正式版,也是目前最为成熟的版本。MathML使用XML来描述数学表达式的结构和内容。MathML的目标就是使Web可以服务、接收、处理数学公式,正如HTML处理文本的功能那样。

MathML 2.0扩展了MathML 1.0的符号和表达式集,改进了与其它一些W3C技术的集成。MathML 2.0支持Tex和MathML的互操作,MathML 2.0还能处理用ISO 12083格式编码的文档。MathML可以用作专用数学方程编辑器,它含有一个特殊数学符号的大字符名称集,而且将支持方程的朗读。数学方程可以用层叠样式表(CSS)来设计,可以通过XLink同任何数学表达式链接,MathML元素可以包含于带命名空间的XHTML文档。MathML 2.0还包含MathML DOM(MathML文档对象模型),可以识别MathML组件并能用任何脚本语言操作它。

二、实例解析MathML

在下面的部分中,我们准备结合具体的实例逐步地讲解MathML(MathML By Example)中涉及的一些基本的概念、标记和常用的表示法。

1. 简单的例子:Fermat小定理

1640年10月18日在致德·贝西(Frenicle de Bessy)的信中提及的Fermat定理是一个已被证明了的定理,现在称其为Fermat小定理或简称Fermat定理,数学定义如下:



之所以说它简单,是说它的表达形式,任何具备高中数学知识的人都能看懂。描述它的MathML代码就是(文件名LittleFermat.mml,后缀mml表示MathML文件):

<math xmlns="http://www.w3.org/1998/Math/MathML">
      <msup>
        <mi>n</mi>
    <mrow>
         <mi>p</mi>
      <mo>-</mo>
          <mn>1</mn>
    </mrow>
  </msup>
  <mspace width=".2em"/>
  <mo>≡</mo>
  <mspace width=".2em"/>
  <mn>1</mn>
  <mspace width=".2em"/>
  <mo>(</mo>
  <mi>mod</mi>
  <mspace width=".2em"/>
  <mi>p</mi>
  <mo>)</mo>
</math>

在MathML浏览器或已安装插件的IE中显示如下:


图3  Fermat小定理

我们可以看出,MathML把所要描述的表达式分解成由数字、字母、文本或其它符号组成的一棵树。树根标记<math>表示MathML文档的开始,</math>表示MathML文档结束。最小的MathML文档是空文档,由无内容的标记对<math></math>组成,它在支持MathML的浏览器中显示为空白页。

标记<msup>表示上标(superscript),它的语法格式是:

<msup> base script </msup>

在上面的例子中,base部分就是<mi>n</mi>。mi元素表示标签中的内容将作为标识符显示,也就是说,象'n'或'p'这样单个字符显示成斜体,象"mod"这样的字符串则按普通格式(竖式)显示。其中,mi中的'i'是英文identifier的首字母。

script部分是<msup>与</msup>之间其余的内容,即p-1。中间的元素mrow是MathML中最为常用的布局模式(可以参考Java布局管理类FlowLayout)。元素mrow中可以包含任意数目的元素,它们延着一条基线水平从左到右排列(MathML 2.0目前只支持这种排列方式,从右向左或双向排列可能会在未来版本中出现),mrow也可以嵌套使用。除了这个功能以外,mrow还经常用于把不同元素组合成为同一单元(子公式)使用,例如上面的p-1就是如此。

紧接着下面的'-'号由元素mo修饰。mo表示中间的内容将按运算符来显示,它是MathML中最为复杂的一种标记模式。例如,运算符不同,它周围留有的空余也跟着不同;中括号和大括号的尺寸会匹配它们包围的内容,自动更新。支持MathML的浏览器会包含一个"运算符字典",里面记录着每个运算符所遵循的缺省布局属性。在绘制过程中,如果没有显式指定布局属性,就根据这些属性渲染运算符。这些属性包括lspace、rspace、stretchy和movablelimits等。mo也用来描述一些通用意义上的运算符,如圆括号(如上例中的'('和')')、标点符号以及重音符等。

<mn>1</mn>一句中mn元素表明将要显示的内容是数字,数字在MathML里一般按照标准竖式显示。而空元素mspace则表示一段空白区域,其宽度由其属性width所设定," .2em"为其取值。em是字体相关的,常被用于修饰宽度值。单位标识符来源于CSS语法,但它们并不是对等的,原因在于CSS并不支持小数。常用的单位标识符还包括有:ex(字体相关,用于修饰高度值)、px(像素)、in(英寸)、cm(厘米)、mm(毫米)、%(百分比值),等等。

最后,还要讲一下≡,它属于MathML中的实体引用(entity reference)。实体引用是一种特殊格式的关键字,表示扩展字符。实体引用的格式是&entity_name;,即由'&'开始,';'结束。中间的entity_name也可能是数字,即扩展字符的Unicode码,还可能会是UTF-8编码。大多数MathML的实体名称与LaTeX比较相近,例如LaTeX中的\\alpha在MathML中的对应表示是α。

2. 深入一点儿:矩阵的积分定义

矩阵A的积分定义为:


图4  矩阵A的积分定义

由于代码较长,下面只显示最重要的一部分内容,完整的源代码可参阅文件MatrixIntegral.mml:

<!-- leave out -->
<mstyle fontsize='12pt' color='GREEN'>
<mrow>
<mtable>
        <mtr>
          <mtd>
            <mrow>
              <mo color='#ffff33'>∫</mo>
              <mrow>
                <msub>
                  <mrow>
                    <mi>α</mi>
                  </mrow>
                  <mrow>
                    <mn>11</mn>
                  </mrow>
                </msub>
              </mrow>
    <!-- leave out -->


元素mstyle是一种通用的布局模式(layout schemata),同样,上例中mrow也是常见的布局模式。两者之间的差别在于style处理属性的方式有所不同。mrow没有什么自己的属性,而mstyle却可以设置几乎所有的MathML属性。在这里,要想弄清楚mstyle的工作方式,我们首先要弄清楚MathML中属性继承的概念。

在MathML中,有三种方式设置属性:明确地在标签中设置;在运算符字典中查找;从环境中继承。每种元素都生存在属于自己的环境中,环境记录着属性的缺省值。子元素继承父元素的环境信息。如果查寻不到属性值,元素就会使用环境中缺省的属性值。在标签中明确设置的属性信息仅会影响直接相关的元素,而并不会影响元素的生存环境。那么要想让子元素也受到修改过程的影响,就要求助于mstyle。本例中"<mo color='#ffff33'>∫</mo>"一句,作用是把第一个积分显示成黄色,但其它积分仍为前面mstyle设置的绿色,这就是原因所在。mstyle元素的作用域从声明开始直到</mstyle>,会影响域中所有的元素。

除了mstyle和mrow这两种通用的布局模式以外,在MathML中类似的布局模式还有mfrac、msqrt、mroot、merror、mpadded、mphantom、mfenced和menclose,分别提供方式显示分数、平方根、根数、预处理器的语法错误信息、周围的空白区、内容不可见的空档、括号等包围的表达式以及符号内的表达式。

标记<msub>表示上标(subscript),它与上例中的msup元素也同属布局模式,与通用布局模式不同,它们属于专门用于处理标记的那一类模式。同类的布局模式还包括有:msubsup、munder、mover、munderover和mmultiscipts,分别表示:上下标对、顶部标记、底部标记、顶底标记对和支持多种标记(除了前面的标记外,还可支持前向标记、前上、前下、张量指标等标记)。

第三类布局模式处理表格,本例中元素mtable就属于这样一种布局模式。除了一些数学专用的属性外,MathML表格与HTML表格非常相似。其中mtable、mtr与mtd分别与HTML中的table、tr和td对应。这样一来,我们马上就能弄清楚这些标记的含义。常用的属性有rowalign和columnalign,确定行列表项如何对齐;rowlines、columnlines和frame,用于绘制分隔线;rowspacing、columnspacing、equalrows和equalcolumns确定行列间距。

布局模式中还有特殊的一员---maction,它把动态特性引入MathML,例如变换表达式中某部分的前景色或背景色、在状态栏中显示提示信息、显示弹出提示信息、切换表达式,等等。

3. 另一种风格:Fermat小定理的左半部

在矩阵的积分定义中,我们使用mtable元素把矩阵作为表格显示。实事上,MathML中有矩阵专用标记matrix,matrix与前面提到的所有标记都不同,它是内容导向的。

MathML 的标记语言按照编码风格可以划分为三类:呈现导向的(Presentation Encodings)、内容导向的(Content Encodings)和混合型的(Hybrid Encodings)。根据这样的分类,上面两个例子的编码规格都属于呈现型的,呈现元素描述符号的可视二维结构。MathML呈现型标记由大约30种元素组成,支持的属性超过50种。大部分呈现元素都属布局模式,也就是说可以包含其它呈现元素。内容元素用途不在显示上,而关注于数学表达式本身的语义,常常应用于象计算机代数、语音合成等领域。这样,在我们使用内容型标记时,控制表达式的显示相对来说会困难一些。内容型标记支持元素超过120种,约150种,支持的属性约有12个。混合编码介于呈现和内容两者之间,它混合使用两种编码方式。究竟使用何种编码方式,要根据应用环境而定。

下面是按照内容标记编码的Fermat小定理的左半部分:

<math>
  <apply>
    <power/>
    <ci>n</ci>
    <apply>
      <minus/>
      <ci>p</ci>
      <cn>1</cn>
    </apply>
  </apply>
</math>


内容标记使用前缀记法,无需括号,描述方式贴近自然语言,例如,5加8的英语表示是"add 5 and 8",或"subtract 9 from 15"。本例中元素apply的含义是把操作(取幂)应用在表达式上,它把操作符作为第一个子元素,其余部分则作为操作符的参数使用。元素apply属于第一类内容标记,它们功能相似,并且可以基于其它元素生成新的数学对象,有分组能力。apply大概也是内容元素中最为重要的一个吧。

空标记<power/>和<minus/>则分别表示操作取幂和做减法,内容型标记中的空元素用于表示操作符、数学关系以及命名函数等。

前面提到过的matrix和set、vector以及interval属于第三类,用于编码基本的数学对象和数据类型,它们一起称为容器(container)。而本例中元素ci与cn则属于token elements,分别表示标识符和数字,它们与呈现元素mi以及mn的用法相近。注意,内容元素中并无mo对应的co,这是由于函数和操作符都是由元素表示的原因。

受文章篇幅的限制,我们举出的例子远未能涉及所有的MathML标记,也未能涵盖所有重要的概念。但我想,这些例子对于初学者来说已经足够,更为复杂的功能设计读者可以登录W3C Math Home或参考MathML相关的国际会议,里面有许多工作草案、标准文档,也有许多很好的教程可供下载阅读。

三、工具与MathML

MathML 2.0规范中有着太多的标记、实体和属性,如果全部记住,记忆会承受很大的负荷。如果没有工具的支持,MathML的编辑和发布肯定会举步维艰,有如我们不使用Dreamweaver或FrontPage手工创建和编辑HTML页面一样。这样,自1.0版本发布之后,相继出现了许多支持MathML的工具。除了一些副产品和边缘工具外, MathML相关的工具大致可分下面几类:

●浏览器(Viewer、Renderer、Rendering Engine)
●编辑器(Editor、Typesetter、Authoring Tool)
●解析器(Parser、Validator)
●转换器(Translator、Transformer)

1. 浏览器支持

通用浏览器如IE、Netscape、Mozilla以及W3C的Amaya等当前的版本都不同程度地支持MathML。Mozilla 1.0版之后,在三个平台下都已经支持MathML。Netscape 7.0 PR1版除Mac平台不支持以外,其它两个平台都支持。而最新的消息声称7.1版的Netscape在三个平台下也均已内嵌支持MathML。1996年由W3C启动的Amaya是一个开源项目,编辑器和浏览器被集成在一起。作为一个框架,Amaya对诸如SVG、CSS等多种W3C标准支持的都不错,Amaya中MathML显示速度明显比其它几个浏览器要快,支持的属性也比较全面,而且还支持MathML文件内部结构的树型显示。由于微软对MathML的支持,未来的IE7及其后续版本肯定将逐步支持公式的显示,Design Science也已经宣称微软将会提供MathPlayer支持MSN用户,但目前IE 6.0以下的版本仍需安装第三方插件才能正常显示MathML。

Windows平台下常见的插件有Desgin Science的MathPlayer和IBM的Techexplorer(现已转交Integre Technical Publishing Co.维护)。表1列出了目前主流操作系统平台下浏览器对MathML的支持情况。



我们以Windows平台下MathPlayer为例解释如何使用插件。该软件要求IE版本在5.5以上,这个条件基本都可符合。具备这个基本条件之后,有两种显示公式的方式:HTML和XHTML。由于W3C介绍的方法是XHTML,我们这里也仅介绍XHTML中MathML的用法。XHTML文件要存成XML文件,在开始处要加入下面三句话:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>        // XML文件声明
<?xml-stylesheet type="text/xsl" href="mathml.xsl"?>                // XSL文件
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">     // 使用XHTML
    然后在文档中就可以:
    <math  xmlns="http://www.w3.org/1998/Math/MathML">
    ……
    </math>

除了mathml.xsl文件之外,转换文件还包括:ctop.xsl、pmathml.xsl和pmathmlcss.xsl,其中pmathmlcss.xsl并不是必须的。如果缺少了某个文件,mathml的解析将失效。HTML+MathML的手工设置要更多一些。


图5  在已安装MathPlayer插件的IE中显示XHTML文件和MML文件

2. 编辑器支持

MathML的编辑器已有很多,除了上面讲过到同为浏览器的Amaya以外,最著名的就属Design Science的WebEQ Editor了。下表就是这两个软件的各项功能对比(以Windows平台为主):



由上表可以看出,Amaya对MathML的支持要优于WebEQ,所以推荐使用Amaya。但如果编辑公式不很复杂,使用WebEQ也是一种不错的选择。许多常见的字符处理器如开源的 OpenOfficeMapleMathcad MathematicaPubliconMacKichan Software的软件Scientific Workplace现在都可以输出HTML+MathML或输出XML+MathML,其中Maple已支持MathML 2.0版,包括Presentation和Content两种形式。如果读者的机器上已经装有这些软件,可以直接使用它们编辑输出XML和HTML文件,否则的话,最好还是安装Amaya。Amaya功能最为健全,也不会有炮打蚊子之嫌。

3. 解析器和转换器

人们研究计算机和网络的数学应用已经有很多年份了,积累了丰富的资源,现在一个亟待解决的问题就是该如何处理遗留数据(Legacy data)。其中的一种解决办法就是将这些遗留数据转换成其它格式,这样不可避免就要求创建相应的匹配器、解析器和转换器。在我们讨论的领域内,已有许多工具可以将TeX、PDF、LaTeX转换为MathML格式,也有工具可以将MathML转换为图像、PDF、TeX或SVG等格式。实现转换器,软件必然会带有解析功能,这也是我们为什么把解析器和转换器放在一起进行讨论的原因。表3列举了当前常见的各类转换软件:



比较遗憾的一个事情是,对于大量图像格式的遗留数据,仍未能出现有效的转换工具将它们转换为MathML格式的文件,这应该算是一个Open problem了。作者准备采取元数据匹配以及图像处理等相关知识,首先完成图像格式到Content Encodings的转换工作。由于Presentation Style的属性比较多,所以相对麻烦一些,准备作为后续工作处理。

解析MathML文件时是把它当成一个结构良好的XML文件来处理的,W3C提供了两种方法:1、使用MathML DTD;2、使用MathML XML Schema。如果要完全讲清楚,还需要很长的篇幅,有兴趣的读者可以自行阅读MathML Language Specification。

一个小技巧:

由于70%的浏览器都已内置SVG插件,供应商目前对SVG的支持程度要远远大于对MathML的支持,例如SchemaSoft的MathML to SVG Converter就可以将MathML转换为SVG格式。如果我们不能确定客户机上是否安装了显示MathML的插件,可以将MathML转换SVG格式。

四、结束语

在网页上描述数学公式以及进行标准化整合,MathML确实为我们提供了不错的选择。目前基于XML技术,不同的学科领域都有了各自的ML语言,用于科学数据与标记的表示与建模、交流与整合、汇总与发布,等等。例如,由Peter Murray_Rust 开发的CML(Chemical Markup Language)语言包含了原子、分子、化学键、光谱等标记,可用于描述分子结构和序列、光谱结构、结晶、固体物理、化学数据库等,它所定义的MOL.DTD也可由分子科学领域的研究人员共享。生物遗传学家和基因学家可以使用生物基因序列标记语言(Bioinformatic Sequence Markup Language、BSML),交换和管理由基因映射和基因序列对象产品的大量信息。BSML的浏览器可让使用者搜索各种基因数据库,并可把最终片段显示成有意义的图谱,这些浏览器也可支持三维显示。BioML(Biopolymer Markup Language)也可以用于描述像蛋白质和核酸这样的生物大分子序列信息。对于天文学家来说,他们也可以使用天文学标记语言AML(Astronomical Markup Language)、天文数据集标记语言ADML(Astronomical Data Markup Language)和天文仪器标记语言AIML(Astronomical Instrument Markup Language)。

当然,仍有一些专业领域直到如今也还没有自己专属的ML语言用于交换标准元数据。然则一来这些领域的相关人员一直以来也在为此努力,二来已有领域的建设会给新增标记语言提供一个很好的基础作为参照,没有理由不使我们相信将会有更多的领域拥有自己的ML,那样,学术交流和沟通将会变得更加便捷和通畅。

参考资料

●下载文中所有的 示例文件

W3C Math Home,MathML的大本营,有着与MathML相关的各种信息。

●Wolfram Research的 MathML Central

●可以在 Design Science下载MathPlayerTM插件。

●IBM 的数学文档浏览器 TechExplorer

●ICESoft的轻量级Java浏览器 E-Lite

Amaya编辑器,一个由W3C主持的开源软件,可以支持HTML 4.01,XHTML 1.0, XHTML Basic,XHTML 1.1,HTTP 1.1,MathML 2.0,CSS 2以及SVG,可以显示XML并完成部分编辑功能,但目前还不支持Unicode。

●Design Science的可视化公式编辑器 WebEQTM。

EzMath,一种以自然语言方式编辑MathML的编辑器,不能存储成文件,仅支持拷贝。

●Steve Swanson的 mathmled,使用JavaScript和XUL的一个实验性质的编辑器。

Test Suite 2.0可以测试各种MathML语言的用法。

●Netscape和Mozilla的用户可以参阅 MathML in Mozilla

MTValidate,符合W3C标记验证服务的一个Movable Type的插件。

●微软MSDN的文章,“ Internet Explorer 6 and Standards”。

●EContent文章: Publishing Equations? Do the Math(ML),Robert Boeri。

OpenMath and MathML,用于描述数学的语义标记。

●由Wolfram Research举办的 MathML Conference 2002

MathML and Scientific e-Contents Workshop 2002,第一届欧洲研讨会,Trieste,Italy,2002-11。

Math on the Web Status Report(全套版)。

●《数学手册》,高等教育出版社,北京,1979。

●Pavi Sandhu编著的 The MathML Handbook

●Ian Hutchinson的 Comparative Review of World-Wide-Web Mathematics Renderers

●Ian Hutchinson的 Approaches to WWW Mathematics Documents

●The Math Forum的 Math Typesetting for the Internet

●Dave Raggett和Davy Batsalle的 Mathematics on the Web: The EzMath notation

●Bioinformatics and XML,http://www.biosino.org/bioinformatics/011212-2.htm

●在 developerWorks XML 专区中寻找更多 用于 XML 开发人员的参考资料

作者简介

车皓阳,中科院软件所博士研究生。关注于电信网管理、信任管理等领域,对Linux以及开源系统很感兴趣。您可以通过 grandiose11@msn.com与其联系,欢迎讨论相关问题

张治,上海交通大学图像处理与模式识别研究所博士研究生。关注于数据集成、模式匹配、复杂性理论等领域。您可以通过 uphenix@hotmail.com与其联系,欢迎讨论相关问题。

评论: 0 | 引用: 0 | 查看次数: 16815
发表评论
登录后再发表评论!