有时候我们需要在文档中写数学公式,常用的markdown编辑器大多都集成了Mathjax,可以用Latex格式书写数学公式。而基于Hexo的博客中很多主题也集成了对mathjax的支持。但是实际上默认情况下并不能直接编辑和显示数学公式。下面以我所使用的Hexo 6.0为例,详细记录数学公式不能显示的解决办法。

修改next主题配置文件

在next的主题配置文件themes\next\_config.yml中搜索mathjax,找到以下这段设置。

1
2
3
4
5
6
7
8
9
10
11
12
# Math Equations Render Support
math:
enable: true

# Default(true) will load mathjax/katex script on demand
# That is it only render those page who has 'mathjax: true' in Front Matter.
# If you set it to false, it will load mathjax/katex srcipt EVERY PAGE.
per_page: true

engine: mathjax
#engine: katex

设置enable为true,并确认engine为mathjax。

更换hexo的渲染引擎

按照网上的教程,hexo 默认的渲染引擎是 marked,但是 marked 不支持 mathjax。另外 marked 引擎会把一些特殊的 markdown 符号转换为相应的 html 标签,比如在 markdown 语法中,下划线_代表斜体,会被渲染引擎处理为<em>标签而出错。
因此需要更换渲染引擎,将 marked 卸载,然后安装 kramed。执行以下两条命令:

1
2
npm uninstall hexo-renderer-marked --save
npm install hexo-renderer-kramed --save

而我刚做到这一步就出错 >_< 报错信息第一行是一个warning:

npm WARN checkPermissions Missing write access to …

后面还有一串ERR。

一番查找后发现,可能是因为在安装时没有使用管理员权限,导致node_modules文件夹没有安装完全,再安装时无法覆盖写入。

解决办法很简单,删除node_modules文件夹,然后以管理员身份运行cmd,执行npm install即可。

解决语义冲突

更换引擎后行间公式可以正确渲染,但是行内公式还是会有问题。解决办法是,到hexo目录下,找到node_modules\kramed\lib\rules\inline.js,修改第11行的escape,取消对\,{,}的转义。

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

另外还有第20行em的修改

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

现在可以hexo clean, hexo g查看效果了!

文章头设置开关

最后,在每次写新的文章时,需要在Front-matter里设置是否启用mathjax.

1
2
3
4
5
6
---
title: 关于
date: 2018-07-25 09:25:03
categories:
mathjax: true
---

另外在这里提一下,每次new的文章头格式可以自己设置,比如如果希望默认mathjax是true,可以在hexo目录下的scaffolds\post.md中设置默认格式,在title:date:等后面添加 mathjax: true 即可。

Done~