Skip to content
团子云技术 Lite 1.048596
Go back

SteinsLab LaTeX 公式渲染故障排查报告

最近发现 steinslab.io 上的一篇文章(archives/3477)中 LaTeX 数学公式无法渲染,显示为原始文本。花了点时间从源码读到线上抓包,定位到问题并整理出正确的使用方式,记录如下。

问题

线上 https://steinslab.io/archives/3477 页面中 LaTeX 数学公式无法渲染,显示为原始文本。

环境概况

排查过程

1. 阅读 githuber-md 源码,梳理 KaTeX 渲染链路

保存链路Markdown.php:808-872):

编辑器中 Markdown 内容
    ↓ wp_insert_post_data
原始 Markdown → post_content_filtered
transform() 将 Markdown 转为 HTML → post_content
    ├── single_line_code_preserve(): 反引号内容 → <code>...</code>
    ├── ParsedownExtra::text(): Markdown → HTML
    ├── do_restore(): 还原被 hash 暂存的 <code> 内容
    └── katex_inline_markup(): <code>$$...$$</code> → <code class="katex-inline">
detect_code_languages(): 扫描 language-katex / katex-inline,写入 post meta
    └── _is_githuber_katex = true / false

显示链路KaTeX.php:53-57):

前端请求文章

is_module_should_be_loaded('_is_githuber_katex')
    ├── true  → wp_enqueue_script('katex') → 加载 katex.min.js + katex.min.css
    │         → wp_print_footer_scripts → 输出渲染脚本,查找 .language-katex / .katex-inline
    └── false → 什么都不加载

关键代码位置:

2. 线上页面抓取分析

总共抓取了 4 次页面,每次对应不同状态:

阶段文章语法独立插件页面状态
初始`$...$`(单美元)启用<code>$...$</code>,无渲染
改双美元`$$...$$`启用<code>$$...$$</code>,独立插件接管 CSS/JS,githuber-md 脚本消失
去反引号$$...$$(裸写)启用纯文本 $$...$$,独立插件 PHP 端未处理
关独立插件$$...$$(裸写)禁用纯文本 $$...$$,githuber-md JS/CSS 未加载

3. 正则验证

用 Python 复现 katex_inline_markup 的正则,确认能正确匹配 <code>$$ i $$</code>

Regex: <code>\$\$((?:[^$]+|(?<=(?<!\\)\\)\$)+)(?<!\\)\$\$<\/code>
Input: <code>$$ i $$</code>
Result: MATCH — captured group: " i "

正则本身没有问题。

4. 最终定位

两条故障链路同时存在:

链路 A(独立插件启用时):

链路 B(独立插件禁用后):

根本原因:githuber-md 的 Markdown→HTML 转换只在保存时执行。之前的多次语法修改因独立插件干扰或不兼容的语法格式,均未触发正确的转换 + meta 写入。

正确的使用方式

行内公式

位置 `$$ i $$` 只能聚合来自位置 `$$ \leq i $$` 的 token

反引号包裹 + 双美元符号

块级公式

```katex
\text{Attention}(Q, K, V) = \text{softmax}\!\left(\frac{QK^T}{\sqrt{d_k}}\right) V
```

为什么必须是双 $$

githuber-md 的 katex_inline_markup 正则只匹配 $$...$$,不匹配 $...$。这是上游设计决定。

为什么必须用反引号

反引号告诉 Markdown 解析器这是 inline code,githuber-md 将其包裹为 <code>...</code>katex_inline_markup 再基于 <code> 标签进行替换。裸写 $$...$$ 不会被处理。

为什么必须保存

githuber-md 的转换在 wp_insert_post_data 钩子(保存时)执行,不是 the_content(显示时)。每次修改公式后必须保存文章才能生效。

建议

  1. 保持单一 KaTeX 方案。只用 githuber-md 内置 KaTeX,不安装其他 KaTeX/MathJax 插件,避免冲突。

  2. 统一公式语法。所有文章统一使用 `$$...$$`(行内)和 ```katex(块级)。

  3. 若需升级 KaTeX 版本。githuber-md 内置的是 KaTeX 0.12.0(2020年),可将其 assets/vendor/katex/ 下的 katex.min.jskatex.min.css 替换为新版本文件。

  4. 若需支持单 $ 语法。可修改 src/Modules/KaTeX.php:169katex_inline_markup 正则,增加对 $...$ 的匹配。

  5. 排查其他文章的公式。其他使用公式的历史文章可能存在同样的渲染问题,可按本文正确语法重新保存修复。


Share this post on:

Previous Post
【转载】【美投晨报】全球金融环境正在收紧!AI教父不信AI?英特尔暴涨闹乌龙?半导体要被迫减仓!
Next Post
AI 互连四问:DSP 份额、ConnectX-8 时间线、以太网逆袭与 1.6T 演进