HTML5,MathMLを使ってみる
MathMLを試しました。実際にこの記事上にMathML記述を 置き、かつそのコードを示しています。 現時点ではfirefoxのみがMathMLに 仮対応できているようです。
上はfirefox4で動かした画面のキャプチャです。 firefox3.6.6でもMathML有効な設定にすれば得られます。 MathMLに対応したブラウザではこの下に同様の数式がでる はずです。対応していない場合、1+a b,1+5 2,t2=t1 1 - v 2 C 2といった要素 のみの並びが表示されます。
(1)分数
(2)黄金比
firefox3.6.6でMathMLを有効にする設定:
アドレスバーにabout:configを入力して、移動すると、設定パラメターが
出てきます。項目の中からhtml5:enableをtrueにします。
firefox4では標準でmathmlが使えます。
firefox3では√の中に分数があると前垂れの長さが足らなくなっていましたが
firefox4では修正されています。
MathML記述
本記事のサンプルは以下のMathML記述をHTML上に 直接書いて出しています。
(1)分数
<math style="display:block"> <!-- display:block指定がないと小さくなってしまう --> <mn>1</mn> <!-- 数値は<mn>で囲む --> <mo>+</mo> <!-- 演算子は<mo>で囲む --> <mfrac> <!-- 分数は<mfrac>の中に2つの要素を並べる --> <mi>a</mi> <!-- mfracの分子;変数は<mi>で囲む --> <mi>b</mi> <!-- mfracの分母;変数は<mi>で囲む --> </mfrac> <!-- 機械的で無意味で鬱陶しいXMLの閉じタグ --> </math> <!-- 機械的で無意味で鬱陶しいXMLの閉じタグ -->
(2)黄金比
<math style="display:block"> <mfrac> <mrow> <!-- 分子;複数要素からなる場合は<mrow>でまとめる --> <mn>1</mn> <mo>+</mo> <msqrt> <!-- √は<msqrt>で囲む --> <mn>5</mn> </msqrt> </mrow> <mn>2</mn> <!-- 分母;単要素なので直接書いている --> </mfrac> </math>
(3)時間に関するローレンツ変換式
<math style="display:block"> <mi>t2</mi> <mo>=</mo> <!-- 等号は単純な演算子扱い --> <mfrac> <mi>t1</mi> <msqrt><mrow> <mn>1</mn> <mo>-</mo> <mfrac> <msup> <!-- n乗は<msup>内に基数と乗数を書く --> <mi>v</mi> <!-- 基数 --> <mn>2</mn> <!-- 乗数 --> </msup> <msup> <mi>C</mi> <mn>2</mn> </msup> </mfrac> </mrow></msqrt> </mfrac> </math>
mathにdisplay:blockを指定しないと、1行分の高さになるようで、
例のような多段式の場合、小さくなりすぎます。
表示サイズに関しては最終仕様がどうなるかは分かりませんが、
ここでは対症処置としてこの指定を行っています。
MathMLを利用した記事を▼動画で見せるプラチナ比と黄金比の仕組み に置きました。まだまだ対応しないブラウザがほとんどなので数式を画像 化したものも載せてます。
MathML現実的記述法
MathMLの形式の記述を人間が行うことは全く現実的ではありません。
例えば次のような記述からMathML構文を生成するのは難しいことではありません。
// 分数 1+a÷b; // 黄金比 {1+√5}÷2; // ローレンツ変換 t2=t1÷√{1-{v^2}÷{C^2}};式の定義法は色々考えられます。例えばtex/latexなどのように複雑な 制御語で行うこともできますが、ここでは可能な限り本来の 数式に近い形で表現できるように定義しています。 長い経験からいって特に修練しなくても式が分かる 形こそ望まれるものだと考えています。
この例は実際に簡素な記述からツールによりMathML記述を生成し、このページに コピーしたものです。
ツールにより実際に作成されたものを載せます。
<math> <mi>1</mi> <mo>+</mo> <mfrac> <mn>a</mn> <mn>b</mn> </mfrac> </math> <math> <mfrac> <mrow> <mi>1</mi> <mo>+</mo> <msqrt> <mi>5</mi> </msqrt> </mrow> <mi>2</mi> </mfrac> </math> <math> <mn>t2</mn> <mo>=</mo> <mfrac> <mn>t1</mn> <msqrt> <mrow> <mi>1</mi> <mo>-</mo> <mfrac> <mrow> <msup> <mn>v</mn> <mi>2</mi> </msup> </mrow> <mrow> <msup> <mn>C</mn> <mi>2</mi> </msup> </mrow> </mfrac> </mrow> </msqrt> </mfrac> </math>
使ったツールはsymphonieといい、構文定義と、解析したい文を与える と構文解析し構文木をXMLの形で出力することができます。
解析のために与えた構文定義は次のものです。
//#omit expression term-list term operator op-term math-list @ ::= ?"[ \t\n\f\r\u3000]+" @ ::= ?"//.*$" @mi ::= ?"[0-9]+\.[0-9]+" | ?"[0-9]+" @mn ::= ?"[a-zA-Z][0-9a-zA-Z]*" @mo ::= "+" | "=" | "/" | "-" | "×" / "×" | "÷" / "(÷)" | "⁢" / "*" | "±" / "±" math-list ::= {math} math ::= expression ";" expression ::= {op-term} op-term ::= operator | term operator ::= mo term ::= mn | mi | mrow | msqrt | mfrac | msup | mfenced mfenced ::= "(" expression ")" mrow ::= "{" expression "}" msqrt ::= "√" term mfrac ::= term "÷" term msup ::= term "^" term分数は÷で指示し、ルートは√で指示しています。*による掛け算は記号が 省略されます。×で×がでます。使用頻度の低い割り算÷は(÷)で現します。
Windowsで次のように実施しました。構文定義はsyntax.hnに式の文はe1.txtで出力はout.xmlに得ています。 構文定義と解析対象文をツールに与えているだけであり、解析プログラムを別途組んだりしていない事に 注目してください。
java -jar C:\jlib\symphonie.jar syntax-check -no_escape ^ -syntax syntax.hn -source e1.txt -xml -with_begin_end -out out.xml
なお、HTMLにはめ込むに当たってdisplay:blockは<math>に設定せず cssで与える形でもかまいません。下ではmath全てを 変更していますが、一般にはclass定義とすべきです。
<style type="text/css">math { display:block }</style>
この版は、可能性を軽く試しただけで本格的なものにはしていません。 しかしながらMathMLフルセット対応をしてもさほど大規模にはならないと 思います。
このツール(symphonie)はオツアンドサンズで公開されています。
WEBクライアント上で動的に変換を行う例を
WEB上で動的MathML生成:クライアントで構文解析を実行
に置きました。
オフラインで変換を行う例を
◆HTML5-MathMLを実用的にする式変換ツール
に置きました。
###
2011/5/11:
実際の数式での出現率を考え若干の修正を施しました。
・分数を÷で現す
・見えない掛け算を*で現す
・乗算×は×で現す
・割り算÷はめったに出現しないため(÷)で現す
firefox4で画面をとり直しました。
| 固定リンク