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

foxr lon-capa-cvs@mail.lon-capa.org
Mon, 19 Jun 2006 21:40:31 -0000


This is a MIME encoded message

--foxr1150753231
Content-Type: text/plain

foxr		Mon Jun 19 17:40:31 2006 EDT

  Modified files:              
    /loncom/interface	lonprintout.pm printout.pl 
  Log:
  Better try at getting constant page count /student.
  
  
--foxr1150753231
Content-Type: text/plain
Content-Disposition: attachment; filename="foxr-20060619174031.txt"

Index: loncom/interface/lonprintout.pm
diff -u loncom/interface/lonprintout.pm:1.442 loncom/interface/lonprintout.pm:1.443
--- loncom/interface/lonprintout.pm:1.442	Tue Jun 13 17:49:15 2006
+++ loncom/interface/lonprintout.pm	Mon Jun 19 17:40:29 2006
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.442 2006/06/13 21:49:15 foxr Exp $
+# $Id: lonprintout.pm,v 1.443 2006/06/19 21:40:29 foxr Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -1672,14 +1672,12 @@
 			       $selectionmade, 
 			       $helper->{'VARS'}->{'ANSWER_TYPE'});
     }
-    &Apache::lonnet::logthis("Resetting page e.g. height -> $helper->{'VARS'}->{'pagesize.height'}");
-    &Apache::lonnet::logthis("Before: $result \n--------------------------\n");
+
     $result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /;
     $result =~ s/\\textheight\s*=?\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /;
     $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
     $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
 
-    &Apache::lonnet::logthis("After: $result \n----------------------------------\n");
 
 #-- writing .tex file in prtspool 
     my $temp_file;
@@ -1920,7 +1918,7 @@
     #
     #  Close the student bracketing.
     #
-    $current_output .= "\n\\special{ps:\nENDOFSTUDENTSTAMP\n}";
+    $current_output .= "\n\\special{ps:ENDOFSTUDENTSTAMP}\n";
     return ($current_output,$fullname, $printed);
 
 }
Index: loncom/interface/printout.pl
diff -u loncom/interface/printout.pl:1.101 loncom/interface/printout.pl:1.102
--- loncom/interface/printout.pl:1.101	Mon Jun 12 14:05:02 2006
+++ loncom/interface/printout.pl	Mon Jun 19 17:40:29 2006
@@ -476,8 +476,27 @@
 			     "for $status_statement now Converting to PS",
 			     \%prog_state,$new_name_file);
 	  if (-e $new_name_file) {
-	      &repaginate_postscript($new_name_file);
-	      print "<h1>PDF output file (see link below)</h1>\n";
+	      my $latex_file = $name_file;
+	      $latex_file    =~ s/\.dvi/\.tex/;
+	      &repaginate($new_name_file, $latex_file, $numberofcolumns);
+	      #
+	      #  Now have to re-latex, re dvips again to 
+	      #  get the repaginated postscript.
+	      #
+	      &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+				 "for $status_statement first latex to repaginate",
+				 \%prog_state, $name_file);
+	      &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+				 "for $status_statement second latex to repaginate",
+				 \%prog_state, $name_file);
+	      &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+				 "for $status_statement third latex to repaginate",
+				 \%prog_state, $name_file);
+	      &busy_wait_command("$comma $name_file 1>dev/null 2>/dev/null",
+				 "for $status_statement dvips to repaginate",
+				 \%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';
 	      my $pdf_file = $1.'.pdf';
@@ -551,7 +570,21 @@
 			     "for $status_statement now Converting to PS",
 			     \%prog_state,$new_name_file);
 	  if (-e $new_name_file) {
-	      &repaginate_postscript($new_name_file);
+	      my $latex_file = $name_file;
+	      $latex_file =~ s/\.dvi/\.tex/;
+	      &repaginate($new_name_file, $latex_file,  $numberofcolumns);
+	      &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+				 "for $status_statement first latex to repaginate",
+				 \%prog_state, $name_file);
+	      &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+				 "for $status_statement second latex to repaginate",
+				 \%prog_state, $name_file);
+	      &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+				 "for $status_statement third latex to repaginate",
+				 \%prog_state, $name_file);
+	      &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';
@@ -632,6 +665,7 @@
 if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); }
 print(&Apache::loncommon::end_page());
 my $done;
+
 sub REAPER {
     $done=1;
 }
@@ -663,13 +697,16 @@
 }
     print("<p> End</p>");
 
-#  Repagninate a postscript file.
+#  Repagninate
 #  What we need to do:
 #   - Count the number of pages in each student.
