Notice: 函数 WP_Scripts::localize 的调用方法不正确$l10n 参数必须是一个数组。若要将任意数据传递给脚本,请改用 wp_add_inline_script() 函数。 请查阅调试 WordPress来获取更多信息。 (这个消息是在 5.7.0 版本添加的。) in /data/www/appblog/wp-includes/functions.php on line 6131

Hexo下Mathjax的转义问题

问题

我们平时使用markdown写文档的时候,免不了会碰到数学公式,好在有强大的Mathjax,可以解析网页上的数学公式,与hexo的结合也很简单,可以手动加入js,或者直接使用hexo-math插件。大部分情况下都是可以的,但是Markdwon本身的特殊符号与Latex中的符号会出现冲突的时候:

的转义,在markdown中,_是斜体,但是在latex中,却有下标的意思,就会出现问题;
\\的换行,在markdown中,\\会被转义为\,这样也会影响影响mathjax对公式中的\\进行渲染。

原因

Hexo默认使用marked.js去解析markdown,比如一些符号,_代表斜体,会被处理为标签,比如x_i在开始被渲染时,处理为x<em>i</em>,此时Mathjax就无法渲染成下标了。很多符号都有这个问题,比如粗体*,也是无法在Mathjax渲染出来的,包括\\同理。所以说到底,是Hexo使用的markdown引擎的锅,因为很多其它引擎在这方面处理的很好。

解决方法

手动escape

这个方法最直接,添加转义即可。比如需要在公式中写下标符号,那就修改写法写为: x\_i;需要换行就使用\\\\
很明显,这种方式通用性很差,比如迁移到其它地方,就无法识别,因为大部分的markdown引擎是没有这个问题的。

修改Hexo渲染源码

相对来说,通用性较高的一种方式。思路就是修改Hexo的markdown渲染源码: node_modules/marked/lib/marked.js

(1)去掉\\的额外转义
(2)将em标签对应的符号中,去掉_,因为markdown中有*可以表示斜体,便可去掉

# vim node_modules/marked/lib/marked.js

第一步:找到下面的代码

escape: /^\\([\\`*{}\[\]()# +\-.!_>])/,

改为

escape: /^\\([`*{}\[\]()# +\-.!_>])/,

即可去掉\\的转义

第二步:找到em的符号

em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

改为

em:/^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

即可去掉_的斜体含义

重启Hexo

# hexo server
上一篇 MathJax基础之极限符号
下一篇 安装 Windows 10 报错无法打开所需文件install.wim的解决方法