在博客写作过程中,经常需要往文章中插入数学公式,对于不熟悉LaTex语法的人来说,我们自然希望能使用MathType
编辑公式,然后往文章中插入LaTex
语法的公式即可。然而,如果使用Hexo
部署博客,Hexo
自带的默认渲染引擎hexo-renderer-marked无法渲染LaTex
公式。本文将告诉你:
- 如何用
MathJax
插件渲染数学公式; - 以及如何处理
Hexo
默认渲染引擎hexo-renderer-marked
与MathJax
之间的冲突的; - 如何将用
MathType
编辑好的公式复制粘贴到markdown中。
安装与配置
安装和配置hexo-math
- 首先,安装hexo-math插件,该插件使用
MathJax/KaTex
来渲染数学公式:
$ npm install hexo-math --save
- 安装完成后,配置hexo目录下的
_config.yml
,加入下面配置信息:
math:
engine: 'mathjax'
mathjax:
src: custom_mathjax_source
config:
# MathJax config
- 另外,打开文件
themes/next/_config.yml
,并搜索关键词math
,你将会看到:
mathjax:
enable: false
per_page: false
cdn: //cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML
改变enable
标签的值为true
,如下:
mathjax:
enable: true
per_page: false
cdn: //cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML
更改Hexo
渲染引擎
- 更改
Hexo
的渲染引擎。将Hexo
的默认渲染引擎是hexo-renderer-marked
替换为hexo-renderer-kramed。之所以这么做,是因为Hexo
默认渲染引擎会将$$
之间的下划线_
解析成HTML
中的<i>
。然而,在LaTex
公式中,经常用下划线_
表示下标,这就导致冲突。而hexo-renderer-kramed
在hexo-renderer-marked
基础上修改了这个Bug。在安装hexo-renderer-kramed
之前,需要卸载hexo-renderer-marked
,顺序执行以下两行命令完成卸载与安装:
$ npm uninstall hexo-renderer-marked --save
$ npm install hexo-renderer-kramed --save
解决语义冲突
- 解决语义冲突(参考的这个博客)。在markdown中,斜体用下划线
_
或星号*
表示,而在LaTex
中,下划线_
表示下标。为了解决这个冲突,需要修改两处。在博客根目录下,进入node_moduleskramedlibrulesinline.js
,修改第11行escape变量的值(这一步是在原基础上对,{,}
的转义(escape)
):
修改前:escape: /^([`*{}[]()#$+-.!_>])/,
修改后:escape: /^([`*[]()#$+-.!_>])/,
同时,把第20行的em
变量也做相应的修改:
修改前:em: /^b_((?:__|[sS])+?)_b|^*((?:**|[sS])+?)*(?!*)/,
修改后:em: /^*((?:**|[sS])+?)*(?!*)/,
在博客开头打开mathjax
开关
- 最后,在博客的Front-matter里,添加一行
mathjax: true
,如下:
---
title: xxxxxxxxxxxxxxx
date: 2020-02-22 15:44:53
tags: xxx
mathjax: true
---
测试
公式单行居中显示
完成上述步骤,我们可以试试效果。我们键入下面的LaTex
公式:
$$ evidence_{i}=sum_{j}W_{ij}x_{j}+b_{i} $$
LaTex
公式两端的$$
表示公式居中显示
,效果如下:
公式嵌入到句子中
若想在一句话中嵌入公式
,则只需要在LaTex
公式两端用一个$
,如:
在公式$ evidence_{i}=sum_{j}W_{ij}x_{j}+b_{i} $
中,$W_i$
和$b_i$
分别为类别的权值和偏置。
效果如下:
在公式
与MathType结合使用
对于比较复杂的公式,如果不熟悉LaTex
语法,直接写起来很麻烦,所以我尝试先使用MathType
将公式写好,再复制公式,并以LaTex
格式粘贴到markdown中。按照MathType官方教程,对Preferences
下的Cut and Copy Preferences
进行设置。如下图:
我尝试了多种粘贴方式,包括Plain TeX
,LaTex2.09 and later
,MathJax:LaTex
,但运行hexo g
之后,总是出现这个错误:
INFO [hexo-math] Using engine 'mathjax'
INFO Start processing
FATAL Something's wrong. Maybe you can find the solution here: http://hexo.io/docs/troubleshooting.html
Template render error: (unknown path) [Line 52, Column 56]
expected variable end
后来我发现当有多个花括号,如}}
或{{
,在一起时,就会报Template render error
错误。最后在这篇博客中找到了解决办法。即,在公式的前后分别加上{% raw%}
和{% endraw %}
:
{% raw%} 数学公式 {% endraw %}
具体地,如下所示:
- 以
LaTex2.09 and later
或MathJax:LaTex
方式粘贴:
{% raw%} [{x_{1,2}} = frac{{ - b pm sqrt {{b^2} - 4ac} }}{{2a}}] {% endraw %}
效果为:
- 以Plain Tex方式粘贴:
{% raw%} $${x_{1,2}} = {{ - b pm sqrt {{b^2} - 4ac} } over {2a}}$$ {% endraw %}
效果为:
- 在句子中间粘贴:
公式在句子中显示:{% raw%} ${x_{1,2}} = {{ - b pm sqrt {{b^2} - 4ac} } over {2a}}$ {% endraw %}。
效果为:
公式在句子中显示:。
至此,我们可以结合MathType
在博客中写出各种数学公式啦!
参考链接
- hexo-math
- Hexo 下 LaTeX 无法显示的解决方案
- working with math equations in hexo next theme
- Using Hexo MathJax and Writing LaTex Equations
- hexo在遇到“{{”符号时出现解析报错
- Hexo的一个小BUG(Template render error)