Hexo -15- 解决 Hexo Mathjax 无法显示多行公式的问题

2,339 阅读3分钟

这是我参与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 %}

z=(x+y)2=x2+y2+2xy\begin{array}{l} z &= {(x + y)^2}\\ &= {x^2} + {y^2} + 2xy \end{array}

{% endraw %}

问题1

  • 此时运行 hexo ghexo 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 %}