调教Hexo[2]——Hexo与Mathjax的冲突及解决方案

问题出现的原因:蛋疼的转义

Markdwon本身的特殊符号与Latex中的符号会出现冲突:

符号 Markdown中意义 LaTeX中意义
_ 斜体 下标
\\ 转义为\ 换行
* 加粗 无变化

这些问题是存在于Markdown语法中的,然而辣鸡Hexo默认使用marked.js解析markdown,于是表示斜体的_会被处理为<em>标签,如x_i在开始被渲染的时候,处理为x<em>i</em>,这个时候Mathjax就无法将其渲染成下标了。 类似的问题还有很多,比如*\字符。 所以从根本上来讲,是辣鸡Hexo使用的Markdown引擎造成的。。垃圾Hexo。。

解决方案一:手动转义

手动转义的意思很明确,你不是把我的\\转成了\么?那好,我输\\\\还不行么?你总得给我转成\\了吧? 同理,在下标的地方写成\_,也同样能够避免这个问题。 听起来很棒耶,但手动转义的缺点其实是很明显的:无法移植。你辛辛苦苦改了很久的文章也许往其他平台上面一贴就面目全非了,因为大多数的Markdown解释引擎都没有这个毛病(垃圾Hexo)这你不就傻逼了么,所以手动转义需谨慎。。

解决方案二:保护公式

另一个听起来很棒的想法就是用代码环境来保护公式,并且在解析的时候,只要发现$...$字样就按照公式来解析。 听起来不错耶!既解决了转义的问题,又不会破坏兼容性。但是这种方法也会带来一个很严重的问题:如果你要插入的某段代码中也含有$...$的字样,就会出现错误。。 该方法详见 解决 MathJax 与 Markdown 的冲突

解决方案三:更换引擎

既然这个marked.js这么烂,我们干脆把它换掉好了,简单粗暴没有后患。替代marked.js的方案有很多,只以Hexo-renderer-pandoc为例:

  • 安装Pandoc,官网提供了deb安装包,按照官网教程就可以安装完成。
  • 卸载Hexo默认的markd,再安装新的:
1
2
npm uninstall Hexo-renderer-marked --save
npm install Hexo-renderer-pandoc --save

这种解决方案的一点小瑕疵是语法与Markdown有很小的差别,需要注意一下。

解决方案四:修改引擎

这个marked.js虽然烂,可是你说不定觉得它还是可以抢救一下的。。按照如下方法进行抢救也能一定程度上解决问题:

  • 找到marked.js,路径为\nodes_modules/marked/lib/marked.js
  • 将marked.js中的如下第一行代码改为第二行以去掉\的转义:
1
2
escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
escape: /^\\([`*{}\[\]()# +\-.!_>])/,
  • 将marked.js中的如下第一行代码改为第二行以更改<em>符号:
1
2
em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
em:/^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,

参考资料

垃圾Hexo!!!