Diff for /loncom/interface/printout.pl between versions 1.114 and 1.126

version 1.114, 2006/12/04 21:44:42 version 1.126, 2007/09/21 20:56:30
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 38  use Apache::loncommon(); Line 39  use Apache::loncommon();
 use Apache::lonlocal;  use Apache::lonlocal;
 use Apache::lonmsg();  use Apache::lonmsg();
 use LONCAPA::Enrollment;  use LONCAPA::Enrollment;
   use LONCAPA::Configuration;
   
 use strict;  use strict;
   
Line 127  sub send_error_mail { Line 129  sub send_error_mail {
     foreach my $line (@$texfile) {      foreach my $line (@$texfile) {
  $message .= "$line\n";   $message .= "$line\n";
     }      }
     my (undef, %receivers) = &Apache::lonfeedback::decide_receiver(undef, 0,      my (undef, %receivers) = &Apache::lonmsg::decide_receiver(undef, 0,
   1,1,1);        1,1,1);
     # print "<br /> sending...section:  $env{'request.course.sec'}";      # print "<br /> sending...section:  $env{'request.course.sec'}";
     foreach my $dest (keys %receivers) {      foreach my $dest (keys %receivers) {
  # print "<br /> dest is $dest";   # print "<br /> dest is $dest";
Line 160  Your cookie information is incorrect. Line 162  Your cookie information is incorrect.
 END  END
     return;      return;
 }  }
   
   my %perlvar=%{&LONCAPA::Configuration::read_conf('loncapa.conf')};
  &Apache::lonlocal::get_language_handle();   &Apache::lonlocal::get_language_handle();
  &Apache::loncommon::content_type(undef,'text/html');   &Apache::loncommon::content_type(undef,'text/html');
   
Line 187  END Line 191  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 213  print "<a href=\"$backref\"><b>Return</b Line 217  print "<a href=\"$backref\"><b>Return</b
       # $eps_f =~ s/\.[^.]*$/\.eps/i;        # $eps_f =~ s/\.[^.]*$/\.eps/i;
       if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) {        if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) {
                   $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/;                    $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/;
   $eps_f = '/home/httpd/prtspool/'.$eps_f;    $eps_f = $perlvar{'lonPrtDir'}.'/'.$eps_f;
       } elsif ($eps_f=~/$Apache::lonnet::perlvar{'lonDocRoot'}\/res\//) {        } elsif ($eps_f=~/$perlvar{'lonDocRoot'}\/res\//) {
   $eps_f=~m/$Apache::lonnet::perlvar{'lonDocRoot'}\/res\/(.+)/;    $eps_f=~m/$perlvar{'lonDocRoot'}\/res\/(.+)/;
   $eps_f = '/home/httpd/prtspool/'.$1;    $eps_f = $perlvar{'lonPrtDir'}.'/'.$1;
       } elsif ($eps_f=~/$Apache::lonnet::perlvar{'lonUsersDir'}\//) {        } elsif ($eps_f=~/$perlvar{'lonUsersDir'}\//) {
   $eps_f=~/$Apache::lonnet::perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/;    $eps_f=~/$perlvar{'lonUsersDir'}\/([^\/]+)\/\w\/\w\/\w\/(.+)/;
   $eps_f = '/home/httpd/prtspool/'.$1.'/'.$2;    $eps_f = $perlvar{'lonPrtDir'}.'/'.$1.'/'.$2;
       }        }
       $eps_f  =~ s/ /\_/g; # Spaces are problematic for system commands and LaTeX.        $eps_f  =~ s/ /\_/g; # Spaces are problematic for system commands and LaTeX.
       #         # 
Line 252  print "<a href=\"$backref\"><b>Return</b Line 256  print "<a href=\"$backref\"><b>Return</b
   if ($advanced_role) {    if ($advanced_role) {
       my $prettyname=$not_eps;        my $prettyname=$not_eps;
       $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;        $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;
       $prettyname=~s|$Apache::lonnet::perlvar{'lonDocRoot'}/|/|;        $prettyname=~s|$perlvar{'lonDocRoot'}/|/|;
       &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,        &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,
     'Converting to EPS '.$prettyname);      'Converting to EPS '.$prettyname);
   }    }
