Hexo下mathjax的转义问题

源自 个人博客

问题

咱们平时使用markdown写文档的时候,免不了会碰到数学公式,好在有强大的Mathjax,能够解析网页上的数学公式,与hexo的结合也很简单,能够手动加入js,或者直接使用hexo-math插件.大部分状况下都是能够的,可是Markdwon自己的特殊符号与Latex中的符号会出现冲突的时候:node

  • 的转义,在markdown中,_是斜体,可是在latex中,却有下标的意思,就会出现问题。
  • \\的换行,在markdown中,\\会被转义为\,这样也会影响影响mathjax对公式中的\\进行渲染

缘由

hexo默认使用marked.js去解析咱们写的markdown,好比一些符号,_表明斜体,会被处理为<em>标签,
好比x_i在开始被渲染的时候,处理为x<em>i</em>,这个时候mathjax就没法渲染成下标了。
不少符号都有这个问题,好比粗体*,也是没法在mathjax渲染出来的,好在有替代的乘法等,包括\\同理。
因此说到底,是hexo使用的markdown引擎的锅,由于不少其它引擎在这方面处理的很好。git

解决方法

在网上查了一写资料,总结为以下的方法github

手动escape

这个方法最直接,须要转义我就转义。好比我须要在公式中写下标符号,那就修改写法写为: $x\_i$;须要换行就使用\\\\,便可。
很明显,这种方式虽然能够解决问题通用性不好,好比想迁移到其它地方,就没法识别了,由于大部分的markdown引擎是没有这个问题的。npm

保护代码块

咱们知道在markdown中的两个`之间的东西不会转义,正好符号咱们的需求,咱们保护$$之间的代码不被markdown渲染,这样就能够,可是有一个后遗症,就是的样式问题, markdown中是code的样式的,这样也仍是有问题,解决思路就是从新处理code标签,使其碰见$$的话,跳过,详情见:解决 MathJax 与 Markdown 的冲突
这个方法有个问题,就是有时候咱们的代码中会有$$的出现,这时候,仍然使用mathjax就有可能出现没法预料的结果了。markdown

更换Hexo的markdown引擎

这个是我目前使用的方法,直接换发动机,就是把hexo默认的渲染markdown的引擎换掉。查到了有以下几个插件可使用:hexo

下面说一下如何使用pandoc渲染。.net

  1. 首先安装Pandoc,官网提供了Ubuntu的deb安装包,按照官网教程就能够安装完成。
  2. 就是卸载hexo默认的markd,再安装新的:插件

    npm uninstall hexo-renderer-marked --save
    npm install hexo-renderer-pandoc --save

若是决定要换的话,仍是更换为Pandoc吧,虽然比较笨重,须要首先安装Pandoc, 不过的确能够完美解决上述的不兼容问题,虽然它的语法与markdown有些微的差别,不过经常使用的几乎都同样。code

修改Hexo渲染源码

这种方法,相对来讲,通用性较高的一种方式。思路就是修改hexo的渲染源码: nodes_modules/lib/marked/lib/marked.js:blog

  • 去掉\\的额外转义
  • 将em标签对应的符号中,去掉_,由于markdown中有*能够表示斜体,就去掉了。

具体思路参考了使Marked.js与MathJax共存, 打开nodes_modules/marked/lib/marked.js:
第一步: 找到下面的代码:

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

改成:

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

这样就会去掉\\的转义了。
第二步: 找到em的符号:

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

改成:

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

去掉_的斜体含义,这样就解决了。为何说通用性很高,由于咱们没有修改文章的内容,能够放到别的引擎下也会顺利渲染,不过可能会遇到一些未知也须要转义的字符,每次都修改。建议使用最后两种方法。

相关文章
相关标签/搜索