
本文介绍如何通过浏览器控制台调用 mathjax 3 的内部 api,批量获取页面中所有数学公式的原始 latex 源码(而非 mathml 或渲染后的 dom),适用于调试、内容迁移或自动化提取场景。
本文介绍如何通过浏览器控制台调用 mathjax 3 的内部 api,批量获取页面中所有数学公式的原始 latex 源码(而非 mathml 或渲染后的 dom),适用于调试、内容迁移或自动化提取场景。
MathJax 3 在完成页面渲染后,会将每个数学表达式的原始输入(即用户书写的 LaTeX 命令)完整保留在内存中,作为 MathItem 对象的 math 属性。尽管这些源码不会出现在 HTML 源文件或最终渲染的 DOM 中,但可通过 MathJax 提供的文档级 API 安全访问。
核心方法是调用:
MathJax.startup.document.getMathItemsWithin(document.body)
该方法返回一个 MathItem[] 数组,每个元素均包含 .math 字符串属性——这正是你右键选择 “Show Math as TeX Command” 所看到的原始 LaTeX(包括原始括号、错误符号、特殊字符等,未经修正)。例如 \( €0.7 \) 或 \frac{a}{b} 都会原样返回。
✅ 正确用法示例(在浏览器控制台中直接运行):
// 确保 MathJax 已加载并完成初始化(通常需等待 MathJax.typeset() 或 pageReady 后)
const items = MathJax.startup.document.getMathItemsWithin(document.body);
items.forEach((item, i) => {
console.log(`[公式 ${i + 1}]:`, item.math);
});
⚠️ 注意事项:
-
执行时机至关重要:必须在 MathJax 完成类型设置(typesetting)之后运行。若过早执行,
getMathItemsWithin()可能返回空数组。可监听MathJax.startup.promise或使用await MathJax.typesetPromise()确保就绪; -
不依赖
window.MathJax全局对象:应直接使用MathJax(未加window.前缀),因 MathJax 3 默认以模块化方式挂载; -
避免访问
.data或.mml属性:它们分别对应内部 AST 和生成的 MathML,可能为null或含解析错误(如"Math input error"),与原始 TeX 无关; -
支持动态内容:若页面后续通过 JS 插入新公式,需再次调用
getMathItemsWithin()或结合MathJax.typeset()后刷新获取。
? 小技巧:如需导出全部 LaTeX 到剪贴板,可追加一行:
navigator.clipboard.writeText(items.map(i => i.math).join('\n\n'));
综上,item.math 是唯一可靠、语义明确的原始 TeX 源码入口。它绕过了渲染层,直抵 MathJax 的输入缓存,是逆向提取数学内容最轻量、最标准的方式。










