Diff for /loncom/interface/lonprintout.pm between versions 1.386 and 1.445

version 1.386, 2005/08/16 10:25:15 version 1.445, 2006/06/26 21:53:36
Line 1 Line 1
 #  The LearningOnline Network  # The LearningOnline Network
 # Printout  # Printout
 #  #
 # $Id$  # $Id$
Line 41  use Apache::lonnavmaps; Line 41  use Apache::lonnavmaps;
 use Apache::lonratedt;  use Apache::lonratedt;
 use POSIX qw(strftime);  use POSIX qw(strftime);
 use Apache::lonlocal;  use Apache::lonlocal;
   use Carp;
   use lib '/home/httpd/lib/perl/';
   use LONCAPA;
   
 my $resources_printed = '';  my %perm;
   
 #  #
 #   Convert a numeric code to letters  #   Convert a numeric code to letters
Line 87  sub letters_to_num { Line 90  sub letters_to_num {
 sub is_valid_numeric_code {  sub is_valid_numeric_code {
     my ($value, $num_digits) = @_;      my ($value, $num_digits) = @_;
     #   Remove leading/trailing whitespace;      #   Remove leading/trailing whitespace;
     $value =~ s/^\s*//;      $value =~ s/^\s*//g;
     $value =~ s/\s*$//;      $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";
     }      }
     if (length($value) != $num_digits) {      if (length($value) != $num_digits) {
Line 226  sub latex_header_footer_remove { Line 229  sub latex_header_footer_remove {
     $text =~ s/\\documentclass([^&]*)\\begin{document}//;      $text =~ s/\\documentclass([^&]*)\\begin{document}//;
     return $text;      return $text;
 }  }
   #
   #  If necessary, encapsulate text inside 
   #  a minipage env.
   #  necessity is determined by the problem_split param.
   #
   sub encapsulate_minipage {
       my ($text) = @_;
       if (!($env{'form.problem.split'} =~ /yes/i)) {
    $text = '\begin{minipage}{\textwidth}'.$text.'\end{minipage}';
       }
       return $text;
   }
   #
   #  The NUMBER_TO_PRINT and SPLIT_PDFS
   #  variables interact, this sub looks at these two parameters
   #  and comes up with a final value for NUMBER_TO_PRINT which can be:
   #     all     - if SPLIT_PDFS eq 'all'.
   #     1       - if SPLIT_PDFS eq 'oneper'
   #     section - if SPLIT_PDFS eq 'sections'
   #     <unchanged> - if SPLIT_PDFS eq 'usenumber'
   #
   sub adjust_number_to_print {
       my $helper = shift;
   
       my $split_pdf = $helper->{'VARS'}->{'SPLIT_PDFS'};
       
       if ($split_pdf eq 'all') {
    $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'all';
       } elsif ($split_pdf eq 'oneper') {
    $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 1;
       } elsif ($split_pdf eq 'sections') {
    $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = 'section';
       } elsif ($split_pdf eq 'usenumber') {
    #  Unmodified.
       } else {
    # Error!!!!
   
    croak "bad SPLIT_PDFS: $split_pdf in lonprintout::adjust_number_to_print";
       }
   }
   
 sub character_chart {  sub character_chart {
     my $result = shift;      my $result = shift;
Line 433  sub character_chart { Line 475  sub character_chart {
     $result =~ s/&(\#252|uuml);/\\\"{u}/g;      $result =~ s/&(\#252|uuml);/\\\"{u}/g;
     $result =~ s/&(\#253|yacute);/\\\'{y}/g;      $result =~ s/&(\#253|yacute);/\\\'{y}/g;
     $result =~ s/&(\#255|yuml);/\\\"{y}/g;      $result =~ s/&(\#255|yuml);/\\\"{y}/g;
       $result =~ s/&\#295;/\\ensuremath\{\\hbar\}/g;
     $result =~ s/&\#952;/\\ensuremath\{\\theta\}/g;      $result =~ s/&\#952;/\\ensuremath\{\\theta\}/g;
 #Greek Alphabet  #Greek Alphabet
     $result =~ s/&(alpha|\#945);/\\ensuremath\{\\alpha\}/g;      $result =~ s/&(alpha|\#945);/\\ensuremath\{\\alpha\}/g;
Line 508  sub character_chart { Line 551  sub character_chart {
     $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g;      $result =~ s/&(prod|\#8719);/\\ensuremath\{\\prod\}/g;
     $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g;      $result =~ s/&(sum|\#8721);/\\ensuremath\{\\sum\}/g;
     $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g;      $result =~ s/&(minus|\#8722);/\\ensuremath\{-\}/g;
       $result =~ s/–/\\ensuremath\{-\}/g;
     $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g;      $result =~ s/&(lowast|\#8727);/\\ensuremath\{*\}/g;
     $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g;      $result =~ s/&(radic|\#8730);/\\ensuremath\{\\surd\}/g;
     $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g;      $result =~ s/&(prop|\#8733);/\\ensuremath\{\\propto\}/g;
Line 658  sub get_name { Line 702  sub get_name {
     if (!defined($udom)) { $udom=$env{'user.domain'}; }      if (!defined($udom)) { $udom=$env{'user.domain'}; }
     my $plainname=&Apache::loncommon::plainname($uname,$udom);      my $plainname=&Apache::loncommon::plainname($uname,$udom);
     if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; }      if ($plainname=~/^\s*$/) { $plainname=$uname.'@'.$udom; }
     $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header');     #  $plainname=&Apache::lonxml::latex_special_symbols($plainname,'header');
       $plainname = &escape_LaTeX($plainname);
     return $plainname;      return $plainname;
 }  }
   
 sub get_course {  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(&Apache::lonnet::unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');   $courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
Line 748  sub details_for_menu { Line 793  sub details_for_menu {
   
   
 sub latex_corrections {  sub latex_corrections {
       my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_;
     my ($number_of_columns,$result,$selectionmade) = @_;  
   
 #    $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;  #    $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;
     $result =~ s/\$number_of_columns/$number_of_columns/g;      $result =~ s/\$number_of_columns/$number_of_columns/g;
     if ($selectionmade ne '1') {      if ($selectionmade eq '1' || $answer_mode eq 'only') {
  $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License  $1/;   $result =~ s/(\\end{document})/\\strut\\vskip 0 mm\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License  $1/;
     } else {      } else {
  $result =~ s/(\\end{document})/\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License  $1/;   $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License  $1/;
     }      }
     $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;
Line 780  sub latex_corrections { Line 823  sub latex_corrections {
     }      }
     $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 815  sub IndexCreation { Line 857  sub IndexCreation {
   
 sub print_latex_header {  sub print_latex_header {
     my $mode=shift;      my $mode=shift;
     my $output='\documentclass[letterpaper]{article}';      my $output='\documentclass[letterpaper,twoside]{article}';
     if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) {      if (($mode eq 'batchmode') || (!$perm{'pav'})) {
  $output.='\batchmode';   $output.='\batchmode';
     }      }
     $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".      $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".
          '\usepackage{multirow}'."\n".
      '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".       '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".
      '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".       '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".
        '\usepackage{wrapfig}'.
      '\usepackage{picins}\usepackage{calc}'."\n".       '\usepackage{picins}\usepackage{calc}'."\n".
      '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".       '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".
      '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".       '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".
Line 841  sub print_latex_header { Line 885  sub print_latex_header {
   
 sub path_to_problem {  sub path_to_problem {
     my ($urlp,$colwidth)=@_;      my ($urlp,$colwidth)=@_;
       $urlp=&Apache::lonnet::clutter($urlp);
   
     my $newurlp = '';      my $newurlp = '';
     $colwidth=~s/\s*mm\s*$//;      $colwidth=~s/\s*mm\s*$//;
 #characters average about 2 mm in width  #characters average about 2 mm in width
     if (length($urlp)*2 > $colwidth) {      if (length($urlp)*2 > $colwidth) {
  my @elements = split '/',$urlp;   my @elements = split('/',$urlp);
  my $curlength=0;   my $curlength=0;
  foreach my $element (@elements) {   foreach my $element (@elements) {
       if ($element eq '') { next; }
     if ($curlength+(length($element)*2) > $colwidth) {      if ($curlength+(length($element)*2) > $colwidth) {
  $newurlp .=  '|\vskip -1 mm \noindent \verb|';   $newurlp .=  '|\vskip -1 mm \verb|';
  $curlength=0;   $curlength=length($element)*2;
     } else {      } else {
  $curlength+=length($element)*2;   $curlength+=length($element)*2;
     }      }
Line 889  sub get_textwidth { Line 936  sub get_textwidth {
   
   
 sub unsupported {  sub unsupported {
     my ($currentURL,$mode)=@_;      my ($currentURL,$mode,$symb)=@_;
     if ($mode ne '') {$mode='\\'.$mode}      if ($mode ne '') {$mode='\\'.$mode}
     my $result.= &print_latex_header($mode);      my $result.= &print_latex_header($mode);
     if ($currentURL=~/\/ext\//) {      if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {
  $result.=' \strut \\\\ THIS IS EXTERNAL RESOURCE WITH URL \strut \\\\ '.$currentURL.' ';   $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;
    my $title=&Apache::lonnet::gettitle($symb);
    $title = &Apache::lonxml::latex_special_symbols($title);
    $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' ';
     } else {      } else {
  $result.=$currentURL;   $result.=$currentURL;
     }      }
Line 903  sub unsupported { Line 953  sub unsupported {
   
   
 #  #
   # List of recently generated print files
   #
   sub recently_generated {
       my $r=shift;
       my $prtspool=$r->dir_config('lonPrtDir');
       my $zip_result;
       my $pdf_result;
       opendir(DIR,$prtspool);
   
       my @files = 
    grep(/^$env{'user.name'}_$env{'user.domain'}_printout_(\d+)_.*\.(pdf|zip)$/,readdir(DIR));
       closedir(DIR);
   
       @files = sort {
    my ($actime) = (stat($prtspool.'/'.$a))[10];
    my ($bctime) = (stat($prtspool.'/'.$b))[10];
    return $bctime <=> $actime;
       } (@files);
   
       foreach my $filename (@files) {
    my ($ext) = ($filename =~ m/(pdf|zip)$/);
    my ($cdev,$cino,$cmode,$cnlink,
       $cuid,$cgid,$crdev,$csize,
       $catime,$cmtime,$cctime,
       $cblksize,$cblocks)=stat($prtspool.'/'.$filename);
    my $result="<a href='/prtspool/$filename'>".
       &mt('Generated [_1] ([_2] bytes)',
    &Apache::lonlocal::locallocaltime($cctime),$csize).
    '</a><br />';
    if ($ext eq 'pdf') { $pdf_result .= $result; }
    if ($ext eq 'zip') { $zip_result .= $result; }
       }
       if ($zip_result) {
    $r->print('<h4>'.&mt('Recently generated printout zip files')."</h4>\n"
     .$zip_result);
       }
       if ($pdf_result) {
    $r->print('<h4>'.&mt('Recently generated printouts')."</h4>\n"
     .$pdf_result);
       }
   }
   
   #
 #   Retrieve the hash of page breaks.  #   Retrieve the hash of page breaks.
 #  #
 #  Inputs:  #  Inputs:
Line 911  sub unsupported { Line 1004  sub unsupported {
 #    A reference to a page break hash.  #    A reference to a page break hash.
 #  #
 #  #
   #use Data::Dumper;
   #sub dump_helper_vars {
   #    my ($helper) = @_;
   #    my $helpervars = Dumper($helper->{'VARS'});
   #    &Apache::lonnet::logthis("Dump of helper vars:\n $helpervars");
   #}
   
 sub get_page_breaks  {  sub get_page_breaks  {
     my ($helper) = @_;      my ($helper) = @_;
     my %page_breaks;      my %page_breaks;
       
     foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) {      foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) {
  $page_breaks{$break} = 1;   $page_breaks{$break} = 1;
     }      }
       
     return %page_breaks;      return %page_breaks;
 }  }
   
 sub output_data {  sub output_data {
     my ($r,$helper,$rparmhash) = @_;      my ($r,$helper,$rparmhash) = @_;
     my %parmhash = %$rparmhash;      my %parmhash = %$rparmhash;
     my $html=&Apache::lonxml::xmlbegin();      my $resources_printed = '';
     my $bodytag=&Apache::loncommon::bodytag('Preparing Printout');      my $js = <<ENDPART;
     $r->print(<<ENDPART);  <script type="text/javascript">
 $html  
 <head>  
 <script type="text/javascript" language="Javascript">  
     var editbrowser;      var editbrowser;
     function openbrowser(formname,elementname,only,omit) {      function openbrowser(formname,elementname,only,omit) {
         var url = '/res/?';          var url = '/res/?';
Line 955  $html Line 1050  $html
         editbrowser.focus();          editbrowser.focus();
     }      }
 </script>  </script>
 <title>LON-CAPA output for printing</title>  
 </head>  
 $bodytag  
 Please stand by while processing your print request, this may take some time ...  
 ENDPART  ENDPART
   
       my $start_page  = &Apache::loncommon::start_page('Preparing Printout',$js);
       my $msg = &mt('Please stand by while processing your print request, this may take some time ...');
   
       $r->print($start_page."\n<p>\n$msg\n</p>\n");
   
     # fetch the pagebreaks and store them in the course environment      # fetch the pagebreaks and store them in the course environment
     # The page breaks will be pulled into the hash %page_breaks which is      # The page breaks will be pulled into the hash %page_breaks which is
Line 1026  ENDPART Line 1120  ENDPART
     $cleanURL=$currentURL;      $cleanURL=$currentURL;
  }   }
  $selectionmade = 1;   $selectionmade = 1;
  if ($cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {   if ($cleanURL!~m|^/adm/|
       && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
     my $rndseed=time;      my $rndseed=time;
     my $texversion='';      my $texversion='';
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
Line 1049  ENDPART Line 1144  ENDPART
  }   }
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
  &Apache::lonnet::appenv(%moreenv);   &Apache::lonnet::appenv(%moreenv);
  &Apache::lonnet::delenv('form.counter');  
  &Apache::lonxml::init_counter();   &Apache::lonxml::clear_problem_counter();
   
  $resources_printed .= $currentURL.':';   $resources_printed .= $currentURL.':';
  $texversion.=&Apache::lonnet::ssi($currentURL,%form);   $texversion.=&Apache::lonnet::ssi($currentURL,%form);
  &Apache::lonnet::delenv('form.counter');  
    &Apache::lonxml::clear_problem_counter();
   
  &Apache::lonnet::delenv('request.filename');   &Apache::lonnet::delenv('request.filename');
     }      }
       # current document with answers.. no need to encap in minipage
       #  since there's only one answer.
   
     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')) {
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'grade_target'}='answer';   $form{'grade_target'}='answer';
  $form{'answer_output_mode'}='tex';   $form{'answer_output_mode'}='tex';
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
                   if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {
       $form{'problemtype'}='exam';
    }
  $resources_printed .= $currentURL.':';   $resources_printed .= $currentURL.':';
  my $answer=&Apache::lonnet::ssi($currentURL,%form);   my $answer=&Apache::lonnet::ssi($currentURL,%form);
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
Line 1091  ENDPART Line 1195  ENDPART
     if ($currentURL=~m/\.page\s*$/) {      if ($currentURL=~m/\.page\s*$/) {
  ($result,$number_of_columns) = &page_cleanup($result);   ($result,$number_of_columns) = &page_cleanup($result);
     }      }
         } elsif ($currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') {          } elsif ($cleanURL!~m|^/adm/|
    && $currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') {
             #printing content of sequence from the construction space              #printing content of sequence from the construction space
     my $flag_latex_header_remove = 'NO';       my $flag_latex_header_remove = 'NO'; 
     my $rndseed=time;      my $rndseed=time;
Line 1128  ENDPART Line 1233  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 {
       # If necessary, encapsulate answer in minipage:
   
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';      my $body ='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
     $texversion.=&path_to_problem ($currentURL,$LaTeXwidth);      $body.=&path_to_problem($urlp,$LaTeXwidth);
     $texversion.='\vskip 1 mm '.$answer.'\end{document}';      $body.='\vskip 1 mm '.$answer.'\end{document}';
       $body = &encapsulate_minipage($body);
       $texversion.=$body;
  }   }
     }      }
     if ($flag_latex_header_remove ne 'NO') {      if ($flag_latex_header_remove ne 'NO') {
Line 1160  ENDPART Line 1269  ENDPART
  my $texversion=&Apache::lonnet::ssi($currentURL,%form);   my $texversion=&Apache::lonnet::ssi($currentURL,%form);
  $result .= $texversion;   $result .= $texversion;
  } else {   } else {
     $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'});      $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
     $helper->{'VARS'}->{'symb'});
  }   }
     } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems')       or      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems')       or
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or               ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or
Line 1188  ENDPART Line 1298  ENDPART
  my $flag_page_in_sequence = 'NO';   my $flag_page_in_sequence = 'NO';
  my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};   my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
  my $prevassignment='';   my $prevassignment='';
  &Apache::lonnet::delenv('form.counter');  
  &Apache::lonxml::init_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++) {
   
     # Note due to document structure, not allowed to put \newpage      # Note due to document structure, not allowed to put \newpage
Line 1200  ENDPART Line 1312  ENDPART
     $result.="\\newpage\n";      $result.="\\newpage\n";
  }   }
     }      }
     my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);      my ($sequence,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
     $urlp=&Apache::lonnet::clutter($urlp);      $urlp=&Apache::lonnet::clutter($urlp);
     $form{'symb'}=$master_seq[$i];      $form{'symb'}=$master_seq[$i];
     my ($sequence)=&Apache::lonnet::decode_symb($master_seq[$i]);  
     my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #tittle of the assignment which contains this problem      my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem
     if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}      if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;}
     if ($i==0) {$prevassignment=$assignment;}      if ($i==0) {$prevassignment=$assignment;}
     my $texversion='';      my $texversion='';
     if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {      if ($urlp!~m|^/adm/|
    && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
  $resources_printed .= $urlp.':';   $resources_printed .= $urlp.':';
   
    &Apache::lonxml::remember_problem_counter();
  $texversion.=&Apache::lonnet::ssi($urlp,%form);   $texversion.=&Apache::lonnet::ssi($urlp,%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);
Line 1217  ENDPART Line 1332  ENDPART
     $texversion =~ s/\\end{document}\d*/\\end{document}/;      $texversion =~ s/\\end{document}\d*/\\end{document}/;
     $flag_page_in_sequence = 'YES';      $flag_page_in_sequence = 'YES';
  }    } 
  my $lonidsdir=$r->dir_config('lonIDsDir');  
  my $envfile=$env{'user.environment'};  
  $envfile=~/\/([^\/]+)\.id$/;  
  $envfile=$1;  
  &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);  
  my $current_counter=$env{'form.counter'};  
  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')) {
     #  Don't permanently pervert the %form hash      #  Don't permanently pervert the %form hash
Line 1230  ENDPART Line 1340  ENDPART
     $answerform{'grade_target'}='answer';      $answerform{'grade_target'}='answer';
     $answerform{'answer_output_mode'}='tex';      $answerform{'answer_output_mode'}='tex';
     $resources_printed .= $urlp.':';      $resources_printed .= $urlp.':';
   
       &Apache::lonxml::restore_problem_counter();
     my $answer=&Apache::lonnet::ssi($urlp,%answerform);      my $answer=&Apache::lonnet::ssi($urlp,%answerform);
     &Apache::lonnet::appenv(('form.counter' => $current_counter));  
     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 ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {   if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($urlp).'}\vskip 0 mm ';      my $body ='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($master_seq[$i]).'}\vskip 0 mm ';
     $texversion.=&path_to_problem ($urlp,$LaTeXwidth);      $body   .= &path_to_problem ($urlp,$LaTeXwidth);
     $texversion.='\vskip 1 mm '.$answer;      $body   .='\vskip 1 mm '.$answer;
       $body    = &encapsulate_minipage($body);
       $texversion .= $body;
  } else {   } else {
     $texversion='';      $texversion='';
  }   }
Line 1258  ENDPART Line 1372  ENDPART
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }      if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     $prevassignment=$assignment;      $prevassignment=$assignment;
     $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm ';      if ($numberofcolumns eq '1') {
    $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm ';
       } else {
    $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\fancyhead[LO]{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm ';
       }
  }   }
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';      $flag_latex_header_remove = 'YES';   
Line 1275  ENDPART Line 1393  ENDPART
  $result .= $texversion;   $result .= $texversion;
  $flag_latex_header_remove = 'YES';    $flag_latex_header_remove = 'YES'; 
     } else {      } else {
  $texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'});   $texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'},
    $master_seq[$i]);
  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 {
Line 1286  ENDPART Line 1405  ENDPART
     }          }    
     if (&Apache::loncommon::connection_aborted($r)) { last; }      if (&Apache::loncommon::connection_aborted($r)) { last; }
  }   }
  &Apache::lonnet::delenv('form.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}/;
  }   }
Line 1311  ENDPART Line 1430  ENDPART
  #    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 
    #  1 section per pdf...so that setting overrides.
  #      #   
  if ($helper->{'VARS'}->{'student_sort'}    eq 1) {   if (($helper->{'VARS'}->{'student_sort'}    eq 1)  && 
        ($helper->{'VARS'}->{'SPLIT_PDFS'} ne "sections")) {
      @students = sort compare_names  @students;       @students = sort compare_names  @students;
  }   }
    &adjust_number_to_print($helper);
   
          if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq '0' ||           if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq '0' ||
      $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 
    # to remember that in split_on_sections and 
    # print all of the students in the list.
    #
    my $split_on_sections = 0;
    if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'section') {
        $split_on_sections = 1;
        $helper->{'VARS'}->{'NUMBER_TO_PRINT'} = $#students+1;
    }
  my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};   my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
   
  #loop over students   #loop over students
Line 1332  ENDPART Line 1465  ENDPART
  if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$moreenv{'problem_split'}='yes';}   if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq '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,'Print Status','Class Print Status',$#students+1,'inline','75');
  my $student_counter=-1;   my $student_counter=-1;
    my $i = 0;
    my $last_section = (split(/:/,$students[0]))[2];
  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";
Line 1340  ENDPART Line 1475  ENDPART
  print $temp_file "1969\n";   print $temp_file "1969\n";
      }       }
      $student_counter++;       $student_counter++;
      my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});       if ($split_on_sections) {
    my $this_section = (split(/:/,$person))[2];
    if ($this_section ne $last_section) {
        $i++;
        $last_section = $this_section;
    }
        } else {
    $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
        }
      my ($output,$fullname, $printed)=&print_resources($r,$helper,       my ($output,$fullname, $printed)=&print_resources($r,$helper,
      $person,$type,       $person,$type,
      \%moreenv,\@master_seq,       \%moreenv,\@master_seq,
Line 1363  ENDPART Line 1506  ENDPART
  my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};   my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};
  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 $code_option=$helper->{'VARS'}->{'CODE_OPTION'};   my $code_option=$helper->{'VARS'}->{'CODE_OPTION'};
  open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');   open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
  my ($code_type,$code_length)=('letter',6);   my ($code_type,$code_length)=('letter',6);
Line 1375  ENDPART Line 1520  ENDPART
  }   }
  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{'instructor_comments'}='hide';
  my $seed=time+($$<<16)+($$);   my $seed=time+($$<<16)+($$);
  my @allcodes;   my @allcodes;
  if ($old_name) {   if ($old_name) {
Line 1384  ENDPART Line 1530  ENDPART
      $code_type=$result{"type\0$old_name"};       $code_type=$result{"type\0$old_name"};
      @allcodes=split(',',$result{$old_name});       @allcodes=split(',',$result{$old_name});
      $num_todo=scalar(@allcodes);       $num_todo=scalar(@allcodes);
    } elsif ($selected_code) { # Selection value is always numeric.
        $num_todo = 1;
        @allcodes = ($selected_code);
  } elsif ($single_code) {   } elsif ($single_code) {
   
        $num_todo    = 1; # Unconditionally one code to do.
      # If an alpha code have to convert to numbers so it can be       # If an alpha code have to convert to numbers so it can be
      # converted back to letters again :-)       # converted back to letters again :-)
      #       #
      if ($code_type ne 'number') {       if ($code_type ne 'number') {
  $single_code = &letters_to_num($single_code);   $single_code = &letters_to_num($single_code);
  $num_todo    = 1;  
      }       }
      @allcodes = ($single_code);       @allcodes = ($single_code);
  } else {   } else {
Line 1516  ENDPART Line 1665  ENDPART
     }      }
 #-------------------------------------------------------- corrections for the different page formats  #-------------------------------------------------------- corrections for the different page formats
     $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade);      $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade);
     $result = &latex_corrections($number_of_columns,$result,$selectionmade);      $result = &latex_corrections($number_of_columns,$result,$selectionmade,
     for (my $i=1;$i<=$#print_array;$i++) {$print_array[$i] = &latex_corrections($number_of_columns,$print_array[$i],$selectionmade);}   $helper->{'VARS'}->{'ANSWER_TYPE'});
     #changes page's parameters for the one column output       for (my $i=1;$i<=$#print_array;$i++) {
     if ($numberofcolumns == 1) {   $print_array[$i] = 
  $result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /;      &latex_corrections($number_of_columns,$print_array[$i],
  $result =~ s/\\textheight\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /;         $selectionmade, 
  $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;         $helper->{'VARS'}->{'ANSWER_TYPE'});
  $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;  
     }      }
   
       $result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /;
       $result =~ s/\\textheight\s*=?\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /;
       $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
       $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /;
   
   
 #-- writing .tex file in prtspool   #-- 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();
Line 1580  ENDPART Line 1734  ENDPART
     my $URLback=''; #link to original document      my $URLback=''; #link to original document
     if ($helper->{'VARS'}->{'construction'} ne '1') {      if ($helper->{'VARS'}->{'construction'} ne '1') {
  #prints published resource   #prints published resource
  $URLback=&Apache::lonnet::escape('/adm/flip?postdata=return:');   $URLback=&escape('/adm/flip?postdata=return:');
     } else {      } else {
  #prints resource from the construction space   #prints resource from the construction space
  $URLback='/'.$helper->{'VARS'}->{'filename'};   $URLback='/'.$helper->{'VARS'}->{'filename'};
Line 1600  ENDPART Line 1754  ENDPART
                             'cgi.'.$identifier.'.selection' => $selectionmade,                              'cgi.'.$identifier.'.selection' => $selectionmade,
     'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},      'cgi.'.$identifier.'.tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'},
     'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},      'cgi.'.$identifier.'.tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'},
     'cgi.'.$identifier.'.role' => $env{'request.role.adv'},      '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' => $URLback,);
Line 1610  ENDPART Line 1764  ENDPART
     "cgi.$identifier.coursedom" => $cdom,       "cgi.$identifier.coursedom" => $cdom, 
     "cgi.$identifier.resources" => $resources_printed);      "cgi.$identifier.resources" => $resources_printed);
   
 $r->print(<<FINALEND);      my $end_page = &Apache::loncommon::end_page();
       $r->print(<<FINALEND);
 <br />  <br />
 <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />  <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />
 <a href="/cgi-bin/printout.pl?$identifier">Continue</a>  <a href="/cgi-bin/printout.pl?$identifier">Continue</a>
 </body>  $end_page
 </html>  
 FINALEND  FINALEND
 }  }
   
Line 1625  sub get_CODE { Line 1779  sub get_CODE {
     my $max='1'.'0'x$size;      my $max='1'.'0'x$size;
     my $newcode;      my $newcode;
     while(1) {      while(1) {
  $newcode=sprintf("%06d",int(rand($max)));   $newcode=sprintf("%0".$size."d",int(rand($max)));
  if (!exists($$all_codes{$newcode})) {   if (!exists($$all_codes{$newcode})) {
     $$all_codes{$newcode}=1;      $$all_codes{$newcode}=1;
     if ($type eq 'number' ) {      if ($type eq 'number' ) {
Line 1649  sub print_resources { Line 1803  sub print_resources {
  $namepostfix="\\\\Name: ";   $namepostfix="\\\\Name: ";
  $fullname = "CODE - ".$moreenv->{'CODE'};   $fullname = "CODE - ".$moreenv->{'CODE'};
     }      }
       #  Fullname may have special latex characters that need \ prefixing:
       #
       &Apache::lonnet::logthis("Prior to latex escape: $fullname");
   #    $fullname = &escape_LaTeX($fullname);
       &Apache::lonnet::logthis("After escape $fullname");
   
     my $i           = 0;      my $i           = 0;
     #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::lonnet::delenv('form.counter');  
     &Apache::lonxml::init_counter();  
   
       &Apache::lonxml::clear_problem_counter();
     my %page_breaks  = &get_page_breaks($helper);      my %page_breaks  = &get_page_breaks($helper);
       my @format_array = split(/\|/,$helper->{'VARS'}->{'FORMAT'});
       my $columns_in_format = $format_array[1];
       #
       #   end each student with a 
       #   Special that allows the post processor to even out the page
       #   counts later.  Nasty problem this... it would be really
       #   nice to put the special in as a postscript comment
       #   e.g. \special{ps:\ENDOFSTUDENTSTAMP}  unfortunately,
       #   The special gets passed the \ and dvips puts it in the output file
       #   so we will just rely on prntout.pl to strip  ENDOFSTUDENTSTAMP from the
       #   postscript.  Each ENDOFSTUDENTSTAMP will go on a line by itself.
       #
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
  if (defined $page_breaks{$curresline}) {   if (defined $page_breaks{$curresline}) {
Line 1668  sub print_resources { Line 1839  sub print_resources {
        ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) {         ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) {
     my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);      my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);
     if (&Apache::lonnet::allowed('bre',$res_url)) {      if (&Apache::lonnet::allowed('bre',$res_url)) {
  if ($res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {   if ($res_url!~m|^ext/|
       && $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
     $printed .= $curresline.':';      $printed .= $curresline.':';
   
       &Apache::lonxml::remember_problem_counter();    
   
     my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);      my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
     my $lonidsdir=$r->dir_config('lonIDsDir');  
     my $envfile=$env{'user.environment'};  
     $envfile=~/\/([^\/]+)\.id$/;  
     $envfile=$1;  
     &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);  
     my $current_counter=$env{'form.counter'};  
     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')) {
  #   Use a copy of the hash so we don't pervert it on future loop passes.   #   Use a copy of the hash so we don't pervert it on future loop passes.
  my %answerenv = %{$moreenv};   my %answerenv = %{$moreenv};
  $answerenv{'answer_output_mode'}='tex';   $answerenv{'answer_output_mode'}='tex';
  $answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
   
    &Apache::lonxml::restore_problem_counter();
   
  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);
  &Apache::lonnet::appenv(('form.counter' => $current_counter));  
  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 {
     $rendered=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});  
     $rendered.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm ';      
     $rendered.=&path_to_problem ($curresline,$LaTeXwidth);      my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     $rendered.='\vskip 1 mm '.$ansrendered;      my $body   ='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm ';
       $body     .=&path_to_problem($res_url,$LaTeXwidth);    
       $body     .='\vskip 1 mm '.$ansrendered;
       $body     = &encapsulate_minipage($body);
       $rendered = $header.$body;
  }   }
     }      }
     if ($remove_latex_header eq 'YES') {      if ($remove_latex_header eq 'YES') {
Line 1703  sub print_resources { Line 1880  sub print_resources {
  } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {   } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
     $printed .= $curresline.':';      $printed .= $curresline.':';
     my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);      my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
     my $lonidsdir=$r->dir_config('lonIDsDir');  
     my $envfile=$env{'user.environment'};  
     $envfile=~/\/([^\/]+)\.id$/;  
     $envfile=$1;  
     &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);  
     my $current_counter=$env{'form.counter'};  
     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 ';
   
  } else {   } else {
     my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'});      my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'},$curresline);
     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 {
Line 1734  sub print_resources { Line 1907  sub print_resources {
     if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection}      if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection}
     my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');      my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
     if ($current_output=~/\\documentclass/) {      if ($current_output=~/\\documentclass/) {
  $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /;   if ($columns_in_format == 1) {
       $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /;
    } else {
           $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\fancyhead[LO]{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}$namepostfix}}\\vskip 5 mm /;
   
    }
     } else {      } else {
  my $blankpages = '';   my $blankpages = '';
  for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';}   for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';}
  $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output;   if ($columns_in_format == 1) {
       $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output;
    } else {
      $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\fancyhead[LO]{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}'.$namepostfix.'}} \vskip 5 mm '.$current_output;
    }
     }      }
       #
       #  Close the student bracketing.
       #
       $current_output .= "\n\\special{ps:ENDOFSTUDENTSTAMP}\n";
     return ($current_output,$fullname, $printed);      return ($current_output,$fullname, $printed);
   
 }  }
Line 1747  sub print_resources { Line 1933  sub print_resources {
 sub handler {  sub handler {
   
     my $r = shift;      my $r = shift;
     my $helper;      
       &init_perm();
   
   
 #    my $loaderror=&Apache::lonnet::overloaderror($r);  
 #    if ($loaderror) { return $loaderror; }      my $helper = printHelper($r);
 #    $loaderror=      if (!ref($helper)) {
 #       &Apache::lonnet::overloaderror($r,   return $helper;
 #         $env{'course.'.$env{'request.course.id'}.'.home'});  
 #    if ($loaderror) { return $loaderror; }  
   
     my $result = printHelper($r);  
     if (!ref($result)) {  
  return $result;  
     }      }
     $helper = $result;  
         
 # my $key;   
 # foreach $key (keys %{$helper->{'VARS'}}) {  
 #    $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-<br />');  
 # }  
 # foreach $key (keys %env) {  
 #    $r->print(' '.$key.'->'.$env{$key}.'<-<br />');  
 # }  
 # return OK;  
   
     my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});      my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
     
 # my $key;   
 # foreach $key (keys %parmhash) {  
 #    $r->print(' '.$key.'->'.$parmhash{$key}.'<-<br />');  
 # }  
 #  
   
   
     #  If a figure conversion queue file exists for this user.domain      #  If a figure conversion queue file exists for this user.domain
Line 1801  sub addMessage { Line 1970  sub addMessage {
     Apache::lonhelper::message->new();      Apache::lonhelper::message->new();
 }  }
   
 use Data::Dumper;  
   
   sub init_perm {
       undef(%perm);
       $perm{'pav'}=&Apache::lonnet::allowed('pav',$env{'request.course.id'});
       if (!$perm{'pav'}) {
    $perm{'pav'}=&Apache::lonnet::allowed('pav',
     $env{'request.course.id'}.'/'.$env{'request.course.sec'});
       }
       $perm{'pfo'}=&Apache::lonnet::allowed('pav',$env{'request.course.id'});
       if (!$perm{'pfo'}) {
    $perm{'pfo'}=&Apache::lonnet::allowed('pfo',
     $env{'request.course.id'}.'/'.$env{'request.course.sec'});
       }
   }
   
 sub printHelper {  sub printHelper {
     my $r = shift;      my $r = shift;
Line 1846  sub printHelper { Line 2029  sub printHelper {
     $helper->declareVar("showallfoils");      $helper->declareVar("showallfoils");
   
     #  The page breaks can get loaded initially from the course environment:      #  The page breaks can get loaded initially from the course environment:
       # But we only do this in the initial state so that they are allowed to change.
       #
   
     if((!defined($env{"form.CURRENT_STATE"}))  ||      # $helper->{VARS}->{FINISHPAGE} = '';
        ($env{'form.CURRENT_STATE'} == "START")) {  
  $helper->{VARS}->{FINISHPAGE} = ""; # In case they did a back e.g.  
     }  
   
   
           
     &Apache::loncommon::restore_course_settings('print',      &Apache::loncommon::restore_course_settings('print',
  {'pagebreaks'  => 'scalar',   {'pagebreaks'  => 'scalar',
          'lastprinttype' => 'scalar'});           'lastprinttype' => 'scalar'});
   
           
     if("$helper->{VARS}->{PRINT_TYPE}" eq "$env{'form.lastprinttype'}") {  
  $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};  
     }  
           
       if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {
    if (!defined ($env{"form.CURRENT_STATE"})) {
       
       $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
    } else {
       my $state = $env{"form.CURRENT_STATE"};
       if ($state eq "START") {
    $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'};
       }
    }
   
       }
   
           
     # 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.
Line 1880  sub printHelper { Line 2069  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 1925  sub printHelper { Line 2115  sub printHelper {
     }      }
   
     my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();      my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();
     my $userPriviledged = ($env{'request.role'}=~m/^cc\./ or  
    $env{'request.role'}=~m/^in\./ or  
    $env{'request.role'}=~m/^ta\./);  
   
     Apache::lonhelper::registerHelperTags();      Apache::lonhelper::registerHelperTags();
   
Line 1969  sub printHelper { Line 2156  sub printHelper {
   
     $helper->declareVar('SEQUENCE');      $helper->declareVar('SEQUENCE');
   
     # Useful for debugging: Dump the help vars  
 #    $r->print(Dumper($helper->{VARS}));  
 #    $r->print($map);  
   
     # If we're in a sequence...      # If we're in a sequence...
     if (($helper->{'VARS'}->{'construction'} ne '1') &&      if (($helper->{'VARS'}->{'construction'} ne '1') &&
Line 2012  HELPERFRAGMENT Line 2197  HELPERFRAGMENT
  &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);   &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
     }      }
   
     # If the user is privileged, allow them to print all       # If the user has pfo (print for otheres) allow them to print all 
     # problems and resources  in the entier course, optionally for selected students      # problems and resources  in the entier course, optionally for selected students
     if ($userPriviledged &&       if ($perm{'pfo'} && 
         ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {           ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
   
         push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];          push @{$printChoices}, ['<b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];
Line 2047  ALL_PROBLEMS Line 2232  ALL_PROBLEMS
     push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('selected students')."</b>", 'problems_for_students', 'CHOOSE_STUDENTS'];      push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('selected students')."</b>", 'problems_for_students', 'CHOOSE_STUDENTS'];
     push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('anonymous students')."</b>", 'problems_for_anon', 'CHOOSE_ANON1'];      push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('anonymous students')."</b>", 'problems_for_anon', 'CHOOSE_ANON1'];
  }   }
   
    # resource_selector will hold a few states that:
    #   - Allow resources to be selected for printing.
    #   - Determine pagination between assignments.
    #   - Determine how many assignments should be bundled into a single PDF.
           # TODO:
    #    Probably good to do things like separate this up into several vars, each
    #    with one state, and use REGEXPs at inclusion time to set state names
    #    and next states for better mix and match capability
    #
  my $resource_selector=<<RESOURCE_SELECTOR;   my $resource_selector=<<RESOURCE_SELECTOR;
       <state name="SELECT_PROBLEMS" title="Select resources to print">
      <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">
Line 2056  ALL_PROBLEMS Line 2253  ALL_PROBLEMS
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
       <option text='New Page' variable='FINISHPAGE' />        <option text='New Page' variable='FINISHPAGE' />
       </resource>        </resource>
       </state>
       <state name="PRINT_FORMATTING" title="How should results be printed?">
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>      <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
     <choices variable="EMPTY_PAGES">      <choices variable="EMPTY_PAGES">
       <choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice>        <choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice>
Line 2063  ALL_PROBLEMS Line 2262  ALL_PROBLEMS
       <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>        <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>
       <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>        <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>
     </choices>      </choices>
     <message><hr width='33%' /><b>Number of assignments printed at the same time: </b></message>      <nextstate>PAGESIZE</nextstate>
     <string variable="NUMBER_TO_PRINT" maxlength="5" size="5"><defaultvalue>"all"</defaultvalue></string>      <message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message>
       <choices variable="SPLIT_PDFS">
          <choice computer="all">All assignments in a single PDF file</choice>
          <choice computer="sections">Each PDF contains exactly one section</choice>
          <choice computer="oneper">Each PDF contains exactly one assignment</choice>
          <choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT" relateddefault="all">
               Specify Number:</choice>
       </choices>
       </state>
 RESOURCE_SELECTOR  RESOURCE_SELECTOR
   
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);          &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
   <state name="CHOOSE_STUDENTS" title="Select Students and Resources">    <state name="CHOOSE_STUDENTS" title="Select Students and Resources">
       <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1"/>  
       <message><b>Select sort order</b> </message>        <message><b>Select sort order</b> </message>
     <choices variable='student_sort'>      <choices variable='student_sort'>
       <choice computer='0'>Sort by section then student</choice>        <choice computer='0'>Sort by section then student</choice>
       <choice computer='1'>Sort by students across sections.</choice>        <choice computer='1'>Sort by students across sections.</choice>
     </choices>      </choices>
     $resource_selector        <message><br /><hr /><br /> </message>
         <student multichoice='1' variable="STUDENTS" nextstate="SELECT_PROBLEMS" coursepersonnel="1"/>
   </state>    </state>
       $resource_selector
 CHOOSE_STUDENTS  CHOOSE_STUDENTS
   
  my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};   my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
Line 2088  CHOOSE_STUDENTS Line 2296  CHOOSE_STUDENTS
     if ($name =~ /^type\0/) { next; }      if ($name =~ /^type\0/) { next; }
     $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';      $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';
  }   }
   
   
    my %code_values;
    my %codes_to_print;
    foreach my $key (@names) {
       %code_values = &Apache::grades::get_codes($key, $cdom, $cnum);
       foreach my $key (keys(%code_values)) {
    $codes_to_print{$key} = 1;
       }
    }
   
    my $code_selection = "<choice></choice>\n";
    foreach my $code (sort {uc($a) cmp uc($b)} (keys(%codes_to_print))) {
       my $choice  = $code;
       if ($code =~ /^[A-Z]+$/) { # Alpha code
    $choice = &letters_to_num($code);
       }
       push(@{$helper->{DATA}{ALL_CODE_CHOICES}},[$code,$choice]);
    }
    if (%codes_to_print) {
       $code_selection .='   
                <exec>
                  push(@{$state->{CHOICES}},@{$helper->{DATA}{ALL_CODE_CHOICES}});
               </exec>
               '.$/;
    }
   
   
  open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');   open(FH,$Apache::lonnet::perlvar{'lonTabDir'}.'/scantronformat.tab');
  my $codechoice='';   my $codechoice='';
  foreach my $line (<FH>) {   foreach my $line (<FH>) {
Line 2103  CHOOSE_STUDENTS Line 2339  CHOOSE_STUDENTS
  }   }
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);          &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON1);
   <state name="CHOOSE_ANON1" title="Select Students and Resources">    <state name="CHOOSE_ANON1" title="Select Students and Resources">
     <nextstate>PAGESIZE</nextstate>      <nextstate>SELECT_PROBLEMS</nextstate>
     <message><hr width='33%' /></message>      <message><table><tr><td><b>Number of anonymous assignments to print:</b></td><td></message>
     <message><table><tr><td><b>Number of anonymous assignments to print?</b></td><td></message>  
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">      <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
        <validator>         <validator>
  if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&   if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
     !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&      !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&
             !\$helper->{'VARS'}{'SINGLE_CODE'}) {              !\$helper->{'VARS'}{'SINGLE_CODE'}                    &&
       !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
     return "You need to specify the number of assignments to print";      return "You need to specify the number of assignments to print";
  }   }
  return undef;   return undef;
        </validator>         </validator>
     </string>      </string>
     <message></td></tr><tr><td></message>      <message></td></tr><tr><td></message>
     <message><b>Value of CODE to print?</b></td><td></message>      <message><b>Names to store the CODEs under for later:</b></message>
     <string variable="SINGLE_CODE" size="10" defaultvalue="zzzz">      <message></td><td></message>
       <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
       <message></td></tr><tr><td></message>
       <message><b>Bubble sheet type:</b></message>
       <message></td><td></message>
       <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
       $codechoice
       </dropdown>
       <message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message>
       <message></td></tr><tr><td></message>
       <message><b>Enter a CODE to print:</b></td><td></message>
       <string variable="SINGLE_CODE" size="10">
         <validator>          <validator>
    if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&     if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
       !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) {        !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                 &&
         !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
       return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},        return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
       \$helper->{'VARS'}{'CODE_OPTION'});        \$helper->{'VARS'}{'CODE_OPTION'});
    } else {     } else {
Line 2129  CHOOSE_STUDENTS Line 2377  CHOOSE_STUDENTS
    }     }
         </validator>          </validator>
     </string>      </string>
     <message></td></tr><tr><td></message>      <message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message>
     <message><b>Names to store the CODEs under for later:</b></message>      <message><b>Choose single code from list</b></message>
     <message></td><td></message>      <message></td><td></message>
     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />      <choices variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
     <message></td></tr><tr><td></message>          $code_selection
     <message><b>Bubble sheet type:</b></message>      </choices>
     <message></td><td></message>      <message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message>
     <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">  
     $codechoice  
     </dropdown>  
     <message></td></tr></table></message>  
     <message><hr width='33%' /></message>  
     <message><b>Reprint a set of saved CODEs:</b></message>      <message><b>Reprint a set of saved CODEs:</b></message>
       <message></td><td></message>
     <dropdown variable="REUSE_OLD_CODES">      <dropdown variable="REUSE_OLD_CODES">
         $namechoice          $namechoice
     </dropdown>      </dropdown>
       <message></td></tr></table></message>
     <message><hr width='33%' /></message>      <message><hr width='33%' /></message>
     $resource_selector  
   </state>    </state>
     $resource_selector
 CHOOSE_ANON1  CHOOSE_ANON1
   
   
