#!/usr/bin/jperl # html2dvi by Masayuki Yamasaki # http://math.josai.ac.jp/~yamasaki/ # May 29, 2000 $version = "0.7d"; # Edit the top line,if necessary, and set the following variables # before you use this script. $viewer = 'xdvi -paper 28x250cm';# preview command $unix_flag = 1; # 0 for DOS, 1 for UNIX $use_japanese = 1; # 0 if you do not use Japanese $stylefile = 'html2dvi.st'; # default stylefile name # If you want to process files containing Japanese, then set # the following variables, too. $tex = 'ptex'; # tex program name $kconv_p = 'nkf -X -e'; # command for conversion to Kanji code for perl $kconv_t = ''; # command for conversion to Kanji code for tex $perl_is_japanized = 1; # 0 if your perl is not Japanized $kugiri = 'ĄŁ'; # a line will be folded at this Japanese character $goth = 'goth'; $min = 'min'; # If you set $goth to be 'goth', goth7 font and goth10 font will be used. # You can also set the following variables as you like. $a4hsize = '16truecm'; # hsize for a4 paper $a4vsize = '23.7truecm'; # vsize for a4 paper $b5hsize = '13.2truecm'; # hsize for b5 paper $b5vsize = '20truecm'; # vsize for b5 paper $longvsize = '240cm'; # for -long option $widehsize = '24cm'; # for -wide option $bqfont = '\\sl'; # font for BLOCKQUOTE mode, \\rm, \\it, \\sl, ... $unknown = '\\tt\\char32';# char used for unknown character/entity ## You probably do not need to touch the stuffs below. $gt = 'gt'; $mc = 'mc'; if ($use_japanese == 0) { $tex = 'tex'; $kconv_p = ''; $kconv_t = ''; $gt = 'bf'; $mc = 'rm'; } $lbrace = '$\{$'; $rbrace = '$\}$'; $sharp = '{\tt\#}'; $paper_size = 0; # 0:default, 1:a4, 2:b5 $tabwidth = 4; # TAB size $f_flag = 1;# $ind_t = 0; # index for tables $com_mode = 0; # command mode $omit_mode = 0; $center_mode = 0; $level = 0; # item depth level $kconv_p_flag=0;# Kanji_conversion flag for perl $kconv_t_flag=1;# Kanji_conversion flag for tex $pre_flag = 0; $view_flag = 0; $flip = 0; $endofcell = "\\bstrut"; $newpar = "\\par\n\\medbreak\\noindent"; if ( $kconv_p ne '' ) { $kconv_p_flag = 1; } if ( $kconv_t eq '' || $kconv_t eq $kconv_p ) { $kconv_t_flag = 0; } # Usage: sub usage { die "html2dvi version $version Usage : html2dvi [options] filename(s) Options: -a4 uses A4 size sheet -b5 uses B5 size sheet -long uses long sheet (vsize=$longvsize) -wide uses wide sheet (hsize=$widehsize) -flip flips backquotes -fxxx uses xxx as the stylefile (default=$stylefile) -f does not use a stylefile -v displays the created dvi file -omittable omits tables -notable disregards table commands -nofold no folding in cells "; } # sub my_die { local($str); local($handle); $str = shift; chop $str; print STDERR $str, "\n"; push(@failure, "<$srcfile> $str"); foreach $handle (@_) { close $handle; } next MAIN; } # remove extension from filename sub rmext { local($fname) = @_; local($name) = ($fname =~ m/^([^.]+)/ ); return($name); } # remove directory path from unix filename sub rmpath { local($fname) = @_; local($name) = ($fname =~ m/([^\/]+$)/ ); return($name); } # flip quotationmark sub flipquote { local($string) = @_; $string =~ s/^"/``/g; # "-->`` $string =~ s/ "/ ``/g; # "-->`` $string =~ s/^'/`/g; # '-->` $string =~ s/( |`)'/$1 `/g; # '-->` $string =~ s/"/''/g; # "-->'' return($string); } sub expand_tab { local($string) = @_; local($num); local($spaces); while ( $string =~ /^([^\t]*)\t/ ) { $num = $tabwidth - (length($1) % $tabwidth); $spaces = ' ' x $num; $string =~ s/^([^\t]*)\t/$1$spaces/; } return $string; } # underline sub uline { local($string) = @_; local($out); local($a); local($b); while ($string ne '') { if ($string =~ /%([^%]*)%/) { $a = $`; $b = $1; $string = $'; $a =~ s/(.)/\\ub{\1}/g; $out .= $a . "\\ub{$b}"; } else { $string =~ s/(.)/\\ub{\1}/g; $out .= $string; $string = ''; } } return $out; } # convert &#ddd; to character if ddd < 127 sub convchar { local($string) = @_; local($out); local($a); local($b); while ($string ne '') { if ($string =~ /&#(\d+);/) { $a = $`; $b = $1; $string = $'; if ($b > 126) { $b = "&#$b;"; } else { $b = pack("C", $b); } $out .= ( $a . $b ) } else { $out .= $string; $string ='';} } return $out; } ## convert &#ddd; and &name; to TeX expression ## (need to surround the commands by %) sub convsymbol { local($str)=@_; $str =~ s/<//g; $str =~ s/"/\002/g; $str =~ s/&/%{\\char38}%/g; $str =~ s/&(#160|nbsp);/~/g; $str =~ s/&(#161|iexcl);/%{\\rm\\char60}%/g; $str =~ s/&(#162|cent);/%{\\rm\\rlap\/c}%/g; $str =~ s/&(#163|pound);/%{\\it\\\$}%/g; $str =~ s/&(#165|yen);/%{\\tt\\rlap Y=}%/g; $str =~ s/&(#167|sect);/%{\\S}%/g; $str =~ s/&(#168|uml);/%{\\"{}}%/g; $str =~ s/&(#169|copy);/%{\\copyright}%/g; $str =~ s/&(#170|ordf);/%{\${}^{\\hbox{\\srm a}}\$}%/g; $str =~ s/&(#171|laquo);/%{\$\\ll\$}%/g; $str =~ s/&(#172|not);/%{\$\\lnot\$}%/g; $str =~ s/&(#173|shy);/%{-}%/g; $str =~ s/&(#174|reg);/%{\\regm}%/g; $str =~ s/&(#175|macr);/%{\$\\bar{}\$}%/g; $str =~ s/&(#176|deg);/%{\${}^\\circ\$}%/g; $str =~ s/&(#177|plusmn);/%{\$\\pm\$}%/g; $str =~ s/&(#178|sup2);/%{\${}^2\$}%/g; $str =~ s/&(#179|sup3);/%{\${}^3\$}%/g; $str =~ s/&(#180|acute);/%{\\'{}}%/g; $str =~ s/&(#181|micro);/%{\$\\mu\$}%/g; $str =~ s/&(#182|para);/%{\$\\P\$}%/g; $str =~ s/&(#183|middot);/%{\$\\cdot\$}%/g; $str =~ s/&(#184|cedil);/%{\\c{}}%/g; $str =~ s/&(#185|sup1);/%{\${}^1\$}%/g; $str =~ s/&(#186|ordm);/%{\${}^{\\hbox{\\srm o}}\$}%/g; $str =~ s/&(#187|raquo);/%{\$\\gg\$}%/g; $str =~ s/&(#188|frac14);/%{\$\\scriptstyle1\/4\$}%/g; $str =~ s/&(#189|frac12);/%{\$\\scriptstyle1\/2\$}%/g; $str =~ s/&(#190|frac34);/%{\$\\scriptstyle3\/4\$}%/g; $str =~ s/&(#191|iquest);/%{\\rm\\char62}%/g; $str =~ s/&(#192|Agrave);/%{\\`A}%/g; $str =~ s/&(#193|Aacute);/%{\\'A}%/g; $str =~ s/&(#194|Acirc);/%{\\^A}%/g; $str =~ s/&(#195|Atilde);/%{\\~A}%/g; $str =~ s/&(#196|Auml);/%{\\"A}%/g; $str =~ s/&(#197|Aring);/%{\\AA}%/g; $str =~ s/&(#198|AElig);/%{\\AE}%/g; $str =~ s/&(#199|Ccedil);/%{\\c C}%/g; $str =~ s/&(#200|Egrave);/%{\\`E}%/g; $str =~ s/&(#201|Eacute);/%{\\'E}%/g; $str =~ s/&(#202|Ecirc);/%{\\^E}%/g; $str =~ s/&(#203|Euml);/%{\\"E}%/g; $str =~ s/&(#204|Igrave);/%{\\`I}%/g; $str =~ s/&(#205|Iacute);/%{\\'I}%/g; $str =~ s/&(#206|Icirc);/%{\\^I}%/g; $str =~ s/&(#207|Iuml);/%{\\"I}%/g; $str =~ s/&(#208|ETH);/%{-\\kern-3.5pt D}%/g; $str =~ s/&(#209|Ntilde);/%{\\~N}%/g; $str =~ s/&(#210|Ograve);/%{\\`O}%/g; $str =~ s/&(#211|Oacute);/%{\\'O}%/g; $str =~ s/&(#212|Ocirc);/%{\\^O}%/g; $str =~ s/&(#213|Otilde);/%{\\~O}%/g; $str =~ s/&(#214|Ouml);/%{\\"O}%/g; $str =~ s/&(#215|times);/%{\$\\times\$}%/g; $str =~ s/&(#216|Oslash);/%{\\O}%/g; $str =~ s/&(#217|Ugrave);/%{\\`U}%/g; $str =~ s/&(#218|Uacute);/%{\\'U}%/g; $str =~ s/&(#219|Ucirc);/%{\\^U}%/g; $str =~ s/&(#220|Uuml);/%{\\"U}%/g; $str =~ s/&(#221|Yacute);/%{\\'Y}%/g; $str =~ s/&(#223|szlig);/%{\\ss}%/g; $str =~ s/&(#224|agrave);/%{\\`a}%/g; $str =~ s/&(#225|aacute);/%{\\'a}%/g; $str =~ s/&(#226|acirc);/%{\\^a}%/g; $str =~ s/&(#227|atilde);/%{\\~a}%/g; $str =~ s/&(#228|auml);/%{\\"a}%/g; $str =~ s/&(#229|aring);/%{\\aa}%/g; $str =~ s/&(#230|aelig);/%{\\ae}%/g; $str =~ s/&(#231|ccedil);/%{\\c c}%/g; $str =~ s/&(#232|egrave);/%{\\`e}%/g; $str =~ s/&(#233|eacute);/%{\\'e}%/g; $str =~ s/&(#234|ecirc);/%{\\^e}%/g; $str =~ s/&(#235|euml);/%{\\"e}%/g; $str =~ s/&(#236|igrave);/%{\\`\\i}%/g; $str =~ s/&(#237|iacute);/%{\\'\\i}%/g; $str =~ s/&(#238|icirc);/%{\\^\\i}%/g; $str =~ s/&(#239|iuml);/%{\\"\\i}%/g; $str =~ s/&(#241|ntilde);/%{\\~n}%/g; $str =~ s/&(#242|ograve);/%{\\`o}%/g; $str =~ s/&(#243|oacute);/%{\\'o}%/g; $str =~ s/&(#244|ocirc);/%{\\^o}%/g; $str =~ s/&(#245|otilde);/%{\\~o}%/g; $str =~ s/&(#246|ouml);/%{\\"o}%/g; $str =~ s/&(#247|divide);/%{\$\\div\$}%/g; $str =~ s/&(#248|oslash);/%{\\o}%/g; $str =~ s/&(#249|ugrave);/%{\\`u}%/g; $str =~ s/&(#250|uacute);/%{\\'u}%/g; $str =~ s/&(#251|ucirc);/%{\\^u}%/g; $str =~ s/&(#252|uuml);/%{\\"u}%/g; $str =~ s/&(#253|yacute);/%{\\'y}%/g; $str =~ s/&(#255|yuml);/%{\\"y}%/g; # some HTML4 characters $str =~ s/&(#338|OElig);/%{\\OE}%/g; $str =~ s/&(#339|oelig);/%{\\oe}%/g; $str =~ s/&(#710|circ);/%{\\^{}}%/g; $str =~ s/&(#732|tilde);/%{\\~{}}%/g; $str =~ s/&(#8194|ensp);/%{\\kern.5em}%/g; $str =~ s/&(#8195|emsp);/%{\\kern1em}%/g; $str =~ s/&(#8201|thinsp);/%{\\thinspace}%/g; $str =~ s/&(#8211|ndash);/%{--}%/g; $str =~ s/&(#8212|mdash);/%{---}%/g; $str =~ s/&(#8216|lsquo);/%{`}%/g; $str =~ s/&(#8220|ldquo);/%{``}%/g; $str =~ s/&(#8224|dagger);/%{\$\\dagger\$}%/g; $str =~ s/&(#8225|Dagger);/%{\$\\ddagger\$}%/g; $str =~ s/&(#8226|bull);/%{\$\\bullet\$}%/g; $str =~ s/&(#8230|hellip);/%{\$\\cdots\$}%/g; $str =~ s/&(#8482|trade);/%{\\tt[tm]}%/g; $str =~ s/&[a-zA-Z]+\d*;/%{$unknown}%/g; $str =~ s/&#\d+;/%{$unknown}%/g; return $str; } # html -> tex ( text body -- excluding commands ) sub htmltotex { local($str) = @_; if ($pre_flag > 1 ) { $dollar ='{\tt\$}'; } else { $dollar ='{\rm\$}'; } $str = &expand_tab($str); if ($pre_flag == 0) { $str =~ s/ +/ /g; } $str = &convchar($str); $str =~ s/[\000-\037]//g; # the following characters are saved (do not use \011 -- \015) $str =~ s/\'/\001/g; $str =~ s/\"/\002/g; $str =~ s/\~/\003/g; $str =~ s/\\/\004/g; $str =~ s/\$/\005/g; $str =~ s/\{/\006/g; $str =~ s/\}/\007/g; $str =~ s/\-/\010/g; $str =~ s/\^/\017/g; $str =~ s/\%/\016/g; $str =~ s/\s/\013/g; # first we take care of character/symbol entities if ($str =~ /&/) { $str = &convsymbol($str); } ### now taking care of the underline using % if (($a_flag > 0 && $name_flag[$a_flag] == 0)||$u_flag > 0) { if ($perl_is_japanized == 1 || $use_japanese == 0) { $str = &uline($str); } else { $str = "\\ub{$str}"; } } $str =~ s/%//g; # now taking care of single characters $str =~ s/#/$sharp/g; $str =~ s/&/{\\char38}/g; $str =~ s//{\\tt>}/g; $str =~ s/_/{\\tt\\char95}/g; $str =~ s/\|/{\\tt|}/g; $str =~ s/\!\`/\!{}\`/g; $str =~ s/\?\`/\?{}\`/g; # now restoring the saved characters $str =~ s/\003/{\\tt\\char126}/g; $str =~ s/\004/{\\tt\\char92}/g; $str =~ s/\005/$dollar/g; $str =~ s/\006/$lbrace/g; $str =~ s/\007/$rbrace/g; $str =~ s/\010/{-}/g; $str =~ s/\017/{\\tt\\char94}/g; $str =~ s/\016/\\\%{}/g; if ( $pre_flag == 0) { $str =~ s/,\013(.)/,\n\1/g; if ($use_japanese == 1 && $perl_is_japanized == 1) { $str =~ s/$kugiri(.)/$kugiri\n\1/g; } $str =~ s/\013/ /g; $str =~ s/\001/\'/g; $str =~ s/\002/\"/g; # \001 and \002 between
 
