5.2 MathML
5.2 MathML
MathMLは数学,科学,その他の技術情報をWeb上で送受信したり処理したりできるように設計されています.World Wide Web Consortium (W3C)の数学専門委員会が公式に推薦している形式です.webMathematica のユーザはMathMLを使うことで多くの恩恵に浴することができます.MathMLを使って数式とテキストが混ざったドキュメントを扱ったり,webMathematica のサイトで動的にMathMLを生成したり,MathMLのエントリーメカニズムを使ってWebのブラウザに数式を入力したり,これをwebMathematica に送って計算したりすることができます.
Wolfram Researchは長年に渡り,W3C数学専門委員会の設立メンバーとして,また2000年(http://www.mathmlconference.org/2000 )と2002年(http://www.mathmlconference.org/2002 )に開催された公式MathMLコンファレンスの主催者として,MathMLの開発に関わってきました.Mathematica にはMathMLを使うためのさまざまな機能が含まれており,Mathematica のタイプセットシステムとMathMLには緊密な関係があります.
MathMLについてもっとお知りになりたい場合はWolfram Researchが提供しているWebサイトhttp://www.mathmlcentral.com もご覧ください.MathMLの進化やMathematica のような計算システムに適した数学言語の開発に関連した問題はhttp://www.mathmlcentral.com/history.html でご覧ください.
MathMLの具体的な仕組みについてはあまり興味がなく,出力でこれを使うことにのみ関心がある方は,「MathMLの生成 」と「MathMLの送信 」に関するセクションにお進みください.
5.2.1 WebのドキュメントにMathMLを埋め込む
このセクションでは数式とテキストが混ざったドキュメントの書き方を説明します.このようなドキュメントはXML形式で,MathMLとXHTML(HTMLのXML対応形式)の両方を使って書きます.webMathematica にはこれらすべてを自動的に行う関数が含まれています.ですからブラウザがどのようにMathMLをサポートしているのかに特に興味がない場合は以下は読み飛ばされて結構です.
XHTML
XHTMLはXMLのHTML対応形式で,W3Cが正式に推薦しているものです(http://www.w3.org/MarkUp ).これは,ドキュメントが有効であるためにはXHTMLの方はXMLの規則に従わなければならない点が違う他は,HTMLに大変よく似ています(このXMLの規則の一部については前のセクション で説明してあります).テキストと数式が混ざったドキュメントを使う際にはXHTMLが必要です.W3Cにはこれ以上HTMLを開発する意向はないので,いずれにしろXHTMLを使わなければならないでしょう.
下記で例示してあるXHTMLドキュメントはHTMLに大変よく似ています.異なる点は最初のXML宣言とDTD参照だけです.DTD参照はXMLパーサで入力ドキュメントが本当に有効なXHTMLであると認証するのに使われます.これはXHTML技術の有用性の一端を示しています.つまり,特定のXML形式を指定しなくてもパーサがドキュメントを検証し,タグが正しく使われているかどうか,引数の数が適切であるかどうか等の細部を確かめることができるのです.DTDの参照は必須のものではありません.しかし,ドキュメントを検証するのであればこの参照が必要になります.
<?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Basic XHTML Document</title> </head> <body> <h1>XHTML</h1> <p>This is a basic XHTML document.</p> </body> </html>
最近のブラウザは,このドキュメントを読み,あるべき姿で表示することができます.
XHTMLとMathML
テキストドキュメントに数式その他の技術表記を加える場合は,XHTMLとMathMLが両方入ったドキュメントを書くことができます.次はそのサンプルドキュメントです.
<?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN" "http://www.w3.org/TR/MathML2/dtd/xhtml-math11-f.dtd" [ <!ENTITY mathml "http://www.w3.org/1998/Math/MathML"> ]> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Basic XHTML+MathML Document</title> </head> <body> <h1>XHTML+MathML</h1> <p>Here is a math expression.</p> <math xmlns='http://www.w3.org/1998/Math/MathML'> <msup> <mi>x</mi> <mn>2</mn> </msup></math> </body> </html>
これをMathMLをネイティブにサポートするブラウザに読み込むと希望通りに読むことができます.MathMLをXHTMLに埋め込んでXHTML+MathMLドキュメントを可能にするDTDへの参照にご注目ください.
残念ながらすべてのブラウザがネイティブにMathMLをサポートしているわけではありません.Mozilla,AmayaそれにNetscapeの最新バージョンはMathMLをネイティブにサポートしていますがInternet Explorerはサポートしていません.
Internet ExplorerやNetscapeの旧バージョンでMathMLを使いたければ,プラグインを使う必要があります.これについて次のセクション で説明します.
XHTMLドキュメントとMathMLドキュメントの描画
前のセクションではMathMLをXHTMLに埋め込みテキストと数式の混ざったドキュメントを作成する方法を見てみました.また,この方法はプラグインを使わなければならないブラウザでは使えないことも説明しました.このセクションでは,より多くのブラウザで使えるドキュメントの作成方法を説明します.
プラグインを使ってブラウザでMathMLをサポートする方法では,使用している特定のプラグインに関連する特別のタグをドキュメント中で使わなければなりません.ブラウザがMathMLをネイティブにサポートしている場合は,特別なタグは必要ありません.当然のことながら,ひとつのドキュメントを各描画技術専用バージョンに書き分けたい人はいないでしょう.この解決策となるのが,XSLTスタイルシート技術を使って各ブラウザ用にドキュメントを描画前に変換する方法です.この技術を使うと自動的にプラグインが必要とする特別タグが挿入されます.この解決策を実装したXSLTスタイルシートはW3Cのメインサイトhttp://www.w3.org/Math/XSL からダウンロードできます.
次はMathMLのスタイルシートを使ったドキュメントです.
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="http://www.w3.org/Math/XSL/mathml.xsl"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Basic XHTML+MathML Document</title> </head> <body> <h1>XHTML+MathML</h1> <p>Here is a math expression.</p> <math xmlns='http://www.w3.org/1998/Math/MathML'> <msup> <mi>x</mi> <mn>2</mn> </msup> </math> </body> </html>
このドキュメントはスタイルシートがサポートしているすべてのブラウザで描画することができます.現在サポートされているのは次の通りです.
Windows
Internet Explorer 6.0(MathPlayerかtechexplorerプラグイン付き)
Internet Explorer 5.5(MathPlayerかtechexplorerプラグイン付き)
Internet Explorer 5.0(techexplorerプラグイン付き)
Netscape 7.0 PR1
Netscape 6.1(techexplorerプラグイン付き)
Amaya(表示MathMLのみ)
Mozilla 1.0以降
Macintosh
Internet Explorer 5.0(techexplorerプラグイン付き)
Mozilla 1.1以降
Linux/Unix
Netscape 7.0 PR1
Netscape 6.1(techexplorerプラグイン付き)
Mozilla 1.0以降
Amaya(表示MathMLのみ)
アップデート情報はhttp://www.w3.org/Math/XSL をご覧ください.特定の描画技術に関しては後のセクション で説明します.
スタイルシートの絶対参照を使うと,W3Cのサイトにあるスタイルシートを使ったドキュメントをあるサーバから別のサーバへ移動しても,ローカルに保存して作業を続けても大丈夫です.スタイルシートの絶対参照に関する問題として,設定の関係でInternet Explorerが警告を出したりスタイルシートを拒否したりする可能性があります(結果としてMathMLの描画は失敗します).この問題はスタイルシートへの相対参照を使い,ドキュメントと同じサーバ上にスタイルシートのコピーを置くことで解決できます.例えば,ドキュメントの書き出しを次のようにします.
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="/webMathematica/Resources/XSL/mathml.xsl"?>
これは,ドキュメントを取り出したサーバのルートと相対的な/webMathematica/Resources/XSL/mathml.xsl というURLにスタイルシートがあることを示しています.これがサーバで可能であればInternet Explorerも使うことができますが,常にサーバに最新のスタイルシートを置いておく必要があります.この方法ではドキュメントを特定のサーバから別のサーバに移動するのもさほど簡単ではなくなります.
MathMLのスタイルシートを使った上記のXHTML+MathMLドキュメントにはDOCTYPE宣言が入っていません.このためドキュメントの検証ができなくなってしまうので,これは制限事項ということになります.この他にも描画するXMLシステムに特別の実体名が認識できないという問題があります.Internet ExplorerはMathML DTDにあるすべての実体を受け入れるわけではないのでDTDはありません.解決方法は名前付きの実体ではなく数値を参照するMathMLを使うことです.
以下は⁡ という名前付きの実体を参照する例題です.
<math xmlns='http://www.w3.org/1998/Math/MathML'> <mrow> <mi>sin</mi> <mo>⁡</mo> <mrow> <mo>(</mo> <mi>x</mi> <mo>)</mo> </mrow> </mrow> </math>
次の例題では数値⁡ が使われています.推薦できるのはこちらです.
<math xmlns='http://www.w3.org/1998/Math/MathML'> <mrow> <mi>sin</mi> <mo>⁡</mo> <mrow> <mo>(</mo> <mi>x</mi> <mo>)</mo> </mrow> </mrow> </math>
任意の文字の数値的値を求めたい場合はMathematica の関数ToCharacterCode を使ってその値が生成でき,BaseForm を使って16進形式が生成ができます.例えば,アルファの大文字のunicodeの値が求めたければ,次のようにすることができます.
BaseForm[ToCharacterCode["Α"], 16]
{"391""16"}
適切な数値的値に関するより詳しい情報はMathMLのサイトhttp://www.w3.org/TR/MathML2/chapter6.html およびユニコードのサイトhttp://www.unicode.org をご覧ください.
5.2.2 webMathematica からMathMLを生成する
webMathematica アプリケーションの中にはMathMLでフォーマットするのに適した数式を含む結果を生成するものがあります.このセクションではwebMathematica でMathMLを生成し,前のセクションで説明した描画方法を利用する方法を説明します.
webMathematica のメインドキュメントには,MSPFormat のMathMLがフォーマットスタイルのMathMLForm を使ってどのように生成されるのかが説明されています.次は式expr をMathMLにフォーマットする方法です.
<msp:evaluate> MSPFormat[ expr, MathMLForm] </msp:evaluate>
MathMLにはMathMLの見え方を指定する表示MathMLとMathMLの意味内容を指定する内容MathMLという2つの形があります.MathMLには一般的な拡張メカニズムはないので,内容MathMLでエンコードできる情報量は限られています.しかし,Mathematica から生成された表示MathMLがMathematica に送り返されても問題は起りません.StandardForm やTraditionalForm のような他のフォーマットスタイルを使うこともできます.この場合は以下のようにRawMathML フォーマットタイプが選ばれます.
これは表示MathMLの生成方法を示しています.
<msp:evaluate> MSPFormat[ expr, TraditionalForm, PresentationMathML] </msp:evaluate>
以下では内容MathMLが生成されます.
<msp:evaluate> MSPFormat[ expr, TraditionalForm, ContentMathML] </msp:evaluate>
MathMLで使うツールは一般に表示と内容の両方をサポートします.
MathMLを統合した例題
このJSPの例題ではMathMLスタイルシートを使用しています.このページは実際にはJavaScriptを使うIntegrateForm.jsp とIntegrateXSLT.jsp の2つのJSPを組み合せたものです.標準的なwebMathematica の例題PlotScript.jsp とPlotScript1.jsp にかなり似ています.これらのMathML例題のソースはwebMathematica/Examples/MathML にあります.前述 のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/Examples/MathML/IntegrateForm.jsp でこのJSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).
まず最初に入力ページIntegrateForm.jsp のソースを見てみます.
<html> <head> <script> function integrate(f) { win = window.open( "IntegrateXSLT?fun=" + f.fun.value, "integrate", "toolbar=none, resizeable=yes, width=450, height=350"); } </script> <title>Integrate Tool</title> </head> <body bgcolor="#ffffff" > <h1>Integrate Tool</h1> <form action="IntegrateXSLT" method="post"> <p> Enter a function: <input type="text" name="fun" size="24" value = "<msp:evaluate> MSPValue[ $$fun, "Sin[x]^2"] </msp:evaluate>" > </p> <br/> <input type="button" value="Integrate" onClick="integrate(this.form)" /> </form> </body> </html>
これは標準的なHTMLです.入力ボタンがクリックされると入力フィールドから入力を抽出するJavaScript関数が呼ばれJSPIntegrateXSLT.jsp を呼びます.このJSPは新しいウィンドウで開かれます.下記はIntegrateXSLT.jsp の内容です.
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="/webMathematica/Resources/XSL/mathml.xsl"?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Integrate Result</title> </head> <body> <msp:evaluateKernel> <msp:evaluate> MSPPageOptions[ "ContentType" -> "text/xml"]; res = Null; If[ MSPValueQ[ $$fun], fun = MSPToExpression[ $$fun]; int = Integrate[ fun, x]; If[ Head[int ] === Integrate, int = "Unknown"]] ; </msp:evaluate> <p> Integration of a function, formatting into MathML. </p> <table border="2" rules="all"> <thead> <tr> <th>Function</th><th>Integral</th> </tr> </thead> <tr> <td align="center"><msp:evaluate> MSPFormat[ fun, MathMLForm]<msp:evaluate></td> <td align="center"><msp:evaluate> MSPFormat[ int, MathMLForm]<msp:evaluate></td> </tr> </table> </msp:evaluateKernel> </body> </html>
これはMathMLのスタイルシートを使っています.このスタイルシートはwebMathematica WebアプリケーションのディレクトリXSL にインストールされていると仮定されています.出力のコンテントタイプはtext/xmlに設定されているて,Mathematica で行う必要のある計算が行われます.
この例題がうまくいったらブラウザのメニュー項目「View Source (ソース)」を使ってみるのも面白いかもしれません.MathMLがXHTMLに自然に溶け込んでいるのが分かるでしょう.ドキュメントに各々の数式の物理的なサイズが宣言されていないことにも気付かれるでしょう.サイズはドキュメントがブラウザに実際に描画されて初めて分かるので,これは大変便利です.
webMathematica が配信する例題の実際のコードは,MathPlayerを直接使った描画方法やXHTML+MathMLの生成方法等に代るものを含むのでもう少し複雑です.しかし,上で示したMathMLスタイルシートを使うコードが最も一般的な解決策です.その他はデモのために収録したものです.
5.2.3 webMathematica にMathMLを送信する
webMathematica の例題の多くはユーザが入力できるようにXHTML形式で提供されています.これによる制限も生まれます.例えば入力は1次元のシンタックスでなければなりません.また,実際は特殊文字も使えません.また,特別なパレットを使って必要事項を入れるだけのテンプレートを入力することが望ましいことがよくあります.これらはMathematica のフロントエンドが提供する機能で,Webブラウザで使用することはできません.
Internet Explorerのような純粋なブラウザに代替入力メカニズムを提供することはできませんが,プラグインを使うとより強力な機能が使えます.これに適したプラグインのひとつにInput Controlがあります.これはWebEQのツールセットに含まれています.WebEQは動的な数学を含むWebページを作るためのツールセットです.詳しくは「付録」の「MathMLの技術 」をご覧ください.
MathML入力の例
これは入力にWebEQを使うJSPの例です.これは実際はJavaScriptを使うIntegrateWebEQ.jsp とIntegrateXSLT.jsp の2つのJSPを組み合せたものです.2番目のJSPは前の例でも使ったもので,MathMLの出力を描画します.この2つのJSPは標準的なwebMathematica の例題PlotScript.jsp とPlotScript1.jsp に極めて近く作られています.前述 のようにwebMathematica をインストールするとhttp://localhost:8080/webMathematica/Examples/MathML/IntegrateWebEQ.jsp 経由でこのJSPに接続することができます(ご自分のサーバに接続するURLはこれとは多少異なる場合もあります).この場合,ご使用のブラウザにWebEQがインストールしてあることが前提になっています.WebEQがインストールされていなければこの例題は動きません.
IntegrateWebEQ.jsp のテキストは以下をご覧ください.
<html> <head> <script> function integrate(f) { win = window.open( "IntegrateOutput?fun=" + f.fun.value, "integrate", "toolbar=none, resizeable=yes, width=450, height=350"); } </script> <title>Integrate Tool</title> </head> <body bgcolor="#ffffff" > <h1>Integrate Tool</h1> <p> Enter a function: <msp:allocateKernel> <applet code="webeq3.editor.InputControl" height=150 width=400 name="editor"> <param name="toolbar" value=", <tb><btn>SUP</btn><btn>FRAC</btn><btn>SQRT</btn> <btn>SIN</btn><btn>COS</btn><btn>TAN</btn></tb>"> <param name=eq value= "<msp:evaluate> If[MSPValueQ[$$mml], $$mml, "<math><mrow></mrow></math>"] </msp:evaluate>"> </applet> </msp:allocateKernel> </p> <br/> <form action="IntegrateXSLT" method="post"> <input type="button" value="Integrate" onClick="integrate()" /> </form> </body> </html>
これは,入力するのにXHTMLの要素ではなくWebEQが使われている点を除いてはIntegrateForm.jsp と非常によく似ています.
ここで重要な点に,IntegrateXSLT.jsp はWebEQからのMathML入力形式とその他の形式からのテキスト入力の両方を受け入れることが挙げられます.入力処理関数のMSPToExpression はMathMLとテキスト入力の両方を受け入れるので,これが可能になっています.MSPToExpression はまた引数のセキュリティチェックも行い,フィルタされていない危険なコマンドをMathematica が処理することを防ぎます.
この例題を扱うクライアントマシンはWebEQをインストールしたものでなければなりません.WebEQの入手とインストールについてはhttp://www.dessci.com/webmath/webeq/features.stm をご覧ください.この例題はWebEQアーカイブをサーバから配信するように簡単に変更できます.