开发者社区> 问答> 正文

MathML 介绍:报错

MathML 是一个 W3C 推荐标准,旨在为标记数学表达式定义一个 XML 词汇表。版本 1 作为一个 W3C 推荐标准发布于 1998 年,就在 XML 规范发布后不久。MathML 已作为推荐标准发布的另外三个版本是:MathML 1.01、MathML 2.0 和 MathML 2.0(第二版),后者自 2003 年已经成为官方 MathML 推荐标准。最新版本,即 MathML 3.0,正在进入成为标准的最后阶段(有望于 2009 年 12 月进入候选推荐标准状态)。本文简要介绍 MathML,重点放在 MathML 3.0 中的新特性上。

MathML 是一个用于标记数学表达式的 XML 词汇表,它包含两个子语言:Presentation MathML 和 Content MathML。Presentation MathML 主要负责描述数学表达式的布局(因此可与 TeX 或更早的 SGML 标记语言相比较,SGML 用于描述诸如 ISO 12083 之类格式的数学表达式的布局)。Content MathML 主要负责标记表达式的某些含义或数学结构。MathML 的这一方面受到 OpenMath 语言(用于标记数学语义,参见 参 考资料 中的链接)的很大影响,在 MathML3 中,与 OpenMath 更为贴近。

一个简单的例子可以展示这两种风格的标记之间的区别。我们来看 sin θ 与它自己的乘积的简单表示。上标 2 被放在 sin 运算符上,而不像您所期望的那样放在表达式末尾:sin2 θ

清 单 1 展示了 Content MathML 如何编码数学结构。


清单 1. MathML 编码

				


θ

2

 

最外层是平方函数的应用(power,第二个参数是数字 2),power 的第一个参数是 sin 函数的应用。使用该标记,表达式的含义被突出,并且 MathML 呈现程序可能 “知道” 三角函数的排版实例的约定,默认将该表达式显示为适当的格式。或者,也可以使用外部样式机制(例如,到 Presentation MathML 的转换)。或者,取决于具体的环境,诸如 (sin θ)2 这样的默认呈现也可以被接受。

Presentation MathML 直接编码标识符 sin 上有上标 2 的布局方案,将它们当作一个复合运算符,应用于标识符 θ

清单 2. 使用 Presentation MathML 编码布局方案

				

sin2

θ

 

但要注意,Presentation MathML 仍然编码数学语义方面。清 单 2 中的重点是函数应用运算符 U+2061。这是一个不可见的运算符,但是它跟 U+2062(不可见的乘)之类其他不可见运算符的用途都是非常重要的,在相邻条目没有可见运算符时用于区分内容,比如说,区分函数应用 f(x) 和乘积 3(x)。这类运算符的适当使用不仅有助于机械地解析 Presentation MathML,还可改进文档的可读性。使用这类语义提示,可大大改进音频和其他非可见呈现。

Presentation MathML 和 Content MathML 不是两种单独的语言,可以将它们混合在一起。每个 Content MathML 表达式针对一个给定的 MathML 呈现程序,都有一个默认的表示,您可以自由地在 Presentation MathML 中使用 Content MathML 条目。只使用纯文本(通常是单个字符)作为 Content MathML 记号元素 ci清 单 1中的 θ)的内容是很常见的做法。实际上,可以使用任意的 Presentation MathML 表达式,可以是由多个标识符组合而成的。

在 2003 年发布 MathML 2 的第二版本之后,W3C Math 工作组故意决定推迟进一步的规范更改,以便为它的实现体验提供一段稳定的时间。但是,识别出了 MathML 应该加强的特定领域,导致了 MathML 3.0 草案规范的产生。MathML 3 的基本结构与 MathML 2 的相同,很多用户可能注意不到新特性,自动换行除外 —— 这是影响现有用户的主要新特性。但是,MathML 3 添加功能来支持觉得 MathML 2 功能太弱的团体。这包括支持从右往左阅读的语言(重点放在阿拉伯脚本上),以及显式支持基本数学布局(这既有助于教育工作者标记例子,也大大有助于产生可 访问的非可见公式)。

下一节将进一步讨论 MathML 3 的主要新特性。

MathML 3 中的新特性

