Mathematics in Markdown
[ \begin{aligned} KL(\hat{y} || y) &= \sum_{c=1}^{M}\hat{y}_c \log{\frac{\hat{y}_c}{y_c}} \ JS(\hat{y} || y) &= \frac{1}{2}(KL(y||\frac{y+\hat{y}}{2}) + KL(\hat{y}||\frac{y+\hat{y}}{2})) \end{aligned} ]
概述
在學術和科學出版物中,使用 LaTeX 或 TeX 撰寫數學方程式和表達式非常常見。您的瀏覽器通常會使用開源的 JavaScript 顯示引擎,如 MathJax 或 KaTeX,來渲染這些數學標記語法。
例如,這是頁面頂部顯示的方程式的數學標記語法:
\[
\begin{aligned}
KL(\hat{y} || y) &= \sum_{c=1}^{M}\hat{y}_c \log{\frac{\hat{y}_c}{y_c}} \\
JS(\hat{y} || y) &= \frac{1}{2}(KL(y||\frac{y+\hat{y}}{2}) + KL(\hat{y}||\frac{y+\hat{y}}{2}))
\end{aligned}
\]
方程式和表達式可以與其他文字一起顯示為內嵌模式,或作為獨立區塊顯示。區塊顯示模式也稱為「顯示」模式。
無論方程式或表達式是內嵌顯示還是作為區塊顯示,都取決於圍繞數學標記的分隔符。分隔符是成對定義的,每對分隔符由開頭和結尾的分隔符組成。常見的分隔符對如 步驟 1 中所示。
下面描述的方法避免依賴於特定平台的功能,如短代碼或程式碼區塊掛載鉤子。相反,它利用標準化的數學方程式和表達式標記語法格式,與 GitHub、GitLab、Microsoft VS Code、Obsidian、Typora 等所使用的渲染引擎相容。
設定
按照以下步驟,使用 LaTeX 或 TeX 排版語法在您的 Markdown 中包含數學方程式和表達式。
步驟 1
在您的網站設定中啟用並配置 Goldmark [passthrough 擴展]。passthrough 擴展會保留被分隔符包圍的原始 Markdown,並且包括分隔符本身。
markup:
goldmark:
extensions:
passthrough:
delimiters:
block:
- - \[
- \]
- - $$
- $$
inline:
- - \(
- \)
enable: true
params:
math: true
[markup]
[markup.goldmark]
[markup.goldmark.extensions]
[markup.goldmark.extensions.passthrough]
enable = true
[markup.goldmark.extensions.passthrough.delimiters]
block = [['\[', '\]'], ['$$', '$$']]
inline = [['\(', '\)']]
[params]
math = true
{
"markup": {
"goldmark": {
"extensions": {
"passthrough": {
"delimiters": {
"block": [
[
"\\[",
"\\]"
],
[
"$$",
"$$"
]
],
"inline": [
[
"\\(",
"\\)"
]
]
},
"enable": true
}
}
}
},
"params": {
"math": true
}
}
上述設定會在每個頁面上啟用數學渲染,除非您在 front matter 中將 math
參數設置為 false
。若要根據需要啟用數學渲染,請將網站設定中的 math
參數設為 false
,並在 front matter 中將 math
參數設為 true
。如 步驟 3 中所示,請在您的基礎模板中使用此參數。
若要禁用內嵌片段的 passthrough,請從配置中省略 inline
鍵:
markup:
goldmark:
extensions:
passthrough:
delimiters:
block:
- - \[
- \]
- - $$
- $$
[markup]
[markup.goldmark]
[markup.goldmark.extensions]
[markup.goldmark.extensions.passthrough]
[markup.goldmark.extensions.passthrough.delimiters]
block = [['\[', '\]'], ['$$', '$$']]
{
"markup": {
"goldmark": {
"extensions": {
"passthrough": {
"delimiters": {
"block": [
[
"\\[",
"\\]"
],
[
"$$",
"$$"
]
]
}
}
}
}
}
}
您可以定義自己的開頭和結尾分隔符,只要它們與 步驟 2 中設定的分隔符匹配即可。
markup:
goldmark:
extensions:
passthrough:
delimiters:
block:
- - '@@'
- '@@'
inline:
- - '@'
- '@'
[markup]
[markup.goldmark]
[markup.goldmark.extensions]
[markup.goldmark.extensions.passthrough]
[markup.goldmark.extensions.passthrough.delimiters]
block = [['@@', '@@']]
inline = [['@', '@']]
{
"markup": {
"goldmark": {
"extensions": {
"passthrough": {
"delimiters": {
"block": [
[
"@@",
"@@"
]
],
"inline": [
[
"@",
"@"
]
]
}
}
}
}
}
}
步驟 2
建立一個部分模板來載入 MathJax 或 KaTeX。以下示範載入 MathJax,或者您也可以如 引擎 部分所述使用 KaTeX。
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
<script>
MathJax = {
tex: {
displayMath: [['\\[', '\\]'], ['$$', '$$']], // 區塊顯示
inlineMath: [['\\(', '\\)']] // 內嵌顯示
}
};
</script>
上述分隔符必須與您的網站設定中的分隔符匹配。
步驟 3
根據需要在基礎模板中有條件地調用部分模板。
<head>
...
{{ if .Param "math" }}
{{ partialCached "math.html" . }}
{{ end }}
...
</head>
上面的示範會在您將 front matter 中的 math
參數設為 true
時載入部分模板。如果您沒有設置 math
參數,條件語句將回退到您網站設定中的 math
參數。
步驟 4
在 Markdown 中使用 LaTeX 或 TeX 排版語法包含數學方程式和表達式。
這是一個內嵌方程式 \(a^*=x-b^*\)。
以下是區塊方程式:
\[a^*=x-b^*\]
\[ a^*=x-b^* \]
\[
a^*=x-b^*
\]
以下也是區塊方程式:
$$a^*=x-b^*$$
$$ a^*=x-b^* $$
$$
a^*=x-b^*
$$
如果您在網站設定中將 math
參數設為 false
,您必須在 front matter 中將 math
參數設為 true
。例如:
---
date: 2024-01-24T18:09:49-08:00
params:
math: true
title: 數學範例
---
+++
date = 2024-01-24T18:09:49-08:00
title = '數學範例'
[params]
math = true
+++
{
"date": "2024-01-24T18:09:49-08:00",
"params": {
"math": true
},
"title": "數學範例"
}
內嵌分隔符
上面的配置、JavaScript 和示範使用 \(...\)
分隔符對來表示內嵌方程式。另一種常見的分隔符對是 $...$
,但如果您在數學上下文之外使用 $
符號,這可能會導致不必要的格式化。
如果您將 $...$
分隔符對添加到配置和 JavaScript 中,則無論頁面上是否啟用了數學渲染,您都必須對 $
進行雙重轉義。示例如下:
A \\$5 bill _saved_ is a \\$5 bill _earned_.
引擎
MathJax 和 KaTeX 是開源的 JavaScript 顯示引擎。這兩個引擎都很快速,但在本文撰寫時,MathJax v3.2.2 稍微比 KaTeX v0.16.9 快一些。
若要使用 KaTeX 代替 MathJax,請將 步驟 2 中的部分模板替換為以下內容:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css" integrity="sha384-n8MVd4RsNIU0tAv4ct0nTaAbDJwPJzDEaqSD1odI+WdtXRGWt2kTvGFasHpSy3SV" crossorigin="anonymous">
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.js" integrity="sha384-XjKyOOlGwcjNTAIQHIpgOno0Hl1YQqzUOEleOLALmuqehneUG+vnGctmUb0ZY0l8" crossorigin="anonymous"></script>
<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/contrib/auto-render.min.js" integrity="sha384-+VBxd3r6XgURycqtZ117nYw44OOcIax56Z4dCRWbxyPt0Koah1uHoK0o4+/RRE05" crossorigin="anonymous"></script>
<script>
document.addEventListener("DOMContentLoaded", function() {
renderMathInElement(document.body, {
delimiters: [
{left: '\\[', right: '\\]', display: true}, // block
{left: '$$', right: '$$', display: true}, // block
{left: '\\(', right: '\\)', display: false}, // inline
],
throwOnError : false
});
});
</script>
上述的定界符必須與您網站配置中的定界符相符。
化學
MathJax 和 KaTeX 都支援化學方程式。例如:
$$C_p[\ce{H2O(l)}] = \pu{75.3 J // mol K}$$
$$C_p[\ce{H2O(l)}] = \pu{75.3 J // mol K}$$
如同 步驟 2 中所示,MathJax 支援化學方程式,無需額外配置。若要為 KaTeX 增加化學支持,請啟用 mhchem 擴展,詳情請參見 KaTeX 文件。