◆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
/*から*/までのブロックコメントを可能にしました。
| 固定リンク


コメント