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中有*可以表示斜体,便可去掉

1
# vim node_modules/marked/lib/marked.js

第一步:找到下面的代码

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

改为

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

即可去掉\\的转义

第二步:找到em的符号

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

改为

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

即可去掉_的斜体含义

重启Hexo

1
# hexo server

Powered by AppBlog.CN     浙ICP备14037229号

Copyright © 2012 - 2020 APP开发技术博客 All Rights Reserved.

访客数 : | 访问量 :