一些简单的数学公式,我们直接使用 HTML 标签就可以写出来,比如下面这个公式1:
就可以利用 HTML 的<sup>
标签实现:
(x<sup>2</sup> + y<sup>2</sup> - 1)<sup>3</sup> - x<sup>2</sup>y<sup>3</sup> = 0
但是再复杂点的公式,HTML 就无能为力了,比如这个公式2:
像这种复杂的数学公式,我们可以使用 MathML 来描述。
数学标记语言(Mathematical Markup Language, MathML),是一种基于 XML 的标准,用来描述数学符号和公式。它的目标是把数学公式集成到万维网和其他文档中。从2015年开始,MathML 成为了 HTML5 的一部分和 ISO 标准。---- 维基百科
公式2用 MathML 描述就是这样的:
<math>
<mi> f </mi>
<mrow>
<mo> ( </mo>
<mi> t </mi>
<mo> ) </mo>
</mrow>
<mo> = </mo>
<munder>
<mrow>
<mi> lim </mi>
</mrow>
<mrow>
<mi> n </mi>
<mo> →
<!-- rightwards arrow -->
</mo>
<mi> ∞
<!-- infinity -->
</mi>
</mrow>
</munder>
<mfrac>
<mrow>
<mi> n </mi>
<mo> ! </mo>
<msup>
<mrow>
<mi> n
<!-- greek capital letter lambda -->
</mi>
</mrow>
<mrow>
<mi> t </mi>
</mrow>
</msup>
</mrow>
<mrow>
<mi> t </mi>
<mrow>
<mo> ( </mo>
<mi> t </mi>
<mo> + </mo>
<mn> 1 </mn>
<mo> ) </mo>
</mrow>
<mo> …
<!-- horizontal ellipsis -->
</mo>
<mrow>
<mo> ( </mo>
<mi> t </mi>
<mo> + </mo>
<mi> n </mi>
<mo> ) </mo>
</mrow>
</mrow>
</mfrac>
<mo> = </mo>
<mfrac>
<mrow>
<mn> 1 </mn>
</mrow>
<mrow>
<mi> t </mi>
</mrow>
</mfrac>
<munderover>
<mrow>
<mo> ∏
<!-- n-ary product -->
</mo>
</mrow>
<mrow>
<mi> n </mi>
<mo> = </mo>
<mn> 1 </mn>
</mrow>
<mrow>
<mi> ∞
<!-- infinity -->
</mi>
</mrow>
</munderover>
<mfrac>
<mrow>
<msup>
<mrow>
<mrow>
<mo> ( </mo>
<mn> 1 </mn>
<mo> + </mo>
<mfrac>
<mrow>
<mn> 1 </mn>
</mrow>
<mrow>
<mi> n </mi>
</mrow>
</mfrac>
<mo> ) </mo>
</mrow>
</mrow>
<mrow>
<mi> t </mi>
</mrow>
</msup>
</mrow>
<mrow>
<mn> 1 </mn>
<mo> + </mo>
<mfrac>
<mrow>
<mi> t </mi>
</mrow>
<mrow>
<mi> n </mi>
</mrow>
</mfrac>
</mrow>
</mfrac>
<mo> = </mo>
<mfrac>
<mrow>
<msup>
<mrow>
<mi> e </mi>
</mrow>
<mrow>
<mo> - </mo>
<mi> r </mi>
<mi> t </mi>
</mrow>
</msup>
</mrow>
<mrow>
<mi> t </mi>
</mrow>
</mfrac>
<munderover>
<mrow>
<mo> ∏
<!-- n-ary product -->
</mo>
</mrow>
<mrow>
<mi> n </mi>
<mo> = </mo>
<mn> 1 </mn>
</mrow>
<mrow>
<mi> ∞
<!-- infinity -->
</mi>
</mrow>
</munderover>
<msup>
<mrow>
<mrow>
<mo> ( </mo>
<mn> 1 </mn>
<mo> + </mo>
<mfrac>
<mrow>
<mi> t </mi>
</mrow>
<mrow>
<mi> n </mi>
</mrow>
</mfrac>
<mo> ) </mo>
</mrow>
</mrow>
<mrow>
<mo> - </mo>
<mn> 1 </mn>
</mrow>
</msup>
<msup>
<mrow>
<mi> e </mi>
</mrow>
<mrow>
<mfrac>
<mrow>
<mi> t </mi>
</mrow>
<mrow>
<mi> n </mi>
</mrow>
</mfrac>
</mrow>
</msup>
</math>
将上面的代码复制到本地的 HTML 文件中,使用 FireFox 或者 Safari 浏览器打开即可看到效果。你还可以针对每个标签设置不同的 CSS 样式。
MathML 代码生成
从上面这个示例就知道,MathML 非常复杂,光这一个公式就够写一天了。不过我们可以使用工具(点击访问)自动生成 MathML 代码。
MathML 元素
顶层元素 <math>
MathML 的顶级元素。类似于 HTML 中的<body>
。
<math>
...
</math>
字符/符号元素
-
<mi>
元素指示内容应该作为标识符呈现,比如函数名、变量或符号常量。还可以在其中使用任意文本来标记术语。<math> <mi> x </mi> <!-- x --> <mi> π </mi> <!-- π --> </math>
-
<mn>
元素表示一个数值文字,它通常是一串数字,并带有可能的分隔符(点或逗号)。但是,它也允许在其中包含任意文本,实际上是一个数字量,例如 "11"。<math> <mn> 1 </mn> <mn> 2e10 </mn> </math>
-
<mo>
元素表示运算,包括括号等“运算符”、逗号和分号等分隔符。<math> <mn> 5 </mn> <mo> + </mo> <mn> 5 </mn> </math>
-
<ms>
元素表示要由编程语言和计算机代数系统解释的字符串文字。 默认情况下,字符串文字显示为用双引号(")括起来;通过使用 lquote 和 rquote 属性,可以设置要显示的自定义字符。请注意,除非引号是字符串文字的一部分,否则不应该指定引号。<ms>
元素的内容本身不是 ASCII 字符串,而是一系列字符以及<mglyph>
和<malignmark>
元素。<math> <ms lquote="„" rquote="“"> abc </ms> <!-- „abc“ --> </math>
-
<mspace>
元素用来表示一段空白,空白的大小由它自身的属性(width,height,depth)决定。<math> <!-- depth: 基线下方的空白高度 --> <!-- height: 基线上方的空白高度 --> <mspace depth="40px" height="20px" /> <!-- width: 空白的宽度 --> <mspace width="100px" /> </math>
-
<mtext>
元素用于呈现没有符号意义的任意文本,比如注释或注释。要显示有符号意义的文本,可以使用<mi>
和<mo>
。<math> <mtext> Theorem of Pythagoras </mtext> <mtext> /* comment here */ </mtext> </math>
通用布局元素
<menclosed>
元素将其内容呈现在由 notation 属性指定的封闭符号中。支持 17 中不同的封闭符号,详细信息查看文档。<!-- 求阶乘 --> <math> <menclose notation="madruwb"> <msup><mi>a</mi><mn>2</mn></msup> <mo>+</mo> <msup><mi>b</mi><mn>2</mn></msup> </menclose> </math>
<merror>
元素用于将内容显示为错误消息。在 Firefox 中,此错误消息的呈现方式与典型的 XML 错误消息类似。注意,当 MathML 标记是错误的或不是格式良好的 XML 时,不会抛出此错误。仍然会得到一个 XML 解析错误(在 MathML 的 XHTML 表示法的情况下),它与<merror>
无关。<math> <merror> <mrow> <mtext>除以0:</mtext> <mfrac> <mn> 1 </mn> <mn> 0 </mn> </mfrac> </mrow> </merror> </math>
<mfrac>
元素用于显示分数。<math> <mfrac> <!-- a / b --> <mi> a </mi> <mi> b </mi> </mfrac> </math>
<mphantom>
元素以不可见的方式呈现,但是尺寸(例如高度、宽度和基线位置)仍然保持不变。类似于 CSS 中的visibility: hidden
。<math> <mrow> <mi> x </mi> <mo> + </mo> <mphantom> <!-- mphantom 标签内的元素不可见 --> <mi> y </mi> <mo> + </mo> </mphantom> <mi> z </mi> </mrow> </math>
<mroot>
元素用来表示一个有明确根指数的根式。它接受两个参数,语法如下:<mroot> base index </mroot>
。<math> <mroot> <mi>x</mi> <mn>3</mn> </mroot> </math>
<mrow>
元素用于对连续多行表达式的不同子表达式进行分组,一条子表达式通常算作一行,至少包含一或多个操作符与其运算对象(比如<mi>
和<mn>
)。<msqrt>
元素用于表示一个平方根(不显示根指数)。它只接受一个参数,语法如下:<msqrt> base </msqrt>
。<math> <msqrt> <mi>x</mi> </msqrt> </math>
<mstyle>
元素更改其子元素的样式。
<math>
<mstyle displaystyle="true" mathcolor="teal">
<mrow>
<munderover>
<mo stretchy="true" form="prefix">∑</mo>
<mrow>
<mi>i</mi>
<mo form="infix">=</mo>
<mn>1</mn>
</mrow>
<mi>n</mi>
</munderover>
<mstyle displaystyle="true">
<mfrac>
<mn>1</mn>
<mi>n</mi>
</mfrac>
</mstyle>
</mrow>
</mstyle>
</math>
边标和角标元素
<msub>
元素用来为表达式加下标,语法如下:<msub> base subscript </msub>
。<math> <msub> <mi>X</mi> <mn>1</mn> </msub> </math>
<msubsup>
元素用于为表达式同时附加上角标和下角标。它的语法如下:<msubsup> base subscript superscript </msubsup>
<math displaystyle="true"> <msubsup> <mo> ∫<!-- 积分符号 --> </mo> <mn> 0 </mn> <mn> 1 </mn> </msubsup> </math>
<msup>
元素用于为表达式加上标。<math> <msup> <mi>X</mi> <mn>2</mn> </msup>
表格数学
<mtable>
,<mtr>
,<mtd>
元素类似于 HTML 中的<table>
,<tr>
,<td>
。
<math>
<mtable>
<mtr>
<mtd><mi>A</mi></mtd>
<mtd><mi>B</mi></mtd>
<mtd><mi>C</mi></mtd>
</mtr>
</mtable>
</math>
数学符号
代数符号
符号 | HTML 字符实体 | Hex 码 | |
---|---|---|---|
+ | + | + | 加号 |
− | − | − | 减号 |
× | × | × | 乘号 |
÷ | ÷ | ÷ | 除号 |
≠ | ≠ | ≠ | 不等号 |
≈ | ≈ | ≈ | 约等于 |
< | < | < | 小于 |
≤ | ≤ | ≤ | 小于等于 |
> | > | > | 大于 |
≥ | ≥ | ≥ | 大于等于 |
± | ± | ± | 正负号 |
∝ | ∝ | ∝ | 正比于 |
∑ | ∑ | ∑ | 求和符 |
∏ | ∏ | ∏ | 求积运算或直积运算 |
⌊ | ⌊ | ⌊ | 向下取整左括号 |
⌋ | ⌋ | ⌋ | 向下取整右括号 |
⌈ | ⌈ | ⌈ | 向上取整左括号 |
⌉ | ⌉ | ⌉ | 向上取整右括号 |
微积分符号
符号 | HTML 字符实体 | Hex 码 | |
---|---|---|---|
′ | ′ | ′ | 单引号(一阶导数) |
″ | ″ | ″ | 双引号(二阶导数) |
‴ | ‴ | ‴ | 三引号(三阶导数) |
∂ | ∂ | ∂ | 偏导数 |
δ | δ | Δ | 变分 |
∇ | ∇ | ∇ | 梯度算子 |
∫ | ∫ | ∫ | 积分 |
∬ | ∬ | ∬ | 二重积分 |
∭ | ∭ | ∭ | 三重积分 |
⨌ | ⨌ | ⨌ | 四重积分 |
∮ | ∮ | ∮ | 曲线积分 |
∲ | ∲ | ∲ | 顺时针曲线积分 |
∳ | ∳ | ∳ | 逆时针曲线积分 |
∯ | ∯ | ∯ | 曲面积分 |
∰ | ∰ | ∰ | 体积积分 |
∞ | ∞ | ∞ | 无穷大 |
省略符号
符号 | HTML 字符实体 | Hex 码 | |
---|---|---|---|
… | … | … | 水平省略号 |
⋮ | ⋮ | ⋮ | 垂直省略号 |
⋯ | ⋯ | ⋯ | 中线水平省略号 |
⋰ | ⋰ | ⋰ | 对角省略号 |
⋱ | ⋱ | ⋱ | 对角省略号 |
函数符号
符号 | HTML 字符实体 | Hex 码 | |
---|---|---|---|
⋅ | ⋅ | ⋅ | 点积 |
⨯ | ⨯ | ⨯ | 叉积 |
‖ | ‖ | ‖ | |
⟨ | ⟨ | ⟨ | 左尖括号 |
⟩ | ⟩ | ⟩ | 右尖括号 |
∘ | ∘ | ∘ | 复合函数 |
→ | → | → | 函数映射 |
↦ | ↦ | ↦ | 具体的函数映射 |
ı | ı | ı | 没有点的字母 i |
ȷ | ȷ | ȷ | 没有点的字母 j |
几何符号
符号 | HTML 字符实体 | Hex 码 | |
---|---|---|---|
° | ° | ° | 度数 |
∠ | ∠ | ∠ | 角度 |
∡ | ∡ | ∡ | 测量角度 |
∟ | ∟ | ∟ | 直角 |
⦜ | ⦜ | ⦜ | 直角 |
⊿ | ⊿ | ⊿ | 直角三角形 |
○ | ○ | ○ | 圆 |
△ | △ | △ | 三角形 |
□ | □ | □ | 方形 |
▱ | ▱ | ▱ | 平行四边形 |
∥ | ∥ | ∥ | 平行 |
∦ | ∦ | ∦ | 不平行 |
⊥ | ⊥ | ⊥ | 垂直 |
≅ | ≅ | ≅ | 全等 |
→ | → | → | 射线 |
↔ | ↔ | ↔ | 直线 |
- | (n/a) | - | 线段 |
希腊字母
符号 | HTML 字符实体 | Hex 码 |
---|---|---|
α/Α | α /Α | α /Α |
β/Β | β /Β | β /Β |
γ/Γ | γ /Γ | γ /Γ |
δ/Δ | δ /Δ | δ /Δ |
ε/Ε | ε /Ε | ε /Ε |
ζ/Ζ | ζ /Ζ | ζ /Ζ |
η/Η | η /Η | η /Η |
θ/Θ | θ /Θ | θ /Θ |
ι/Ι | ι /Ι | ι /Ι |
κ/Κ | κ /Κ | κ /Κ |
λ/Λ | λ /Λ | λ /Λ |
μ/Μ | μ /Μ | μ /Μ |
ν/Ν | ν /Ν | ν /Ν |
ξ/Ξ | ξ /Ξ | ξ /Ξ |
ο/Ο | ο /Ο | ο /Ο |
π/Π | π /Π | π /Π |
ρ/Ρ | ρ /Ρ | ρ /Ρ |
σ/Σ | σ /Σ | σ /Σ |
τ/Τ | τ /Τ | τ /Τ |
υ/Υ | υ /Υ | υ /Υ |
φ/Φ | φ /Φ | φ /Φ |
χ/Χ | χ /Χ | χ /Χ |
ψ/Ψ | ψ /Ψ | ψ /Ψ |
ω/Ω | ω /Ω | ω /Ω |
不可见运算符
符号 | HTML 字符实体 | Hex 码 | |
---|---|---|---|
| ⁡ | ⁡ | 用于指定函数应用程序 |
| ⁢ | ⁢ | 用于指定不可见的乘法 |
| ⁣ | ⁣ | 用于指定不可见分隔符 |
| (n/a) | ⁤ | 用于指定不可见的加法 |
逻辑符号
符号 | HTML 字符实体 | Hex 码 | |
---|---|---|---|
¬ | ¬ | ¬ | 非 |
∧ | ∧ | ∧ | 与 |
∨ | ∨ | ∨ | 或 |
⊻ | ⊻ | ⊻ | 异或 |
∀ | ∀ | ∀ | 全称量词 |
∃ | ∃ | ∃ | 存在量词 |
⇒ | ⇒ | ⇒ | 实质蕴涵 |
⇔ | ⇔ | ⇔ | 实质等价 |
◻ | ◻ | ◻ | 必要 |
◊ | ◊ | ◊ | 可能 |
⊢ | ⊢ | ⊢ | 推论 |
⊩ | ⊩ | ⊨ | 包含 |
∵ | ∵ | ∵ | 因为 |
∴ | ∴ | ∴ | 所以 |
集合符号
符号 | HTML 字符实体 | Hex 码 | |
---|---|---|---|
∅ | ∅ | ∅ | 空集 |
∈ | ∈ | ∈ | 属于 |
∉ | ∉ | ∉ | 不属于 |
⊆ | ⊆ | ⊆ | 包含于 |
⊈ | ⊈ | ⊈ | 不包含于 |
⊂ | ⊂ | ⊂ | 真子集 |
⊄ | ⊄ | ⊄ | 非真子集 |
⊇ | ⊇ | ⊇ | 超集 |
⊉ | ⊉ | ⊉ | 非超集 |
⊃ | ⊃ | ⊃ | 真超集 |
⊅ | ⊅ | ⊅ | 非真超集 |
∩ | ∩ | ∩ | 交集 |
∪ | ∪ | ∪ | 并集 |
∖ | ∖ | ∖ | 补集 |
浏览器兼容性
兼容性解决方案
MathJax.js 是一个数学公式渲染工具,它会将 MathML 标签转换为 HTML 标签,并为其添加特定的 CSS 样式。
在网页头部加入一行代码即可:
<html>
<head>
...
<script src="http://fred-wang.github.io/mathjax.js/mpadded-min.js"></script>
...
</head>
...
</html>
mpadded-min.js 这个 JS 文件所做的就是在页面加载后先判断文档中是否使用了 MathML,如果有使用且当前浏览器不兼容,就将 MathJax.js 加载到页面中,并下载特定的字体文件。其渲染效果和 FireFox 这种原生支持 MathML 的浏览器相差无几,缺点是需要加载的文件较多(9 个文件,大约 400KB),速度较慢。
mathml.css 提供一个简易版的适配方案,同样是先判断如果使用了 MathML 且当前浏览器不兼容,那么将会加载一个简易的 CSS 样式表,对数学公式的布局做一个简单的模拟,其渲染效果并不好,但是胜在轻量。
<html>
<head>
...
<script src="http://fred-wang.github.io/mathml.css/mspace.js"></script>
...
</head>
...
</html>
公式2的不同效果: