Diff for /loncom/interface/printout.pl between versions 1.112 and 1.121

version 1.112, 2006/11/06 11:40:02 version 1.121, 2007/02/22 01:00:13
Line 1 Line 1
 #!/usr/bin/perl  #!/usr/bin/perl
 # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.  # CGI-script to run LaTeX, dvips, ps2ps, ps2pdf etc.
 #  #
   # $Id$
 #  #
 # Copyright Michigan State University Board of Trustees  # Copyright Michigan State University Board of Trustees
 #  #
Line 187  END Line 188  END
 print "<a href=\"$backref\"><b>Return</b></a> to last resource.<br /><br />";  print "<a href=\"$backref\"><b>Return</b></a> to last resource.<br /><br />";
   
   my $figfile = $texfile;    my $figfile = $texfile;
   $figfile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.dat/;    $figfile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.dat/;
   my $duefile = $texfile;    my $duefile = $texfile;
   $duefile =~ s/^([^\.]+printout)[^t]+\.tex/$1\.due/;    $duefile =~ s/^(.*_printout)_\d+_\d+_\d+\.tex/$1\.due/;
   #do we have figures?    #do we have figures?
   # print "Figure file: $figfile\n";    # print "Figure file: $figfile\n";
   if (-e $figfile) {    if (-e $figfile) {
Line 227  print "<a href=\"$backref\"><b>Return</b Line 228  print "<a href=\"$backref\"><b>Return</b
       # We really just need to copy it from where it was to prtspool        # We really just need to copy it from where it was to prtspool
       # but with the spaces substituted to _'s.        # but with the spaces substituted to _'s.
       #        #
       my ($nsname,$path, $sext) = fileparse($not_eps, qr/\.(ps|eps)/i);        my ($nsname,$path, $sext) = &fileparse($eps_f, qr/\.(ps|eps)/i);
       if ($sext =~/ps$/i) {        if ($sext =~/ps$/i) {
   # print "$not_eps is a postscript file. copy to $path\n";    # print "$not_eps is a postscript file. copy to $path\n";
   File::Path::mkpath($path,0,0777);    &File::Path::mkpath($path,0,0777);
 #  $not_eps =~ s/^\s+//;    #print("Made path: $path");
 #  $not_eps =~ s/\s+$//;    #$not_eps =~ s/^\s+//;
 #  $not_eps =~ s/ /\__/g;    #$not_eps =~ s/\s+$//;
   # print "Copying $not_eps to $eps_f\n";    #$not_eps =~ s/ /\__/g;
     #print("Copying $not_eps to $eps_f\n");
   copy("$not_eps", "$eps_f");     copy("$not_eps", "$eps_f"); 
   # print "Copy complete\n";    # print "Copy complete\n";
       } else {        } else {
Line 243  print "<a href=\"$backref\"><b>Return</b Line 245  print "<a href=\"$backref\"><b>Return</b
   my $path=$eps_f;    my $path=$eps_f;
   $path =~ s/\/([^\/]+)\.eps$//;    $path =~ s/\/([^\/]+)\.eps$//;
   # print "Final file path: $path "; # Debugging    # print "Final file path: $path "; # Debugging
   File::Path::mkpath($path,0,0777);    &File::Path::mkpath($path,0,0777);
   $not_eps =~ s/^\s+//;    $not_eps =~ s/^\s+//;
   $not_eps =~ s/\s+$//;    $not_eps =~ s/\s+$//;
   $not_eps =~ s/ /\\ /g;    $not_eps =~ s/ /\\ /g;
Line 526  foreach $texfile (@texfile) { Line 528  foreach $texfile (@texfile) {
      \%prog_state, $dvi_file);       \%prog_state, $dvi_file);
   
       }        }
       &busy_wait_command("$comma $name_file 1>dev/null 2>/dev/null",        &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
  "for $status_statement dvips to repaginate",   "for $status_statement dvips to repaginate",
  \%prog_state, $new_name_file);   \%prog_state, $new_name_file);
         #
         #  One last little hinky kinky thing.
         #  It's just possible that some fonts could not be maded
         #  at the resolution of the pdf print driver.
         #  In that case a file called missfont.log will have been
         #  created that will contain the commands that were attempted
         # to create the missing fonts.  If we basically
         # take all the 8000 strings in that file, and
         # replace them with 600 (the ljfour resolution)
         # run the commands in that file and redvips,
         # we'll be able to print the missing glyphs at 600dpi.
         #
         # Supposedly it is possible to tune TeX/Metafont to do this
         # right but I failed to get that to work when following the
         # docs at the tug site, hence this rather kludgey fix.
         #
         #  We make the (I think) reasonable assumption that
         #  missing glyphs won't change the pagination and I think
         #  this is true because TeX/dvips will leave a space
         #  instead of these glyphs based on the font metrics
         #  (fancy way to say there will be a blank the size of the missing
         #  glyphs).
         #
         my $print_directory = dirname($name_file);
         my $missfonts_file  = $print_directory."/missfont.log";
         #print("<br /> Missing fonts file is: $missfonts_file");
         if (-e $missfonts_file) {
     #print("<br />Missing fonts file exists\n");
     &create_missing_fonts($missfonts_file);
     &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
        "for $status_statement dvips generated missing fonts",
        \%prog_state, $new_name_file);
         }
   
         #
       print "\n<h1>PDF output file (see link below)</h1>\n";        print "\n<h1>PDF output file (see link below)</h1>\n";
       $new_name_file =~ m/^(.*)\./;        $new_name_file =~ m/^(.*)\./;
       my $ps_file = my $tempo_file = $1.'temporar.ps';        my $ps_file = my $tempo_file = $1.'temporar.ps';
