Latex 公式

行内公式

行内的分式支持\(\frac12\)\(\frac{1}{\sqrt{1-x^2}}\)

行间公式

注意跨行大括号可能会渲染错误,建议避免序号。

\[ f(x) = x^2 \]

\[ g(x)=\left\{ \begin{aligned} & 1, x<1\\ & x, otherwise \end{aligned} \right. \]

\[ \begin{aligned} \frac{\partial \mathbf{u}}{\partial t} + (\mathbf{u}\cdot \nabla) \mathbf{u} &= -\nabla p + \nu \nabla^2 \mathbf{u}\\ \nabla \cdot \mathbf{u} &= 0\\ \mathbf{u}|_{\partial \Omega} &= \mathbf{u}_b\\ \mathbf{u}|_{t=0} &= \mathbf{u}_0 \end{aligned} \]

Kramed 支持 Latex

选择了 MathJax 而非 Katex,因为后者好像语法不一样还是不全面?无法满足需求。

记录一下做了哪些更改,主要参考这篇博客

第一步,插件替换

  1. 更换渲染插件为 kramed,Hexo 默认的渲染引擎是 marked,但 marked 不支持 mathjax,所以需要更换渲染引擎为 hexo-renderer-kramed,主要步骤如下:

    1
    2
    npm uninstall hexo-renderer-marked --save # 卸载 marked
    npm install hexo-renderer-kramed --save # 安装 kramed

  2. 在_config.yml 添加如下片段

    1
    2
    3
    4
    5
    6
    7
    8
    kramed:
    gfm: true
    pedantic: false
    sanitize: false
    tables: true
    breaks: true
    smartLists: true
    smartypants: true

  3. 停用 hexo-math 并安装 mathjax

    1
    2
    npm uninstall hexo-math --save # 卸载 hexo-math
    npm install hexo-renderer-mathjax --save # 安装 mathjax

  4. 在主题的配置文件打开 mathjax 选项,例如_config.butterfly.yml

    1
    2
    3
    4
    # MathJax
    mathjax:
    enable: true
    per_page: true

第二步,直接修改 js 文件

  1. 更改/node_modules/hexo-renderer-kramed/lib/renderer.js中的片段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // before
    // Change inline math rule
    function formatText(text) {
    // Fit kramed's rule: $$ + \1 + $$
    return text.replace(/`\$(.*?)\$`/g, '$$$$$1$$$$');
    }

    //after
    // Change inline math rule
    function formatText(text) {
    return text;
    }

  2. 更改默认转义规则

    • 因为 LaTeX 与 markdown 语法有语义冲突,所以 hexo 默认的转义规则会将一些字符进行转义,我们需要对默认的规则进行修改。

    • 打开 \node_modules\kramed\lib\rules\inline.js ,将 escape 和 em 参数更改如下:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      // before
      var inline = {
      escape: /^\\([\\`*{}\[\]()#$+\-.!_>])/,
      // ...
      em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
      // ...
      };


      // after
      var inline = {
      escape: /^\\([`*\[\]()#$+\-.!_>])/,
      // ...
      em: /^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
      // ...
      };

    • 注意,修改转义规则后,*仍在 markdown 的转义规则中,所以使用 mathjax 时,代码的*需写成 \*

  3. 更新 Mathjax 配置文件 /node_modules/hexo-renderer-mathjax/mathjax.html最后一行替换为

    1
    <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>

pandoc 支持 Latex

(首先将上面的配置恢复原状) 最终的渲染还是选择了基于 pandoc 的插件,因为 kramed 太麻烦,并且有很多细节的问题,比如换行和行内公式的星号问题。

1
2
3
npm uninstall hexo-renderer-marked --save # 卸载 marked
npm uninstall hexo-renderer-kramed --save # 卸载 kramed
npm install hexo-renderer-pandoc --save # 安装pandoc插件

注意,这需要本地已经安装 pandoc。

使用了一段时间,并没有发现对 latex 的渲染有什么问题,因此使用这个方案。