[LON-CAPA-cvs] cvs: loncom(version_2_11_X) /interface lonprintout.pm

raeburn raeburn at source.lon-capa.org
Mon Nov 11 11:05:56 EST 2024


raeburn		Mon Nov 11 16:05:56 2024 EDT

  Modified files:              (Branch: version_2_11_X)
    /loncom/interface	lonprintout.pm 
  Log:
  - For 2.11
    Backport 1.688 (part), 1.689 (part), 1.696, 1.697, 1.698, 1.699, 
             1.700 (part), 1.701, 1.702, 1.703, 1.704.
  
  
-------------- next part --------------
Index: loncom/interface/lonprintout.pm
diff -u loncom/interface/lonprintout.pm:1.627.2.37 loncom/interface/lonprintout.pm:1.627.2.38
--- loncom/interface/lonprintout.pm:1.627.2.37	Wed Oct 16 18:47:18 2024
+++ loncom/interface/lonprintout.pm	Mon Nov 11 16:05:56 2024
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.627.2.37 2024/10/16 18:47:18 raeburn Exp $
+# $Id: lonprintout.pm,v 1.627.2.38 2024/11/11 16:05:56 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -75,7 +75,7 @@
 
 #----------------------------  Helper helpers. -------------------------
 
-## 
+##
 # Filter function to determine if a resource is a printable sequence.
 #
 # @param $res -Resource to check.
@@ -143,7 +143,7 @@
 # Parameters:
 #    helper - the helper which already contains info about the current folder we can
 #             purloin.
-#    url    - Top url of the sequence
+#    map    - the map for which incomplete problems are to be printed
 # Return:
 #     XML that can be parsed by the helper to drive the state machine.
 #
@@ -163,7 +163,7 @@
 						      $map,
 						      $selFilter,
 						      '',
-						      $symbFilter, 
+						      $symbFilter,
 						      '');
 
     my $student_chooser = &generate_student_chooser('CHOOSE_STUDENTS_INCOMPLETE',
@@ -176,7 +176,7 @@
 						'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state.
 
     return $resource_chooser . $student_chooser . $format_chooser;
-}  
+}
 
 
 # BZ 5209
@@ -196,14 +196,14 @@
 #   helper   - Helper we are creating states for.
 # Returns:
 #   Text that can be parsed by the helper.
-# 
+#
 
 sub create_incomplete_course_helper {
     my $helper = shift;
 
     my $filter = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())';
     my $symbfilter = '$res->shown_symb()';
-    
+
     my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES',
 						      'Select problem(s) to print',
 						      'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1" modallink="1"',
@@ -229,7 +229,7 @@
 
 }
 
-# BZ5209 
+# BZ5209
 #   Creates the states needed to run the print helper for a student
 #   that wants to print his incomplete problems from the current folder.
 # Parameters:
@@ -256,7 +256,7 @@
 						      'RESOURCES',
 						      'PAGESIZE',
 						      $map,
-						      $filter, '', 
+						      $filter, '',
 						      $symfilter,
 						      '');
 
@@ -274,9 +274,9 @@
 
 
 sub generate_student_chooser {
-    my ($this_state, 
-	$sort_choice, 
-	$variable, 
+    my ($this_state,
+	$sort_choice,
+	$variable,
 	$next_state) = @_;
     my $result = <<CHOOSE_STUDENTS;
   <state name="$this_state" title="Select Students and Resources">
@@ -288,7 +288,7 @@
     </choices>
 
       <message><br /><hr /><br /> </message>
-      <student multichoice='1' 
+      <student multichoice='1'
                variable="$variable" 
                nextstate="$next_state" 
                coursepersonnel="1" />
@@ -318,7 +318,7 @@
 #     filter        - How to filter the resources.
 #     value_func    - <valuefunc> function.
 #     choice_func   - If not empty generates a <choicefunc> with this function.
-#     start_new_option 
+#     start_new_option
 #                   - Fragment appended after valuefunc.
 #
 #
@@ -444,13 +444,13 @@
    return $result;
 }
 
-#  Returns the XML for choosing how assignments are to be formatted 
+#  Returns the XML for choosing how assignments are to be formatted
 #  that text must still be parsed by the helper xml parser.
 # Parameters: 3 (required)
 
 #   helper       - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used
 #                  to check if splitting PDFs by section can be offered.
-#   title        - Title for the current state. 
+#   title        - Title for the current state.
 #   this_state   - State name of the chooser.
 
 sub generate_format_selector {
@@ -491,10 +491,10 @@
 # @param \@opens - reference to an array of open dates.
 # @param \@closes - reference to an array of close dates.
 #
-# @return ($open, $close) 
+# @return ($open, $close)
 #
 # @note If open/close dates are not defined they will be returned as undef
-# @note It is possible for there to be no overlap in which case -1,-1 
+# @note It is possible for there to be no overlap in which case -1,-1
 #       will be returned.
 # @note The algorithm used is to take the latest open date and the earliest end date.
 #
@@ -528,9 +528,9 @@
 	$latest_open  = -1;
 	$earliest_close = -1;
     }
-    
+
     return ($latest_open, $earliest_close);
-  
+
 }
 
 ##
@@ -557,7 +557,7 @@
     if ($close_date && ($close_date < $now)) {
 	return 0;
     }
-    
+
     return 1;
 
 }
@@ -566,20 +566,19 @@
 # Returns the innermost print start/print end dates for a resource.
 # This is done by looking at the start/end dates for its parts and choosing
 # the intersection of those dates.
-# 
+#
 # @param res - lonnvamaps::resource object that represents the resource.
 #
 # @return (opendate, closedate)
 #
 # @note If open/close dates are not defined they will be returned as undef
-# @note It is possible for there to be no overlap in which case -1,-1 
+# @note It is possible for there to be no overlap in which case -1,-1
 #       will be returned.
 # @note The algorithm used is to take the latest open date and the earliest end date.
 #       For consistency with &printable() in lonnavmaps.pm determination of start
 #       date for printing checks printstartdate param first, then, if not set,
 #       opendate param, then, if not set, contentopen param.
 
