#!/usr/local/bin/perl5.00502
#
# The author applies GNU GENERAL PUBLIC LICENSE
# (Version 2, June 1991, Copyright (C) 1989, 1991 Free Software Foundation, Inc.) to
# this program "tgif2tex."
#
# Aug 1994  First version (Ver 1.00)
# Dec 1994  '-psc', '-txc' are supported 
#           rotated texts are kept as ps texts (Version 1.10).
# Feb 1995  Some bugs in tgif2tex-sub are fixed .
#           all japanese stuff are removed in case of non-japanese ps
#           (version 1.20)
# Aug 1995  tig2tex, tgif2tps, tgif2tex-lib  are merged and many changes:
#           ignore japanese stuff, because tgif-2.16j does not have
#           eucfont if the picture has no japanese texst
#           (version 1.30)
#           -epsfbox is supported. (Version 1.31)
# Nov 1995  -jis -euc -sjis are supported (Version 1.32)
# Nov 20, 1995  -merge -pagenum are supported (Version 1.33)
# Jan 19, 1996  several bugs are fixed (Version 1.33p1)
# Jan 22, 1996  -slitex is supported (Version 1.34)
# Feb 9,  1996  several bugs are fixed (Version 1.34p1)
# Feb 25,  1996  several bugs are fixed (Version 1.34p2)
# Mar 7,  1996  hoge.ps is automatically generated from hoge.obj (Version 1.35)
# Mar 15,  1996  scale for epsf.sty is supported (Version 1.36)
# July 25, 1997 use special instead of epsf.sty and eclepsf.sty
#               -tsc -epsfbox is not supported
#               multiline is supported (Version 1.40)
# July 26, 1997 small bugs are fixed (Version 1.41)
# Aug 11, 1997 small bugs are fixed (Version 1.42)
# Aug 19, 1997 -ajlatex -njlatex is supported (Version 1.43)
# Aug 20, 1997 small bugs are fixed (Version 1.44)
# Sep 17, 1998 small bugs are fixed, -color is supported (Version 1.45)
# Sep 20, 1998 support tgif+jis.patch by Satoshi Taoka (Version 1.46)
# -------------------------------------------------------------------
# May 20, 2000 start supporting tgif version 4 (Version 2.00)
# June 14, 2000 plenty of bugs are fixed (Version 2.01)
# Aug 4, 2000 multi line suported (Version 2.02)
# Aug 8, 2000 minor bugs fixed (Version 2.03)
# Jan 19, 2001 minor bugs fixed (Version 2.04)
# May 15, 2001 minor bugs fixed (Version 2.05)

$latex_command='jlatex';	# latex command in your site.
$tgif_command='/usr/X11R6/bin/tgif';

$version='tgif2tex version 2.05';
$copyright='Copyright (C) 1994-2001 Koji Nakano (knakano@jaist.ac.jp)';

$usage =
"Usage: tgif2tex [-article articlename] [-ajlatex] [-color] [-dvi] [-h]
         [-m mag] [-merge texfile] [-p char] [-njlatex] [-multi char]
         [-pagenum] [-s] [-slide] [-slitex] [-v] [-vv] filename ...
    -article articlename  specify the style file for article
    -ajlatex  use ASCII jlatex
    -dvi    generate dvi file (only for slide mode)
    -euc    output as euc
    -h      show this message
    -jis    output as jis (default: euc)
    -m mag  magnification
    -merge  merge slides into one
    -njlatex  use NTT jlatex (default)
    -pagenum   print page number
    -s      silent
    -slide  slide mode
    -sjis    output as sjis (default: euc)
    -slitex jslitex is used
    -v      verbose (default)
    -vv     very verbose
";

if($#ARGV<0 || ($ARGV[0] eq '-h')){
    print STDERR "$version\n$copyright\n$usage";
    exit;
}


print STDERR "$version\n";

