如果 markdown 文本中包含数学公式,markdown-it 在渲染时会将数学公式中的换行转换为 <br>
,从而造成数学公式无法被 mathjax 或者 katex 正常渲染。
比如下面的 katex 公式
\[
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V
\]
会被渲染为下面的 html
<p>[<br>
\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V<br>
]</p>
请问如何让 markdown-it 忽略数学公式中的换行?
你可以配置 markdown-it
禁用对换行符的自动转换。markdown-it
默认会将段落中的换行符转换为 <br>
,但是对于数学公式中的换行符,我们希望不做任何处理,或者至少避免它们被转换为 <br>
。
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt({
breaks: false // 禁用换行符自动转换为 <br>
});
const result = md.render('$$ E = mc^2 $$');
console.log(result);
breaks: false
配置会让 markdown-it
不会将换行符自动转换为 <br>
。这对于数学公式特别有用,因为你希望保留公式中的原始格式。
如果你遇到公式中的换行符仍然被转换为 <br>
,你可以通过自定义插件来检查和处理数学公式中的换行符,确保它们不会被错误地处理。
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();
// 自定义插件来处理数学公式中的换行
md.core.ruler.before('normalize', 'fix-math-line-breaks', function(state) {
state.tokens.forEach(token => {
if (token.type === 'math_block' || token.type === 'math_inline') {
token.content = token.content.replace(/\n/g, ' '); // 替换换行符为空格
}
});
});
const result = md.render('$$ E = mc^2 $$');
console.log(result);
这个插件会在渲染过程中检查所有数学公式(无论是行内公式还是块级公式),并将公式中的换行符替换为空格,以防止 <br>
被插入。
markdown-it-katex
或 markdown-it-mathjax
插件如果你使用 KaTeX
或 MathJax
来渲染数学公式,它们的渲染引擎通常会自己处理数学公式的格式问题。但是,如果你遇到 markdown-it
自动转换换行符为 <br>
的问题,可以通过如下配置:
const MarkdownIt = require('markdown-it');
const md = new MarkdownIt();
const katex = require('markdown-it-katex'); // 或者使用 markdown-it-mathjax
md.use(katex);
const result = md.render('$$ E = mc^2 $$');
console.log(result);
这些插件会确保公式被正确解析,同时也能正确渲染数学公式,不会在公式内部添加 <br>
标签。