-
 sub get_print_dates {
     my $res = shift;
     my $partsref = $res->parts();
@@ -624,7 +623,7 @@
 # get_print_dates but namvaps::course_print_dates are gotten...and not converted
 # to times either.
 #
-# @param $res - Reference to a resource has from lonnvampas::resource.
+# @param $res - Reference to a resource hash from lonnavmaps::resource.
 #
 # @return (opendate, closedate)
 #
@@ -638,7 +637,7 @@
     my @close_dates;
     my $navmap = $res->{NAV_MAP}; # Slightly OO dirty.
 
-    # Don't bother looping over undefined or empty parts arraY;
+    # Don't bother looping over undefined or empty parts array;
 
     if (@parts) {
 	foreach my $part (@parts) {
@@ -664,7 +663,7 @@
     my $navmap = $res->{NAV_MAP}; # slightly OO dirty.
 
 
-    # Don't bother looping over undefined or empty parts arraY;
+    # Don't bother looping over undefined or empty parts array;
 
     if (@parts) {
 	foreach my $part (@parts) {
@@ -691,7 +690,7 @@
 
 
     my $navmap = Apache::lonnavmaps::navmap->new($username, $domain);
-    
+
 
     if (defined($navmap)) {
 	my $res = $navmap->getResourceByUrl($map);
@@ -727,7 +726,7 @@
 # Returns:
 #   reference to an array of resources that can be passed to
 #   print_resources.
-# 
+#
 sub master_seq_to_person_seq {
     my ($map, $seq, $who, $code, $nohidemap) = @_;
 
@@ -745,9 +744,9 @@
     if ($nohidemap) {
         $unhidden = &Apache::lonnet::clutter($map);
     }
-    
+
     my $navmap           = Apache::lonnavmaps::navmap->new($username, $userdomain,
-                                                           $code,$unhidden);
+                                                           $code, $unhidden);
     my ($start,$finish);
 
     if ($map) {
@@ -765,15 +764,15 @@
     my $iterator         = $navmap->getIterator($start,$finish,{},1);
 
     #  Iterate on the resource..select the items that are randomly selected
-    #  and that are in the seq_has.  Presumably the iterator will take care
-    # of the random ordering part of the deal.
+    #  and that are in the seq_hash.  Presumably the iterator will take care
+    #  of the random ordering part of the deal.
+    #
     my $curres;
     while ($curres = $iterator->next()) {
 	#
 	#  Only process resources..that are not removed by randomout...
 	#  and are selected for printint as well.
 	#
-
         if (ref($curres) && ! $curres->randomout()) {
             my $currsymb = $curres->symb();
             if (exists($seq_hash{$currsymb})) {
@@ -783,7 +782,7 @@
     }
 
     return \@output_seq;		# for now.
-    
+
 }
 
 
@@ -806,10 +805,10 @@
     }
     return $contents;
 
-    
+
 }
 
-#  Fetch the annotations associated with a URL and 
+#  Fetch the annotations associated with a URL and
 #  put a centered 'annotations:' title.
 #  This is all suppressed if the annotations are empty.
 #
@@ -842,7 +841,7 @@
     my ($text) = @_;
 
     # There appear to be cases where the font directive is empty.. in which
-    # case the first substituion would  insert a spurious \ oh happy day.
+    # case the first substitution would insert a spurious \ oh happy day.
     # as this has been the cause of much mystery and hair pulling _sigh_
 
     if ($font_size ne '') {
@@ -855,16 +854,16 @@
 
 }
 
-# include_pdf - PDF files are included into the 
+# include_pdf - PDF files are included into the
 # output as follows:
 #  - The PDF, if necessary, is replicated.
 #  - The PDF is added to the list of files to convert to postscript (along with the images).
 #  - The LaTeX is added to include the final converted postscript in the file as an included
-#    job.  The assumption is that the includedpsheader.ps header will be included.
+#    job.  The assumption is that the includepsheader.ps header will be included.
 #
 # Parameters:
 #   pdf_uri   - URI of the PDF file to include.
-#   
+#
 # Returns:
 #  The LaTeX to include.
 #
@@ -884,9 +883,9 @@
 	$file = &Apache::lonnet::filelocation('',$pdf_uri);
     }
 
-    #  The file isn ow replicated locally.. or it did not exist in the first place
+    #  The file is now replicated locally ... or it did not exist in the first place
     # (unlikely).  If it did exist, add the pdf to the set of files/images that
-    # need tob e converted for this print job:
+    # need to be converted for this print job:
 
     my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
     $file =~ s{(.*)/res/}{$londocroot/res/};
@@ -944,7 +943,7 @@
 #                      the number of times requested by the caller.
 #                      If we still have a proble, no text is appended to the
 #                      output and we set some global variables.
-#                      to indicate to the caller an SSI error occurred.  
+#                      to indicate to the caller an SSI error occurred.
 #                      All of this is supposed to deal with the issues described
 #                      in LonCAPA BZ 5631 see:
 #                      http://bugs.lon-capa.org/show_bug.cgi?id=5631
@@ -954,7 +953,7 @@
 #   resource   - The resource to include.  This is passed directly, without
 #                interpretation to lonnet::ssi.
 #   form       - The form hash parameters that guide the interpretation of the resource
-#                
+#
 #   retries    - Number of retries allowed before giving up completely.
 # Returns:
 #   On success, returns the rendered resource identified by the resource parameter.
@@ -1005,12 +1004,12 @@
 
 #
 #   printf_style_subst  item format_string repl
-#  
+#
 # Does printf style substitution for a format string that
 # can have %[n]item in it.. wherever, %[n]item occurs,
 # rep is substituted in format_string.  Note that
 # [n] is an optional integer length.  If provided,
-# repl is truncated to at most [n] characters prior to 
+# repl is truncated to at most [n] characters prior to
 # substitution.
 #
 sub printf_style_subst {
@@ -1022,15 +1021,15 @@
 	my $subst = $repl;
 	if ($size ne "") {
 	    $subst = substr($subst, 0, $size);
-	    
-	    #  Here's a nice edge case.. supose the end of the
-	    #  substring is a \.  In that case may have  just
+
+	    #  Here's a nice edge case ... suppose the end of the
+	    #  substring is a \.  In that case may have just
 	    #  chopped off a TeX escape... in that case, we append
-	    #   " " for the trailing character, and let the field 
+	    #   " " for the trailing character, and let the field
 	    #  spill over a bit (sigh).
 	    #  We don't just chop off the last character in order to deal
 	    #  with one last pathology, and that would be if substr had
-	    #  trimmed us to e.g. \\\  
+	    #  trimmed us to e.g. \\\
 
 
 	    if ($subst =~ /\\$/) {
@@ -1050,8 +1049,8 @@
 }
 
 
-# Format a header according to a format.  
-# 
+# Format a header according to a format.
+#
 
 # Substitutions:
 #     %a    - Assignment name.
@@ -1075,7 +1074,7 @@
 	# we assume that each character is about 2mm in width.
 	# (correct for the header text size??).  We ignore
 	# any formatting (e.g. boldfacing in this).
-	# 
+	#
 	# - Allow the student/course to be one line.
 	#   but only truncate the course.
 	# - Allow the assignment to be 2 lines (wrapped).
@@ -1111,9 +1110,6 @@
 
     }
 
-    return $format;
-
-    
     # If the user has role author, $course and $assignment are empty so
     # there is '\\ \\ ' in the page header. That's cause a error in LaTeX
     if($format =~ /\\\\\s\\\\\s/) {
@@ -1121,6 +1117,9 @@
         my $testPrintout = '\\\\'.&mt('Authoring Space').' \\\\'.&mt('Test-Printout ');
         $format =~ s/\\\\\s\\\\\s/$testPrintout/;
     }
+
+    return $format;
+
     #
     #  We're going to trust LaTeX to break lines appropriately, but
     #  we'll truncate anything that's more than 3 lines worth of
@@ -1136,7 +1135,7 @@
 
 
     return $format;
-    
+
 }
 
 #
@@ -1184,7 +1183,7 @@
     #   Remove leading/trailing whitespace;
     $value =~ s/^\s*//g;
     $value =~ s/\s*$//g;
-    
+
     #  All digits?
     if ($value !~ /^[0-9]+$/) {
 	return "Numeric code $value has invalid characters - must only be digits";
@@ -1205,7 +1204,7 @@
 #
 sub is_valid_alpha_code {
     my ($value, $num_letters) = @_;
-    
+
      # strip leading and trailing spaces.
 
     $value =~ s/^\s*//g;
@@ -1223,7 +1222,7 @@
 
 #   Determine if a code entered by the user in a helper is valid.
 #   valid depends on the code type and the type of code selected.
-#   The type of code selected can either be numeric or 
+#   The type of code selected can either be numeric or
 #   Alphabetic.  If alphabetic, the code, in fact is a simple
 #   substitution cipher for the actual numeric code: 0->A, 1->B ...
 #   We'll be nice and be case insensitive for alpha codes.
@@ -1260,7 +1259,7 @@
 #
 # Compare two students by section (Used to sort by section).
 #
-#  Implicit inputs, 
+#  Implicit inputs,
 #    $a - The first one
 #    $b - The second one.
 #
@@ -1312,11 +1311,11 @@
     }
 
     # Break the tie on the first name, but there are leading (possibly trailing
-    # whitespaces to get rid of first 
+    # whitespaces to get rid of first)
     #
     $f1 =~ s/^\s+//;		# Remove leading...
     $f1 =~ s/\s+$//;		# Trailing spaces from first 1...
-    
+
     $f2 =~ s/^\s+//;
     $f2 =~ s/\s+$//;		# And the same for first 2...
 
@@ -1326,7 +1325,7 @@
     if($f1 gt $f2) {
 	return 1;
     }
-    
+
     #  Must be the same name.
 
     return 0;
@@ -1339,7 +1338,7 @@
     return $text;
 }
 #
-#  If necessary, encapsulate text inside 
+#  If necessary, encapsulate text inside
 #  a minipage env.
 #  necessity is determined by the problem_split param.
 #
@@ -1363,7 +1362,7 @@
     my $helper = shift;
 
     my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'};
-    
+
     if ($split_pdf eq 'all') {
 	$helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all';
     } elsif ($split_pdf eq 'oneper') {
@@ -1395,8 +1394,8 @@
     $result =~ s/&(\#0?34|quot);/\"/g;
     $result =~ s/&\#0?35;/\\\#/g;
     $result =~ s/&\#0?36;/\\\$/g;
-    $result =~ s/&\#0?37;/\\%/g; 
-    $result =~ s/&(\#0?38|amp);/\\&/g; 
+    $result =~ s/&\#0?37;/\\%/g;
+    $result =~ s/&(\#0?38|amp);/\\&/g;
     $result =~ s/&\#(0?39|146);/\'/g;
     $result =~ s/&\#0?40;/(/g;
     $result =~ s/&\#0?41;/)/g;
@@ -1503,7 +1502,7 @@
     $result =~ s/&(\#160|nbsp);/~/g;
     $result =~ s/&(\#161|iexcl);/!\`/g;
     $result =~ s/&(\#162|cent);/\\textcent /g;
-    $result =~ s/&(\#163|pound);/\\pounds /g; 
+    $result =~ s/&(\#163|pound);/\\pounds /g;
     $result =~ s/&(\#164|curren);/\\textcurrency /g;
     $result =~ s/&(\#165|yen);/\\textyen /g;
     $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g;
@@ -1529,32 +1528,32 @@
     $result =~ s/&(\#188|frac14);/\\textonequarter /g;
     $result =~ s/&(\#189|frac12);/\\textonehalf /g;
     $result =~ s/&(\#190|frac34);/\\textthreequarters /g;
-    $result =~ s/&(\#191|iquest);/?\`/g;   
-    $result =~ s/&(\#192|Agrave);/\\\`{A}/g;  
-    $result =~ s/&(\#193|Aacute);/\\\'{A}/g; 
+    $result =~ s/&(\#191|iquest);/?\`/g;
+    $result =~ s/&(\#192|Agrave);/\\\`{A}/g;
+    $result =~ s/&(\#193|Aacute);/\\\'{A}/g;
     $result =~ s/&(\#194|Acirc);/\\^{A}/g;
     $result =~ s/&(\#195|Atilde);/\\~{A}/g;
-    $result =~ s/&(\#196|Auml);/\\\"{A}/g; 
+    $result =~ s/&(\#196|Auml);/\\\"{A}/g;
     $result =~ s/&(\#197|Aring);/{\\AA}/g;
     $result =~ s/&(\#198|AElig);/{\\AE}/g;
     $result =~ s/&(\#199|Ccedil);/\\c{c}/g;
-    $result =~ s/&(\#200|Egrave);/\\\`{E}/g;  
-    $result =~ s/&(\#201|Eacute);/\\\'{E}/g;    
+    $result =~ s/&(\#200|Egrave);/\\\`{E}/g;
+    $result =~ s/&(\#201|Eacute);/\\\'{E}/g;
     $result =~ s/&(\#202|Ecirc);/\\^{E}/g;
     $result =~ s/&(\#203|Euml);/\\\"{E}/g;
     $result =~ s/&(\#204|Igrave);/\\\`{I}/g;
-    $result =~ s/&(\#205|Iacute);/\\\'{I}/g;    
+    $result =~ s/&(\#205|Iacute);/\\\'{I}/g;
     $result =~ s/&(\#206|Icirc);/\\^{I}/g;
-    $result =~ s/&(\#207|Iuml);/\\\"{I}/g;    
+    $result =~ s/&(\#207|Iuml);/\\\"{I}/g;
     $result =~ s/&(\#209|Ntilde);/\\~{N}/g;
     $result =~ s/&(\#210|Ograve);/\\\`{O}/g;
     $result =~ s/&(\#211|Oacute);/\\\'{O}/g;
     $result =~ s/&(\#212|Ocirc);/\\^{O}/g;
     $result =~ s/&(\#213|Otilde);/\\~{O}/g;
-    $result =~ s/&(\#214|Ouml);/\\\"{O}/g;    
+    $result =~ s/&(\#214|Ouml);/\\\"{O}/g;
     $result =~ s/&(\#215|times);/\\ensuremath\{\\times\}/g;
     $result =~ s/&(\#216|Oslash);/{\\O}/g;
-    $result =~ s/&(\#217|Ugrave);/\\\`{U}/g;    
+    $result =~ s/&(\#217|Ugrave);/\\\`{U}/g;
     $result =~ s/&(\#218|Uacute);/\\\'{U}/g;
     $result =~ s/&(\#219|Ucirc);/\\^{U}/g;
     $result =~ s/&(\#220|Uuml);/\\\"{U}/g;
@@ -1585,7 +1584,7 @@
     $result =~ s/&(\#246|ouml);/\\\"{o}/g;
     $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g;
     $result =~ s/&(\#248|oslash);/{\\o}/g;
-    $result =~ s/&(\#249|ugrave);/\\\`{u}/g; 
+    $result =~ s/&(\#249|ugrave);/\\\`{u}/g;
     $result =~ s/&(\#250|uacute);/\\\'{u}/g;
     $result =~ s/&(\#251|ucirc);/\\^{u}/g;
     $result =~ s/&(\#252|uuml);/\\\"{u}/g;
@@ -1732,12 +1731,12 @@
 my %page_formats=
     ('letter' => {
 	 'book' => {
-	     '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'],
-	     '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','-0.4 in']
+	     '1' => [ '7.1 in','9.7 in', '-0.57 in','-0.57 in','-0.5 in'],
+	     '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','-0.5 in']
 	 },
 	 'album' => {
-	     '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.55 in','0.394 in'],
-	     '2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.25 in']
+	     '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.55 in','-0.5 in'],
+	     '2' => [ '4.8 in', '6.7 in','-0.5 in', '-1.0 in','3.0 in']
 	 },
      },
      'legal' => {
@@ -1747,7 +1746,7 @@
 	 },
 	 'album' => {
 	     '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'],
-             '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in']
+             '2' => ['5.7 in','7.1 in','-1 in','-1 in','5 in']
           },
      },
      'tabloid' => {
@@ -1796,8 +1795,8 @@
 	     '2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm']
 	 },
 	 'album' => {
-	     '1' => ['21.59 cm','19.558 cm','-1.397cm','-2.11 cm','0 cm'],
-	     '2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm']
+	     '1' => ['24.0 cm','18.0 cm','-1.0 cm','-1.0 cm','-1.25 cm'],
+	     '2' => ['11.5 cm','18.0 cm','-0.7 cm','-1.7 cm','-1.25 cm']
 	 },
      },
      'a5' => {
@@ -1829,8 +1828,8 @@
 #                        "A2 [420x594 mm]",           "A3 [297x420 mm]",
 #                        "A4 [210x297 mm]",           "A5 [148x210 mm]",
 #                        "A6 [105x148 mm]"
-# 
-    my ($papersize,$layout,$numberofcolumns) = @_; 
+#
+    my ($papersize,$layout,$numberofcolumns) = @_;
     return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}};
 }
 
@@ -1849,12 +1848,14 @@
     my $courseidinfo;
     if (defined($env{'request.course.id'})) {
 	$courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
+
     }
     return $courseidinfo;
 }
 
 sub page_format_transformation {
-    my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; 
+    my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,
+        $indexlist,$selectionmade,$mostrecent) = @_;
     my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);
 
     if ($selectionmade eq '4') {
@@ -1868,8 +1869,12 @@
     }
     ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);
 
-
-    my $name = &get_name();
+    my $name;
+    if ($mostrecent ne '') {
+        $name = $mostrecent;
+    } else {
+        $name = &get_name();
+    }
     my $courseidinfo = &get_course();
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     my $header_text  = $parmhash{'print_header_format'};
@@ -1880,26 +1885,53 @@
     my $fancypagestatement='';
     if ($numberofcolumns eq '2') {
 	$fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}";
+	if ($parmhash{'print_header_format'} eq '') {
+	    $fancypagestatement .= "\\fancyhead[RE]{\\thepage \\\\[\\baselineskip]}";
+	}
     } else {
 	$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}";
     }
+    $fancypagestatement .= "\\fancyfoot{}";
+    my ($paperwidth,$paperheight);
     if ($layout eq 'album') {
 	    $text =~ s/\\begin\{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /;
+        if ($papersize eq 'a4') {
+            $paperwidth = '29.7cm';
+            $paperheight = '21.0cm';
+        } elsif ($numberofcolumns eq '1') {
+            if ($papersize eq 'letter') {
+                $paperwidth = '11.0in';
+                $paperheight = '8.5in';
+            } elsif ($papersize eq 'legal') {
+                $paperwidth = '14.0in';
+                $paperheight = '8.5in';
+            }
+        }
     } elsif ($layout eq 'book') {
-	if ($choice ne 'All class print') { 
+	if ($choice ne 'All class print') {
 	    $text =~ s/\\begin\{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\usepackage{booktabs}\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/;
 	} else {
 	    $text =~ s/\\pagestyle\{fancy}\\rhead\{}\\chead\{}\s*\\begin\{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\usepackage{booktabs}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1}  \\vskip 5 mm\n /;
 	}
-	if ($papersize eq 'a4') {
-	    my $papersize_text;
-	    if ($perm{'pav'}) {
-		$papersize_text = '\\special{papersize=210mm,297mm}';
-	    } else {
-		$papersize_text = '\special{papersize=210mm,297mm}';
-	    }
-	    $text =~ s/(\\begin\{document})/$1$papersize_text/;
-	}
+        if ($papersize eq 'a4') {
+            $paperwidth = '21.0cm';
+            $paperheight = '29.7cm';
+        } elsif ($papersize eq 'letter') {
+            $paperwidth = '8.5in';
+            $paperheight = '11.0in';
+         } elsif ($papersize eq 'legal') {
+            $paperwidth = '8.5in';
+            $paperheight = '14.0in';
+        }
+    }
+    if ($paperwidth ne '' && $paperheight ne '') {
+        my $papersize_text;
+        if ($perm{'pav'}) {
+            $papersize_text = '\\special{papersize='.$paperwidth.','.$paperheight.'}';
+        } else {
+            $papersize_text = '\special{papersize='.$paperwidth.','.$paperheight.'}';
+        }
+        $text =~ s/(\\begin\{document})/$1$papersize_text/;
     }
     if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}
     if ($indexlist eq 'yes') {
@@ -1912,7 +1944,7 @@
 
 sub page_cleanup {
     my $result = shift;	
- 
+
     $result =~ m/\\end\{document}(\d*)$/;
     my $number_of_columns = $1;
     my $insert = '{';
@@ -1964,7 +1996,7 @@
     $result =~ s/\$number_of_columns/$number_of_columns/g;
     $result =~ s/(\\end\{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]\{\\hrulefill})/$2$1/g;
     $result =~ s/(\\end\{longtable}\s*)\\strut\\newline/$1/g;
-#-- LaTeX corrections     
+#-- LaTeX corrections
     my $first_comment = index($result,'<!--',0);
     while ($first_comment != -1) {
 	my $end_comment = index($result,'-->',$first_comment);
@@ -2083,8 +2115,8 @@
     }
     if ($mode ne '') {$mode='\\'.$mode}
     my $result = &print_latex_header($mode);
-    if ($cleanURL=~m|^(/adm/wrapper/)?ext/|) {
-        $cleanURL=~s|^(/adm/wrapper/)?ext/|http://|;
+    if ($cleanURL=~m|^(/adm/wrapper)?/ext/|) {
+        $cleanURL=~s|^(/adm/wrapper)?/ext/|http://|;
         $cleanURL=~s|^http://https://|https://|;
         if ($shown eq $currentURL) {
             $shown = &Apache::lonxml::latex_special_symbols($cleanURL);
@@ -2096,7 +2128,7 @@
         if ($shown eq $currentURL) {
 	    $result.=&Apache::lonxml::latex_special_symbols($currentURL);
         } else {
-            $result.=$shown;   
+            $result.=$shown;
         }
     }
     $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';
@@ -2133,7 +2165,7 @@
     $laystyle = &map_laystyle($laystyle);
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,
 								      $numberofcolumns);
-    my $LaTeXwidth=&recalcto_mm($textwidth); 
+    my $LaTeXwidth=&recalcto_mm($textwidth);
 
     if ($mode ne '') {$mode='\\'.$mode}
     my $result   =    &print_latex_header($mode);
@@ -2149,9 +2181,9 @@
 	&Apache::lonnet::delenv('construct.style');
     }
 
-    # First is the overall page description.  This is then followed by the 
+    # First is the overall page description.  This is then followed by the
     # components of the page. Each of which must be printed independently.
-    my $the_page = shift(@page_resources); 
+    my $the_page = shift(@page_resources);
 
 
     foreach my $resource (@page_resources) {
@@ -2163,12 +2195,12 @@
 	if ($resource_src =~ /.page$/i) {
 	    my $navmap         = Apache::lonnavmaps::navmap->new();
 	    my @page_resources = $navmap->retrieveResources($resource_src);
-	    $result           .= &print_page_in_course($helper, $rparmhash, 
+	    $result           .= &print_page_in_course($helper, $rparmhash,
 						       $resource_src, \@page_resources);
         } elsif ($resource->ext()) {
             $result.=&latex_header_footer_remove(&unsupported($current_url,$mode,$resource->symb));
 	} elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/)  {
-            # these resources go through the XML transformer:   
+            # these resources go through the XML transformer:
             $result .= &Apache::lonxml::latex_special_symbols($resource->title()) . '\\\\';
 
 	    my $urlp = &Apache::lonnet::clutter($resource_src);
@@ -2182,9 +2214,9 @@
 
 	    $form{'grade_target'}  = 'tex';
 	    $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
-	    $form{'pdfFormFields'} = 'no'; # 
-	    $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};    
-	    
+	    $form{'pdfFormFields'} = 'no'; #
+	    $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
+
 	    $form{'problem_split'}=$parmhash{'problem_stream_switch'};
 	    $form{'suppress_tries'}=$parmhash{'suppress_tries'};
 	    $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
@@ -2200,7 +2232,7 @@
 	    }
 	    $form{'rndseed'}=$rndseed;
 	    &Apache::lonnet::appenv(\%moreenv);
-	    
+
 	    &Apache::lonxml::clear_problem_counter();
 
 	    my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);
@@ -2240,11 +2272,6 @@
 		    }
 		    $texversion.='\vskip 1 mm '.$answer.'\end{document}';
 		}
-
-
-		
-
-	    
 	    }
 	    # Print annotations.
 
@@ -2253,7 +2280,7 @@
 		my $annotation .= &annotate($currentURL);
 		$texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/;
 	    }
-	    
+
 	    if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
 		$texversion=&IndexCreation($texversion,$currentURL);
 	    }
@@ -2291,7 +2318,7 @@
     my $pdf_result;
     opendir(DIR,$prtspool);
 
-    my @files = 
+    my @files =
 	grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR));
     closedir(DIR);
 
@@ -2371,7 +2398,7 @@
     }
     return %page_breaks;
 }
-# 
+#
 #   Returns text to insert for any extra vskip prior to the resource.
 #   Parameters:
 #     helper   - Reference to the helper object driving the printout.
@@ -2382,7 +2409,7 @@
 #    EXTRASPACE         has the list of extra space values.
 #    EXTRASPACE_UNITS   is the set of resources for which the units are
 #                       mm. All others are 'in'.
-#    
+#
 #    The resource is found in the POSSIBLE_RESOURCES to get the index
 #    of the EXTRASPACE value.
 #
@@ -2403,7 +2430,7 @@
 
     my ($helper)  = @_;
 
-    #  If this is the first time, unrap the resources and extra spaces:
+    # If this is the first time, unwrap the resources and extra spaces:
 
     if (!$skips_loaded) {
 	@extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'}));
@@ -2451,7 +2478,7 @@
 #  The resource chooser part of the helper needs more than just
 #  the value of the extraspaces var to recover the value into a text
 #  field option.  This sub produces the required format for the saved var:
-#  specifically 
+#  specifically
 #    ||| separated fields of the form resourcename=value
 #
 #  Parameters:
@@ -2485,7 +2512,7 @@
     $env{'form.extraspace'}  = $result;
     $env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'};
     return $result;
-    
+
 }
 
 #  Output a sequence (recursively if neeed)
@@ -2511,11 +2538,11 @@
     }
     my $errtext=&LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$currentURL));
 
-    # 
+    #
     #  These make this all support recursing for subsequences.
     #
     my @order    = @LONCAPA::map::order;
-    my @resources = @LONCAPA::map::resources; 
+    my @resources = @LONCAPA::map::resources;
 
     for (my $member=0;$member<=$#order;$member++) {
 	$resources[$order[$member]]=~/^([^:]*):([^:]*):/;
@@ -2531,7 +2558,7 @@
 		$texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);
 	    }
 	    if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
-		($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && 
+		($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) &&
 	       ($urlp=~/$LONCAPA::assess_page_re/)) {
 		#  Don't permanently modify %$form...
 		my %answerform = %form;
@@ -2546,7 +2573,7 @@
 		    $texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/;
 		} else {
 		    # If necessary, encapsulate answer in minipage:
-		    
+
 		    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
 		    my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
 		    $title = &Apache::lonxml::latex_special_symbols($title);
@@ -2568,16 +2595,16 @@
 	    $result.=$texversion;
 
 	} elsif ($urlp=~/\.(sequence|page)$/) {
- 
+
 	    # header:
 
 	    $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent ';
 
 	    # IF sequence, recurse:
-	    
+
 	    if ($urlp =~ /\.sequence$/) {
-		$result .= &print_construction_sequence($urlp, 
-							$helper, %form, 
+		$result .= &print_construction_sequence($urlp,
+							$helper, %form,
 							$LaTeXwidth);
 	    }
 	}
@@ -2592,7 +2619,7 @@
 	    if ($member != $#order) {
 		$texversion .= '\\ \cleardoublepage';
 	    }
-	    
+
 	    $result .= $texversion;
 	}
     }
@@ -2616,6 +2643,7 @@
 #   6        Print selected problems from a folder.
 #   7        Print print selected resources from some scope.
 #   8        Print resources for selected students.
+#   9        Print for anonymous CODEs
 #
 #BZ 5209
 #   2        map_incomplete_problems_seq Print incomplete problems from the current
@@ -2653,7 +2681,7 @@
         url += 'form=' + formname + '&';
         if (only != null) {
             url += 'only=' + only + '&';
-        } 
+        }
         if (omit != null) {
             url += 'omit=' + omit + '&';
         }
@@ -2688,7 +2716,7 @@
 
     $env{'form.pagebreaks'}  = $helper->{'VARS'}->{'FINISHPAGE'};
     &set_form_extraspace($helper);
-    $env{'form.lastprinttype'} = $print_type; 
+    $env{'form.lastprinttype'} = $print_type;
     &Apache::loncommon::store_course_settings('print',
 					      {'pagebreaks'    => 'scalar',
 					       'extraspace'    => 'scalar',
@@ -2705,13 +2733,13 @@
     $laystyle = &map_laystyle($laystyle);
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);
     my $assignment =  $env{'form.assignment'};
-    my $LaTeXwidth=&recalcto_mm($textwidth); 
+    my $LaTeXwidth=&recalcto_mm($textwidth);
     my @print_array=();
     my @student_names=();
+    my $lastprinted;
 
-     
-    #  Common settings for the %form has:
-    # In some cases these settings get overriddent by specific cases, but the
+    #  Common settings for the %form hash:
+    # In some cases these settings get overridden by specific cases, but the
     # settings are common enough to make it worthwhile factoring them out
     # here.
     #
@@ -2721,16 +2749,16 @@
     $form{'pdfFormFields'} = 'no';
 
     # If form.showallfoils is set, then request all foils be shown:
-    # privilege will be enforced both by not allowing the 
+    # privilege will be enforced both by not allowing the
     # check box selecting this option to be presnt unless it's ok,
     # and by lonresponse's priv. check.
     # The if is here because lonresponse.pm only cares that
     # showallfoils is defined, not what the value is.
 
-    if ($helper->{'VARS'}->{'showallfoils'} eq "1") { 
+    if ($helper->{'VARS'}->{'showallfoils'} eq "1") {
 	$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
     }
-    
+
     if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
 	&Apache::lonnet::appenv({'construct.style' =>
 				$helper->{'VARS'}->{'style_file'}});
@@ -2783,7 +2811,7 @@
 		$texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form);
 
 		#  Add annotations if required:
-	    
+
 		&Apache::lonxml::clear_problem_counter();
 
 		&Apache::lonnet::delenv('request.filename');
@@ -2826,7 +2854,7 @@
 
 		
 
-	    
+
 	    }
 	    # Print annotations.
 
@@ -2852,12 +2880,12 @@
 		 && $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') {
 	    $result .= &print_construction_sequence($currentURL, $helper, %form,
 						    $LaTeXwidth);
-	    $result .= '\end{document}';  
+	    $result .= '\end{document}';
 	    if (!($result =~ /\\begin\{document\}/)) {
 		$result = &print_latex_header() . $result;
 	    }
 	    # End construction space sequence.
-	} elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
+	} elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
 		$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
 		if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}
 		$resources_printed .= $currentURL.':';
@@ -2892,7 +2920,7 @@
 	    $result           .=  &print_page_in_course($helper, $rparmhash,
 							$cleanURL, \@page_resources);
 
-       
+
 	} else {
 	    $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
 				  $helper->{'VARS'}->{'symb'});
@@ -2906,7 +2934,7 @@
 	     ($print_type eq 'select_sequences')      or
 	     ($print_type eq 'map_incomplete_problems_seq')
 	     ) {
- 
+
         #-- produce an output string
 	if (($print_type eq 'map_problems')                or
 	    ($print_type eq 'map_incomplete_problems_seq') or
@@ -2916,7 +2944,7 @@
 		 ($print_type eq 'map_resources_in_page'))
 	{
 	    $selectionmade = 3;
-	} elsif (($print_type eq 'all_problems') 
+	} elsif (($print_type eq 'all_problems')
 		 ) {
 	    $selectionmade = 4;
 	} elsif ($print_type eq 'all_resources') {  #BUGBUG
@@ -2981,7 +3009,7 @@
 		$texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);
 		if ($urlp=~/\.page$/) {
 		    ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
-		    if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
+		    if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;}
 		    $texversion =~ s/\\end\{document}\d*/\\end{document}/;
 		    $flag_page_in_sequence = 'YES';
 		}
@@ -3045,8 +3073,8 @@
 		    $prevassignment=$assignment;
 		    my $header_text = $parmhash{'print_header_format'};
 		    $header_text    = &format_page_header($textwidth, $header_text,
-							  $assignment, 
-							  $courseidinfo, 
+							  $assignment,
+							  $courseidinfo,
 							  $name);
 		    if ($numberofcolumns eq '1') {
 			$result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm ';
@@ -3055,8 +3083,8 @@
 		    }			
 		}
 		$result .= $texversion;
-		$flag_latex_header_remove = 'YES';   
-	    } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
+		$flag_latex_header_remove = 'YES';
+	    } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
 		$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
 		if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}
 		$resources_printed .= $urlp.':';
@@ -3072,7 +3100,7 @@
 		    $texversion =~ s/\\end\{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/;
 		}
 		$result .= $texversion;
-		$flag_latex_header_remove = 'YES'; 
+		$flag_latex_header_remove = 'YES';
 	    } elsif ($urlp=~ /\.pdf$/i) {
 		if ($i > 0) {
 		    $result .= '\cleardoublepage';
@@ -3103,10 +3131,10 @@
 		    $texversion =~ s/\\end\{document}//;
 		}
 		$result .= $texversion;
-		$flag_latex_header_remove = 'YES';   
+		$flag_latex_header_remove = 'YES';
 	    }
-	    if (&Apache::loncommon::connection_aborted($r)) { 
-		last; 
+	    if (&Apache::loncommon::connection_aborted($r)) {
+		last;
 	    }
 	}
 	&Apache::lonxml::clear_problem_counter();
@@ -3122,7 +3150,7 @@
 	      ($print_type eq 'map_incomplete_problems_people_seq')){
 
 
-     #-- prints assignments for whole class or for selected students  
+     #-- prints assignments for whole class or for selected students
 	 my $type;
 	 if (($print_type eq 'problems_for_students')           ||
 	     ($print_type eq 'problems_for_students_from_page') ||
@@ -3141,15 +3169,15 @@
 	 #   to override this and output the students by name.
 	 #    Each element of the students array is of the form:
 	 #       username:domain:section:last, first:status
-	 #    
-	 #  Note that student sort is not compatible with printing 
+	 #
+	 #  Note that student sort is not compatible with printing
 	 #  1 section per pdf...so that setting overrides.
-	 #   
-	 if (($helper->{'VARS'}->{'student_sort'}    eq 1)  && 
+	 #
+	 if (($helper->{'VARS'}->{'student_sort'}    eq 1)  &&
 	     ($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) {
 	     @students = sort compare_names  @students;
 	 } else {
-	     @students = sort compare_sections @students; 
+	     @students = sort compare_sections @students;
 	 }
 	 &adjust_number_to_print($helper);
 
@@ -3157,8 +3185,8 @@
 	     $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) {
 	     $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;
 	 }
-	 # If we are splitting on section boundaries, we need 
-	 # to remember that in split_on_sections and 
+	 # If we are splitting on section boundaries, we need
+	 # to remember that in split_on_sections and
 	 # print all of the students in the list.
 	 #
 	 my $split_on_sections = 0;
@@ -3229,6 +3257,9 @@
 #	     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);
 	     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
 	     $flag_latex_header_remove = 'YES';
+             if ($printed) {
+                 $lastprinted = $fullname;
+             }
 	     if (&Apache::loncommon::connection_aborted($r)) { last; }
 	 }
 	 &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
@@ -3236,6 +3267,7 @@
      } elsif (($print_type eq 'problems_for_anon')      ||
 	      ($print_type eq 'problems_for_anon_page') ||
 	      ($print_type eq 'resources_for_anon')  ) {
+         $selectionmade = 9;
 	 my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
 	 my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
 	 my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
@@ -3248,14 +3280,14 @@
 	 my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10);
 	 foreach my $line (@lines) {
              next if (($line =~ /^\#/) || ($line eq ''));
-	     my ($name,$type,$length,$bubbles_per_item) = 
+	     my ($name,$type,$length,$bubbles_per_item) =
                  (split(/:/,$line))[0,2,4,17];
 	     if ($name eq $code_option) {
 		 $code_length=$length;
 		 if ($type eq 'number') { $code_type = 'number'; }
-                 chomp($bubbles_per_item); 
+                 chomp($bubbles_per_item);
                  if (($bubbles_per_item ne '') && ($bubbles_per_item > 0)) {
-                     $bubbles_per_row = $bubbles_per_item; 
+                     $bubbles_per_row = $bubbles_per_item;
                  }
 	     }
 	 }
@@ -3266,6 +3298,7 @@
          }
 	 my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
 	 $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
+         $moreenv{'suppress_tries'} = $parmhash{'suppress_tries'};
          $moreenv{'instructor_comments'}='hide';
          $moreenv{'bubbles_per_row'} = $bubbles_per_row;
 	 my $seed=time+($$<<16)+($$);
@@ -3317,16 +3350,16 @@
 	     || $number_per_page eq 'section') {
 	     $number_per_page=$num_todo > 0 ? $num_todo : 1;
 	 }
-	 my $flag_latex_header_remove = 'NO'; 
+	 my $flag_latex_header_remove = 'NO';
 	 my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$num_todo);
 	 my $count=0;
          my $nohidemap;
          if ($perm{'pav'} && $perm{'vgr'}) {
-             $nohidemap = 1; 
+             $nohidemap = 1;
          }
 	 foreach my $code (sort(@allcodes)) {
 	     my $file_num=int($count/$number_per_page);
-	     if ($code_type eq 'number') { 
+	     if ($code_type eq 'number') {
 		 $moreenv{'CODE'}=$code;
 	     } else {
 		 $moreenv{'CODE'}=&num_to_letters($code);
@@ -3346,16 +3379,19 @@
 				       &mt('last assignment').' '.$fullname);
 	     $flag_latex_header_remove = 'YES';
 	     $count++;
+             if ($printed) {
+                 $lastprinted = $fullname;
+             }
 	     if (&Apache::loncommon::connection_aborted($r)) { last; }
 	 }
 	 &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
 	 $result .= $print_array[0].'  \end{document}';
      } elsif ($print_type eq 'problems_from_directory') {
-    #prints selected problems from the subdirectory 
+    #prints selected problems from the subdirectory
 	$selectionmade = 6;
         my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};
 	@list_of_files=sort @list_of_files;
-	my $flag_latex_header_remove = 'NO'; 
+	my $flag_latex_header_remove = 'NO';
 	my $rndseed=time;
 	if ($helper->{'VARS'}->{'curseed'}) {
 	    $rndseed=$helper->{'VARS'}->{'curseed'};
@@ -3411,11 +3447,11 @@
 		}
 		if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
 		    $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;
-		    
+
 		}
 		$result .= $texversion;
 	    }
-	    $flag_latex_header_remove = 'YES';  
+	    $flag_latex_header_remove = 'YES';
 	}
 	if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\typeout)/ RANDOM SEED IS $rndseed $1/;}
 	$result .= '\end{document}';      	
@@ -3425,13 +3461,18 @@
     # Only post process if that has not been turned off e.g. by a raw latex resource.
 
     if ($do_postprocessing) {
+        my $mostrecent;
+        if ((($selectionmade == 5) || ($selectionmade == 8) || ($selectionmade == 9)) &&
+            (($numberofcolumns == 1) || ($laystyle eq 'album' && $papersize eq 'a4'))) {
+            $mostrecent = $lastprinted;
+        }
 	$result = &page_format_transformation($papersize,
 					      $laystyle,$numberofcolumns,
 					      $print_type,$result,
 					      $helper->{VARS}->{'assignment'},
 					      $helper->{'VARS'}->{'TABLE_CONTENTS'},
 					      $helper->{'VARS'}->{'TABLE_INDEX'},
-					      $selectionmade);
+					      $selectionmade,$mostrecent);
 	$result = &latex_corrections($number_of_columns,$result,$selectionmade,
 				     $helper->{'VARS'}->{'ANSWER_TYPE'});
 	#if ($numberofcolumns == 1) {
@@ -3496,18 +3537,18 @@
     $result       = &collect_languages($result);
 
 
-#-- writing .tex file in prtspool 
+#-- writing .tex file in prtspool
     my $temp_file;
     my $identifier = &Apache::loncommon::get_cgi_id();
     my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex";
-    if (!($#print_array>0)) { 
+    if (!($#print_array>0)) {
        unless ($temp_file = Apache::File->new('>'.$filename)) {
 	  $r->log_error("Couldn't open $filename for output $!");
-	  return SERVER_ERROR; 
+	  return SERVER_ERROR;
        }
        print $temp_file $result;
        my $begin=index($result,'\begin{document}',0);
-       my $inc=substr($result,0,$begin+16); 
+       my $inc=substr($result,0,$begin+16);
     } else {
        my $begin=index($result,'\begin{document}',0);
        my $inc=substr($result,0,$begin+16);
@@ -3516,11 +3557,11 @@
 	      $print_array[$i]=$result;
 	  } else {
 	      $print_array[$i].='\end{document}';
-	      $print_array[$i] = 
+	      $print_array[$i] =
 		&latex_corrections($number_of_columns,$print_array[$i],
-				   $selectionmade, 
+				   $selectionmade,
 				   $helper->{'VARS'}->{'ANSWER_TYPE'});
-	    
+
 	      my $anobegin=index($print_array[$i],'\setcounter{page}',0);
 	      substr($print_array[$i],0,$anobegin)='';
 	      $print_array[$i]=$inc.$print_array[$i];
@@ -3528,11 +3569,11 @@
 	  my $temp_file;
 	  my $newfilename=$filename;
 	  my $num=$i+1;
-	  $newfilename =~s/\.tex$//; 
+	  $newfilename =~s/\.tex$//;
 	  $newfilename=sprintf("%s_%03d.tex",$newfilename, $num);
 	  unless ($temp_file = Apache::File->new('>'.$newfilename)) {
 	      $r->log_error("Couldn't open $newfilename for output $!");
-	      return SERVER_ERROR; 
+	      return SERVER_ERROR;
 	  }
 	  print $temp_file $print_array[$i];
        }
@@ -3570,8 +3611,8 @@
 				'cgi.'.$identifier.'.backref' => &escape($URLback),});
     &Apache::lonnet::appenv({"cgi.$identifier.user"    => $env{'user.name'},
 				"cgi.$identifier.domain"  => $env{'user.domain'},
-				"cgi.$identifier.courseid" => $cnum, 
-				"cgi.$identifier.coursedom" => $cdom, 
+				"cgi.$identifier.courseid" => $cnum,
+				"cgi.$identifier.coursedom" => $cdom,
 				"cgi.$identifier.resources" => $resources_printed});
 	
     my $end_page = &Apache::loncommon::end_page();
@@ -3618,7 +3659,7 @@
 sub print_resources {
     my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,
 	$LaTeXwidth)=@_;
-    my $current_output = ''; 
+    my $current_output = '';
     my $printed = '';
     my ($username,$userdomain,$usersection) = split /:/,$person;
     my $fullname = &get_name($username,$userdomain);
@@ -3645,20 +3686,20 @@
 
     my $i           = 0;
     my $actually_printed = 0;	# Count of resources printed.
-    #goes through all resources, checks if they are available for 
-    #current student, and produces output   
+    #goes through all resources, checks if they are available for
+    #current student, and produces output
 
     &Apache::lonxml::clear_problem_counter();
     my %page_breaks  = &get_page_breaks($helper);
     my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1];
     #
-    #   end each student with a 
+    #   end each student with a
     #   Special that allows the post processor to even out the page
     #   counts later.  Nasty problem this... it would be really
     #   nice to put the special in as a postscript comment
     #   e.g. \special{ps:\ENDOFSTUDENTSTAMP}  unfortunately,
     #   The special gets passed the \ and dvips puts it in the output file
-    #   so we will just rely on prntout.pl to strip  ENDOFSTUDENTSTAMP from the
+    #   so we will just rely on printout.pl to strip ENDOFSTUDENTSTAMP from the
     #   postscript.  Each ENDOFSTUDENTSTAMP will go on a line by itself.
     #
 
@@ -3682,7 +3723,7 @@
 
 	# See if we need to emit a new header:
 
-	if ( !($type eq 'problems' && 
+	if ( !($type eq 'problems' &&
 	       ($curresline!~ m/$LONCAPA::assess_page_re/)) ) {
 	    if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) {
 		next;
@@ -3693,7 +3734,7 @@
 		if ($res_url!~m|^ext/|
 		    && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
 		    $printed .= $curresline.':';
-		    &Apache::lonxml::remember_problem_counter();    
+		    &Apache::lonxml::remember_problem_counter();
 
 		    my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
                     if ($res_url =~ /\.page$/) {
@@ -3725,8 +3766,6 @@
 			if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
 			    $rendered=~s/(\\keephidden\{ENDOFPROBLEM})/$ansrendered$1/;
 			} else {
-
-			    
 			    my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
                             unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') {
                                 $header =~ s/\\begin\{document}//;     #<<<<<
@@ -3751,7 +3790,7 @@
 		    } else {
 			$rendered =~ s/\\end\{document}//;
 		    }
-		    $current_output .= $rendered;		    
+		    $current_output .= $rendered;
 		} elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
 		    if ($i == 1) {
 			$syllabus_first = 1;
@@ -3792,7 +3831,7 @@
 	    &Apache::lonnet::gettitle($map), 'header');
 	if (($assignment ne $current_assignment) && ($assignment ne "")) {
 	    my $header_line = &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
-						  $assignment, $courseidinfo, 
+						  $assignment, $courseidinfo,
 						  $fullname);
 	    my $header_start = ($columns_in_format == 1) ? '\lhead'
 		: '\fancyhead[LO]';
@@ -3844,17 +3883,18 @@
                             $currentassignment, $courseidinfo, $fullname);
     my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]';
     my $newheader = $header_start.'{'.$header_line.'}';
-
     if ($current_output=~/\\documentclass/) {
 	$current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /;
+
     } else {
-	my $blankpages = 
+	my $blankpages =
 	    '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};
 	
 	$current_output = '\strut\vspace*{-6 mm}\\newline'.
 	    &copyright_line().' \newpage '.$blankpages.$end_of_student.
 	    '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.
 	    $newheader.$namepostfix. '} \vskip 5 mm '.$current_output;
+
     }
     #
     #  Close the student bracketing.
@@ -3888,32 +3928,29 @@
         my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
         my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
         my $clientip = &Apache::lonnet::get_requestor_ip($r);
-        my ($blocked,$blocktext) = 
+        my ($blocked,$blocktext) =
             &Apache::loncommon::blocking_status('printout',$clientip,$cnum,$cdom);
         if ($blocked) {
             my $checkrole = "cm./$cdom/$cnum";
             if ($env{'request.course.sec'} ne '') {
                 $checkrole .= "/$env{'request.course.sec'}";
             }
-            unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) && 
+            unless ((&Apache::lonnet::allowed('evb',undef,undef,$checkrole)) &&
                     ($env{'request.role'} !~ m{^st\./$cdom/$cnum})) {
                 &printing_blocked($r,$blocktext);
                 return OK;
             }
         }
     }
-    
+
     &init_perm();
     my $helper = printHelper($r);
     if (!ref($helper)) {
 	return $helper;
     }
-   
-
-    %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
- 
 
 
+    %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
 
     #  If a figure conversion queue file exists for this user.domain
     # we delete it since it can only be bad (if it were good, printout.pl
@@ -3923,7 +3960,6 @@
     if(-e $conversion_queuefile) {
 	unlink $conversion_queuefile;
     }
-    
 
     &output_data($r,$helper,\%parmhash);
     return OK;
@@ -3969,13 +4005,13 @@
     if (defined($navmap)) {
         my $res = $navmap->getResourceByUrl($map);
         if ($res) {
-	    my $func = 
+	    my $func =
 	        sub { return ($_[0]->is_map() && $_[0]->randomorder); };
 	    my @matches = $navmap->retrieveResources($res, $func,1,1,1);
 
         }
     } else {
-        $message = "Retrieval of information about ordering of resources failed."; 
+        $message = "Retrieval of information about ordering of resources failed.";
         return '<message type="warning">'.$message.'</message>';
     }
     return;
@@ -4008,12 +4044,12 @@
     # write it by hand
 
     Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
-    
+
     my $helper = Apache::lonhelper::helper->new("Printing Helper");
     $helper->declareVar('symb');
-    $helper->declareVar('postdata');    
-    $helper->declareVar('curseed'); 
-    $helper->declareVar('probstatus');   
+    $helper->declareVar('postdata');
+    $helper->declareVar('curseed');
+    $helper->declareVar('probstatus');
     $helper->declareVar('filename');
     $helper->declareVar('construction');
     $helper->declareVar('assignment');
@@ -4025,7 +4061,7 @@
     $helper->declareVar("STUDENTS");
     $helper->declareVar("EXTRASPACE");
 
-   
+
 
 
     #  The page breaks and extra spaces
@@ -4033,19 +4069,19 @@
     # But we only do this in the initial state so that they are allowed to change.
     #
 
-    
+
     &Apache::loncommon::restore_course_settings('print',
 						{'pagebreaks'  => 'scalar',
 						 'extraspace'  => 'scalar',
 						 'extraspace_units' => 'scalar',
 					         'lastprinttype' => 'scalar'});
-    
+
     # This will persistently load in the data we want from the
     # very first screen.
-    
+
     if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {
 	if (!defined ($env{"form.CURRENT_STATE"})) {
-	    
+
 	    $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
 	    $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'};
 	    $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'};
@@ -4058,7 +4094,6 @@
 		
 	    }
 	}
-	
     }
 
     # Detect whether we're coming from construction space
@@ -4078,7 +4113,6 @@
         if ($env{'form.url'}) {
             $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
         }
-
     }
 
     if ($env{'form.symb'}) {
@@ -4095,13 +4129,12 @@
     my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);
     if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}
 
-    
     # Extract map
     my $symb = $helper->{VARS}->{'symb'};
     my ($map, $id, $url);
     my $subdir;
     my $is_published=0;		# True when printing from resource space.
-    my $res_printable = 1;	# By default the current resource is printable.    
+    my $res_printable = 1;	# By default the current resource is printable.
     my $res_error;
     my $userCanPrint = ($perm{'pav'} || $perm{'pfo'});
     my $res_printstartdate;
@@ -4113,7 +4146,7 @@
 
     # Get the resource name from construction space
     if ($helper->{VARS}->{'construction'}) {
-        $resourceTitle = substr($helper->{VARS}->{'filename'}, 
+        $resourceTitle = substr($helper->{VARS}->{'filename'},
                                 rindex($helper->{VARS}->{'filename'}, '/')+1);
         $subdir = substr($helper->{VARS}->{'filename'},
                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
@@ -4122,7 +4155,7 @@
 
 	if ($symb ne '') {
 	    ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
-	    $helper->{VARS}->{'postdata'} = 
+	    $helper->{VARS}->{'postdata'} =
 		&Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));
             if (!$userCanPrint) {
 	        my $navmap = Apache::lonnavmaps::navmap->new();
@@ -4189,7 +4222,7 @@
 
     if ($resourceTitle && $res_printable) {
         push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE'];
-    } 
+    }
 
     # Useful filter strings
 
@@ -4214,7 +4247,7 @@
 
     my $start_new_option;
     if ($perm{'pav'}) {
-	$start_new_option = 
+	$start_new_option =
 	    "<option text='".&mt('Start new page[_1]before selected','<br />').
 	    "' variable='FINISHPAGE' />".
 	    "<option text='".&mt('Extra space[_1]before selected','<br />').
@@ -4224,8 +4257,6 @@
 	    "<option text='".&mt('Space units[_1]check for mm','<br />').
 	    "' variable='EXTRASPACE_UNITS' type='checkbox' />"
 	    ;
-	    
-
     }
 
     # If not construction space user can print the components of a page:
@@ -4244,13 +4275,13 @@
 		my $resourcesymb   = $page_resources[0]->symb();
 		my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb);
 		if ($page_ispage) {
-		    push @{$printChoices}, 
-		    [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), 
-		     'map_problems_in_page', 
+		    push @{$printChoices},
+		    [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),
+		     'map_problems_in_page',
 		     'CHOOSE_PROBLEMS_PAGE'];
-		    push @{$printChoices}, 
-		    [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'), 
-		     'map_resources_in_page', 
+		    push @{$printChoices},
+		    [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),
+		     'map_resources_in_page',
 		     'CHOOSE_RESOURCES_PAGE'];
 		}
         my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE',
@@ -4272,7 +4303,7 @@
 						    $isNotMap, '', $symbFilter,
 						    $start_new_option);
 
-						    
+
 
 
 
@@ -4299,7 +4330,7 @@
 	    $nextState     = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ';
 	    $textSuffix    = ' for selected students';
 	    my $helperStates =
-		&create_incomplete_folder_selstud_helper($helper, $map); 
+		&create_incomplete_folder_selstud_helper($helper, $map);
 	    &Apache::lonxml::xmlparse($r, 'helper', $helperStates);
 	} else {
 	    if (&printable($map_open, $map_close)) {
@@ -4320,13 +4351,13 @@
 	}
         # Allow problems from sequence
 	if ($userCanPrint || &printable($map_open, $map_close)) {
-	    push @{$printChoices}, 
-	    [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
-	     'map_problems', 
+	    push @{$printChoices},
+	    [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),
+	     'map_problems',
 	     'CHOOSE_PROBLEMS'];
 	    # Allow all resources from sequence
-	    push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'), 
-				    'map_problems_pages', 
+	    push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),
+				    'map_problems_pages',
 				    'CHOOSE_PROBLEMS_HTML'];
 	    my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',
 							    'Select Problem(s) to print',
@@ -4346,18 +4377,18 @@
 							  $isNotMap, '',
 							  $symbFilter,
 							  $start_new_option);
-	    
+
 	    &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
 	} else {
 	    # TODO: Figure out how to tell them the folder is not printable.
 	}
     }
-	# If the user has pfo (print for others) allow them to print all 
+	# If the user has pfo (print for others) allow them to print all
 	# problems and resources  in the entire course, optionally for selected students
 	my $post_data = $helper->{VARS}->{'postdata'};
-    
+
     if ($perm{'pfo'} &&  !$is_published  &&
-        ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
+        ($post_data=~/\/res\// || $post_data =~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {
 
 	# BZ 5209 - incomplete problems from entire course:
 
@@ -4384,7 +4415,7 @@
       <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>
   </state>
 ALL_PROBLEMS
-         &Apache::lonxml::xmlparse($r, 'helper', 
+         &Apache::lonxml::xmlparse($r, 'helper',
 				   &generate_resource_chooser('ALL_PROBLEMS',
 							      'Select Problem(s) to print',
 							      'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"',
@@ -4427,14 +4458,14 @@
 					'problems_for_anon_page', 'CHOOSE_ANON1_PAGE'];
 	    }
 	    push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]',
-					'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 
+					'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'),
 				    'problems_for_students', 'CHOOSE_STUDENTS'];
 	    push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]',
-					'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 
+					'<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'),
 				    'problems_for_anon', 'CHOOSE_ANON1'];
 	}
 
-	my $randomly_ordered_warning = 
+	my $randomly_ordered_warning =
             &get_randomly_ordered_warning($helper, $map);
 
 	# resource_selector will hold a few states that:
@@ -4449,7 +4480,7 @@
 	my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS',
 							  'Select resources to print',
 							  'multichoice="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',
-							  'RESOURCES', 
+							  'RESOURCES',
 							  'PRINT_FORMATTING',
 							  $map,
 							  $isProblem, '', $symbFilter,
@@ -4476,7 +4507,7 @@
 							    'student_sort',
 							    'STUDENTS',
 							    'CHOOSE_STUDENTS_PAGE'));
-	&Apache::lonxml::xmlparse($r, 'helper', 
+	&Apache::lonxml::xmlparse($r, 'helper',
 				  &generate_student_chooser('CHOOSE_STUDENTS',
 							    'student_sort',
 							    'STUDENTS',
@@ -4512,7 +4543,7 @@
 	    push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]);
 	}
 	if (%codes_to_print) {
-	    $code_selection .='   
+	    $code_selection .='
 	    <message><b>Choose single CODE from list:</b></message>
 		<message></td><td></message>
 		<dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
@@ -4532,7 +4563,7 @@
             next if (($line =~ /^\#/) || ($line eq ''));
 	    my ($name,$description,$code_type,$code_length)=
 		(split(/:/,$line))[0,1,2,4];
-	    if ($code_length > 0 && 
+	    if ($code_length > 0 &&
 		$code_type =~/^(letter|number|-1)/) {
 		$codechoice.='<choice computer="'.$name.'">'.$description.'</choice>';
 	    }
@@ -4540,14 +4571,14 @@
 	if ($codechoice eq '') {
 	    $codechoice='<choice computer="default">Default</choice>';
 	}
-	my $anon1 = &generate_code_selector($helper, 
+	my $anon1 = &generate_code_selector($helper,
 					    'CHOOSE_ANON1',
 					    'SELECT_PROBLEMS',
 					    $codechoice,
 					    $code_selection,
 					    $namechoice) . $resource_selector;
-					    
-					    
+
+
         &Apache::lonxml::xmlparse($r, 'helper',$anon1);
 
 	my $anon_page = &generate_code_selector($helper,
@@ -4574,14 +4605,14 @@
 	    push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]selected people[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_students', 'CHOOSE_STUDENTS1'];
 	    push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3] for [_4]CODEd assignments[_5]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>','<b>','</b>'), 'resources_for_anon', 'CHOOSE_ANON2'];
 	}
-	    
+
 
 	$resource_selector=<<RESOURCE_SELECTOR;
     <state name="SELECT_RESOURCES" title="Select Resources">
     $randomly_ordered_warning
     <nextstate>PRINT_FORMATTING</nextstate>
     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
-    <resource variable="RESOURCES" multichoice="1" addstatus="1" 
+    <resource variable="RESOURCES" multichoice="1" addstatus="1"
               closeallpages="1" modallink="1">
       <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>
@@ -4691,7 +4722,7 @@
       <nextstate>PAGESIZE</nextstate>
       <filechoice>return '$subdir';</filechoice>
 CHOOSE_FROM_SUBDIR
-        
+
         # this is broken up because I really want interpolation above,
         # and I really DON'T want it below
         $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';
@@ -4812,8 +4843,8 @@
                     )
         );
         $paramHash = Apache::lonhelper::getParamHash();
-	$paramHash->{'variable'} = 'ANSWER_TYPE';   
-	$helper->declareVar('ANSWER_TYPE');         
+	$paramHash->{'variable'} = 'ANSWER_TYPE';
+	$helper->declareVar('ANSWER_TYPE');
         $paramHash->{CHOICES} = [
                                    ['Without Answers', 'yes'],
                                    ['With Answers', 'no'],
@@ -4831,7 +4862,7 @@
             &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size')));
             my $xmlfrag = << "FONT_SELECTION";
 
-          
+
             <dropdown variable='fontsize' multichoice='0' allowempty='0'>
             <defaultvalue>
 		  return 'normalsize';
@@ -4868,11 +4899,11 @@
             );
 	}
         $paramHash = Apache::lonhelper::getParamHash();
-	$paramHash->{'variable'} = 'LATEX_TYPE';   
-	$helper->declareVar('LATEX_TYPE');  
-	if ($helper->{VARS}->{'construction'} eq '1') {       
+	$paramHash->{'variable'} = 'LATEX_TYPE';
+	$helper->declareVar('LATEX_TYPE');
+	if ($helper->{VARS}->{'construction'} eq '1') {
 	    $paramHash->{CHOICES} = [
-				     ['standard LaTeX mode', 'standard'], 
+				     ['standard LaTeX mode', 'standard'],
 				     ['LaTeX batchmode', 'batchmode'], ];
 	} else {
 	    $paramHash->{CHOICES} = [
@@ -4880,7 +4911,7 @@
 				     ['standard LaTeX mode', 'standard'] ];
 	}
         Apache::lonhelper::dropdown->new();
- 
+
 	&addMessage(&Apache::lonhtmlcommon::row_closure()
                    .&Apache::lonhtmlcommon::row_title(
                         '<label for="TABLE_CONTENTS_forminput">'
@@ -4889,14 +4920,14 @@
                     )
         );
         $paramHash = Apache::lonhelper::getParamHash();
-	$paramHash->{'variable'} = 'TABLE_CONTENTS';   
-	$helper->declareVar('TABLE_CONTENTS');         
+	$paramHash->{'variable'} = 'TABLE_CONTENTS';
+	$helper->declareVar('TABLE_CONTENTS');
         $paramHash->{CHOICES} = [
                                    ['No', 'no'],
                                    ['Yes', 'yes'] ];
         Apache::lonhelper::dropdown->new();
 	&addMessage(&Apache::lonhtmlcommon::row_closure());
-        
+
 	if (not $helper->{VARS}->{'construction'}) {
 	    &addMessage(&Apache::lonhtmlcommon::row_title(
                             '<label for="TABLE_INDEX_forminput">'
@@ -4905,8 +4936,8 @@
                         )
             );
 	    $paramHash = Apache::lonhelper::getParamHash();
-	    $paramHash->{'variable'} = 'TABLE_INDEX';   
-	    $helper->declareVar('TABLE_INDEX');         
+	    $paramHash->{'variable'} = 'TABLE_INDEX';
+	    $helper->declareVar('TABLE_INDEX');
 	    $paramHash->{CHOICES} = [
 				     ['No', 'no'],
 				     ['Yes', 'yes'] ];
@@ -4919,8 +4950,8 @@
                         )
             );
 	    $paramHash = Apache::lonhelper::getParamHash();
-	    $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';   
-	    $helper->declareVar('PRINT_DISCUSSIONS');         
+	    $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';
+	    $helper->declareVar('PRINT_DISCUSSIONS');
 	    $paramHash->{CHOICES} = [
 				     ['No', 'no'],
 				     ['Yes', 'yes'] ];
@@ -4954,7 +4985,7 @@
             &addMessage(&Apache::lonhtmlcommon::row_closure(1));
 	}
 
-	if ($helper->{'VARS'}->{'construction'}) { 
+	if ($helper->{'VARS'}->{'construction'}) {
 	    my $stylevalue='$Apache::lonnet::env{"construct.style"}';
             my $randseedtext=&mt("Use random seed");
             my $stylefiletext=&mt("Use style file");
@@ -5045,11 +5076,11 @@
     # If we're in the "final" state, bailout and return to handler
     if ($helper->{STATE} eq 'FINAL') {
         return $helper;
-    }    
+    }
 
     my $footer;
     if ($helper->{STATE} eq 'START') {
-        my $prtspool=$r->dir_config('lonPrtDir'); 
+        my $prtspool=$r->dir_config('lonPrtDir');
 	$footer = &recently_generated($prtspool);
     }
     $r->print($helper->display($footer));
@@ -5069,10 +5100,10 @@
 
 See lonhelper.pm documentation for discussion of the helper framework.
 
-Apache::lonprintout::page_format_state is an element that gives the 
-user an opportunity to select the page layout they wish to print 
-with: Number of columns, portrait/landscape, and paper size. If you 
-want to change the paper size choices, change the @paperSize array 
+Apache::lonprintout::page_format_state is an element that gives the
+user an opportunity to select the page layout they wish to print
+with: Number of columns, portrait/landscape, and paper size. If you
+want to change the paper size choices, change the @paperSize array
 contents in this package.
 
 page_format_state is always directly invoked in lonprintout.pm, so there
@@ -5096,17 +5127,17 @@
 
 my $maxColumns = 2;
 # it'd be nice if these all worked
-#my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", 
+#my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]",
 #                 "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",
-#                 "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]", 
+#                 "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]",
 #                 "a5 [148x210 mm]", "a6 [105x148 mm]" );
-my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", 
+my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]",
 		 "a4 [210x297 mm]");
 
 # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |
 #                   Paper type
 
-sub new { 
+sub new {
     my $self = Apache::lonhelper::element->new();
 
     shift;
@@ -5128,7 +5159,7 @@
     my $PaperType=&mt('Paper type');
     my $landscape=&mt('Landscape');
     my $portrait=&mt('Portrait');
-    
+
 
     $result.='<h3>'.&mt('Layout Options').'</h3>'
             .&Apache::loncommon::start_data_table()
@@ -5188,7 +5219,7 @@
 
     my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();
-    $helper->{VARS}->{$var} = 
+    $helper->{VARS}->{$var} =
         $env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .
         $env{"form.$var.paper"} . '|' . $env{"form.$var.pdfFormFields"};
     return 1;
@@ -5204,7 +5235,7 @@
 
 See lonhelper.pm documentation for discussion of the helper framework.
 
-Apache::lonprintout::page_size_state is an element that gives the 
+Apache::lonprintout::page_size_state is an element that gives the
 user the opportunity to further refine the page settings if they
 select a single-column page.
 
@@ -5227,7 +5258,7 @@
 
 
 
-sub new { 
+sub new {
     my $self = Apache::lonhelper::element->new();
 
     shift; # disturbs me (probably prevents subclassing) but works (drops
@@ -5237,7 +5268,7 @@
     my $helper = Apache::lonhelper::getHelper();
     $helper->declareVar($self->{'variable'});
 
-    # The variable name of the format element, so we can look into 
+    # The variable name of the format element, so we can look into
     # $helper->{VARS} to figure out whether the columns are one or two
     $self->{'formatvar'} = shift;
 
@@ -5277,7 +5308,7 @@
      $size{'height_and_units'},
      $size{'margin_and_units'})=
 	 &Apache::lonprintout::page_format($papersize, $laystyle, $cols);
-    
+
     foreach my $dimension ('width','height','margin') {
 	($size{$dimension},$size{$dimension.'_unit'}) =
 	    split(/ +/, $size{$dimension.'_and_units'},2);
@@ -5362,10 +5393,10 @@
 	
 	foreach my $dim ('width', 'height', 'lmargin') {
 	    my ($value, $units) = split(/ /, $size{$dim});
-	    	    
+
 	    $helper->{VARS}->{"$var.".$dim}      = $value;
 	    $helper->{VARS}->{"$var.".$dim.'unit'} = $units;
-	    
+
 	}
 	
 
@@ -5373,7 +5404,7 @@
 
 	$helper->changeState($self->{NEXTSTATE});
     }
-   
+
     return 1;
 }
 
@@ -5382,16 +5413,16 @@
 
     my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();
-    my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"}; 
-    my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"}; 
-    my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"}; 
-    $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"}; 
-    $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"}; 
-    $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"}; 
+    my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"};
+    my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"};
+    my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"};
+    $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"};
+    $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"};
+    $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"};
 
     my $error = '';
 
-    # /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed 
+    # /^-?[0-9]+(\.[0-9]*)?$/ -> optional minus, at least on digit, followed
     # by an optional period, followed by digits, ending the string
 
     if ($width !~  /^-?[0-9]*(\.[0-9]*)?$/) {


More information about the LON-CAPA-cvs mailing list