Line 2158  CHOOSE_ANON1 Line 2403  CHOOSE_ANON1
           
   
  $resource_selector=<<RESOURCE_SELECTOR;   $resource_selector=<<RESOURCE_SELECTOR;
       <state name="SELECT_RESOURCES" title="Select Resources">
       <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">
Line 2166  CHOOSE_ANON1 Line 2413  CHOOSE_ANON1
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
       <option text='Newpage' variable='FINISHPAGE' />        <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
       </state>
       <state name="PRINT_FORMATTING" title="Format of the print job">
       <nextstate>NUMBER_PER_PDF</nextstate>
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>      <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
     <choices variable="EMPTY_PAGES">      <choices variable="EMPTY_PAGES">
       <choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice>        <choice computer='0'>Start each student\'s assignment on a new page/column (add a pagefeed after each assignment)</choice>
Line 2173  CHOOSE_ANON1 Line 2423  CHOOSE_ANON1
       <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>        <choice computer='2'>Add two empty pages/column after each student\'s assignment</choice>
       <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>        <choice computer='3'>Add three empty pages/column after each student\'s assignment</choice>
     </choices>      </choices>
     <message><hr width='33%' /><b>Number of assignments printed at the same time: </b></message>      <nextstate>PAGESIZE</nextstate>
     <string variable="NUMBER_TO_PRINT" maxlength="5" size="5"><defaultvalue>"all"</defaultvalue></string>      <message><hr width='33%' /><b>How do you want assignments split into PDF files? </b></message>
       <choices variable="SPLIT_PDFS">
          <choice computer="all">All assignments in a single PDF file</choice>
          <choice computer="sections">Each PDF contains exactly one section</choice>
          <choice computer="oneper">Each PDF contains exactly one assignment</choice>
          <choice computer="usenumber" relatedvalue="NUMBER_TO_PRINT" relateddefault="all">
              Specify Number:</choice>
       </choices>
       </state>
 RESOURCE_SELECTOR  RESOURCE_SELECTOR
   
  &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);   &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS1);
   <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">    <state name="CHOOSE_STUDENTS1" title="Select Students and Resources">
     <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1" />  
     <choices variable='student_sort'>      <choices variable='student_sort'>
       <choice computer='0'>Sort by section then student</choice>        <choice computer='0'>Sort by section then student</choice>
       <choice computer='1'>Sort by students across sections.</choice>        <choice computer='1'>Sort by students across sections.</choice>
     </choices>      </choices>
       <message><br /><hr /><br /></message>
       <student multichoice='1' variable="STUDENTS" nextstate="SELECT_RESOURCES" coursepersonnel="1" />
   
     $resource_selector  
     </state>      </state>
       $resource_selector
 CHOOSE_STUDENTS1  CHOOSE_STUDENTS1
   
  &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);   &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);
   <state name="CHOOSE_ANON2" title="Select Students and Resources">    <state name="CHOOSE_ANON2" title="Select Students and Resources">
     <nextstate>PAGESIZE</nextstate>      <nextstate>SELECT_RESOURCES</nextstate>
     <message><table><tr><td><b>Number of anonymous assignments to print?</b></td><td></message>      <message><table><tr><td><b>Number of anonymous assignments to print:</b></td><td></message>
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">      <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
        <validator>         <validator>
  if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&   if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
     !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&      !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                &&
     !\$helper->{'VARS'}{'SINGLE_CODE'}) {      !\$helper->{'VARS'}{'SINGLE_CODE'}                   &&
       !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
     return "You need to specify the number of assignments to print";      return "You need to specify the number of assignments to print";
  }   }
  return undef;   return undef;
        </validator>         </validator>
     </string>      </string>
     <message></td></tr><tr><td></message>      <message></td></tr><tr><td></message>
     <message><b>Value of CODE to print?</b></td><td></message>      <message><b>Names to store the CODEs under for later:</b></message>
     <string variable="SINGLE_CODE" size="10" defaultvalue="zzzz">      <message></td><td></message>
       <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
       <message></td></tr><tr><td></message>
       <message><b>Bubble sheet type:</b></message>
       <message></td><td></message>
       <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
       $codechoice
       </dropdown>
       <message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message>
       <message></td></tr><tr><td></message>
       <message><b>Enter a CODE to print:</b></td><td></message>
       <string variable="SINGLE_CODE" size="10">
         <validator>          <validator>
    if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&     if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
       !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) {        !\$helper->{'VARS'}{'REUSE_OLD_CODES'}                 &&
         !\$helper->{'VARS'}{'CODE_SELECTED_FROM_LIST'}) {
       return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},        return &Apache::lonprintout::is_code_valid(\$helper->{'VARS'}{'SINGLE_CODE'},
       \$helper->{'VARS'}{'CODE_OPTION'});        \$helper->{'VARS'}{'CODE_OPTION'});
    } else {     } else {
Line 2216  CHOOSE_STUDENTS1 Line 2488  CHOOSE_STUDENTS1
    }     }
         </validator>          </validator>
     </string>      </string>
     <message></td></tr><tr><td></message>      <message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message>
     <message><b>Names to store the CODEs under for later:</b></message>      <message><b>Choose single code from list</b></message>
     <message></td><td></message>      <message></td><td></message>
     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />      <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
     <message></td></tr><tr><td></message>          $code_selection
     <message><b>Bubble sheet type:</b></message>  
     <message></td><td></message>  
     <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">  
     $codechoice  
     </dropdown>      </dropdown>
     <message></td></tr></table></message>      <message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message>
     <message><hr width='33%' /></message>  
     <message><b>Reprint a set of saved CODEs:</b></message>      <message><b>Reprint a set of saved CODEs:</b></message>
       <message></td><td></message>
     <dropdown variable="REUSE_OLD_CODES">      <dropdown variable="REUSE_OLD_CODES">
         $namechoice          $namechoice
     </dropdown>      </dropdown>
       <message></td></tr></table></message>
     <message><hr width='33%' /></message>      <message><hr width='33%' /></message>
     $resource_selector  
   </state>    </state>
       $resource_selector
 CHOOSE_ANON2  CHOOSE_ANON2
     }      }
   
     # FIXME: That RE should come from a library somewhere.      # FIXME: That RE should come from a library somewhere.
     if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $env{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {          if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $perm{'pav'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {    
         push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from current subdirectory')." <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];          push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('from current subdirectory')." <b><i>$subdir</i></b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
   
         my $f = '$filename';          my $f = '$filename';
Line 2279  CHOOSE_FROM_SUBDIR Line 2548  CHOOSE_FROM_SUBDIR
       <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>        <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>
       <filterfunc>return \$res->is_sequence;</filterfunc>        <filterfunc>return \$res->is_sequence;</filterfunc>
       <valuefunc>return $urlValue;</valuefunc>        <valuefunc>return $urlValue;</valuefunc>
       <option text='Newpage' variable='FINISHPAGE' />        <choicefunc>return \$res->hasResource(\$res,sub { return !\$_[0]->is_sequence() },0,0);
    </choicefunc>
       </resource>        </resource>
     </state>      </state>
   <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">    <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
Line 2309  CHOOSE_FROM_ANY_SEQUENCE Line 2579  CHOOSE_FROM_ANY_SEQUENCE
     my $startedTable = 0; # have we started an HTML table yet? (need      my $startedTable = 0; # have we started an HTML table yet? (need
                           # to close it later)                            # to close it later)
   
     if (($env{'request.role.adv'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or       if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or 
  ($helper->{VARS}->{'construction'} eq '1')) {   ($helper->{VARS}->{'construction'} eq '1')) {
  addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");   addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
Line 2325  CHOOSE_FROM_ANY_SEQUENCE Line 2595  CHOOSE_FROM_ANY_SEQUENCE
  $startedTable = 1;   $startedTable = 1;
     }      }
   
     if ($env{'request.role.adv'}) {      if ($perm{'pav'}) {
  if (!$startedTable) {   if (!$startedTable) {
     addMessage("<hr width='33%' /><table><tr><td align='right'>LaTeX mode: </td><td>");      addMessage("<hr width='33%' /><table><tr><td align='right'>LaTeX mode: </td><td>");
     $startedTable = 1;      $startedTable = 1;
Line 2376  CHOOSE_FROM_ANY_SEQUENCE Line 2646  CHOOSE_FROM_ANY_SEQUENCE
     Apache::lonhelper::dropdown->new();      Apache::lonhelper::dropdown->new();
     addMessage("</td></tr>");      addMessage("</td></tr>");
   
             #  If advanced roles, then allow to show all foils.      addMessage("<tr><td align = 'right'>  </td><td>");
       $paramHash = Apache::lonhelper::getParamHash();
             if ($env{'request.role.adv'}) {      $paramHash->{'multichoice'} = "true";
  addMessage("<tr><td align = 'right'>  </td><td>");      $paramHash->{'allowempty'}  = "true";
  $paramHash = Apache::lonhelper::getParamHash();      $paramHash->{'variable'}   = "showallfoils";
  $paramHash->{'multichoice'} = "true";      $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ];
  $paramHash->{'allowempty'}  = "true";      Apache::lonhelper::choices->new();
  $paramHash->{'variable'}   = "showallfoils";      addMessage("</td></tr>");
  $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ];  
  Apache::lonhelper::choices->new();  
  addMessage("</td></tr>");  
             }  
   
  }   }
   
  if ($helper->{'VARS'}->{'construction'}) {    if ($helper->{'VARS'}->{'construction'}) { 
Line 2401  CHOOSE_FROM_ANY_SEQUENCE Line 2666  CHOOSE_FROM_ANY_SEQUENCE
         </defaultvalue>          </defaultvalue>
     </string>      </string>
      <message></td></tr><tr><td align="right">Use style file:</td><td></message>       <message></td></tr><tr><td align="right">Use style file:</td><td></message>
              <message><input type="text" size="40" name="style_file_value" value="$stylevalue"  />&nbsp; <a href="javascript:openbrowser('helpform','style_file','sty')">Select style file</a> </td><tr><td></message>               <message><input type="text" size="40" name="style_file_value" value="$stylevalue"  />&nbsp; <a href="javascript:openbrowser('helpform','style_file_value','sty')">Select style file</a> </td><tr><td></message>
      <choices allowempty="1" multichoice="true" variable="showallfoils">       <choices allowempty="1" multichoice="true" variable="showallfoils">
                 <choice computer="1">Show all foils?</choice>                  <choice computer="1">Show all foils?</choice>
              </choices>               </choices>
Line 2411  RNDSEED Line 2676  RNDSEED
     $helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'};      $helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'};
           
  }    } 
   
     }      }
   
   
Line 2431  RNDSEED Line 2695  RNDSEED
   
     $helper->process();      $helper->process();
   
   
     # MANUAL BAILOUT CONDITION:      # MANUAL BAILOUT CONDITION:
     # 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') {
Line 2438  RNDSEED Line 2703  RNDSEED
     }          }    
   
     $r->print($helper->display());      $r->print($helper->display());
       if ($helper->{STATE} eq 'START') {
    &recently_generated($r);
       }
     &Apache::lonhelper::unregisterHelperTags();      &Apache::lonhelper::unregisterHelperTags();
   
     return OK;      return OK;
