这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
Hexo比较好用的公式插件是Mathjax,但由于swig的文件解析机制,使得多行公式无法在Hexo中正常显示,本文介绍该问题的解决方法。
简介
相信很多做学术的科研狗应该都是听过LaTeX排版写出来的Paper是多么的好看,颜值高。其实LaTeX简单来说就是一种文字处理软件/计算机标记语言。本文作为入门教程,不去过多解释其家族TeX、LaTeX、CTeX等等之间的伦理关系。一方面,用过Word的人都知道,排版的时间有的时候比写一篇文章的时间还长。更有甚者会遇到一些无解的玄学问题;另一方面,对于很多顶级期刊、会议对于投稿论文格式明确要求是LaTeX,拒收Word格式
LaTeX,作为广义上的计算机标记语言(比如HTML),它继承了计算机语言的光荣传统,通过一些简单的代码表达出精确的含义,具有不二义性。其文章排版的结果可以完全按照你的想法来,不仅解决了玄学问题,渲染出来的文章优美;同时,其还可以通过简单的语法写出优雅高贵的数学公式,目前Markdown也已经支持LaTeX语法的公式
但Hexo 中默认的公式渲染工具并不完美,总会出现奇怪的问题
问题复现
- 准备输入一个矩阵:
{% raw %}
A = \left( {\begin{array}{*{20}{c}}
1&{}&{}&{}\\
{}&1&{}&{}\\
{}&{}&1&{}\\
{}&{}&{}&1
\end{array}} \right)
{% endraw %}
- 再输入一个多行公式
{% raw %}
{% endraw %}
问题1
- 此时运行
hexo g或hexo s有可能报错:
Unhandled rejection Nunjucks Error: [Line 11, Column 65] expected variable end
===== Context Dump =====
=== (line number probably different from source) ===
问题2
- 或者显示公式不正常,多行公式会挤成一行:
原因分析
问题1
- 由于hexo解码时关注{% raw %}{{,}},%% {% endraw %}等连续字符,会将这部分代码解读为其他带有特殊含义的内容
- 如果公式中恰巧出现了此类字符,会报出上述错误
问题2
- 由于hexo在公式中的
\\错会成了转义符,也就是说他只看见了一个反斜杠,不会执行换行命令,导致公式堆成一行
解决方案
切换编译器
- 不使用 mathjax,使用 Katex
这个问题是因为模板渲染引擎和 mathjax 部分字符冲突,可以选择使用Katex渲染公式。Katex是一个轻量级的快速的公式排版库。您不必太担心显示的问题,毕竟这是全世界人都在用的东西。
个人测试下来 Katex 并不好用,不建议使用该方案
临时方案
针对问题1
- 可以在连续的
{}%中间插入空格,分开就没事了
针对问题2
- 可以将
\\换成\\\\,可以实现公式的多行正确显示
终极方案
-
在官方文档中提到了可以为hexo提供标记,阻止其按照自己的规则解释我们的字符串,显示其原本的含义
-
标记为
{% raw %} ... {% endraw %}