You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Next.js/MDX个人主页KaTeX公式被code标签包裹渲染异常修复求助

解决Next.js + MDX中KaTeX公式被错误包裹在<code>标签的问题

核心原因

代码高亮插件(如remark-prism/rehype-highlight)与remark-math/rehype-katex的处理顺序或规则冲突,导致数学公式被误识别为代码块。

解决方案

1. 强制调整插件执行顺序

确保remark-math在所有代码高亮的remark插件之前执行,rehype-katex在所有代码高亮的rehype插件之前执行。这样数学公式会被优先识别并转换为专用节点,后续代码高亮插件不会再将其当作代码处理。

以Next.js的MDX配置为例(next.config.js):

const withMDX = require('@next/mdx')({
  extension: /\.mdx?$/,
  options: {
    // remark阶段:先处理数学公式,再处理代码高亮
    remarkPlugins: [
      require('remark-math'),
      require('remark-prism') // 或其他代码高亮remark插件
    ],
    // rehype阶段:先渲染KaTeX公式,再处理代码高亮
    rehypePlugins: [
      require('rehype-katex'),
      require('rehype-highlight') // 或其他代码高亮rehype插件
    ],
  },
});

module.exports = withMDX({
  pageExtensions: ['js', 'jsx', 'md', 'mdx'],
});

2. 自定义代码高亮插件,排除数学节点

如果调整顺序后问题仍存在,可以给代码高亮插件添加过滤规则,跳过已被识别为数学公式的节点。

remark-prism为例,自定义插件过滤数学节点:

const remarkMath = require('remark-math');
const remarkPrism = require('remark-prism');
const { visit } = require('unist-util-visit');

// 自定义Prism插件,跳过math类节点
const customPrismPlugin = () => {
  return (tree) => {
    visit(tree, 'element', (node) => {
      // 识别remark-math生成的数学节点(通常带有math类)
      if (node.properties.className?.includes('math')) {
        return visit.SKIP; // 跳过该节点,不进行代码高亮处理
      }
    });
    // 执行原Prism插件逻辑
    return remarkPrism()(tree);
  };
};

// 配置MDX插件时使用自定义版本
const withMDX = require('@next/mdx')({
  extension: /\.mdx?$/,
  options: {
    remarkPlugins: [remarkMath, customPrismPlugin],
    rehypePlugins: [require('rehype-katex')],
  },
});

3. 检查MDX内容格式

确保你的数学公式没有被意外包裹在代码块标记(```或)中,直接使用$$`包裹即可:

$$
\mathbb{E}[X] = \int x f(x) dx
$$

内容的提问来源于stack exchange,提问作者Daesung Kim

火山引擎 最新活动