Line 567  foreach $texfile (@texfile) { Line 604  foreach $texfile (@texfile) {
       $texps =~ s/\.tex/\.ps/;        $texps =~ s/\.tex/\.ps/;
       my @garb = ($texaux,$texdvi,$texps);        my @garb = ($texaux,$texdvi,$texps);
 #  unlink @garb;  #  unlink @garb;
       unlink $duefile;        unlink($duefile);
       print "<a href=\"/prtspool/$pdf_file\">Your PDF document</a>";        print "<a href=\"/prtspool/$pdf_file\">Your PDF document</a>";
         unlink($missfonts_file);
   
   }    }
   if ($advanced_role) {      if ($advanced_role) {  
       print "<br /><br />";        print "<br /><br />";
Line 590  foreach $texfile (@texfile) { Line 629  foreach $texfile (@texfile) {
       print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";        print "<a href=\"$texfile\">Your original LaTeX file </a></big></b>";
       print "\n";        print "\n";
   }    }
   
       } else {        } else {
   #LaTeX successfully parsed tex file     #LaTeX successfully parsed tex file 
   $name_file =~ s/\.tex/\.dvi/;    $name_file =~ s/\.tex/\.dvi/;
Line 602  foreach $texfile (@texfile) { Line 642  foreach $texfile (@texfile) {
   &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",    &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
      "for $status_statement now Converting to PS",       "for $status_statement now Converting to PS",
      \%prog_state,$new_name_file);       \%prog_state,$new_name_file);
     #
     #  One last little hinky kinky thing.
     #  It's just possible that some fonts could not be maded
     #  at the resolution of the pdf print driver.
     #  In that case a file called missfont.log will have been
     #  created that will contain the commands that were attempted
     # to create the missing fonts.  If we basically
     # take all the 8000 strings in that file, and
     # replace them with 600 (the ljfour resolution)
     # run the commands in that file and redvips,
     # we'll be able to print the missing glyphs at 600dpi.
     #
     # Supposedly it is possible to tune TeX/Metafont to do this
     # right but I failed to get that to work when following the
     # docs at the tug site, hence this rather kludgey fix.
     #
     #  We make the (I think) reasonable assumption that
     #  missing glyphs won't change the pagination and I think
     #  this is true because TeX/dvips will leave a space
     #  instead of these glyphs based on the font metrics
     #  (fancy way to say there will be a blank the size of the missing
     #  glyphs).
     #
     my $print_directory = dirname($name_file);
     my $missfonts_file  = $print_directory."/missfont.log";
     #print("<br /> Missing fonts file is: $missfonts_file");
     if (-e $missfonts_file) {
         #print("<br />Missing fonts file exists\n");
         &create_missing_fonts($missfonts_file);
         &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
    "for $status_statement dvips generated missing fonts",
    \%prog_state, $new_name_file);
     }
   if (-e $new_name_file) {    if (-e $new_name_file) {
       my $latex_file = $name_file;        my $latex_file = $name_file;
       $latex_file =~ s/\.dvi/\.tex/;        $latex_file =~ s/\.dvi/\.tex/;
Line 630  foreach $texfile (@texfile) { Line 703  foreach $texfile (@texfile) {
       &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",        &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
  "for $status_statement dvips to repaginate",   "for $status_statement dvips to repaginate",
  \%prog_state, $new_name_file);   \%prog_state, $new_name_file);
   
       print "<br />";        print "<br />";
       $new_name_file =~ m/^(.*)\./;        $new_name_file =~ m/^(.*)\./;
       my $ps_file = my $tempo_file = $1.'temporar.ps';        my $ps_file = my $tempo_file = $1.'temporar.ps';
Line 683  foreach $texfile (@texfile) { Line 757  foreach $texfile (@texfile) {
       $texps =~ s/\.tex/\.ps/;        $texps =~ s/\.tex/\.ps/;
       my @garb = ($texlog,$texaux,$texdvi,$texps);        my @garb = ($texlog,$texaux,$texdvi,$texps);
 #  unlink @garb;  #  unlink @garb;
       unlink $duefile;        unlink($duefile);
       print "<a href=\"/prtspool/$pdf_file\">$link_text - click here to download pdf</a>";        print "<a href=\"/prtspool/$pdf_file\">$link_text - click here to download pdf</a>";
       print "\n";        print "\n";
   }    }
     unlink($missfonts_file);
   
       }          }  
   } else {    } else {
       print "LaTeX file $texfile was not created successfully";        print "LaTeX file $texfile was not created successfully";
Line 790  sub repaginate { Line 866  sub repaginate {
  #   #
   
  if ($line =~ /^%%Page:/) {   if ($line =~ /^%%Page:/) {
     my @pageinfo = split(/ /, $line);      my @pageinfo = split(/\s+/, $line);
     if ($page_number < $pageinfo[1]) {      if ($page_number < $pageinfo[1]) {
  $page_number = $pageinfo[1];   $page_number = $pageinfo[1];
     } elsif ($pageinfo[2] ne 1) {      } elsif ($pageinfo[2] ne 1) {
Line 872  sub repaginate { Line 948  sub repaginate {
   
 }  }
   
   #
   #   Create missing fonts given a latex missfonts.log file.
   #   This file will have lines like:
   #
   #   mktexpk --mfmode ljfour --bdpi 8000 --mag 1+0/8000 --dpi 8000 tcrm0500
   #
   #  We want to execute those lines with the 8000's changed to 600's
   #  in order to match the resolution of the ljfour printer.
   #  Of course if some wiseguy has changed the default printer from ljfour
   #  in the dvips's config.ps file that will break so we'll also
   #  ensure that --mfmode is ljfour.
   #
   sub create_missing_fonts {
       my ($fontfile, $state) = @_;
   
       # Open and read in the font file..we'll read it into the array
       #  font_commands.
       #
       open(my $font_handle, $fontfile);
       my @font_commands = <$font_handle>;
   
       # make the list contain each command only once
       my %uniq;
       @font_commands = map { $uniq{$_}++ == 0 ? $_ : () } @font_commands;
   
       #  Now process each command replacing the appropriate 8000's with
       #  600's ensuring that font names with 8000's in them are not corrupted.
       #  and if the --mfmode is not ljfour we turn it into ljfour.
       #   Then we execute the command.
       #
       
       foreach my $command (@font_commands) {
    #print("<br />Raw command: $command");
    $command =~ s/ 8000/ 600/g;    # dpi directives.
    $command =~ s/\/8000/\/600/g;  # mag directives.
    #print("<br />After dpi replacements: $command");
   
    my @cmdarray = split(/ /,$command);
    for (my $i =0; $i < scalar(@cmdarray); $i++) {
       if ($cmdarray[$i] eq '--mfmode') {
    $cmdarray[$i+1] = "ljfour";
       }
    }
    #print("<br /> before reassembly : (@cmdarray)");
    $command = join(" ", (@cmdarray));
   
    #print("<br />Creating fonts via command: $command");
    &busy_wait_command("$command 1>/dev/null 2>/dev/null",
      "Creating missing font",
      $state, $command);
      
       }
   
   }

Removed from v.1.112  
changed lines
  Added in v.1.121


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