Hexo公式渲染问题
Hexo公式渲染问题
参考解决方案:hexo next主题解决无法显示数学公式
问题
Markdown 编辑器通常都会集成 Mathjax,用来渲染文档中的类 Latex 格式书写的数学公式。
Hexo 默认使用 hexo-renderer-marked 引擎渲染网页,该引擎会把一些特殊的 markdown 符号转换为相应的 html 标签。比如在 markdown 语法中,下划线 _
代表斜体,会被渲染引擎处理为 <em>
标签。类似的语义冲突的符号还包括 *
, {
, }
, \\
等。
解决方案
更换 Hexo 的 markdown 渲染引擎,将 hexo-renderer-marked
替换成 hexo-renderer-kramed
。
1 | npm uninstall hexo-renderer-marked --save |
换引擎后行间公式可以正确渲染了,但行内公式的渲染还是有问题,因为 hexo-renderer-kramed 引擎也有语义冲突问题。
来到博客根目录下,找到 node_modules\kramed\lib\rules\inline.js
,对第11行的 escape 变量和第20行的 em 变量的值做相应的修改:
1 | //escape: /^\\([\\`*{}\[\]()#$+\-.!_>])/, |
[ escape: /^\\([\\`*{}\[\]()#$+\-.!_>])/
]:用于检测并捕获在特定字符前面的反斜杠,从而实现转义功能,使这些字符在后续处理中被视为普通字符。
/
和/
:表示中间的是正则表达式^
: 表示字符串的开始\\
: 由于反斜杠在正则表达式中是一个转义字符,所以用两个反斜杠来表示实际的一个反斜杠。([\\*{}\[\]()#$+\-.!_>])
: 这是一个捕获组,用来匹配一组特定的字符。这些字符是:\\
: 反斜杠*
: 星号{}
: 花括号[]
: 方括号()
: 圆括号#
: 井号$
: 美元符号+
: 加号-
: 减号.
: 点!
: 感叹号_
: 下划线>
: 大于号
[ escape: /^\\([`*\[\]()#$+\-.!_>])/
]:与上一个正则表达式类似,但是不包含反斜杠(\
)和花括号({}
)
1 | //em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/, |
[ em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/
]:用于匹配用下划线或星号包围的文本,以实现强调或加粗的效果。例如:
_italic_
会被匹配为斜体*bold*
会被匹配为加粗
其中匹配下划线部分 ^\b_((?:__|[\s\S])+?)_\b
:
^
: 表示字符串的开始\b
: 单词边界_
: 下划线字符((?:__|[\s\S])+?)
: 捕获组,匹配下划线之间的内容(?:__|[\s\S])
: 非捕获组,匹配两个下划线 (__
) 或者匹配任意字符,包括换行符 ([\s\S]
)。+?
: 非贪婪匹配,尽可能少地匹配前面的模式
_
: 下划线字符\b
: 单词边界。
匹配星号的部分 |^\*((?:\*\*|[\s\S])+?)\*(?!\*)
^
: 表示字符串的开始\*
: 星号字符((?:\*\*|[\s\S])+?)
: 捕获组,匹配星号之间的内容(?:\*\*|[\s\S])
: 非捕获组,匹配两个星号 (**
) 或者匹配任意字符,包括换行符 ([\s\S]
)+?
: 非贪婪匹配,尽可能少地匹配前面的模式
\*
: 星号字符(?!\*)
: 负向前瞻,确保星号后面不是另一个星号
[ em: /^\*((?:\*\*|[\s\S])+?)\*(?!\*)/
]:与上一个正则表达式类似,但只匹配星号包围的文本。
重新启动 hexo,查看公式是否能够正常渲染
1 | hexo clean |
如果问题仍未解决的话,检查主题配置文件中的 mathjax 是否打开,以 butterfly 主题为例。
来到博客根目录下,找到主题配置文件 themes\butterfly\_config.yml
。
将 mathjax
下的 enable
设置为 true
。
1 | # Math (數學) |
根据注释,如果将 mathjax
下的 per_page
设置为 true
,则对每个文章都进行渲染;如果将 per_page
设置为 false
,则需要在需要渲染的文章的 Front-matter 里打开 mathjax 开关,如下:
1 | --- |