-#   - Add pages between each student so that each student's output is
-#     the maximum number of pages.
-#   
-sub repaginate_postscript {
+#   - Rewrite the latex file replacing the \specials that
+#     mark the end of student with an appropriate number of newlines.
+#   parameters:
+#     psfile     - Postscript filename
+#     latexfile  - LaTeX filename
+#     columns    - number of columns.
+sub repaginate {
 
     # We will try to do this in 2 passes through the postscript since
     # the postscript is potentially large, to do 2 passes, the first pass
@@ -682,7 +719,7 @@
     #    2. Maximum number of pages in a student
     #    3. Number of pages in each student.
 
-    my ($postscript_filename) = @_;
+    my ($postscript_filename, $latex_filename, $num_columns) = @_;
     open(PSFILE, "<$postscript_filename");
     my $line;
     my $total_pages;		# Total pages in document.
@@ -690,8 +727,8 @@
     my $student_number    = 0;	# Index of student we're working on.
     my @pages_in_student;	# For each student his/her initial page count.
     my $max_pages = 0;		# Pages in 'longest' student.
+    my $page_number = 0;
     while ($line = <PSFILE>) {
-	my $page_number = 0;
 	
 	# Check for total pages (%%Pages:)
 
@@ -706,6 +743,7 @@
 	#  we only are looking for the largest n (n is page number at the
 	#  bottom of the page, m the page number within the document.
 	#
+
 	if ($line =~ /^%%Page:/) {
 	    my @pageinfo = split(/ /, $line);
 	    if ($page_number < $pageinfo[1]) {
@@ -729,61 +767,49 @@
 	
     }
     close(PSFILE);
-    
-    #   Figure out how many total pages we need to add and adjust the
-    #   $total_pages accordingly:
-    #
-    my $add_pages  = 0;
-    for (my $i =0; $i < $student_number; $i++) {
-	$add_pages += ($max_pages - $pages_in_student[$i]);
-    }    
-    #  If we don't need to add any pages, we're done!
-    #  You  might think that we don't need to do anything if 
-    #  there are no pages to add, however we still need to at least strip out
-    #   the ENDOFSTUDENTSTAMP stamps...as they are not postscript comments!!
-
-  
-    #  Now pass 2; we're going to write the new. ps file:
-    #  -  Modify its first %%Pages: line so that it has the new correct number of
-    #     pages
-    #  -  For each student, insert as many blank pages as needed (and
-    #     associated structured comments) to expand a  student out to
-    #     max_pages pages.
-    #  -  Remove the ENDOFSTUDENTSTAMP lines.
-    #
-
-    $total_pages += $add_pages;
-    $student_number = 0;
- 
-    open(PSFILE, "<$postscript_filename");
-    open(PSOFILE,">$postscript_filename"."repaginating"); # unique if original fname is.
-    $seen_pages = 0;		# Reset seen %%Pages flag...
-    while ($line = <PSFILE>) {
-	if (($line =~ /^%%Pages:/) && (!$seen_pages)) {
-	    $line = "%%Pages: $total_pages\n";
-	    $seen_pages = 1;
+
+    #  If 2 columns, max_pages must go to an even number of columns:
+   
+    if ($num_columns == 2) {
+	if ($max_pages % 2) {
+	    $max_pages++;
 	}
-	if ($line =~ /ENDOFSTUDENTSTAMP/) {
-	    $add_pages = ($max_pages - $pages_in_student[$student_number]);
-	    $line = "\n";
-	    my $last_student_page = $pages_in_student[$student_number];
-	    my $last_total_page   = $student_number*$max_pages + $last_student_page;
-	    while ($add_pages) {
-		$line .= "%Page: $last_student_page $last_total_page\n";
-		my $bop = $last_total_page-1;
-		$line .= "TeXDict begin $last_student_page $bop bop eop end\n";
-		$last_student_page++;
-		$last_total_page++;
-		$add_pages--;
+    }
+    
+    #  Now rewrite the LaTex file, substituting our \special
+    #  with an appropriate number of \newpage directives.
+
+    my $outfilename = $latex_filename."temp";
+
+    open(LATEXIN, "<$latex_filename");
+    open(LATEXOUT, ">$outfilename");
+
+
+    $student_number = 0;	# first student...
+
+    while (my $line = <LATEXIN>) {
+	if ($line eq "\\special{ps:ENDOFSTUDENTSTAMP}\n") {
+	    # only end of student stamp if next line is ENDOFSTUDENTSTAMP:
+
+
+	    # End of student replace with 0 or more newpages.
+	    
+	    my $addlines = $max_pages - $pages_in_student[$student_number];
+	    while($addlines)  {
+		print LATEXOUT '\newpage';
+		$addlines--;
 	    }
+	    
 	    $student_number++;
+	    
+	} else {
+	    print LATEXOUT $line;
 	}
-	print PSOFILE ($line);
     }
-    close(PSOFILE);
-    close(PSFILE);
 
-    rename($postscript_filename."repaginating", $postscript_filename);
+    close(LATEXIN);
+    close(LATEXOUT);
+   rename($outfilename, $latex_filename);
 
 }
 

--foxr1150753231--