◆HTML5-MathMLを実用的にする式変換ツール
MathMLはHTML5で導入される数式表示機能です。

MathMLに与えるXML記述は余りにも複雑で人間が直接書くのは現実的でありません。 実行例にXMLの例を載せています。
◆長さに関するローレンツ変換式を導くで数式を使うに当たり、 オフラインでMathML記述を生成する 方式をとりました。
MathML用XMLを簡便な数式から生成するツール(オフライン版)
実際に使用したセットをzipにまとめ mathML_conv.zipに置きました。
汎用の構文解析ライブラリ/コマンドsymphonie.とMathML生成用
数式構文定義sampleSyntax.hnで構成されています。
数式記述はsampleIn.txtにあります。
構文解析コマンドを起動するバッチAA10_build.batと
シェルスクリプトAA10_build.shを用意して
あります。このバッチを動かすと、
- sampleIn.txtが構文解析され、
- 構文木がXMLの形でkekka.txtに落ち
- kekka.txtの前後にHTMLの飾りが付けられsample.htmlになる
sample.htmlをfirefoxで見ると成型された数式が見られます。
firefoxは設定が必要です。about:configにアクセスし、html5-enable をtrueにしてください。HTML5,MathMLを使ってみる参照
バッチの内容は次のようなものです。
@echo off java -jar ./symphonie.jar ^ syntax-check -syntax sampleSyntax.hn -source sampleIn.txt ^ -xml -with_begin_end -no_escape -out kekka.txt ^ 2>err.txt if errorlevel 1 goto ERR copy html_1.txt+kekka.txt+html_2.txt sample.html echo ====== DONE output: kekka.txt,sample.html ====== goto END :ERR type err.txt echo =========== SOME ERROR OCCURED ========== :END pause
実行例
次の数式から
ab = L*{ab÷ac} = L*{ab÷{bc+ab}} = L*{{v*t1}÷{C*t1+v*t1}} = L*{v÷{C+v}}; de = L*{de÷cd} = L*{de÷{ce-de}} = L*{{v*t2}÷{C*t2-v*t2}} = L*{v÷{C-v}}; be = 2L-ab+de = 2L-L*{v÷{C+v}}+L*{v÷{C-v}}= L*(2-v÷{C+v}+v÷{C-v}); =L*(2-{v*(C-v)}÷{(C-v)*(C+v)}+{v*(C+v)}÷{(C-v)*(C+v)}) =L*(2-{v*C-v^2}÷{C^2-v^2}+{v*C+v^2}÷{C^2-v^2}); =L*(2+{-(v*C)+v^2+v*C+v^2}÷{C^2-v^2}) =L*(2+{2*v^2}÷{C^2-v^2}) =2*L*(1+{v^2}÷{C^2-v^2}); =2*L*({C^2-v^2}÷{C^2-v^2}+{v^2}÷{C^2-v^2}) =2*L*{{C^2}÷{C^2-v^2}} =2*L*{1÷{1-{v^2}÷{C^2}}}; be÷ad=be÷{2*L}=1÷{1-{v^2}÷{C^2}}=(1÷√{1-{v^2}÷{C^2}})^2; be÷ad= {γ*X}÷(X/γ)=γ^2=(1÷√{1-{v^2}÷{C^2}})^2; γ=1÷√{1-{v^2}÷{C^2}} // ÷は分数、*は表示しない掛け算、^は累乗、{...}は範囲です。範囲は例えば // 分数の分子がどこからどこまで、分母がどこからどこまでかといったことを // 指定するのに用います。
次の画面を得ることができます。

