目前使用的LoveIt主题是我好不容易在一大堆主题中找到了最满意的主题,不仅干净简洁优雅,而且能满足我程序员的一切博客要求,简直不要太好!但是夸归夸,由于这个主题非常新,截止目前,Github上也就刚刚发布一两个月不到,问题也非常的多,其中数学公式的问题尤为明显。不忍放弃这么优秀的框架,于是我决定修改源码,提交个pull requests给原作者。

在LoveIt中,原作者使用Katex来支持博客的数学公式显示。Katex也是非常的优秀,曾经我在做《Latex实时公式编辑器时》选择了Katex作为项目核心。因为Katex相较于行业中的佼佼者MathJax来说,轻便了不止一点点,能使引用资源达到非常小,这对于前端开发者来说是非常重要的!

但是他也有致命缺点。 >Katex不直接支持行内公式显示。

具体方案

有两个修改方式:

  1. 重新自定义Katex渲染
  2. 换成MathJax

为了保持原作者的设计初衷,我决定通过自定义Katex渲染来解决问题。

重新自定义Katex渲染

在layouts/partials中增加math.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<script>
    document.addEventListener("DOMContentLoaded", function() {
        renderMathInElement(document.body, {
            delimiters: [
              {left: "$$", right: "$$", display: true},
              {left: "$", right: "$", display: false}
            ]
        });
    });
</script>

在layouts/partials/head.html最后引入math.html

在head.html的最后加入以下代码

1
2
3
{{ if or .Params.math .Site.Params.math }}
    {{ partial "math.html" . }}
{{ end }}

可通过全局math或文章头部math变量控制是否需要文章中公式的渲染。

换成MathJax

当然,一开始为了方便我是换成了MathJax的,这里展示替换方法

在layouts/partials/scripts.html中把Katex替换为MathJax

  1. 在Scripts.html中第26行有一段代码为引入katex,直接去掉
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- KaTeX https://github.com/KaTeX/KaTeX -->
{{ $katex_css := "" }}
{{ if eq (getenv "HUGO_ENV") "production" | and .Site.Params.cdn.katex_css }}
    {{ $katex_css = .Site.Params.cdn.katex_css }}
{{ else }}
    {{ $res := resources.Get "css/lib/katex/katex.min.css" | resources.Minify }}
    {{ $katex_css = printf "<link rel=\"stylesheet\" href=\"%s\">" $res.RelPermalink }}
{{ end }}
{{ $katex_js := "" }}
{{ if eq (getenv "HUGO_ENV") "production" | and .Site.Params.cdn.katex_js }}
    {{ $katex_js = .Site.Params.cdn.katex_js }}
{{ else }}
    {{ $res := resources.Get "js/lib/katex/katex.min.js" | resources.Minify }}
    {{ $katex_js = printf "<script src=\"%s\"></script>" $res.RelPermalink }}
{{ end }}
{{ $katex_auto_render_js := "" }}
{{ if eq (getenv "HUGO_ENV") "production" | and .Site.Params.cdn.katex_auto_render_js }}
    {{ $katex_auto_render_js = .Site.Params.cdn.katex_auto_render_js }}
{{ else }}
    {{ $res := resources.Get "js/lib/katex/auto-render.min.js" | resources.Minify }}
    {{ $katex_auto_render_js = printf "<script defer src=\"%s\" onload=\"renderMathInElement(document.body);\"></script>" $res.RelPermalink }}
{{ end }}
{{ $katex := delimit (slice $katex_css $katex_js $katex_auto_render_js) "" }}
  1. 将以上整体换为以下代码后,需要去config.toml中修改katex的cdn为mathjax的cdn,并且在js文件夹中加入MathJax的js:
1
2
3
4
5
6
7
{{ $mathjax_js := "" }}
{{ if eq (getenv "HUGO_ENV") "production" | and .Site.Params.cdn.mathjax_js }}
    {{ $mathjax_js = .Site.Params.cdn.mathjax_js }}
{{ else }}
    {{ $res := resources.Get "js/lib/mathjax/mathjax.min.js" | resources.Minify }}
    {{ $mathjax_js = printf "<script src=\"%s\"></script>" $res.RelPermalink }}
{{ end }}
  1. 不过太麻烦了。。。以上是为了规范的将MathJax替代,如果仅仅为了方便,可以直接在math.html中写以下代码
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [['$','$'], ['\\(','\\)']],
            displayMath: [['$$','$$'], ['\[','\]']],
            processEscapes: true,
            processEnvironments: true,
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre'],
            TeX: {
                equationNumbers: { autoNumber: "AMS" },
                extensions: ["AMSmath.js", "AMSsymbols.js"]
            }
        }
    });
</script>
<script type="text/javascript" async src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML"></script>

<style>
code.has-jax {
    font: inherit;
    font-size: 100%;
    background: inherit;
    border: inherit;
    color: #515151;
}
</style>

最后还需要在CSS中对这种特殊的MathJax进行样式处理,否则行内公式的显示会很奇怪。

在layouts/partials中增加math.html

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<script>
    document.addEventListener("DOMContentLoaded", function() {
        renderMathInElement(document.body, {
            delimiters: [
              {left: "$$", right: "$$", display: true},
              {left: "$", right: "$", display: false}
            ]
        });
    });
</script>

在layouts/partials/head.html最后引入math.html

在head.html的最后加入以下代码

1
2
3
{{ if or .Params.math .Site.Params.math }}
    {{ partial "math.html" . }}
{{ end }}

可通过全局math或文章头部math变量控制是否需要文章中公式的渲染。