Line 2543  STATEHTML Line 2810  STATEHTML
     $result .= "<select name='${var}.paper'>\n";      $result .= "<select name='${var}.paper'>\n";
   
     my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});      my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
     my $DefaultPaperSize=$parmhash{'default_paper_size'};      my $DefaultPaperSize=lc($parmhash{'default_paper_size'});
       $DefaultPaperSize=~s/\s//g;
     if ($DefaultPaperSize eq '') {$DefaultPaperSize='letter';}      if ($DefaultPaperSize eq '') {$DefaultPaperSize='letter';}
     $i = 0;      $i = 0;
     foreach (@paperSize) {      foreach (@paperSize) {
Line 2635  sub render { Line 2903  sub render {
         $result .= '<br /><font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br />';          $result .= '<br /><font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br />';
     }      }
   
       my $width = 18;
       my $format = $helper->{VARS}->{$self->{'formatvar'}};
       if (substr($format, 2, 1) ne '1') {
    $width = 9;
       }
   
     $result .= <<ELEMENTHTML;      $result .= <<ELEMENTHTML;
   
 <p>How should the column be formatted?</p>  <p>How should the column be formatted?</p>
Line 2642  sub render { Line 2916  sub render {
 <table cellpadding='3'>  <table cellpadding='3'>
   <tr>    <tr>
     <td align='right'><b>Width</b>:</td>      <td align='right'><b>Width</b>:</td>
     <td align='left'><input type='text' name='$var.width' value='18' size='4'></td>      <td align='left'><input type='text' name='$var.width' value='$width' size='4'></td>
     <td align='left'>      <td align='left'>
       <select name='$var.widthunit'>        <select name='$var.widthunit'>
         <option>cm</option><option>in</option>          <option>cm</option><option>in</option>
Line 2683  sub preprocess { Line 2957  sub preprocess {
     my $helper = Apache::lonhelper::getHelper();      my $helper = Apache::lonhelper::getHelper();
   
     my $format = $helper->{VARS}->{$self->{'formatvar'}};      my $format = $helper->{VARS}->{$self->{'formatvar'}};
     if (substr($format, 2, 1) ne '1') {  #    if (substr($format, 2, 1) ne '1') {
         $helper->changeState($self->{NEXTSTATE});  #        $helper->changeState($self->{NEXTSTATE});
     }  #    }
         
     return 1;      return 1;
 }  }

Removed from v.1.386  
changed lines
  Added in v.1.445


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