LaTeX2MathML コード Ver 0.43 ■ はじめ LateX をJavaCCで解釈するクラスと、解釈からMathMLを作るクラスの簡単な実装プログラムです。最初は簡単でしたが、多少複雑になってきました。JavaCCは分からないという人も、TeXからMathMLへ記号を変換する変換表を埋めていただけると助かります。ご連絡は桜井雅史までどうぞ。どんどん変換してテストしてください。 ■ 変更暦 2001/03/06 Ver 0.43 パッケージ名を変更「tool.」→「jp.gr.java_conf.ccs2.tool.」に変更しました。いろいろご迷惑をおかけします。 いくらかコマンド、環境の追加(結構たくさん) ギリシャ文字テーブル完成。 多少細かいバグフィクス 2001/03/02 Ver 0.42 例外処理をTeX2MathMLExceptionに統一。エラーメッセージも多少分かりやすいものに。 \mboxに何とか対応 多少細かいバグフィクス 2001/02/28 Ver 0.41 アプレットで実行できるように一部変更 サポートするTeXコマンドの追加 2001/02/28 Ver 0.4 日本語が通るようになった。(出力の文字コードのことまでは面倒を見ません) a^bc_123 のように続けて書いても a^{b}c_{1}23 として扱ってくれるようになった。(完全かどうか自信がありません。今回相当悩みました。) 行列を扱えるようになった。(\begin{array}{cc}1&2\\3&4\end{array}という形式です。完全にチェックはまだです。) LaTeXマクロが使える仕組みが加わった(テストプログラムでは今のところマクロは使えません。外部のプログラムから利用できます。) クラスの数が倍増しました 数々のバグフィクスなど 2001/01/18 Ver 0.3 名前の統一 Tex => TeX 知らないTeX命令はMathMLEntitiesを調べて、存在すればとりあえずに入れて変換し、存在しなければにいれる。これでTeXとMathMLの同じつづりが同じ記号はどうにか出るようになるけども、MathMLは文字、演算子、テキストを分けるので出来れば変換テーブルを埋めておいた方が良いような。ご意見をよろしくお願いします。 なお、変換エラーなどが TeX2MathML.getLog()で取れる。 \text〜{ } 系を追加 2001/01/17 Ver 0.2 簡単に利用できるようにTeX2MathMLクラスを作成。 タグの追加。 MathMLURI, MathML name space のプロパティー追加。 森谷さん(moritani@dream.com)のEntity.propertiesを取りこむ。ありがとうございました。 変換表関係クラスを統合。 「エンティティ宣言を使う」、「1行にまとめる」を選ぶスイッチを追加。 CCS から独立。 バグフィクスなどなど。 2001/01/15 Ver 0.1 とりあえず実装テスト版。 ■ 使い方 ・コマンドラインで遊ぶ $ java -cp tex2mathml.jar jp.gr.java_conf.ccs2.tool.tex2sdoc.math.Test ・アプレットで遊ぶ $ appletviewer test.html ・Javaから利用する Tex2MathML engine = new Tex2MathML(); String xml = engine.tanslate( "x^2+5x+6" ); ■ サポートするTeXコマンド これらは 「MathMLGreek.properties」「MathMLCharacter.properties」 「MathMLGreek.properties」「MathMLCommandHandler.properties」 「MathMLEnvironment.properties」に定義があります。 ○各種記号、ギリシャ文字 (MathMLの各文字のエンティティ名と一致すれば何とか出ます) ○sqrt{},sqrt[]{} ○displaystyle,textstyle,scriptstyle,scriptscriptstyle(適当に文字の大きさなど) ○text,textrm,textit,textbf,mathrm,mathit,mathbf (それぞれの書体) ○frac,cfrac,dfrac,tfrac (一応、displaystyle,textstyleを指定した分数) ○binom,tbinom,dbinom,cbinom ○left,right,bigl,Bigl,biggl,Biggl,bigr,Bigr,biggr,Biggr (無視:MathMLは自動的に括弧の大きさを変えるらしい) ○アクセント系, over〜(矢印など), under〜 の文字修飾系 ○stackrel, overset, underset の上下系 ○quad, qquad, "," ,> ,; ,! の空白文字 ○mbox (textに読み替え。中で$〜$が使えます。:MathMLは数式の表現なので、できればこの中で複雑な表現は勘弁してください) ○\begin{array}{〜} 〜 \end{array} (行列など。もちろん引数で各カラムの文字寄せを設定します。縦棒は出ません。) ○\begin{split} 〜 \end{split} (数式列挙) ○\begin{multiline} 〜 \end{multiline} (AMSの複数行左、真中、右寄せ) ○\begin{cases} 〜 \end{cases} (AMSの場合分け) ■ 文法概要 TeXは相当変態な文法なので、以下のように3ステップでMathMLに変形します。 まず、TeXをJavaCCの文法で処理しやすいように変形します。具体的には続き文字を無くしたりします。 次にJavaCCによって、以下のように文法を解釈してTeXの文法に沿ったツリーを作ります。(各単語の中身は文法ソースを見てください。) > expression = (term)+ > term = element ( "_" element )? ( "^" element )? > element = "{" expression "}" | expression | command | operator | number | identifier | environment > environment = "\begin{" envName "}" 〜 "\end{" envName "}" ※ここまでは、MathMLとはほとんど関係無い部分ですので、このツリーを使って、別の表現などを実装することが出来ます。 出来たツリーをビジターでトラバースしながらMathMLを構築します。 ■ ファイル 主なファイル ### jp/gr/java_conf/ccs2/tool/tex2sdoc TeXUtil.java : TeXをパースするユーティリティー ArgumentInfo.java : TeXコマンドの引数(TeXUtilで使うもの) Macro.java : マクロ MacroManager.java : マクロの管理 ### jp/gr/java_conf/ccs2/tool/tex2sdoc/math TeX2MathML.java : 変換インターフェイス(多分Beanとして使えます) TexFormula.jj : JavaCC文法 Expression.java : ツリーの各オブジェクト Term.java Element.java Content.java CommandContent.java OperatorContent.java NumberContent.java IdentifierContent.java EnvironmentContent.java TeXSourceVisitorCenter.java : トラバースするオブジェクト TeXSourceVisitor.java : ビジターの抽象クラス(インターフェイスでも可?) MathMLVisitor.java : MathMLの実装 TagUtil : タグを生成するユーティリティー(DOMを作って出力したい・・・) OutputState : タグ生成に必要な情報 MathMLCommandHandler.java : TeXコマンドからMathMLに変換してくれるもの MathMLCommandTable.java : 上のクラスをTeXコマンド名から生成 MathMLCommandHandler.properties : その生成の仕方のデータ MathMLEnvHandler.java : TeX環境からMathMLに変換してくれるもの MathMLEnvTable.java : 上のクラスをTeX環境名から生成 MathMLEnvironment.properties : その生成の仕方のデータ (jp/gr/java_conf/ccs2/tool/tex2sdoc/math/handler に各種実装があります。) Test.java : 使用例・実装テスト(tree, testという裏コマンドがあります) TestApplet.java : テストアプレット test.html : アプレットHTML MathMLTransTable.java : TeX から MathML の記号、関数などの変換 MathML(Character|Greek|Function).properties : 各種変換テーブル(未完) MathMLEntity.properties : エンティティ変換テーブル ■ 構築 JavaCCが必要です。 http://www.metamata.com/javaCC からどうぞ。現在Ver2.0が得られます。 $ cd jp/gr/java_conf/ccs2/tool/tex2sdoc/math $ javacc TeXFormula.jj $ javac ../*.java *.java handler/*.java で構築できるはずです。パッケージが「jp.gr.java_conf.ccs2.tool.tex2sdoc.math」なので、そういうディレクトリを作るか、パッケージ名を変えてください。 ■ TODO & known bug ・出力MathMLのチェック、解釈の充実 ・各変換テーブルの充実 ・DOMに対応 などなど ■ ライセンス GPLです。COPYING.txtをどうぞ。 ---- 桜井雅史 m.sakurai@cmt.phys.kyushu-u.ac.jp