有朋友咨询问 Hexo 是否支持 LaTeX 数学表达式,开始我以为是支持的,后来发现竟然默认是不支持,由于 hexo 默认支持 markdown 语法,该语法与 LaTeX 语法有一些冲突,大部分用户其实不大需要 LaTeX,所以一直没有默认支持。网络上一搜这个主题,发现有很多解决方案。我想不如趁热打铁,让自己的博客也支持一下,顺便把自己的经验分享给大家。
现状
我查看了一下自己 hexo 的配置,发现 hexo 默认使用的页面渲染器是hexo-renderer-marked,这个渲染器是无法解析 LaTeX 的表达式的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 { "name" : "hexo-site" , "version" : "0.0.0" , "private" : true , "scripts" : { "build" : "hexo generate" , "clean" : "hexo clean" , "deploy" : "hexo deploy" , "server" : "hexo server" } , "hexo" : { "version" : "4.2.1" } , "dependencies" : { "gitalk" : "^1.6.2" , "hexo" : "^4.2.1" , "hexo-deployer-git" : "^2.1.0" , "hexo-generator-archive" : "^1.0.0" , "hexo-generator-category" : "^1.0.0" , "hexo-generator-index" : "^1.0.0" , "hexo-generator-searchdb" : "^1.3.0" , "hexo-generator-sitemap" : "^2.0.0" , "hexo-generator-tag" : "^1.0.0" , "hexo-renderer-ejs" : "^1.0.0" , "hexo-renderer-marked" : "^2.0.0" , "hexo-renderer-stylus" : "^1.1.0" , "hexo-server" : "^1.0.0" , "hexo-word-counter" : "0.0.1" } }
在网络上搜了一圈,看了其他博客的相关文章,发现 Next 主题在 github 上有专门的文档给出 Next 主题支持 Math Equations 的方案 。
我的方案
在寻找方案的过程中,我找到一个新的插件 hexo-filter-mathjax,用于Hexo的服务器端MathJax Renderer插件。我感觉只需要以下组件,就可以实现对 LaTeX 的支持:
安装 hexo-renderer-pandoc
需要先卸载当前 Hexo 使用的渲染器,笔者当前的渲染器是 hexo-renderer-marked,因此需要先卸载,再安装 hexo-renderer-pandoc:
1 2 3 npm uninstall hexo-renderer-marked npm install hexo-renderer-pandoc --save
安装 hexo-filter-mathjax
1 2 npm install hexo-filter-mathjax --save
安装 pandoc
官方提供安装指南 ,按照提示安装即可。笔者使用 MacOS,尝试使用 brew 安装一直都不成功,最后直接去 github 下载 pandoc 安装包直接安装。
1 2 3 4 5 6 7 8 9 > ~ pandoc -v pandoc 2.10.1 Compiled with pandoc-types 1.21, texmath 0.12.0.2, skylighting 0.8.5 Default user data directory: /Users/liulonghao/.local/share/pandoc or /Users/liulonghao/.pandoc Copyright (C) 2006-2020 John MacFarlane Web: https://pandoc.org This is free software; see the source for copying conditions. There is no warranty, not even for merchantability or fitness for a particular purpose.
修改配置
修改 hexo 的配置文件 _config.yml,首先启用 mathjax:
1 2 3 math: mathjax: enable: true
添加 hexo-filter-mathjax 的配置:
1 2 3 4 5 6 7 8 9 mathjax: tags: none single_dollars: true cjk_width: 0.9 normal_width: 0.6 append_css: true every_page: false
在文档中使用
使用 hexo 新建一个页面:
1 hexo new Hexo+Next支持LaTeX
编辑 Hexo+Next支持LaTeX.md,设置参数 mathjax: true
1 2 3 4 5 6 7 8 9 10 11 --- title: Hexo+Next支持LaTeX date: 2020-08-08 15:59:08 mathjax: true tags: - hexo - next - LaTeX - mathjax - pandoc ---
在文档中输入 LaTeX 相关表达式
1 2 3 4 -$ \epsilon_0 $ +$\epsilon_ 0$-$ \frac{\partial}{\partial t} $ +$\frac{\partial}{\partial t}$
渲染页面
Sample
普通示例
1 2 3 4 $$-\epsilon_0 $$ $$+\epsilon_0 $$ $$-\frac{\partial}{\partial t}$$ $$+\frac{\partial}{\partial t}$$
− ϵ 0 -\epsilon_0
− ϵ 0
+ ϵ 0 +\epsilon_0
+ ϵ 0
− ∂ ∂ t -\frac{\partial}{\partial t}
− ∂ t ∂
+ ∂ ∂ t +\frac{\partial}{\partial t}
+ ∂ t ∂
1024 15 × ( 15000 + 15000 ) 5000 = 409.6 s \frac{1024}{15}\times\frac{(15000+15000)}{5000}=409.6s
15 1024 × 5000 ( 15000 + 15000 ) = 409.6 s
256 6700000 × 13846 0.0005 = 1058 s \frac{256}{6700000}\times\frac{13846}{0.0005}=1058s
6700000 256 × 0.0005 13846 = 1058 s
R I = P a g e s P e r M B o f D R A M P r i c e P e r M B o f D R A M × P r i c e P e r D i s k D r i v e A c c e s s e s P e r S e c o n d P e r D i s k RI=\frac{PagesPerMBofDRAM}{PricePerMBofDRAM}\times\frac{PricePerDiskDrive}{AccessesPerSecondPerDisk}
R I = P r i ce P er MB o f D R A M P a g es P er MB o f D R A M × A ccesses P er S eco n d P erD i s k P r i ce P erD i s k Dr i v e
1 2 3 $$ i\hbar\frac{\partial}{\partial t}\psi=-\frac{\hbar<sup>2}{2m}\nabla</sup>2\psi+V\psi $$
i ℏ ∂ ∂ t ψ = − ℏ < s u p > 2 2 m ∇ < / s u p > 2 ψ + V ψ i\hbar\frac{\partial}{\partial t}\psi=-\frac{\hbar<sup>2}{2m}\nabla</sup>2\psi+V\psi
i ℏ ∂ t ∂ ψ = − 2 m ℏ < s u p > 2 ∇ < / s u p > 2 ψ + V ψ
定界符(括号等)
各种括号用 (), [], {}, \langle\rangle 等命令表示;注意花括号通常用来输入命令和环境的参数,所以在数学公式中它们前面要加 \。因为 LaTeX 中 | 和 | 的应用过于随意,amsmath 宏包推荐用 \lvert\rvert 和 \lVert\rVert 取而代之。
1 2 3 4 5 6 7 8 9 $$ \Biggl(\biggl(\Bigl(\bigl((x)\bigr)\Bigr)\biggr)\Biggr) $$ $$ \Biggl[\biggl[\Bigl[\bigl[[x]\bigr]\Bigr]\biggr]\Biggr] $$ $$ \Biggl \{\biggl \{\Bigl \{\bigl \{\{x\}\bigr \}\Bigr \}\biggr \}\Biggr\} $$ $$ \Biggl\langle\biggl\langle\Bigl\langle\bigl\langle\langle x \rangle\bigr\rangle\Bigr\rangle\biggr\rangle\Biggr\rangle $$ $$ \Biggl\lvert\biggl\lvert\Bigl\lvert\bigl\lvert\lvert x \rvert\bigr\rvert\Bigr\rvert\biggr\rvert\Biggr\rvert $$ $$ \Biggl\lVert\biggl\lVert\Bigl\lVert\bigl\lVert\lVert x \rVert\bigr\rVert\Bigr\rVert\biggr\rVert\Biggr\rVert $$
( ( ( ( ( x ) ) ) ) ) \Biggl(\biggl(\Bigl(\bigl((x)\bigr)\Bigr)\biggr)\Biggr)
( ( ( ( ( x ) ) ) ) )
[ [ [ [ [ x ] ] ] ] ] \Biggl[\biggl[\Bigl[\bigl[[x]\bigr]\Bigr]\biggr]\Biggr]
[ [ [ [ [ x ] ] ] ] ]
{ { { { { x } } } } } \Biggl \{\biggl \{\Bigl \{\bigl \{\{x\}\bigr \}\Bigr \}\biggr \}\Biggr\}
{ { { { { x } } } } }
⟨ ⟨ ⟨ ⟨ ⟨ x ⟩ ⟩ ⟩ ⟩ ⟩ \Biggl\langle\biggl\langle\Bigl\langle\bigl\langle\langle x
\rangle\bigr\rangle\Bigr\rangle\biggr\rangle\Biggr\rangle ⟨ ⟨ ⟨ ⟨ ⟨ x ⟩ ⟩ ⟩ ⟩ ⟩
∣ ∣ ∣ ∣ ∣ x ∣ ∣ ∣ ∣ ∣ \Biggl\lvert\biggl\lvert\Bigl\lvert\bigl\lvert\lvert x
\rvert\bigr\rvert\Bigr\rvert\biggr\rvert\Biggr\rvert ∣ x ∣
∥ ∥ ∥ ∥ ∥ x ∥ ∥ ∥ ∥ ∥ \Biggl\lVert\biggl\lVert\Bigl\lVert\bigl\lVert\lVert x
\rVert\bigr\rVert\Bigr\rVert\biggr\rVert\Biggr\rVert ∥ x ∥
矩阵
amsmath 的 pmatrix, bmatrix, Bmatrix, vmatrix, Vmatrix 等环境可以在矩阵两边加上各种分隔符。
1 2 3 4 5 6 7 $$ \begin{pmatrix} a&b\\c&d \end{pmatrix} \quad \begin{bmatrix} a&b\\c&d \end{bmatrix} \quad \begin{Bmatrix} a&b\\c&d \end{Bmatrix} \quad \begin{vmatrix} a&b\\c&d \end{vmatrix} \quad \begin{Vmatrix} a&b\\c&d \end{Vmatrix} \quad $$
( a b c d ) [ a b c d ] { a b c d } ∣ a b c d ∣ ∥ a b c d ∥ \begin{pmatrix} a&b\\c&d \end{pmatrix} \quad
\begin{bmatrix} a&b\\c&d \end{bmatrix} \quad
\begin{Bmatrix} a&b\\c&d \end{Bmatrix} \quad
\begin{vmatrix} a&b\\c&d \end{vmatrix} \quad
\begin{Vmatrix} a&b\\c&d \end{Vmatrix} \quad
( a c b d ) [ a c b d ] { a c b d } a c b d a c b d
1 2 Lewlh has a little matrix: $$ ( \begin{smallmatrix} a&b\\c&d \end{smallmatrix} ) $$
Lewlh has a little matrix:
( a b c d ) ( \begin{smallmatrix} a&b\\c&d \end{smallmatrix} )
( a c b d )
对齐
需要对齐的公式,可以使用 aligned 次环境来实现,它必须包含在数学环境之内。
1 2 3 4 $$\begin{aligned} x ={}& a+b+c+{} \\ &d+e+f+g \end{aligned}$$
x = a + b + c + d + e + f + g \begin{aligned}
x ={}& a+b+c+{} \\
&d+e+f+g
\end{aligned} x = a + b + c + d + e + f + g
分段函数
分段函数可以用cases次环境来实现,它必须包含在数学环境之内。
1 2 3 4 $$ y= \begin{cases} -x,\quad x\leq 0 \\ x,\quad x>0 \end{cases} $$
y = { − x , x ≤ 0 x , x > 0 y= \begin{cases}
-x,\quad x\leq 0 \\
x,\quad x>0
\end{cases} y = { − x , x ≤ 0 x , x > 0