主页
Featured image of post LaTeX相关……

LaTeX相关……

Hugo中LaTeX显示的问题以及暂时解决方法……

文章字数:2164
预计阅读时长: 分钟

本文所提到的重新生成hugo方法已失效,待重新更新……

LaTeX存在的问题

在Markdown博客中,对于LaTeX的渲染可能会存在一个通病:

Markdown中的转义字符会对LaTeX的渲染产生干扰……

比如LaTeX的换行符\\、左大括号\{等……
会被Markdown给转义……

因为Hugo是先渲染的网页,此时LaTeX还未被渲染……
所以会因为转义,把本来该在LaTeX中代表换行的\\渲染成\……
造成LaTeX在后面的渲染中出错……

比如下面这段LaTeX:

x =
\left\{
\begin{array}{l}
1 \\
2
\end{array}
\right.

应该被LaTeX渲染成:

本来应该在网页渲染成的样子
本来应该在网页渲染成的样子

实际上经过Markdown渲染后,那段markdown会变成:

源码

$$
x =
\left\{
\begin{array}{l}
1 \\
2
\end{array}
\right.
$$

渲染后的代码

$$
x =
\left{
\begin{array}{l}
1 \
2
\end{array}
\right.
$$

因此这之后LaTeX就会渲染出错,然后不渲染,网页中变成:

显示在网页中的样子
显示在网页中的样子

解决方法

这个问题也有很多人发现并提出……
解决方法可以查看这位在「Hexo下mathjax的转义问题」列出的4条……

由于个人的需求是:直接将在课堂上用VSCode写好的笔记贴到博客上……
尤其是文章篇幅过长内容过多时,不想一个个修改LaTeX格式,直接贴好就能用……

因此想从LaTeX渲染器入手修正……


JimmyCai在本主题中的Markdown渲染器采用的是"goldmark",数学渲染采用的是"KaTeX"……
个人搜索后发现,有一个叫“goldmark-mathjax”的插件很适合个人需求……
但Hugo中的goldmark并没有使用这个插件……

所以需要先更换LaTeX渲染为"MathJax";
然后再重新生成支持"goldmark-mathjax"的hugo……

1. 更换为"MathJax"

修改math.html文件即可……
最好是自己创建一个math.html覆盖,而不是直接修改主题里的math.html……

打开位置:layouts\partials\article\components,然后创建math.html……

里面输入这些东西:

<script type="text/javascript" async
    src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
        MathJax.Hub.Config({
            tex2jax: {
                inlineMath: [['$', '$'], ['\\(', '\\)']], //这里可以修改行内公式支持的符号,比如这里就是$ $和\( \)【注意这里输入\时会被转义……
                displayMath: [['$$', '$$'], ['\\[', '\\]']], //这里可以修改行间公式支持的符号,这里就是$$ $$\[ \]……
                processEscapes: true,
                processEnvironments: true,
                skipTags: ['code', 'script', 'noscript', 'style', 'textarea', 'pre'], //这里多了个'code',原因见下……
                TeX: {
                    equationNumbers: { autoNumber: "AMS" },
                    extensions: ["AMSmath.js", "AMSsymbols.js"]
                }
            }
        });
    </script>
skipTags中多个code的原因

好像这个插件也采用了上述解决方法中的“保护代码块”方法……
也就是对于<code>标签内的东西,也会被MathJax渲染……

但我们并不需要这种方法,所以将这个标签给跳过……

教程和代码参考自:「MathJax Support」 —— Hugo中文文档,代码有改动……

2. 重新生成hugo

可以查看"hugo-theme-even"中的「Issues#233 - Mathjax公式显示错误」中“Luoyayu"的回答,按照他的步骤进行即可……

自己先新建个文件夹,在cmd里进入该文件夹后按顺序输入1~7条指令……
需要电脑安装gitgo……

生成完成后,可以在该文件夹中的GoBuilds子文件夹中,找到名为hugo的文件……
添加.exe后缀后,将其替换原来的hugo程序。

如果是用"scoop"安装的,hugo会安装在你的用户文件夹中,有个名叫scoop的子文件夹,
里面就能找到hugo.exe

用新生成的hugo替换原来hugo
用新生成的hugo替换原来hugo

像这样替换好后,用hugo server查看一下。

Markdown中内容

$$
x =
\left\{
\begin{array}{l}
1 \\
2
\end{array}
\right.
$$

效果

$$ x = \left{ \begin{array}{l} 1 \ 2 \end{array} \right. $$

直接放LaTeX了,发现是正常的,问题暂时解决……

还有点点小问题

之所以说是暂时解决,是因为在行间模式的时候会有点问题……
不知道是不是我自己输入习惯的问题orzzz……

1. 行间模式必须单独成行

我用行间模式的时候,一般都会直接跟$$ $$放在一行里,比如$$ a=1, b=2 $$……
这个在VSCode预览的时候也是正常的,所以就一直这么用了……

但如果用这个方法,这样输入的话就会出现很严重的问题

Markdown中内容

Markdown中内容
Markdown中内容

效果

效果
效果

也就是说,行间模式必须要将$$单独写成一行:

正确的写法

$$
x =
\left\{
\begin{array}{l}
1 \\
2
\end{array}
\right.
$$

或者:

$$
x = \left\{ \begin{array}{l} 1 \\ 2 \end{array} \right.
$$

错误的写法

$$x = \left\{ \begin{array}{l} 1 \\ 2 \end{array} \right.$$

2. 多个行间模式之间必须隔开

跟上个类似,在用多个行间模式的时候,中间必须空一行:

正确的方式

$$
Latex_1...
$$

\$\$
Latex_2...
\$\$

错误的方式

$$
Latex_1...
$$
$$
Latex_2...
$$


以上两个问题暂时不知道是什么成因……
但因为这个确实是目前能找到的最好的解决方法,所以【ry……
然后慢慢改下自己记笔记时用$$ $$的习惯吧_(:з」∠)_……

3. 引用块中用行间模式会有问题

在引用(<blockquote>)中如果用了行间模式,会将其后一行又变为引用……

比如这样:

源码
源码
效果
效果

可以看到“其中……”这句话被标记为了引用块……

应该是"goldmark-mathjax"插件的问题……
这篇文章写完后才发现……
有点不舒适,但也不是什么大问题【……

还是先准备考试,后面有时间再提个issue吧’_>’……

采用 CC BY-NC-SA 4.0 许可协议
文章封面配图Yandere ID:331204