以前は rakunet.org に置いていたのですが、今回セキュリティやインストー
ルするソフトウェアの制限を考え、サーバ上から取り除きました。
しかし、math.cgi には結構アクセスがあるので(404 エラーになってますが
(^^;)、同じことを個人で行うツールの作り方を簡単に書いておきます。
1. TeX 文書を書く(下 math.tex は一例)。
empty の部分が肝です。ないとドでかい画像になってしまいますのでご注意を。
\documentclass[a4j]{jarticle}
\pagestyle{empty}
\begin{document}
\[S_{n} = a_{1}^{2} + a_{2}^{2} + a_{3}^{2} + ... + a_{n}^{2}\]
\end{document}
2. コマンドラインでコンパイル。
% platex math.tex
3. xdvi にてプレビューしてみる。
4. dvipsk による PS 形式への変換(144 は dpi 値。300 とかにすると奇麗)。
% dvips -E -D 144 math.dvi
5. PS 形式から PNG 形式へは以下の eps2pngk (閑舎作。フリーウェア)を使ってください。
#! /usr/bin/perl
# Usage: eps2pngk -r144 math.ps など
$tmp = shift();
if($tmp =~ /^-r[0-9]+/){
$tmp =~ s/^-r//;
$reso = $tmp;
$epsfile = shift();
}else{
$reso = 144;
$epsfile = $tmp;
}
unless (open(EPSF, $epsfile)) {
print "Usage: eps2pngk -rreso epsfile\n";
exit 1;
}
$pngfile = $epsfile;
$pngfile =~ tr/A-Z/a-z/;
$pngfile =~ s/[.]e?ps$/.png/;
$psfile = "tmp0.ps";
$iseps = 0;
while(<EPSF>){
if(/^\%\%BoundingBox:\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/){
$iseps = 1;
$xsize = int(($3 - $1) * $reso / 72);
$ysize = int(($4 - $2) * $reso / 72);
$startx = -$1;
$starty = -$2;
open(TMPPS, ">$psfile");
printf(TMPPS "/NumbDict countdictstack def\n");
printf(TMPPS "1 dict begin\n");
printf(TMPPS "/showpage {} def\n");
printf(TMPPS "userdict begin\n");
printf(TMPPS "%.6f %.6f translate\n", $startx, $starty);
printf(TMPPS "1.000000 1.000000 scale\n");
printf(TMPPS "0.000000 0.000000 translate\n");
printf(TMPPS "(%s) run\n", $epsfile);
printf(TMPPS "countdictstack NumbDict sub {end} repeat\n");
printf(TMPPS "showpage\n");
close(TMPPS);
break;
}
}
close(EPSF);
if($iseps){
$cmdline = sprintf(
"gs -q -dNOPAUSE -sDEVICE=png256 -sOUTPUTFILE=%s -r%d -g%dx%d -- %s",
$pngfile, $reso, $xsize, $ysize, $psfile);
if (system($cmdline) != 0) {
print "Cannot exec gs\n";
exit 1;
}
}else{
print "Hmm... " . $epsfile . " isn't an EPS file, is it?\n";
exit 1;
}
exit 0;
6. 以上をスクリプトで一本化すれば、TeX の数式表現を書くだけで数式画像が完成します。
以前サーバに置いていたのはこれを CGI 化したものでした。
必要な方はぜひチャレンジしてみてください。
--
本田博通(閑舎)
テキストとスクリプトの http://rakunet.org/TSNET/