MathMLでの数式番号

MathMLで数式の横に番号をつけたい,すなわち
\begin{align}e^{\theta i}=\cos\theta + i\sin\theta\tag{1}
\end{align}
のようなことをしたいのですが,結論からいうと,現段階では触れない方が良さそうです.

mlabeledtr要素

数式にラベルを貼るためのmlabeledtr要素のW3Cのmathmlサンプルが以下です(ほんの一部改変してます).

(2.1) E = m c 2

Safariだと数式番号 (2.1) が数式の真左に表示されていますが,最もMathMLに対応していると思われていたFirefoxでは表示されず,MathMLそのものに対応しなくなったChromeは,Safariと同様に数式番号は表示されていますが,指数が正しくレンダリングされていません.Safariが唯一対応しているといえそうですが,数式番号は右端に表示されてほしいところです.少し記事が古いのですがMDNのmlabeledtr要素のページを覗くと,対応しているブラウザは悲しいことに「ない」と書いてあります.

上のMathMLのソースを見てみます.

仕様によればmlabeledtr要素の最初の子要素がラベルとして扱われるそうです.また,mtable要素side属性はmlabeledtr要素の配置場所を指定するためのもので,規定値はrightらしいのですが,明らかに左に配置されているし,side="right"としても数式番号が右に配置されることはありませんでした.例によって,side属性は全ブラウザが未対応と書いてあります.

また,このサンプルではmlabeledtr要素にid属性"e-is-m-c-square"を付けて,あとでページ内リンクができるのを想定しているようです.しかし,そもそもセマンティックな立場で見れば,数式番号を (2.1) と手打ちするのはあまりよろしくないし,あとで参照を想定するならば,数式番号を参照するというよりも,math要素そのものを参照すべきだと思います(複数行あるうちの1つの行であれば,mtr要素).

どうもmathmlと数式番号は相性が悪いようです.

そもそも数式番号はCSSの仕事では

セマンティックな立場で考えると,数式に (2.1) という名前をつけるのは,見出しの番号などと同様にCSSで表示させるべきではないかと考えるのが自然ではないでしょうか.実はW3Cにも数式番号の振り方としての代案が挙げられていますが,これでちゃんとレンダリングされるのはFirefoxだけでした.

https://www.w3.org/TR/MathML/chapter3.html#id.3.5.3.3

class属性にeqnumがセットされているmtd要素の:beforeに数式番号が自動付加されます.当然ながら:afterにすれば,数式の右に数式番号が付加されます.

このサンプルだとmtdつまり,mtableのセルに数式を付加するという発想ですが,実際は行に付加するのが本来じゃないでしょうか.というわけで以下のようなCSSを考えてみました.

これでpandocに出力させたhtmlをFirefoxで見ると次のようになります.

math[display="block"]という記述によって,インラインのmath要素を除去しています.また,pandocがはきだすmath要素の直下にはsemantics要素がきます.それと,mtr要素やmrow要素が入れ子になっている場合も想定すると,一番外側のmtr要素あるいはmrow要素だけに適用させる必要があります.これらを踏まえると,上のような少し複雑なセレクタになりました.数式番号左の”——“などはお好みで.

しかしこの方法で数式番号を自動付加しても,いざ参照するときは $(1)+(2)$というように,数式番号を手打ちしなければならないので,意味がないように思えます(そもそもhtml+cssで,カウンターの値を参照するような仕組みがないので).

現状では,やはり数式番号には触れない方がよいがベストでしょうか.

コメントする