--- loncom/interface/printout.pl 2006/12/04 21:44:42 1.114
+++ loncom/interface/printout.pl 2006/12/18 21:03:10 1.118
@@ -527,9 +527,45 @@ foreach $texfile (@texfile) {
\%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",
\%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("
Missing fonts file is: $missfonts_file");
+ if (-e $missfonts_file) {
+ #print("
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
PDF output file (see link below)
\n";
$new_name_file =~ m/^(.*)\./;
my $ps_file = my $tempo_file = $1.'temporar.ps';
@@ -603,6 +639,40 @@ foreach $texfile (@texfile) {
&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("
Missing fonts file is: $missfonts_file");
+ if (-e $missfonts_file) {
+ #print("
Missing fonts file exists\n");
+ &create_missing_fonts($missfonts_file);
+ unlink($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) {
my $latex_file = $name_file;
$latex_file =~ s/\.dvi/\.tex/;
@@ -631,6 +701,7 @@ foreach $texfile (@texfile) {
&busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
"for $status_statement dvips to repaginate",
\%prog_state, $new_name_file);
+
print "
";
$new_name_file =~ m/^(.*)\./;
my $ps_file = my $tempo_file = $1.'temporar.ps';
@@ -873,3 +944,57 @@ 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("
Raw command: $command");
+ $command =~ s/ 8000/ 600/g; # dpi directives.
+ $command =~ s/\/8000/\/600/g; # mag directives.
+ #print("
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("
before reassembly : (@cmdarray)");
+ $command = join(" ", (@cmdarray));
+
+ #print("
Creating fonts via command: $command");
+ &busy_wait_command("$command 1>/dev/null 2>/dev/null",
+ "Creating missing font",
+ $state, $command);
+
+ }
+
+}