#!/usr/bin/perl #$kmgiflibdebug=1; #@r=ps2gif_update(@ARGV); #@r=ps2gif(@ARGV); #@r=tex2gif_update(@ARGV); #@r=tex2gif(@ARGV); #print STDERR "size: ".$r{'w'}.'x'.$r{'h'}."\n"; 1; # require のため # ps2gif/ ps2gif_update # PostScript(EPS) からGIFファイルを生成する # # %r=ps2gif($sourcefile,$destfile,$width,$height,$color); # # $destfile まで必須。 # width,height は無指定もしくは0 でデフォルト # 両方無し: BoundingBox通りのサイズ # 片方 : BoundingBoxの縦横比で設定 # 両方指定: 縦横比を変更し、指定サイズで # color は色指定 'color name' or '#RRGGBB' なければそのまま # # %r: {'w'} 幅 {'h'} 高さ sub ps2gif_update { local($src)=@_[0]; local($dest)=@_[1]; local($dw)=@_[2]; local($dh)=@_[3]; local($ofx,$ofy,$bw,$bh); if((-M $src)>(-M $dest)) { # ソースが古いけど... open(PSGIFF,"grep BoundingBox $src |"); $_=; close(PSGIFF); /BoundingBox: (\d+) (\d+) (\d+) (\d+)/; $ofx=$1; $ofy=$2; $bw=$3-$1; $bh=$4-$2; if(($dw=="0")&&($dh=="0")) { $dw=$bw; $dh=$bh; } elsif($dw=='0'){ $dw=$bw*$dh/$bh+0.49; } elsif($dh=="0"){ $dh=$bh*$dw/$bw+0.49; } if($dh=~s/\.\d+//){ $dh=$dh; } if($dw=~s/\.\d+//){ $dw=$dw; } #print STDERR "examing $dest\n"; open(PSGIFF,"/usr/bin/file ".$dest." |"); $_=; close(PSGIFF); if(/GIF/){ /version[^,]*, (\d+) x (\d+)/; if((($dw == '0')||($dw == $1))&& (($dh == '0')||($dh == $2))){ print STDERR "$src is already processed\n"; local(%r); $r{'w'}=$1; $r{'h'}=$2; return %r; # やっぱし同じ } } } return ps2gif(@_); } sub ps2gif { local($src)=@_[0]; # ソースファイル local($dest)=@_[1]; # 出力ファイル local($dw)=@_[2]; # 出力幅 local($dh)=@_[3]; # 出力高さ local($bg)=@_[4]; # バックグラウンド (RRGGBB) local($ofx,$ofy,$bw,$bh); local($sedcmd); local($temp)="/tmp/ps2gif.tmp"; local($debug)=$kmgiflibdebug; local($dn,$dn2); if($debug){ print STDERR "tex2gif: Debug mode\n"; } else { $dn=' > /dev/null'; $dn2=' 2> /dev/null'; } open(PSGIFF,"grep BoundingBox $src |"); $_=; close(PSGIFF); /BoundingBox: (\d+) (\d+) (\d+) (\d+)/; $ofx=$1; $ofy=$2; $bw=$3-$1; $bh=$4-$2; if($debug){print STDERR "Offset: ($1,$2) Size: ",$3-$1,"x",$4-$2,"\n";} if(($dw=="0")&&($dh=="0")) { $dw=$bw; $dh=$bh; } elsif($dw=='0'){ $dw=$bw*$dh/$bh+0.49; } elsif($dh=="0"){ $dh=$bh*$dw/$bw+0.49; } if($dh=~s/\.\d+//){ $dh=$dh; } if($dw=~s/\.\d+//){ $dw=$dw; } if($debug){print STDERR "Output resolution: $dw x $dh \n";} local($scaling)=1; if($dw*$dh<3080000/4) { $scaling="2"; # アンチエイリアス if($debug){print STDERR "Auto anti-alias\n";} } local($xscale)=$scaling*$dw/$bw; local($yscale)=$scaling*$dh/$bh; # PSファイルの工作 open(PSGIFF,$src); open(PSGIFG,"> $temp"); while() { if(/^%%BoundingBox.*$/){ print PSGIFG '%%BoundingBox: ',"0 0 ",($dw*$scaling); print PSGIFG " ",($dh*$scaling),"\n"; if($bg ne '') { # バックグラウンドカラー $_=$bg; colorstrtorgb(); local($color)=$_; #print STDERR $color; print PSGIFG $color; print PSGIFG 'newpath 0 0 moveto '; print PSGIFG ($dw*$scaling),' 0 lineto '; print PSGIFG ($dw*$scaling),' ',($dh*$scaling),' lineto '; print PSGIFG '0 ',($dh*$scaling),' lineto '; print PSGIFG "0 0 lineto fill\n"; } print PSGIFG "$xscale $yscale scale -$ofx -$ofy translate \n"; } else { print PSGIFG $_; } } close(PSGIFF); close(PSGIFG); # GIFへの出力 # A4: 595x842 local($cmd)= "gs -sDEVICE=ppmraw -sOutputFile=$temp"."2 -g". ($dw*$scaling)."x".($dh*$scaling)." -dNOPAUSE -dBATCH -q $temp"; if($debug){print STDERR $cmd,"\n";} system($cmd); $cmd="/bin/cat $temp"."2"; if($scaling!="1") { $cmd=$cmd." | /usr/bin/pnmscale ".(1/$scaling); } $cmd=$cmd." | /usr/bin/ppmquant 256 ".$dn2; $cmd=$cmd." | /usr/bin/ppmtogif > $dest".$dn2; if($debug){print STDERR $cmd,"\n";} system($cmd); if(!$debug) { unlink($temp); unlink($temp."2"); } local(%r); $r{'w'}=$dw; $r{'h'}=$dh; return %r; } # ps2gif/ ps2gif_update # pLaTeXソースから PostScript(EPS)経由でGIFファイルを生成する # # %r=tex2gif($tex_command,$destfile,$res,$color); # # $destfile まで必須。 # $res は拡大率 # color は色指定 'color name' or '#RRGGBB' なければそのまま # # %r: {'w'} 幅 {'h'} 高さ sub tex2gif_update { local($tex)=@_[0]; # TEXソース local($dest)=@_[1]; # 出力ファイル local($res)=@_[2]; # 倍率 local($bg)=@_[3]; # バックグラウンド (color or #RRGGBB) local($desc)=$res.$bg." ".$tex; local(%r); if(-f $dest.".tgi") { open(TEXGIF,$dest.".tgi"); $_=; close(TEXGIF); s/ R(\d+)x(\d+)\s*$//; $r{'w'}=$1; $r{'h'}=$2; if($desc eq $_) { print STDERR "no need to process '$dest'\n"; $r{'w'}=$1; $r{'h'}=$2; return %r; } } %r=tex2gif(@_); open(TEXGIF,"> ".$dest.".tgi"); print TEXGIF $desc.' R'.$r{'w'}.'x'.$r{'h'}; close(TEXGIF); return %r; } sub tex2gif { local($separator)=$/; local($tex)=@_[0]; # TEXソース local($dest)=@_[1]; # 出力ファイル local($res)=@_[2]; # 倍率 local($bg)=@_[3]; # バックグラウンド (color or #RRGGBB) local($temp)="/tmp/tex2gif.tmp"; local($cmd); local($debug)=$kmgiflibdebug; local($dn,$dn2); if($res == 0) {$res='1';} if($debug){ print STDERR "tex2gif: Debug mode\n"; } else { $dn=' > /dev/null'; $dn2=' 2> /dev/null'; } open(TEXGIF,"> $temp".".tex"); print TEXGIF '\documentclass[12pt]{jarticle}\pagestyle{empty}',"\n"; print TEXGIF '\def\theequation{}\begin{document}',"\n"; print TEXGIF $tex; print TEXGIF "\n",'\end{document}'; close(TEXGIF); $cmd="(cd /tmp; platex $temp; dvips $temp".".dvi; ps2epsi $temp".".ps)"; $cmd=$cmd." ; close(TEXGIF); /BoundingBox: (\d+) (\d+) (\d+) (\d+)/; $ofx=$1-1; $ofy=$2-1; $bw=$3-$1+2; $bh=$4-$2+2; if($debug){ print STDERR "Offset: ($1,$2) Size: ",$3-$1,"x",$4-$2,"\n"; } $dw=$bw*$res; $dh=$bh*$res; local($scaling)=1; if($dw*$dh<3080000/4) { $scaling="2"; # アンチエイリアス if($debug){print STDERR "Auto anti-alias\n";} } local($xscale)=$scaling*$dw/$bw; local($yscale)=$scaling*$dh/$bh; # PSファイルの工作 open(TEXGIFF,"$temp".".epsi"); open(TEXGIFG,"> $temp".".ps"); while() { if(/^%%BoundingBox.*$/){ print TEXGIFG '%%BoundingBox: ',"0 0 ",($dw*$scaling); print TEXGIFG " ",($dh*$scaling),"\n"; if($bg ne ""){ $_=$bg; colorstrtorgb(); local($color)=$_; #print STDERR $color; print TEXGIFG $color; print TEXGIFG 'newpath 0 0 moveto '; print TEXGIFG ($dw*$scaling),' 0 lineto '; print TEXGIFG ($dw*$scaling),' ',($dh*$scaling),' lineto '; print TEXGIFG '0 ',($dh*$scaling),' lineto '; print TEXGIFG "0 0 lineto fill 0 0 0 setrgbcolor\n"; } print TEXGIFG "$xscale $yscale scale -$ofx -$ofy translate \n"; } else { print TEXGIFG $_; } } print TEXGIFG "showpage\n"; close(TEXGIFF); close(TEXGIFG); # GIFへの出力 # A4: 595x842 local($cmd)= "gs -sDEVICE=ppmraw -sOutputFile=$temp".".ppm -g". ($dw*$scaling)."x".($dh*$scaling). " -dNOPAUSE -dBATCH -q $temp".".ps"; if($debug){ print STDERR $cmd,"\n"; } system($cmd); $cmd="/bin/cat $temp".".ppm"; if($scaling!="1") { $cmd=$cmd." | /usr/bin/pnmscale ".(1/$scaling); } $cmd=$cmd."| /usr/bin/ppmquant 256 2>/dev/null "; $cmd=$cmd."| /usr/bin/ppmtogif > $dest 2>/dev/null"; if($debug){ print STDERR $cmd,"\n"; } system($cmd); if(!$debug){ unlink($temp.'.aux'); unlink($temp.'.log'); unlink($temp.'.epsi'); unlink($temp.'.dvi'); unlink($temp.'.ps'); unlink($temp.'.tex'); unlink($temp.'.ppm'); } $/=$separator; # 情報返却 local(%r); $r{'w'}=$dw; $r{'h'}=$dh; return %r; } sub colorstrtorgb () { local($color)=$_; if(substr($color,0,1) eq '#'){ $_=(hex(substr($color,1,2))/255).' '. (hex(substr($color,3,2))/255).' '. (hex(substr($color,5,2))/255)." setrgbcolor\n"; return; } open(TEXGIFC,"grep '$color' /usr/X11R6/lib/X11/rgb.txt |"); while() { # print STDERR $_; if(/(\d+)\s+(\d+)\s+(\d+)\s+$color[\s*]$/){ close(TEXGIFC); $_=($1/255).' '.($2/255).' '.($3/255)." setrgbcolor\n"; return ; } } close(TEXGIFC); print STDERR "No color '$color'\n"; $_="1 1 1 setrgbcolor\n"; return; }