理系学生日記

おまえはいつまで学生気分なのか

はてなブログのMarkdownモードでMathJaxを使うときの困りごと

勉強中の統計学の話を本ブログに垂れ流し始めた関係上、エントリ内に数式を記述することが増えてきました。数式は綺麗に表示して欲しいので、当然ながら$\TeX$記法で書きたいわけです。

Tex記法で書く

はてなブログでtexを書くには2つの選択肢があります。

はてな記法のうちのtex記法で書く

はてな記法ではtex記法をサポートしており、[tex:~~]と書けばMathJaxを使って数式を表示してくれます。

例えば[tex:\sum_{i=1}^n a_i]と記述すると\sum_{i=1}^n a_iという表示になります。

ちょっと汚い、というかだいぶ汚い。

直接MathJaxで書く

はてな記法を介さずに、直接MathJaxで書くという方法もあります。 本ブログではこちらの方を採用しており、エントリのフッタに以下のような記述をすることで、MathJaxを設定しています。

 <script>
MathJax = {
  tex: {
      inlineMath: [['$', '$'], ['\\(', '\\)']]
  }
};
</script>
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>

そうすると、以下のように綺麗な数式が表示できるようになります。

$$ \sum _{i=1} ^n a_i $$

Markdown記法とMathJaxの相性問題

はてなブログを書くエンジニアの方は、編集モードとして、多くの場合Markdownモードを利用しているのではないでしょうか。 このMarkdownモードと、MathJaxの相性が極めて良くない。久しぶりに数式を書いてかなり戸惑いました。

推測ですが、多くの問題はMarkdownパーサとMathJax(正確には、$\TeX$記法か)が競合していることが原因と思われます。

アンダースコアがMathJax側に渡されない

下表の通り、アンダースコアはエスケープしないとMathJaxまで届かないようです。Markdownで斜体とするためのアンダースコアと競合してしまうのでしょう。

記述内容 表示 補足
\sum_{i=1}^n \left(a_i + b_i\right) $\sum_{i=1}^n \left(a_i + b_i\right)$ 標準的な$\TeX$表記
\sum \_{i=1}^n \left(a\_i + b\_i\right) $\sum _{i=1}^n \left(a_i + b_i\right)$ アンダースコアを\でエスケープ

eqnarray環境で改行を表せない

複数行の数式を記述する際、eqnarray環境を使うことが多いのですが、$\TeX$ではこの改行を\\で表すことが多いです。

\begin{eqnarray}
hoge1 \\
hoge2
\end{eqnarray}

しかし、これもMarkdownパーサ(?)によってMathJaxに渡されていない。この場合は\newlineで代用しています。例えば以下の式のテキストをMarkdown上でどう記述しているかを示します。

$$ \begin{eqnarray} R ^2 &=& \frac{S_R}{S_T} \newline &=& \frac{\sum (\hat{y_i} - \bar{y} ) ^2}{\sum (y_i - \bar{y} ) ^2} \newline &=& \frac{\frac{1}{n} \sum \left( (\hat{\alpha}+\hat{\beta} x_i ) - (\hat{\alpha} + \hat{\beta} \bar{x} ) \right) ^2 }{\frac{1}{n} \sum (y_i - \bar{y} ) ^2 } \newline &=& \frac{\beta ^2}{s_{yy}} \frac{1}{n}\sum (x_i - \bar{x}) ^2 \newline &=& \beta ^2 \frac{s_{xx}}{s_{yy}} \newline \end{eqnarray} $$

\begin{eqnarray}
R ^2 &=& \frac{S\_R}{S\_T} \newline
  &=& \frac{\sum (\hat{y_i} - \bar{y} ) ^2}{\sum (y_i - \bar{y} ) ^2} \newline
  &=& \frac{\frac{1}{n} \sum \left( (\hat{\alpha}+\hat{\beta} x\_i ) - (\hat{\alpha} + \hat{\beta} \bar{x} ) \right) ^2 }{\frac{1}{n} \sum (y\_i - \bar{y} ) ^2 } \newline
  &=& \frac{\beta ^2}{s\_{yy}} \frac{1}{n}\sum (x\_i - \bar{x}) ^2 \newline
  &=& \beta ^2 \frac{s\_{xx}}{s\_{yy}} \newline
\end{eqnarray}

このように、通常の$\TeX$環境とは随分違うので戸惑いますが、慣れてくるとまぁなんとか。

参考文献