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
版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/05/escape-problem-of-mathjax-under-hexo/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。
共有 0 条评论