File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / bird / doc / sbase / dist / fmt_latex2e.pl
Revision 1.1: download - view: text, annotated - select for diffs - revision graph
Tue Aug 22 12:33:54 2017 UTC (6 years, 10 months ago) by misho
CVS tags: MAIN, HEAD
Initial revision

    1: #
    2: #  fmt_latex2e.pl
    3: #
    4: #  $Id: fmt_latex2e.pl,v 1.1 2017/08/22 12:33:54 misho Exp $
    5: #
    6: #  LaTeX-specific driver stuff
    7: #
    8: #  © Copyright 1996, Cees de Groot
    9: #
   10: #  Support for PDF files: added by Juan Jose Amor, January 2000
   11: #  © Copyright 2000, Juan Jose Amor
   12: #
   13: package LinuxDocTools::fmt_latex2e;
   14: use strict;
   15: 
   16: use LinuxDocTools::CharEnts;
   17: use LinuxDocTools::Vars;
   18: use LinuxDocTools::Lang;
   19: 
   20: use File::Copy;
   21: 
   22: my $latex2e = {};
   23: $latex2e->{NAME} = "latex2e";
   24: $latex2e->{HELP} = <<EOF;
   25:   Note that this output format requires LaTeX 2e.
   26: 
   27: EOF
   28: $latex2e->{OPTIONS} = [
   29:    { option => "output", type => "l", 
   30:      'values' => [ "dvi", "tex", "ps", "pdf" ], short => "o" },
   31:    { option => "bibtex", type => "f",  short => "b" },
   32:    { option => "makeindex", type => "f",  short => "m" },
   33:    { option => "pagenumber", type => "i", short => "n" },
   34:    { option => "quick",  type => "f",  short => "q" },
   35:    { option => "dvips",  type => "l",
   36:      'values' => [ "dvips", "dvi2ps", "jdvi2kps" ], short => "s" },
   37:    { option => "latex",  type => "l",  
   38:      'values' => [ "latex", "hlatexp", "platex", "jlatex" ], short => "x" }
   39: ];
   40: $latex2e->{output} = "tex";
   41: $latex2e->{pagenumber} = 1;
   42: $latex2e->{quick}  = 0;
   43: $latex2e->{bibtex}  = 0;
   44: $latex2e->{makeindex} = 0;
   45: $latex2e->{latex} = "unknown";
   46: $latex2e->{dvips} = "unknown";
   47: $Formats{$latex2e->{NAME}} = $latex2e;
   48: 
   49: $latex2e->{preNSGMLS} = sub {
   50:   $global->{NsgmlsOpts} .= " -ifmttex ";
   51: 
   52:   #  for Japanese jlatex users
   53:   if ($global->{language} eq "ja" && $latex2e->{latex} eq "unknown") {
   54:   	$latex2e->{latex} = "jlatex";
   55: 	$latex2e->{dvips} = "dvi2ps";
   56:   # for Japanese platex users
   57:   #	$latex2e->{latex} = "platex";
   58:   #	$latex2e->{dvips} = "dvips";
   59:   }
   60: 
   61:   # for Korean users
   62:   if ($global->{language} eq "ko" && $latex2e->{latex} eq "unknown") {
   63:   	$latex2e->{latex} = "hlatexp";
   64:   }
   65: 
   66:   # default process command
   67:   $latex2e->{latex} = "latex" if ($latex2e->{latex} eq "unknown");
   68:   $latex2e->{dvips} = "dvips" if ($latex2e->{dvips} eq "unknown");
   69: 
   70:   $global->{NsgmlsPrePipe} = "cat $global->{file} ";
   71: };
   72: 
   73: # extra `\\' here for standard `nsgmls' output
   74: my %latex2e_escapes;
   75: $latex2e_escapes{'#'} = '\\\\#';
   76: $latex2e_escapes{'$'} = '\\\\$';
   77: $latex2e_escapes{'%'} = '\\\\%';
   78: $latex2e_escapes{'&'} = '\\\\&';
   79: $latex2e_escapes{'~'} = '\\\\~{}';
   80: $latex2e_escapes{'_'} = '\\\\_';
   81: $latex2e_escapes{'^'} = '\\\\^{}';
   82: $latex2e_escapes{'\\'} = '\\verb+\\+';
   83: $latex2e_escapes{'{'} = '\\\\{';
   84: $latex2e_escapes{'}'} = '\\\\}';
   85: $latex2e_escapes{'>'} = '{$>$}';
   86: $latex2e_escapes{'<'} = '{$<$}';	# wouldn't happen, but that's what'd be
   87: $latex2e_escapes{'|'} = '{$|$}';
   88: 
   89: my $in_verb;
   90: my $remove_comment; # added 2000 Jan 25 by t.sano
   91: 
   92: # passed to `parse_data' below in latex2e_preASP
   93: my $latex2e_escape = sub {
   94:     my ($data) = @_;
   95: 
   96:     if (!$in_verb) {
   97: 	# escape special characters
   98: 	$data =~ s|([#\$%&~_^\\{}<>\|])|$latex2e_escapes{$1}|ge;
   99:     }
  100: 
  101:     return ($data);
  102: };
  103: 
  104: #
  105: #  Translate character entities and escape LaTeX special chars.
  106: #
  107: $latex2e->{preASP} = sub
  108: {
  109:   my ($infile, $outfile) = @_;
  110: 
  111:   # note the conversion of `sdata_dirs' list to an anonymous array to
  112:   # make a single argument
  113:   my $tex_char_maps = load_char_maps ('.2tex', [ Text::EntityMap::sdata_dirs() ]);
  114: 
  115:   # ASCII char maps are used in the verbatim environment because TeX
  116:   # ignores all the escapes
  117:   my $ascii_char_maps = load_char_maps ('.2ab', [ Text::EntityMap::sdata_dirs() ]);
  118:   $ascii_char_maps = load_char_maps ('.2l1b', [ Text::EntityMap::sdata_dirs() ]) if $global->{charset} eq "latin";
  119: 
  120:   my $char_maps = $tex_char_maps;
  121: 
  122:   # used in `latex2e_escape' anonymous sub to switch between escaping
  123:   # characters from SGML source or not, depending on whether we're in
  124:   # a VERB or CODE environment or not
  125:   $in_verb = 0;
  126: 
  127:   # switch to remove empty line from TeX source or not, depending
  128:   # on whether we're in a HEADING or ABSTRACT environment or not
  129:   $remove_comment = 0;
  130: 
  131:   while (<$infile>)
  132:     {
  133:       if (/^-/)
  134:         {
  135: 	    my ($str) = $';
  136: 	    chop ($str);
  137: 	    $_ = parse_data ($str, $char_maps, $latex2e_escape);
  138: 	    if ($remove_comment)
  139: 	      {
  140: 		s/(\s+\\n)+//;
  141: 	      }
  142: 	    print $outfile "-" . $_ . "\n";
  143:         }
  144:       elsif (/^A/)
  145:         {
  146: 	  /^A(\S+) (IMPLIED|CDATA|NOTATION|ENTITY|TOKEN)( (.*))?$/
  147: 	      || die "bad attribute data: $_\n";
  148: 	  my ($name,$type,$value) = ($1,$2,$4);
  149: 	  if ($type eq "CDATA")
  150: 	    {
  151: 	      # CDATA attributes get translated also
  152: 	      if ($name eq "URL" or $name eq "ID" or $name eq "CA")
  153: 	        {
  154: 		  # URL for url.sty is a kind of verbatim...
  155: 		  # CA is used in "tabular" element.
  156: 		  # Thanks to Evgeny Stambulchik, he posted this fix
  157: 		  # on sgml-tools list. 2000 May 17, t.sano
  158: 		  my $old_verb = $in_verb;
  159: 		  $in_verb = 1;
  160: 		  $value = parse_data ($value, $ascii_char_maps, 
  161: 		      $latex2e_escape);
  162: 		  $in_verb = $old_verb;
  163: 		}
  164: 	      else
  165: 	        {
  166: 	          $value = parse_data ($value, $char_maps, $latex2e_escape);
  167: 		}
  168: 	    }
  169: 	  print $outfile "A$name $type $value\n";
  170:         }
  171:       elsif (/^\((VERB|CODE)/)
  172:         {
  173: 	  print $outfile $_;
  174: 	  # going into VERB/CODE section
  175: 	  $in_verb = 1;
  176: 	  $char_maps = $ascii_char_maps;
  177: 	}
  178:       elsif (/^\)(VERB|CODE)/)
  179:         {
  180: 	  print $outfile $_;
  181: 	  # leaving VERB/CODE section
  182: 	  $in_verb = 0;
  183: 	  $char_maps = $tex_char_maps;
  184: 	}
  185:       elsif (/^\((HEADING|ABSTRACT)/)
  186:         {
  187: 	  print $outfile $_;
  188: 	  # empty lines (comment in sgml source) do harm 
  189:           # in HEADING or ABSTRACT
  190: 	  $remove_comment = 1;
  191: 	}
  192:       elsif (/^\)(HEADING|ABSTRACT)/)
  193:         {
  194: 	  print $outfile $_;
  195: 	  # leaving HEADING or ABSTRACT section
  196: 	  $remove_comment = 0;
  197: 	}
  198:       else
  199:         {
  200: 	  print $outfile $_;
  201:         }
  202:     }
  203: };
  204: 
  205: # return the string of the name of the macro for urldef
  206: sub latex2e_defnam($)
  207: {
  208:     my ($num) = @_;
  209: 
  210:     if ($num > 26*26*26) {
  211:        die "Too many URLs!\n";
  212:     }
  213: 
  214:     my $anum = ord("a");
  215: 
  216:     my $defnam = chr ($anum + ($num / 26 / 26)) .
  217:                  chr ($anum + ($num / 26 % 26)) .
  218:                  chr ($anum + ($num % 26));
  219: 
  220:     return ($defnam);
  221: };
  222: 
  223: #
  224: #  Take the sgmlsasp output, and make something
  225: #  useful from it.
  226: #
  227: $latex2e->{postASP} = sub
  228: {
  229:   my $infile = shift;
  230:   my $filename = $global->{filename};
  231:   my $tmplatexdir = $global->{tmpbase} . "-latex-" . $$ . ".dir";
  232:   my $tmplatexnam = $tmplatexdir . "/" . $filename;
  233:   my @epsfiles = ();
  234:   my @texlines = ();
  235:   my @urldefines = ();
  236:   my @urlnames = ();
  237:   my $urlnum = 0;
  238:   my $tmpepsf;
  239:   my $saved_umask = umask;
  240:   $ENV{TEXINPUTS} .= ":$main::DataDir";
  241: 
  242:   umask 0077;
  243:   mkdir ($tmplatexdir, 0700) || return -1;
  244: 
  245:   #
  246:   # check epsfile is specified in source file
  247:   # check nameurl specified in source file
  248:   #
  249:   {
  250:       my $epsf;
  251:       open SGMLFILE, "<$filename.sgml";
  252:       while (<SGMLFILE>)
  253:         {
  254: 	# for epsfile
  255:            if ( s/^\s*<eps\s+file=(.*)>/$1/ )
  256:              {
  257:                s/\s+angle=.*//;
  258:                s/\s+height=.*//;
  259:                s/\"//g;
  260:                $epsf = $_;
  261:                chop ( $epsf );
  262:                push @epsfiles, $epsf;
  263:              }
  264:            if ($latex2e->{output} eq "pdf")
  265:              {
  266: 	       if ( s/^\s*<img\s+src=(.*)>/$1/ )
  267:                  {
  268:                    s/\"//g;
  269:                    $epsf = $_;
  270:                    chop ( $epsf );
  271:                    push @epsfiles, $epsf;
  272:                  }
  273:              }
  274:         }
  275:       close SGMLFILE;
  276:   }
  277:   {
  278:       my $urlid;
  279:       my $urlnam;
  280:       my $urldef;
  281:       while (<$infile>)
  282: 	{
  283: 	   push @texlines, $_;
  284: 	# for nameurl
  285: 	   if ( /\\nameurl/ )
  286: 	     {
  287: 		($urlid, $urlnam) = ($_ =~ /\\nameurl\{(.*)\}\{(.*)\}/);
  288: 		print $urlnum . ": " . $urlid . "\n" if ( $global->{debug} );
  289: 
  290: 		$urldef = latex2e_defnam($urlnum) . "url";
  291: 		s/\\nameurl\{.*\}\{.*\}/{\\em $urlnam} {\\tt \\$urldef}/;
  292: 		push @urlnames, $_;
  293: 		push @urldefines, "\\urldef{\\$urldef} \\url{$urlid}\n";
  294: 		$urlnum++;
  295: 	     }
  296:         }
  297:       close $infile;
  298:   }
  299: 
  300:   open OUTFILE, ">$tmplatexnam.tex";
  301:   #
  302:   #  Set the correct \documentclass options.
  303:   #
  304:     {
  305:       my $langlit = ISO2English ($global->{language});
  306:       $langlit = ($langlit eq 'english') ? "" : ",$langlit"; 
  307:       my $replace = $global->{papersize} . 'paper' .   $langlit;
  308:       my $hlatexopt = "";
  309:       $global->{charset} = "nippon" if ($global->{language} eq "ja");
  310:       $global->{charset} = "euc-kr" if ($global->{language} eq "ko");
  311:       $replace = $global->{papersize} . 'paper' if ($global->{charset} eq "nippon") || ($global->{charset} eq "euc-kr");
  312:       while (defined($texlines[0]))
  313:         {
  314: 	  $_ = shift @texlines;
  315:           if (/^\\documentclass/) 
  316: 	    {
  317: 	      if ($global->{language} ne "en" ||
  318: 		  $global->{papersize} ne "a4")
  319: 		{
  320: 		   s/\\documentclass\[.*\]/\\documentclass\[$replace\]/;
  321: 		}
  322: 	      if ($global->{charset} eq "nippon") {
  323: 		 if ($latex2e->{latex} eq "platex") {
  324: 		   s/{article}/{jarticle}/;
  325: 		 } elsif ($latex2e->{latex} eq "jlatex") {
  326: 		   s/{article}/{j-article}/;
  327: 		 }
  328: 	      }
  329:               $_ = $_ . "\\makeindex\n" if ($latex2e->{makeindex});
  330:             }
  331:           if (/^\\usepackage.epsfig/ && ($global->{charset} eq "euc-kr"))
  332:             {
  333:               $hlatexopt = "[noautojosa]" if ($latex2e->{latex} eq "hlatexp");
  334:               $_ = $_ . "\\usepackage" . "$hlatexopt" . "{hangul}\n"
  335:             }
  336:           if ((/\\usepackage.t1enc/) &&
  337: 		 (($global->{charset} eq "nippon") || 
  338: 		  ($global->{charset} eq "euc-kr")))
  339:             {
  340: 		s/^/%%/;
  341:             }
  342:           if (/%end-preamble/)
  343: 	    {
  344: 	      if ($latex2e->{pagenumber}) 
  345:                 {
  346: 		  $_ = $_ . '\setcounter{page}{'. 
  347: 		       $latex2e->{pagenumber} . "}\n";
  348: 	        } 
  349: 	      else 
  350: 	        {
  351: 		  $_ = $_ . "\\pagestyle{empty}\n";
  352: 	        }
  353: 	      $_ = $_ . $global->{pass} . "\n" if ($global->{pass});
  354: 	    }
  355:        	  if (/\\nameurl/ && $latex2e->{output} ne "pdf")
  356:             {
  357: 		$_ = shift @urlnames;
  358: 	    }
  359: 	  print OUTFILE;
  360:           if (/%end-preamble/)
  361: 	    {
  362: 		if ($urlnum && $latex2e->{output} ne "pdf")
  363: 		  {
  364: 			while (defined($urldefines[0]))
  365: 			  {
  366: 				$_ = shift @urldefines;
  367: 				print OUTFILE;
  368: 			  }
  369: 		  }
  370: 	    }
  371: 	}
  372:     }
  373:   close OUTFILE;
  374: 
  375:   #
  376:   #  LaTeX, dvips, and assorted cleanups.
  377:   #
  378:   if ($latex2e->{output} eq "tex")
  379:     { 
  380: # comment out, because this backup action is not documented yet.
  381: #
  382: #      if ( -e "$filename.tex" ) {
  383: #         rename ("$filename.tex", "$filename.tex.back");
  384: #      }
  385: 
  386:       umask $saved_umask;
  387:       copy ("$tmplatexnam.tex", "$filename.tex");
  388:       if ( ! $global->{debug} )
  389:         {
  390:           unlink ("$tmplatexnam.tex");
  391:           rmdir ($tmplatexdir) || return -1;
  392:         }
  393: 
  394:       return 0; 
  395:     }
  396: 
  397:   #
  398:   # Run LaTeX in nonstop mode so it won't prompt & hang on errors.
  399:   # Suppress the output of LaTeX on all but the last pass, after
  400:   # references have been resolved.  This avoids large numbers of
  401:   # spurious warnings.
  402:   #
  403:   my $current_dir;
  404:   chop ($current_dir = `pwd`);
  405:   print $current_dir . "\n" if ( $global->{debug} );
  406: 
  407:   #
  408:   # copy epsfiles specified in tex file
  409:   #
  410:   for my $epsf ( @epsfiles )
  411:    {
  412:       $tmpepsf = $tmplatexdir . "/" . $epsf; 
  413:       print $epsf . " " . $tmpepsf . "\n" if ( $global->{debug} );
  414:       copy ("$epsf", "$tmpepsf") or die "can not copy graphics\n";
  415:    }
  416: 
  417:   #
  418:   # go to the temporary directory
  419:   chdir ($tmplatexdir);
  420: 
  421:   my ($latexcommand) = "$latex2e->{latex} '\\nonstopmode\\input{$filename.tex}'";
  422: 
  423:   #
  424:   # We run pdflatex instead of latex if user selected pdf output
  425:   #
  426:   if ($latex2e->{output} eq "pdf")
  427:     {
  428:       $latexcommand = "pdflatex '\\nonstopmode\\input{$filename.tex}'";
  429:     }
  430: 
  431:   # 
  432:   # run hlatex if hlatexp is used
  433:   # for pdf: how about status?(for hlatex and hlatexp)
  434:   #
  435:   if ($latex2e->{latex} eq "hlatexp")
  436:     {
  437:       #$latex2e->{output} = "ps" if ($latex2e->{output} eq "pdf");
  438:       $latexcommand = "hlatex '\\nonstopmode\\input{$filename.tex}'";
  439:     }
  440: 
  441:   #
  442:   # We use jlatex for Japanese encoded (euc-jp) characters.
  443:   # pdf support for Japanese are not yet. use ps for the time being.
  444:   #
  445:   if ($global->{charset} eq "nippon")
  446:     {
  447:       $latex2e->{output} = "ps" if ($latex2e->{output} eq "pdf");
  448:       $latexcommand = "$latex2e->{latex} '\\nonstopmode\\input{$filename.tex}'"
  449:     }
  450:   my ($suppress) = $latex2e->{quick} ? "" : ' >/dev/null';
  451: 
  452:   system $latexcommand . $suppress  || die "LaTeX problem\n";
  453:   $latex2e->{bibtex} && system "bibtex $filename.tex";
  454:   $latex2e->{quick} || system $latexcommand . ' >/dev/null';
  455:   $latex2e->{quick} || system $latexcommand;
  456:   if ( ! $global->{debug} )
  457:     {
  458:       my @suffixes = qw(log blg aux toc lof lot dlog bbl out);
  459:       for my $suf (@suffixes)
  460:         {
  461:           unlink "$tmplatexnam.$suf";
  462:         }
  463:     }
  464:   #
  465:   # go back to the working directory
  466:   chdir ($current_dir);
  467:   #
  468:   # output dvi file
  469:   if ($latex2e->{output} eq "dvi")
  470:     {
  471: # comment out, because this backup action is not documented yet.
  472: #
  473: #      if ( -e "$filename.dvi" )
  474: #        {
  475: #          rename ("$filename.dvi", "$filename.dvi.back");
  476: #        }
  477:       umask $saved_umask;
  478:       copy ("$tmplatexnam.dvi", "$filename.dvi");
  479:       if ( $global->{debug} )
  480:         {
  481:           print "Temporary files are in $tmplatexdir\n";
  482:           print "Please check there and remove them manually.\n";
  483:         } else {
  484:           unlink ("$tmplatexnam.tex", "$tmplatexnam.dvi");
  485:           for my $epsf ( @epsfiles )
  486:             {
  487:                $tmpepsf = $tmplatexdir . "/" . $epsf; 
  488:                print $tmpepsf . "\n" if ( $global->{debug} );
  489:                unlink ("$tmpepsf");
  490:             }
  491:           rmdir ($tmplatexdir) || return -1;
  492:         }
  493:       return 0;
  494:     }
  495:   #
  496:   # output pdf file
  497:   if ($latex2e->{output} eq "pdf")
  498:     {
  499: # comment out, because this backup action is not documented yet.
  500: #
  501: #      if ( -e "$filename.pdf" )
  502: #        {
  503: #          rename ("$filename.pdf", "$filename.pdf.back");
  504: #        }
  505:       umask $saved_umask;
  506:       copy ("$tmplatexnam.pdf", "$filename.pdf");
  507:       if ( $global->{debug} )
  508:         {
  509:           print "Temporary files are in $tmplatexdir\n";
  510:           print "Please check there and remove them manually.\n";
  511:         } else {
  512:           unlink ("$tmplatexnam.tex", "$tmplatexnam.pdf");
  513:           for my $epsf ( @epsfiles )
  514:             {
  515:                $tmpepsf = $tmplatexdir . "/" . $epsf; 
  516:                print $tmpepsf . "\n" if ( $global->{debug} );
  517:                unlink ("$tmpepsf");
  518:             }
  519:           rmdir ($tmplatexdir) || return -1;
  520:         }
  521:       return 0;
  522:     }
  523:   #
  524:   # convert dvi into ps using dvips command
  525:   chdir ($tmplatexdir);
  526:   if ($latex2e->{dvips} eq "dvi2ps")
  527:     {
  528:       `dvi2ps -q -o $global->{papersize} -c $tmplatexnam.ps $filename.dvi`;
  529:     }
  530:   elsif ($latex2e->{dvips} eq "jdvi2kps")
  531:     {
  532:       `jdvi2kps -q -pa $global->{papersize} -o $tmplatexnam.ps $filename.dvi`;
  533:     }
  534:   else
  535:     {
  536:       `dvips -R -q -t $global->{papersize} -o $tmplatexnam.ps $filename.dvi`;
  537:     }
  538: 
  539:   chdir ($current_dir);
  540: 
  541: # comment out, because this backup action is not documented yet.
  542: #
  543: #  if ( -e "$filename.ps" )
  544: #    {
  545: #      rename ("$filename.ps", "$filename.ps.back");
  546: #    }
  547:   umask $saved_umask;
  548:   copy ("$tmplatexnam.ps", "$filename.ps");
  549:   unlink ("$tmplatexnam.ps");
  550:   if ( $global->{debug} )
  551:     {
  552:       print "Temporary files are in $tmplatexdir\n";
  553:       print "Please check there and remove them manually.\n";
  554:     } else {
  555:       unlink ("$tmplatexnam.tex", "$tmplatexnam.dvi", "$tmplatexnam.ps");
  556:       for my $epsf ( @epsfiles )
  557:         {
  558:            $tmpepsf = $tmplatexdir . "/" . $epsf; 
  559:            print $tmpepsf . "\n" if ( $global->{debug} );
  560:            unlink ("$tmpepsf");
  561:         }
  562:       rmdir ($tmplatexdir) || return -1;
  563:     }
  564:   return 0;
  565: 
  566: };
  567: 
  568: 1;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>