@fontsize=('tiny','scriptsize','footnotesize','small','normalsize',
	   'large','Large','LARGE','huge','Huge');
$mag=1;				# manification
$adj=72*11;			# size of paper
$slide=0;			# 1 if slide
$dvi=0;				# 1 if generate dvi (slide mode only)
$verbose=1;			# 0=silent 1=verbose 2=very verbose
$debug=0;			# 1 if debug mode
$filename='';
$option='';			# option for tgif
$ext='';
$directory='.';
$nkf='';
$merge='';			#merge
$files=0;
$pagenum=0;
$slitex=0;                      # 1 if slitex
$pt='11pt';
$size18=0;
$ryumin='\\mc';
$gothic='\\gt';
$article='jarticle';

for(;$#ARGV>=0;shift){
    if($ARGV[0] eq '-s'){
	$verbose=0;
    } elsif($ARGV[0] eq '-v'){
	$verbose=1;
    } elsif($ARGV[0] eq '-vv'){
	$verbose=2;
    } elsif($ARGV[0] eq '-color'){
	$option=$option.' -color ';
    } elsif($ARGV[0] eq '-debug'){
	$debug=1;
    } elsif($ARGV[0] eq '-slide'){
	$slide=1;
    } elsif($ARGV[0] eq '-ohp'){
	$slide=1;
    } elsif($ARGV[0] eq '-dvi'){
	$dvi=1;
    } elsif($ARGV[0] eq '-jis'){
	$nkf='|nkf -j ';
    } elsif($ARGV[0] eq '-sjis'){
	$nkf='|nkf -s ';
    } elsif($ARGV[0] eq '-euc'){
	$nkf='| nkf -e ';
    } elsif($ARGV[0] eq '-m'){
	shift;
	$mag=$ARGV[0];
    } elsif($ARGV[0] eq '-article'){
	shift;
	$article=$ARGV[0];
    } elsif($ARGV[0] eq '-12pt'){
	$pt='12pt';
    } elsif($ARGV[0] eq '-11pt'){
	$pt='11pt';
    } elsif($ARGV[0] eq '-10pt'){
	$pt='';
    } elsif($ARGV[0] eq '-large'){
	$size18=1;
    } elsif($ARGV[0] eq '-Large'){
	$size18=2;
    } elsif($ARGV[0] eq '-merge'){
	shift;
	if($merge eq ''){
	    $merge=$ARGV[0];
	    $merge="$merge.tex" unless $merge =~ /\.tex$/;
	    open(ALL,"> $merge");
	}
    } elsif($ARGV[0] eq '-pagenum'){
	$pagenum=1;
    } elsif($ARGV[0] eq '-slitex'){
	$article='slides';
	$slitex=1;
	$slide=1;
	$pt='';
    } elsif($ARGV[0] eq '-ajlatex'){
        $article='jarticle';
        $ryumin='\\mc';
        $gothic='\\gt';
    } elsif($ARGV[0] eq '-njlatex'){
        $article='j-article';
        $ryumin='\\dm';
        $gothic='\\dg';
    } elsif($ARGV[0] =~ /^-/) {
	print STDERR "Do not know option $ARGV[0]\n";
    } else {
	&main;
    }
}

if($merge ne ''){
    print ALL "\\end{document}\n";
    close ALL;
    print "$merge generated\n";
    if($dvi==1){
	print STDERR "Execute $latex_command $merge.\n" if $verbose>0;
	system("$latex_command $merge");
    }
}
exit;

