mkdocs数学公式乱码解决方案

## 问题描述 在使用`mkdocs`编写博客的时候,可以使用`katex`等插件进行Latex公式渲染。但有时使用该插件时会出现渲染错误问题。如输入 ```markdown 这是一个矩阵 $$ \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} $$ ``` 会显示为 ![图片描述](/static/uploads/blog/image_20260301_153413.png) 可见换行全部失效。而当输入 ```markdown 这是一个多行的公式 $$ \begin{cases} \nabla \cdot \mathbf{E} &= \frac{\rho}{\varepsilon_0} \\ \nabla \cdot \mathbf{B} &= 0 \\ \nabla \times \mathbf{E} &= -\frac{\partial \mathbf{B}}{\partial t} \\ \nabla \times \mathbf{B} &= \mu_0 \mathbf{J} + \mu_0 \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t} \end{cases} $$ ``` 会显示为 ![图片描述](/static/uploads/blog/image_20260301_153717.png) 假如通过添加空行进行换行,即输入 ```markdown 这是一个多行的公式 $$ \begin{cases} \nabla \cdot \mathbf{E} &= \frac{\rho}{\varepsilon_0} \\ \nabla \cdot \mathbf{B} &= 0 \\ \nabla \times \mathbf{E} &= -\frac{\partial \mathbf{B}}{\partial t} \\ \nabla \times \mathbf{B} &= \mu_0 \mathbf{J} + \mu_0 \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t} \end{cases} $$ ``` 就会直接失效,渲染为 ![图片描述](/static/uploads/blog/image_20260301_153839.png) ## 解决方案 解决方案十分简单,只要在公式前后添加空行即可。例如 ```markdown 这是一个多行的公式 $$ \begin{cases} \nabla \cdot \mathbf{E} &= \frac{\rho}{\varepsilon_0} \\ \nabla \cdot \mathbf{B} &= 0 \\ \nabla \times \mathbf{E} &= -\frac{\partial \mathbf{B}}{\partial t} \\ \nabla \times \mathbf{B} &= \mu_0 \mathbf{J} + \mu_0 \varepsilon_0 \frac{\partial \mathbf{E}}{\partial t} \end{cases} $$ ``` 就能正常编译和渲染。 ![图片描述](/static/uploads/blog/image_20260301_154015.png) ## 原因分析 问题的关键在于:MkDocs 并不是直接把 Markdown 交给 KaTeX/MathJax,而是先用 Python-Markdown 把 Markdown 转成 HTML。Markdown 在语法层面是按块来组织内容的:一段文字是一个段落块,空行用来分隔不同的块。 显示公式在 MkDocs 常见配置里(比如 Material 推荐的 pymdownx.arithmatex)只有在它被识别成一个独立块时,才会被“保护”起来——也就是把这段 TeX 从 Markdown 的进一步解析中隔离出去,变成带特定标记的占位节点(例如带 `class` 的 `<span>`/`<div>` 或通用的占位结构)。等页面加载后,KaTeX 的 auto-render 或 MathJax 再去扫描这些占位节点,把其中的 TeX 排版成数学公式。 如果公式块前后没有空行,Markdown 往往会把它当作仍然属于上一段落的一部分,于是整段 TeX 会被塞进普通的 HTML 段落(例如 `<p>...</p>`)里。此时 HTML 会折叠源码里的换行,`\\` 所在的结构也可能不再以“显示数学块”的方式交给渲染器,最终看起来就是“换行全部失效/挤在一起”。 同样地,在公式内部插入空行也会触发另一层问题:在 Markdown 里,空行意味着一个新的块。`arithmatex` 这类插件为了避免一个公式被 Markdown 分裂成多个段落块,通常要求块公式内部不能出现空行。一旦插了空白行,Markdown 解析器很可能会把一个公式拆成多个块,于是这段 TeX 就不会被正确保护,最后要么直接原样输出成文本,要么被 Markdown/HTML 的规则破坏掉,渲染器也就无法识别为一段完整数学公式,因此表现为“直接失效”。

评论

留下评论

邮箱仅用于识别,不会公开

支持 KaTeX:$...$ 行内 · $$...$$ 独立公式
加载评论中...