问题出现的原因:蛋疼的转义
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 | npm uninstall Hexo-renderer-marked --save |
这种解决方案的一点小瑕疵是语法与Markdown有很小的差别,需要注意一下。
解决方案四:修改引擎
这个marked.js虽然烂,可是你说不定觉得它还是可以抢救一下的。。按照如下方法进行抢救也能一定程度上解决问题:
- 找到
marked.js
,路径为\nodes_modules/marked/lib/marked.js
; - 将marked.js中的如下第一行代码改为第二行以去掉
\
的转义:
1 | escape: /^\\([\\`*{}\[\]()#+\-.!_>])/, |
- 将marked.js中的如下第一行代码改为第二行以更改
<em>
符号:
1 | em: /^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/, |
参考资料
垃圾Hexo!!! |