--- loncom/interface/printout.pl	2006/06/19 22:30:15	1.103
+++ loncom/interface/printout.pl	2006/11/06 11:40:02	1.112
@@ -29,6 +29,7 @@ use lib '/home/httpd/lib/perl';
 use LONCAPA::loncgi;
 use File::Path;
 use File::Basename;
+use File::Copy;
 use IO::File;
 use Image::Magick;
 use Apache::lonhtmlcommon();
@@ -204,13 +205,12 @@ print "<a href=\"$backref\"><b>Return</b
       foreach my $not_eps (@content_of_file) {
 	  chomp($not_eps);
 	  if ($not_eps ne '') {
-	      # print "Converting $not_eps"; # Debugging.
+	       # print "Converting $not_eps"; # Debugging.
               my $status_statement='EPS picture for '.$not_eps;
 	      # print "$status_statement\n";
 	      $not_eps=~s|\/\.\/|\/|g;
 	      my $eps_f = $not_eps;
 	      # $eps_f =~ s/\.[^.]*$/\.eps/i;
-	      $eps_f .= '.eps';	# Just append the eps ext.
 	      if ($eps_f=~/\/home\/([^\/]+)\/public_html\//) {
                   $eps_f=~s/\/home\/([^\/]+)\/public_html/$1/;
 		  $eps_f = '/home/httpd/prtspool/'.$eps_f;
@@ -222,50 +222,71 @@ print "<a href=\"$backref\"><b>Return</b
 		  $eps_f = '/home/httpd/prtspool/'.$1.'/'.$2;
 	      }
 	      $eps_f  =~ s/ /\_/g; # Spaces are problematic for system commands and LaTeX.
-	      my $path=$eps_f;
-	      $path =~ s/\/([^\/]+)\.eps$//;
-	      # print "Final file path: $path "; # Debugging
-	      File::Path::mkpath($path,0,0777);
-	      $not_eps =~ s/^\s+//;
-	      $not_eps =~ s/\s+$//;
-	      $not_eps =~ s/ /\\ /g;
-	      if ( exists($done_conversion{$not_eps})) { next; }
-	      if ($advanced_role) {
-		  my $prettyname=$not_eps;
-		  $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;
-		  $prettyname=~s|$Apache::lonnet::perlvar{'lonDocRoot'}/|/|;
-		  &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,'Converting to EPS '.$prettyname);
-	      }
-	      $done_conversion{$not_eps}=1;
-	      # print "Converting $not_eps -> $eps_f"; # Debugging
-	      system("convert $not_eps $eps_f");
-              # check is eps exist in prtspool
-              if (not -e $eps_f) {
-		  # converting an animated gif creates either:
-                  # anim.gif.eps.0
-                  # or
-                  # anim.gif-0.eps
-		  for (my $i=0;$i<10000;$i++) {
-		      if (-e $eps_f.'.'.$i) {
-			  rename($eps_f.'.'.$i, $eps_f);
-			  last;
-		      }
-		      my $anim_eps = $eps_f;
-		      $anim_eps =~ s/(\.[^.]*)\.eps$/$1-$i\.eps/i;
-		      if (-e $anim_eps) {
-			  rename($anim_eps, $eps_f);
-			  last;
+	      # 
+	      # If the file is already an .eps or .ps file,
+	      # We really just need to copy it from where it was to prtspool
+	      # but with the spaces substituted to _'s.
+	      #
+	      my ($nsname,$path, $sext) = fileparse($not_eps, qr/\.(ps|eps)/i);
+	      if ($sext =~/ps$/i) {
+		  # print "$not_eps is a postscript file. copy to $path\n";
+		  File::Path::mkpath($path,0,0777);
+#		  $not_eps =~ s/^\s+//;
+#		  $not_eps =~ s/\s+$//;
+#		  $not_eps =~ s/ /\__/g;
+		  # print "Copying $not_eps to $eps_f\n";
+		  copy("$not_eps", "$eps_f"); 
+		  # print "Copy complete\n";
+	      } else {
+	      
+		  $eps_f .= '.eps';	# Just append the eps ext.
+		  my $path=$eps_f;
+		  $path =~ s/\/([^\/]+)\.eps$//;
+		  # print "Final file path: $path "; # Debugging
+		  File::Path::mkpath($path,0,0777);
+		  $not_eps =~ s/^\s+//;
+		  $not_eps =~ s/\s+$//;
+		  $not_eps =~ s/ /\\ /g;
+		  if ( exists($done_conversion{$not_eps})) { next; }
+		  if ($advanced_role) {
+		      my $prettyname=$not_eps;
+		      $prettyname=~s|/home/([^/]+)/public_html|/priv/$1|;
+		      $prettyname=~s|$Apache::lonnet::perlvar{'lonDocRoot'}/|/|;
+		      &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,
+							    'Converting to EPS '.$prettyname);
+		  }
+		  $done_conversion{$not_eps}=1;
+		  # print "Converting $not_eps -> $eps_f"; # Debugging
+		  system("convert $not_eps $eps_f");
+		  # check is eps exist in prtspool
+		  if (not -e $eps_f) {
+		      # converting an animated gif creates either:
+		      # anim.gif.eps.0
+		      # or
+		      # anim.gif-0.eps
+		      for (my $i=0;$i<10000;$i++) {
+			  if (-e $eps_f.'.'.$i) {
+			      rename($eps_f.'.'.$i, $eps_f);
+			      last;
+			  }
+			  my $anim_eps = $eps_f;
+			  $anim_eps =~ s/(\.[^.]*)\.eps$/$1-$i\.eps/i;
+			  if (-e $anim_eps) {
+			      rename($anim_eps, $eps_f);
+			      last;
+			  }
 		      }
 		  }
-	      }
-	      # imagemagick 6.2.0-6.2.7 fails to properly handle
-              # convert anim.gif anim.gif.eps
-              # it creates anim.eps instead. 
-              if (not -e $eps_f) {
-		  my $eps_f2 = $eps_f;
-		  $eps_f2 =~ s/\.[^.]*\.eps$/\.eps/i;
-		  if(-e $eps_f2) {
-		      rename($eps_f2,$eps_f);
+		  
+		  # imagemagick 6.2.0-6.2.7 fails to properly handle
+		  # convert anim.gif anim.gif.eps
+		  # it creates anim.eps instead. 
+		  if (not -e $eps_f) {
+		      my $eps_f2 = $eps_f;
+		      $eps_f2 =~ s/\.[^.]*\.eps$/\.eps/i;
+		      if(-e $eps_f2) {
+			  rename($eps_f2,$eps_f);
+		      }
 		  }
 	      }
 
@@ -486,16 +507,28 @@ foreach $texfile (@texfile) {
 	      &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);
+	      if ($tableofcontents eq 'yes') {
+		  &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);
+	      }
+	      if ($tableofindex eq 'yes') {
+		  my $idxname = $latex_file;
+		  $idxname =~ s/\.tex$/\.idx/;
+		  &busy_wait_command("makindex $idxname",
+				     "Re-creating index file",
+				     \%prog_state, $idxname);
+		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+				     "for $status_statement now Recreting index (latex)",
+				     \%prog_state, $dvi_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';
@@ -576,12 +609,24 @@ foreach $texfile (@texfile) {
 	      &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);
+	      if ($tableofcontents eq 'yes') {
+		  &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);
+	      }
+	      if ($tableofindex eq 'yes') {
+		  my $idxname = $latex_file;
+		  $idxname    =~ s/\.tex$/\.idx/;
+		  &busy_wait_command("makeindex $idxname",
+				     "Re-creating index file",
+				     \%prog_state, $idxname);
+		  &busy_wait_command("latex $latex_file 1>/dev/null 2>/dev/null",
+				     "for $status_statement now Recreting index (latex)",
+				     \%prog_state, $dvi_file);
+	      }
 	      &busy_wait_command("$comma $name_file 1>/dev/null 2>/dev/null",
 				 "for $status_statement dvips to repaginate",
 				 \%prog_state, $new_name_file);
@@ -675,7 +720,6 @@ sub busy_wait_command {
     
     $SIG{CHLD} = \&REAPER;
     $done=0;
-    print("<p> Doing : <tt>$command</tt>");
     my $pid=open(CMD,"$command |");
     if ($advanced_role) {
 	&Apache::lonhtmlcommon::Update_PrgWin('',$progress_win,$message);
@@ -695,7 +739,6 @@ sub busy_wait_command {
     $SIG{CHLD}='IGNORE';
     close(CMD);
 }
-    print("<p> End</p>");
 
 #  Repagninate
 #  What we need to do:
@@ -724,10 +767,12 @@ sub repaginate {
     my $line;
     my $total_pages;		# Total pages in document.
     my $seen_pages        = 0;	# There are several %%Pages only the first is useful
-    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;
+    &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, 
+					  &mt("Counting pages for student: [_1]",1));
+
     while ($line = <PSFILE>) {
 	
 	# Check for total pages (%%Pages:)
@@ -748,36 +793,42 @@ sub repaginate {
 	    my @pageinfo = split(/ /, $line);
 	    if ($page_number < $pageinfo[1]) {
 		$page_number = $pageinfo[1];
+	    } elsif ($pageinfo[2] ne 1) {
+		#  current page count reset, and it's not because of a 
+		#    minipage 
+		# - save the page_number, reset and, if necessary
+		#    update max_pages.
+		push(@pages_in_student, $page_number);
+		&Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, 
+						      &mt("Counting pages for student: [_1]", scalar(@pages_in_student)));
+		if ($page_number > $max_pages) {
+		    $max_pages = $page_number;
+		}
+		$page_number = $pageinfo[1];
 	    }
 	}
-	#  ENDOFSTUDENTSTAMP - save the page_number, reset and, if necessary
-	#                      udpate max_pages.
-	#
-	if ($line =~ /ENDOFSTUDENTSTAMP/) {
-	    $pages_in_student[$student_number] = $page_number;
-	    $student_number++;
-
-	    if ($page_number > $max_pages) {
-		$max_pages = $page_number;
-	    }
-	    $page_number = 0;
-	 
-	}
 
 	
     }
+    # file ended so one more student
+    push(@pages_in_student, $page_number);
+    &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, 
+					  &mt("Counting pages for student: [_1]",scalar(@pages_in_student)));
+    if ($page_number > $max_pages) {
+	$max_pages = $page_number;
+    }
+    $page_number = 0;
+    
     close(PSFILE);
 
     #  If 2 columns, max_pages must go to an even number of columns:
 
-    &Apache::lonnet::logthis("Before 2 col adjust max-pages = $max_pages");
    
     if ($num_columns == 2) {
 	if ($max_pages % 2) {
 	    $max_pages++;
 	}
     }
-    &Apache::lonnet::logthis("after adjust: $max_pages");
     
     #  Now rewrite the LaTex file, substituting our \special
     #  with an appropriate number of \newpage directives.
@@ -788,7 +839,9 @@ sub repaginate {
     open(LATEXOUT, ">$outfilename");
 
 
-    $student_number = 0;	# first student...
+    my $student_number    = 0;	# Index of student we're working on.
+    &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, 
+					  "Repaginating student ".$student_number+1);
 
     while (my $line = <LATEXIN>) {
 	if ($line eq "\\special{ps:ENDOFSTUDENTSTAMP}\n") {
@@ -798,13 +851,15 @@ sub repaginate {
 	    # End of student replace with 0 or more newpages.
 	    
 	    my $addlines = $max_pages - $pages_in_student[$student_number];
-	    &Apache::lonnet::logthis("student: $pages_in_student[$student_number] add: $addlines");
 	    while($addlines)  {
-		print LATEXOUT '\pagebreak';
+		print LATEXOUT '\clearpage \strut \clearpage';
+
 		$addlines--;
 	    }
 	    
 	    $student_number++;
+	    &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, 
+						  "Repaginating student ".$student_number+1);
 	    
 	} else {
 	    print LATEXOUT $line;
@@ -813,7 +868,7 @@ sub repaginate {
 
     close(LATEXIN);
     close(LATEXOUT);
-   rename($outfilename, $latex_filename);
+    rename($outfilename, $latex_filename);
 
 }