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 | --- |




