MathJax と Markdown で可搬性のある数式を書くには
数式を含む web ページを書くとき、MathJax の記法と Markdown の記法が衝突して困った経験はありませんか? ${} _ n C _ r$ と書こうとして ${} nC r$ のように表示されたり、$\min \lbrace x \mid \varphi(x) \rbrace$ と書いたはずが $\min x \mid \varphi(x)$ と表示されたりした経験がある人は多いはずです。 そして、なんとか調整を頑張ってあるひとつの Markdown 処理系の上では適切に表示される状態にしたのに、別の Markdown 処理系に持っていったら壊れてしまったということはありませんか? そのような面倒を回避するためのテクを紹介します。
下付き文字 x_i
下付き文字を書くときは _ の前後に空白を入れてください1。
たとえば $a _ i$ と表示するには $x_i$ や $x\_i$ ではなく $x _ i$ と書いてください。
Markdown における強調の記法 _foo_ と衝突するためです。
縦線 |
縦線を書くときは \mid や \vert を使ってください。
たとえば $\vert \vec{a} \vert$ と表示するには $|\vec{a}|$ や $\|\vec{a}\|$ ではなく $\vert \vec{a} \vert$ と書いてください。
Markdown における表の記法 | a | b | c | と衝突するためです。
不等号 < >
不等号を書くときは \lt や \gt を使ってください。
たとえば $a \lt b$ と表示するには $a < b$ ではなく $a \lt b$ と書いてください。
HTML におけるタグの記法 <a> と衝突するためです。
波括弧 \{ \}
波括弧を書くときは \lbrace \rbrace を使ってください。
たとえば $\lbrace 0, 1, 2, \dots \rbrace$ と表示するには $\{ 0, 1, 2, \dots \}$ や $\\{ 0, 1, 2, \dots \\}$ ではなく $\lbrace 0, 1, 2, \dots \rbrace$ と書いてください。
Markdown におけるエスケープの記法 \ の仕様の曖昧さのためです2。
角括弧 \[ \]
角括弧を書くときは \lbrack \rbrack を使ってください。
たとえば $\lbrack l, r )$ と表示するには $[ l, r )$ や $\[ l, r )$ や $\\[ l, r )$ ではなく $\lbrack l, r )$ と書いてください。
Markdown におけるエスケープの記法 \ の仕様の曖昧さのためです2。
アスタリスク *
アスタリスクを書くときは \ast を使ってください。
たとえば $f \ast g$ と表示するには $f * g$ ではなく $f \ast g$ と書いてください。
Markdown における強調の記法 *foo* と衝突するためです。
番号記号 \#
番号記号を書くときは \unicode{35} を使ってください3。
たとえば $\unicode{35} A$ と表示するには $\# A$ や $\\# A$ ではなく $\unicode{35} A$ と書いてください。
Markdown におけるエスケープの記法 \ の仕様の曖昧さのためです2。
行区切り \\
\\ は避け \newline で代用してください45。
たとえば $f(n) = \begin{cases} 1 & (n = 0) \newline n f(n - 1) & (n \ne 0) \end{cases}$ と表示するには $f(n) = \begin{cases} 1 & (n = 0) \newline n f(n - 1) & (n \ne 0) \end{cases}$ と書いてください。
Markdown におけるエスケープの記法 \ の仕様の曖昧さのためです2。
-
ただし
_の前後の文字が共に英数字 (例:x_i) なら空白はなしでもよいです。 ↩ -
たとえば、
\#を#に変換する Markdown 処理系と\#を\#に変換する Markdown 処理系とが両方あります。 ↩ ↩2 ↩3 ↩4 -
\hashのような命令は、MathJax にはいまのところ存在しないようです。 ↩ -
ただし MathJax の内部において
\\と\newlineは異なる命令であることに注意してください。場合によっては\newlineで置き換えることができないことがあります。 ↩ -
これは MathJax を前提としています。MathJax 以外の処理系を用いた場合 (例: IDE 上のプレビュー) の動作は保証できません。 ↩