生成されたMathML記述をこのHTML上に置くと次のようになります。MathML未対応のブラウザでは無意味な文字列が表示されます。
なお、ここでは次のcss記述をしてあります。
<style type="text/css">math { display:block }</style>
入力の数式から生成されるMtahML用XMLは次のものです。
ツールが無ければこれだけの記述を人間が行うことになります。
記述法
現時点で用意されている記述法は、四則、分数、ルート、累乗、 総和、微分、不定積分、定積分などです。
// 単純四則演算と等号。割り算÷は括弧を付ける x=a+b×c/d-e(÷)f; // 掛け算の省略 * または ⁢ x=2*a+b*c; // 分数と範囲 ÷ { ... } x÷y+{a+b}÷{c-d}; // 括弧(範囲指定にもなる) a÷(b-c); // 自乗根 √ または #SQRT または &sqrt; √a+√{b-c}+√(d-e); // 累乗 元値 ^ 累乗 a^b+x^2*y^2+(y+z)^{2*n}; // 累乗根 #ROOT[元値、n乗] #ROOT[a-b,2*n]; // 関数 関数名 #F(a,b...)で関数引数 f#F(a,b); // 下添え字 #[a,b]で添え字b付きのaになる #[X,2]; // 総和 #SUM[開始値、終了値] 式 #SUM[i=1,5]#[K,i]; // 微分 #D.名前で微小記号が名前に付加される #D.y÷#D.x; // 不定積分 #INTEG 式 #D.変数 #INTEG(x^2+x)#D.x; // 定積分 #INTEG[開始値、終了値] 式 #D.変数 #INTEG[0,π]cos#F(x)#D.x; // ベクトル #VECT[x,y...] 2*#VECT[a*x,y,√z]
この記述で生成される画面が冒頭の数式です。
式の定義法は色々考えられます。例えばtex/latexなどのように複雑な
制御語で行うこともできますが、ここでは可能な限り本来の
数式に近い形で表現できるように定義しています。
長い経験からいって特に修練しなくても式が分かる
形こそ望まれるものだと考えています。
とはいえlatex形式の入力を可能とすることは容易です。
構文定義とsymphonie汎用構文解析ライブラリ/コマンド
ここで使用した構文解析ライブラリ/コマンドsymphonieは汎用の構文解析 ツールで、特にMathML用に作られたものではありません。
MathML用に使用できるのはMathML変換用の構文定義を与えているからです。 構文定義は次のものです。
//#omit expression term-list term op-term math-list //#omit mrow_0s function paren func integ vect @ ::= ?"[ \t\n\f\r\u3000]+" @ ::= ?"//.*$" // line comment @ ::= "/*" -> com // block comment start @com: ::= "*/" -> 0 // block comment end @com: ::= ?"." // in block comment @mn ::= ?"[0-9]+\.[0-9]+" | ?"[0-9]+" | "#MN{"~"}" @mi ::= ?"[a-zA-Zα-ωΑ-Ω][0-9a-zA-Zα-ωΑ-Ω]*" | "π"/"π" | "#MI{"~"}" @mo ::= "+" | "-" | "/" | "=" | "・" | "×"/"×" | "÷"/"(÷)" | "<"/"<" | ">"/">" | "≤"/"<=" | "≥"/">=" | "⁢" / "*" | "±"/ "±"/"+-" | "#MO{"~"}" @mo.diff ::= "ⅆ"/"#D." @mo.pSta ::= "(" @mo.pEnd ::= ")" @mo.sum ::= "∑"/"∑"/"Σ"/"#SUM" @mo.integ ::= "∫"/"#INTEG" @mo.func ::= "⁡"/"#F" math-list ::= {math &";"} math ::= expression expression::= {op-term} op-term ::= mo | term term ::= mn | mi | mrow | msqrt | mfrac | msup | msub | mroot |vect | integ | func | mrow.paren | munderover.sum | mrow.diff mrow ::= "{" expression "}" msqrt ::= "√" term | "&sqrt;" term | "#SQRT" term mfrac ::= term "÷" term msup ::= term "^" term mroot ::= "#ROOT" "[" mrow.0 "," mrow.0 "]" mfenced ::= "[" mrow_0s "]" mrow_0s ::= { mrow.0 &","} mrow.0 ::= expression msub ::= "#[" term "," term "]" vect ::= "#VECT" mfenced integ ::= mo.integ mrow.integ | msubsup.integ mrow.integ func ::= mi mo.func "(" mrow_0s ")" mrow.paren ::= mo.pSta expression mo.pEnd mrow.diff ::= mo.diff mi munderover.sum ::= mo.sum "[" mrow.0 "," mrow.0 "]" msubsup.integ ::= mo.integ "[" mrow.0 "," mrow.0 "]" mrow.integ ::= mrow.0 mrow.diff.0 "," mrow.0 "]" mrow.integ ::= mrow.0 mrow.diff
symphonieはオツアンドサンズで公開されています。
仕様などはこちらをご覧ください。
http://www.otsu.co.jp/OtsuLibrary/index.htm
本記事のサンプル mathML_conv.zip には、簡便化のためにsymphonie.jarを入れてありますが、 オツアンドサンズからダウンロードしなおすことを お勧めします。
WEBクライアント上でHTML表示時に変換するツール
本来はhtml上に直接簡便な数式を記述し、それが自動で変換され
表示されるべきです。
これに関して、
WEB上で動的MathML生成:クライアントで構文解析を実行
に記事を書いてあります。
###
2010/10/27
構文定義を少し変えました。
*掛け算としての"・"をmo定義に追加
*関数定義を#F[...,...]から#F(...,...)に変更
2011/5/11
より式として把握しやすいよう構文定義を少し変えました。
・分数を%から÷に変更
・表示しない掛け算を@から*に変更しました。
・乗算×は×としました
・除算÷は(÷)としました(あまり使われることがないため)
数式画像をfirefox3のものからfirefox4のものに変えました。ルート
の前垂れがきちんと下まで伸びるようになりました。
2011/11/4
/*から*/までのブロックコメントを可能にしました。
| 固定リンク
コメント