作者: 閑舎
日時: 2003/2/11(12:57)
 以前は 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/