Line 440  foreach $texfile (@texfile) { Line 444  foreach $texfile (@texfile) {
       print "</pre>\n";        print "</pre>\n";
       # print "<br /> Advanced role <br />";        # print "<br /> Advanced role <br />";
               print "<b><big>The link to ";                print "<b><big>The link to ";
               $logfilename=~s/\/home\/httpd//;                $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
       print "<a href=\"$logfilename\">Your log file </a></big></b>";        print "<a href=\"$logfilename\">Your log file </a></big></b>";
       print "\n";        print "\n";
               #link tooriginal LaTeX file (included according Michael Hamlin desire)                #link tooriginal LaTeX file (included according Michael Hamlin desire)
Line 453  foreach $texfile (@texfile) { Line 457  foreach $texfile (@texfile) {
       print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";        print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";
       print "<br /><br />";        print "<br /><br />";
       print "<b><big>The link to ";        print "<b><big>The link to ";
       $texfile=~s/\/home\/httpd//;                $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
       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";
       my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");        my $help_text = &Apache::loncommon::help_open_topic("Print_Resource", "Help on printing");
Line 519  foreach $texfile (@texfile) { Line 523  foreach $texfile (@texfile) {
       if ($tableofindex eq 'yes') {        if ($tableofindex eq 'yes') {
   my $idxname = $latex_file;    my $idxname = $latex_file;
   $idxname =~ s/\.tex$/\.idx/;    $idxname =~ s/\.tex$/\.idx/;
   &busy_wait_command("makindex $idxname",    &busy_wait_command("makeindex $idxname",
      "Re-creating index file",       "Re-creating index file",
      \%prog_state, $idxname);       \%prog_state, $idxname);
   &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",    &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
Line 527  foreach $texfile (@texfile) { Line 531  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,\%prog_state);
     &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 568  foreach $texfile (@texfile) { Line 607  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 />";
       print "<b><big>The link to ";        print "<b><big>The link to ";
       $logfilename=~s/\/home\/httpd//;                $logfilename=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
       print "<a href=\"$logfilename\">Your log file </a></big></b>";        print "<a href=\"$logfilename\">Your log file </a></big></b>";
       print "\n";        print "\n";
       #link tooriginal LaTeX file (included according Michael Hamlin desire)        #link tooriginal LaTeX file (included according Michael Hamlin desire)
Line 587  foreach $texfile (@texfile) { Line 628  foreach $texfile (@texfile) {
       print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";        print $tex_temporary_file '<html><head><title>LOGFILE</title></head><body><pre>'.$body_tex_file.'</pre></body></html>'."\n";
       print "<br /><br />";        print "<br /><br />";
       print "<b><big>The link to ";        print "<b><big>The link to ";
       $texfile=~s/\/home\/httpd//;                $texfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
       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 603  foreach $texfile (@texfile) { Line 645  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,\%prog_state);
         &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 631  foreach $texfile (@texfile) { Line 706  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 684  foreach $texfile (@texfile) { Line 760  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 705  if ($number_of_files>1) { Line 783  if ($number_of_files>1) {
     print("<pre>Zip Output:\n");      print("<pre>Zip Output:\n");
     system($statement);      system($statement);
     print("</pre>");      print("</pre>");
     $zipfile=~s/\/home\/httpd//;      $zipfile=~s{^\Q$perlvar{'lonPrtDir'}\E}{/prtspool};
     print "<br /> A <a href=\"$zipfile\">ZIP file</a> of all the PDFs.";      print "<br /> A <a href=\"$zipfile\">ZIP file</a> of all the PDFs.";
 }  }
 if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); }  if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); }
Line 791  sub repaginate { Line 869  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 873  sub repaginate { Line 951  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);
      
       }
   
   }

Removed from v.1.114  
changed lines
  Added in v.1.126


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