sub main{
    local($line);
    #determine $filename and $ext and open $filename.$ext
    if($ARGV[0]=~ /^(.+)\.obj$/){
	$filename=$1;
	system("$tgif_command $option -print -ps $filename.obj");
	$ext="ps";
    } elsif($ARGV[0]=~ /^(.+)\.ps$/){
	$filename=$1;
	$ext='ps';
    } elsif($ARGV[0]=~ /^(.+)\.eps$/){
	$filename=$1;
	$ext='eps';
	if($slide==1){
	    print STDERR "$filename.ps must be generated by tgif if slide mode.\n";
	    exit;
	}
    } else {
	$filename=$ARGV[0];
	if (-r "$filename.ps") {
		if ((-M "$filename.obj")<(-M "$filename.ps")){
			system("$tgif_command -print -ps $filename.obj");
		}
		$ext='ps';
	} elsif (-r "$filename.obj") {
		system("$tgif_command -print -ps $filename.obj");
		$ext='ps';
	} elsif (-r "$filename.ps") {
		$ext='ps';
	} elsif (-r "$filename.eps") {
		$ext='eps';
	} else {
	    print STDERR "Can open neither $filename.ps, $filename.eps, nor $filename.obj.\n";
	    exit;
	}
    }
    unless(open(PS,"< $filename.$ext")){
	print STDERR "Cannot open $filename.$ext.\n";
	exit;
    }
    if($filename=~ /^(.+)\/([\w\.\-]+)$/){
	$directory=$1;
	$fname=$2;
    } else {
	$directory='.';
	$fname=$filename;
	}
    &get_header;		# header is written to @header
    if($slide==1){
	    open(TEX,"> $filename.tex") || die "Cannot open $filename.tex";
	    ++$files;		# increment # of files.
	}
    while(&get_onepage){
	if($slide==1){
	    &slide_mode;
	}else{
	    &proc_page;
	}
    }
    if($slide==1){
	&slide_end;
    }
    print STDERR "No page found.\n" if $page==0;
}

sub proc_page{
    local($line);
    &find_title;
    if($title eq ''){
	unless($page==1){
	    print STDERR "Cannot find filename for page $page\n";
	    undef @onepage;
	    return;
	}
	$title=$fname;
    }
    open(DPS,"> $directory/$title.dps") ||
	die "Cannot open $directory/$title.dps";
    open(TPS,"${nkf}> $directory/$title.tps") ||
	die "Cannot open $directory/$title.tps";
    print DPS "%%BoundingBox: $xhome $yhome $xend $yend\n";
    print DPS "%%Title: $filename\n";
    print DPS @header;
    print TPS "%% Generated by $version\n";
    print TPS "%% Original: $filename.$ext page $page\n";
    print TPS "\\unitlength ${mag}pt\n";
    print TPS "\\begin{picture}($width,$height)\n";
    printf TPS "\\put(0,0){\\special{PSfile=%s llx=%d lly=%d urx=%d ury=%d rwi=%d}}\n",
    "$directory/$title.dps",$xhome,$yhome,$xend,$yend,$width*$mag*10;
    print DPS "%!\n";
    print DPS "%%BoundingBox: $xhome $yhome $xend $yend\n";
    while($line = shift(@onepage)){
	if($line =~ /^% TEXT/){
	    &proc_text;
	} elsif($line =~ /^% BOX/){
	    undef @box;
	    push(@box,$line);
	    while($line = shift(@onepage)){
		push(@box,$line);
		if($line =~ 
		   /^\s+NP (\d+) (\d+) M (\d+) \d+ L \d+ (\d+)/){
		    if(($lx=$1,$ly=$2,$rx=$3,$ry=$4)
		       ==($xmin,$ymin,$xmax,$ymax)){
			while($line = shift(@onepage)){
			    if($line =~ /^GR$/){last;}
			}
		    } else{
			print DPS @box;
			while($line = shift(@onepage)){
			    print DPS $line;
			    if($line =~ /^GR$/){last;}
			}
		    }
		}
		if($line =~ /^GR$/){last;}
	    }
	} else {print DPS $line;}
    }
    print DPS "%MatchingCreationDate: $create\n";
    print TPS "\\end{picture}\n";
    if($env ne ''){
	print TPS "\\end{center}\n";
	if($caption ne ''){
	    print TPS "\\caption{$caption}";
	    if($label ne ''){
		print TPS "\\label{$label}";
	    }
	    print TPS "\n";
	    print TPS "\\end{$env}\n";
	}
    }
    close DPS;
    close TPS;
    print STDERR "$title.dps and $title.tps generated.\n" if $verbose>0;
}

