注意: この記事で紹介している実装を真似すべきでありません。
MathJaxとは
MathJax というのはブラウザ上でTeXを書けるようにするJavaScriptライブラリです。TeXをJSに移植するようなライブラリはいくつかありますが、業界的にはほぼデファクト・スタンダード的な感じです。
MathJaxではsrcにconfigファイル名を書く
そのMathJaxにはさまざまな設定項目があるのですが、それらをいちいち書くのが面倒かつ難しいので、よくある設定をまとめたファイルがリポジトリの中に置かれていて、それを読み込むだけでユーザはMathJaxをいい感じに使うことができます。そこまではいいのですが、そのconfigファイルの指定方法がなかなか奇抜です。
<script src="/path/to/MathJax.js?config=TeX-AMS_HTML"></script>
なんと、まるでGETリクエストをしているかの如く、configファイル名を指定します。例えば上記の例の場合、こうしておくとMathJaxが自動的にTeX-AMS_HTML.jsという設定ファイルを別途読み込んでくれるのです。
なかなか見かけない設定方法ですね。でもこれ、一体どうやって実装されているのでしょう。というのも、まずMathJax.jsは完全に静的なファイルであって、つまり、普通にしていたら ?config=TeX-AMS_HTML
という指定があることを知りえないのです。
これぞ力技
MathJax.jsのコードそれ自体が既に(悪い意味で)味わい深く、読み解くのになかなか苦労させられるのですが、この箇所を実装しているのは下記のコードです。
ぱっと見ても何がなんだか分からないと思うので、簡単に説明すると
- 全てのscript要素を取ってくる
- その中でsrc属性が
MathJax.js(\\?.*)?
で終わるものだけを抽出 - 何か変なオブジェクトに
(\\?.*)
の部分を設定する
つまり、自分がMathJax.jsという名前であるという暗黙の制約を利用して、自分で頑張って解析しているわけです。3で作られたオブジェクトのプロパティに応じて適宜configファイルが改めて別途読み込まれます。
CDNでMathJaxを提供しているので一つのscript要素で全てが完結する方が使う側は嬉しいだろう、という配慮なのでしょうが、はっきり言って有難迷惑だなぁと感じます。