« ◆長さに関するローレンツ変換式を導く | トップページ | bat,sh,csh,ant,make注意点・メモ »

◆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を用意して あります。このバッチを動かすと、

  1. sampleIn.txtが構文解析され、
  2. 構文木がXMLの形でkekka.txtに落ち
  3. 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未対応のブラウザでは無意味な文字列が表示されます。

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 = 2 L - ab + de = 2 L - 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

なお、ここでは次の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α-ωΑ-Ω]*"
            | "&pi;"/"π" | "#MI{"~"}"
@mo       ::= "+" | "-" | "/" | "=" | "・" | "&times;"/"×" | "&divide"/"(÷)"
            | "&lt;"/"<" | "&gt;"/">"  | "&le;"/"<=" | "&ge;"/">="
            | "&InvisibleTimes;" / "*" | "&PlusMinus;"/ "±"/"+-"
            | "#MO{"~"}"
@mo.diff  ::= "&DifferentialD;"/"#D."
@mo.pSta  ::= "("
@mo.pEnd  ::= ")"
@mo.sum   ::= "&sum;"/"∑"/"Σ"/"#SUM"
@mo.integ ::= "&int;"/"#INTEG"
@mo.func  ::= "&ApplyFunction;"/"#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
/*から*/までのブロックコメントを可能にしました。

|

« ◆長さに関するローレンツ変換式を導く | トップページ | bat,sh,csh,ant,make注意点・メモ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: ◆HTML5-MathMLを実用的にする式変換ツール:

« ◆長さに関するローレンツ変換式を導く | トップページ | bat,sh,csh,ant,make注意点・メモ »