一些简单的数学公式,我们直接使用 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的不同效果: