MathML 数学标记

深入理解 MathML(数学标记语言):核心元素、浏览器支持、MathJax 对比,以及在 Web 中的实际应用。

MathML 数学标记

一、MathML 概述

1.1 什么是 MathML

MathML(Mathematical Markup Language,数学标记语言)是一种基于 XML 的标记语言,用于在 Web 页面中描述数学符号和公式。与 LaTeX 类似,MathML 可以精确表达数学结构,但它是 W3C 推荐的标准 Web 技术。

<!-- 二次方程公式 -->
<math>
  <mrow>
    <mi>x</mi>
    <mo>=</mo>
    <mfrac>
      <mrow>
        <mo>-</mo>
        <mi>b</mi>
        <mo>±</mo>
        <msqrt>
          <mrow>
            <msup>
              <mi>b</mi>
              <mn>2</mn>
            </msup>
            <mo>-</mo>
            <mn>4</mn>
            <mi>a</mi>
            <mi>c</mi>
          </mrow>
        </msqrt>
      </mrow>
      <mrow>
        <mn>2</mn>
        <mi>a</mi>
      </mrow>
    </mfrac>
  </mrow>
</math>

1.2 MathML 的价值

纯文本公式:x = (-b ± sqrt(b² - 4ac)) / 2a
MathML 公式:结构化、可访问、可语义化
  • 可访问性:屏幕阅读器可以正确朗读数学内容
  • 可复制:用户可以直接复制 MathML 公式为纯文本
  • 搜索引擎:搜索引擎可以理解公式的语义结构
  • CSS/JS 控制:可以通过样式和脚本操作公式

二、MathML 核心元素

2.1 基础元素一览

元素 作用 示例
<math> 根容器 <math>...</math>
<mrow> 分组(水平) 组合多个元素
<mi> 标识符(变量) <mi>x</mi>
<mn> 数字 <mn>3.14</mn>
<mo> 运算符 <mo>+</mo>
<mtext> 文本 <mtext>所以</mtext>
<mspace> 空白 调整间距

2.2 分数与根号

<!-- 分数 a/b -->
<mfrac>
  <mi>a</mi>
  <mi>b</mi>
</mfrac>

<!-- 平方根 sqrt(x) -->
<msqrt>
  <mi>x</mi>
</msqrt>

<!-- n 次方根 sqrt[n](x) -->
<mroot>
  <mi>x</mi>
  <mi>n</mi>
</mroot>

2.3 上下标

<!-- 下标 x_i -->
<msub>
  <mi>x</mi>
  <mi>i</mi>
</msub>

<!-- 上标 x^2 -->
<msup>
  <mi>x</mi>
  <mn>2</mn>
</msup>

<!-- 上下标 x_i^2 -->
<msubsup>
  <mi>x</mi>
  <mi>i</mi>
  <mn>2</mn>
</msubsup>

<!-- 组合:e^(-t) -->
<msup>
  <mi>e</mi>
  <mrow>
    <mo>-</mo>
    <mi>t</mi>
  </mrow>
</msup>

2.4 矩阵与表格

<!-- 2x2 矩阵 -->
<mtable>
  <mtr>
    <mtd><mn>1</mn></mtd>
    <mtd><mn>0</mn></mtd>
  </mtr>
  <mtr>
    <mtd><mn>0</mn></mtd>
    <mtd><mn>1</mn></mtd>
  </mtr>
</mtable>

三、浏览器支持

3.1 现代浏览器支持

好消息:MathML Core 已成为 Baseline 广泛可用技术,自 2023 年 1 月起得到主流浏览器良好支持。

// 检测 MathML 支持
if ('math' in document.createElement('math')) {
  console.log('MathML supported');
}

3.2 样式与布局

/* MathML 元素样式 */
math {
  font-size: 1.2em;
}

.math-highlighted {
  background-color: yellow;
}

3.3 降级处理

<!-- 使用 mathvariant 属性 -->
<mi mathvariant="bold">x</mi>

<!-- 对于不支持的环境,考虑 polyfill -->

四、MathML vs LaTeX vs 图片

4.1 技术对比

方案 优点 缺点
MathML Web 标准、可访问、可样式化 语法冗长、学习曲线
LaTeX 简洁、流行、表达力强 需要编译/转换
图片 兼容性好 不可缩放、不可访问
MathJax 良好渲染、支持 LaTeX 体积较大

4.2 何时使用 MathML

  • 需要良好可访问性的教育网站
  • 需要与 DOM/CSS/JS 交互的动态数学应用
  • 符合 W3C 标准的场景
  • 简单的数学公式(复杂公式 LaTeX 更合适)

五、实战应用

5.1 基础数学公式

<!-- 勾股定理 c² = a² + b² -->
<math>
  <mrow>
    <msup>
      <mi>c</mi>
      <mn>2</mn>
    </msup>
    <mo>=</mo>
    <msup>
      <mi>a</mi>
      <mn>2</mn>
    </msup>
    <mo>+</mo>
    <msup>
      <mi>b</mi>
      <mn>2</mn>
    </msup>
  </mrow>
</math>

<!-- 积分 ∫f(x)dx -->
<math>
  <mrow>
    <mo></mo>
    <mi>f</mi>
    <mo>(</mo>
    <mi>x</mi>
    <mo>)</mo>
    <mo></mo>
    <mi>x</mi>
  </mrow>
</math>

5.2 带样式的高级公式

<!-- 使用 mspace 调整间距 -->
<math>
  <mrow>
    <mi>A</mi>
    <mspace width="0.5em" />
    <mo>+</mo>
    <mspace width="0.5em" />
    <mi>B</mi>
  </mrow>
</math>

<!-- 使用 mpadded 调整内部间距 -->
<mpadded width="+1ex">
  <mi>x</mi>
</mpadded>

六、面试高频问题

Q: MathML 和 LaTeX 有什么区别?各适合什么场景?

回答要点:MathML 是 W3C Web 标准,结构化、可访问、可 DOM 操作;LaTeX 是排版系统,语法简洁但需要转换。MathML 适合需要可访问性和标准兼容的 Web 应用;LaTeX 适合学术论文和专业排版。

Q: 如何在不支持 MathML 的浏览器中显示公式?

回答要点:可以使用 MathJax 等 JavaScript 库将 LaTeX 或 MathML 渲染为 HTML/CSS 或 SVG。对于简单场景,也可以考虑将公式降级为图片或使用 Unicode 数学符号。


参考资料

延展阅读