will be converted back later } else { $str =~ s/\013/{\\tt~}/g; } return($str); } # getting atribute from a string sub getatrib { local($str, $opt) = @_; local($out); local($delim); if ($str =~ /$opt\=/i) { $str = $'; if ( $str =~ s/^\"// ) { $delim = "\""; } else { $delim = ' '; } if ( $str =~ /$delim/ ) { $out = $`; } else { $out = $str; } } else { $out = ''; } return ($out); } # setup $_cw{-,-} sub setup_cw { local($c); local($n); local($m); local($s); local($t); local($w); $n = 0; $m = 0; $s = 0; for ($c = 0; $c < $hsize; $c++) { if ($_cw{$ind_t,$c} eq '') { $n++; } else { $s += $_cw{$ind_t,$c}; } if ($_cw_p{$ind_t,$c} eq '') { $m++; } else { $t += $_cw_p{$ind_t,$c}; } } if ($n == $hsize && $m == 0 && $t > 0) { for ($c = 0; $c < $hsize; $c++) { $_cw{$ind_t,$c} = int( ($_cw_p{$ind_t,$c}/$t)*100 ) / 100; } $n = 0; } if ($n > 0) { $w = int((1-$s)*100 / $n)/100; } for ($c = 0; $c < $hsize; $c++) { if ($_cw{$ind_t,$c} eq '') { $_cw{$ind_t,$c} = $w; } if ($_cw{$ind_t,$c} < 0.04) { $_cw{$ind_t,$c} = 0.04; } } } # determine the number of columns sub num_col { local($i); local($n); $n = 1; for ($i = 1; $i <= $ind_t; $i++) { if ($_t_mode[$i] == 1) { $n *= $_columns[$i]; } } return $n; } # outputs the not-yet-fnished cells & setting the new cell data sub handlenewcell { local($cs, $rs) = @_; local($i); local($j); local($k); local($m); local($c); local($w); local($out); local($hsize) = ($_columns[$ind_t]); $out = ''; $i = $hsize * $_row[$ind_t]; while ($_mspan{$ind_t,$i} != 0) { $i++; } ### Now $i is the location of the new cell. $k = $hsize * $_row[$ind_t]; while ( $k < $i ) { if ( $_done{$ind_t,$k} == 0 && ($k < $i) ) { $out .= "&\\multispan{$_mspan{$ind_t,$k}}\\hfill$vrule[$ind_t]"; for ( $m = 0; $m < $_mspan{$ind_t,$k}; $m++ ) { $_done{$ind_t,$k} = 1; $k++; } } else { $k++; } } $out .= "&\\multispan{$cs}{$_tdpre[$ind_t]"; if ($f_flag == 1) { $w = 0; for ($c = $i%$hsize; $c < $i%$hsize + $cs; $c++) { $w += $_cw{$ind_t,$c}; } $out .= "\\vtop{\\hsize=". $w . "\\hsize"; if ($_cellpad[$ind_t] ne '') { $out .= "\\advance\\hsize by -0.6em"; } $out .= "\\normalbaselines\\tstrut "; } else { $out .= "{"; } for ($j = 0; $j < $cs; $j++) { for ($k = 0; $k < $rs; $k++) { $_mspan{$ind_t,$i+$j+$k*$hsize} = $cs; if ( $k == 0 ) { $_done{$ind_t,$i + $j} = 1; } if ( $k == $rs - 1 ) { $_uline{$ind_t,$i+$j+$k*$hsize} = 1; } } } $_clmns[$ind_t] = $i % $hsize + $cs; ### $_clmns is the number of the filled-in cells return $out; } # start a row sub start_row { local($out); if ($notable_flag == 1) { $out = "\\par\\medbreak\n"; } else { if ($_td_flag[$ind_t] == 1) { $out = &complete_cell; } if ($_tr_flag[$ind_t] == 1) { $out .= &complete_row; } $_row[$ind_t]++; $_clmns[$ind_t] = 0; $_tr_flag[$ind_t] = 1; $_td_flag[$ind_t] = 0; } return $out; } # complete a cell sub complete_cell { $_td_flag[$ind_t] = 0; return "$endofcell}$_tdpost[$ind_t]}$vrule[$ind_t]"; } ## complete a row when there is no more data for the row ## except for those cells coming from higher cells ## $_row:row, $_clmns:number of finished cells, $hsize:size of the row sub complete_row { local($i); local($j); local($out); local($hsize) = ($_columns[$ind_t]); $out = ''; while ( $_clmns[$ind_t] < $hsize ) { $i = $_row[$ind_t] * $hsize + $_clmns[$ind_t]; # the location of the next cell if ( $_mspan{$ind_t,$i} > 0 ) { ## this cell comes from a higher one $out .= "&\\multispan{$_mspan{$ind_t,$i}}\\hfill$vrule[$ind_t]"; $_clmns[$ind_t] = $_clmns[$ind_t] + $_mspan{$ind_t,$i}; while ( $i < $_row[$ind_t]*$hsize+$_clmns[$ind_t] ) { $_done{$ind_t,$i} = 1; $i++; } } else { $out .= &handlenewcell(1, 1) . "\\hfill}}$vrule[$ind_t]"; } } $out .= "\\cr" . &print_hrule; $_tr_flag[$ind_t] = 0; return $out; } # find the current table number from the data @t_mode sub c_table { local($i); $i = 0; while ($_t_mode[$i+1] > 0) { $i++; } while ($_t_mode[$i] == 2) { $i--; } return $i; } # find the next table number from the data $_t_mode sub next_table { local($i); $i = 1; while ($_t_mode[$i] > 0) { $i++; } return $i; } # print the horizontal rule sub print_hrule { local($j); local($out); local($hsize) = ($_columns[$ind_t]); if ($_border[$ind_t] == 1 ) { $j = 0; $out = "\n\\omit\\svrule"; while ( $j < $hsize ) { $out .= "&\\multispan{$_mspan{$ind_t,$_row[$ind_t]*$hsize+$j}}\\h"; if ( $_uline{$ind_t,$_row[$ind_t]*$hsize+$j} == 1 ) { $out .= "rule"; } $out .= "fill\\svrule"; $j = $j + $_mspan{$ind_t,$_row[$ind_t]*$hsize+$j}; } $out .= "\\cr"; } else { $out = "\n\\noalign{$hrule[$ind_t]}"; } return $out; } # converts HTML commands to TeX sub conv_com { local($com, $xx) = @_; local($out); if ($com =~ /^(LI|\/P|LH|DT|DD|CENTER|TD)$/i) { $in_par = 0; } if ($com =~ /^(LI|DT|DD|TD)$/i) { $newpar = ""; } if ($com =~ /^HEAD$/i) { $out = "\\OMIT{"; $head_flag = 1; } elsif ($com =~ /^\/HEAD/i) { $out = '}'; $head_flag = 0; } elsif ($com =~ /^BODY$/i) { if ($head_flag == 1) { print STDERR "Missing tag?\n"; $out = "}"; } else { $out = ''; } $head_flag = 0; } elsif ($head_flag == 1) { $out = ''; } elsif ($com =~ /^APPLET$/i) { $out = "{\\tt [applet]}"; $app_flag = 1; } elsif ($com =~ /^\/APPLET$/i) { $out = ''; $app_flag = 0; } elsif ($app_flag == 1) { $out = ''; } elsif ($com =~ /^CAPTION$/i) { $out = "\\OMIT{"; } elsif ($com =~ /^\/CAPTION$/i) { $out = "}";} elsif ($com =~ /^SELECT$/i) { $out="{\\tt[".&htmltotex($com)."]}\\OMIT{"; } elsif ($com =~ /^\/SELECT$/i) { $out="}"; } elsif ($com =~ /^INPUT$/i) { $out = &getatrib($xx, "VALUE"); if ($out eq '') { $out = &getatrib($xx, "TYPE"); } if ($out eq '') { $out = "button"; } $out = "\\tt[".&htmltotex($out)."]"; } elsif ($com =~ /^IMG$/i) { $xx = &getatrib($xx, "ALT"); if ($xx eq '') { $xx='img'; } $xx = &htmltotex($xx); $xx =~ s/ /~/g; $out ="{\\tt[$xx]}"; } elsif ($com =~ /^H[12]$/i) { if ($_td_flag[$ind_t] == 0) { $out = "$newpar"; } $out .= "{\\bbbf\\bb$gt "; } elsif ($com =~ /^H[34]$/i) { if ($_td_flag[$ind_t] == 0) { $out = "$newpar"; } $out .= "{\\bbf\\b$gt "; } elsif ($com =~ /^H[56]$/i) { if ($_td_flag[$ind_t] == 0) { $out = "$newpar"; } $out .= "{\\bf\\$gt "; } elsif ($com =~ /^\/H\d$/i) { $out = "}"; if ($_td_flag[$ind_t] == 0) { $out .= "\\par\n\\medbreak "; } $newpar = "\\par\n\\medbreak\\noindent"; } elsif ($com =~ /^P$/i) { if ($in_par == 1) { $out = "\\par\n\\medbreak "; } else { $out =''; } } elsif ($com =~ /^\/P$/i) { $out = "\\par\n\\medbreak{}"; } elsif ($com =~ /^W?BR$/i) { $out = "~\\par\n"; } elsif ($com =~ /^HR$/i) { $out="\\par\n\\medbreak\\hrule\\par\n\\medbreak "; } elsif ($com =~ /^[UO]L$/i) { $level++; if ($com =~ /^OL$/i) { $ol_flag = 1; $_num[$level] = &getatrib($xx, "START"); if ($_num[$level] == '') { $_num[$level] = 1; } } else { $ol_flag = 0; } $out="\\par\n{\\advance\\leftskip20pt "; } elsif ($com =~ /^\/[UO]L$/i) { $level--; $out = "\\par}\\medbreak\\rm\\$mc "; } elsif ($com =~ /^LI$/i) { if ($ol_flag == 0) { if ($level == 1) { $li_num = "\$\\bullet\$"; } elsif ($level == 2) { $li_num = "\$\\circ\$"; } elsif ($level > 2) { $li_num = "\$\\diamond\$"; } } else { $li_num = $_num[$level] . "."; $_num[$level]++; } $out = "\\par\n\\indent"; $out .= "\\llap" if ($level > 0); # mmmm... this does not work well ... $out .= "{$li_num\\enspace}"; } elsif ($com =~ /^LH$/i) { $out="\\par\n\\indent\\llap{\\enspace}"; } elsif ($com =~ /^DL$/i) { $out ="\\par\n{"; $out .= "\\advance\\leftskip " . (1+$_dt[$level])*20 . "pt\n"; $level++; $dl = 0; $_dt[$level] = 0; } elsif ($com =~ /^\/DL$/i) { $level--; if ($dl > 0) { $out = "\\par}\n"; } $out .= "\\par}%%end DL\n\\medbreak{}"; } elsif ($com =~ /^DT$/i) { if ($dl > 0) { $out = "\\par}\n"; } $out .= "%%DT\n{\\advance\\leftskip -20pt\n\\bf\\$gt\n"; $dl++; $_dt[$level] = 1; } elsif ($com =~ /^DD$/i) { if ($dl > 0) { $out = "\\par}\n"; } $out .= "%%DD\n{\\rm\\$mc\n"; $dl++; $_dt[$level] = 0; } elsif ($com =~ /^(B|BLINK|STRONG)$/i) { $out = "{\\bf\\$gt "; } elsif ($com =~ /^(I|CITE|EM|VAR)$/i) { $out = "{\\$gt\\it "; } elsif ($com =~ /^\/(B|BLINK|STRONG|I|CITE|EM|VAR)$/i) { $out = "}"; } elsif ($com =~ /^(TT|CODE|KBD|SAMP|ADDRESS)$/i) { $out = "{\\tt "; } elsif ($com =~ /^BIG$/i) { $out ="{\\bbrm\\bb$mc "; } elsif ($com =~ /^SMALL$/i) { $out ="{\\srm\\s$mc "; } elsif ($com =~ /^\/(TT|CODE|KBD|SAMP|ADDRESS|BIG|SMALL)$/i) { $out = "}"; } elsif ($com =~ /^SUP$/i) { $out = "\\hbox{\${}^{\\hbox{"; } elsif ($com =~ /^SUB$/i) { $out = "\\hbox{\${}_{\\hbox{"; } elsif ($com =~ /^\/SU[PB]/i) { $out = "}}\$}"; } elsif ($com =~ /^(A)$/i) { if ($a_flag > 0) { print STDERR "found <$1> in line $line_num ... OK?\n"; # $a_flag--; } $a_flag++; $out = "{"; if ( $xx =~ /NAME/i ) { $name_flag[$a_flag] = 1; } else { $name_flag[$a_flag] = 0; } } elsif ($com =~ /^(\/A)$/i) { if ($a_flag >0) { $out = "}"; $a_flag--; } else { print STDERR "found an extra <$1> tag in line $line_num\n"; $out = ''; } } elsif ($com =~ /^U$/i) { if ($u_flag > 0) { print STDERR "found <$1> in line $line_num ... OK?\n"; $u_flag--; } $u_flag++; $out = "{"; } elsif ($com =~ /^(\/U)$/i) { if ($u_flag >0) { $out = "}"; $u_flag--; } else { print STDERR "found an extra <$1> tag in line $line_num\n"; $out = ''; } } elsif ($com =~ /^S$/i) { $out = "\\strikeout{"; } elsif ($com =~ /^NOBR$/i) { $out = "\\hbox{"; } elsif ($com =~ /^\/(S|NOBR)$/i) { $out = "}"; } elsif ($com =~ /^CENTER$/i) { $out = "\\par\n\\medbreak{\\everypar{\\hfil}\n"; $center_mode++; } elsif ($com =~ /^(\/CENTER)$/i) { if ($center_mode > 0) { $out = "}\\par\n\\medbreak "; $center_mode--; } else { print STDERR "found an extra <$1> tag in line $line_num\n"; $out = ''; } } elsif ($com =~ /^DIV$/i) { $div_atr = &getatrib($xx, "ALIGN"); $div_com = ''; if ($div_atr =~ /^center$/i) { $div_com = "\\hfil"; } elsif ($div_atr =~ /^right$/i) { $div_com = "\\hfill"; } $out = "\\par\n{\\everypar{$div_com}\n"; } elsif ($com =~ /^\/DIV$/i) { $out = "}\\par\n"; } elsif ($com =~ /^PRE$/i) { $pre_flag++; $out = "\\par\n\\medbreak{\\tt\n"; } elsif ($com =~ /^\/PRE/i) { $pre_flag--; $out ="}\\par\n\\medbreak "; } elsif ($com =~ /^BLOCKQUOTE$/i) { $out = "\\par\\medbreak\n{\\advance\\leftskip20pt\\advance"; $out .= "\\rightskip20pt\n$bqfont\\noindent "; } elsif ($com =~ /^\/BLOCKQUOTE$/i) { $out = "\\par\n\\medbreak\n}"; } elsif ($com =~ /^TABLE/i) { $ind_t = &next_table; $_t_mode[$ind_t] = 1; if ($debug == 1) { $_border[$ind_t] = 1; } if ($_border[$ind_t] == 1) { $hrule[$ind_t] = "\\hrule"; $vrule[$ind_t] = "\\vrule"; } else { $hrule[$ind_t] ="\\hrule height 0pt"; $vrule[$ind_t] = ''; } if (&num_col > 10) { $_cellpad[$ind_t] = ''; } if ($omittable_flag == 1) { $hsize = 1; return "{\\tt[table]}\\par\\OMIT{"; } if ($notable_flag == 1) { $hsize = 1; return "\\par\\medbreak{\\everypar{}\\normalbaselines\n{\\bbf\\b$gt $_caption[$ind_t]}\n"; } $hsize = $_columns[$ind_t]; if ($hsize == 0) { &my_die(" (Try -omittable/-notable options:line $line_num)\n", "SRC", "TEX"); } $width = &getatrib($xx,"WIDTH"); if ($width ne '') { if ($width =~ /\%$/) { $width = "\\hsize=" . $`/100 . "\\hsize"; } else { $width = "\\hsize=" . 0.3*$width . "mm"; } } &setup_cw; $_clmns[$ind_t] = 0; $_row[$ind_t] = -1; # $_row = 0 on the first row. $out = "\\par\n\\bigbreak$_cen[$ind_t]\n"; $out .= "%%%% table %%%%\n"; $out .= "\\indent\\vbox{$width\\offinterlineskip\\everypar{} "; $out .= "\\tabskip=0pt\n\\halign{$vrule[$ind_t]\\strut#"; $out .= "&#"x $hsize . "\\cr\n"; $out .= "\\omit&\\multispan{$hsize}\\hfill{\\bbf\\b$gt $_caption[$ind_t]}\\hfill\\cr\n"; $out .= "\\omit&\\multispan{$hsize}\\vrule width 0pt height 6pt\\hfill\\cr\n"; $out .= "\\noalign{$hrule[$ind_t]}"; } elsif ($com =~ /^\/TABLE$/i) { $vsize = $_rows[$ind_t]; if ($omittable_flag == 1) { return "}"; } if ($notable_flag == 1) { return "\\par}\\medbreak\n"; } if ($_td_flag[$ind_t] == 1) { $out = &complete_cell; } if ($_tr_flag[$ind_t] == 1) { $out .= &complete_row; } $_row[$ind_t]++; while ($_row[$ind_t] < $vsize) { $_clmns[$ind_t] = 0; $out .= &complete_row; $_row[$ind_t]++; } $out .= "}}$_cen[$ind_t]\\par\n%%%% end of table %%%%\n"; $_t_mode[$ind_t] = 2; $ind_t = &c_table; } elsif ($com =~ /^T[DH]$/i) { if ($notable_flag == 1) { return "\\par\\medbreak\n"; } if ($_row[$ind_t] == -1) { $out = &start_row; } if ($_td_flag[$ind_t] == 1) { $out = &complete_cell; } $_td_flag[$ind_t] = 1; $_tdpre[$ind_t] = "$_cellpad[$ind_t]"; $_tdpost[$ind_t] = "$_cellpad[$ind_t]"; $align = &getatrib($xx, "ALIGN"); if ($align =~ /^left$/) { $_tdpost[$ind_t] .= "\\hfill"; } elsif ($align =~ /^right$/) { $_tdpre[$ind_t] .= "\\hfill "; } elsif ($align =~ /^center$/ || $com =~ /^TH$/i) { $_tdpre[$ind_t] .= "\\hfill "; $_tdpost[$ind_t] .= "\\hfill"; } else { $_tdpost[$ind_t] .= "\\hfill"; } if ($com =~ /^TH$/i) { $_tdpre[$ind_t] .= "\\bf\\$gt "; } $cs = &getatrib($xx, "COLSPAN"); $rs = &getatrib($xx, "ROWSPAN"); if ( $cs eq '' ) { $cs = 1; } if ( $rs eq '' ) { $rs = 1; } $out .= &handlenewcell($cs,$rs); } elsif ($com =~ /^\/T[DH]$/i) { if ($notable_flag == 1) { return "\\par\\medbreak\n"; } $out = &complete_cell; } elsif ($com =~ /^TR$/i) { $ind_t = &c_table; $out = &start_row; } elsif ($com =~ /^\/TR$/i) { if ($notable_flag == 1) { return "\\par\\medbreak\n"; } if ($_td_flag[$ind_t] == 1) { $out = &complete_cell; } $out .= &complete_row; } else { $out = ''; } return($out); } # try to locate the first command from a string sub getcom { local($str) = @_; local($aa); local($bb); local($cc); local($xx); if ( $com_mode == 1 ) { if ( $str =~ /\>/ ) { $str = $'; $com_mode = 0; } else { return ('', '', '', ''); } } if ( $str =~ /\/ ) { $bb = $`; $cc = $'; } else { $com_mode = 1; $cc = ''; } if ( $bb =~ / / ) { $bb = $`; $xx = $'; } } else { $aa = $str; $bb= ''; $cc = ''; $xx = ''; } return ($aa, $bb, $xx, $cc); } # omit comments sub omit { local($str) = @_; local($out); if ( $omit_mode == 1 ) { if ( $str =~ /--\>/ ) { $str = $'; $omit_mode = 0; } else { $str = ''; } } if ( $str =~ /\