MathJax始めました
最近MathJaxを使って数式を書いています。ここら辺でまとめておかないと気がついたことを忘れそうなのでメモ。
前にも挑戦したことがあったのですが、そのときには数式を書けることを確認しただけで終わりでした。今回は正規分布を理解することを目標にやっているので、目的のために必要なことをひとつずつ調べています。おれおれマークダウン変換プログラムを前提として書いているので、いろいろ工夫できる余地が大きくて、頭の中がワサワサしています。使いつつ整理していく感じですね。
まずは宣言です。ぐぐればおまじないが出てきますが、前に調べたときと少し変わっていたので定期的に確認が必要なのかもしれません。まあ、いきなり使えなくなることはないでしょうけど。
<script type="text/javascript" id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js">
</script>
これで
$$\begin{align}
(x+y)^n&={}_nC_0x^ny^0+{}_nC_1x^{n-1}y^1+{}_nC_2x^{n-2}y^2+\ldots+{}_nC_{n-1}x^1y^{n-1}+{}_nC{}_nx^0y^n\\
&=\sum_{r=0}^n{}_nC_ra^{n-r}b^r
\end{align}$$
と書けば$$\begin{align}(x+y)^n&={}_nC_0x^ny^0+{}_nC_1x^{n-1}y^1+{}_nC_2x^{n-2}y^2+\ldots+{}_nC_{n-1}x^1y^{n-1}+{}_nC{}_nx^0y^n\\&=\sum_{r=0}^n{}_nC_ra^{n-r}b^r\end{align}$$と表示されます。
htmlだとbegin{align}
で始めれば$$
は必要ないんですがマークダウンだと必要なんですね。おれおれマークダウンは単なるhtmlへの変換プログラムなので、両方で表示できる必要があるのでめんどくさいですね。$\LaTeX$, html, markdownで< とかも取り扱いがちょっとずつ違うので注意が必要みたいです。
それにしても、ソースの可読性は悪いですね。もっと短く書く方法はないのでしょうか?マクロを使えばそこそこ短くはなりますが、あんまり多用すると公開して他の人に見せるときに慣れないマクロは見にくいかもしれませんし。もしかして、$\LaTeX$だとマクロ使いまくりが当たり前の文化だったりするでしょうか?マクロを使っていれば${}_nC_r$を$\begin{pmatrix}n\\r\end{pmatrix}$に変更したくなったときとかに簡単にできるんですよね。あんまり人に見せることとか考えないで自分の使いやすいようにやるかな。それだとマクロ使いまくりだな。
マクロの定義方法ですが、
$$
\def\comb#1#2{\begin{pmatrix}#1\\#2\end{pmatrix}}
\newcommand{\combi}[2]{{}_#1\mathrm{C}_#2}
\comb{n}{r}=\combi{n}{r}
$$
$$\def\comb#1#2{\begin{pmatrix}#1\\#2\end{pmatrix}}\newcommand{\combi}[2]{{}_#1\mathrm{C}_#2}\comb{n}{r}=\combi{n}{r}$$でできました。実はここにたどり着くまで大変でした。$\TeX$も$\LaTeX$も知らないので、どのレベルの違反なのかわかりにくかったんですよね。マクロ名に数字を入れられないとか知らないし。そういえば、\def
は上書きできてしまうので\newcommand
を使うのがよいらしいです。
htmlだと
<script>
MathJax = {
tex: {
macros: {
cm: ["{\\begin{pmatrix} #1 \\\\ #2\\end{pmatrix}}",2],
x: "{\\times}"
}
},
};
</script>
という記法も使えたのですが、マークダウンだとダメみたいです。
そういえば、MathMLを使っているサイトとかは元の数式はどうやって入れているのでしょうか?そもそも、意味とスタイルをゴチャゴチャに書いているのが気持ち悪いですよね。そのまま計算できないのも「なんだかなあ」と思いますし。おれおれマークダウン変換プログラムをかましているから、そこで独自書式を導入ということも考えられるのですが、いろいろ考えてもあまり短くならないんですよね。むしろ長くなりそうな予感がひしひし。
最初は式をeqnarray
で書いていたのですが、途中でうまく動かなくなりました。ぐぐってみるとMathJaxではamsmathが自動で有効、そしてamsmathではeqnarrayは非推奨というか動かないらしいです。MathJaxでは使えないということですよね。そういうことを書いてあるサイトってぐぐってもヒットしなかったんですよね。基本がまとめてあるサイトがあれば便利だったのに。
この文章はVSCodeにMarkdown All in Oneというやつを入れて書いています。最初はVimからMakefile経由でおれおれマークダウンを変換して、ブラウザにフォーカスを移してリロードして確認とかやっていたんですけど、手順が煩雑でなんだかばかばかしくなってきました。文章だけならエディタで見ていればいいんですけど、数式はリアルタイムで変換して見られないときびしいですよね。
ということでMarkdown editorを使うことにしました。前はTyporaを使っていたのですが有料になってしまったので無料のやつを探すことにしました。いくつか候補はあったけど、時代の流れに逆らって使わないでいたVSCodeが無難かなということになりました。そろそろ使ったことが一度もないのはまずいかなというのと、Vimのキーバインディングが使えるという事前情報が大きかったですね。VSCode Neovimという拡張を入れて快適です。
VSCodeのマークダウンの拡張はぐぐったらMarkdown+Mathというのも出できたのですが、Markdown All in Oneがそれの後継というサイトがあったので後者にしました。
マークダウンをVSCodeで書き始めたらすぐに問題が起きました。おれおれマークダウンだとhtmlに変換するので\(\)
や\[\]
で数式を書いていたのですが、Markdown All in Oneだと$
か$$
で囲うみたいで、そのままでは動きませんでした。MathJaxでも設定でそうできるみたいなので、それで回避するしかないですね。しかし、なんでそんな仕様なんでしょうか?MathJaxを読み込んだhtmlのレンダリングエンジンに渡せば通りそうなものなのに…
おれおれマークダウンはこの環境でも動くように互換性を考えていかなければならないようです。めんどくさい。PlantUMLを書く機能とかどうしましょ。コードブロックの特別扱いかなあ?
コメント
コメントを投稿