{{toc}}
!概要
TeXの数式をMathMLに変換する Ruby 用ライブラリです。

!ダウンロード
*[[math_ml-0.14.tar.gz |http:./files/math_ml-0.14.tar.gz]]

!ファイル構成
\<.<<<
math_ml-0.14
├── Rakefile
├── Rakefile.utirake
├── lib
│   ├── eim_xml.rb
│   ├── math_ml
│   │   ├── element.rb
│   │   ├── latex
│   │   │   ├── builtin
│   │   │   │   └── symbol.rb
│   │   │   └── builtin.rb
│   │   ├── latex.rb
│   │   ├── string.rb
│   │   ├── symbol
│   │   │   ├── character_reference.rb
│   │   │   ├── entity_reference.rb
│   │   │   └── utf8.rb
│   │   └── util.rb
│   └── math_ml.rb
└── spec
    ├── math_ml
    │   ├── element_spec.rb
    │   ├── latex
    │   │   ├── macro_spec.rb
    │   │   ├── parser_spec.rb
    │   │   └── scanner_spec.rb
    │   ├── string_spec.rb
    │   └── util_spec.rb
    ├── math_ml_spec.rb
    └── util.rb
>>>.>

!インストール
パッケージを展開してできたファイルのうち、lib/以下のファイル・ディレクトリをRubyライブラリの探索パスにコピーしてください。

あるいは、本ライブラリを使うRubyスクリプトの方で、グローバル変数 \$: にlibディレクトリを追加してください。

0.8.0から、パッケージのディレクトリ構成が変わりました。インストール時にご注意下さい。

!使用例
サポートしているTeXのコマンドについては、[[TeX_mathml.rb]]を参考にして下さい。

!!ソース
\<.
 #!/usr/bin/ruby
 require 'math_ml'
 p = MathML::LaTeX::Parser.new
 puts p.parse('\sum_{i=1}^nf_n(x)', true).to_s
.>

!!出力結果
 <math xmlns='http://www.w3.org/1998/Math/MathML' display='block'>
  <munderover>
   <mo>&sum;</mo>
   <mrow>
    <mi>i</mi>
    <mo>=</mo>
    <mn>1</mn>
   </mrow>
   <mi>n</mi>
  </munderover>
  <msub>
   <mi>f</mi>
   <mi>n</mi>
  </msub>
  <mo>(</mo>
  <mi>x</mi>
  <mo>)</mo>
 </math>

!math_ml/string.rb
RubyのStringクラスを拡張し、LaTeX形式の数式を直接MathMLへ変換できるようになります。

!!使用例
!!!ソース
\<.
 #!/usr/bin/ruby
 require "math_ml/string"
 
 puts 'a+\alpha'.to_mathml
.>

!!!出力
 <math display='inline' xmlns='http://www.w3.org/1998/Math/MathML'>
  <mi>a</mi>
  <mo>+</mo>
  <mi>&alpha;</mi>
 </math>

!math_ml/util.rb
文字列中の数式変換部分を受け持つサブルーチンクラス MathML::Util::SimpleLaTeX を提供します。

ライブラリ本体が単に''LaTeX形式の数式''をMathMLに変換するのに対し、SimpleLaTeXは''数式を含む文書''から数式部分を取り出して変換する処理を提供します。

