[LON-CAPA-cvs] cvs: loncom /interface printout.pl

foxr lon-capa-cvs@mail.lon-capa.org
Wed, 06 Dec 2006 12:10:16 -0000


foxr		Wed Dec  6 07:10:16 2006 EDT

  Modified files:              
    /loncom/interface	printout.pl 
  Log:
  If font generation at pdf resolution fails... generate at ljfour
  resolution instead and re-dvips.  Still need to remove some debugging
  output, but this is for bug 5089 and related.
  NOTE:  Multiple simulataneous print jobs may yet fail.
        As all will write to the same missfonts.log file.
        this could be an issue I think even if dvips was just run
        to regen the fonts as there's skew in when the missfonts.log
        file is deleted.
  Conclusions:  This is probably no worse than before and may be better.
  
  
Index: loncom/interface/printout.pl
diff -u loncom/interface/printout.pl:1.114 loncom/interface/printout.pl:1.115
--- loncom/interface/printout.pl:1.114	Mon Dec  4 16:44:42 2006
+++ loncom/interface/printout.pl	Wed Dec  6 07:10:16 2006
@@ -530,6 +530,42 @@
 	      &busy_wait_command("$comma $name_file 1>dev/null 2>/dev/null",
 				 "for $status_statement dvips to repaginate",
 				 \%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);
+		  unlink($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";
 	      $new_name_file =~ m/^(.*)\./;
 	      my $ps_file = my $tempo_file = $1.'temporar.ps';
@@ -603,6 +639,40 @@
 	  &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
 			     "for $status_statement now Converting to PS",
 			     \%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);
+	      unlink($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) {
 	      my $latex_file = $name_file;
 	      $latex_file =~ s/\.dvi/\.tex/;
@@ -631,6 +701,7 @@
 	      &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
 				 "for $status_statement dvips to repaginate",
 				 \%prog_state, $new_name_file);
+
 	      print "<br />";
 	      $new_name_file =~ m/^(.*)\./;
 	      my $ps_file = my $tempo_file = $1.'temporar.ps';
@@ -873,3 +944,54 @@
 
 }
 
+#
+#   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.
+    #
+    my $font_handle = IO::File->new($fontfile);
+    my @font_commands = <$font_handle>;
+    
+
+    #  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);
+			   
+    }
+
+}