Hexo下Markdown与MathJax冲突问题

问题

用markdown写博客,mathjax解析数学公式,二者对于一些符号会发生冲突,到时公式无法正确解析:

  • _的转义,在markdown中,_是斜体,但是在latex中,是下标测意思,会出现冲突
  • \\的换行,在markdown中,\\会被转义为\,这样也会影响影响mathjax对公式中的\\进行渲染
  • *的转义,在markdown中,* 是加粗

原因

hexo默认使用marked.js去解析我们写的markdown,比如一些符号,_代表斜体,会被处理为<em>标签,
比如x_i在开始被渲染的时候,处理为x<em>i</em>,这个时候mathjax就无法渲染成下标了。
很多符号都有这个问题,比如粗体*,也是无法在mathjax渲染出来的,好在有替代的乘法等,包括\同理。

解决方法

  1. 更换Hexo的markdown渲染引擎

    hexo-renderer-kramed引擎是在默认的渲染引擎hexo-renderer-marked的基础上修改了一些bug,两者比较接近,也比较轻量级。

    npm uninstall hexo-renderer-marked --save
    npm install hexo-renderer-kramed --save
  2. 修改Hexo渲染源码

找到blog/node_modules\kramed\lib\rules\inline.js文件

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

    em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
    改为:
    em:/^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
  2. 重新启动hexo(先clean再generate),问题完美解决。哦,如果不幸还没解决的话,看看是不是还需要在使用的主题中配置mathjax开关。

参考

Hexo下mathjax的转义问题

使Marked.js与MathJax共存