Diff for /loncom/interface/lonprintout.pm between versions 1.607 and 1.627.2.38

version 1.607, 2011/11/07 16:09:09 version 1.627.2.38, 2024/11/11 16:05:56
Line 1 Line 1
   
 # The LearningOnline Network  # The LearningOnline Network
 # Printout  # Printout
 #  #
Line 41  use Apache::admannotations; Line 40  use Apache::admannotations;
 use Apache::lonenc;  use Apache::lonenc;
 use Apache::entities;  use Apache::entities;
 use Apache::londefdef;  use Apache::londefdef;
   # use Apache::structurelags; # for language management.
   
 use File::Basename;  use File::Basename;
   
 use HTTP::Response;  use HTTP::Response;
 use LONCAPA::map();  use LONCAPA::map();
 use POSIX qw(strftime);  
 use Apache::lonlocal;  use Apache::lonlocal;
 use Carp;  use Carp;
 use LONCAPA;  use LONCAPA;
Line 76  my $font_size = 'normalsize'; # Default Line 75  my $font_size = 'normalsize'; # Default
   
 #----------------------------  Helper helpers. -------------------------  #----------------------------  Helper helpers. -------------------------
   
   ##
   # Filter function to determine if a resource is a printable sequence.
   #
   # @param $res -Resource to check.
   #
   # @return 1 - printable and a resource
   #         0 - either notm a sequence or not printable.
   #
   sub printable_sequence {
       my $res = shift;
   
       # Non-sequences are not listed:
   
       if (!$res->is_sequence()) {
    return 0;
       }
   
       # Person with pav or pfo can always print:
   
       if ($perm{'pav'} || $perm{'pfo'}) {
    return 1;
       }
   
       if ($res->is_sequence()) {
    my $symb = $res->symb();
    my $navmap   = $res->{NAV_MAP};
   
    # Find the first resource in the map:
   
    my $iterator = $navmap->getIterator($res, undef, undef, 1, 1);
    my $first    = $iterator->next();
   
    while (1) {
       if ($first == $iterator->END_ITERATOR) { last; }
       if (ref($first) && ! $first->is_sequence()) {last; }
       $first = $iterator->next();
    }
   
   
    # Might be an empty map:
   
    if (!ref($first)) {
       return 0;
    }
    my $partsref = $first->parts();
    my @parts    = @$partsref;
    my ($open, $close) = $navmap->map_printdates($first, $parts[0]);
    return &printable($open, $close);
       }
       return 0;
   }
   
 # BZ5209:  # BZ5209:
 #    Create the states needed to run the helper for incomplete problems from  #    Create the states needed to run the helper for incomplete problems from
 #    the current folder for selected students.  #    the current folder for selected students.
Line 92  my $font_size = 'normalsize'; # Default Line 143  my $font_size = 'normalsize'; # Default
 # Parameters:  # Parameters:
 #    helper - the helper which already contains info about the current folder we can  #    helper - the helper which already contains info about the current folder we can
 #             purloin.  #             purloin.
 #    url    - Top url of the sequence  #    map    - the map for which incomplete problems are to be printed
 # Return:  # Return:
 #     XML that can be parsed by the helper to drive the state machine.  #     XML that can be parsed by the helper to drive the state machine.
 #  #
 sub create_incomplete_folder_selstud_helper($helper)  sub create_incomplete_folder_selstud_helper {
 {  
     my ($helper, $map)  = @_;      my ($helper, $map)  = @_;
   
   
Line 107  sub create_incomplete_folder_selstud_hel Line 157  sub create_incomplete_folder_selstud_hel
   
     my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ',      my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_PEOPLE_SEQ',
       'Select problem(s) to print',        'Select problem(s) to print',
       'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',        'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'CHOOSE_STUDENTS_INCOMPLETE',        'CHOOSE_STUDENTS_INCOMPLETE',
       $map,        $map,
       $selFilter,        $selFilter,
       '',        '',
       $symbFilter,         $symbFilter,
       '');        '');
   
     my $student_chooser = &generate_student_chooser('CHOOSE_STUDENTS_INCOMPLETE',      my $student_chooser = &generate_student_chooser('CHOOSE_STUDENTS_INCOMPLETE',
Line 126  sub create_incomplete_folder_selstud_hel Line 176  sub create_incomplete_folder_selstud_hel
  'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state.   'CHOOSE_STUDENTS_INCOMPLETE_FORMAT'); # end state.
   
     return $resource_chooser . $student_chooser . $format_chooser;      return $resource_chooser . $student_chooser . $format_chooser;
 }    }
   
   
 # BZ 5209  # BZ 5209
Line 146  sub create_incomplete_folder_selstud_hel Line 196  sub create_incomplete_folder_selstud_hel
 #   helper   - Helper we are creating states for.  #   helper   - Helper we are creating states for.
 # Returns:  # Returns:
 #   Text that can be parsed by the helper.  #   Text that can be parsed by the helper.
 #   #
   
 sub create_incomplete_course_helper {  sub create_incomplete_course_helper {
     my $helper = shift;      my $helper = shift;
   
     my $filter = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())';      my $filter = '$res->is_problem() || $res->contains_problem() || $res->is_sequence() || $res->is_practice())';
     my $symbfilter = '$res->shown_symb()';      my $symbfilter = '$res->shown_symb()';
       
     my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES',      my $resource_chooser = &generate_resource_chooser('INCOMPLETE_PROBLEMS_COURSE_RESOURCES',
       'Select problem(s) to print',        'Select problem(s) to print',
       'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1"',        'multichoice = "1" suppressEmptySequences="0" addstatus="1" closeallpagtes="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'INCOMPLETE_PROBLEMS_COURSE_STUDENTS',        'INCOMPLETE_PROBLEMS_COURSE_STUDENTS',
       '',        '',
Line 179  sub create_incomplete_course_helper { Line 229  sub create_incomplete_course_helper {
   
 }  }
   
 # BZ5209   # BZ5209
 #   Creates the states needed to run the print helper for a student  #   Creates the states needed to run the print helper for a student
 #   that wants to print his incomplete problems from the current folder.  #   that wants to print his incomplete problems from the current folder.
 # Parameters:  # Parameters:
Line 202  sub create_incomplete_folder_helper { Line 252  sub create_incomplete_folder_helper {
   
     my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ',      my $resource_chooser = &generate_resource_chooser('CHOOSE_INCOMPLETE_SEQ',
       'Select problem(s) to print',        'Select problem(s) to print',
       'multichoice="1", toponly ="1", addstatus="1", closeallpages="1"',        'multichoice="1", toponly ="1", addstatus="1", closeallpages="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'PAGESIZE',        'PAGESIZE',
       $map,        $map,
       $filter, '',         $filter, '',
       $symfilter,        $symfilter,
       '');        '');
   
