--- loncom/interface/printout.pl 2006/04/24 21:30:06 1.98 +++ loncom/interface/printout.pl 2006/06/30 01:24:41 1.107 @@ -161,7 +161,8 @@ END } &Apache::lonlocal::get_language_handle(); &Apache::loncommon::content_type(undef,'text/html'); - print(&Apache::loncommon::start_page('Creating PDF')); + + print(&Apache::loncommon::start_page('Creating PDF')); my $identifier = $ENV{'QUERY_STRING'}; my $texfile = $env{'cgi.'.$identifier.'.file'}; @@ -233,7 +234,8 @@ print "Return $eps_f"; # Debugging @@ -475,7 +477,39 @@ foreach $texfile (@texfile) { "for $status_statement now Converting to PS", \%prog_state,$new_name_file); if (-e $new_name_file) { - print "

PDF output file (see link below)

\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); + 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

PDF output file (see link below)

\n"; $new_name_file =~ m/^(.*)\./; my $ps_file = my $tempo_file = $1.'temporar.ps'; my $pdf_file = $1.'.pdf'; @@ -549,6 +583,33 @@ foreach $texfile (@texfile) { "for $status_statement now Converting to PS", \%prog_state,$new_name_file); if (-e $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); + 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); print "
"; $new_name_file =~ m/^(.*)\./; my $ps_file = my $tempo_file = $1.'temporar.ps'; @@ -629,6 +690,7 @@ if ($number_of_files>1) { if ($advanced_role) { &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state); } print(&Apache::loncommon::end_page()); my $done; + sub REAPER { $done=1; } @@ -658,6 +720,133 @@ sub busy_wait_command { close(CMD); } +# Repagninate +# What we need to do: +# - Count the number of pages in each student. +# - 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 + # must be able to calculate the total number of document pages so that + # at the beginning of the second pass we already know how to replace + # %%Pages: + + # Figure out + # 1. Number of pages in the document + # 2. Maximum number of pages in a student + # 3. Number of pages in each student. + + my ($postscript_filename, $latex_filename, $num_columns) = @_; + open(PSFILE, "<$postscript_filename"); + 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, + "Counting pages for student: ".$student_number+1); + + while ($line = ) { + + # Check for total pages (%%Pages:) + + if (($line =~ /^%%Pages:/) && (!$seen_pages)) { + my @pageinfo = split(/ /,$line); + $total_pages = $pageinfo[1]; + $seen_pages = 1; + } + # Check for %%Page: n m $page_number will be the + # biggest of these until we see an endofstudent. + # Note that minipages generate spurious %Page: 1 1's so + # 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]) { + $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++; + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, + "Counting pages for student: ".$student_number+1); + + 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. + + my $outfilename = $latex_filename."temp"; + + open(LATEXIN, "<$latex_filename"); + open(LATEXOUT, ">$outfilename"); + + + $student_number = 0; # first student... + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, + "Repaginating student ".$student_number+1); + + while (my $line = ) { + 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]; + &Apache::lonnet::logthis("student: $pages_in_student[$student_number] add: $addlines"); + while($addlines) { + print LATEXOUT '\linebreak \strut \pagebreak'; + + $addlines--; + } + + $student_number++; + &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state, + "Repaginating student ".$student_number+1); + + } else { + print LATEXOUT $line; + } + } + close(LATEXIN); + close(LATEXOUT); + rename($outfilename, $latex_filename); + +}