首页 新闻 会员 周边 捐助

如何让 markdown-it 在渲染时忽略数学公式中的换行

0
悬赏园豆:30 [待解决问题]

如果 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 忽略数学公式中的换行?

dudu的主页 dudu | 高人七级 | 园豆:27660
提问于:2025-03-06 15:28
< > 人人可用的开源BI工具
分享
所有回答(1)
0

1. 禁用换行自动转换

你可以配置 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>。这对于数学公式特别有用,因为你希望保留公式中的原始格式。

2. 使用自定义插件处理数学公式中的换行

如果你遇到公式中的换行符仍然被转换为 <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> 被插入。

3. 使用 markdown-it-katexmarkdown-it-mathjax 插件

如果你使用 KaTeXMathJax 来渲染数学公式,它们的渲染引擎通常会自己处理数学公式的格式问题。但是,如果你遇到 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> 标签。

tegou | 园豆:204 (菜鸟二级) | 2025-03-10 09:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册
Top