ASCIIMathML for Hatenaを作った

といっても、作ったというのが恥ずかしいほど簡単でした。

ASCIIMathMLとは

ちょっと説明しておくと、ASCIIMathMLとはHTML文書に埋め込んだTeX風の数式表現をMathMLという形式に変換してくれるプログラムです。これをFirefox 3やMathPlayerというプラグインを読み込ませたIEで表示すると、数式として表現されます。たとえば、

amath `int_(-oo)^(oo)f(t-x)h(x)dx endmath

が、

になります*1
こんなにきれいに表示されるなら、最初からMathMLで書けば良さそうですが、MathMLというのは人間の手で書けるような代物ではありません。また、本来はXHTML文書の中で使うべき物です。Blogとの相性はよくありません。これらの問題を解決し、人間でも比較的簡単に書ける形式で、Blogでも使われるHTML文書に埋め込める形でMathMLに変換するのがASCIIMathMLです。
で、このASCIIMathMLというプログラムは、javascriptで書かれていいます。本来はWEBサイトを管理している人が、自分のサイトにアップロードし、それぞれのWEBページに埋め込んで使う性質の物です。ここが問題なのです。はてなダイアリーでは自分の好きなスクリプトを自由に埋め込むのを許していません*2
はてなにはmimetexという機能があり、数式の表記ができます。が、これはあまりきれいな出力ではありません。

F(t)=\Bigint_{0}^{\infty}~f(t-x)h(x)dx

ブラウザのMathML対応は、長くよちよち歩きが続いていますが、うまくいったときに実にきれいに表示されます。ですから、なんとかASCIIMathMLを使えるといいな、と考えました。

ASCIIMathML.jsをGreasemonkeyスクリプトにする

そこでふと頭に浮かんだのがGreasemonkeyです。これはFirefoxプラグインで、ページを読む人がサイトにはないスクリプトを無理矢理実行させることで、勝手にサイトの機能を向上させます。いいかえれば、はてながASCIIMathML.jsというjavascriptを走らせていなくても、自分のブラウザで走らせることで自分だけはMathML化された数式を読むことが出来ます。
Greasemonkeyについてあれこれ検索して、結局作業はとても簡単であることがわかりました。
1. GreasemonkeyFirefoxにインストールする*3
2. ASCIIMathMLのホームページから、ASCIIMathML.jsをダウンロードする。これがプログラム本体。
3. ダウンロードしたASCIIMathML.jsをASCIIMathML.user.jsに改名する、
4. 改名したASCIIMathML.user.jsにメタデータを付け加える。
メタデータGreasemonkeyにこのjavascriptプログラムがGreasemonkeyスクリプトであることを知らせ、名前や実行条件を知らせる物です。メタデータは必ずファイルの先頭に追加します

// ==UserScript==
// @name          ASCIIMathML for Hatena
// @namespace     http:/d.hatena.ne.jp/
// @description   load ASCIIMathML.js on hatena to show math equations. Derived from ASCIIMathML.js http://mathcs.chapman.edu/~jipsen/mathml/asciimath.html
// @include       http://d.hatena.ne.jp/*
// @include       http://*.g.hatena.ne.jp/*
// @exclude       http://d.hatena.ne.jp/*/edit
// @exclude       http://*.g.hatena.ne.jp/*/edit
// ==/UserScript==

作業が完了したら保存し、ASCIIMathML.user.jsをFirefoxにドロップしてインストールします。

数式を書く

数式はTeX風です。と、いっても私はTeXについてほとんど知りませんので、ASCIIMathMLの公式サイトの文法解説ページお試しページを行ったり来たりしながら数式を作っています。とくに、お試しページはリアルタイムで結果を見ることが出来るので便利です。
数式は、amathで始まって endmathで終わります。たとえばこんな具合です。

amath `int_(-oo)^(oo)f(t-x)h(x)dx endmath

この例ははてなスーパーpre機能を使ってソースをお見せしています。これをクオートの中で使うと

amath `int_(-oo)^(oo)f(t-x)h(x)dx endmath

となります。ASCIIMathML for Hatenaを使っている人には数式が見えるはずです。

限られた人しか使えない

ASCIIMathML for Hatenaは、あくまでブラウザ側のしたがって、この機能による数式をきちんと読むことが出来るのは、

人だけです。これはあまりにも読者を絞っているように思えます。しかしながら、書いている人が一番よく知っているように、数式はほぼすべての人に無視されます。読んでくれるのはごく一部の人だけです。であれば、そのごく一部の人はそれなりのコストを払ってくれるのではないかと期待するのはそれほど図々しくないように思えます。
なにしろ、上の三つのソフトは全部フリーです。
とはいえ、一番いいのは、はてな自身が対応してくれることですね。はてなグリースモンキーに投稿してもいいのですが、それでもFirefoxユーザーしか恩恵にあずかれません。サーバー側でASCIIMathML.jsに対応してくれればIEユーザーにも福音ですので、考えてもらえるとうれしいです。

既知の問題

おそらく、ASCIIMathML内部の問題だと思いますが、最新のエントリのその場編集のリンクなど、一部の<a>タグからhrefが抜かれています。そのため、編集作業などがやや面倒です。
また、編集状況によっては、amathとendmathの前にspanタグが編集回数の2のべきで追加されていくという珍妙な問題もあります。これは編集URLをピンポイントでexcludeすれば解決するようです。しかし、効果的な方法は、まだわかりません。

*1:結果を強調するために拡大している

*2:サーバーの負荷や、セキュリティの問題があるので妥当な制限

*3:やり方は検索すれればいくらでも見つかる