[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码表示的一个数学公式
幸好,我们现在有了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>≡</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> <mrow> <mi>p</mi> <mo>-</mo> <mn>1</mn> </mrow> </msup> <mo>≡</mo> <mn>1</mn> <mo>(</mo> <mi>mod</mi> <mi>p</mi> <mo>)</mo> </math>
|
- 此式子中,主要注意
<msup> base supscript </msup>
的使用。
- 底数:
<mi>n</mi>
- 指数:
<mrow>...</mrow>
,mrow
把p-1这三个字符包裹起来当作一个字符来使用。
- 如果把
msup
里的mrow
去掉,就成了<msup> n p - 1 </msup>,
msup`里面就成了4个字符,会报错。
错误例子:
错误例子的源码:
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> <mi>p</mi> <mo>-</mo> <mn>1</mn> </msup> <mo>≡</mo> <mn>1</mn> <mo>(</mo> <mi>mod</mi> <mi>p</mi> <mo>)</mo> </math>
|
3. 海拔与气压的计算公式
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>×</mo> <mrow> <mo>[</mo> <mn>1</mn> <mo>−</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>
|
- 注意
<mrow>...</mrow>
对[]()
大小的影响.
|
使用mrow |
不使用mrow |
例1 |
|
|
例2 |
|
|
例子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>−</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"> <mo>[</mo> <mn>1</mn> <mo>−</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> </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"> <mo>(</mo> <mfrac> <mi>P</mi> <msub> <mi>P</mi> <mn>0</mn> </msub> </mfrac> <mo>)</mo> </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)