# Node.js中怎么提取MathJax長公式
## 引言
在科學文檔、學術論文或技術博客中,MathJax被廣泛用于渲染數學公式。當我們需要從HTML內容或Markdown文檔中提取MathJax公式(尤其是多行長公式)時,Node.js提供了多種高效的解決方案。本文將介紹三種實用方法:
## 方法一:正則表達式提取
### 基礎匹配模式
對于簡單的行內公式(`$...$`)和塊公式(`$$...$$`),可以使用正則表達式:
```javascript
const content = "Here is a formula: $E=mc^2$ and a block: $$\\int_a^b f(x)dx$$";
// 提取行內公式
const inlineFormulas = content.match(/\$(.*?)\$/g);
// 提取塊公式
const blockFormulas = content.match(/\$\$(.*?)\$\$/gs); // 注意`s`標志匹配換行
對于跨多行的長公式,需要添加s
標志(dotAll模式):
const longFormulaText = `$$
\begin{matrix}
a & b \\
c & d
\end{matrix}
$$`;
const regex = /\$\$([\s\S]*?)\$\$/g;
const matches = [...longFormulaText.matchAll(regex)];
當處理HTML文檔時,Cheerio(類似jQuery的庫)更可靠:
const cheerio = require('cheerio');
const html = `
<div>
<script type="math/tex">x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}</script>
</div>
`;
const $ = cheerio.load(html);
const formulas = $('script[type^="math/tex"]').map((i, el) => $(el).text()).get();
MathJax 3.x可能生成<mjx-container>
標簽:
$('mjx-container').each((i, el) => {
const formula = $(el).find('mjx-math').attr('aria-hidden');
console.log(formula);
});
官方提供的解析工具:
require('mathjax-node').init({
loader: { load: ['input/tex', 'output/svg'] }
}).then((mj) => {
mj.tex2svg('\\sum_{i=1}^\\infty \\frac{1}{i^2} = \\frac{\\pi^2}{6}', (result) => {
console.log(result.svgData);
});
});
const { convert } = require('mathjax-node-sre');
convert({
math: '\\int_0^1 x^2 dx',
format: 'TeX',
mml: true
}).then(data => console.log(data.mml));
對于超長公式(如矩陣方程組),建議分步驟處理:
\\
分割為多行const matrixFormula = `
$$
\begin{cases}
x + 2y = 5 \\
3x - y = 1
\end{cases}
$$`;
const cleaned = matrixFormula
.replace(/^\s*\$\$/, '')
.replace(/\$\$\s*$/, '')
.split('\\')
.map(line => line.trim());
readline
模塊const { Worker } = require('worker_threads');
new Worker('./formula-extractor.js', {
workerData: { content: largeText }
});
根據不同的使用場景選擇合適的方法: - 簡單提?。赫齽t表達式 - HTML處理:Cheerio - 精確解析:mathjax-node
完整的示例代碼可參考:GitHub示例倉庫 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。