[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);
+
+ }
+
+}