Markdown で数式を書く方法を、用語の意味・方言ごとの書き方と表示エンジン・LaTeX 数式の基本の順にまとめたリファレンスです。

Markdown の方言ごとの拡張記法の一覧は、方言・拡張記法のまとめを参照してください。

Markdownには CommonMark / GFM 以外にも多くの方言・拡張記法があります。GitLab(GLFM)・Pandoc・Markdown Extra・markdown-it・MultiMarkdown・kramdown・Markdo...  続きを読む

用語の整理

数式まわりの用語は、「数式の書き方(記法)」と「数式を表示するためのツール」が混ざって使われています。

用語 種類 内容
TeX(テフ) 組版システム Donald Knuth が作った、論文や書籍を組版するためのシステム。数式を frac{1}{2} のようなコマンドで書く
LaTeX(ラテフ) TeX の拡張 TeX を使いやすくしたマクロの集まり。論文の執筆で広く使われている
LaTeX の数式記法 記法 LaTeX の「数式の部分」だけの書き方。Markdown の数式は、すべてこの書き方で書く
MathJax(マスジャックス) 表示ツール LaTeX の数式記法を、Web ページ上で数式として表示する JavaScript ライブラリ。対応しているコマンドが多い
KaTeX(カテフ) 表示ツール MathJax と同じ役割のライブラリ。MathJax より表示が速いが、対応しているコマンドは少なめ
MathML HTML の仕様 数式を表すための HTML のタグ(<math> <mfrac> など)。いまの主要ブラウザは MathML を直接表示できる

関係をまとめると、次のようになります。

Markdown の中に、LaTeX の数式記法で数式を書く
↓
MathJax や KaTeX が、数式として表示する
(出力は HTML + CSS、SVG、MathML のいずれか)

MathJax・KaTeX が対応しているのは、LaTeX の数式の部分だけです。LaTeX の文書全体(documentclass など)は書けません。


Markdown での数式の書き方(区切り記号)

数式を囲む記号(区切り記号)は、方言によって違います。

方言 $…$ $$…$$ $`…`$ ```math (…) / […]
GitHub ○ ○ ○ ○ -
GitLab ○ ○ ○ ○ -
Pandoc ○ ○ - - △
kramdown - ○ - - -
MultiMarkdown ○ ○ - - △
markdown-it プラグイン次第 プラグイン次第 - - -
MPE ○ ○ - ○ ○
Qiita ○ ○ ○ ○ -
Zenn ○ ○ - - -
Obsidian ○ ○ - - -
VitePress △ △ - - -
Starlight △ △ - - -
  • $…$ はインライン(文中)、$$…$$ はブロック(独立した行)の数式です。
  • Pandoc:(…) は拡張(tex_math_single_backslash)を有効にした場合だけ使えます。
  • MultiMarkdown:\(…\) \[…\] と、バックスラッシュを 2 個にして書きます。
  • kramdown:$$ だけで、段落の中にあればインライン、単独の段落ならブロックになります。
  • VitePress:設定(markdown.math: true)と markdown-it-mathjax3 のインストールが必要です。
  • Starlight:既定では使えません。remark-math と rehype-katex(または rehype-mathjax)を追加すると使えます。

どの方言でも使える書き方

インラインは $…$、ブロックは前後に空行を入れた $$…$$ が、最も多くの方言で使えます(kramdown を除く)。

質量とエネルギーの関係は $E = mc^2$ で表されます。

$$
E = mc^2
$$

GitHub・GitLab・Qiita では、$`…`$ と ```math も使えます。この 2 つは、後述の「Markdown の記号との衝突」が起きない書き方です。

質量とエネルギーの関係は $`E = mc^2`$ で表されます。

```math
E = mc^2
```

方言ごとの表示エンジン

同じ数式でも、方言によって表示に使われるライブラリ(MathJax か KaTeX か)が違います。使えるコマンドはライブラリで決まるので、書いた数式が方言によって表示されないことがあります。

方言 表示エンジン
GitHub MathJax
GitLab KaTeX
Pandoc 出力時にオプションで選ぶ(--mathjax --katex --mathml など)
kramdown 既定は MathJax 向けの出力(設定 math_engine で KaTeX なども選べる)
MultiMarkdown MathJax 向けの区切り記号で出力
markdown-it プラグイン次第(markdown-it-texmath など、KaTeX を使うものが多い)
MPE KaTeX(既定)/ MathJax(設定で切り替え)
Qiita MathJax
Zenn KaTeX
Obsidian MathJax
VitePress MathJax(ビルド時に SVG に変換)
Starlight 追加するプラグイン次第(KaTeX / MathJax)

LaTeX 数式の基本

ここからは、MathJax・KaTeX のどちらでも使える基本的な書き方です。以下の例は、$…$ や $$…$$ の中に書きます。

上付き・下付き

書き方 意味
x^2 x の 2 乗(上付き)
a_1 a の添字 1(下付き)
x^{10} 2 文字以上は { } で囲む(x^10 だと「x の 1 乗 × 0」になる)
a_{ij}^2 下付きと上付きを同時に
e^{-x^2} 入れ子にもできる

分数・根号

書き方 意味
frac{1}{2} 分数(分子、分母の順)
dfrac{1}{2} 文中でも大きく表示する分数
sqrt{2} 平方根
sqrt[3]{8} 3 乗根

演算子・関係記号

書き方 記号 書き方 記号
times × div ÷
pm ± cdot ・(中黒の積)
leq ≤ geq ≥
neq ≠ approx ≈
equiv ≡ propto ∝
in ∈ subset ⊂
cup ∪ cap ∩
to → Rightarrow ⇒
infty ∞ partial ∂

ギリシャ文字