MathML3 在 MathML2 的基础上引入了几个新特性。

链接

MathML 1 和 2 都没有任何内置机制来指定链接。相反,它们推荐使用 XLink 语法(参见 参 考资料 中的链接)。这在一定程度上反映了 MathML 的年头,因为所有最初的设计都早于最终版的 XML 标准。XLink 与 XML 语法一起是 XML 初始 "Grand Plan" 的一部分,XLink 用于指定链接,XSL 用于指定样式。但是,XLink 并没有作为一种核心技术而广泛流行,因而没有得到广泛的支持。MathML3 现在指定,基本上任何 MathML 元素都可以采用一个 href 属性,该属性利用一个 URI、以与 HTML a 元素中 href 属性完全相同的方式指定一个链接。

方向

MathML2 对于控制布局的方向没有显式的支持。一个较早的注解记录了一些扩展,用于呈现各种阿拉伯团体中使用的布局表单(参见 参 考资料 中的链接)。根据所使用的样式,您必须既能控制公式中所用标识符的书写方向,还要能单独控制公式本身的布局方向。这基本上就是添加 dir 属性(类似于 HTML 中的同名属性),以及遵循关于方向如何与 Presentation MathML 的布局规则交互的详细规则。额外的字体变量已经被提议到 Unicode 中,将以与 boldblackboard bold(双倍加粗)用于拉丁字母相似的方式,用作语义独特的符号的额外字母。诸如 italic 或 sans-serif 之类的字体变量并不真正应用于阿拉伯字母,所以数学字体变量 initialtailedloopedstretched 在 Arabic Note 中被提议,在 MathML3 中成为了标准。

换行

MathML2 基本上不支持数学等式的换行。虽然略微支持在内联数学表达式中指定允许的换行,但是要得到多行显示的数学表达式,惟一的方式是手动分开等式,并将各个部分 作为单独的行输入到表中。数学排版系统 TeX 具有一个类似的功能。但是,在传统的数学排版中,公式被分开到已知大小的页面,所以作者手动分开公式并不是十分困难。而 MathML 是针对 Web 环境设计的,在这样的环境下,表达式显示在未知的且可能动态更改大小的窗口中。这意味着,拥有一个自动换行的系统是多么地重要。MathML 3 指定一个换行模型并引入几个新属性,来控制换行的属性以及行对齐的方式。

包含图像

MathML 1 和 2 中的 glyph 元素旨在访问来自不对应于 Unicode 代码点的非标准字体的特殊符号。以这种方式在 Web 环境中使用该元素并非易事,因为需要确保字体是可用的。在 MathML3 中,现有用法遭到反对,用一个 src 属性扩展了 mglyph,使之成为一般的图像引用元素, 类似于 HTML 的 img 元素。

基本数学布局

也许 MathML3 中最重要的增加是一组用于布局基本数学公式的新功能,即用于长乘和长除的表格布局。对于这些计算,不同国家使用的表示法各不相同,但是基于带有水平线和垂 直线装饰的数字宽度、各种表单的删除以及因借位和进位而以较小字体插入的数字,它们基本上共享基本表格布局的共同特性。在 MathML2 中能够获得很多这样的效果,但是需要显式使用大量的表格和定位,使得标记难以使用,更为重要的是,很难产生任何合理的非可见呈现,因为计算的基本形式被表 格标记弄模糊了。清 单 3 展示了一个如何处理长除的例子。


清单 3. MathML2 中的长除

				
435.3
______
3)1306
12
__
10
9
__
16
15
__
1.0
9
_
1

 

清 单 4 展示了 MathML3 标记。


清单 4. 长除的 MathML 版本

				

3
435.3

1306



12



10
9



16
15

1.0


9

1



 

特别注意一下,数字是如何作为单个记号输入的,而不是显式地分裂为每个表格单元的单个数字。这种可访问性被大大改善,因为音频或盲人工程师可 以使用长除(mlongdiv 元素)信息并知道前三行可靠地引用除法的操作数和结果,其余行是中间结果布局的部分。

贴近 OpenMath

