数理解析研究所講究録
第 1572 巻 2007 年 142-155

142

MathML ライブラリの開発と今後の展開について
黒田拓
KURODA HIRAKU*北海道大学大学院理学院数学専攻
DEPARTMENT OF MATHEMATICS, HOKKAIDO UNIVERSITY

1

MathML ライブラリの概要

本ライブラリは BIffl の記法に従って記述された数式を MathML[3] に変換する処理を提供するものである。オブジェクト指向スクリプト言語 Ruby[6] によって作成されており、変換処理そのものを提供する
math.ml.rb と、 ライブラリの使用を簡単にするための補助モジュールで構成されている。

1.1

math-ml. rb

1.1. 1math.$n1$ .rb で定義されるクラス
math-nl.rb では、 F 炸禾の記法に従って記述された数式をあらわす文字列 (以下、単に [BIffl 入数式」とする) を MathML に変換する為に、以下のクラスが MathML モジュール内に定義されている。

MathML の各要素に対応するクラス
MathML: :(Illement クラスを基底クラスとして、 mn 要素に対応する MathML: :Number クラス、 mi 要素に対応する MathML: :Identifier クラスなどがある。 IAf 禾数式からの変換結果に使用される要素に対応するクラスだけが用意されており、 全ての要素に対応するクラスが揃っているわけではない。 MathML の
いくつかの要素がその内容として他の要素をとることが出来るように、 これらの要素クラスのインスタン

スも他の要素クラスのインスタンスを内容としてとることが出来る。
これらのクラスのインスタンスから、 MathML: : $XMLElement*to_{-8}$ メソッドによって MathML の文字列を得ることが出来る。

以下は、 これらのクラスによって MathML を生成する例である。
$\#!/usr/bin/ruby$require

mm
nl

n2

.
.

$=$

frac

$\prime math_{-}m1$ “MathML: : Math. new(false)

MathML: : Number. new $<<$ “ 1.

MathML: ; Number. new $<<$ “ 2”MathML: : Frac. new(nl, $n2$ )birakuQmath.sci. hokudai. u.jp

143

am

frac

$<<$

puts mm. to-s
ここでは、 Matv 化::Number クラスの 2 つのインスタンスによって分子の 1 と分母の 2 をあらわす要素を作り、 それを MathML: :Frac のパラメータとして与えることで mfrac 要素を作成している。更にそれをMathML: :Math クラスのインスタンスに内容とすることで、 最終的な MathML を作成している。
このスクリプトを実行すると次の MathML が得られる。
mlns$<math$$\cdot$http: $//www.w3.org/1998/Math/MathML$ ‘ disPlay- inline’ $><mfrac>$$<mn>1</mn>$$<mn>2</nn>$$</mfrac></math>$

実際の変換処理では、与えられた『Iffl 数式に従ってこれらの要素クラスのインスタンスの集まりを作成していく。

以下に挙げる建炸入数式から MathML への変換処理を行う為のクラスは、 Matv 化モジュール内のMathML; ;LaTeX モジュール内で定義されている。

MathML: : $LaIbX:$ : Scanner

BIffl 数式の読み取りを補助するクラスであり、 Ruby の標準添付ライブラリである Str $ingScanner$ ク

ラスのサブクラスである。処理中の文字列が『炸\mbox{\boldmath $\lambda$} 数式を構成する要素 (英数字または記号 1 文字、 で始$\backslash$

まり複数の文字からなる命令、 .. で囲まれた複数の要素) のいずれであるかを判定したり、 ひとまとめに取り出すメソッドが用意されている。
$\{$

$\}$

Mat $hML$ : : $LatRX$ : : Macro

WIffl のマクロである$\backslash newcommand$

命令や\newenvironment 命令を処理するクラスである。マクロによって定義される新しい命令や環境の名前と、その内容とを保持し、与えられたパラメータと組み合わせて
既存の BIffl 数式に展開する処理を提供する。

MathML: : $LabX$ : : Parser

BIffl 数式から MathML への変換を実際に行う処理を提供するクラスである。 このクラスのインスタン
スは Matv 化::LaTeX::Nacro クラスのインスタンスを 1 つ保持しており、 これに必要に応じてマクロを登録した上でソースとなる『炸入数式を与えると、変換結果となる MathML を Matv 化::Math クラスのインスタンスとして返す。

具体的な使用方法は以下のようになる。
$\#!/usr/bin/ruby$require $||math_{-}m1$ “$1p\cdot t$

MathML: : $LaTeX$ : : Parser. new

lp. macro. parse $(‘ \backslash newcomand\{\backslash R\}\{\backslash mathbb\{R\}\} ‘)$
lp. macro. par se $(‘ \backslash newcomand\{\backslash cbrt\}[2][3]\{\backslash sqrt[*1]\{\# 2\}\}‘)$$m$
lp. parse.

$(‘ \backslash cbrt\{\backslash fracl2\}\backslash in\backslash R’)$.

puts $m$ to-s

144

MathML: : $LaTeX$ : : Parser クラスのインスタンスを作成し、 マクロ $\backslash newcommand\{\backslash R\}\{\backslash mathbb\{R\}\}$ と$\backslash newcommand\{\backslash cbrt\}[2][3]\{\backslash sqrt[\# 1] \{\# 2\}\}$ を登録した上で、数式をあらわす $\theta\Psi$ 数式$\sqrt[S]{\frac{1}{2}}$の変換を行っている。
このスクリプトは以下の MathML を出力する。

$\backslash cbrt$$\backslash cbrt\{\backslash fracl2\}\backslash in\backslash R$$<math$mlns$\cdot$命令では、 オプションパラメータを使用している。

http: $//www.w3.org/1998/Math/NathML$ ‘ $display=$ inline‘$>$$<mroot>$$<mrow><mfrac>$$<mn>1</mn>$
く mn$2</mn>$$</mfrac></mrow>$
く mn$>3</mn>$$</mroot>$

く mo>&in; $</mo>$$<mrow><nrow><ni>lRopf$ $;</mi></mrow></mrow>$$</math>$その他

他に、エラー処理の為の例外クラスや、処理に使用する定数を定義したモジュールなどが Matv 化モジュール内で定義されている。

1.1.2

MathHL: : $LaTeX$ : : Parser クラスが扱う $BI\Re$ 数式

mat\sim ml. 施が提供する変換処理では、 以下の $B7g$ 数式を扱うことが出来る。
数式構造をあらわす命令、 記法$\backslash sum_{-}a^{-}b$や\int a^b といった上付き、 下付きの記法、分数を表す\frac

命令、根号をあらわす\sqrt、行列などに用いられる array 環境や matrix 環境などを扱うことが出来る。 array 環境では罫線なども巡 Ifflx と同様の記法で問題なく使用できる。
フォント切り替え $\backslash mathitffi$、$\backslash mathrm$

命令、 $\backslash mathbfffi*$、$\backslash mathbb$\Re fi を使うことでフォントの切り替えを行うことが出来る。

などのギリシャ文字や\sum などの演算記号などを始めとして、 BIffl 標準の記号命令のsymb パッケージと am8 font8 パッケージで定義されている記号命令を使うことが出来る。
これらの命令は聾 W のソースファイルからスクリプトによって自動的に抽出され、 math-ml.rb に組み込まれている。

各種記号$\backslash alpha$

他に amg113

変換処理の拡張できる MathML:: $LaTeX$ : : Macro
本ライブラリでは前述した通り Mathm.: : $LaTeX$ : : Parser#macr。メソッドによって$\backslashnewcomand$
命令によるマクロを登録して使用するこ命令や\newenvironment
クラスのインスタンスに、とが出来る。 BBXX と同様にオプションを使用することも出来る。
また、既存の命令や環境の組み合わせで表現できない数式を記述して MathML に変換するために、独自の命令や環境の変換処理そのものを Ruby で作成して Mat\kappa 化:LaTeX::Paraer の変換処理に追加することが出来る。
$S_{d}’\Re$145

次の例では立方根をあらわす\cbrt 命令の変換処理を直接作成し、 MatUL: :LaTeX::Parser のインスタンスに登録して使用している。
命令自体は、 $\backslash newcommand\{\backslash cbrt\}[1]\{\backslash sqrt[3]\{*1\}\}$ といったマクロで定義できるが、 これを Ruby によって直接変換するためのスクリプトは、 ライブラリが提供するメソッドによって以下のように記述できる。
$\sqrt[3]{}$$\backslash cbrt$$\#!/usr/bin/ruby$require$|math_{-}m1$ ”

module CubeRootdef cmd-cbrt
MathML: : Number. new

cb

cb く<
$r$

$\prime\prime 3^{l}$’

MathML: : Root. new (cb, parse-any)

end

end

MathML: : LaTeX: : Parser. newlp. add-plugin (CubeRoot)
lp. add-commands (” cbrt ”)$1p$

puts lp. parse $(‘ \backslash cbrt\{x\}‘)$ . to-s
MathML: : Root.new ( $cb$ , parse-any) では、 nroot 要素の 1 つ目の子要素 (何乗根であるかを表す数
式) として $<mn>3</mn$>を指定し、 2 つ目の子要素 (根号の中の数式) に MathM: :LaTeX: : parser 噸 arSo-any$r\approx$

メソッドで得られた数式を指定している。 MathM: :LaTeX::parser $*pIE\{e_{-}any$ メソッドは、変換元となる
淳炸 X 数式の処理中の命令の後に続く『炸入数式の任意の要素を 1 つ MathML に変換したものを返すメ
ソッドである。

これを実行すると、次の出力が得られる。
$<math$mlns$\cdot$http: $//www.w3.org/1998/Math/MathML’ display\approx$ inline’ $><mroot>$$<mrow><mi>x</mi></mrow>$$<mn>3</mn>$$</mroot></math>$

1.2

補助モジュール

本ライブラリには、 変換処理の呼び出しを補助するために、以下の 2 つのモジュールが用意されている。

1.2.1$MathML::String$ モジュールによる String クラスの拡張

Matv 化::String モジューノレは、 Ruby の組み込み文字列クラスである String クラスを拡張し、『炸禾
数式を直接 MathML へ変換する機能を提供する o require $math_{-}m1/string’’$ としてモジュールの読み込みを行うだけで、 Ruby の String クラスに to-mathml メソッドが追加され、 BIffl 数式の文字列を直接MathML に変換できるようになる。以下がその使用例である。

146$\#!/usr/bin/ruby$require $\uparrow|math_{arrow}m1/string^{1}$puts$‘\backslash fracl2$‘. to-mathml. to-8

Natv し::LaTeX::Parser のインスタンス作成などを行うことなく、 F 炸入数式の文字列から直接 MathMLへの変換を行っている。 出力は以下の通り。
$<math$mlns$\cdot$http: $//www.w3.org/1998/Math/MathML$ ‘ $display-$ inline’ $><mfrac>$$<mn>1</mn>$
く$mn>2</mn>$$</mfrac></math>$

String#to-mathml メソッドでの変換に使用する MathML: : $LaTeX$ : : Parser クラスのインスタンスは、して String#to-mathml
Mathffl.: : $String\#mathm1_{-}1atex_{-}parser$ メソッドにより参照できる。例えば、マクロを$\ovalbox{\tt\small REJECT}$の変換でそのマクロを使うためには、 以下のように処理する。
$\#!/usr/bin/ruby$require $math_{-}m1/string’$ ’
MathML: : String. $mathm1_{-}1atex_{-}parser$ . macro. parse $(’\backslash newcommand\{\backslash R\}\{\backslash mathbb\{R\}\}‘)$‘. to..mathml
puts ‘
$x\backslash in\backslash R$

MathML: : String. $mathm1_{-}1atex_{-}parser$ メソッドにより、 String#to-mathml でのクラスのインスタンスを参照し、 マクロを登録している。 出力は以下の通り。
$<math$mlns$\cdot$http: $//www.w3.org/1998/Math/MathML$ ‘ disPlay$\cdot$に側肩する HathHL: : $LaTeX$ : : Parser$\nu$

inline’$>$$<mi>x</mi>$く mo>&in; $</mo>$$<mrow><mrow><mi>lRopf:</mi></mrow></mrow>$$</math>$1.2.2$MathML::Util::SimpleLa$ TeX クラス

MathML:: $LaTeX$ : : $Par\epsilon er$ クラスが提供する変換処理は闘瞬数式のみからなる文字列を MathML に変換するものである。 しかし、実際のプログラムでは F 炸入数式を含む文書が対象となることが多く、 その場合は変換に際して以下のような手順を踏む必要がある。

1. 文中から $BBX$ 数式を抽出

2. 抽出した数式を MathML に変換

3. 変換結果である MathML を元の文に戻す

また、元の文書自体に何らかの加工を行う場合も多く、その際は文書の加工に『珈禾数式や変換後の MathMLを巻き込まないように配慮する必要がある。

このような『昨入数式を含む文書に対して、数式は MathML へ、本文は他の形式へ変換する場合に、数式と本文とを切り分けて処理するためのクラスが Matv 化::Util: :SimpleLaTeX である。
このクラスに関しては後述の HikiDoc との併用で解説する。

147

2

MathML ライブラリの応用

21

ワンライナーでの利用

MatUL: :String による String クラスの拡張を使うことで、『炸入数式から MathML を得るプログラ
ムを 1 行で作成することが出来る。

例えば、コンソールで次の通りに入力することで、標準入力から入力された翌 Ip 数式を 1 行ずつ MathMLに変換するプログラムとして動作する。
$”$/libmathml/$

ruby $-rmath_{-}m1/stringarrow e$$<. $each$ { $|_{S}|putss$ . to-mathml} “$f(x)\cdot ax^{-}2+bx+c$$<math$xmlnsm ‘http: $//www.w3.org/1998/Math/MathML$ ‘ disPlay$\cdot$inline’$>$$\Phi i>f</mi>$く mo $>(</mo>$く mi $>x</mi>$く mo $>$ ) く/mo $>$$<mo>-</mo>$$<mi>a</mi>$$<msup>$く mi $>x</mi>$
く mn $>2</mn>$

く/m\epsilon up$>$$<mo>+</mo>$く mi $>b</mi>$$<mi>x</mi>$$<mo>+</mo>$$<mi>c</mi>$$</math>$

2 行目はプログラムに入力する膣炸禾数式であり、 その次の行は入力した$\mathbb{E}Iffl$

数式を MathML に変換したものである。

2.2

HikiDoc との併用

HikiDoc[4] はいわゆる Wiki の記法に従って記述された文書を HTML や XHTML に変換する整形プログラムであり、 “かずひご” 氏によって作成された。例えば、 以下のようなスクリプトで使用する。
$\#!/usr/bin/ruby$require $ttmath_{-}m1/uti1$ “require “hikidoc”.

$<. readputs HikiDoc. to-html (txt)txt

これは起動時に指定したファイルからソースとなるテキストを読み込み、 それを HTML に変換するスクリプトである。 ソーステキストには次のような内容を適当な名前のファイル名をつけて作成する。

148

lHikiDoc のサンプル

文章は空行で区切ることで段落が改められる。
箇条書きは、 次のように行頭に*をつける事で記述できる。
$*iteml$$*item2$$**item2-1$

このテキストファイルを test. txt という名前で保存し、 スクリプト自体は hd.rb という名前で作成していた場合、 コンソールから次のようにして変換を実行できる。

\sim /work/$ hd. rb test. txt$<h1>llikiDoc$ のサンプル $</h1>$<p>文章は空行で区切ることで段落が改められる。く/p$>$<p>箇条書きは、 次のように行頭に*をつける事で記述できる。 $</p>$$<u1>$$<1i>$ iteml $</1i>$$<li>item2<ul>$$<li>item2-1</li>$$</ul></li>$$</u1>$

2 行目以下が変換結果の出力である。

このように作成したスクリプトを『炸入数式に対応させる場合、次のように変更してMathm: : Utll: :SimpleLaTeXを使用する。
$\#!/usr/bin/ruby$require $\uparrow math_{-}m1/uti1$ ”
require $1|hikidoc’’$txt$<. read

$-$

.

.

MathML: : Util: : SimpleLaTeX. new $(: delimiter^{a}> " Q")$
encoded, data
sl. encode (txt)
sl

html

$\cdot$IlikiDoc. to-html (encoded)

puts sl. decode (html, data)
このスクリプトを使用して、 次のテキストファイルを処理する場合を考える。

1 数式混じりの文書
方程式$u^2+\ltimes \div \sim O$の解は公式$\backslash [$$x-\backslash f$rac$\{-b\backslash pm\backslash sqrt\{b^{-}2-4ac\}\}\{2a\}$$\backslash ]$により得られる。

149

まず、 MathML: : Util: : SimpleLaTeX $\#encode$ メソッドにより、 数式が抽出されて次のように置き換えられる。

!数式混じりの文書
方程式 QmO\copyright の解は公式\copyright dO\copyrightにより得られる。

数式部分が\Phi で囲まれた短い記号列に置換されており、 これは変数 encoded に代入されている。 また、抽出された聾炸入数式を MathML に変換したものが変数 data に格納される。
元の文字列ではなくこの encoded を HikiDoc#to-html メソッドに与えて変換を行うと、 次の XHTMLが得られる。

<hl>数式混じりの文書 $</h1>$<p>方程式舳 OS の解は公式\Phi dO\copyrightにより得られる。 $</p>$
最後に、MathML::Util: : impleLaTeX$*decode$ メソッドによって MathML を戻すことで最終的な MathML
を含む XHTML 文書が得られる。
$S$く hl>数式混じりの文書 $</h1>$
く p>方程式く math mlns http $://www.w3.org/1998/Math/MathML$$display\Leftrightarrow$$\cdot$$<mi>a</mi>$$<msup>$$<mi>x</mi>$
く$mn>2</mn>$$</msup>$$<mo>+</mo>$$<mi>b</mi>$$<mi>x</mi>$$<mo>+</mo>$$<mi>c</mi>$$<mo>\cdot</mo>$

く nn $>0$ く/mn $>$く/math>の解は公式$<math$imlns$\cdot$http: $//www.w3.org/1998/Math/MathNL$$<mi>x</mi>$
く$mo>\approx</mo>$$<mfrac>$$<\bm{u}row>$

く mo $>-</mo>$$<mi>b</mi>$く mo $>bpm_{1}\cdot</mo>$$<msqrt><mrow>$$<msup>$disPlay$\cdot$block’$>$

inline‘$>$150$<mi>b</mi>$$<mn>2</mn>$$</msup>$
く mo $>-</mo>$$<mn>4</nn>$$<mi>a</mi>$
く mi $>c</mi>$$</mrow></msqrt>$$</mrow>$$<mrow>$$<mn>2</mn>$
く mi $>a</mi>$$</mrow>$$</nfrac>$$</math>$により得られる。 $</p>$

2.3

RubyOnRails での利用

Ruby on Rmlk8[1](以下、 ‘Rails’) は、 リレーショナルデータベースと Ruby との組み合わせで Web アプリ
ケーションを作成するために開発されたフレームワークである。
Rails が出力するページデータは XHTML であるので、簡単な修正で MathML を含む XHTML に変更できる。 これに MathML ライブラリと組み合わせることで、数式を含む文書を MathML によって扱う Web
アプリケーションを作成することが出来る。
本節では「数式メモ帳」 とでも言うべき簡単なアプリケーションの作成を通して、 Rails で MathML ラ
イブラリの使用する際の注意点をまとめる。

2.$.1

準備

まず、作成するアプリケーションのプロジェクトを作成する。

\tilde /$ rails math-memo“/$ cd math-memo

プロジェクトを作成する際に使用するデータベースの種類などを指定する場合は、 rai18 コマンドに必要に応じてパラメータを与えればよい。
次に、 メモ帳のモデルを定義する。今回作成するモデルは、 単純にメモの内容のみを持つものとする。
$script/generate$ コマンドで雛形を生成し、“‘/math-mano$$./script/generate$ model Memo

ついで、 $db/migrate/0Ol$ -createnemos.rb を以下のように編集してモデルが持つデータを定義する。

class CreateMemos
def self. up$<$

ActiveRecord: : Migration

151

create-table : memos do $|t|$. column : brief, : text
$t$

end
end

def self. down

drop-table : memos
endend

定義したデータ構造をデータベースに反映し、 Web ページからデータを操作する為の雛形を作成する。
$-/math_{-}memo$

rake db:migrate\tilde /math-memo$ $./script/generate$ scaffold Memo Memo
ここまでで既に、 テキストデータを作成・保存・編集する Web アプリケーションが出来上がっている。
“‘/math..memo$ $./script/server$とすることでテスト用の Web サーバーが起動するので、Web ブラウザで http://192. 168. 11. $100:3000/memo$にアクセスすれば (192.168.11.10\sim はプロジェクトファイルを保存しテスト用のサーバーを起動している
ホストの IP アドレス) メモの作成画面を見ることが出来る。

2.3.2

MathML ライブラリの追加作成した Rails アプリケーションから MathML ライブラリを利用するためには、 math-ml.rb および
mathJl/ディレクトリ以下のファイルを lib/ディレクトリに配置すればよい。配置後は以下のようになる。
lib
$|--$

math-ml$\backslash --$$|$$\backslash -rightarrow$util. rbmath-ml. rb

このように配置すると、 rails からは require ”math-ml などの宣言無しに MathML ライブラリを使用することが出来る。

2.3.3

出力されるデータの形式

Rails が生成するページデータは基本的に XHTML であるが、 ドキュメントタイプとして MathML が使
えない XHTML のみのものが指定されており、 HTTP のレスポンスヘッダで指定される Content-Type も$text/html$ であるため、 MathML をページ中に含めるためにこれらを変更する必要がある。

ドキュメントタイブは app/view6/1ayouts/ディレクトリに保存される.rhtml ファイルで宣言される。

今回は $app/views/layouts/memo$ .rhtml を次のように修正し ‘ XHTML に MathML を併用できるように
する。

152

version $=1.0^{||}?>$$<1DOCTYPE$ html PUBLIC$<?zml$$<html$$|-//W3C//DTD$ XHTML

1. 1 plus MathML 2. $0//EN$$||http://www.w3.org/Math/DTD/math$xmlns $=||http;//www.w3.org/1999/xhtml$ “ xml: $1ang\cdot||ja^{lI}>$$<head>$$<metahttp-equiv\cdot\prime content$ -type”content$\cdot$$text/html;char\epsilon et\cdot UTF-8^{\dagger 1}/>$

controller. action-name $/|></title>$$</..styleshe\circ t_{-}1ink_{-}tag$ ‘ scaffold’$<title>Memo:</|^{\epsilon}$$|/>$$</head>$$<body>$

style

$<p$

$<^{1}/.=$$\cdot$yield$\dagger color$.

: green“ $></.$ flash [: notice]$/_{l}></p>$$/.>$$</body>$$</htmZ>$

レスポンスヘッダの Content-Type は、 ApplicationController.afterlilter で指定する。具体的には、 $app/controller/applicati$ on.rb に次のように $App1icationController\#set_{-}content_{-}type$ メソッ

ドを追加し、 ApplicationController.after-filter メソッドで登録する。
class ApplicationController$<$

ActionController: : Baseafter-filter : $set_{-}content_{-}type$
def $set_{-}content_{-}type$if $/Gecko/\Leftrightarrow-$ request. env $[t]r\Gamma rP_{-}USER_{-}AGENT$ “]headers $[ Content-Type^{\prime\iota}]\approx\prime application/xhtml+m1;charset\cdot UTF-8$ “
end
end

end

今回は、 ブラウザがその種類に応じてサーバーに送ってくる 群\sim USER-AGE?JT の情報を利用し、 MathMLに対応しているブラウザが (Firefox[2] など) である場合にのみ Content-TyPe を変更するようにしている。

2.3.4

メモの数式の MathML 化

メモの内容は、 $app/view/memo/show$ .rhtml などで、 Memo#brief メソッドによって参照される。

そこで、与えられた文字列の数式部分を MathML に置き換えたものを返す Applicati。油$elper\with_{-}mathm1$
メソッドを作成し、 これを使用して Memo#brief の数式部分を MathML に変換したものを出力するようにする。

まず、 $app/helper/application$ .rb を次のように編集する。
$ Methods added to this helper will be available to all

module ApplicationHelper

def with-mathml (str)
if $/Gecko/-\sim$ request. env $[||HTTP_{-}US\Re_{-}AGBNT"]$

templates in the application.

153

sl

$=$

.

MathML: : Util: : SimpleLaTeX. new

encoded, data

sl. encode (str)sl. decode (encoded, data)

else

str
end
end

end

先ほどの Content-Type と同様、 ブラウザが MathML に対応する場合にのみ数式部分を MathML に変換している。 また文中の数式の抽出のために、 Matv 仏::Util: :SimpleLaTeX を使用している。

次に、数式部分を変換した文書を出力するように、 $app/view/memo/show$ .rhtml を次のように編集する。
$<pre></|$$</.=$$<^{1}/.=$

with-mathml Qmemo. brief $/_{1}></pre>$link-to ‘ Edit ‘, : action
link-to ‘ Back ‘ , : act on
$i$

$>$

$\approx>$‘

edit’ , : id

list

$>$

Gmemo

$/_{l}>|$$|/>$

ここでは pre 要素を使って、 入力された改行位置で改行して表示されるようにしている。

これで我々が作成したメモ帳アプリケーションは、 炸入数式をメモに含むと表示の際には MathML を使った数式として描画されるようになった。 図 1 は作成した数式メモ帳を使用している様子である。
以上をまとめると、 Ruby on Rails で MathML による数式を扱うためには、標準的な Ralls のアプリケー
ション作成作業に加えて以下の手順が必要になる。
$L^{A}$$\bullet$

MathML ライブラリの配置$\bullet$ドキュメントタイプの変更$\bullet$$\bullet$Content-Type の変更『炸入数式部分の変換処理の追加

このようにして作成され実際に使用されている Web アプリケーションとして、 Center for Nonlinear Scienceat Hokkaido University のサイト 1) がある。 ここでは、 セミナー案内のアブストラクトに数式が含まれている場合、 MathML に変換してブラウザに出力している。

3

おわりに本 MathML ライブラリを使用することで、『炸入数式を MathML に変換するプログラムを作成したり、既存のプログラムに聾炸温数式を MathML に変換して扱う機能を追加することが容易になる。
次の計画として、現在、 数式を扱える総合的な CMS を開発中である。 $Matheria1^{2)}$ と名づけたこのシス
テムは Wiki を基本として複数人がプログやプレゼンの資料、論文の下書き等をオンラインで作成することが出来るものにする予定である。

1)
$2)$

http: $//n1\cdots$ S. 。$kud\cdot 1..e.jp/$
http: $//wm$ matherial. $org/$
$h$

.

154

図 1: 数学メモの動作の様子

左:I+T}% 数式を含むメモを入力している。右:MathML に変換された数式が Firefox によって適切に描画されている。

155

参考文献
[1] David Heinemeier Hansson. Ruby on rails.
http: $//www$ . rubyonrails. $org/$ .

[2] Mozilla Japan. Firefox.
http: $//www$ .mozilla-japan. $org/products/f$ iref $ox/$ .

[3] $W3C$ . Mathematical Markup Language (MathML) Version 2.0 (Second Edition).
http $://www.w3.org/TR/2003/RBC-MathML2-2003l021/$ .

[4] かずひご. Hikidoc.

http: $//projects$ . netlab. $jP/hikidoc/?FrontPage$ . ja.

[5] まつもとゆきひろ. オブジェクト指向スクリプト言語 ruby.

.

http $://www$ ruby-lang. $org/ja/$ .