让marked与MathJax和谐共存

让marked与MathJax和谐共存

By Z.H. Fu

切问录 www.fuzihao.org

先说明一下问题,marked是使用广泛的Markdown解析器,用于将Markdown语言翻译成HTML,而MathJax则用于页面公式渲染,其工作方式是在页面上识别LaTeX公式,然后将其转义。最近用Hexo在GitHub上搭建了自己的博客,由于内容需要,必须大量使用数学公式,于是决定使用MathJax进行渲染,因此需要在页面中嵌入MathJax,方法如下:
在header.html中加入:
lang: javascript
1
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

由于MathJax默认没有开启单个美元符号的inline模式,需要手动打开,代码如下:

lang: javascript
1
<script type="text/x-mathjax-config">MathJax.Hub.Config({ tex2jax: {inlineMath: [['$','$'], ['\\(','\\)']]}});</script><script type="text/javascript" src="path-to-mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

测试发现,对于大部分的公式都可以渲染成功,然而对于部分公式,由于markdown语法和latex语法有冲突,因此造成部分公式内容被marked先转义,导致公式渲染失败,经过权衡,决定放弃部分markdown功能,确保latex的正确。该冲突主要是由于对\_的转义造成的。找到marked脚本文件
C:\Users\maple\AppData\Roaming\npm\node_modules\hexo\node_modules\marked\lib\marked.js,先备份一下,然后修改

第444行:

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

修改为:

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

第832行

return '<em>' + text + '</em>';

修改为:

return '_' + text + '_';

测试样例:

$$
\begin{cases}\int_\Omega \nabla \mathbf{F}&=\int_\Gamma \mathbf{F}\cdot d\mathbf{S} \\
u&=g_0,\quad \Gamma_D \
\partial_n u&=g_1 ,\quad \Gamma_N
\end{cases} $$

经测试,我需要用到的所有公式都可以显示,且未发现markdown有明显变化。说明此种方法切实可行。

附:修改后的文件下载

marked.js
直接替换原来的marked.js即可。