sub find_title{
    local($i,$line,$x,$y,$text,$offset,$length);
    $title='';
    for($i=0;$onepage[$i];){
	if($onepage[$i++] =~ /^% TEXT/){
	    $offset=$i-1;
	    $length=1;
	    while($line = $onepage[$i++]){
		++$length;
		if($line =~/^\s+(\d+) (\d+) M/){
		    $x=$1;
		    $y=$2;
		    if(($x>$xmin)&&($y>$ymin)&&($x<$xmax)&&($y<$ymax)){
			last;
		    }
		} elsif($line =~/^\s+\((.+)\) SH/){
		    $text = $1;
#		    &trans(*x,*y);
		    ($text =~/^\s*(\w+)\s*=\s*(.+)\s*$/) || last; 
		    ($left=$1) =~ tr/A-Z/a-z/;
		    $right=$2;
		    if($left eq 'file'){
			$title=$right;
		    } else { last;}
		    while($line = $onepage[$i++]){
			++$length;
			if($line =~ /^   GR/){
			    last;
			}
		    }
		    splice(@onepage,$offset,$length);
		    $i=$offset;
		}
	    }
	}
    }
}

sub slide_mode{
    $dpsname="$filename.$page.dps";
    $tpsname="$filename.$page.tps";
    open(DPS,"> $dpsname") || die "Cannot open $dpsname";
    open(TPS,"$nkf> $tpsname") || die "Cannot open $tpsname";
    print DPS "%%BoundingBox:  $xhome $yhome $xend $yend\n";
    print DPS "%%Title: $filename.$page\n";
    print TPS "%% Generated by $version\n";
    print TPS "%% Original: $filename.$ext page $page\n";
    print TPS "\\unitlength 1pt\n";
    print TPS "\\begin{picture}($width,$height)\n";
    printf TPS "\\put(0,0){\\special{PSfile=%s llx=%d lly=%d urx=%d ury=%d rwi=%d}}\n",
	"$directory/$filename.$page.dps",$xhome,$yhome,$xend,$yend,$width*$mag*10;
    printf TPS "\\put(16,16){\\Large \\thepage}\n" if $pagenum==1;
    print DPS @header;
    if($page==1){
	print TEX "\\documentstyle[$pt]{$article}\n";
	if($portrait==1){
	    printf TEX "\\setlength{\\textwidth}{%dpt}\n",$xend-$xhome+20;
	    printf TEX "\\setlength{\\textheight}{%dpt}\n",$yend-$yhome+20;
	    print TEX "\\setlength{\\oddsidemargin}{-0.7in}\n";
	    print TEX "\\setlength{\\evensidemargin}{-0.7in}\n";
	    print TEX "\\setlength{\\topmargin}{-0.5in}\n";
	} else {
	    printf TEX "\\setlength{\\textwidth}{%dpt}\n",$xend-$xhome+20;
	    printf TEX "\\setlength{\\textheight}{%dpt}\n",$yend-$yhome+20;
	    print TEX "\\setlength{\\oddsidemargin}{-0.5in}\n";
	    print TEX "\\setlength{\\evensidemargin}{-0.5in}\n";
	    print TEX "\\setlength{\\topmargin}{-0.9in}\n";
	}
	print TEX "\\pagestyle{empty}\n";
	print TEX "\\begin{document}\n";
	if($files==1){
	    print ALL "\\documentstyle[$pt]{$article}\n";
	    if($portrait==1){
		printf ALL "\\setlength{\\textwidth}{%dpt}\n",$xend-$xhome+20;
		printf ALL "\\setlength{\\textheight}{%dpt}\n",$yend-$yhome+20;
		print ALL "\\setlength{\\oddsidemargin}{-0.7in}\n";
		print ALL "\\setlength{\\evensidemargin}{-0.7in}\n";
		print ALL "\\setlength{\\topmargin}{-0.5in}\n";
	    } else {
		printf ALL "\\setlength{\\textwidth}{%dpt}\n",$xend-$xhome+20;
		printf ALL "\\setlength{\\textheight}{%dpt}\n",$yend-$yhome+20;
		print ALL "\\setlength{\\oddsidemargin}{-0.5in}\n";
		print ALL "\\setlength{\\evensidemargin}{-0.5in}\n";
		print ALL "\\setlength{\\topmargin}{-0.9in}\n";
	    }
	    print ALL "\\pagestyle{empty}\n";
	    print ALL "\\begin{document}\n";
	    if($slitex){
		print TEX "\\blackandwhite{null}";
		print ALL "\\blackandwhite{null}";
	    }
	}
    } elsif($slitex==0){
	print TEX "\\newpage\n";
	print ALL "\\newpage\n";
    }
    if($slitex){
	print TEX "\n\\begin{slide}{}";
	print ALL "\n\\begin{slide}{}";
    }
    print TEX "\n\\input{$tpsname}\n";
    print ALL "\n\\input{$tpsname}\n";
    if($slitex){
	print TEX "\\newpage\n\\end{slide}\n";
	print ALL "\\newpage\n\\end{slide}\n";
    }
    while($line = shift(@onepage)){
	if($line =~ /^%%PageBoundingBox/){
	    print DPS "%%PageBoundingBox: $xhome $yhome $xend $yend\n";
	} elsif($line =~ /^%\sTEXT$/){
	    &proc_text;
	} else{
	    print DPS $line;
	}
    }
    print DPS "%MatchingCreationDate: $create\n";
    print TPS "\\end{picture}\n";
    close TPS;
    close DPS;
    print STDERR "$tpsname and $dpsname generated.\n";
}

