发布于 

在 Hexo 中渲染 LaTeX 公式

一直用LaTeX写公式很久了,但发现在Hexo中渲染存在问题。推荐使用Mathjax插件解决。

方案一

这个方案可以解决LaTeX特殊字符(如*{}\\)和Markdown语法的冲突。
但是我在用的时候,发现它和表格之间存在冲突。就是在有序列表中使用表格时,不能正确渲染表格。

更改渲染引擎

hexo-renderer-marked更改为hexo-renderer-kramed

安装Mathjax插件

解决语义冲突

更改node_modules/kramed/lib/rules/inline.js的第11行,取消对\,{,}的转义

blog/node_modules/kramed/lib/rules/inline.js
1
2
//  escape: /^\\([\\`*{}\[\]()#$+\-.!_>])/,
escape: /^\\([`*\[\]()#$+\-.!_>])/

第20行的em变量也要做相应的修改

blog/node_modules/kramed/lib/rules/inline.js
1
2
//  em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
em: /^\*((?:\*\*|[\s\S])+?)\*(?!\*)/

开启Mathjax

在博客根目录的_config.yml添加如下配置:

blog/_config.yml
1
2
3
4
# MathJax Support
mathjax:
enable: true
per_page: true

在需要的文章的Front-matter区打开mathjax开关:

blog/source/_posts/xxx.md
1
2
3
---
mathjax: true
---

方案二

上面方案会造成有序列表中表格解析异常,后来我经过搜索,发现hexo-filter-mathjax这个插件可以解决。

但是,这个方案不能解决语义冲突的问题,所以这个时候要对LaTeX公式进行转义。

比如对于公式:

其正常的写法是:

正常写法
1
2
3
4
5
6
\left\{
\begin{array}{l}
v\gets v^\prime = \mu v-\eta \nabla C\\
w\gets w^\prime = w + v^\prime
\end{array}
\right.

使用hexo-filter-mathjax需要对\进行转义:

转义后的写法
1
2
3
4
5
6
\left\\{
\begin{array}{l}
v\gets v^\prime = \mu v-\eta \nabla C\\\\
w\gets w^\prime = w + v^\prime
\end{array}
\right.

推荐一个在线工具,输入LaTeX公式后可以进行转义。

安装MathJax插件

注意这个方案不需要更换渲染引擎。

开启MathJax

在博客根目录的_config.yml添加如下配置:

blog/_config.yml
1
2
3
4
5
6
7
mathjax:
tags: none # 或 'ams' 或 'all'
single_dollars: true # 启用单个美元符号作为内联(行内)数学公式定界符
cjk_width: 0.9 # 相对 CJK 字符宽度
normal_width: 0.6 # 相对正常(等宽)宽度
append_css: true # 将 CSS 添加到每个页面
every_page: false # 如果为 true,那么无论每篇文章的前题中的 `mathjax` 设置如何,每页都将由 mathjax 呈现

在需要的文章的Front-matter里打开mathjax开关:

blog/source/_posts/xxx.md
1
2
3
---
mathjax: true
---