WP Editor.md KaTeX 交叉大括号的坑
$\underbrace{\phantom{a, b, c, d, e, f, g}}$
}
a, b, c, \overbrace{d, e, f, g, h, i, j}
我们想要显示一个交叉大括号,需要在 LaTeX 中使用 \rlap, \phantom
与两个 Dollar 包裹的 LaTeX 公式文本来实现,如此以下的公式对应的源码如下:
1 2 3 4 5 |
rlap{ $\underbrace{\phantom{a, b, c, d, e, f, g}}$ } a, b, c, \overbrace{d, e, f, g, h, i, j} |
直接输入这段 LaTeX 代码,在编辑器中显示正常,在浏览模式下显示:

查看源代码即可发现问题,是因为 KaTeX 默认将数学公式内部的 Dollar 符号也当成数学公式渲染了:

这段代码应该被渲染成以下这样:
1 2 3 4 5 6 |
<div class="katex math multi-line no-emojify">\rlap{<br /> $\underbrace{\phantom{a, b, c, d, e, f, g}}$<br /> }<br /> a, b, c, \overbrace{d, e, f, g, h, i, j} </div> |
进入 Editor.md 插件源码 /src/App/KaTeX.php
中找到第33行开始的 katex_markup_single
函数,将其源代码替换以下代码即可。也就是当要转化行内 Dollar 包裹的公式时,先看看他是不是已经是一个被 katex div
标签包裹的公式,如果是的话,就不转化它。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
public function katex_markup_single( $content ) { //匹配行内$公式 $regexTeXInline = ' % \$ ((?: [^$]+ # Not a dollar | (?<=(?<!\\\\)\\\\)\$ # Dollar preceded by exactly one slash )+) (?<!\\\\) \$ # Dollar preceded by zero slashes %ix'; $content = preg_replace_callback( $regexTeXInline, array( $this, 'katex_src_replace' ), $content); $textarr = wp_html_split( $content ); // 初始化参数 $count = 0; $preg = true; $mathDiv = false; foreach ( $textarr as &$element ) { //判断是否在code里面 if ( $count > 0 ) { ++ $count; } // 判断是否是<pre>然后开始计数,此时为第一行 if ( htmlspecialchars_decode( $element ) == "<pre>" ) { $count = 1; } // 当读到第三行时,判断是code标签嘛,如果是,说明是代码,则后续不进行处理 if ( $count == 3 && strpos( htmlspecialchars_decode( $element ), "<code class=" ) === 0 ) { $preg = false; } // 如果发现是</pre>标签,则表示代码部分结束,继续处理 if ( htmlspecialchars_decode( $element ) == "</pre>" ) { $preg = true; } // 如果在代码中,则跳出本次循环 if ( ! $preg ) { continue; } // Math Div if (htmlspecialchars_decode( $element ) == "<div class=\"katex math multi-line no-emojify\">"){ $mathDiv = true; } if ( htmlspecialchars_decode( $element ) == "</div>" ) { $mathDiv = false; } if ($mathDiv) continue; // 跳出循环 if ( '' === $element || '<' === $element[0] ) { continue; } if ( false === stripos( $element, '$' ) ) { continue; } $element = preg_replace_callback( $regexTeXInline, array( $this, 'katex_src_inline' ), $element ); } return implode( '', $textarr ); } |

原文链接:WP Editor.md KaTeX 交叉大括号的坑
WNJXYKの博客 版权所有,转载请注明出处。
还没有任何评论,你来说两句吧!