sub slide_end{
    print TEX "\\end{document}\n";
    close TEX;
    if($merge ne ''){print ALL "\\newpage\n";}
    print STDERR "$filename.tex generated.\n" if $verbose>0;
    if($dvi==1){
	print STDERR "Execute $latex_command $filename.tex.\n" if $verbose>0;
	system("$latex_command $filename.tex");
    }
}

sub get_header{
    # @header - header
    local($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    $week=(Sun,Mon,Tue,Wed,Thu,Fri,Sat)[$wday];
    $month=(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[$mon];
    $year+=1900;
    $create="$week $month $mday $hour:$min:$sec $year";
    while(<PS>){
	if(/^%%Title:/){
	    last;}
    }
    while(<PS>){
	if(/^%%CreationDate:/){
	    push(@header,"%%CreationDate: $create\n");
	} elsif(/^%%Creator:(.*)/){
	    push(@header,"%%Creator: $version (Original: $1)\n");
	} elsif(/^%%Pages:/){
	    push(@header,"%%Pages: 1\n");
	} elsif(/^%%Page\:/){
	    last;
	} elsif(/^%%EndProlog/){
	    push(@header,$_);
	    last;
	} else {
	    push(@header,$_);
	}
    }
}

sub get_onepage{
    local($txmin,$tymin,$txmax,$tymax,$maxint);
    $portrait=1;		# assume portrait
    $page=1;			# assume page 1
    # $page, page number
    # @onepage, ps script of one page
    # $xend $yend $xhome $yhome $width $height -- picture size
    $maxint=10000;
    $xmin=$maxint;
    $ymin=$maxint;
    $xmax=-$maxint;
    $ymax=-$maxint;
    while(<PS>) {		# try to find %%Page: ...
	push(@onepage,$_);
	if(/^%%Page:\s(\d+)\s(\d+)/){
	    $page=$1;
	} elsif(/^90 R/){	# portrait if '90 rotate'
	    $portrait=0;
	    ($xhome,$yhome,$xend,$yend)=($yhome,-$xend,$yend,-$xhome);
	    pop(@onepage);
	    next;
	} elsif(/^72 0 MU (\d+) ([\d\.]+) MU TR/){
	    $adj = $1 * $2;	# get page size
	} elsif(/^% BOX/){	# try to find the largest  box
	    while(<PS>){
		push(@onepage,$_);
		if(/^\s+NP (\d+) (\d+) M (\d+) \d+ L \d+ (\d+)/){
		    ($xmin,$ymin,$xmax,$ymax) =
			(&min($xmin,$1),&min($ymin,$2),&max($xmax,$3),&max($ymax,$4));
		}
		elsif(/^GR/){last;}
	    }
	} elsif(/^showpage/){last;}
    }
    if($xmin!=$maxint){
	($txmin,$tymin,$txmax,$tymax)=($xmin,$ymin,$xmax,$ymax);
	$xhome=$yhome=0;
	&trans(*txmin,*tymin);
	&trans(*txmax,*tymax);
	($xhome,$yhome,$xend,$yend)
	    =(int($txmin),int($tymax),int($txmax),int($tymin));
    }
    if($slide==1){
	if($portrait==1){ # modify these values for adjustment
	    $xhome=30;
	    $yhome=150;
	    $xend=570;
	    $yend=830;
	    }else{
	    $xhome=30;
	    $yhome=-570;
	    $xend=800;
	    $yend=-30;
	}
    }
    $width=$xend-$xhome;
    $height=$yend-$yhome;
    if($_ eq ''){
	return 0;}	# cannot find page
    if($verbose>1){
	if($portrait==1){
	    print STDERR "Page $page is portrait.\n";
	} else {
	    print STDERR "Page $page is landscape.\n";
	}
	if($slide==0){
	    if($xmin==$maxint){
		print STDERR "Cannot find the largest box.\n";
		print STDERR "Assume picture size = $width X $height.\n";
	    } else {
		print STDERR "Picture size = ${width}pt X ${height}pt.\n";
	    }
	}
    }
    return 1;
}

sub trans{			# transform to pt
    local(*x,*y)=@_;
    local($xmag,$ymag);
#    $xmag=1.0015;		# values for adjustment
#    $ymag=1.0018;
    $xmag=1;		# values for adjustment
    $ymag=1;
    $sc=0.5625;
    $yep=1;
    $x=($x*$sc-$xhome)*$xmag;
    if($portrait==1){$y=($adj-($y*$sc)-$yhome)*$ymag+$yep;}
    else{$y=(-$yhome-($y*$sc))*$ymag+$yep;}
}

sub max{
    local($a,$b)=@_;
    $a>$b ? $a :$b;
}

sub min{
    local($a,$b)=@_;
    $a<$b ? $a :$b;
}


sub proc_text{
    local($mode)=@_;
    local(@textbuf,$line,$pt,$size,$ps,$i,$x,$y,$xorg,$yorg,$str,$multi);
    local($tgsw,$ps);
    $str = '';
    $tgsw=0;
    $type = "lb";
    $ps=0;
    $multi=0;
    $x= -1;
    undef @textbuf;
    while($line=shift(@onepage)){
#	print "--$line";
	push(@textbuf,$line);
	if($line =~ /^\s+(\d+) (\d+) TR/){
	    $xorg=$1;
	    $yorg=$2;
	    $x=$xorg;
	    $y=$yorg;
	    &trans(*x,*y);
	}elsif(($line =~ /^\s+(\d+) (\d+) M/) && $x == -1){
	    $xorg=$1;
	    $yorg=$2;
	    $x=$xorg;
	    $y=$yorg;
	    &trans(*x,*y);
	}elsif(($line =~ /^\s+(\d+) (\d+) RM/)){
	    $xorg+=$1;
	    $yorg+=$2;
	    $x=$xorg;
	    $y=$yorg;
	    &trans(*x,*y);
	}elsif($line =~ /^\s+\//){
	    if($line =~ /\[(\d+)/){
		$ptorg=$1;
		$pt=$1*$mag;
		if($pt>0){
		    if($pt<=11){ $size="\\$fontsize[$size18]";}
		    elsif($pt<=12){ $size="\\$fontsize[$size18+1]";}
		    elsif($pt<=14){ $size="\\$fontsize[$size18+2]";}
		    elsif($pt<=17){ $size="\\$fontsize[$size18+3]";}
		    elsif($pt<=18){ $size="\\$fontsize[$size18+4]";}
		    elsif($pt<=20){ $size="\\$fontsize[$size18+5]";}
		    elsif($pt<=25){ $size="\\$fontsize[$size18+6]";}
		    else { $size="\\$fontsize[$size18+7]";}
		}
	    }
	    $font='';
	    $jfont='';
	    $line =~ /-Roman/ &&  ($font="\\rm");
	    $line =~ /-Bold/ && ($font="\\bf");
	    $line =~ /-Oblique-/ && ($font="\\it");
	    $line =~ /-Italic-/ && ($font="\\it");
	    $line =~ /-BoldOblique-/ && ($font="\\sl");
	    $line =~ /-BoldItalic-/ && ($font="\\sl");
	    $line =~ /Ryumin-/ && ($jfont=$ryumin);        
	    $line =~ /Gothic-/ && ($jfont=$gothic);
	} elsif($line =~ /^\s+\((.+)\) SH/){
	    $temp = $1;
	    if($multi >= 1){
		&modify_text(*temp);
		$str=$str."$temp\n";
	    } elsif(($temp =~ /^\.(.+)/) && $str eq ''){
		$ps=1;
		$temp = $1;
		pop(@textbuf);
		push(@textbuf,"            ($1) SH\n");
	    } elsif(($temp =~ /^\!(.+)/) && $str eq ''){
		$temp=$1;
		$multi=1;
		&modify_text(*temp);
		$str=$str."$temp\n";
	    } else {
		&modify_text(*temp);
		$str=$str."{$size$jfont$font $temp}";
	    }
	} elsif($line =~ /\[(\d+)/){
	    $pt=$1*$mag;
	} elsif($line =~ /^\s+2 DI NE 0 RM/){
	    $type='b';
	    $tgsw=0;
	} elsif($line =~ /^      NE 0 RM/){
	    $type='rb';
	    $tgsw=0;
  	} elsif($line =~ /^      GR/){
	    if($tgsw==0){
		if($ps==1){
		    print DPS @textbuf;
		} elsif($multi==1){
		    printf TPS "\\put(%0.1f,%0.1f){\\makebox(0,0)[$type]{$str",$x,$y;
		    $multi=2;
		} elsif($multi==2){
		    printf TPS $str;
		} else {
		    printf TPS "\\put(%0.1f,%0.1f){\\makebox(0,0)[$type]{$str}}\n",$x,$y;
		}
		$ps=0;
		undef @textbuf;
		$str='';
	    }
	} elsif($line =~ /^   GR/){
	    if($multi>=1){
		print TPS "}}\n";
	    }
	    last;
	} elsif($line =~ /TGSW\s*$/){
	    $tgsw=1;
	} elsif($line =~ /^NP.+F$/){
	    print DPS $line;
	    print DPS shift(@onepage);
	    pop(@textbuf);
	}
    }
}


sub modify_text{
    local(*text)=@_;
    if($jfont ne ''){
      $text =~ s/(\\\d\d\d)/sprintf("%c",oct(substr($&,1)))/eg;
    }
    $text =~ s/\\\(/\(/g;
    $text =~ s/\\\)/\)/g;
    $text =~ s/\\\\/\\/g;
}