小文字は alpha beta gamma delta epsilon theta lambda mu pi sigma phi omega のように、読み方をそのままコマンドにします。頭文字を大文字にすると、大文字になります(Gamma Delta Sigma Omega)。

総和・積分・極限

書き方 意味
sum_{k=1}^{n} k 総和(Σ)
prod_{k=1}^{n} k 総乗(Π)
int_{0}^{1} x , dx 積分
iint oint 重積分・周回積分
lim_{x to 0} frac{sin x}{x} 極限

_ と ^ の中身は、インラインでは記号の右側に、ブロックでは記号の上下に表示されます。

括弧

書き方 意味
( ) [ ] 丸括弧・角括弧(そのまま書く)
{ } 波括弧({ } はグループ化の記号なので、 を付ける)
left( frac{1}{2} right) 中身の高さに合わせて、括弧を大きくする
vert x vert 絶対値(縦線 1 本の記号と同じ。表の中では縦線が区切りとして扱われるので、vert を使う)
langle x rangle 山括弧

行列

begin{pmatrix}
a & b \
c & d
end{pmatrix}
  • & で列を、\ で行を区切ります。
  • 環境の名前で括弧の形が変わります。pmatrix(丸括弧)、bmatrix(角括弧)、vmatrix(縦線=行列式)、matrix(括弧なし)。

場合分け

|x| =
begin{cases}
x  & (x geq 0) \
-x & (x < 0)
end{cases}

複数行の式(等号で揃える)

begin{aligned}
(a+b)^2 &= (a+b)(a+b) \
&= a^2 + 2ab + b^2
end{aligned}

& を置いた位置で、各行が揃います。ブロックの数式($$…$$)の中で使います。

文字・フォント・空白

書き方 意味
text{日本語} 数式の中に通常の文字を書く(そのまま書くと斜体になり、空白も消える)
mathrm{d}x 立体(ローマン体)
mathbf{v} 太字
mathbb{R} 黒板太字(ℝ・ℕ などの集合)
vec{a} ベクトルの矢印
, ; quad qquad 空白(小 → 大の順)

MathJax と KaTeX の違い

MathJax KaTeX
表示の速さ 普通 速い(ページの表示と同時に描画できる)
対応コマンド 多い MathJax より少ない
拡張の読み込み(require{…}) ○ -
eqnarray 環境 ○ -(aligned などで代用)
physics パッケージ(qty abs など) ○(require{physics}) -
化学式(ce{H2O}) ○(mhchem 拡張) △(mhchem 拡張を別途読み込み)
出力 HTML + CSS/SVG/MathML HTML + CSS/MathML

どちらの方言でも表示させたいときは、前述の「LaTeX 数式の基本」の範囲で書くのが確実です。require や eqnarray を使った数式は、KaTeX を使う方言(GitLab・Zenn・MPE の既定など)では表示されません。

数式のコマンドを調べるときは、次のサイトが便利です。

  • Easy Copy MathJax:分野別のコマンドを、コピーしやすい形で紹介しています(MathJax 向けなので、require{physics} などは KaTeX では使えません)。
  • KaTeX の Supported Functions:KaTeX で使えるコマンドの一覧です。KaTeX で使えるものは、ほぼ MathJax でも使えます。

Markdown の記号との衝突

数式に使う記号の中には、Markdown の記号と同じものがあります。数式に対応していないパーサーで Markdown を HTML に変換してから MathJax・KaTeX で表示する場合、数式が先に Markdown として変換されて崩れることがあります。

記号 起きること 対策
_ $a_1 + b_1$ の _1 + b_ が斜体(<em>)になる _ とエスケープする
* $a*b*c$ の *b* が斜体になる ast を使う、または * とエスケープする
\ 行列や aligned の改行 \ が、Markdown のエスケープで 1 個になる \\ と 4 個書く
{ } Markdown のエスケープで { } になり、グループ化の記号として扱われる \{ \} と書く
| テーブルの中では、セルの区切りとして扱われる vert mid を使う
$ 100$ と 200$ のような文が、数式として扱われる $ とエスケープする
  • 数式に対応しているパーサー(GitHub・GitLab・Pandoc・Zenn・Obsidian など)は、数式の部分を先に取り出してから Markdown を変換するので、この問題は起きません。
  • Qiita は、$…$ $$…$$ の中でも Markdown のエスケープが効くため、$`…`$ と ```math の書き方が推奨されています。
  • Pandoc と MultiMarkdown では、開きの $ の直後と閉じの $ の直前に空白があると、数式として扱われません($ x $ は不可)。金額の $ と区別するためのルールです。

Web ページで表示するには

Markdown から変換した HTML に数式を表示するには、ページに MathJax か KaTeX を読み込みます。

MathJax

<script>
	window.MathJax = {
		tex: {
			inlineMath: [['$', '$'], ['\(', '\)']],
			displayMath: [['$$', '$$'], ['\[', '\]']]
		}
	};
</script>
<script defer src="https://cdn.jsdelivr.net/npm/mathjax@4/tex-mml-chtml.js"></script>

MathJax は、既定ではインラインの $…$ を数式として扱いません(金額の $ と誤認しないため)。$…$ を使うときは、上のように inlineMath の設定が必要です。

KaTeX

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.16/dist/katex.min.css">
	<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16/dist/katex.min.js"></script>
	<script defer src="https://cdn.jsdelivr.net/npm/katex@0.16/dist/contrib/auto-render.min.js"
	onload="renderMathInElement(document.body, {
		delimiters: [
			{ left: '$$', right: '$$', display: true },
			{ left: '$', right: '$', display: false }
		]
	});"></script>

KaTeX は、自動で数式を探す拡張(auto-render)を読み込み、区切り記号を指定します。

どちらも、<code> や <pre> の中は数式として扱わないので、コードの例に書いた $ が数式に変換されることはありません。


参考リンク