Mathjaxのv2からv3へのアップデート

Github pages上で公開しているページのMathjaxのアップデートやったのでメモ。 v2からv3へのMathjaxの変更は公式ページに記載してある。

Upgrading from v2 to v3 — MathJax 3.2 documentation

公式から設定の変換ツールがあるので、設定の変換はツールを使っても良い。

mathjax.github.io

ただGithub page上で表示しようとすると、kramdownとの相性問題で数式まわりの設定の微調整が必要だった。 特に数式は$$$で書こうとするとworkaroundが必要になる。 最終的には以下のような感じで落ち着いた。

設定の読み込み

<script src="{{ site.baseurl }}/assets/js/config.mathjax.js" defer></script>
<script type="text/javascript" id="MathJax-script" defer src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.0/es5/tex-mml-chtml.js"></script>

設定(inline数式は$でdisplay数式は$$でかける)

(function(_doc, _win) {
  window.MathJax = {
    loader: {
      load: ['[tex]/ams']
    },
    tex: {
      packages: {'[+]': ['base', 'ams']},
      // kramdown convert $a$ -> \\(\\). \\( is required to use kramdown
      // However, kramdown doesn't convert all of $ to \\(. 
      // having $ in inlineMath allows us to convert the leftovers to math
      inlineMath: [['$', '$'], ['\\(', '\\)']], 
      processEscapes: false, // use \$ to produce a literal dollar sign
      processEnvironments: true, // process \begin{xxx}...\end{xxx} outside math mode
      processRefs: true,
      tags: 'ams',
      macros: {
        diag: '\\mathop{\\mathrm{diag}}\\nolimits',
      },
    },
  };
})(document, window);

github pageはjekyllがkramdownを使ってmarkdownをwebpageに変換する。 このときmathjaxとmarkdownの記法に競合があるとうまく変換されない。 具体的には、例えば以下のような文章があったとき、

$A_{1} + A_{2}$の答えは$A_{3}$

理想的には、mathjaxの設定に追加したように$で囲まれた2つの数式部分を変換してほしい。 ただ実際には、kramdown側が_で囲まれた部分をmarkdownの記法だと判別し数式に変換する前にmarkdown用のtagを差し込む。 結果としてmathjaxは以下のような壊れた数式を変換しようとして変換がうまくいかない。

$A_{1} + A{2}$の答えは$A{3}$

問題はkaramdownは数式用の記載はskipするようになっているが 、mathjaxの設定で追加した$はkaramdown側では考慮されない。 ただ、dispaly数式の$$はkaramdownがdefaultでskipするようになっているので、こういう記法の衝突がある場合はinlineの場合でも無理やり$$を使えば正しく表示される。 同様に\eqref{test_equation_is_here}のようにlabelにunderscoreなどが含まれる場合もこれで対処できる。

使っているjekyllのversionなどは以下の通り。

group :jekyll_plugins do
  gem "jekyll", "3.9.1"
  gem "kramdown", "2.3.1"
  gem "kramdown-parser-gfm", "1.1.0"
  gem "webrick", "1.7.0"  # https://github.com/jekyll/jekyll/issues/8523
  gem "jekyll-theme-slate", "0.2.0"
  gem "jekyll-seo-tag", "2.7.1"
end