Hexo支持公式

常规方法

在 Hexo 中使用 Mathjax 最常规的方法就是主题的 after_footer.ejs 里加入 (该 Mathjax 代码根据 Math StackExchange 所用修改)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script type="text/x-mathjax-config">
MathJax.Hub.Config({"HTML-CSS": { preferredFont: "TeX", availableFonts: ["STIX","TeX"], linebreaks: { automatic:true }, EqnChunk: (MathJax.Hub.Browser.isMobile ? 10 : 50) },
tex2jax: { inlineMath: [ ["$", "$"], ["\\(","\\)"] ], processEscapes: true, ignoreClass: "tex2jax_ignore|dno",skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']},
TeX: { noUndefined: { attributes: { mathcolor: "red", mathbackground: "#FFEEEE", mathsize: "90%" } }, Macros: { href: "{}" } },
messageStyle: "none"
});
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Queue(function() {
var all = MathJax.Hub.getAllJax(), i;
for(i=0; i < all.length; i += 1) {
all[i].SourceElement().parentNode.className += ' has-jax';
}
});
</script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>

接下来的使用方法就和平常使用 Mathjax 一样了.

不过这个方法有个令人不爽的缺点, 众所周知加载 Mathjax 的数学公式时是很消耗资源和时间的. 即使在网页中并没有生成公式时, 也会加载最基本 MathJax.js, 而这个文件也有 58KB. 为解决这个问题可参考如下进阶版.

进阶版

我们可以考虑只有在用到公式的页面才加载 Mathjax, 因此需要加载一些控制.

首先将上面的代码写成一个 mathjax.ejs 文件放在 partial 目录下, 并且在 Hexo 的根目录的 _config.yml 里面加入 mathjax: true, 接下来在 after_footer.ejs 里加入

1
2
3
<% if (page.mathjax){ %>
<%- partial('mathjax') %>
<% } %>

在文章需要调用 Mathjax 时, 只需在 front-matter 前加上 mathjax: true 即可, 即

1
2
3
4
5
6
title: 测试Mathjax
date: 2014-2-14 23:25:23
tags: Mathmatics
categories: Mathjax
mathjax: true
---

缺点

Markdown 里使用 Mathjax 有一个很大的缺点, 比如下面这个问题.

1
2
3
4
博主你好,你这样用mathjax,在用markdown写博客时能正常书写带下标的公式吗?
比如下面一段话:
This is an example for $x_mu$ and $y_mu$.
两个`—`会被看成markdown中的斜体。

这个的解决办法可以使用转义符, 即如下输出即可

1
This is an example for $x\_mu$ and $y\_mu$.

解决方法

除了上述方法以外, 还有下面几种.

插件

安装插件 Hexo-math, 安装方法如下, 依次为

1
npm install hexo-math --save

Hexo文件夹中执行

1
hexo math install

_config.yml文件中添加:

1
2
plugins:
hexo-math

对于不含特殊符号的公式,可以直接使用 MathJax 的 inline math 表达式. 如果含有特殊符号,则需要人肉 escape,如 \ 之类的特殊符号在 LaTex 表达式中出现频率很高,这样就很麻烦,使用 tag 能够省不少事。

示例

行内公式

  1. 对于不含特殊符号的公式,可以直接使用MathJax的inline math表达式,比如:
    1
    一条直线$y=ax+b$使这几个点

效果为
$y=ax+b$

  1. 对于含有特殊符号的公式,比如\和_符号在Markdown转义过程会出现一些问题,通常可以在符号前面加\,变为 \\ 和_进行数学公式编辑。比如:
    1
    一系列点$(x\_i,y\_i)(i=1,2,...n,n\ge 3)$

效果为
一系列点$(x_i,y_i)(i = 1,2,\cdots, n, n\ge 3)$

行间公式

对于行间公式有帖子说可以采用Tag Block方式解决Markdown转义问题,不知为何总感觉使用Tag Block有点不方便。我亲自测试了一下行内公式方法依旧可用。比如:

参考

  1. hexo添加hexo-math插件以支持LaTeX公式
  2. hexo MathJax插件
  3. MathJax插件在Hexo中的应用
  4. 在Hexo中完美使用Mathjax输出数学公式