(MathML W3C 文档的)第 4 章 “定义 Content MathML” 已经完全重新编写。Content MathML 有很多空元素,比如说 清 单 1 中的示例 。这些元 素涵盖大学之前可能遇到的大多数数学表达式。但是,要在不使用预定义元素的情况下引用数学符号,您可以使用 元素:myfun。还可以使用 definitionURL 属性来指定函数定义的 URI;但是对于此类定义,没有预定义的格式,因为它们可以简单地就是自然语言。

OpenMath(参见 参 考资料)是一种较老的格式,起源于计算机代数系统。它定义数学对象的模型以及该模型的各种编码,现在最重要的一个模型是 XML 编码的。OpenMath 和 Content MathML 之间的主要区别是,OpenMath 没有类似于 Presentation MathML 的东西;它只负责编码数学结构。此外,与 Content MathML 不一样,对于常见数学运算符没有预定义的元素,因为核心 OpenMath 语言只定义基本结构。使用的任何符号都必须在外部进行定义。OpenMath 标准定义了一个 XML 文档格式,即 Content Dictionaries,用于定义此类符号,尽管符号的含义最终可用自然语言解释,或者引用书本。例如,sin 的定义可引用 OpenMath Web 站点(参见 参 考资料 中的链接)发布的超越函数的 Content Dictionary。

MathML3 向 csymbol 添加属性,以允许对 OpenMath Content Dictionaries 的显式引用,并通过添加一些额外的结构元素,进一步贴近 OpenMath。OpenMath 区别对待函数应用()和绑定表达式()。 MathML 传统上将元素 用于这两种用途,具体含义取决于环境。但是,绑定环境现在可使用一个新的 元素显式地标记。类似地,OpenMath 除了把数字当作基本数据类型外,把字符串也当作基本数据类型;MathML3 除了有 代表数字和 代表标识符(变量)之外,还添加了一个新的 元素代表字符串常量。

对 Content MathML 在 MathML 中的定义方式的主要更改是(尽管根本不真正改变已定义的 MathML 语言),Content MathML 中的所有传统空元素构造的含义现在都利用一组显式的重写规则被分配给一个叫做 Strict Content MathML 的表单。该表单只使用 csymbols,基本上只要更改元素名称就可以与 OpenMath 匹配,表达式结构保持不变。因此,我们可以将第一节中的 Content MathML 表达式重写为 清 单 5 中的表单。


清单 5. 重写的 Content MathML 表达式

				
power
sinθ
2

 

另一个更改是,Content MathML 的示例呈现在以前版本的 MathML 中都只显示为图像,而在该版本中,既显示为 Presentation MathML,也显示为图像。这有望帮助更多的系统通过在内部映射到现有 Presentation MathML 呈现支持而实现 Content MathML 呈现。

以下转换:

  • 从 General Content MathML 到 Strict Content MathML
  • 从 Content MathML 到 Presentation MathML
  • 从 Presentation MathML 到 TeX(用于排版示例图像)

都已在 XSLT 2 中实现,并将变得在 W3C Software 许可下免费可用。它们目前还不真正可用,尽管可从 OpenMath 源代码库(参见 参 考资料 中的链接)得到早期基本上未加文档说明的版本。我期望作为 Candidate Recommendation "Call for Implementations" 活动的一部分,用这些转换的更健壮的版本更新 W3C Math/XSL 领域,这有望在今年年底实现(参见 参 考资料)。

剪贴板和多媒体 (Mime) 类型

很多现有 MathML 系统允许使用操作系统剪贴板剪切和粘贴 MathML 表达式。不幸的是,在这一点上,不同的系统,处理方式可能大不相同。具体来说,区别在于,MathML 只是被作为文本标注在剪贴板上,还是被分配一个特定于 MathML 的剪贴板风格,如果是后者的话,又是由哪个系统标注的。MathML 3 首次详细指定了推荐的剪贴板行为,如果通过 Web 服务或其他一些系统(MIME 类型对于它们很重要)传递 XML 片段,它还类似地指定使用的 Media (MIME) 类型。一个早期版本的剪贴板规范已经实现在针对 Microsoft® Internet Explorer® 的 MathPlayer MathML 呈现程序中和 Microsoft Word 2007 中,这允许可靠地从 Internet Explorer 剪切 Math 片段并粘贴到 Word 中。MathML3 中的这一剪贴板规范有望被大多数 MathML 系统实现,使得将表达式从一个系统移动到另一个系统很容易。