Line 224  sub create_incomplete_folder_helper { Line 274  sub create_incomplete_folder_helper {
   
   
 sub generate_student_chooser {  sub generate_student_chooser {
     my ($this_state,       my ($this_state,
  $sort_choice,    $sort_choice,
  $variable,    $variable,
  $next_state) = @_;   $next_state) = @_;
     my $result = <<CHOOSE_STUDENTS;      my $result = <<CHOOSE_STUDENTS;
   <state name="$this_state" title="Select Students and Resources">    <state name="$this_state" title="Select Students and Resources">
Line 238  sub generate_student_chooser { Line 288  sub generate_student_chooser {
     </choices>      </choices>
   
       <message><br /><hr /><br /> </message>        <message><br /><hr /><br /> </message>
       <student multichoice='1'         <student multichoice='1'
                variable="$variable"                  variable="$variable" 
                nextstate="$next_state"                  nextstate="$next_state" 
                coursepersonnel="1" />                 coursepersonnel="1" />
Line 256  CHOOSE_STUDENTS Line 306  CHOOSE_STUDENTS
 #     this_state    - State name of the chooser.  #     this_state    - State name of the chooser.
 #     prompt_text   - Text to use to prompt user.  #     prompt_text   - Text to use to prompt user.
 #     resource_options - Resource tag options e.g.  #     resource_options - Resource tag options e.g.
 #                        "multichoice='1', toponly='1', addstatus='1'"  #                        "multichoice='1', toponly='1', addstatus='1',
   #                         modallink='1'"
 #                     that control the selection and appearance of the  #                     that control the selection and appearance of the
 #                     resource selector.  #                     resource selector.
 #     variable      - Name of the variable to hold the choice  #     variable      - Name of the variable to hold the choice
Line 267  CHOOSE_STUDENTS Line 318  CHOOSE_STUDENTS
 #     filter        - How to filter the resources.  #     filter        - How to filter the resources.
 #     value_func    - <valuefunc> function.  #     value_func    - <valuefunc> function.
 #     choice_func   - If not empty generates a <choicefunc> with this function.  #     choice_func   - If not empty generates a <choicefunc> with this function.
 #     start_new_option   #     start_new_option
 #                   - Fragment appended after valuefunc.  #                   - Fragment appended after valuefunc.
 #  #
 #  #
Line 302  CHOOSE_RESOURCES Line 353  CHOOSE_RESOURCES
       </resource>        </resource>
     </state>      </state>
 CHOOSE_RESOURCES  CHOOSE_RESOURCES
   
     return $result;      return $result;
 }  }
 #  #
Line 394  CHOOSE_ANON1 Line 444  CHOOSE_ANON1
    return $result;     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.  #  that text must still be parsed by the helper xml parser.
 # Parameters: 3 (required)  # Parameters: 3 (required)
   
 #   helper       - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used  #   helper       - The helper; $helper->{'VARS'}->{'PRINT_TYPE'} used
 #                  to check if splitting PDFs by section can be offered.  #                  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.  #   this_state   - State name of the chooser.
   
 sub generate_format_selector {  sub generate_format_selector {
Line 435  RESOURCE_SELECTOR Line 485  RESOURCE_SELECTOR
   
 #-----------------------------------------------------------------------  #-----------------------------------------------------------------------
   
   # Computes an open and close date from a list of open/close dates for a resource's
   # parts.
   #
   # @param \@opens - reference to an array of open dates.
   # @param \@closes - reference to an array of close dates.
   #
   # @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
   #       will be returned.
   # @note The algorithm used is to take the latest open date and the earliest end date.
   #
   sub compute_open_window {
       my ($opensref, $closesref) = @_;
   
       my @opens   = @$opensref;
       my @closes  = @$closesref;
   
       # latest open date:
       my $latest_open;
   
       foreach my $open (@opens) {
    if (!defined($latest_open) || ($open > $latest_open)) {
       $latest_open = $open;
    }
       }
       # Earliest close:
   
       my $earliest_close;
       foreach my $close (@closes) {
    if (!defined($earliest_close) || ($close < $earliest_close)) {
       $earliest_close = $close;
    }
       }
   
       # If no overlap...both are -1 as promised.
   
       if (($earliest_close ne '') && ($latest_open ne '')
    && ($earliest_close < $latest_open)) {
    $latest_open  = -1;
    $earliest_close = -1;
       }
   
       return ($latest_open, $earliest_close);
   
   }
   
   ##
   #  Determines if 'now' is within the set of printable dates.
   #
   #  @param $open_date - Starting date/timestamp.
   #  @param $close_date - Ending date/timestamp.
   #
   #  @return 0 - Not open.
   #  @return 1 - open.
   #
   sub printable {
       my ($open_date, $close_date) = @_;
   
   
       my $now = time();
   
       # Have to do a bit of fancy footwork around undefined open/close dates:
   
       if ($open_date && ($open_date > $now)) {
    return 0;
       }
   
       if ($close_date && ($close_date < $now)) {
    return 0;
       }
   
       return 1;
   
   }
   
   ##
   # 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
   #       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();
       my @parts;
       if (ref($partsref) eq 'ARRAY') {
           @parts   = @{$partsref};
       }
       my $open_date;
       my $close_date;
       my @open_dates;
       my @close_dates;
   
   
       if (@parts) {
    foreach my $part (@parts) {
       my $partopen  = $res->parmval('printstartdate', $part);
       my $partclose = $res->parmval('printenddate',  $part);
               if (!$partopen) {
                   $partopen = $res->parmval('opendate',$part);
               }
               if (!$partopen) {
                   $partopen = $res->parmval('contentopen',$part);
               }
               if ($partopen) {
                   push(@open_dates, $partopen);
               }
               if ($partclose) {
                   push(@close_dates, $partclose);
               }
       push(@open_dates, $partopen);
       push(@close_dates, $partclose);
    }
       }
   
       ($open_date, $close_date)  = &compute_open_window(\@open_dates, \@close_dates);
   
       return ($open_date, $close_date);
   }
   
   ##
   # Get the dates for which a course says a resource can be printed.  This is like
   # get_print_dates but namvaps::course_print_dates are gotten...and not converted
   # to times either.
   #
   # @param $res - Reference to a resource hash from lonnavmaps::resource.
   #
   # @return (opendate, closedate)
   #
   sub course_print_dates {
       my $res = shift;
       my $partsref = $res->parts();
       my @parts    = @$partsref;
       my $open_date;
       my $close_date;
       my @open_dates;
       my @close_dates;
       my $navmap = $res->{NAV_MAP}; # Slightly OO dirty.
   
       # Don't bother looping over undefined or empty parts array;
   
       if (@parts) {
    foreach my $part (@parts) {
       my ($partopen, $partclose) = $navmap->course_printdates($res, $part);
       push(@open_dates, $partopen);
       push(@close_dates, $partclose);
    }
    ($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates);
       }
       return ($open_date, $close_date);
   }
   ##
   # Same as above but for the enclosing map:
   #
   sub map_print_dates {
       my $res = shift;
       my $partsref = $res->parts();
       my @parts    = @$partsref;
       my $open_date;
       my $close_date;
       my @open_dates;
       my @close_dates;
       my $navmap = $res->{NAV_MAP}; # slightly OO dirty.
   
   
       # Don't bother looping over undefined or empty parts array;
   
       if (@parts) {
    foreach my $part (@parts) {
       my ($partopen, $partclose) = $navmap->map_printdates($res, $part);
       push(@open_dates, $partopen);
       push(@close_dates, $partclose);
    }
    ($open_date, $close_date) = &compute_open_window(\@open_dates, \@close_dates);
       }
       return ($open_date, $close_date);
   }
   
 # Determine if a resource is incomplete given the map:  # Determine if a resource is incomplete given the map:
 # Parameters:  # Parameters:
 #   $username - Name of user for whom we are checking.  #   $username - Name of user for whom we are checking.
Line 449  sub incomplete { Line 690  sub incomplete {
   
   
     my $navmap = Apache::lonnavmaps::navmap->new($username, $domain);      my $navmap = Apache::lonnavmaps::navmap->new($username, $domain);
       
   
     if (defined($navmap)) {      if (defined($navmap)) {
  my $res = $navmap->getResourceByUrl($map);   my $res = $navmap->getResourceByUrl($map);
Line 460  sub incomplete { Line 701  sub incomplete {
     }      }
 }  }
 #  #
 #  When printing for students, the resoures and order of the  #  When printing for students, the resources and order of the
 #  resources may need to be altered if there are folders with  #  resources may need to be altered if there are folders with
 #  random selectiopn or random ordering (or both) enabled.  #  random selectiopn or random ordering (or both) enabled.
 #  This sub computes the set of resources to print for a student  #  This sub computes the set of resources to print for a student
 #  modified both by random ordering and selection and filtered  #  modified both by random ordering and selection and filtered
 #  to only those that are in the original set selcted to be printed.  #  to only those that are in the original set selected to be printed.
 #  #
 # Parameters:  # Parameters:
 #   $helper - The helper we need $helper->{'VARS'}->{'symb'}  #   $map - The URL of the folder being printed.
 #            to construct the navmap and the iteration.  #          Used to determine which startResource and finishResource
 #   $seq   - The original set of resources to print   #          to use when using the navmap's getIterator method.
   #   $seq   - The original set of resources to print.
 #            (really an array of resource names (array of symb's).  #            (really an array of resource names (array of symb's).
 #   $who   - Student/domain for whome the sequence will be generated.  #   $who   - Student/domain for whome the sequence will be generated.
   #   $code  - CODE being printed when printing Problems/Resources
   #            from folder for CODEd assignments
   #   $nohidemap - If true, parameter in map for hiddenresource will be
   #                ignored.  The user calling the routine should have
   #                both the pav and vgr privileges if this is set to true).
 #  #
 # Implicit inputs:  # Implicit inputs:
 #   $  #   $
 # Returns:  # Returns:
 #   reference to an array of resources that can be passed to  #   reference to an array of resources that can be passed to
 #   print_resources.  #   print_resources.
 #   #
 sub master_seq_to_person_seq {  sub master_seq_to_person_seq {
     my ($helper, $seq, $who) = @_;      my ($map, $seq, $who, $code, $nohidemap) = @_;
   
   
     my ($username, $userdomain, $usersection) = split(/:/, $who);      my ($username, $userdomain, $usersection) = split(/:/, $who);
   
   
     # Toss the sequence up into a hash so that we have O(1) lookup time.      # Toss the sequence up into a hash so that we have O(1) lookup time.
     # on the items that come out of the user's list of resources.      # on the items that come out of the user's list of resources.
     #      #
       
     my %seq_hash = map {$_  => 1} @$seq;      my %seq_hash = map {$_  => 1} @$seq;
     my @output_seq;      my @output_seq;
       
     my ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'});  
     my $navmap           = Apache::lonnavmaps::navmap->new($username, $userdomain);  
     my $iterator         = $navmap->getIterator($navmap->firstResource(),  
  $navmap->finishResource(),  
  {}, 1);  
     my %nonResourceItems = (  
  $iterator->BEGIN_MAP    => 1,  
  $iterator->BEGIN_BRANCH => 1,  
  $iterator->END_BRANCH   => 1,  
  $iterator->END_MAP      => 1,  
  $iterator->FORWARD      => 1,  
  $iterator->BACKWARD     => 1  
   
     ); # These items are not resources but appear in the midst of iteration.      my $unhidden;
       if ($nohidemap) {
           $unhidden = &Apache::lonnet::clutter($map);
       }
   
       my $navmap           = Apache::lonnavmaps::navmap->new($username, $userdomain,
                                                              $code, $unhidden);
       my ($start,$finish);
   
       if ($map) {
           my $mapres = $navmap->getResourceByUrl($map);
           if ($mapres->is_map()) {
               $start = $mapres->map_start();
               $finish = $mapres->map_finish();
           }
       }
       unless ($start && $finish) {
           $start = $navmap->firstResource();
           $finish = $navmap->finishResource();
       }
   
       my $iterator         = $navmap->getIterator($start,$finish,{},1);
   
     #  Iterate on the resource..select the items that are randomly selected      #  Iterate on the resource..select the items that are randomly selected
     #  and that are in the seq_has.  Presumably the iterator will take care      #  and that are in the seq_hash.  Presumably the iterator will take care
     # of the random ordering part of the deal.      #  of the random ordering part of the deal.
     #      #
     my $curres;      my $curres;
     while ($curres = $iterator->next()) {      while ($curres = $iterator->next()) {
Line 519  sub master_seq_to_person_seq { Line 773  sub master_seq_to_person_seq {
  #  Only process resources..that are not removed by randomout...   #  Only process resources..that are not removed by randomout...
  #  and are selected for printint as well.   #  and are selected for printint as well.
  #   #
  if (! exists $nonResourceItems{$curres} && ! $curres->randomout()) {          if (ref($curres) && ! $curres->randomout()) {
     my $symb = $curres->symb();              my $currsymb = $curres->symb();
     if (exists $seq_hash{$symb}) {              if (exists($seq_hash{$currsymb})) {
  push(@output_seq, $symb);                  push(@output_seq, $currsymb);
     }      }
  }   }
     }      }
      
   
     return \@output_seq; # for now.      return \@output_seq; # for now.
       
 }  }
   
   
Line 552  sub fetch_raw_resource { Line 805  sub fetch_raw_resource {
     }      }
     return $contents;      return $contents;
   
       
 }  }
   
 #  Fetch the annotations associated with a URL and   #  Fetch the annotations associated with a URL and
 #  put a centered 'annotations:' title.  #  put a centered 'annotations:' title.
 #  This is all suppressed if the annotations are empty.  #  This is all suppressed if the annotations are empty.
 #  #
Line 588  sub set_font_size { Line 841  sub set_font_size {
     my ($text) = @_;      my ($text) = @_;
   
     # There appear to be cases where the font directive is empty.. in which      # 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_      # as this has been the cause of much mystery and hair pulling _sigh_
   
     if ($font_size ne '') {      if ($font_size ne '') {
   
  $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/;   $text =~ s/\\begin\{document}/\\begin{document}{\\$font_size/;
    $text =~ s/\\end\{document}/}\\end{document}/;
     }      }
     $text =~ s/\\end{document}/}\\end{document}/;  
     return $text;      return $text;
   
   
 }  }
   
 # include_pdf - PDF files are included into the   # include_pdf - PDF files are included into the
 # output as follows:  # output as follows:
 #  - The PDF, if necessary, is replicated.  #  - The PDF, if necessary, is replicated.
 #  - The PDF is added to the list of files to convert to postscript (along with the images).  #  - 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  #  - 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:  # Parameters:
 #   pdf_uri   - URI of the PDF file to include.  #   pdf_uri   - URI of the PDF file to include.
 #     #
 # Returns:  # Returns:
 #  The LaTeX to include.  #  The LaTeX to include.
 #  #
Line 630  sub include_pdf { Line 883  sub include_pdf {
  $file = &Apache::lonnet::filelocation('',$pdf_uri);   $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      # (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:
   
     $file =~ s|(.*)/res/|/home/httpd/html/res/|;      my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'};
       $file =~ s{(.*)/res/}{$londocroot/res/};
   
     open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat");      open(FILE,">>","$Apache::lonnet::perlvar{'lonPrtDir'}/$env{'user.name'}_$env{'user.domain'}_printout.dat");
     print FILE ("$file\n");      print FILE ("$file\n");
     close (FILE);      close (FILE);
   
Line 659  sub include_pdf { Line 913  sub include_pdf {
   
   
 }  }
   ##
   #  Collect the various \select_language{language_name}
   #  latex tags to build a \usepackage[lang-list]{babel} which will
   #  appear just prior to the \begin{document} at the front of the concatenated
   #  set of resources:
   # @param doc - The string of latex to search/replace.
   # @return string
   # @retval - the modified document stringt.
   #
   sub collect_languages {
       my $doc = shift;
       my %languages;
       while ($doc =~ /\\selectlanguage\{(\w+)}/mg) {
    $languages{$1} = 1; # allows us to request each language exactly once.
       }
       my @lang_list = (keys(%languages)); # List of unique languages
       if (scalar @lang_list) {
    my $babel_header = '\usepackage[' . join(',', @lang_list) .']{babel}'. "\n";
    $doc =~ s/\\begin\{document}/$babel_header\\begin{document}/;
       }
       return $doc;
   }
   #-------------------------------------------------------------------
   
 #  #
 #   ssi_with_retries- Does the server side include of a resource.  #   ssi_with_retries- Does the server side include of a resource.
Line 667  sub include_pdf { Line 943  sub include_pdf {
 #                      the number of times requested by the caller.  #                      the number of times requested by the caller.
 #                      If we still have a proble, no text is appended to the  #                      If we still have a proble, no text is appended to the
 #                      output and we set some global variables.  #                      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  #                      All of this is supposed to deal with the issues described
 #                      in LonCAPA BZ 5631 see:  #                      in LonCAPA BZ 5631 see:
 #                      http://bugs.lon-capa.org/show_bug.cgi?id=5631  #                      http://bugs.lon-capa.org/show_bug.cgi?id=5631
Line 677  sub include_pdf { Line 953  sub include_pdf {
 #   resource   - The resource to include.  This is passed directly, without  #   resource   - The resource to include.  This is passed directly, without
 #                interpretation to lonnet::ssi.  #                interpretation to lonnet::ssi.
 #   form       - The form hash parameters that guide the interpretation of the resource  #   form       - The form hash parameters that guide the interpretation of the resource
 #                  #
 #   retries    - Number of retries allowed before giving up completely.  #   retries    - Number of retries allowed before giving up completely.
 # Returns:  # Returns:
 #   On success, returns the rendered resource identified by the resource parameter.  #   On success, returns the rendered resource identified by the resource parameter.
Line 728  sub get_student_view_with_retries { Line 1004  sub get_student_view_with_retries {
   
 #  #
 #   printf_style_subst  item format_string repl  #   printf_style_subst  item format_string repl
 #    #
 # Does printf style substitution for a format string that  # Does printf style substitution for a format string that
 # can have %[n]item in it.. wherever, %[n]item occurs,  # can have %[n]item in it.. wherever, %[n]item occurs,
 # rep is substituted in format_string.  Note that  # rep is substituted in format_string.  Note that
 # [n] is an optional integer length.  If provided,  # [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.  # substitution.
 #  #
 sub printf_style_subst {  sub printf_style_subst {
Line 745  sub printf_style_subst { Line 1021  sub printf_style_subst {
  my $subst = $repl;   my $subst = $repl;
  if ($size ne "") {   if ($size ne "") {
     $subst = substr($subst, 0, $size);      $subst = substr($subst, 0, $size);
       
     #  Here's a nice edge case.. supose the end of the      #  Here's a nice edge case ... suppose the end of the
     #  substring is a \.  In that case may have  just      #  substring is a \.  In that case may have just
     #  chopped off a TeX escape... in that case, we append      #  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).      #  spill over a bit (sigh).
     #  We don't just chop off the last character in order to deal      #  We don't just chop off the last character in order to deal
     #  with one last pathology, and that would be if substr had      #  with one last pathology, and that would be if substr had
     #  trimmed us to e.g. \\\        #  trimmed us to e.g. \\\
   
   
     if ($subst =~ /\\$/) {      if ($subst =~ /\\$/) {
Line 773  sub printf_style_subst { Line 1049  sub printf_style_subst {
 }  }
   
   
 # Format a header according to a format.    # Format a header according to a format.
 #   #
   
 # Substitutions:  # Substitutions:
 #     %a    - Assignment name.  #     %a    - Assignment name.
Line 783  sub printf_style_subst { Line 1059  sub printf_style_subst {
 #     %s    - The section if it is supplied.  #     %s    - The section if it is supplied.
 #  #
 sub format_page_header {  sub format_page_header {
     my ($width, $format, $assignment, $course, $student, $section) = @_;      my ($width, $format, $assignment, $course, $student) = @_;
   
   
   
     $width = &recalcto_mm($width); # Get width in mm.      $width = &recalcto_mm($width); # Get width in mm.
     my $chars_per_line = int($width/1.6);   # Character/textline.      my $chars_per_line = int($width/2);   # Character/textline.
   
     #  Default format?      #  Default format?
   
Line 798  sub format_page_header { Line 1074  sub format_page_header {
  # we assume that each character is about 2mm in width.   # we assume that each character is about 2mm in width.
  # (correct for the header text size??).  We ignore   # (correct for the header text size??).  We ignore
  # any formatting (e.g. boldfacing in this).   # any formatting (e.g. boldfacing in this).
  #    #
  # - Allow the student/course to be one line.   # - Allow the student/course to be one line.
  #   but only truncate the course.   #   but only truncate the course.
  # - Allow the assignment to be 2 lines (wrapped).   # - Allow the assignment to be 2 lines (wrapped).
  #   #
   
           my $firstline = "$student $course";
           if (length($firstline) > $chars_per_line) {
  my $name_length    = int($chars_per_line *3 /4);              my $lastchar = $chars_per_line - length($student) - 1;
  my $sec_length     = int($chars_per_line / 5);              if ($lastchar > 0) {
                   $course = substr($course, 0, $lastchar);
               } else {            # Nothing left of course:
                   $course = '';
               }
           }
           if (length($assignment) > $chars_per_line) {
               $assignment = substr($assignment, 0, $chars_per_line);
           }
   
  $format  = "%$name_length".'n';          $format =  "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}";
   
  if ($section) {      } else {
     $format .=  ' - Sec: '."%$sec_length".'s';          # An open question is how to handle long user formatted page headers...
  }          # A possible future is to support e.g. %na so that the user can control
           # the truncation of the elements that can appear in the header.
  $format .= '\\\\%c \\\\ %a';          #
                   $format =  &printf_style_subst("a", $format, $assignment);
           $format =  &printf_style_subst("c", $format, $course);
           $format =  &printf_style_subst("n", $format, $student);
   
           # If the user put %'s in the format string, they must be escaped
           # to \% else LaTeX will think they are comments and terminate
           # the line.. which is bad!!!
   
     }      }
     # An open question is how to handle long user formatted page headers...  
     # A possible future is to support e.g. %na so that the user can control  
     # the truncation of the elements that can appear in the header.  
     #  
     $format =  &printf_style_subst("a", $format, $assignment);  
     $format =  &printf_style_subst("c", $format, $course);  
     $format =  &printf_style_subst("n", $format, $student);  
     $format =  &printf_style_subst("s", $format, $section);  
       
       
     # If the user put %'s in the format string, they  must be escaped  
     # to \% else LaTeX will think they are comments and terminate  
     # the line.. which is bad!!!  
       
     # If the user has role author, $course and $assignment are empty so      # 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      # there is '\\ \\ ' in the page header. That's cause a error in LaTeX
     if($format =~ /\\\\\s\\\\\s/) {      if($format =~ /\\\\\s\\\\\s/) {
         #TODO find sensible caption for page header          #TODO find sensible caption for page header
         my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout ');          my $testPrintout = '\\\\'.&mt('Authoring Space').' \\\\'.&mt('Test-Printout ');
         $format =~ s/\\\\\s\\\\\s/$testPrintout/;          $format =~ s/\\\\\s\\\\\s/$testPrintout/;
     }      }
   
       return $format;
   
     #      #
     #  We're going to trust LaTeX to break lines appropriately, but      #  We're going to trust LaTeX to break lines appropriately, but
     #  we'll truncate anything that's more than 3 lines worth of      #  we'll truncate anything that's more than 3 lines worth of
Line 855  sub format_page_header { Line 1135  sub format_page_header {
   
   
     return $format;      return $format;
       
 }  }
   
 #  #
Line 903  sub is_valid_numeric_code { Line 1183  sub is_valid_numeric_code {
     #   Remove leading/trailing whitespace;      #   Remove leading/trailing whitespace;
     $value =~ s/^\s*//g;      $value =~ s/^\s*//g;
     $value =~ s/\s*$//g;      $value =~ s/\s*$//g;
       
     #  All digits?      #  All digits?
     if ($value !~ /^[0-9]+$/) {      if ($value !~ /^[0-9]+$/) {
  return "Numeric code $value has invalid characters - must only be digits";   return "Numeric code $value has invalid characters - must only be digits";
Line 924  sub is_valid_numeric_code { Line 1204  sub is_valid_numeric_code {
 #  #
 sub is_valid_alpha_code {  sub is_valid_alpha_code {
     my ($value, $num_letters) = @_;      my ($value, $num_letters) = @_;
       
      # strip leading and trailing spaces.       # strip leading and trailing spaces.
   
     $value =~ s/^\s*//g;      $value =~ s/^\s*//g;
Line 942  sub is_valid_alpha_code { Line 1222  sub is_valid_alpha_code {
   
 #   Determine if a code entered by the user in a helper is valid.  #   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.  #   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  #   Alphabetic.  If alphabetic, the code, in fact is a simple
 #   substitution cipher for the actual numeric code: 0->A, 1->B ...  #   substitution cipher for the actual numeric code: 0->A, 1->B ...
 #   We'll be nice and be case insensitive for alpha codes.  #   We'll be nice and be case insensitive for alpha codes.
Line 957  sub is_valid_alpha_code { Line 1237  sub is_valid_alpha_code {
 sub is_code_valid {  sub is_code_valid {
     my ($code_value, $code_option) = @_;      my ($code_value, $code_option) = @_;
     my ($code_type, $code_length) = ('letter', 6); # defaults.      my ($code_type, $code_length) = ('letter', 6); # defaults.
     my @lines = &Apache::grades::get_scantronformat_file();      my @lines = &Apache::lonnet::get_scantronformat_file();
     foreach my $line (@lines) {      foreach my $line (@lines) {
           next if (($line =~ /^\#/) || ($line eq ''));
  my ($name, $type, $length) = (split(/:/, $line))[0,2,4];   my ($name, $type, $length) = (split(/:/, $line))[0,2,4];
  if($name eq $code_option) {   if($name eq $code_option) {
     $code_length = $length;      $code_length = $length;
Line 975  sub is_code_valid { Line 1256  sub is_code_valid {
     }      }
   
 }  }
   #
   # Compare two students by section (Used to sort by section).
   #
   #  Implicit inputs,
   #    $a - The first one
   #    $b - The second one.
   #
   #  Returns:
   #     a-section cmp b-section
   #
   sub compare_sections {
       my ($u1, $d1, $s1, $n1, $stat1) = split(/:/, $a);
       my ($u2, $d2, $s2, $n2, $stat2) = split(/:/, $b);
   
       return $s1 cmp $s2;
   }
   
 #   Compare two students by name.  The students are in the form  #   Compare two students by name.  The students are in the form
 #   returned by the helper:  #   returned by the helper:
Line 1014  sub compare_names { Line 1311  sub compare_names {
     }      }
   
     # Break the tie on the first name, but there are leading (possibly trailing      # 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+//; # Remove leading...
     $f1 =~ s/\s+$//; # Trailing spaces from first 1...      $f1 =~ s/\s+$//; # Trailing spaces from first 1...
       
     $f2 =~ s/^\s+//;      $f2 =~ s/^\s+//;
     $f2 =~ s/\s+$//; # And the same for first 2...      $f2 =~ s/\s+$//; # And the same for first 2...
   
Line 1028  sub compare_names { Line 1325  sub compare_names {
     if($f1 gt $f2) {      if($f1 gt $f2) {
  return 1;   return 1;
     }      }
       
     #  Must be the same name.      #  Must be the same name.
   
     return 0;      return 0;
Line 1036  sub compare_names { Line 1333  sub compare_names {
   
 sub latex_header_footer_remove {  sub latex_header_footer_remove {
     my $text = shift;      my $text = shift;
     $text =~ s/\\end{document}//;      $text =~ s/\\end\{document}//;
     $text =~ s/\\documentclass([^&]*)\\begin{document}//;      $text =~ s/\\documentclass([^&]*)\\begin\{document}//;
     return $text;      return $text;
 }  }
 #  #
 #  If necessary, encapsulate text inside   #  If necessary, encapsulate text inside
 #  a minipage env.  #  a minipage env.
 #  necessity is determined by the problem_split param.  #  necessity is determined by the problem_split param.
 #  #
 sub encapsulate_minipage {  sub encapsulate_minipage {
     my ($text) = @_;      my ($text,$problem_split) = @_;
     if (!($env{'form.problem.split'} =~ /yes/i)) {      if (!($problem_split =~ /yes/i)) {
  $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}';   $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}';
     }      }
     return $text;      return $text;
Line 1065  sub adjust_number_to_print { Line 1362  sub adjust_number_to_print {
     my $helper = shift;      my $helper = shift;
   
     my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'};      my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'};
       
     if ($split_pdf eq 'all') {      if ($split_pdf eq 'all') {
  $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all';   $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all';
     } elsif ($split_pdf eq 'oneper') {      } elsif ($split_pdf eq 'oneper') {
Line 1097  sub old_character_chart { Line 1394  sub old_character_chart {
     $result =~ s/&(\#0?34|quot);/\"/g;      $result =~ s/&(\#0?34|quot);/\"/g;
     $result =~ s/&\#0?35;/\\\#/g;      $result =~ s/&\#0?35;/\\\#/g;
     $result =~ s/&\#0?36;/\\\$/g;      $result =~ s/&\#0?36;/\\\$/g;
     $result =~ s/&\#0?37;/\\%/g;       $result =~ s/&\#0?37;/\\%/g;
     $result =~ s/&(\#0?38|amp);/\\&/g;       $result =~ s/&(\#0?38|amp);/\\&/g;
     $result =~ s/&\#(0?39|146);/\'/g;      $result =~ s/&\#(0?39|146);/\'/g;
     $result =~ s/&\#0?40;/(/g;      $result =~ s/&\#0?40;/(/g;
     $result =~ s/&\#0?41;/)/g;      $result =~ s/&\#0?41;/)/g;
Line 1205  sub old_character_chart { Line 1502  sub old_character_chart {
     $result =~ s/&(\#160|nbsp);/~/g;      $result =~ s/&(\#160|nbsp);/~/g;
     $result =~ s/&(\#161|iexcl);/!\`/g;      $result =~ s/&(\#161|iexcl);/!\`/g;
     $result =~ s/&(\#162|cent);/\\textcent /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/&(\#164|curren);/\\textcurrency /g;
     $result =~ s/&(\#165|yen);/\\textyen /g;      $result =~ s/&(\#165|yen);/\\textyen /g;
     $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g;      $result =~ s/&(\#166|brvbar);/\\textbrokenbar /g;
Line 1231  sub old_character_chart { Line 1528  sub old_character_chart {
     $result =~ s/&(\#188|frac14);/\\textonequarter /g;      $result =~ s/&(\#188|frac14);/\\textonequarter /g;
     $result =~ s/&(\#189|frac12);/\\textonehalf /g;      $result =~ s/&(\#189|frac12);/\\textonehalf /g;
     $result =~ s/&(\#190|frac34);/\\textthreequarters /g;      $result =~ s/&(\#190|frac34);/\\textthreequarters /g;
     $result =~ s/&(\#191|iquest);/?\`/g;         $result =~ s/&(\#191|iquest);/?\`/g;
     $result =~ s/&(\#192|Agrave);/\\\`{A}/g;        $result =~ s/&(\#192|Agrave);/\\\`{A}/g;
     $result =~ s/&(\#193|Aacute);/\\\'{A}/g;       $result =~ s/&(\#193|Aacute);/\\\'{A}/g;
     $result =~ s/&(\#194|Acirc);/\\^{A}/g;      $result =~ s/&(\#194|Acirc);/\\^{A}/g;
     $result =~ s/&(\#195|Atilde);/\\~{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/&(\#197|Aring);/{\\AA}/g;
     $result =~ s/&(\#198|AElig);/{\\AE}/g;      $result =~ s/&(\#198|AElig);/{\\AE}/g;
     $result =~ s/&(\#199|Ccedil);/\\c{c}/g;      $result =~ s/&(\#199|Ccedil);/\\c{c}/g;
     $result =~ s/&(\#200|Egrave);/\\\`{E}/g;        $result =~ s/&(\#200|Egrave);/\\\`{E}/g;
     $result =~ s/&(\#201|Eacute);/\\\'{E}/g;          $result =~ s/&(\#201|Eacute);/\\\'{E}/g;
     $result =~ s/&(\#202|Ecirc);/\\^{E}/g;      $result =~ s/&(\#202|Ecirc);/\\^{E}/g;
     $result =~ s/&(\#203|Euml);/\\\"{E}/g;      $result =~ s/&(\#203|Euml);/\\\"{E}/g;
     $result =~ s/&(\#204|Igrave);/\\\`{I}/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/&(\#206|Icirc);/\\^{I}/g;
     $result =~ s/&(\#207|Iuml);/\\\"{I}/g;          $result =~ s/&(\#207|Iuml);/\\\"{I}/g;
     $result =~ s/&(\#209|Ntilde);/\\~{N}/g;      $result =~ s/&(\#209|Ntilde);/\\~{N}/g;
     $result =~ s/&(\#210|Ograve);/\\\`{O}/g;      $result =~ s/&(\#210|Ograve);/\\\`{O}/g;
     $result =~ s/&(\#211|Oacute);/\\\'{O}/g;      $result =~ s/&(\#211|Oacute);/\\\'{O}/g;
     $result =~ s/&(\#212|Ocirc);/\\^{O}/g;      $result =~ s/&(\#212|Ocirc);/\\^{O}/g;
     $result =~ s/&(\#213|Otilde);/\\~{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/&(\#215|times);/\\ensuremath\{\\times\}/g;
     $result =~ s/&(\#216|Oslash);/{\\O}/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/&(\#218|Uacute);/\\\'{U}/g;
     $result =~ s/&(\#219|Ucirc);/\\^{U}/g;      $result =~ s/&(\#219|Ucirc);/\\^{U}/g;
     $result =~ s/&(\#220|Uuml);/\\\"{U}/g;      $result =~ s/&(\#220|Uuml);/\\\"{U}/g;
Line 1287  sub old_character_chart { Line 1584  sub old_character_chart {
     $result =~ s/&(\#246|ouml);/\\\"{o}/g;      $result =~ s/&(\#246|ouml);/\\\"{o}/g;
     $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g;      $result =~ s/&(\#247|divide);/\\ensuremath\{\\div\}/g;
     $result =~ s/&(\#248|oslash);/{\\o}/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/&(\#250|uacute);/\\\'{u}/g;
     $result =~ s/&(\#251|ucirc);/\\^{u}/g;      $result =~ s/&(\#251|ucirc);/\\^{u}/g;
     $result =~ s/&(\#252|uuml);/\\\"{u}/g;      $result =~ s/&(\#252|uuml);/\\\"{u}/g;
Line 1434  sub old_character_chart { Line 1731  sub old_character_chart {
 my %page_formats=  my %page_formats=
     ('letter' => {      ('letter' => {
  'book' => {   'book' => {
      '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.275 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.275 in']       '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','-0.5 in']
  },   },
  'album' => {   'album' => {
      '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.55 in','0.394 in'],       '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.55 in','-0.5 in'],
      '2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.5 in']       '2' => [ '4.8 in', '6.7 in','-0.5 in', '-1.0 in','3.0 in']
  },   },
      },       },
      'legal' => {       'legal' => {
Line 1449  my %page_formats= Line 1746  my %page_formats=
  },   },
  'album' => {   'album' => {
      '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'],       '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' => {       'tabloid' => {
Line 1498  my %page_formats= Line 1795  my %page_formats=
      '2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm']       '2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm']
  },   },
  'album' => {   'album' => {
      '1' => ['21.59 cm','19.558 cm','-1.397cm','-2.11 cm','0 cm'],       '1' => ['24.0 cm','18.0 cm','-1.0 cm','-1.0 cm','-1.25 cm'],
      '2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm']       '2' => ['11.5 cm','18.0 cm','-0.7 cm','-1.7 cm','-1.25 cm']
  },   },
      },       },
      'a5' => {       'a5' => {
Line 1531  sub page_format { Line 1828  sub page_format {
 #                        "A2 [420x594 mm]",           "A3 [297x420 mm]",  #                        "A2 [420x594 mm]",           "A3 [297x420 mm]",
 #                        "A4 [210x297 mm]",           "A5 [148x210 mm]",  #                        "A4 [210x297 mm]",           "A5 [148x210 mm]",
 #                        "A6 [105x148 mm]"  #                        "A6 [105x148 mm]"
 #   #
     my ($papersize,$layout,$numberofcolumns) = @_;       my ($papersize,$layout,$numberofcolumns) = @_;
     return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}};      return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}};
 }  }
   
Line 1551  sub get_course { Line 1848  sub get_course {
     my $courseidinfo;      my $courseidinfo;
     if (defined($env{'request.course.id'})) {      if (defined($env{'request.course.id'})) {
  $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');   $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
  my $sec = $env{'request.course.sec'};  
       
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
   
 sub page_format_transformation {  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);      my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);
   
     if ($selectionmade eq '4') {      if ($selectionmade eq '4') {
Line 1572  sub page_format_transformation { Line 1869  sub page_format_transformation {
     }      }
     ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);      ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);
   
       my $name;
     my $name = &get_name();      if ($mostrecent ne '') {
           $name = $mostrecent;
       } else {
           $name = &get_name();
       }
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     my $header_text  = $parmhash{'print_header_format'};      my $header_text  = $parmhash{'print_header_format'};
     $header_text     = &format_page_header($textwidth, $header_text, $assignment,      $header_text     = &format_page_header($textwidth, $header_text, $assignment,
    $courseidinfo, $name);     $courseidinfo, $name);
Line 1583  sub page_format_transformation { Line 1885  sub page_format_transformation {
     my $fancypagestatement='';      my $fancypagestatement='';
     if ($numberofcolumns eq '2') {      if ($numberofcolumns eq '2') {
  $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}";   $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{$header_text}";
    if ($parmhash{'print_header_format'} eq '') {
       $fancypagestatement .= "\\fancyhead[RE]{\\thepage \\\\[\\baselineskip]}";
    }
     } else {      } else {
  $fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}";   $fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}";
     }      }
       $fancypagestatement .= "\\fancyfoot{}";
       my ($paperwidth,$paperheight);
     if ($layout eq 'album') {      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 /;      $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') {      } 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/;      $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 {   } 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 /;      $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 ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}
     if ($indexlist eq 'yes') {      if ($indexlist eq 'yes') {
  $text=~s/(\\begin{document})/\\makeindex $1/;   $text=~s/(\\begin\{document})/\\makeindex $1/;
  $text=~s/(\\end{document})/\\strut\\\\\\strut\\printindex $1/;   $text=~s/(\\end\{document})/\\strut\\\\\\strut\\printindex $1/;
     }      }
     return $text;      return $text;
 }  }
Line 1615  sub page_format_transformation { Line 1944  sub page_format_transformation {
   
 sub page_cleanup {  sub page_cleanup {
     my $result = shift;      my $result = shift;
    
     $result =~ m/\\end{document}(\d*)$/;      $result =~ m/\\end\{document}(\d*)$/;
     my $number_of_columns = $1;      my $number_of_columns = $1;
     my $insert = '{';      my $insert = '{';
     for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; }      for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; }
     $insert .= '}';      $insert .= '}';
     $result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g;      $result =~ s/(\\begin\{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g;
     $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g;      $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g;
     return $result,$number_of_columns;      return $result,$number_of_columns;
 }  }
Line 1657  my $end_of_student = "\n".'\special{ps:E Line 1986  my $end_of_student = "\n".'\special{ps:E
   
 sub latex_corrections {  sub latex_corrections {
     my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_;      my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_;
 #    $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;  #    $result =~ s/\\includegraphics\{/\\includegraphics\[width=\\minipagewidth\]{/g;
     my $copyright = &copyright_line();      my $copyright = &copyright_line();
     if ($selectionmade eq '1' || $answer_mode eq 'only') {      if ($selectionmade eq '1' || $answer_mode eq 'only') {
  $result =~ s/(\\end{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/;   $result =~ s/(\\end\{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/;
     } else {      } else {
  $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/;   $result =~ s/(\\end\{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/;
     }      }
     $result =~ s/\$number_of_columns/$number_of_columns/g;      $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\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]\{\\hrulefill})/$2$1/g;
     $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g;      $result =~ s/(\\end\{longtable}\s*)\\strut\\newline/$1/g;
 #-- LaTeX corrections       #-- LaTeX corrections
     my $first_comment = index($result,'<!--',0);      my $first_comment = index($result,'<!--',0);
     while ($first_comment != -1) {      while ($first_comment != -1) {
  my $end_comment = index($result,'-->',$first_comment);   my $end_comment = index($result,'-->',$first_comment);
Line 1685  sub latex_corrections { Line 2014  sub latex_corrections {
     if ($result =~ m/&(\w+|#\d+);/) {      if ($result =~ m/&(\w+|#\d+);/) {
  $result = &character_chart($result);   $result = &character_chart($result);
     }      }
     $result =~ s/(\\end{tabular})\s*\\vskip 0 mm/$1/g;      $result =~ s/(\\end\{tabular})\s*\\vskip 0 mm/$1/g;
     $result =~ s/(\\begin{enumerate})\s*\\noindent/$1/g;      $result =~ s/(\\begin\{enumerate})\s*\\noindent/$1/g;
     return $result;      return $result;
 }  }
   
Line 1779  sub get_textwidth { Line 2108  sub get_textwidth {
   
 sub unsupported {  sub unsupported {
     my ($currentURL,$mode,$symb)=@_;      my ($currentURL,$mode,$symb)=@_;
       my $cleanURL=&Apache::lonenc::check_decrypt($currentURL);
       my $shown = $currentURL;
       if (($cleanURL ne $currentURL) || ($symb =~ m{/^enc/})) {
           $shown = &mt('URL not shown (encrypted)');
       }
     if ($mode ne '') {$mode='\\'.$mode}      if ($mode ne '') {$mode='\\'.$mode}
     my $result.= &print_latex_header($mode);      my $result = &print_latex_header($mode);
     if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {      if ($cleanURL=~m|^(/adm/wrapper)?/ext/|) {
  $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;          $cleanURL=~s|^(/adm/wrapper)?/ext/|http://|;
  my $title=&Apache::lonnet::gettitle($symb);          $cleanURL=~s|^http://https://|https://|;
  $title = &Apache::lonxml::latex_special_symbols($title);          if ($shown eq $currentURL) {
  $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' ';              $shown = &Apache::lonxml::latex_special_symbols($cleanURL);
           }
           my $title=&Apache::lonnet::gettitle($symb);
           $title = &Apache::lonxml::latex_special_symbols($title);
           $result.=' \strut \\\\ \textit{'.$title.'} \strut \\\\ '.$shown.' ';
     } else {      } else {
  $result.=$currentURL;          if ($shown eq $currentURL) {
       $result.=&Apache::lonxml::latex_special_symbols($currentURL);
           } else {
               $result.=$shown;
           }
     }      }
     $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';      $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';
     return $result;      return $result;
Line 1823  sub print_page_in_course { Line 2165  sub print_page_in_course {
     $laystyle = &map_laystyle($laystyle);      $laystyle = &map_laystyle($laystyle);
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,      my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,
       $numberofcolumns);        $numberofcolumns);
     my $LaTeXwidth=&recalcto_mm($textwidth);       my $LaTeXwidth=&recalcto_mm($textwidth);
   
   
     if ($mode ne '') {$mode='\\'.$mode}      if ($mode ne '') {$mode='\\'.$mode}
     my $result   =    &print_latex_header($mode);      my $result   =    &print_latex_header($mode);
     if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {  
  $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;      my $title=&Apache::lonnet::gettitle($currentURL);
  my $title=&Apache::lonnet::gettitle($symb);      $title = &Apache::lonxml::latex_special_symbols($title);
  $title = &Apache::lonxml::latex_special_symbols($title);      $result .= '\noindent\textit{'.$title.'}\\\\';
     } else {  
         my $esc_currentURL= $currentURL;  
         $esc_currentURL =~ s/_/\\_/g;  
  $result.=$esc_currentURL;  
     }  
     $result .= '\\\\';  
   
     if ($helper->{'VARS'}->{'style_file'}=~/\w/) {      if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
  &Apache::lonnet::appenv({'construct.style' =>   &Apache::lonnet::appenv({'construct.style' =>
Line 1846  sub print_page_in_course { Line 2181  sub print_page_in_course {
  &Apache::lonnet::delenv('construct.style');   &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.      # 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) {      foreach my $resource (@page_resources) {
  my $resource_src   = $resource->src(); # Essentially the URL of the resource.   my $resource_src   = $resource->src(); # Essentially the URL of the resource.
  $result           .= $resource->title() . '\\\\';          my $current_url = $resource->link();
   
  # Recurse if a .page:   # Recurse if a .page:
   
  if ($resource_src =~ /.page$/i) {   if ($resource_src =~ /.page$/i) {
     my $navmap         = Apache::lonnavmaps::navmap->new();      my $navmap         = Apache::lonnavmaps::navmap->new();
     my @page_resources = $navmap->retrieveResources($resource_src);      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);         $resource_src, \@page_resources);
  }          } elsif ($resource->ext()) {
  # these resources go through the XML transformer:              $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)$/)  {
  elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/)  {              # these resources go through the XML transformer:
               $result .= &Apache::lonxml::latex_special_symbols($resource->title()) . '\\\\';
   
     my $urlp = &Apache::lonnet::clutter($resource_src);      my $urlp = &Apache::lonnet::clutter($resource_src);
   
Line 1878  sub print_page_in_course { Line 2214  sub print_page_in_course {
   
     $form{'grade_target'}  = 'tex';      $form{'grade_target'}  = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFields'} = $pdfFormFields; #       $form{'pdfFormFields'} = 'no'; #
     $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};          $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
       
     $form{'problem_split'}=$parmhash{'problem_stream_switch'};      $form{'problem_split'}=$parmhash{'problem_stream_switch'};
     $form{'suppress_tries'}=$parmhash{'suppress_tries'};      $form{'suppress_tries'}=$parmhash{'suppress_tries'};
     $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};      $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
Line 1896  sub print_page_in_course { Line 2232  sub print_page_in_course {
     }      }
     $form{'rndseed'}=$rndseed;      $form{'rndseed'}=$rndseed;
     &Apache::lonnet::appenv(\%moreenv);      &Apache::lonnet::appenv(\%moreenv);
       
     &Apache::lonxml::clear_problem_counter();      &Apache::lonxml::clear_problem_counter();
   
     my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);      my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);
Line 1921  sub print_page_in_course { Line 2257  sub print_page_in_course {
  my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform);   my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform);
   
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/;
  } else {   } else {
     $texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     if ($helper->{'VARS'}->{'construction'} ne '1') {      if ($helper->{'VARS'}->{'construction'} ne '1') {
Line 1931  sub print_page_in_course { Line 2267  sub print_page_in_course {
  $texversion.=&path_to_problem($urlp,$LaTeXwidth);   $texversion.=&path_to_problem($urlp,$LaTeXwidth);
     } else {      } else {
  $texversion.='\vskip 0 mm \noindent\textbf{'.   $texversion.='\vskip 0 mm \noindent\textbf{'.
                         &mt("Printing from Construction Space: No Title").'}\vskip 0 mm ';                          &mt("Printing from Authoring Space: No Title").'}\vskip 0 mm ';
  $texversion.=&path_to_problem($urlp,$LaTeXwidth);   $texversion.=&path_to_problem($urlp,$LaTeXwidth);
     }      }
     $texversion.='\vskip 1 mm '.$answer.'\end{document}';      $texversion.='\vskip 1 mm '.$answer.'\end{document}';
  }   }
   
   
   
   
       
     }      }
     # Print annotations.      # Print annotations.
   
   
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $annotation .= &annotate($currentURL);   my $annotation .= &annotate($currentURL);
  $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;   $texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/;
     }      }
       
     if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {      if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
  $texversion=&IndexCreation($texversion,$currentURL);   $texversion=&IndexCreation($texversion,$currentURL);
     }      }
Line 1987  sub recently_generated { Line 2318  sub recently_generated {
     my $pdf_result;      my $pdf_result;
     opendir(DIR,$prtspool);      opendir(DIR,$prtspool);
   
     my @files =       my @files =
  grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR));   grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR));
     closedir(DIR);      closedir(DIR);
   
Line 2051  sub recently_generated { Line 2382  sub recently_generated {
 #    A reference to a page break hash.  #    A reference to a page break hash.
 #  #
 #  #
 use Data::Dumper;  # use Data::Dumper;
 # sub dump_helper_vars {  # sub dump_helper_vars {
 #    my ($helper) = @_;  #    my ($helper) = @_;
 #    my $helpervars = Dumper($helper->{'VARS'});  #    my $helpervars = Dumper($helper->{'VARS'});
Line 2067  sub get_page_breaks  { Line 2398  sub get_page_breaks  {
     }      }
     return %page_breaks;      return %page_breaks;
 }  }
 #   #
 #   Returns text to insert for any extra vskip prior to the resource.  #   Returns text to insert for any extra vskip prior to the resource.
 #   Parameters:  #   Parameters:
 #     helper   - Reference to the helper object driving the printout.  #     helper   - Reference to the helper object driving the printout.
Line 2078  sub get_page_breaks  { Line 2409  sub get_page_breaks  {
 #    EXTRASPACE         has the list of extra space values.  #    EXTRASPACE         has the list of extra space values.
 #    EXTRASPACE_UNITS   is the set of resources for which the units are  #    EXTRASPACE_UNITS   is the set of resources for which the units are
 #                       mm. All others are 'in'.  #                       mm. All others are 'in'.
 #      #
 #    The resource is found in the POSSIBLE_RESOURCES to get the index  #    The resource is found in the POSSIBLE_RESOURCES to get the index
 #    of the EXTRASPACE value.  #    of the EXTRASPACE value.
 #  #
Line 2099  sub load_skips { Line 2430  sub load_skips {
   
     my ($helper)  = @_;      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) {      if (!$skips_loaded) {
  @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'}));   @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'}));
Line 2147  sub get_extra_vspaces { Line 2478  sub get_extra_vspaces {
 #  The resource chooser part of the helper needs more than just  #  The resource chooser part of the helper needs more than just
 #  the value of the extraspaces var to recover the value into a text  #  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:  #  field option.  This sub produces the required format for the saved var:
 #  specifically   #  specifically
 #    ||| separated fields of the form resourcename=value  #    ||| separated fields of the form resourcename=value
 #  #
 #  Parameters:  #  Parameters:
Line 2181  sub set_form_extraspace { Line 2512  sub set_form_extraspace {
     $env{'form.extraspace'}  = $result;      $env{'form.extraspace'}  = $result;
     $env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'};      $env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'};
     return $result;      return $result;
       
 }  }
   
 #  Output a sequence (recursively if neeed)  #  Output a sequence (recursively if neeed)
Line 2207  sub print_construction_sequence { Line 2538  sub print_construction_sequence {
     }      }
     my $errtext=&LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$currentURL));      my $errtext=&LONCAPA::map::mapread(&Apache::lonnet::filelocation('',$currentURL));
   
     #       #
     #  These make this all support recursing for subsequences.      #  These make this all support recursing for subsequences.
     #      #
     my @order    = @LONCAPA::map::order;      my @order    = @LONCAPA::map::order;
     my @resources = @LONCAPA::map::resources;       my @resources = @LONCAPA::map::resources;
   
     for (my $member=0;$member<=$#order;$member++) {      for (my $member=0;$member<=$#order;$member++) {
  $resources[$order[$member]]=~/^([^:]*):([^:]*):/;   $resources[$order[$member]]=~/^([^:]*):([^:]*):/;
Line 2227  sub print_construction_sequence { Line 2558  sub print_construction_sequence {
  $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);   $texversion=&ssi_with_retries($urlp, $ssi_retry_count, %form);
     }      }
     if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||      if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
  ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) &&    ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) &&
        ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) {         ($urlp=~/$LONCAPA::assess_page_re/)) {
  #  Don't permanently modify %$form...   #  Don't permanently modify %$form...
  my %answerform = %form;   my %answerform = %form;
  $answerform{'grade_target'}='answer';   $answerform{'grade_target'}='answer';
Line 2239  sub print_construction_sequence { Line 2570  sub print_construction_sequence {
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);   my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/;
  } else {   } else {
     # If necessary, encapsulate answer in minipage:      # If necessary, encapsulate answer in minipage:
       
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});      my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
     $title = &Apache::lonxml::latex_special_symbols($title);      $title = &Apache::lonxml::latex_special_symbols($title);
     my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';      my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
     $body.=&path_to_problem($urlp,$LaTeXwidth);      $body.=&path_to_problem($urlp,$LaTeXwidth);
     $body.='\vskip 1 mm '.$answer.'\end{document}';      $body.='\vskip 1 mm '.$answer.'\end{document}';
     $body = &encapsulate_minipage($body);      $body = &encapsulate_minipage($body,$answerform{'problem_split'});
     $texversion.=$body;      $texversion.=$body;
  }   }
     }      }
Line 2264  sub print_construction_sequence { Line 2595  sub print_construction_sequence {
     $result.=$texversion;      $result.=$texversion;
   
  } elsif ($urlp=~/\.(sequence|page)$/) {   } elsif ($urlp=~/\.(sequence|page)$/) {
    
     # header:      # header:
   
     $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent ';      $result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent ';
   
     # IF sequence, recurse:      # IF sequence, recurse:
       
     if ($urlp =~ /\.sequence$/) {      if ($urlp =~ /\.sequence$/) {
  $result .= &print_construction_sequence($urlp,    $result .= &print_construction_sequence($urlp,
  $helper, %form,    $helper, %form,
  $LaTeXwidth);   $LaTeXwidth);
     }      }
  }   }
Line 2288  sub print_construction_sequence { Line 2619  sub print_construction_sequence {
     if ($member != $#order) {      if ($member != $#order) {
  $texversion .= '\\ \cleardoublepage';   $texversion .= '\\ \cleardoublepage';
     }      }
       
     $result .= $texversion;      $result .= $texversion;
  }   }
     }      }
     if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}      if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin\{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
     return $result;      return $result;
 }  }
   
Line 2312  sub print_construction_sequence { Line 2643  sub print_construction_sequence {
 #   6        Print selected problems from a folder.  #   6        Print selected problems from a folder.
 #   7        Print print selected resources from some scope.  #   7        Print print selected resources from some scope.
 #   8        Print resources for selected students.  #   8        Print resources for selected students.
   #   9        Print for anonymous CODEs
 #  #
 #BZ 5209  #BZ 5209
 #   2        map_incomplete_problems_seq Print incomplete problems from the current  #   2        map_incomplete_problems_seq Print incomplete problems from the current
Line 2328  sub print_construction_sequence { Line 2660  sub print_construction_sequence {
 #  For item 100, filtering was done at the helper level.  #  For item 100, filtering was done at the helper level.
   
 sub output_data {  sub output_data {
   
     my ($r,$helper,$rparmhash) = @_;      my ($r,$helper,$rparmhash) = @_;
     my %parmhash = %$rparmhash;      my %parmhash = %$rparmhash;
     $ssi_error = 0; # This will be set nonzero by failing ssi's.      $ssi_error = 0; # This will be set nonzero by failing ssi's.
Line 2348  sub output_data { Line 2681  sub output_data {
         url += 'form=' + formname + '&';          url += 'form=' + formname + '&';
         if (only != null) {          if (only != null) {
             url += 'only=' + only + '&';              url += 'only=' + only + '&';
         }           }
         if (omit != null) {          if (omit != null) {
             url += 'omit=' + omit + '&';              url += 'omit=' + omit + '&';
         }          }
Line 2383  ENDPART Line 2716  ENDPART
   
     $env{'form.pagebreaks'}  = $helper->{'VARS'}->{'FINISHPAGE'};      $env{'form.pagebreaks'}  = $helper->{'VARS'}->{'FINISHPAGE'};
     &set_form_extraspace($helper);      &set_form_extraspace($helper);
     $env{'form.lastprinttype'} = $print_type;       $env{'form.lastprinttype'} = $print_type;
     &Apache::loncommon::store_course_settings('print',      &Apache::loncommon::store_course_settings('print',
       {'pagebreaks'    => 'scalar',        {'pagebreaks'    => 'scalar',
        'extraspace'    => 'scalar',         'extraspace'    => 'scalar',
Line 2400  ENDPART Line 2733  ENDPART
     $laystyle = &map_laystyle($laystyle);      $laystyle = &map_laystyle($laystyle);
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);      my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);
     my $assignment =  $env{'form.assignment'};      my $assignment =  $env{'form.assignment'};
     my $LaTeXwidth=&recalcto_mm($textwidth);       my $LaTeXwidth=&recalcto_mm($textwidth);
     my @print_array=();      my @print_array=();
     my @student_names=();      my @student_names=();
       my $lastprinted;
   
            #  Common settings for the %form hash:
     #  Common settings for the %form has:      # In some cases these settings get overridden by specific cases, but the
     # In some cases these settings get overriddent by specific cases, but the  
     # settings are common enough to make it worthwhile factoring them out      # settings are common enough to make it worthwhile factoring them out
     # here.      # here.
     #      #
     my %form;      my %form;
     $form{'grade_target'} = 'tex';      $form{'grade_target'} = 'tex';
     $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);      $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
     $form{'pdfFormFields'} = $pdfFormFields;      $form{'pdfFormFields'} = 'no';
   
     # If form.showallfoils is set, then request all foils be shown:      # 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,      # check box selecting this option to be presnt unless it's ok,
     # and by lonresponse's priv. check.      # and by lonresponse's priv. check.
     # The if is here because lonresponse.pm only cares that      # The if is here because lonresponse.pm only cares that
     # showallfoils is defined, not what the value is.      # 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'};   $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
     }      }
       
     if ($helper->{'VARS'}->{'style_file'}=~/\w/) {      if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
  &Apache::lonnet::appenv({'construct.style' =>   &Apache::lonnet::appenv({'construct.style' =>
  $helper->{'VARS'}->{'style_file'}});   $helper->{'VARS'}->{'style_file'}});
Line 2448  ENDPART Line 2781  ENDPART
     $cleanURL=$currentURL;      $cleanURL=$currentURL;
  }   }
  $selectionmade = 1;   $selectionmade = 1;
         
  if ($cleanURL!~m|^/adm/|   if ($cleanURL!~m|^/adm/|
     && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {      && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
     my $rndseed=time;      my $rndseed=time;
Line 2478  ENDPART Line 2811  ENDPART
  $texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form);   $texversion.=&ssi_with_retries($currentURL,$ssi_retry_count, %form);
   
  #  Add annotations if required:   #  Add annotations if required:
       
  &Apache::lonxml::clear_problem_counter();   &Apache::lonxml::clear_problem_counter();
   
  &Apache::lonnet::delenv('request.filename');   &Apache::lonnet::delenv('request.filename');
Line 2501  ENDPART Line 2834  ENDPART
   
   
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/;
  } else {   } else {
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     if ($helper->{'VARS'}->{'construction'} ne '1') {      if ($helper->{'VARS'}->{'construction'} ne '1') {
Line 2511  ENDPART Line 2844  ENDPART
  $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);   $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);
     } else {      } else {
  $texversion.='\vskip 0 mm \noindent\textbf{'.   $texversion.='\vskip 0 mm \noindent\textbf{'.
                         &mt("Printing from Construction Space: No Title").'}\vskip 0 mm ';                          &mt("Printing from Authoring Space: No Title").'}\vskip 0 mm ';
   
  $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);   $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);
     }      }
Line 2521  ENDPART Line 2854  ENDPART
   
   
   
       
     }      }
     # Print annotations.      # Print annotations.
   
   
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $annotation .= &annotate($currentURL);   my $annotation .= &annotate($currentURL);
  $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;   $texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/;
     }      }
   
   
Line 2547  ENDPART Line 2880  ENDPART
  && $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') {   && $currentURL=~/\.(sequence|page)$/ && $helper->{'VARS'}->{'construction'} eq '1') {
     $result .= &print_construction_sequence($currentURL, $helper, %form,      $result .= &print_construction_sequence($currentURL, $helper, %form,
     $LaTeXwidth);      $LaTeXwidth);
     $result .= '\end{document}';        $result .= '\end{document}';
     if (!($result =~ /\\begin\{document\}/)) {      if (!($result =~ /\\begin\{document\}/)) {
  $result = &print_latex_header() . $result;   $result = &print_latex_header() . $result;
     }      }
     # End construction space sequence.      # End construction space sequence.
  } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {    } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}   if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}
  $resources_printed .= $currentURL.':';   $resources_printed .= $currentURL.':';
  my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %form);   my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %form);
  if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {   if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
     my $annotation = &annotate($currentURL);      my $annotation = &annotate($currentURL);
     $texversion    =~ s/(\\end{document})/$annotation$1/;      $texversion    =~ s/(\\end\{document})/$annotation$1/;
  }   }
  $result .= $texversion;   $result .= $texversion;
  } elsif ($cleanURL =~/\.tex$/) {   } elsif ($cleanURL =~/\.tex$/) {
Line 2570  ENDPART Line 2903  ENDPART
     $result = &fetch_raw_resource($currentURL);      $result = &fetch_raw_resource($currentURL);
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $annotation = &annotate($currentURL);   my $annotation = &annotate($currentURL);
  $result =~ s/(\\end{document})/$annotation$1/;   $result =~ s/(\\end\{document})/$annotation$1/;
     }      }
   
     $do_postprocessing = 0; # Don't massage the result.      $do_postprocessing = 0; # Don't massage the result.
Line 2587  ENDPART Line 2920  ENDPART
     $result           .=  &print_page_in_course($helper, $rparmhash,      $result           .=  &print_page_in_course($helper, $rparmhash,
  $cleanURL, \@page_resources);   $cleanURL, \@page_resources);
   
          
  } else {   } else {
     $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},      $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
   $helper->{'VARS'}->{'symb'});    $helper->{'VARS'}->{'symb'});
Line 2602  ENDPART Line 2935  ENDPART
      ($print_type eq 'map_incomplete_problems_seq')       ($print_type eq 'map_incomplete_problems_seq')
      ) {       ) {
   
    
         #-- produce an output string          #-- produce an output string
  if (($print_type eq 'map_problems')                or   if (($print_type eq 'map_problems')                or
     ($print_type eq 'map_incomplete_problems_seq') or      ($print_type eq 'map_incomplete_problems_seq') or
Line 2612  ENDPART Line 2944  ENDPART
  ($print_type eq 'map_resources_in_page'))   ($print_type eq 'map_resources_in_page'))
  {   {
     $selectionmade = 3;      $selectionmade = 3;
  } elsif (($print_type eq 'all_problems')    } elsif (($print_type eq 'all_problems')
  ) {   ) {
     $selectionmade = 4;      $selectionmade = 4;
  } elsif ($print_type eq 'all_resources') {  #BUGBUG   } elsif ($print_type eq 'all_resources') {  #BUGBUG
Line 2637  ENDPART Line 2969  ENDPART
   
  &Apache::lonxml::clear_problem_counter();   &Apache::lonxml::clear_problem_counter();
   
  my $pbreakresources = keys %page_breaks;  
  for (my $i=0;$i<=$#master_seq;$i++) {   for (my $i=0;$i<=$#master_seq;$i++) {
   
     &Apache::lonenc::reset_enc();      &Apache::lonenc::reset_enc();
   
   
     # Note due to document structure, not allowed to put \newpage      # Note due to document structure, not allowed to put \newpage
     # prior to the first resource      # prior to the first resource
   
Line 2663  ENDPART Line 2993  ENDPART
     my $texversion='';      my $texversion='';
     if ($urlp!~m|^/adm/|      if ($urlp!~m|^/adm/|
  && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {   && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
                   my $extension = $1;
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  &Apache::lonxml::remember_problem_counter();   &Apache::lonxml::remember_problem_counter();
  if ($flag_latex_header_remove eq 'NO') {   if ($flag_latex_header_remove eq 'NO') {
Line 2671  ENDPART Line 3002  ENDPART
                             (($i==0) &&                              (($i==0) &&
                              (($urlp=~/\.page$/) ||                               (($urlp=~/\.page$/) ||
                               ($print_type eq 'map_problems_in_page') ||                                ($print_type eq 'map_problems_in_page') ||
                               ($print_type eq 'map_resources_in_page')))) {                                (($print_type eq 'map_resources_in_page') && ($extension !~ /^x?html?$/))))) {
                         $flag_latex_header_remove = 'YES';                          $flag_latex_header_remove = 'YES';
                     }                      }
  }   }
  $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);   $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);
  if ($urlp=~/\.page$/) {   if ($urlp=~/\.page$/) {
     ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);      ($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}/;      $texversion =~ s/\\end\{document}\d*/\\end{document}/;
     $flag_page_in_sequence = 'YES';      $flag_page_in_sequence = 'YES';
  }   }
   
Line 2694  ENDPART Line 3025  ENDPART
     &Apache::lonxml::restore_problem_counter();      &Apache::lonxml::restore_problem_counter();
     my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);      my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
                     if ($urlp =~ /\.page$/) {                      if ($urlp =~ /\.page$/) {
                         $answer =~ s/\\end{document}(\d*)$//;                          $answer =~ s/\\end\{document}(\d*)$//;
                     }                      }
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
                         if ($urlp =~ /\.page$/) {                          if ($urlp =~ /\.page$/) {
                             my @probs = split(/\\keephidden{ENDOFPROBLEM}/,$texversion);                              my @probs = split(/\\keephidden\{ENDOFPROBLEM}/,$texversion);
                             my $lastprob = pop(@probs);                              my $lastprob = pop(@probs);
                             $texversion = join('\keephidden{ENDOFPROBLEM}',@probs).                              $texversion = join('\keephidden{ENDOFPROBLEM}',@probs).
                             $answer.'\keephidden{ENDOFPROBLEM}'.$lastprob;                              $answer.'\keephidden{ENDOFPROBLEM}'.$lastprob;
                         } else {                          } else {
                             $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;                              $texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/;
                         }                          }
     } else {      } else {
  if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/) {   if ($urlp=~/$LONCAPA::assess_page_re/) {
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
 #    $texversion =~ s/\\begin{document}//; # FIXME  #    $texversion =~ s/\\begin\{document}//; # FIXME
     my $title = &Apache::lonnet::gettitle($master_seq[$i]);      my $title = &Apache::lonnet::gettitle($master_seq[$i]);
     $title = &Apache::lonxml::latex_special_symbols($title);      $title = &Apache::lonxml::latex_special_symbols($title);
     my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';      my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
     $body   .= &path_to_problem ($urlp,$LaTeXwidth);      $body   .= &path_to_problem ($urlp,$LaTeXwidth);
     $body   .='\vskip 1 mm '.$answer;      $body   .='\vskip 1 mm '.$answer;
     $body    = &encapsulate_minipage($body);      $body    = &encapsulate_minipage($body,$answerform{'problem_split'});
     $texversion .= $body;      $texversion .= $body;
  } else {   } else {
     $texversion='';      $texversion='';
Line 2724  ENDPART Line 3055  ENDPART
  }   }
  if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {   if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
     my $annotation .= &annotate($urlp);      my $annotation .= &annotate($urlp);
     $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;      $texversion =~ s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/;
  }   }
   
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
  } else {   } else {
     $texversion =~ s/\\end{document}//;      $texversion =~ s/\\end\{document}//;
  }   }
  if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {   if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
     $texversion=&IndexCreation($texversion,$urlp);      $texversion=&IndexCreation($texversion,$urlp);
Line 2738  ENDPART Line 3069  ENDPART
  if (($selectionmade == 4) and ($assignment ne $prevassignment)) {   if (($selectionmade == 4) and ($assignment ne $prevassignment)) {
     my $name = &get_name();      my $name = &get_name();
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
                       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     $prevassignment=$assignment;      $prevassignment=$assignment;
     my $header_text = $parmhash{'print_header_format'};      my $header_text = $parmhash{'print_header_format'};
     $header_text    = &format_page_header($textwidth, $header_text,      $header_text    = &format_page_header($textwidth, $header_text,
   $assignment,     $assignment,
   $courseidinfo,     $courseidinfo,
   $name);    $name);
   
     if ($numberofcolumns eq '1') {      if ($numberofcolumns eq '1') {
  $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm ';   $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm ';
     } else {      } else {
Line 2752  ENDPART Line 3083  ENDPART
     }      }
  }   }
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';      $flag_latex_header_remove = 'YES';
     } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {       } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}   if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
  my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);   my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form);
  if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {   if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
     my $annotation = &annotate($urlp);      my $annotation = &annotate($urlp);
     $texversion =~ s/(\\end{document)/$annotation$1/;      $texversion =~ s/(\\end\{document)/$annotation$1/;
  }   }
   
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
  } else {   } else {
     $texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/;      $texversion =~ s/\\end\{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/;
  }   }
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';    $flag_latex_header_remove = 'YES';
     } elsif ($urlp=~ /\.pdf$/i) {      } elsif ($urlp=~ /\.pdf$/i) {
  if ($i > 0) {   if ($i > 0) {
     $result .= '\cleardoublepage';      $result .= '\cleardoublepage';
Line 2797  ENDPART Line 3128  ENDPART
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
  } else {   } else {
     $texversion =~ s/\\end{document}//;      $texversion =~ s/\\end\{document}//;
  }   }
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';      $flag_latex_header_remove = 'YES';
     }      }
     if (&Apache::loncommon::connection_aborted($r)) {       if (&Apache::loncommon::connection_aborted($r)) {
  last;    last;
     }      }
  }   }
  &Apache::lonxml::clear_problem_counter();   &Apache::lonxml::clear_problem_counter();
  if ($flag_page_in_sequence eq 'YES') {   if ($flag_page_in_sequence eq 'YES') {
     $result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;      $result =~ s/\\usepackage\{calc}/\\usepackage{calc}\\usepackage{longtable}/;
  }   }
  $result .= '\end{document}';   $result .= '\end{document}';
      } elsif (($print_type eq 'problems_for_students')           ||       } elsif (($print_type eq 'problems_for_students')           ||
Line 2819  ENDPART Line 3150  ENDPART
       ($print_type eq 'map_incomplete_problems_people_seq')){        ($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;   my $type;
  if (($print_type eq 'problems_for_students')           ||   if (($print_type eq 'problems_for_students')           ||
      ($print_type eq 'problems_for_students_from_page') ||       ($print_type eq 'problems_for_students_from_page') ||
Line 2838  ENDPART Line 3169  ENDPART
  #   to override this and output the students by name.   #   to override this and output the students by name.
  #    Each element of the students array is of the form:   #    Each element of the students array is of the form:
  #       username:domain:section:last, first:status   #       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.   #  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")) {       ($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) {
      @students = sort compare_names  @students;       @students = sort compare_names  @students;
    } else {
        @students = sort compare_sections @students;
  }   }
  &adjust_number_to_print($helper);   &adjust_number_to_print($helper);
   
Line 2852  ENDPART Line 3185  ENDPART
      $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) {       $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) {
      $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;       $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;
  }   }
  # If we are splitting on section boundaries, we need    # If we are splitting on section boundaries, we need
  # to remember that in split_on_sections and    # to remember that in split_on_sections and
  # print all of the students in the list.   # print all of the students in the list.
  #   #
  my $split_on_sections = 0;   my $split_on_sections = 0;
Line 2863  ENDPART Line 3196  ENDPART
  }   }
  my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};   my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
   
            my $map;
            if ($helper->{VARS}->{'symb'}) {
                unless ((($print_type eq 'all_problems_students') ||
                         ($print_type eq 'incomplete_problems_selpeople_course')) &&
                         $perm{'pfo'}) {
                    ($map, my $id, my $resource) =
                        &Apache::lonnet::decode_symb($helper->{VARS}->{'symb'});
                }
            }
   
  #loop over students   #loop over students
   
   my $flag_latex_header_remove = 'NO';    my $flag_latex_header_remove = 'NO';
Line 2877  ENDPART Line 3220  ENDPART
      ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) {       ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) {
      $moreenv{'problem_split'}='yes';       $moreenv{'problem_split'}='yes';
  }   }
  my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75');   my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$#students+1);
  my $student_counter=-1;   my $student_counter=-1;
  my $i = 0;   my $i = 0;
  my $last_section = (split(/:/,$students[0]))[2];   my $last_section = (split(/:/,$students[0]))[2];
            my $nohidemap;
            if ($perm{'pav'} && $perm{'vgr'}) {
                $nohidemap = 1;
            }
  foreach my $person (@students) {   foreach my $person (@students) {
              my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";               my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
      if (-e $duefile) {       if (-e $duefile) {
Line 2897  ENDPART Line 3244  ENDPART
      } else {       } else {
  $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});   $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
      }       }
      my $actual_seq = master_seq_to_person_seq($helper, \@master_seq, $person);       my $actual_seq = master_seq_to_person_seq($map, \@master_seq,
                                                          $person, undef, $nohidemap);
      my ($output,$fullname, $printed)=&print_resources($r,$helper,       my ($output,$fullname, $printed)=&print_resources($r,$helper,
      $person,$type,       $person,$type,
      \%moreenv,  $actual_seq,       \%moreenv,  $actual_seq,
Line 2909  ENDPART Line 3257  ENDPART
 #     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);  #     &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);
      &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last student');
      $flag_latex_header_remove = 'YES';       $flag_latex_header_remove = 'YES';
                if ($printed) {
                    $lastprinted = $fullname;
                }
      if (&Apache::loncommon::connection_aborted($r)) { last; }       if (&Apache::loncommon::connection_aborted($r)) { last; }
  }   }
  &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
  $result .= $print_array[0].'  \end{document}';   $result .= $print_array[0].'  \end{document}';
      } elsif (($print_type eq 'problems_for_anon')      ||       } elsif (($print_type eq 'problems_for_anon')      ||
       ($print_type eq 'problems_for_anon_page') ||        ($print_type eq 'problems_for_anon_page') ||
       ($print_type eq 'resources_for_anon')  ) {         ($print_type eq 'resources_for_anon')  ) {
            $selectionmade = 9;
  my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};   my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
  my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};   my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
  my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};   my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
Line 2923  ENDPART Line 3275  ENDPART
  my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};   my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};
  my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};   my $single_code = $helper->{'VARS'}->{'SINGLE_CODE'};
  my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};   my $selected_code = $helper->{'VARS'}->{'CODE_SELECTED_FROM_LIST'};
   
  my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};   my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};
          my @lines = &Apache::grades::get_scantronformat_file();           my @lines = &Apache::lonnet::get_scantronformat_file();
  my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10);   my ($code_type,$code_length,$bubbles_per_row)=('letter',6,10);
  foreach my $line (@lines) {   foreach my $line (@lines) {
              chomp($line);               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];                   (split(/:/,$line))[0,2,4,17];
      if ($name eq $code_option) {       if ($name eq $code_option) {
  $code_length=$length;   $code_length=$length;
  if ($type eq 'number') { $code_type = 'number'; }   if ($type eq 'number') { $code_type = 'number'; }
                  chomp($bubbles_per_item);                    chomp($bubbles_per_item);
                  if (($bubbles_per_item ne '') && ($bubbles_per_item > 0)) {                   if (($bubbles_per_item ne '') && ($bubbles_per_item > 0)) {
                      $bubbles_per_row = $bubbles_per_item;                        $bubbles_per_row = $bubbles_per_item;
                  }                   }
      }       }
  }   }
            my $map;
            if ($helper->{VARS}{'symb'}) {
                ($map, my $id, my $resource) =
                    &Apache::lonnet::decode_symb($helper->{VARS}{'symb'});
            }
  my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));   my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
  $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};   $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
            $moreenv{'suppress_tries'} = $parmhash{'suppress_tries'};
          $moreenv{'instructor_comments'}='hide';           $moreenv{'instructor_comments'}='hide';
          $moreenv{'bubbles_per_row'} = $bubbles_per_row;           $moreenv{'bubbles_per_row'} = $bubbles_per_row;
  my $seed=time+($$<<16)+($$);   my $seed=time+($$<<16)+($$);
Line 2973  ENDPART Line 3330  ENDPART
  $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length,   $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,$code_length,
     $code_type);      $code_type);
      }       }
                $code_name =~ s/^\s+//;
                $code_name =~ s/\s+$//;
      if ($code_name) {       if ($code_name) {
  &Apache::lonnet::put('CODEs',   &Apache::lonnet::put('CODEs',
       {        {
Line 2991  ENDPART Line 3350  ENDPART
      || $number_per_page eq 'section') {       || $number_per_page eq 'section') {
      $number_per_page=$num_todo > 0 ? $num_todo : 1;       $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,'Print Status','Class Print Status',$num_todo,'inline','75');   my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,$num_todo);
  my $count=0;   my $count=0;
            my $nohidemap;
            if ($perm{'pav'} && $perm{'vgr'}) {
                $nohidemap = 1;
            }
  foreach my $code (sort(@allcodes)) {   foreach my $code (sort(@allcodes)) {
      my $file_num=int($count/$number_per_page);       my $file_num=int($count/$number_per_page);
      if ($code_type eq 'number') {        if ($code_type eq 'number') {
  $moreenv{'CODE'}=$code;   $moreenv{'CODE'}=$code;
      } else {       } else {
  $moreenv{'CODE'}=&num_to_letters($code);   $moreenv{'CODE'}=&num_to_letters($code);
      }       }
                $env{'form.CODE'} = $moreenv{'CODE'};
                my $actual_seq = master_seq_to_person_seq($map, \@master_seq,
                                                          undef,
                                                          $moreenv{'CODE'}, $nohidemap);
                delete($env{'form.CODE'});
      my ($output,$fullname, $printed)=       my ($output,$fullname, $printed)=
  &print_resources($r,$helper,'anonymous',$type,\%moreenv,   &print_resources($r,$helper,'anonymous',$type,\%moreenv,
   \@master_seq,$flag_latex_header_remove,    $actual_seq,$flag_latex_header_remove,
   $LaTeXwidth);    $LaTeXwidth);
      $resources_printed .= ":";       $resources_printed .= ":";
      $print_array[$file_num].=$output;       $print_array[$file_num].=$output;
Line 3011  ENDPART Line 3379  ENDPART
        &mt('last assignment').' '.$fullname);         &mt('last assignment').' '.$fullname);
      $flag_latex_header_remove = 'YES';       $flag_latex_header_remove = 'YES';
      $count++;       $count++;
                if ($printed) {
                    $lastprinted = $fullname;
                }
      if (&Apache::loncommon::connection_aborted($r)) { last; }       if (&Apache::loncommon::connection_aborted($r)) { last; }
  }   }
  &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
  $result .= $print_array[0].'  \end{document}';   $result .= $print_array[0].'  \end{document}';
      } elsif ($print_type eq 'problems_from_directory') {             } elsif ($print_type eq 'problems_from_directory') {
     #prints selected problems from the subdirectory       #prints selected problems from the subdirectory
  $selectionmade = 6;   $selectionmade = 6;
         my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};          my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};
  @list_of_files=sort @list_of_files;   @list_of_files=sort @list_of_files;
  my $flag_latex_header_remove = 'NO';    my $flag_latex_header_remove = 'NO';
  my $rndseed=time;   my $rndseed=time;
  if ($helper->{'VARS'}->{'curseed'}) {   if ($helper->{'VARS'}->{'curseed'}) {
     $rndseed=$helper->{'VARS'}->{'curseed'};      $rndseed=$helper->{'VARS'}->{'curseed'};
Line 3048  ENDPART Line 3419  ENDPART
     $resources_printed .= $urlp.':';      $resources_printed .= $urlp.':';
     my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);      my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
  $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;   $texversion=~s/(\\keephidden\{ENDOFPROBLEM})/$answer$1/;
     } else {      } else {
  $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});   $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
  if ($helper->{'VARS'}->{'construction'} ne '1') {   if ($helper->{'VARS'}->{'construction'} ne '1') {
Line 3056  ENDPART Line 3427  ENDPART
     $texversion.=&path_to_problem ($urlp,$LaTeXwidth);      $texversion.=&path_to_problem ($urlp,$LaTeXwidth);
  } else {   } else {
     $texversion.='\vskip 0 mm \noindent\textbf{'.      $texversion.='\vskip 0 mm \noindent\textbf{'.
                                          &mt("Printing from Construction Space: No Title").'}\vskip 0 mm ';                                           &mt("Printing from Authoring Space: No Title").'}\vskip 0 mm ';
     $texversion.=&path_to_problem ($urlp,$LaTeXwidth);      $texversion.=&path_to_problem ($urlp,$LaTeXwidth);
  }   }
  $texversion.='\vskip 1 mm '.$answer.'\end{document}';   $texversion.='\vskip 1 mm '.$answer.'\end{document}';
Line 3065  ENDPART Line 3436  ENDPART
                 #this chunk is responsible for printing the path to problem                  #this chunk is responsible for printing the path to problem
   
  my $newurlp=&path_to_problem($urlp,$LaTeXwidth);   my $newurlp=&path_to_problem($urlp,$LaTeXwidth);
  $texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/;   $texversion =~ s/(\\begin\{minipage}\{\\textwidth})/$1 $newurlp/;
  if ($flag_latex_header_remove ne 'NO') {   if ($flag_latex_header_remove ne 'NO') {
     $texversion = &latex_header_footer_remove($texversion);      $texversion = &latex_header_footer_remove($texversion);
  } else {   } else {
     $texversion =~ s/\\end{document}//;      $texversion =~ s/\\end\{document}//;
  }   }
  if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {   if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
     $texversion=&IndexCreation($texversion,$urlp);      $texversion=&IndexCreation($texversion,$urlp);
  }   }
  if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {   if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') {
     $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;      $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$urlp| \\strut\\\\\\strut /;
       
  }   }
  $result .= $texversion;   $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/;}   if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\typeout)/ RANDOM SEED IS $rndseed $1/;}
  $result .= '\end{document}';         $result .= '\end{document}';      
Line 3090  ENDPART Line 3461  ENDPART
     # Only post process if that has not been turned off e.g. by a raw latex resource.      # Only post process if that has not been turned off e.g. by a raw latex resource.
   
     if ($do_postprocessing) {      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,   $result = &page_format_transformation($papersize,
       $laystyle,$numberofcolumns,        $laystyle,$numberofcolumns,
       $print_type,$result,        $print_type,$result,
       $helper->{VARS}->{'assignment'},        $helper->{VARS}->{'assignment'},
       $helper->{'VARS'}->{'TABLE_CONTENTS'},        $helper->{'VARS'}->{'TABLE_CONTENTS'},
       $helper->{'VARS'}->{'TABLE_INDEX'},        $helper->{'VARS'}->{'TABLE_INDEX'},
       $selectionmade);        $selectionmade,$mostrecent);
  $result = &latex_corrections($number_of_columns,$result,$selectionmade,   $result = &latex_corrections($number_of_columns,$result,$selectionmade,
      $helper->{'VARS'}->{'ANSWER_TYPE'});       $helper->{'VARS'}->{'ANSWER_TYPE'});
  #if ($numberofcolumns == 1) {   #if ($numberofcolumns == 1) {
Line 3107  ENDPART Line 3483  ENDPART
  #}   #}
     }      }
   
     # Set URLback if this is a construction space print so we can provide      # Set URLback so we can provide a link back to the resource and to change options.
     # a link to the resource being edited.      # (Since the browser back button does not currently work with https,
     #      # the back link is useful even when there is an easy-to-miss LON-CAPA back button.)
   
     my $URLback=''; #link to original document      my $URLback=''; #link to original document
     if ($helper->{'VARS'}->{'construction'} eq '1') {      if ($helper->{'VARS'}->{'construction'} eq '1') {
  $URLback=$helper->{'VARS'}->{'filename'};   $URLback=$helper->{'VARS'}->{'filename'};
       } elsif ($helper->{VARS}{'symb'}) {
           my ($map, $id, $url) = &Apache::lonnet::decode_symb($helper->{VARS}{'symb'});
           my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
           my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
           my ($anchor,$usehttp,$plainurl);
           $url = &Apache::lonnet::clutter($url);
           $plainurl = $url;
           if (($ENV{'SERVER_PORT'} == 443) && ($env{'request.course.id'}) &&
               (($url =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) ||
                ($url =~ m{^\Q/adm/wrapper/ext/\E(?!https:)}))) {
               unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl())) {
                   $usehttp = 1;
               }
           }
           if ($env{'request.enc'}) {
               $url = &Apache::lonenc::encrypted($url);
           }
           if ($url ne '') {
               my $symb = $helper->{VARS}{'symb'};
               if ($url =~ m{^\Q/adm/wrapper/ext/\E}) {
                   my $link = $url;
                   ($link,$anchor) = ($url =~ /^([^\#]+)(?:|(\#[^\#]+))$/);
                   if ($anchor) {
                       ($symb) = ($helper->{VARS}{'symb'} =~ /^([^\#]+)/);
                   }
                   $url = $link;
               }
               $URLback = $url;
               if ($usehttp) {
                   $URLback .= (($URLback =~ /\?/) ? '&amp;':'?').'usehttp=1';
               }
               unless ($plainurl =~ /\.page$/) {
                   $URLback .= (($URLback =~ /\?/) ? '&amp;':'?').'symb='.&escape($symb.$anchor);
               }
           }
     }      }
     #      #
     # Final adjustment of the font size:      # Final adjustment of the font size:
Line 3121  ENDPART Line 3532  ENDPART
   
     $result = set_font_size($result);      $result = set_font_size($result);
   
 #-- writing .tex file in prtspool       # Insert any babel headers required.
   
       $result       = &collect_languages($result);
   
   
   #-- writing .tex file in prtspool
     my $temp_file;      my $temp_file;
     my $identifier = &Apache::loncommon::get_cgi_id();      my $identifier = &Apache::loncommon::get_cgi_id();
     my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex";      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)) {         unless ($temp_file = Apache::File->new('>'.$filename)) {
   $r->log_error("Couldn't open $filename for output $!");    $r->log_error("Couldn't open $filename for output $!");
   return SERVER_ERROR;     return SERVER_ERROR;
        }         }
        print $temp_file $result;         print $temp_file $result;
        my $begin=index($result,'\begin{document}',0);         my $begin=index($result,'\begin{document}',0);
        my $inc=substr($result,0,$begin+16);          my $inc=substr($result,0,$begin+16);
     } else {      } else {
        my $begin=index($result,'\begin{document}',0);         my $begin=index($result,'\begin{document}',0);
        my $inc=substr($result,0,$begin+16);         my $inc=substr($result,0,$begin+16);
Line 3141  ENDPART Line 3557  ENDPART
       $print_array[$i]=$result;        $print_array[$i]=$result;
   } else {    } else {
       $print_array[$i].='\end{document}';        $print_array[$i].='\end{document}';
       $print_array[$i] =         $print_array[$i] =
  &latex_corrections($number_of_columns,$print_array[$i],   &latex_corrections($number_of_columns,$print_array[$i],
    $selectionmade,      $selectionmade,
    $helper->{'VARS'}->{'ANSWER_TYPE'});     $helper->{'VARS'}->{'ANSWER_TYPE'});
       
       my $anobegin=index($print_array[$i],'\setcounter{page}',0);        my $anobegin=index($print_array[$i],'\setcounter{page}',0);
       substr($print_array[$i],0,$anobegin)='';        substr($print_array[$i],0,$anobegin)='';
       $print_array[$i]=$inc.$print_array[$i];        $print_array[$i]=$inc.$print_array[$i];
Line 3153  ENDPART Line 3569  ENDPART
   my $temp_file;    my $temp_file;
   my $newfilename=$filename;    my $newfilename=$filename;
   my $num=$i+1;    my $num=$i+1;
   $newfilename =~s/\.tex$//;     $newfilename =~s/\.tex$//;
   $newfilename=sprintf("%s_%03d.tex",$newfilename, $num);    $newfilename=sprintf("%s_%03d.tex",$newfilename, $num);
   unless ($temp_file = Apache::File->new('>'.$newfilename)) {    unless ($temp_file = Apache::File->new('>'.$newfilename)) {
       $r->log_error("Couldn't open $newfilename for output $!");        $r->log_error("Couldn't open $newfilename for output $!");
       return SERVER_ERROR;         return SERVER_ERROR;
   }    }
   print $temp_file $print_array[$i];    print $temp_file $print_array[$i];
        }         }
Line 3192  ENDPART Line 3608  ENDPART
  'cgi.'.$identifier.'.role' => $perm{'pav'},   'cgi.'.$identifier.'.role' => $perm{'pav'},
  'cgi.'.$identifier.'.numberoffiles' => $#print_array,   'cgi.'.$identifier.'.numberoffiles' => $#print_array,
  'cgi.'.$identifier.'.studentnames' => $student_names,   'cgi.'.$identifier.'.studentnames' => $student_names,
  'cgi.'.$identifier.'.backref' => $URLback,});   'cgi.'.$identifier.'.backref' => &escape($URLback),});
     &Apache::lonnet::appenv({"cgi.$identifier.user"    => $env{'user.name'},      &Apache::lonnet::appenv({"cgi.$identifier.user"    => $env{'user.name'},
  "cgi.$identifier.domain"  => $env{'user.domain'},   "cgi.$identifier.domain"  => $env{'user.domain'},
  "cgi.$identifier.courseid" => $cnum,    "cgi.$identifier.courseid" => $cnum,
  "cgi.$identifier.coursedom" => $cdom,    "cgi.$identifier.coursedom" => $cdom,
  "cgi.$identifier.resources" => $resources_printed});   "cgi.$identifier.resources" => $resources_printed});
   
     my $end_page = &Apache::loncommon::end_page();      my $end_page = &Apache::loncommon::end_page();
Line 3243  sub get_CODE { Line 3659  sub get_CODE {
 sub print_resources {  sub print_resources {
     my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,      my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,
  $LaTeXwidth)=@_;   $LaTeXwidth)=@_;
     my $current_output = '';       my $current_output = '';
     my $printed = '';      my $printed = '';
     my ($username,$userdomain,$usersection) = split /:/,$person;      my ($username,$userdomain,$usersection) = split /:/,$person;
     my $fullname = &get_name($username,$userdomain);      my $fullname = &get_name($username,$userdomain);
     my $namepostfix = "\\\\"; # Both anon and not anon should get the same vspace.      my $namepostfix = "\\\\"; # Both anon and not anon should get the same vspace.
   
   
     #      #
     # Figure out if we need to filter the output by      # Figure out if we need to filter the output by
     # the incomplete problems for that person      # the incomplete problems for that person
Line 3260  sub print_resources { Line 3677  sub print_resources {
  $print_incomplete = 1;   $print_incomplete = 1;
     }      }
     if ($person eq 'anonymous') {      if ($person eq 'anonymous') {
  $namepostfix .="Name: ";   $namepostfix .=&mt('Name:')." ";
  $fullname = "CODE - ".$moreenv->{'CODE'};   $fullname = "CODE - ".$moreenv->{'CODE'};
     }      }
   
Line 3269  sub print_resources { Line 3686  sub print_resources {
   
     my $i           = 0;      my $i           = 0;
     my $actually_printed = 0; # Count of resources printed.      my $actually_printed = 0; # Count of resources printed.
     #goes through all resources, checks if they are available for       #goes through all resources, checks if they are available for
     #current student, and produces output         #current student, and produces output
   
     &Apache::lonxml::clear_problem_counter();      &Apache::lonxml::clear_problem_counter();
     my %page_breaks  = &get_page_breaks($helper);      my %page_breaks  = &get_page_breaks($helper);
     my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1];      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      #   Special that allows the post processor to even out the page
     #   counts later.  Nasty problem this... it would be really      #   counts later.  Nasty problem this... it would be really
     #   nice to put the special in as a postscript comment      #   nice to put the special in as a postscript comment
     #   e.g. \special{ps:\ENDOFSTUDENTSTAMP}  unfortunately,      #   e.g. \special{ps:\ENDOFSTUDENTSTAMP}  unfortunately,
     #   The special gets passed the \ and dvips puts it in the output file      #   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.      #   postscript.  Each ENDOFSTUDENTSTAMP will go on a line by itself.
     #      #
   
     my $syllabus_first = 0;      my $syllabus_first = 0;
       my $current_assignment = "";
       my $assignment;
       my $courseidinfo = &get_course();
       my $possprint = scalar(@{$master_seq});
       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
       if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection}
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
  if (defined $page_breaks{$curresline}) {   if (defined $page_breaks{$curresline}) {
     if($i != 0) {      if($i != 0) {
Line 3295  sub print_resources { Line 3719  sub print_resources {
  }   }
  $current_output .= &get_extra_vspaces($helper, $curresline);   $current_output .= &get_extra_vspaces($helper, $curresline);
  $i++;   $i++;
  if ( !($type eq 'problems' &&    my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);
        ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) ) {  
     my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);   # See if we need to emit a new header:
   
    if ( !($type eq 'problems' &&
          ($curresline!~ m/$LONCAPA::assess_page_re/)) ) {
     if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) {      if ($print_incomplete && !&incomplete($username, $userdomain, $res_url)) {
  next;   next;
     }      }
     $actually_printed++; # we're going to print one.      $actually_printed++; # we're going to print one.
   
     if (&Apache::lonnet::allowed('bre',$res_url)) {      if (&Apache::lonnet::allowed('bre',$res_url)) {
  if ($res_url!~m|^ext/|   if ($res_url!~m|^ext/|
     && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {      && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
     $printed .= $curresline.':';      $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);      my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
                     if ($res_url =~ /\.page$/) {                      if ($res_url =~ /\.page$/) {
Line 3319  sub print_resources { Line 3747  sub print_resources {
                         if ($remove_latex_header eq 'YES') {                          if ($remove_latex_header eq 'YES') {
                             $rendered = &latex_header_footer_remove($rendered);                              $rendered = &latex_header_footer_remove($rendered);
                         } else {                          } else {
                             $rendered =~ s/\\end{document}\d*//;                              $rendered =~ s/\\end\{document}\d*//;
                         }                          }
                     }                      }
     if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||      if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
Line 3336  sub print_resources { Line 3764  sub print_resources {
  my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv);   my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$env{'request.course.id'},%answerenv);
   
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/;      $rendered=~s/(\\keephidden\{ENDOFPROBLEM})/$ansrendered$1/;
  } else {   } else {
   
       
     my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
                             unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') {                              unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') {
                                 $header =~ s/\\begin{document}//;     #<<<<<                                  $header =~ s/\\begin\{document}//;     #<<<<<
                             }                              }
     my $title = &Apache::lonnet::gettitle($curresline);      my $title = &Apache::lonnet::gettitle($curresline);
     $title = &Apache::lonxml::latex_special_symbols($title);      $title = &Apache::lonxml::latex_special_symbols($title);
     my $body   ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';      my $body   ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
     $body     .=&path_to_problem($res_url,$LaTeXwidth);      $body     .=&path_to_problem($res_url,$LaTeXwidth);
     $body     .='\vskip 1 mm '.$ansrendered;      $body     .='\vskip 1 mm '.$ansrendered;
     $body     = &encapsulate_minipage($body);      $body     = &encapsulate_minipage($body,$answerenv{'problem_split'});
     $rendered = $header.$body;      $rendered = $header.$body;
  }   }
     }      }
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $url = &Apache::lonnet::clutter($res_url);   my $url = &Apache::lonnet::clutter($res_url);
  my $annotation = &annotate($url);   my $annotation = &annotate($url);
  $rendered =~  s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/;   $rendered =~  s/(\\keephidden\{ENDOFPROBLEM})/$annotation$1/;
     }      }
     my $junk;      my $junk;
     if ($remove_latex_header eq 'YES') {      if ($remove_latex_header eq 'YES') {
  $rendered = &latex_header_footer_remove($rendered);   $rendered = &latex_header_footer_remove($rendered);
     } else {      } else {
  $rendered =~ s/\\end{document}//;   $rendered =~ s/\\end\{document}//;
     }      }
     $current_output .= $rendered;          $current_output .= $rendered;
  } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {   } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
     if ($i == 1) {      if ($i == 1) {
  $syllabus_first = 1;   $syllabus_first = 1;
Line 3374  sub print_resources { Line 3800  sub print_resources {
     if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {      if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') {
  my $url = &Apache::lonnet::clutter($res_url);   my $url = &Apache::lonnet::clutter($res_url);
  my $annotation = &annotate($url);   my $annotation = &annotate($url);
  $annotation    =~ s/(\\end{document})/$annotation$1/;   $annotation    =~ s/(\\end\{document})/$annotation$1/;
     }      }
     if ($remove_latex_header eq 'YES') {      if ($remove_latex_header eq 'YES') {
  $rendered = &latex_header_footer_remove($rendered);   $rendered = &latex_header_footer_remove($rendered);
     } else {      } else {
  $rendered =~ s/\\end{document}//;   $rendered =~ s/\\end\{document}//;
     }      }
     $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';      $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';
  } elsif($res_url = ~/\.pdf$/) {   } elsif($res_url =~ /\.pdf$/) {
     my $url = &Apache::lonnet::clutter($res_url);      my $url = &Apache::lonnet::clutter($res_url);
     my $rendered  = &include_pdf($url);      my $rendered  = &include_pdf($url);
     if ($remove_latex_header ne 'NO') {      if ($remove_latex_header ne 'NO') {
Line 3394  sub print_resources { Line 3820  sub print_resources {
     if ($remove_latex_header ne 'NO') {      if ($remove_latex_header ne 'NO') {
  $rendered = &latex_header_footer_remove($rendered);   $rendered = &latex_header_footer_remove($rendered);
     } else {      } else {
  $rendered =~ s/\\end{document}//;   $rendered =~ s/\\end\{document}//;
     }      }
     $current_output .= $rendered;      $current_output .= $rendered;
  }   }
     }      }
     $remove_latex_header = 'YES';      $remove_latex_header = 'YES';
  }   }
    $assignment = &Apache::lonxml::latex_special_symbols(
       &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,
     $fullname);
       my $header_start = ($columns_in_format == 1) ? '\lhead'
    : '\fancyhead[LO]';
       $header_line = $header_start.'{'.$header_line.'}';
       $current_output = $current_output . $header_line;
       $current_assignment = $assignment;
    }
   
  if (&Apache::loncommon::connection_aborted($r)) { last; }   if (&Apache::loncommon::connection_aborted($r)) { last; }
     }      }
     # If we are printing incomplete it's possible we don't have      # If we are printing incomplete it's possible we don't have
Line 3410  sub print_resources { Line 3849  sub print_resources {
     #      #
   
     if ($actually_printed == 0) {      if ($actually_printed == 0) {
  $current_output  = &encapsulate_minipage("\\vskip -10mm \nNo incomplete resources\n \\vskip 100 mm { }\n");          my $message = &mt('No resources to print');
           if (!$possprint) {
               if ($perm{'pav'} || $perm{'pfo'}) {
                   $message = &mt('There are no unhidden resources to print.')."\n\n".
                              &mt('The most likely reason is one of the following: ')."\n".
                              '\begin{itemize}'."\n".
                              '\item '.&mt("The 'Resource hidden from students' parameter is set for the folder being printed.")."\n".
                              '\item '.&mt("'Hidden' is checked in the Course Editor individually for each resource in the folder being printed.")."\n".
                              '\end{itemize}'."\n\n".
                              &mt("Note: to print a bubblesheet exam which you want to hide from students, ".
                                  "use the Course Editor to check the 'Hidden' checkbox for the exam folder itself.")."\n";
               }
           } elsif ($print_incomplete) {
               $message = &mt('No incomplete resources');
           }
           if ($message) {
               $current_output  = &encapsulate_minipage("\\vskip -10mm \n$message\n \\vskip 100 mm { }\n",$moreenv->{'problem_split'});
           }
  if ($remove_latex_header eq "NO") {   if ($remove_latex_header eq "NO") {
     $current_output = &print_latex_header() . $current_output;      $current_output = &print_latex_header() . $current_output;
  } else {   } else {
Line 3421  sub print_resources { Line 3877  sub print_resources {
     if ($syllabus_first) {      if ($syllabus_first) {
         $current_output =~ s/\\\\ Last updated:/Last updated:/          $current_output =~ s/\\\\ Last updated:/Last updated:/
     }      }
     my $courseidinfo = &get_course();  
     my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');      my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
     my $header_line =      my $header_line =
  &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},          &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
     $currentassignment, $courseidinfo, $fullname, $usersection);                              $currentassignment, $courseidinfo, $fullname);
     my $header_start = ($columns_in_format == 1) ? '\lhead'      my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]';
                                          : '\fancyhead[LO]';      my $newheader = $header_start.'{'.$header_line.'}';
     $header_line = $header_start.'{'.$header_line.'}';  
     if ($current_output=~/\\documentclass/) {      if ($current_output=~/\\documentclass/) {
  $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /;   $current_output =~ s/\\begin\{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$newheader$namepostfix}\\vskip 5 mm /;
   
     } else {      } else {
  my $blankpages =    my $blankpages =
     '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};      '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};
       
  $current_output = '\strut\vspace*{-6 mm}\\newline'.   $current_output = '\strut\vspace*{-6 mm}\\newline'.
     &copyright_line().' \newpage '.$blankpages.$end_of_student.      &copyright_line().' \newpage '.$blankpages.$end_of_student.
     '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.      '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.
     $header_line.$namepostfix.'} \vskip 5 mm '.$current_output;      $newheader.$namepostfix. '} \vskip 5 mm '.$current_output;
   
     }      }
     #      #
     #  Close the student bracketing.      #  Close the student bracketing.
Line 3447  sub print_resources { Line 3903  sub print_resources {
   
 }  }
   
   sub printing_blocked {
       my ($r,$blocktext) = @_;
       my $title = &mt('Preparing Printout');
       &Apache::lonhtmlcommon::clear_breadcrumbs();
       &Apache::lonhtmlcommon::add_breadcrumb({href=>'/adm/printout',
                                               text=> $title});
       my $breadcrumbs = &Apache::lonhtmlcommon::breadcrumbs($title);
       &Apache::loncommon::content_type($r,'text/html');
       &Apache::loncommon::no_cache($r);
       $r->send_http_header;
       $r->print(&Apache::loncommon::start_page('Preparing Printout').
                 $breadcrumbs.
                 $blocktext.
                 &Apache::loncommon::end_page());
       return;
   }
   
 sub handler {  sub handler {
   
     my $r = shift;      my $r = shift;
       
     &init_perm();  
   
       if ($env{'request.course.id'}) {
           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) =
               &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)) &&
                       ($env{'request.role'} !~ m{^st\./$cdom/$cnum})) {
                   &printing_blocked($r,$blocktext);
                   return OK;
               }
           }
       }
   
       &init_perm();
     my $helper = printHelper($r);      my $helper = printHelper($r);
     if (!ref($helper)) {      if (!ref($helper)) {
  return $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      #  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      # we delete it since it can only be bad (if it were good, printout.pl
Line 3472  sub handler { Line 3960  sub handler {
     if(-e $conversion_queuefile) {      if(-e $conversion_queuefile) {
  unlink $conversion_queuefile;   unlink $conversion_queuefile;
     }      }
       
   
     &output_data($r,$helper,\%parmhash);      &output_data($r,$helper,\%parmhash);
     return OK;      return OK;
 }   }
   
 use Apache::lonhelper;  use Apache::lonhelper;
   
Line 3518  sub get_randomly_ordered_warning { Line 4005  sub get_randomly_ordered_warning {
     if (defined($navmap)) {      if (defined($navmap)) {
         my $res = $navmap->getResourceByUrl($map);          my $res = $navmap->getResourceByUrl($map);
         if ($res) {          if ($res) {
     my $func =       my $func =
         sub { return ($_[0]->is_map() && $_[0]->randomorder); };          sub { return ($_[0]->is_map() && $_[0]->randomorder); };
     my @matches = $navmap->retrieveResources($res, $func,1,1,1);      my @matches = $navmap->retrieveResources($res, $func,1,1,1);
     if (@matches) {  
         $message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order.";  
     }  
         }  
         if ($message) {  
     return '<message type="warning">'.$message.'</message>';  
         }          }
     } else {      } 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 '<message type="warning">'.$message.'</message>';
     }      }
     return;      return;
Line 3562  sub printHelper { Line 4044  sub printHelper {
     # write it by hand      # write it by hand
   
     Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});      Apache::loncommon::get_unprocessed_cgi($ENV{QUERY_STRING});
       
     my $helper = Apache::lonhelper::helper->new("Printing Helper");      my $helper = Apache::lonhelper::helper->new("Printing Helper");
     $helper->declareVar('symb');      $helper->declareVar('symb');
     $helper->declareVar('postdata');          $helper->declareVar('postdata');
     $helper->declareVar('curseed');       $helper->declareVar('curseed');
     $helper->declareVar('probstatus');         $helper->declareVar('probstatus');
     $helper->declareVar('filename');      $helper->declareVar('filename');
     $helper->declareVar('construction');      $helper->declareVar('construction');
     $helper->declareVar('assignment');      $helper->declareVar('assignment');
Line 3579  sub printHelper { Line 4061  sub printHelper {
     $helper->declareVar("STUDENTS");      $helper->declareVar("STUDENTS");
     $helper->declareVar("EXTRASPACE");      $helper->declareVar("EXTRASPACE");
   
      
   
   
     #  The page breaks and extra spaces      #  The page breaks and extra spaces
Line 3587  sub printHelper { Line 4069  sub printHelper {
     # But we only do this in the initial state so that they are allowed to change.      # But we only do this in the initial state so that they are allowed to change.
     #      #
   
       
     &Apache::loncommon::restore_course_settings('print',      &Apache::loncommon::restore_course_settings('print',
  {'pagebreaks'  => 'scalar',   {'pagebreaks'  => 'scalar',
  'extraspace'  => 'scalar',   'extraspace'  => 'scalar',
  'extraspace_units' => 'scalar',   'extraspace_units' => 'scalar',
          'lastprinttype' => 'scalar'});           'lastprinttype' => 'scalar'});
       
     # This will persistently load in the data we want from the      # This will persistently load in the data we want from the
     # very first screen.      # very first screen.
       
     if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {      if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {
  if (!defined ($env{"form.CURRENT_STATE"})) {   if (!defined ($env{"form.CURRENT_STATE"})) {
       
     $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};      $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
     $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'};      $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'};
     $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'};      $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'};
Line 3612  sub printHelper { Line 4094  sub printHelper {
   
     }      }
  }   }
   
     }      }
   
     # Detect whether we're coming from construction space      # Detect whether we're coming from construction space
Line 3632  sub printHelper { Line 4113  sub printHelper {
         if ($env{'form.url'}) {          if ($env{'form.url'}) {
             $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});              $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
         }          }
   
     }      }
   
     if ($env{'form.symb'}) {      if ($env{'form.symb'}) {
Line 3642  sub printHelper { Line 4122  sub printHelper {
         $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});          $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'});
   
     }      }
     $helper->{VARS}->{'symb'}=      if ($helper->{VARS}->{'symb'} ne '') {
  &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});          $helper->{VARS}->{'symb'}=
       &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});
       }
     my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);      my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);
     if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}      if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}
   
       
     # Extract map      # Extract map
     my $symb = $helper->{VARS}->{'symb'};      my $symb = $helper->{VARS}->{'symb'};
     my ($map, $id, $url);      my ($map, $id, $url);
     my $subdir;      my $subdir;
     my $is_published=0; # True when printing from resource space.      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 $userCanPrint = ($perm{'pav'} || $perm{'pfo'});
       my $res_printstartdate;
       my $res_printenddate;
       my $map_open = 0;
       my $map_close = 0xffffffff;
       my $course_open = 0;
       my $course_close = 0xffffffff;
   
     # Get the resource name from construction space      # Get the resource name from construction space
     if ($helper->{VARS}->{'construction'}) {      if ($helper->{VARS}->{'construction'}) {
         $resourceTitle = substr($helper->{VARS}->{'filename'},           $resourceTitle = substr($helper->{VARS}->{'filename'},
                                 rindex($helper->{VARS}->{'filename'}, '/')+1);                                  rindex($helper->{VARS}->{'filename'}, '/')+1);
         $subdir = substr($helper->{VARS}->{'filename'},          $subdir = substr($helper->{VARS}->{'filename'},
                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);                           0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
Line 3667  sub printHelper { Line 4155  sub printHelper {
   
  if ($symb ne '') {   if ($symb ne '') {
     ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);      ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
     $helper->{VARS}->{'postdata'} =       $helper->{VARS}->{'postdata'} =
  &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));   &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));
     my $navmap = Apache::lonnavmaps::navmap->new();              if (!$userCanPrint) {
     my $res   = $navmap->getBySymb($symb);          my $navmap = Apache::lonnavmaps::navmap->new();
     $res_printable  = $res->resprintable() || $userCanPrint; #printability in course context                  if (ref($navmap)) {
               my $res = $navmap->getBySymb($symb);
                       if (ref($res)) {
                   $res_printable = $res->resprintable(); #printability in course context
                   ($res_printstartdate, $res_printenddate) = &get_print_dates($res);
                   ($course_open, $course_close) = &course_print_dates($res);
                   ($map_open, $map_close) = &map_print_dates($res);
                       } else {
                           $res_error = 1;
                       }
                   } else {
                       $res_error = 1;
                   }
               }
  } else {   } else {
     # Resource space.      # Resource space.
   
Line 3690  sub printHelper { Line 4191  sub printHelper {
     if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) {      if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) {
  $helper->{VARS}->{'curseed'}=$env{'form.curseed'};   $helper->{VARS}->{'curseed'}=$env{'form.curseed'};
     }      }
   
     if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {      if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {
  $helper->{VARS}->{'probstatus'}=$env{'form.problemstatus'};   $helper->{VARS}->{'probstatus'}=$env{'form.problemstatus'};
     }      }
Line 3721  sub printHelper { Line 4223  sub printHelper {
     if ($resourceTitle && $res_printable) {      if ($resourceTitle && $res_printable) {
         push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE'];          push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('the resource you just saw on the screen').")", 'current_document', 'PAGESIZE'];
     }      }
       
   
     # Useful filter strings      # Useful filter strings
   
Line 3746  sub printHelper { Line 4247  sub printHelper {
   
     my $start_new_option;      my $start_new_option;
     if ($perm{'pav'}) {      if ($perm{'pav'}) {
  $start_new_option =    $start_new_option =
     "<option text='".&mt('Start new page<br />before selected').      "<option text='".&mt('Start new page[_1]before selected','<br />').
     "' variable='FINISHPAGE' />".      "' variable='FINISHPAGE' />".
     "<option text='".&mt('Extra space<br />before selected').      "<option text='".&mt('Extra space[_1]before selected','<br />').
     "' variable='EXTRASPACE' type='text' />" .      "' variable='EXTRASPACE' type='text' />" .
     "<option " .      "<option " .
     "' variable='POSSIBLE_RESOURCES' type='hidden' />".      "' variable='POSSIBLE_RESOURCES' type='hidden' />".
     "<option text='".&mt('Space units<br />check for mm').      "<option text='".&mt('Space units[_1]check for mm','<br />').
     "' variable='EXTRASPACE_UNITS' type='checkbox' />"      "' variable='EXTRASPACE_UNITS' type='checkbox' />"
     ;      ;
       
   
     }      }
   
     # If not construction space user can print the components of a page:      # If not construction space user can print the components of a page:
Line 3776  sub printHelper { Line 4275  sub printHelper {
  my $resourcesymb   = $page_resources[0]->symb();   my $resourcesymb   = $page_resources[0]->symb();
  my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb);   my ($pagemap, $pageid, $pageurl) = &Apache::lonnet::decode_symb($symb);
  if ($page_ispage) {   if ($page_ispage) {
     push @{$printChoices},       push @{$printChoices},
     [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),       [&mt('Selected [_1]Problems[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),
      'map_problems_in_page',        'map_problems_in_page',
      'CHOOSE_PROBLEMS_PAGE'];       'CHOOSE_PROBLEMS_PAGE'];
     push @{$printChoices},       push @{$printChoices},
     [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),       [&mt('Selected [_1]Resources[_2] from page [_3]', '<b>', '</b>', '<b><i>'.$page_title.'</i></b>'),
      'map_resources_in_page',        'map_resources_in_page',
      'CHOOSE_RESOURCES_PAGE'];       'CHOOSE_RESOURCES_PAGE'];
  }   }
         my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE',          my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS_PAGE',
  'Select Problem(s) to print',   'Select Problem(s) to print',
  "multichoice='1' toponly='1' addstatus='1' closeallpages='1'",   "multichoice='1' toponly='1' addstatus='1' closeallpages='1' modallink='1'",
  'RESOURCES',   'RESOURCES',
  'PAGESIZE',   'PAGESIZE',
  $url,   $url,
Line 3797  sub printHelper { Line 4296  sub printHelper {
   
       $helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE',        $helperFragment .= &generate_resource_chooser('CHOOSE_RESOURCES_PAGE',
     'Select Resource(s) to print',      'Select Resource(s) to print',
     'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',      'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',
     'RESOURCES',      'RESOURCES',
     'PAGESIZE',      'PAGESIZE',
     $url,      $url,
     $isNotMap, '', $symbFilter,      $isNotMap, '', $symbFilter,
     $start_new_option);      $start_new_option);
   
       
   
   
   
Line 3826  sub printHelper { Line 4325  sub printHelper {
  my $nextState     = 'CHOOSE_INCOMPLETE_SEQ';   my $nextState     = 'CHOOSE_INCOMPLETE_SEQ';
  my $textSuffix    = '';   my $textSuffix    = '';
   
  if ($userCanPrint) {   if ($userCanPrint)  {
     $printSelector = 'map_incomplete_problems_people_seq';      $printSelector = 'map_incomplete_problems_people_seq';
     $nextState     = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ';      $nextState     = 'CHOOSE_INCOMPLETE_PEOPLE_SEQ';
     $textSuffix    = ' for selected students';      $textSuffix    = ' for selected students';
     my $helperStates =      my $helperStates =
  &create_incomplete_folder_selstud_helper($helper, $map);    &create_incomplete_folder_selstud_helper($helper, $map);
     &Apache::lonxml::xmlparse($r, 'helper', $helperStates);      &Apache::lonxml::xmlparse($r, 'helper', $helperStates);
  } else {   } else {
     my $helperStates = &create_incomplete_folder_helper($helper, $map); # Create needed states for student.      if (&printable($map_open, $map_close)) {
     &Apache::lonxml::xmlparse($r, 'helper', $helperStates);   my $helperStates = &create_incomplete_folder_helper($helper, $map); # Create needed states for student.
    &Apache::lonxml::xmlparse($r, 'helper', $helperStates);
       } else {
    # TODO: Figure out how to break the news...this folder is not printable.
       }
  }   }
   
  push(@{$printChoices},   if ($userCanPrint || &printable($map_open, $map_close)) {
      [&mt('Selected  [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix,      push(@{$printChoices},
   '<b>', '</b>',   [&mt('Selected  [_1]Incomplete Problems[_2] from folder [_3]' . $textSuffix,
   '<b><i>'. $sequenceTitle . '</b></i>'),        '<b>', '</b>',
       $printSelector,        '<b><i>'. $sequenceTitle . '</b></i>'),
       $nextState]);    $printSelector,
     $nextState]);
    }
         # Allow problems from sequence          # Allow problems from sequence
         push @{$printChoices},    if ($userCanPrint || &printable($map_open, $map_close)) {
     [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),       push @{$printChoices},
      'map_problems',       [&mt('Selected [_1]Problems[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),
        'map_problems',
      'CHOOSE_PROBLEMS'];       'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence      # Allow all resources from sequence
         push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),       push @{$printChoices}, [&mt('Selected [_1]Resources[_2] from folder [_3]','<b>','</b>','<b><i>'.$sequenceTitle.'</i></b>'),
  'map_problems_pages',       'map_problems_pages',
  'CHOOSE_PROBLEMS_HTML'];      'CHOOSE_PROBLEMS_HTML'];
         my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',      my $helperFragment = &generate_resource_chooser('CHOOSE_PROBLEMS',
  'Select Problem(s) to print',      'Select Problem(s) to print',
  'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',      'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1"',
  'RESOURCES',      'RESOURCES',
  'PAGESIZE',      'PAGESIZE',
  $map,      $map,
  $isProblem, '',      $isProblem, '',
  $symbFilter,      $symbFilter,
  $start_new_option);      $start_new_option);
  $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',      $helperFragment .= &generate_resource_chooser('CHOOSE_PROBLEMS_HTML',
       'Select Resource(s) to print',    'Select Resource(s) to print',
        'multichoice="1" toponly="1" addstatus="1" closeallpages="1"',    'multichoice="1" toponly="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',
       'RESOURCES',    'RESOURCES',
       'PAGESIZE',    'PAGESIZE',
       $map,    $map,
       $isNotMap, '',    $isNotMap, '',
       $symbFilter,    $symbFilter,
       $start_new_option);    $start_new_option);
   
  &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);      &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
    # problems and resources  in the entire course, optionally for selected students
    my $post_data = $helper->{VARS}->{'postdata'};
   
     # 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  &&      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:   # BZ 5209 - incomplete problems from entire course:
   
Line 3908  my $suffixXml = <<ALL_PROBLEMS; Line 4415  my $suffixXml = <<ALL_PROBLEMS;
       <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>        <student multichoice='1' variable="STUDENTS" nextstate="PRINT_FORMATTING" coursepersonnel="1"/>
   </state>    </state>
 ALL_PROBLEMS  ALL_PROBLEMS
          &Apache::lonxml::xmlparse($r, 'helper',            &Apache::lonxml::xmlparse($r, 'helper',
    &generate_resource_chooser('ALL_PROBLEMS',     &generate_resource_chooser('ALL_PROBLEMS',
       'SelectProblem(s) to print',        'Select Problem(s) to print',
       'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"',        'multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'PAGESIZE',        'PAGESIZE',
       '',        '',
Line 3920  ALL_PROBLEMS Line 4427  ALL_PROBLEMS
       $start_new_option) .        $start_new_option) .
    &generate_resource_chooser('ALL_RESOURCES',     &generate_resource_chooser('ALL_RESOURCES',
       'Select Resource(s) to print',        'Select Resource(s) to print',
       " toponly='0' multichoice='1' suppressEmptySequences='0' addstatus='1' closeallpages='1'",        'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',
       'RESOURCES',        'RESOURCES',
       'PAGESIZE',        'PAGESIZE',
       '',        '',
Line 3928  ALL_PROBLEMS Line 4435  ALL_PROBLEMS
       $start_new_option) .        $start_new_option) .
    &generate_resource_chooser('ALL_PROBLEMS_STUDENTS',     &generate_resource_chooser('ALL_PROBLEMS_STUDENTS',
       'Select Problem(s) to print',        'Select Problem(s) to print',
       'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1"',        'toponly="0" multichoice="1" suppressEmptySequences="0" addstatus="1" closeallpages="1" modallink="1"',
       'RESOURCES',        'RESOURCES',
       'STUDENTS1',        'STUDENTS1',
       '',        '',
Line 3951  ALL_PROBLEMS Line 4458  ALL_PROBLEMS
  'problems_for_anon_page', 'CHOOSE_ANON1_PAGE'];   'problems_for_anon_page', 'CHOOSE_ANON1_PAGE'];
     }      }
     push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]selected people[_5]',      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'];      'problems_for_students', 'CHOOSE_STUDENTS'];
     push @{$printChoices}, [&mt('Selected [_1]Problems[_2] from folder [_3] for [_4]CODEd assignments[_5]',      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'];      'problems_for_anon', 'CHOOSE_ANON1'];
  }   }
   
  my $randomly_ordered_warning =    my $randomly_ordered_warning =
             &get_randomly_ordered_warning($helper, $map);              &get_randomly_ordered_warning($helper, $map);
   
  # resource_selector will hold a few states that:   # resource_selector will hold a few states that:
Line 3972  ALL_PROBLEMS Line 4479  ALL_PROBLEMS
  #   #
  my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS',   my $resource_selector= &generate_resource_chooser('SELECT_PROBLEMS',
   'Select resources to print',    'Select resources to print',
   'multichoice="1" addstatus="1" closeallpages="1"',    'multichoice="1" addstatus="1" closeallpages="1" modallink="1" suppressNavmap="1"',
   'RESOURCES',     'RESOURCES',
   'PRINT_FORMATTING',    'PRINT_FORMATTING',
   $map,    $map,
   $isProblem, '', $symbFilter,    $isProblem, '', $symbFilter,
Line 3983  ALL_PROBLEMS Line 4490  ALL_PROBLEMS
                                                          'PRINT_FORMATTING').                                                           'PRINT_FORMATTING').
                                &generate_resource_chooser('CHOOSE_STUDENTS_PAGE',                                 &generate_resource_chooser('CHOOSE_STUDENTS_PAGE',
  'Select Problem(s) to print',   'Select Problem(s) to print',
  "multichoice='1' addstatus='1' closeallpages ='1'",   "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'",
  'RESOURCES',   'RESOURCES',
  'PRINT_FORMATTING',   'PRINT_FORMATTING',
  $url,   $url,
Line 4000  ALL_PROBLEMS Line 4507  ALL_PROBLEMS
     'student_sort',      'student_sort',
     'STUDENTS',      'STUDENTS',
     'CHOOSE_STUDENTS_PAGE'));      'CHOOSE_STUDENTS_PAGE'));
  &Apache::lonxml::xmlparse($r, 'helper',    &Apache::lonxml::xmlparse($r, 'helper',
   &generate_student_chooser('CHOOSE_STUDENTS',    &generate_student_chooser('CHOOSE_STUDENTS',
     'student_sort',      'student_sort',
     'STUDENTS',      'STUDENTS',
Line 4036  ALL_PROBLEMS Line 4543  ALL_PROBLEMS
     push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]);      push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]);
  }   }
  if (%codes_to_print) {   if (%codes_to_print) {
     $code_selection .='         $code_selection .='
     <message><b>Choose single CODE from list:</b></message>      <message><b>Choose single CODE from list:</b></message>
  <message></td><td></message>   <message></td><td></message>
  <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">   <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
Line 4050  ALL_PROBLEMS Line 4557  ALL_PROBLEMS
   
  }   }
   
         my @lines = &Apache::grades::get_scantronformat_file();          my @lines = &Apache::lonnet::get_scantronformat_file();
  my $codechoice='';   my $codechoice='';
  foreach my $line (@lines) {   foreach my $line (@lines) {
               next if (($line =~ /^\#/) || ($line eq ''));
     my ($name,$description,$code_type,$code_length)=      my ($name,$description,$code_type,$code_length)=
  (split(/:/,$line))[0,1,2,4];   (split(/:/,$line))[0,1,2,4];
     if ($code_length > 0 &&       if ($code_length > 0 &&
  $code_type =~/^(letter|number|-1)/) {   $code_type =~/^(letter|number|-1)/) {
  $codechoice.='<choice computer="'.$name.'">'.$description.'</choice>';   $codechoice.='<choice computer="'.$name.'">'.$description.'</choice>';
     }      }
Line 4063  ALL_PROBLEMS Line 4571  ALL_PROBLEMS
  if ($codechoice eq '') {   if ($codechoice eq '') {
     $codechoice='<choice computer="default">Default</choice>';      $codechoice='<choice computer="default">Default</choice>';
  }   }
  my $anon1 = &generate_code_selector($helper,    my $anon1 = &generate_code_selector($helper,
     'CHOOSE_ANON1',      'CHOOSE_ANON1',
     'SELECT_PROBLEMS',      'SELECT_PROBLEMS',
     $codechoice,      $codechoice,
     $code_selection,      $code_selection,
     $namechoice) . $resource_selector;      $namechoice) . $resource_selector;
       
       
         &Apache::lonxml::xmlparse($r, 'helper',$anon1);          &Apache::lonxml::xmlparse($r, 'helper',$anon1);
   
  my $anon_page = &generate_code_selector($helper,   my $anon_page = &generate_code_selector($helper,
Line 4081  ALL_PROBLEMS Line 4589  ALL_PROBLEMS
  $namechoice) .   $namechoice) .
  &generate_resource_chooser('SELECT_PROBLEMS_PAGE',   &generate_resource_chooser('SELECT_PROBLEMS_PAGE',
    'Select Problem(s) to print',     'Select Problem(s) to print',
    "multichoice='1' addstatus='1' closeallpages ='1'",     "multichoice='1' addstatus='1' closeallpages ='1' modallink='1'",
    'RESOURCES',     'RESOURCES',
    'PRINT_FORMATTING',     'PRINT_FORMATTING',
    $url,     $url,
Line 4097  ALL_PROBLEMS Line 4605  ALL_PROBLEMS
     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]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'];      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;   $resource_selector=<<RESOURCE_SELECTOR;
     <state name="SELECT_RESOURCES" title="Select Resources">      <state name="SELECT_RESOURCES" title="Select Resources">
     $randomly_ordered_warning      $randomly_ordered_warning
     <nextstate>PRINT_FORMATTING</nextstate>      <nextstate>PRINT_FORMATTING</nextstate>
     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>      <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">                closeallpages="1" modallink="1">
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
Line 4214  CHOOSE_ANON2 Line 4722  CHOOSE_ANON2
       <nextstate>PAGESIZE</nextstate>        <nextstate>PAGESIZE</nextstate>
       <filechoice>return '$subdir';</filechoice>        <filechoice>return '$subdir';</filechoice>
 CHOOSE_FROM_SUBDIR  CHOOSE_FROM_SUBDIR
           
         # this is broken up because I really want interpolation above,          # this is broken up because I really want interpolation above,
         # and I really DON'T want it below          # and I really DON'T want it below
         $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';          $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';
Line 4241  CHOOSE_FROM_SUBDIR Line 4749  CHOOSE_FROM_SUBDIR
     <message>Select the sequence to print resources from:</message>      <message>Select the sequence to print resources from:</message>
     <resource variable="SEQUENCE">      <resource variable="SEQUENCE">
       <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>        <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>
       <filterfunc>return \$res->is_sequence;</filterfunc>        <filterfunc>return &Apache::lonprintout::printable_sequence(\$res);</filterfunc>
       <valuefunc>return $urlValue;</valuefunc>        <valuefunc>return $urlValue;</valuefunc>
       <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);        <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);
  </choicefunc>   </choicefunc>
Line 4250  CHOOSE_FROM_SUBDIR Line 4758  CHOOSE_FROM_SUBDIR
   <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">    <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
     <message>(mark desired resources then click "next" button) <br /></message>      <message>(mark desired resources then click "next" button) <br /></message>
     <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"      <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1"
               closeallpages="1">                closeallpages="1" modallink="1" suppressNavmap="1">
       <nextstate>PAGESIZE</nextstate>        <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isNotMap</filterfunc>        <filterfunc>return $isNotMap</filterfunc>
       <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>        <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
Line 4261  CHOOSE_FROM_SUBDIR Line 4769  CHOOSE_FROM_SUBDIR
 CHOOSE_FROM_ANY_SEQUENCE  CHOOSE_FROM_ANY_SEQUENCE
 }  }
   
       my $numchoices = 0;
       if (ref($printChoices) eq 'ARRAY') {
           $numchoices = @{$printChoices};
       }
       # Early out if nothing to print
       if (!$numchoices) {
           $r->print(&Apache::loncommon::start_page('Printing Helper').
                     '<h2>'.&mt('Unable to determine print context').'</h2>'.
                     '<p>'.&mt('Please display a resource, and then click the "Print" button/icon').'</p>');
           my $prtspool=$r->dir_config('lonPrtDir');
           my $footer = &recently_generated($prtspool);
           $r->print($footer.&Apache::loncommon::end_page());
           return OK;
       }
   
     # Generate the first state, to select which resources get printed.      # Generate the first state, to select which resources get printed.
     Apache::lonhelper::state->new("START", "Select Printing Options:");      Apache::lonhelper::state->new("START", "Select Printing Options:");
       if (!$res_printable) {
           my $noprintmsg;
           if ($res_error) {
               $noprintmsg = &mt('Print availability for current resource could not be determined');
           } else {
               my $now = time;
               my $shownprintstart = &Apache::lonlocal::locallocaltime($res_printstartdate);
               my $shownprintend = &Apache::lonlocal::locallocaltime($res_printenddate);
               if (($res_printenddate) && ($res_printenddate < $now)) {
                   $noprintmsg = &mt('Printing for current resource no longer available (ended: [_1])',
                                     $shownprintend);
               } else {
                   if (($res_printstartdate) && ($res_printstartdate > $now)) {
                       if (($res_printenddate) && ($res_printenddate > $now) && ($res_printenddate > $res_printstartdate)) {
                           $noprintmsg = &mt('Printing for current resource is only possible between [_1] and [_2]',
                                             $shownprintstart,$shownprintend);
                       } elsif (!$res_printenddate) {
                           $noprintmsg = &mt('Printing for current resource will only be possible starting [_1]',
                                             $shownprintstart);
                       } else {
                           $noprintmsg = &mt('Printing for current resource is unavailable');
                       }
                   }
               }
           }
   
           if ($noprintmsg) {
               $paramHash = Apache::lonhelper::getParamHash();
               $paramHash->{MESSAGE_TEXT} =
                   '<p class="LC_info">'.$noprintmsg.'</p>';
               Apache::lonhelper::message->new();
           }
       }
       $paramHash = Apache::lonhelper::getParamHash();
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{MESSAGE_TEXT} = "";      $paramHash->{MESSAGE_TEXT} = "";
     Apache::lonhelper::message->new();      Apache::lonhelper::message->new();
Line 4286  CHOOSE_FROM_ANY_SEQUENCE Line 4843  CHOOSE_FROM_ANY_SEQUENCE
                     )                      )
         );          );
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'ANSWER_TYPE';      $paramHash->{'variable'} = 'ANSWER_TYPE';
  $helper->declareVar('ANSWER_TYPE');            $helper->declareVar('ANSWER_TYPE');
         $paramHash->{CHOICES} = [          $paramHash->{CHOICES} = [
                                    ['Without Answers', 'yes'],                                     ['Without Answers', 'yes'],
                                    ['With Answers', 'no'],                                     ['With Answers', 'no'],
Line 4305  CHOOSE_FROM_ANY_SEQUENCE Line 4862  CHOOSE_FROM_ANY_SEQUENCE
             &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size')));              &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size')));
             my $xmlfrag = << "FONT_SELECTION";              my $xmlfrag = << "FONT_SELECTION";
   
             
             <dropdown variable='fontsize' multichoice='0', allowempty='0'>              <dropdown variable='fontsize' multichoice='0' allowempty='0'>
             <defaultvalue>              <defaultvalue>
   return 'normalsize';    return 'normalsize';
             </defaultvalue>              </defaultvalue>
Line 4342  FONT_SELECTION Line 4899  FONT_SELECTION
             );              );
  }   }
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'LATEX_TYPE';      $paramHash->{'variable'} = 'LATEX_TYPE';
  $helper->declareVar('LATEX_TYPE');     $helper->declareVar('LATEX_TYPE');
  if ($helper->{VARS}->{'construction'} eq '1') {          if ($helper->{VARS}->{'construction'} eq '1') {
     $paramHash->{CHOICES} = [      $paramHash->{CHOICES} = [
      ['standard LaTeX mode', 'standard'],        ['standard LaTeX mode', 'standard'],
      ['LaTeX batchmode', 'batchmode'], ];       ['LaTeX batchmode', 'batchmode'], ];
  } else {   } else {
     $paramHash->{CHOICES} = [      $paramHash->{CHOICES} = [
Line 4354  FONT_SELECTION Line 4911  FONT_SELECTION
      ['standard LaTeX mode', 'standard'] ];       ['standard LaTeX mode', 'standard'] ];
  }   }
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
    
  &addMessage(&Apache::lonhtmlcommon::row_closure()   &addMessage(&Apache::lonhtmlcommon::row_closure()
                    .&Apache::lonhtmlcommon::row_title(                     .&Apache::lonhtmlcommon::row_title(
                         '<label for="TABLE_CONTENTS_forminput">'                          '<label for="TABLE_CONTENTS_forminput">'
Line 4363  FONT_SELECTION Line 4920  FONT_SELECTION
                     )                      )
         );          );
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'TABLE_CONTENTS';      $paramHash->{'variable'} = 'TABLE_CONTENTS';
  $helper->declareVar('TABLE_CONTENTS');            $helper->declareVar('TABLE_CONTENTS');
         $paramHash->{CHOICES} = [          $paramHash->{CHOICES} = [
                                    ['No', 'no'],                                     ['No', 'no'],
                                    ['Yes', 'yes'] ];                                     ['Yes', 'yes'] ];
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
  &addMessage(&Apache::lonhtmlcommon::row_closure());   &addMessage(&Apache::lonhtmlcommon::row_closure());
           
  if (not $helper->{VARS}->{'construction'}) {   if (not $helper->{VARS}->{'construction'}) {
     &addMessage(&Apache::lonhtmlcommon::row_title(      &addMessage(&Apache::lonhtmlcommon::row_title(
                             '<label for="TABLE_INDEX_forminput">'                              '<label for="TABLE_INDEX_forminput">'
Line 4379  FONT_SELECTION Line 4936  FONT_SELECTION
                         )                          )
             );              );
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'TABLE_INDEX';         $paramHash->{'variable'} = 'TABLE_INDEX';
     $helper->declareVar('TABLE_INDEX');               $helper->declareVar('TABLE_INDEX');
     $paramHash->{CHOICES} = [      $paramHash->{CHOICES} = [
      ['No', 'no'],       ['No', 'no'],
      ['Yes', 'yes'] ];       ['Yes', 'yes'] ];
Line 4393  FONT_SELECTION Line 4950  FONT_SELECTION
                         )                          )
             );              );
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';         $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';
     $helper->declareVar('PRINT_DISCUSSIONS');               $helper->declareVar('PRINT_DISCUSSIONS');
     $paramHash->{CHOICES} = [      $paramHash->{CHOICES} = [
      ['No', 'no'],       ['No', 'no'],
      ['Yes', 'yes'] ];       ['Yes', 'yes'] ];
Line 4428  FONT_SELECTION Line 4985  FONT_SELECTION
             &addMessage(&Apache::lonhtmlcommon::row_closure(1));              &addMessage(&Apache::lonhtmlcommon::row_closure(1));
  }   }
   
  if ($helper->{'VARS'}->{'construction'}) {    if ($helper->{'VARS'}->{'construction'}) {
     my $stylevalue='$Apache::lonnet::env{"construct.style"}';      my $stylevalue='$Apache::lonnet::env{"construct.style"}';
             my $randseedtext=&mt("Use random seed");              my $randseedtext=&mt("Use random seed");
             my $stylefiletext=&mt("Use style file");              my $stylefiletext=&mt("Use style file");
Line 4519  PROBTYPE Line 5076  PROBTYPE
     # If we're in the "final" state, bailout and return to handler      # If we're in the "final" state, bailout and return to handler
     if ($helper->{STATE} eq 'FINAL') {      if ($helper->{STATE} eq 'FINAL') {
         return $helper;          return $helper;
     }          }
   
     my $footer;      my $footer;
     if ($helper->{STATE} eq 'START') {      if ($helper->{STATE} eq 'START') {
         my $prtspool=$r->dir_config('lonPrtDir');           my $prtspool=$r->dir_config('lonPrtDir');
  $footer = &recently_generated($prtspool);   $footer = &recently_generated($prtspool);
     }      }
     $r->print($helper->display($footer));      $r->print($helper->display($footer));
Line 4543  package Apache::lonprintout::page_format Line 5100  package Apache::lonprintout::page_format
   
 See lonhelper.pm documentation for discussion of the helper framework.  See lonhelper.pm documentation for discussion of the helper framework.
   
 Apache::lonprintout::page_format_state is an element that gives the   Apache::lonprintout::page_format_state is an element that gives the
 user an opportunity to select the page layout they wish to print   user an opportunity to select the page layout they wish to print
 with: Number of columns, portrait/landscape, and paper size. If you   with: Number of columns, portrait/landscape, and paper size. If you
 want to change the paper size choices, change the @paperSize array   want to change the paper size choices, change the @paperSize array
 contents in this package.  contents in this package.
   
 page_format_state is always directly invoked in lonprintout.pm, so there  page_format_state is always directly invoked in lonprintout.pm, so there
Line 4570  use Apache::lonnet; Line 5127  use Apache::lonnet;
   
 my $maxColumns = 2;  my $maxColumns = 2;
 # it'd be nice if these all worked  # 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]",  #                 "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]" );  #                 "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]");   "a4 [210x297 mm]");
   
 # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |  # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |
 #                   Paper type  #                   Paper type
   
 sub new {   sub new {
     my $self = Apache::lonhelper::element->new();      my $self = Apache::lonhelper::element->new();
   
     shift;      shift;
Line 4602  sub render { Line 5159  sub render {
     my $PaperType=&mt('Paper type');      my $PaperType=&mt('Paper type');
     my $landscape=&mt('Landscape');      my $landscape=&mt('Landscape');
     my $portrait=&mt('Portrait');      my $portrait=&mt('Portrait');
     my $pdfFormLabel=&mt('PDF-Formfields');  
     my $with=&mt('with Formfields');  
     my $without=&mt('without Formfields');  
       
   
     $result.='<h3>'.&mt('Layout Options').'</h3>'      $result.='<h3>'.&mt('Layout Options').'</h3>'
             .&Apache::loncommon::start_data_table()              .&Apache::loncommon::start_data_table()
Line 4613  sub render { Line 5167  sub render {
             .'<th>'.$PageLayout.'</th>'              .'<th>'.$PageLayout.'</th>'
             .'<th>'.$NumberOfColumns.'</th>'              .'<th>'.$NumberOfColumns.'</th>'
             .'<th>'.$PaperType.'</th>'              .'<th>'.$PaperType.'</th>'
             .'<th>'.$pdfFormLabel.'</th>'  
             .&Apache::loncommon::end_data_table_header_row()              .&Apache::loncommon::end_data_table_header_row()
             .&Apache::loncommon::start_data_table_row()              .&Apache::loncommon::start_data_table_row()
     .'<td>'      .'<td>'
Line 4654  sub render { Line 5207  sub render {
     $result .= <<HTML;      $result .= <<HTML;
         </select>          </select>
     </td>      </td>
     <td align='center'>  
         <select name='${var}.pdfFormFields'>  
             <option selected="selected" value="no">$without</option>  
             <option value="yes">$with</option>  
         </select>  
     </td>  
 HTML  HTML
     $result.=&Apache::loncommon::end_data_table_row()      $result.=&Apache::loncommon::end_data_table_row()
             .&Apache::loncommon::end_data_table();              .&Apache::loncommon::end_data_table();
Line 4672  sub postprocess { Line 5219  sub postprocess {
   
     my $var = $self->{'variable'};      my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();      my $helper = Apache::lonhelper->getHelper();
     $helper->{VARS}->{$var} =       $helper->{VARS}->{$var} =
         $env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .          $env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .
         $env{"form.$var.paper"} . '|' . $env{"form.$var.pdfFormFields"};          $env{"form.$var.paper"} . '|' . $env{"form.$var.pdfFormFields"};
     return 1;      return 1;
Line 4688  package Apache::lonprintout::page_size_s Line 5235  package Apache::lonprintout::page_size_s
   
 See lonhelper.pm documentation for discussion of the helper framework.  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  user the opportunity to further refine the page settings if they
 select a single-column page.  select a single-column page.
   
Line 4711  use strict; Line 5258  use strict;
   
   
   
 sub new {   sub new {
     my $self = Apache::lonhelper::element->new();      my $self = Apache::lonhelper::element->new();
   
     shift; # disturbs me (probably prevents subclassing) but works (drops      shift; # disturbs me (probably prevents subclassing) but works (drops
Line 4721  sub new { Line 5268  sub new {
     my $helper = Apache::lonhelper::getHelper();      my $helper = Apache::lonhelper::getHelper();
     $helper->declareVar($self->{'variable'});      $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      # $helper->{VARS} to figure out whether the columns are one or two
     $self->{'formatvar'} = shift;      $self->{'formatvar'} = shift;
   
Line 4761  sub render { Line 5308  sub render {
      $size{'height_and_units'},       $size{'height_and_units'},
      $size{'margin_and_units'})=       $size{'margin_and_units'})=
  &Apache::lonprintout::page_format($papersize, $laystyle, $cols);   &Apache::lonprintout::page_format($papersize, $laystyle, $cols);
       
     foreach my $dimension ('width','height','margin') {      foreach my $dimension ('width','height','margin') {
  ($size{$dimension},$size{$dimension.'_unit'}) =   ($size{$dimension},$size{$dimension.'_unit'}) =
     split(/ +/, $size{$dimension.'_and_units'},2);      split(/ +/, $size{$dimension.'_and_units'},2);
Line 4846  sub preprocess { Line 5393  sub preprocess {
   
  foreach my $dim ('width', 'height', 'lmargin') {   foreach my $dim ('width', 'height', 'lmargin') {
     my ($value, $units) = split(/ /, $size{$dim});      my ($value, $units) = split(/ /, $size{$dim});
           
     $helper->{VARS}->{"$var.".$dim}      = $value;      $helper->{VARS}->{"$var.".$dim}      = $value;
     $helper->{VARS}->{"$var.".$dim.'unit'} = $units;      $helper->{VARS}->{"$var.".$dim.'unit'} = $units;
       
  }   }
   
   
Line 4857  sub preprocess { Line 5404  sub preprocess {
   
  $helper->changeState($self->{NEXTSTATE});   $helper->changeState($self->{NEXTSTATE});
     }      }
      
     return 1;      return 1;
 }  }
   
Line 4866  sub postprocess { Line 5413  sub postprocess {
   
     my $var = $self->{'variable'};      my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();      my $helper = Apache::lonhelper->getHelper();
     my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"};       my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"};
     my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"};       my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"};
     my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"};       my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"};
     $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"};       $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"};
     $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"};       $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"};
     $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"};       $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"};
   
     my $error = '';      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      # by an optional period, followed by digits, ending the string
   
     if ($width !~  /^-?[0-9]*(\.[0-9]*)?$/) {      if ($width !~  /^-?[0-9]*(\.[0-9]*)?$/) {
Line 4905  sub postprocess { Line 5452  sub postprocess {
     }      }
 }  }
   
   
   
 __END__  __END__
   

Removed from v.1.607  
changed lines
  Added in v.1.627.2.38


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>