« 2004年08月 | メイン | 2007年02月 »

2005年03月20日

mimeTeX (WEB上での数式の表示)

WEB上で数式を表示するのは結構大変だが、この mimeTeX を使えば簡単だ。
mimeTeX は C言語で書かれた CGI で、引数に TeX の文法で数式を書けば、数式の GIF イメージを戻してくれる。だから、imgタグを使って数式を簡単に表示することができるのだ。
例えば、 と表示したければ、
<img src="/cgi-bin/mimetex.cgi?\Large x^2+y^2=1">
のように書けば良い。(/cgi-bin に mimetex.cgi があると仮定してる。)

数式の書き方は基本的に LaTeX と一緒だが、全部の機能が使えるわけではないので mimeTeX のサイト(http://www.forkosh.com/mimetex.html)を確認してもらいたい。

mimeTeXのソースはC言語で書かれているが自分でコンパイルしなくても良いように Windows, Linux, FreeBSD 等々のバイナリも提供されている。


以下に数式の例をいくつか挙げる。

分数
\frac{1}{2}+\frac{1}{3}=\frac{5}{6}

分数の横棒が短いと思うなら分子か分母に \, を使って空白を補完すると良い。
\frac{1}{\,2\,}+\frac{1}{\,3\,}=\frac{5}{\,6\,}

上付文字、下付文字
a_{n+1}=2 a_n +2^n

三角関数
\tan\theta = \frac{\Large \sin\theta}{\Large \, \cos\theta \,}

対数
\log_{10} \alpha

積分(上端、下端の書かれる位置が気に入らないが...)
\int x \,dx \;,\; \int_{-1}^{\pi} {t \sin t} \, dt

行列
\left( \begin{array}{cc} 1 & x \\ 0 & 1 \\ \end{array} \right)^2

シグマ
\sum_{k=0}^{\infty} \frac{\Large x^k}{k!}

極限
\lim_{x \to \infty}2^{-x}

投稿者 augustus : 10:56 | コメント (0)

2005年03月13日

Movable Type プラグイン作成入門(5)

今度は独自のコンテナタグの作り方を見てみよう。

例) --- CSVで与えられたリストでループする。
package MT::Plugin::CsvLoop;
use strict;
use MT::Template::Context;
MT::Template::Context->add_container_tag(
            CsvLoop=>\&CsvLoop);
sub CsvLoop{
    my($ctx,$arg) = @_;
    my(@list)=split(/,/, $arg->{list});
    my $res = '';
    my $builder = $ctx->stash('builder');
    my $tokens = $ctx->stash('tokens');
    for my $i (@list) {
        $ctx->stash('csv_value', $i);
        defined(my $out=$builder->build($ctx,$tokens))
            or return $ctx->error($ctx->errstr);
        $res .= $out;
    }
    $res;
}

MT::Template::Context->add_tag(
            CsvLoopValue=>\&CsvLoopValue  );
sub CsvLoopValue{
    my $ctx = shift;
    $ctx->stash('csv_value');
}
package MT::Plugin::CsvLoop;
関数などの名前が衝突しないように package を指定。

MT::Template::Context->add_container_tag(
         CsvLoop=>\&CsvLoop);

MTCsvLoop というコンテナタグがあると CsvLoop という メソッドを呼びだすことを指定。

my($ctx, $arg)=@_;
呼び出されるメソッドには2つの引数が渡される。一つ目はMT::Template::Contextオブジェクト。 2つ目はパラメータのハッシュへのリファランス。

my(@list)=split(/,/, $arg->{list});
テンプレートのコンテナタグ内で list='~' と記述した場合、 $arg->{list} に ~ が入る。
これを "," で区切ったものを @list に代入。

あとは、MT::Template::Contextオブジェクトの内容をまだ理解していないので説明できない。悪しからず。(^^;)

ここで作ったプラグインを CsvLoop.pl という名で保存し、plugins ディレクトリにアップロードしておこう。 これでテンプレート内で コンテナタグの利用は以下のような感じでやれば良い。
<MTCsvLoop list='claudius,nero,galba,otho'>
   <$MTCsvLoopValue$>:
   <a href="<$MTCsvLoopValue$>.html">
     <$MTCsvLoopValue$>.html
   </a>
   <br/>