!コメントとトラックバック
*2006-02-14 (火) 15:38:13 kkondo : SyntaxError
*2006-02-14 (火) 15:42:15 kkondo : in `require': ./mathml.rb:803: nested method definition 
*2006-02-14 (火) 22:30:45 ひらく : ご指摘の通りメソッド定義のネストを行っているので、Ruby1.7以降が必要です(そういえば、動作環境を明記していません(汗)後で書いておきます〜)
*2006-02-14 (火) 22:31:27 ひらく : ちなみにここは、Ruby1.8な環境で使っています。ご参考までに。
*2006-03-02 (木) 16:08:51 nami : 素朴な疑問ですが、eRubyと組み合わせて使えませんかね? 
*2006-03-02 (木) 17:24:08 ひらく : なるほど。eRubyがrhtmlを実行する前にフィルタ的にMathMLへの変換をするような処理を書いたら、結構面白いものが出来るかもしれません
*2006-03-02 (木) 17:24:33 ひらく : ちなみに、tDiaryとHikiがHTMLの生成に内部でeRubyを使っているので、ある意味ではすでに組み合わさっているとも言えます
*2006-03-03 (金) 22:12:00 nami : 意図しているのは、普通のページとして<% puts MathML::convert_from_tex(...) %> と書いて使えたらいいな、ということです。もちろんeRubyが \[\]などをフックしてくれればいうことなし、です。
*2006-03-03 (金) 22:14:15 nami : eRubyが以下は「eRubyが数式モードをフックしてくれれば」です。バックスラッシュ角括弧を書いたら数式あつかいになったですかね。:-)
*2006-03-04 (土) 22:50:35 ひらく : <% puts... %>のやりかたなら、現状でもrhtmlの最初に<% require 'mathml'%>とか書いておくだけで行けるはずです。
*2006-03-04 (土) 22:51:50 ひらく : バックスラッシュ角括弧による数式化は、ライブラリを使う側でやってる処理なので、フックを追加するときにその辺も作る必要があります(逆に、好きな記法で呼び出せるという利点(?)にもなってます)
*2006-07-24 (月) 03:47:49 もりかわ : バージョン 0.5 になって、MathML::convert_from_tex('\\sum_{i=1}^nf_n(x)', true) のような使い方できなくなったんですね。p=MathML::LaTeX::Parser.new ; puts p.parse('\\sum_{i=1}^nf_n(x)', true).to_s のような使い方でOKなのでしょうか??
*2006-08-01 (火) 22:24:14 ひらく : 遅くなって失礼しました(汗 使い方ですが、MathML::LaTeX::Parser.newを作ってからparseメソッドを呼び出す方法でOKです。ページの解説も慌てて直しておきました
*2006-08-16 (Wed) 19:49:04 もりかわ : \\left, \\right 内に下付きまたは上付きの \sum を入れるとエラーが返ってきてしまいます. (例: \\left[ \\sum_{i=1} f(a+ih) \\right]")
*2006-08-16 (Wed) 19:50:33 もりかわ : すいません.. 上のは書いてる途中で間違って Enter 押してしまいました... 改めまして, \\left, \\right 内に下付きまたは上付きの \sum を入れるとエラーが返ってきてしまいます. (例: "\\left[ \\sum_{i=1} f(a+ih) \\right]"). \\sum の上付き下付きをはずしたり, \\left, \\right を消せばうまく行くのですが...
*2006-08-16 (水) 20:51:51 ひらく : もりかわさん、こんにちは。こっちでも確認しました。対処しますので、しばらくお待ちください
*2006-08-16 (水) 23:35:09 ひらく : 直してみました。動きますように・・・\[\left[ \sum_{i=1} f(a+ih) \right]\]
*2006-08-18 (Fri) 10:39:29 もりかわ : ありがとうございます.  \\left, \\right 内の下付き, 上付き文字がちゃんと表示されるようになりました.
*2006-09-14 (木) 16:45:40 tell : 初めまして.\cdotについて要望があるのですが,\cdotは中央に点を打つコマンドだと思います.ところが,実際にはcの上に点が付いた文字,"&cdot;"が出力されています.きちんとした情報をあたっていないので,断言はできませんが,これは"&#x22C5"の"Dot Operator"が出力として望ましいと思います.私の方では,SymbolCommandsテーブルを"cdot"=>[:s,:o,"0x22c5".to_i(0)]としてみましたが,いかがでしょうか?
*2006-09-14 (木) 17:04:46 tell : すみません,さっきの書き込みは,"TeXならcdotは〜"です.
*2006-09-15 (金) 00:49:37 ひらく : 初めまして、どうぞよろしくお願いします。ご報告ありがとうございました。直し方はそれであっています(ドキュメントが不足してて申し訳ないです)。僕の方では、{{ut 'http://www.w3.org/TR/MathML2/bycodes.html#U022C5'}}を参考に([[ここ|http://www.w3.org/TR/MathML2/022.html]]らへんから辿れる一覧表です)、"&sdot;"に変更しました。変更後のmathml.rbは[[こちら|https://svn.hinet.mydns.jp/trunc/mathml/]]から取得できます。
*2006-09-17 (日) 19:33:23 tell : ありがとうございます.私は文字コードだけ見て"0x22c5"としましたが,きちんとした実体名は知りませんでした.対応表の情報も重ねてありがとうございます.それとRubyでは0x〜は数値リテラルなので"〜".to_i(0)は余計ですね.
*2006-09-18 (Mon) 20:40:11 もりかわ : newcommand にも対応したのですね. 大変ありがたいです. 使い方は, 例えば上記の例で言えば p.parse よりも前に p.macro.parse('\\newcommand{..}...') などで新たにコマンドを定義してから使う, ということで OK でしょうか??  正しい使い方があれば教えていただけますと幸いです. よろしくお願いします.
*2006-09-19 (火) 17:42:40 ひらく : はい、マクロ機能の使い方はそれであっています。他にも何かありましたらお知らせください。
*2006-09-19 (Tue) 20:27:04 もりかわ : ちょっとわがままな要望です. LaTeX2e の機能で \\newcommand{\\cmd}[args][opt]{def}  と定義すると, 第1引数をオプショナルな引数 (デフォルト値は opt で, 実際に使うときにはこの第1引数のみ { } ではなく [ ] で括る) にすることが可能だったりするのですが, こういった機能に対応するご予定ありますでしょうか?  あると個人的には便利なのですが, 拡張機能ですし, やっぱり無理でしょうか??
*2006-09-20 (水) 01:52:57 ひらく : はい、予定はあります。実は最初から入れようと思っていたのですが、\\newcommandで[opt]を使う方法が分からなくて先延ばしになっていたのです(汗{{br}}9月一杯、どうしても他にすることがあるので、10月になったら実装してみる予定です。もう少しお待ちください。
*2006-09-20 (Wed) 17:27:38 もりかわ : あ、それは大変嬉しいです。楽しみにお待ちしております。
*2006-11-15 (水) 19:03:34 ひらく : 大変遅れてしまいました。非公式版なのですが、[[こちら|http://www.hinet.mydns.jp/~hiraku/tDiary/20061115.html#p01]]から、オプションパラメータが使えるようになったMathMLライブラリをダウンロードできるようになりました。手の空いたときにでも評価していただけるとうれしいです。
*2006-11-16 (木) 04:44:21 もりかわ : ありがとうございます。早速試してみたところ、期待通りに動作しました。感謝感謝です。正式版のリリースお待ちしております。
*2007-05-28 (月) 16:06:10 fs : 初めまして。$\underbrace x$などを変換すると"&UnderBrace;"となってほしいところが"&amp;UnderBrace;"などとなってしまいます。
*2007-05-28 (月) 16:27:02 fs : もし私のミスでしたらお許しください。よろしくお願いします。
*2007-05-28 (月) 16:35:29 ひらく : fsさん、はじめまして。手元で試してみたのですが、'<munder><mi>x</mi><mo>&UnderBrace;</mo></munder>'が出力されて再現できませんでした。
*2007-05-28 (月) 16:36:26 ひらく : お使いの状況をもう少し詳しく知らせてくだされば、他に何かアドバイスできるかもしれません。よろしくお願いします。
*2007-05-28 (月) 21:45:22 fs : ひらくさん,お返事ありがとうございます。サンプルソースの数式部分を変えてruby 1.8.6で実行しただけでも同様の症状が出てしまいます。rubyのインストールはmswin32版を解凍してパスを通し,MathMLライブラリを"lib/ruby/1.8"以下に置きました。
*2007-05-28 (月) 21:47:56 fs : ただ,ruby 1.9.0を試してみたらうまくいってしまいました。ひょっとして1.9.0でないとダメなんでしょうか?
*2007-05-29 (火) 00:26:29 ひらく : Windowsで問題が再現できました。多分、ライブラリからのREXMLの使い方に悪いところがあるのだと思いますが、実は今風邪をひいていて細かいところまで追及できない状態です。取り急ぎ、 http://svn.hinet.mydns.jp/trunc/eim_xml/eim_xml.rb をmath_ml.rbと同じディレクトリに入れることで回避できるので、REXMLが必要でない状況でしたらお試しください。
*2007-05-29 (火) 00:28:59 ひらく : Rubyのバージョンですが、想定しているのは1.8.4以上で、僕の手元の環境はDebian4.0でのRuby 1.8.5です(だからWindowsでの問題に気づけませんでした)。1.8.6で動かないのは想定の外のことなので、 出来るだけ早く対処したいと思います。今しばらくお待ちください。
*2007-05-29 (火) 21:41:38 fs : お教えいただいた回避法で全く問題なく使えるようになりました。お加減が悪いのにもかかわらず早々の対応誠にありがとうございました。今後ともよろしくお願いいたします。
*2007-06-02 (土) 22:21:42 ひらく : eim_xmlなしでも動くように修正した物を0.7bとして公開しました。
*2008-03-06 (木) 00:09:51 fs : ひらくさん、以前はお世話になりました。\$a'\$では$a\prime$が出せないようで、とりあえず「'」を\\primeに置換してから変換しています。
*2008-07-29 (火) 18:25:22 t-nissie(管理人代理投稿) : リクエスト:空白の「~」や「\!」を無視してほしい。
*2009-01-06 (火) 18:30:23 t-nissie : MathMLライブラリを使ったULMUL http://ulmul.rubyforge.org/README-ja.xhtml というのをリリースしました。
*2012-05-05 (土) 06:56:02 khkh : はじめまして、便利に使わせていただいております。\dddotを追加していただきたいのですが、お願いできますでしょうか?diffファイルをgistに置きました(https://gist.github.com/2597915)。
*2012-05-05 (土) 18:47:37 hiraku : はじめまして。パッチありがとうございます!生憎と、ただいま多忙でちょっと手を付けられません。19日には拝見できると思いますので、それまで保留とさせてください。どうぞよろしくお願いします
*2012-08-01 (水) 23:36:04 hiraku : 大変遅れてしまい、失礼しました。パッチ、取り込みました。gemの更新とアナウンスはまた日を改めて行いますが、[[math_ml-0.13.tar.gz |http:./files/math_ml-0.13.tar.gz]]からダウンロードできます。または、http://hg.hinet.mydns.jp/math_ml/からhg cloneできます。どうもありがとうございました!!
*2012-08-12 (日) 10:39:10 kshramt : ダウンロードして、期待通りに動くことを確認しました!お忙しいところ、ありがとうございました。gem版が楽しみです。
*2012-10-06 (土) 23:03:55 kshramt : gem版リリースありがとうございました!
*2012-10-30 (火) 09:29:04 myth : f(x)=\frac{1}{2} を変換すると括弧が単に mo になりますが,MathML 2.0 に厳格にしたがってレンダリングすると括弧の高さが 1/2 に合わせて伸びてしまいます。括弧を mrow で包むか,mfenced にする必要があるかと思います。
*2012-10-30 (火) 09:55:28 myth : -1 を変換するとマイナス部分が <mo>-</mo> のように U+002D HYPHEN-MINUS になるのですが,U+2212 MINUS SIGN になるべきではないでしょうか。
*2012-11-01 (木) 15:55:05 myth : 一つ前の件ですが,MathML 3.0 では数式コンテキストの U+002D を U+2212 としてレンダリングすることになったので,現状の動作で正しいのですね。失礼いたしました。ただ,MathML 2.0 対応のレンダラーでハイフンになるのが辛いところです。
*2012-11-04 (日) 17:22:30 ひらく : mythさんこんにちは!コメントが遅れて失礼してます。そして、重ね重ねすみません、ちょっと時間が取れないので、また来週、改めてお返事させてください(汗
*2012-11-11 (日) 17:27:42 ひらく : myhさん、コメントありがとうございました! mo要素にstretchy='false'と属性値を指定することで対処してみました
*2012-11-11 (日) 17:32:23 ひらく : ハイフンとMinusについても調べてみたんですが、手元の環境(Firefox16とIE9+MathPlayer)では<mo>-</mo>で短くなるものがありませんでした。レンダラーについて詳しくお知らせ頂けると助かります
*2015-06-19 (金) 20:28:17 sira : はじめまして.出力結果のmathタグのtitleに入力のLaTeXコードを入れるようにできませんでしょうか.
*2015-06-21 (日) 12:15:00 ひらく : siraさん、はじめまして! 変換元のLaTeXソースをどこかに入れると言うのは前からやりたかったんですが、ダラダラと引き伸ばしてました。これを機会にやってみます。ただ、入れる場所がtitleで良いのかはちょっと分からないので、その辺を調べるところから始めます。他のこともあってお時間かかりますが、気長にお待ちください。
{{comment}}

----

{{trackback}}

* trackback : [[MathMLライブラリ 0.14公開 (忘れたときに備えた記録)|http://www.hinet.mydns.jp/tdiary/?date=20121111#p02]] (2012-11-11 (Sun) 17:26:17)
""ほとんどのmo要素にstretchy='false'が入るようになりました

* trackback : [[MathMLライブラリ 0.13公開 (忘れたときに備えた記録)|http://www.hinet.mydns.jp/tdiary/?date=20120930#p02]] (2012-09-30 (Sun) 23:29:52)
""MathMLライブラリ0.13を公開しました

* trackback : [[[debian] libmathml-ruby (平衡点 -- equilibrium point --)|http://d.hatena.ne.jp/sasakyh/20101110#p2]] (2010-11-17 (Wed) 10:39:48)
"" 先日武藤さんにスポンサーしてもらって, ひらくさんが公開しているRuby用MathMLライブラリのパッケージを libmathml-ruby として upload しました. とはいえ new queue なんで, 認証されるまでもうしばらくお待ち下さい, ですね. official に入りました.unstable の場合には

* trackback : [[MathMLライブラリ 0.9を公開しました (忘れたときに備えた記録)|http://www.hinet.mydns.jp/tdiary/?date=20100606#p01]] (2010-06-06 (Sun) 19:18:55)
""0.9への更新情報

* trackback : [[MathMLライブラリ0.8.1を公開しました (忘れたときに備えた記録)|http://www.hinet.mydns.jp/tdiary/?date=20080323#p03]] (2008-03-23 (Sun) 17:19:11)
""0.8.0 および 0.8.1への更新情報

* trackback : [[変更点 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20070602.html#p02]] (2007-06-02 (Sat) 22:20:24)
""0.7b への更新情報

* trackback : [[[更新] MathMLライブラリ、Hiki&tDiary XHTML化キット 更新のお知らせ (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20070522.html]] (2007-05-22 (Tue) 17:00:00)
""0.7a への更新情報

* trackback : [[[更新] MathMLライブラリ 0.7 を公開 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20070507.html]] (2007-05-06 (Sun) 18:35:00)
""0.7への更新情報

* trackback : [[[更新] MathMLライブラリ 0.6b を公開 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20060903.html]] (2006-08-31 (Thr) 16:50:26)
""0.6bへの更新情報

* trackback : [[[更新] MathMLライブラリ 0.6a を公開 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20060830.html]] (2006-08-30 (Wed) 22:27:09)
""0.6aへの更新情報

* trackback : [[[更新] MathMLライブラリ 0.6 を公開 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20060823.html]] (2006-08-23 (Wed) 15:57:28)
""バージョン0.6 への更新情報

* trackback : [[[更新] MathMLライブラリ 0.5a を公開 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20060816.html]] (2006-08-16 (Wed) 23:33:17)
""0.5a への更新情報

* trackback : [[[更新] MathMLライブラリ 0.5 を公開 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20060712.html#p01]] (2006-07-12 (Wed) 15:00:07)
""0.5 への更新情報

* trackback : [[機能追加 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20060517.html#p03]] (2006-05-17 (Wed) 12:58:47)
""0.4への更新情報

* trackback : [[バグ修正 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20060202.html#p02]] (2006-02-02 (Thr) 16:28:52)
""0.3への更新情報

* trackback : [[[更新] MathMLライブラリ 0.2 を公開 (ひらくの工房)|http://www.hinet.mydns.jp/~hiraku/20060101.html]] (2005-12-30 (Fri) 03:48:12)
""0.2更新情報