MathML

[TOC]

本文需要读者掌握最基本的HTML和XML知识。Web网页中嵌入数学公式的方法有MathML、图片、特殊字体等等。

  • 图片对浏览器的兼容性最好
  • MathML需要浏览器的支持。除了Firefox自身支持外,其它浏览器(Chrome,IE,Edge,Sofiri)都需要安装插件。
  • 特殊字体需要对方系统安装这些字体。

一、MathML?

点击查看MathML

怎样在线显示和控制那些数学表达式:古老的和现代的?原先的HTML还能够胜任吗?

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

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

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

如使用ASCII码表示的一个数学公式
用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 Examplei)中涉及的一些基本的概念、标记和常用的表示法。

1. 一些MathML元素

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<mstyle>....</mstyle>           用于设置其包裹的最终表达式的样式。
<mrow>....</mrow> 把N(N>0)个表达式包裹起来当作一个表达式
<msup> base supscript </msup> 用于上标的表达式(base为底数,supscript为上指数)
<msub> base subscript </msub> 用于下标的表达式(base为底数,subscript为下标的数)
<msqrt> base script </msqrt> 用于开根号。
<mfrac> base script </mfrac> 分号(base为分母,script为分子)
<mi>....</mi> 用于包裹字符,斜体显示。
<mn>....</mn> 用于包裹数字或字符。
<mo>....</mo> 用于包裹各种运算符号(+,-,<mo></mo>,<mfrac></mfrac>,<,>,(,)等)
<mtable>....</mtable> 在矩阵中使用,类似table。
<mtr>....</mtr> 代表矩阵的行。
<mtd>....</mtd> 代表每行的每一个值。
<mfenced open="[" close="]">....</mfenced> 用于包裹矩阵即先定义外围的括号。
<merror>...</merror> 显示错误消息
<mtext>...</mtext> 文本
````

### 2. Fermat小定理

<math xmlns="http://www.w3.org/1998/Math/MathML"><msup><mi>n</mi><mrow><mi>p</mi><mo>-</mo><mn>1</mn></mrow></msup><mo>&equiv;</mo><mn>1</mn><mo>(</mo><mi>mod</mi><mi>p</mi><mo>)</mo></math>

```xml
<math xmlns="http://www.w3.org/1998/Math/MathML">
<msup>
<mi>n</mi> <!-- base -->
<mrow> <!-- supscript -->
<mi>p</mi> <!-- 第一个表达式 -->
<mo>-</mo> <!-- 第二个表达式 -->
<mn>1</mn> <!-- 第三个表达式 -->
</mrow>
</msup>
<mo>&equiv;</mo>
<mn>1</mn>
<mo>(</mo>
<mi>mod</mi>
<mi>p</mi>
<mo>)</mo>
</math>
  • 此式子中,主要注意<msup> base supscript </msup>的使用。
  • 底数:<mi>n</mi>
  • 指数:<mrow>...</mrow>mrowp-1这三个字符包裹起来当作一个字符来使用。
  • 如果把msup里的mrow去掉,就成了<msup> n p - 1 </msup>,msup`里面就成了4个字符,会报错。

错误例子:invalid-markup&equiv;1(modp)
错误例子的源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<math xmlns="http://www.w3.org/1998/Math/MathML">
<msup>
<mi>n</mi> <!-- base -->
<mi>p</mi> <!-- supscript -->
<mo>-</mo> <!-- unkown value -->
<mn>1</mn> <!-- unkown value -->
</msup>
<mo>&equiv;</mo>
<mn>1</mn>
<mo>(</mo>
<mi>mod</mi>
<mi>p</mi>
<mo>)</mo>
</math>

3. 海拔与气压的计算公式

H=44300&times;[1&#x2212;(PP0)15.255]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block">
<mi>H</mi>
<mo>=</mo>
<mn>44300</mn>
<mo>&times;<!-- x --></mo>
<mrow> <!-- mrow把下面的式子包裹成一个式子,这样[]的大小会随着中括号里面式子的大小进行变化 -->
<mo>[</mo>
<mn>1</mn>
<mo>&#x2212;<!-- − --></mo>
<msup>
<mrow> <!-- msup_base ,这个mrow也会让()的大小随着括号里面内容的大小进行变化 -->
<mo>(</mo>
<mfrac>
<mi>P</mi> <!-- 分子 -->
<msub> <!-- 分母 -->
<mi>P</mi>
<mn>0</mn>
</msub>
</mfrac>
<mo>)</mo>
</mrow>
<mfrac> <!-- msup_supscript -->
<mn>1</mn> <!-- 分子 -->
<mn>5.255</mn> <!-- 分母 -->
</mfrac>
</msup>
<mo>]</mo>
</mrow>
</math>
  • 注意<mrow>...</mrow>[]()大小的影响.
使用mrow 不使用mrow
例1 [1&#x2212;(PP0)15.255] [1&#x2212;(PP0)15.255]
例2 (PP0) (PP0)
例子1,使用mrow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mo>[</mo>
<mn>1</mn>
<mo>&#x2212;<!-- − --></mo>
<msup>
<mrow>
<mo>(</mo>
<mfrac>
<mi>P</mi>
<msub>
<mi>P</mi>
<mn>0</mn>
</msub>
</mfrac>
<mo>)</mo>
</mrow>
<mfrac>
<mn>1</mn>
<mn>5.255</mn>
</mfrac>
</msup>
<mo>]</mo>
</mrow>
</math>
例子1,不使用mrow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<math xmlns="http://www.w3.org/1998/Math/MathML">
<!-- mrow -->
<mo>[</mo>
<mn>1</mn>
<mo>&#x2212;<!-- − --></mo>
<msup>
<mrow>
<mo>(</mo>
<mfrac>
<mi>P</mi>
<msub>
<mi>P</mi>
<mn>0</mn>
</msub>
</mfrac>
<mo>)</mo>
</mrow>
<mfrac>
<mn>1</mn>
<mn>5.255</mn>
</mfrac>
</msup>
<mo>]</mo>
<!-- /mrow -->
</math>
例子2,使用mrow
1
2
3
4
5
6
7
8
9
10
11
12
13
<math xmlns="http://www.w3.org/1998/Math/MathML">
<mrow>
<mo>(</mo>
<mfrac>
<mi>P</mi>
<msub>
<mi>P</mi>
<mn>0</mn>
</msub>
</mfrac>
<mo>)</mo>
</mrow>
</math>
例子2,不使用mrow
1
2
3
4
5
6
7
8
9
10
11
12
13
<math xmlns="http://www.w3.org/1998/Math/MathML">
<!-- mrow -->
<mo>(</mo>
<mfrac>
<mi>P</mi>
<msub>
<mi>P</mi>
<mn>0</mn>
</msub>
</mfrac>
<mo>)</mo>
<!-- /mrow -->
</math>

三、工具与MathML

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

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