</MTCsvLoop>
テンプレートの中に固定のループを書いてもあまり役に立たないような気もするが、まあ、サンプルということで。(^^;

投稿者 augustus : 08:38 | コメント (0) | トラックバック

2005年03月07日

Movable Type プラグイン作成入門(4)

変数タグにパラメータを渡すのも易しい。

例)<$MTRepeatStr$> --- 与えられた文字列を繰り返す。
package MT::Plugin::RepeatStr;
use strict;
use MT::Template::Context;

MT::Template::Context->add_tag(RepeatStr=> \&repeat);

sub repeat {
	my($ctx, $arg)=@_;
	my $str = $arg->{str} x $arg->{kaisuu};
	$str;
}
1;

package MT::Plugin::RepeatStr;
関数などの名前が衝突しないように package を指定。

MT::Template::Context->add_tag(RepeatStr=>\&repeat);
RepeatStr というタグがあると repeat という メソッドを呼びだすことを指定。

my($ctx, $arg)=@_;
呼び出されるメソッドには2つの引数が渡される。一つ目はMT::Template::Contextオブジェクト。 2つ目はパラメータのハッシュへのリファランス。

my $str = $arg->{str} x $arg->{kaisuu};
テンプレートの変数タグ内で str='xyz' kaisuu='99' と記述した場合、 $arg->{str} に xxx, $arg->{kaisuu} に 99 が入る。
"xyz" x 99 で xyz を 99 回繰り返した文字列が得られる。

$str;
呼び出されるメソッドは最後に結果の文字列を返せば良い。

ここで作ったプラグインを RepeatStr.pl という名で保存し、plugins ディレクトリにアップロードしておこう。 これでテンプレート内で <$RepeatStr str='-' kaisuu='50' $> と記述すれば - を 50 回繰り返した文字列が得られる。

例)<$MTPerlEval$> --- perl のコードを実行する。
package MT::Plugin::Eval;
use strict;
use MT::Template::Context;

MT::Template::Context->add_tag(PerlEval=>\&perleval);

sub repeat {
	my($ctx, $arg)=@_;
	eval($arg->{eval});
}
1;
テンプレート内で <$MTPerlEval eval='12*12' $> と記述すると 144 が得られる。便利なようだが、どんな perl のコードでも実行してしまうので危険極まりないとも言える。(^^;

投稿者 augustus : 21:21 | コメント (0) | トラックバック

Movable Type プラグイン作成入門(3)

独自の変数タグを作成してテンプレートで使うことも可能だ。

例)<$MTYahooLink$> --- Yahoo へのリンクを表示する
package MT::Plugin::YahooLink;
use strict;
use MT::Template::Context;

MT::Template::Context->add_tag(YahooLink=>\&yhlink);

sub yhlink {
	my $url="http://www.yahoo.co.jp/";
	"<a href='$url'>$url</a>";
}
1;

package MT::Plugin::YahooLink;
関数などの名前が衝突しないように package を指定。

MT::Template::Context->add_tag(YahooLink=>\&yhlink);
MTYahooLink というタグがあると yhlink という メソッドを呼びだすことを指定。

"<a href='$url'>$url</a>";
呼び出されるメソッドは最後に結果の文字列を返せば良い。 とてもシンプル。

ここで作ったプラグインを yahoolink.pl という名で保存し、plugins ディレクトリにアップロードしておこう。 これでテンプレート内で <$MTYahooLink$> という変数タグが使えるようになる。

投稿者 augustus : 20:50 | コメント (0) | トラックバック

2005年03月06日

Movable Type プラグイン作成入門(2)

グローバルフィルターに引数を渡すことによってもっと柔軟な処理を行うことが可能だ。

例) ColorEzo プラグイン --- "tech-ezo" という文字列に任意の色をつける
package MT::Plugin::ColorEzo;
use strict;
use MT::Template::Context;
MT::Template::Context->add_global_filter(
            ColorEzo=>\&ClrEzo  );
