内直接编辑
,多数富文本编辑器会过滤或破坏 MathML 结构
若需最大兼容性,优先考虑 application/xhtml+xml 响应头 + .xhtml 后缀,但这会令所有 HTML 错误变为解析失败如何让 math 标签在 text/html 中稳定渲染
目前最务实的做法是用 mathml.js 或 MathJax 的轻量模式接管渲染,而非依赖原生支持。MathJax v3 默认已支持 标签自动识别,只需配置 loader 启用 tex-mml-chtml 输出:
<script>
window.MathJax = {
loader: {load: ['[tex]/autoload-ams', '[mml]/mml3']},
tex: {packages: {'[+]': ['ams', 'autoload-ams']}},
options: {skipHtmlTags: ['script', 'noscript', 'style', 'textarea', 'pre']}
};
</script>
<script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>这样写在 text/html 中的 就会被自动转换为可缩放、可选中的 SVG 或 HTML/CSS 渲染结果。
- 不要手动调用
MathJax.typeset(),除非公式是动态插入的 DOM 片段 - 若仅需基础公式,
mathml.js(约 15KB)比完整 MathJax 更轻,但它只做 MathML → HTML/CSS 转换,不支持 LaTeX 输入 - 禁用
tex-mml-chtml 中的 TeX 部分可减小体积,但会失去 $...$ 语法回退能力
语义化关键:math 标签里的 role 和 aria 属性怎么加才有效
单纯用 不足以满足 WCAG 2.1 AA 级别要求。屏幕阅读器(如 NVDA + Firefox)需要明确的 role="math" 和 aria-label 或 aria-describedby 才能读出含义,尤其当公式含上下标、积分等结构时。
正确写法示例:
<math role="math" aria-label="二次方程求根公式:x 等于 a 分之负 b 加减根号下 b 平方减四 a c">
<mfrac>
<mrow>
<mo>−</mo><mi>b</mi><mo>±</mo><msqrt>
<msup><mi>b</mi><mn>2</mn></msup><mo>−</mo><mn>4</mn><mi>ac</mi>
</msqrt>
</mrow>
<mrow><mn>2</mn><mi>a</mi></mrow>
</mfrac>
</math>aria-label 必须是自然语言描述,不能是“a over b”这种简写,否则视障用户无法理解数学意图- 避免同时用
aria-label 和 aria-describedby,会造成重复播报 - 不要给
或 单独加 role,它们的语义已由 MathML 元素本身定义
为什么不用 LaTeX 替代 MathML 实现语义化
LaTeX 是排版语言,不是语义标记语言。$\frac{-b \pm \sqrt{b^2 - 4ac}}{2a}$ 对机器来说只是字符串,无法提取“分子”“分母”“平方根”等结构信息;而 、 等 MathML 元素自带明确语义,可被辅助技术、符号计算引擎或教育平台直接解析。
实际影响:
- 搜索引擎(如 Google Scholar)能索引 MathML 结构,但几乎不解析 LaTeX 字符串中的数学关系
- 教育类 CMS(如 Moodle、Canvas)导入导出时,MathML 可保留结构用于自适应题型生成,LaTeX 则只能当纯文本处理
- 用
document.querySelector('math mfrac') 可直接操作公式结构,LaTeX 渲染后只剩一堆 ,无法定位语义节点
真正难的不是写对 ,而是保持整条工具链(编辑器、CMS、转换器、辅助技术)对 MathML 的结构认知一致——这点至今没有银弹,得靠测试驱动补漏。
到这里,我们也就讲完了《在HTML中使用MathML的