MathML 在浏览器中的使用

从最初的设计阶段开始,MathML 的主要目标就是支持数学表达式作为文本而不是图像或含混的插件使用在 Web 页面中,以允许搜索、调整文本大小,等等。目前,相对于 XHTML 来说,一般人仍然更接受 HTML。XHTML 作为一个 XML 词汇表,是 HTML 的再形式化。初始意图是,XHTML 具有更严格的 XML 解析规则,作为 Web 的首选标记语言,将逐渐取代 HTML。但是,浏览器制造商和 Web 用户不太情愿切换,尤其是主流浏览器 Internet Explorer 仍然没有对 XHTML 的原生支持。

对于很多 (MathML2) Presentation MathML 构造,可以将 XHTML 和 MathML 混合在同一文档中。要获得对此类文档的跨浏览器支持,最简单的方式是遵循以下简单规则:

  1. 将文档作为格式良好的 XML 提供,其中 HTML 元素在 xhtml 名称空间中(http://www.w3.org/1999/xhtml),MathML 元素在 MathML 名称空间中(http://www.w3.org/1998/Math/MathML)。
  2. 使用 mime 类型:application/xhtml+xml。
  3. 确保在靠近文档顶部的位置声明 MathML 名称空间,最简单的做法是将名称空间声明 xmlns:m="http://www.w3.org/1998/Math/MathML" 放在 html 元素上。

Firefox(所有版本)将原生地呈现此类文档,尽管读者必须预先安装了适当的数学字体(参见 参 考资料 中的链接)。

如果读者已经安装了 Design Science(参见 参 考资料 中的链接)提供的免费 MathPlayer 组件,那么 Internet Explorer(版本 6.0 及以后版本)也会呈现此类文档。(注:这种用 MathPlayer 来让 Internet Explorer 呈现 application/xhtml+xml 文档的做法应该得到推广,因为即使文档中没有数学表达式,也很有用。)

Opera、Safari 以及其他没有显式 MathML 支持的浏览器仍然能够呈现此类文档,通过使用一个适当的 CSS 样式表即可做到。使用 CSS 来呈现 MathML 被分离到一个单独的规范:MathML for CSS(参见 参 考资料 中的链接)。

获得跨浏览器支持的一种较老且更为强大的技术是,跟 Math/XSL 领域中描述的那样使用一个客户端 XSLT 样式表,或者跟 NAG 文档中所用的那样(参见 参 考资料 中的链接)使用一个稍微更新的版本检测更现代的浏览器功能。XSLT 的使用越来越难以设置,尤其是随着浏览器的现代版本在 XSLT 的使用上放置的安全约束越来越多(参见 参 考资料 中的链接)。但是它确实具有优势,XSLT 可以检测使用的浏览器并适当地进行转换,而不是限制于最小功能的浏览器。

除了使用客户端 XSLT 之外,还有第三种选择,那就是在服务器检测用户代理,并根据用户代理的功能提供不同的内容。详细情况取决于所使用的服务器环境,本文不做介绍。

认识到 XHTML 不可能完全取代 HTML,最近已经开始着手标准化一个更新的 HTML 规范,即 HTML5(参见 参 考资料 中的链接)。HTML 5 的规范远远还未完成,但是当前草案指定,MathML 可直接用于 HTML 文档中,作为标准的 text/html mime 类型提供。所以,在不久的将来,有望在 Web 上直接放置 MathML,无需担心 mime 类型和服务器配置。

但是不必等待 HTML5 发布,也很容易处理使用 MathML 的文档,在 Firefox 和 Internet Explorer 中可以高清晰地呈现,在 Opera、Safari 以及其他具有合理 CSS 支持的浏览器中也很清楚。图 1 展示了呈现在 Firefox 浏览器中的文档。


图 1. 呈现在 Firefox 浏览器中的 MathML 文档
呈现在 Firefox 浏览器中的 MathML 文档的屏幕截图

图 2 展示了呈现在 Internet Explorer 中的同一文档。


图 2. 呈现在 Internet Explorer 中的 MathML 文档
呈现在 Internet Explorer 中的 MathML 文档的屏幕截图

MathML 在出版业的使用

MathML 正在成为一种用于标记数学表达式的标记语言。即使作者的原稿使用了其他格式(Word、TeX,等等),为了进一步的处理,通常也会转换成 MathML 格式。并不是所有这些过程都是公共的,但是通过查看 XSL-FO 系统中的 MathML 支持。例如 Design Science出版的 Scientific and Technical Publishing 中关于 MathML 的 antennahouse 或论文,可以得到一种风格的离线使用。

MathML 在办公软件中的使用

现代办公编辑软件,特别是 Open Office 和 Microsoft Office,似乎在标准化使用 XML 的 zip 容器作为默认的文件格式,而不是作为较老的纯二进制格式。MathML 在这里扮演一个明显的角色,即充当 zip 容器中原生的文件格式,或者作为不同系统之间的协作层。

当前,Microsoft Office 不在内部使用 MathML(它有自己的用于数学表达式的 XML 格式),但是它在剪贴板上使用 MathML,用于从其他地方粘贴表达式以及从 Word 中剪切表达式。(该特性必须通过功能区菜单上的一个复选框来启用,但是它是 Word 2007 的一个标准特性)。OpenOffice(以及其他使用 ODF 文档格式的系统)则在其原生的文件系统中内部使用 MathML,尽管 OpenOffice 当前不在剪贴板上提供 MathML。MathML3 中剪贴板行为的详细规范有望鼓励实现者实现 MathML,以可互操作的方式剪切和粘贴。

尽管剪贴板支持对于一次性编辑和演示很有用,但是对于您想要处理整个文档则不太有用。事实上,基于 OOXML 和 ODF 的系统都使用压缩的 XML 格式,这意味着可以直接与数据交互以及从这两个系统抽取可重用的 MathML 表达式。例如,请看我的一篇博客文章,介绍了从 Word 和 OpenOffice 获得 XHTML+MathML 文档。

内置在 Word 中的 MathML 支持只对较新的 Office 2007 版本可用,较老(以及当前)系统的很多用户则在 Word 中使用 MathType 公式编辑器(其中也内置了 MathML 支持)。

与 MathML 之间的转换

作为一个 XML 词汇表,MathML 非常适合于使用标准 XML 工具(尤其是 XSLT,这是 W3C 定义的常规 XML 转换语言)的转换。与 OpenMath 之间的转换、与 OOMML(Word 用于数学表达式的 XML 格式)之间的转换,以及到 TeX 的转换,都已经在本文中提到过了。一项主要领域的转换工作是建立从 MathML 到 TeX 的转换,TeX 是 Donald Knuth 开发的数学排版系统。这里需要区分两种系统,一种系统试图对付 TeX 文档中的极度可变性并将现有遗留文档转换成 XHTML+MathML,另一种系统提供类 TeX 语法,目的是为 MathML 提供一种方便的短表单设计语法。

第一种类型的典型系统是已故 Eitan Gurari 的 tex4ht 和 Bruce Miller 的 LateXML。

为 MathML 提供类 TeX 语法的系统包括 Jacques Distler 的 itex2MML、Peter Jipsen 的 ASCIIMathML 和 Douglas Woodall 的 LaTeXMathML 变体。

很多专家数学系统将具有到 MathML 的内置转换,例如 Computer Algebra 系统 Mathematica 和 Maple,都可以导入和导出 MathML,在 XML 表单与它们自己的内部数据结构之间进行转换。

结束语

现在应该对 MathML(包括 Presentation MathML 和 Content MathML)有了一个全面的了解。也应该了解 MathML 3.0 很快将为在 XML 中标记数学表达式带来的所有优势。

展开
收起
kun坤 2020-06-08 11:09:17 975 0
1 条回答
写回答
取消 提交回答
  • 薯哥,android下面有没有解析mathml的控件推荐。mathjax太过庞大了。######有没有Java的包,能够实现从 LaTeX convert Mathml 的?MathToWeb 好像不支持 DeclareMathOperator,希望万能的 @红薯 指点一二

    2020-06-08 14:28:01
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载