sub ClrEzo {
    my($text, $arg, $ctx) = @_;
    $text=~s/(tech-ezo)/<font color='$arg'>$1<\/font>/ig;
    $text;
}
1;

前回の例とほとんど同じである。

package MT::Plugin::ColorEzo;
関数などの名前が衝突しないように package を指定。

MT::Template::Context->add_global_filter(
         ColorEzo=>\&ClrEzo );

ColorEzo というフィルタが ClrEzo というメソッドを呼びだすことを指定。

my ($text, $arg, $ctx) = @_;
フィルターに渡される3つの引数。一つ目はフィルターをかける文字列。2つ目はテンプレートから渡される引数。3つ目は MT::Template::Contextオブジェクト。
つまり、色の指定に2つ目の引数を使えば良いのだ。

$text =~ s/(tech-ezo)/<font color='$arg'>$1<\/font>/ig;
"tech-ezo" という文字列を font タグではさむ処理。色の指定に上で渡された2つ目の引数を利用している。

$text;
フィルターによって呼び出されるメソッドは、最後に結果の文字列を返す。

ここで作ったプラグインを ColorEzo.pl という名で保存し、plugins ディレクトリにアップロードしておこう。

ColorEzoフィルターを利用するには変数タグやコンテナタグのアトリビュートとして指定すればよい。

<$MTEntryTitle ColorEzo='blue'$>
記事のタイトルに対して ColorEzo フィルターを適用。 ここで指定した blue がフィルターのメソッドの2つ目の引数として渡される。

<MTEntries lastn="10" ColorEzo='#AA8800'>
...
</MTEntries>
MTEntries ループの中で ColorEzo フィルター適用。 ここで指定した #AA8800 がフィルターのメソッドの2つ目の引数として渡される。

投稿者 augustus : 17:48 | コメント (0) | トラックバック

Movable Type プラグイン作成入門(1)

Movable Type はプラグインを利用することで新たな機能を柔軟に追加することができる。
プラグインにはグローバルフィルター、変数タグ、コンテナタグ、条件タグがある。

まずはとても小さなグローバルフィルターからはじめてみよう。
例) RedEzo プラグイン ~ "tech-ezo" という文字列を赤くする
package MT::Plugin::ColorEzo;
use strict;
use MT::Template::Context;

# Global Filter RedEzo の定義
MT::Template::Context->add_global_filter(
	RedEzo => \&ChangeRedEzo);

# Filter によって起動されるメソッド
sub ChangeRedEzo {
    my($text, $arg, $ctx) = @_;
    $text=~s/(tech-ezo)/<font color='red'>$1<\/font>/ig;
    $text;
}
1;


package MT::Plugin::ColorEzo;
関数などの名前が衝突しないように package を指定。package の名前は任意だが MT::Plugin::~ という形にするのが慣習。

MT::Template::Context->add_global_filter(RedEzo=>\&ChangeRedEzo);
RedEzo というフィルタが ChangeRedEzo というメソッドを呼びだすことを指定。

my ($text, $arg, $ctx) = @_;
フィルターには3つの引数が渡される。一つ目はフィルターをかける文字列。2つ目はテンプレートから渡される引数。3つ目は MT::Template::Contextオブジェクト。

$text=~s/(tech-ezo)/<font color='red'>$1<\/font>/ig;
"tech-ezo" という文字列を font タグではさむ処理。

$text;
フィルターによって呼び出されるメソッドは、最後に結果の文字列を返す。

ここで作ったプラグインを RedEzo.pl という名で保存し、plugins ディレクトリにアップロードしておこう。

RedEzoフィルターを利用するには変数タグやコンテナタグのアトリビュートとして指定すればよい。

<$MTEntryTitle RedEzo='1'$>
記事のタイトルに対して RedEzo フィルターを適用

<MTEntries lastn="10" RedEzo='1'>
...
</MTEntries>
MTEntries ループの中で RedEzo フィルター適用

投稿者 augustus : 17:19 | コメント (0) | トラックバック