Diff for /loncom/interface/lonprintout.pm between versions 1.17 and 1.74

version 1.17, 2002/03/20 22:14:30 version 1.74, 2002/09/23 21:09:58
Line 43  use strict; Line 43  use strict;
 use Apache::Constants qw(:common :http);  use Apache::Constants qw(:common :http);
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::lonnet;  use Apache::lonnet;
   use Apache::loncommon;
 use Apache::inputtags;  use Apache::inputtags;
   use Apache::grades;
 use Apache::edit;  use Apache::edit;
 use Apache::File();  use Apache::File();
   use Apache::lonnavmaps;
   use POSIX qw(strftime);
   use GDBM_File;
   
   
   my %hash;
   
   
 sub headerform {  sub headerform {
     my $r = shift;      my $r = shift;
Line 58  sub headerform { Line 65  sub headerform {
 </head>  </head>
 <body bgcolor="FFFFFF">  <body bgcolor="FFFFFF">
 <form method="post" enctype="multipart/form-data" action="/adm/printout" name="printform">  <form method="post" enctype="multipart/form-data" action="/adm/printout" name="printform">
 <h1>What do you want to print? Make a choice.</h1><br />  
 ENDHEADER  ENDHEADER
       if ($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) { 
       $r->print(<<ENDHEADER1);
   <b>Path to current document: </b><tt>$ENV{'form.postdata'}</tt><p>
   ENDHEADER1
   }
 }  }
   
   
 sub menu_for_output {  sub menu_for_output {
     my $r = shift;      my $r = shift;
     $r->print(<<ENDMENUOUT);      my ($title_for_single_resource,$title_for_sequence,$title_for_main_map) = &details_for_menu;
       if ($title_for_single_resource ne '') {$title_for_single_resource = '"'.$title_for_single_resource.'"';}
       if ($title_for_sequence ne '') {$title_for_sequence = '"'.$title_for_sequence.'"';}
       if ($title_for_main_map ne '') {$title_for_main_map = '"'.$title_for_main_map.'"';}
       my $subdir_to_print = $ENV{'form.postdata'};
       $subdir_to_print =~ m/\/([^\/]+)$/;
       $subdir_to_print =~ s/$1//;
       $r->print(<<ENDMENUOUT1);
   <h1>What do you want to print? Make a choice.</h1><br />
 <input type="hidden" name="phase" value="two">  <input type="hidden" name="phase" value="two">
 <input type="hidden" name="url" value="$ENV{'form.postdata'}">  <input type="hidden" name="url" value="$ENV{'form.postdata'}">
 <input type="radio" name="choice" value="Standard LaTeX output for current document">  Current document  <input type="radio" name="choice" value="Standard LaTeX output for current document" checked>  Current document <b>$title_for_single_resource</b>
 (you will print what you see on the screen)<br />  (prints what you just saw on the screen)<br />
 <input type="radio" name="choice" value="Standard LaTeX output for the primary sequence">  Standard LaTeX output for the primary sequence<br />  ENDMENUOUT1
 <input type="radio" name="choice" value="Standard LaTeX output for the top level sequence">  All documents from the top level sequence<br />      if ((not $ENV{'request.role'}=~m/^au\./) and (not $ENV{'request.role'}=~m/^ca\./)) {
    $r->print(<<ENDMENUOUT2);
   <input type="radio" name="choice" value="Standard LaTeX output for the primary sequence">  All problems from <b>$title_for_sequence</b><br />
   <input type="radio" name="choice" value="Standard LaTeX output for whole primary sequence">  All problems plus any pages or html/xml files from <b>$title_for_sequence</b><br />
   ENDMENUOUT2
       }
       if ($ENV{'request.role'}=~m/^cc\./ or $ENV{'request.role'}=~m/^in\./ or $ENV{'request.role'}=~m/^ta\./) { 
    $r->print(<<ENDMENUOUT6);
   <input type="radio" name="choice" value="Standard LaTeX output for the top level sequence">  All problems in this course (<b>warning:</b> this may be time consuming) <br />
   <br />
   <input type="radio" name="choice" value="All class print">  All problems from <b>$title_for_sequence</b> for selected students<br /><br />
   ENDMENUOUT6
       }
         my $subdirtoprint = &Apache::lonnet::filelocation("",$ENV{'form.url'});
         $subdirtoprint =~ s/\/[^\/]+$//;
         if (&Apache::lonnet::allowed('bre',$subdirtoprint) eq 'F') {
     $r->print(<<ENDMENUOUT4);
     <input type="radio" name="choice" value="Subdirectory print">  Problems from current subdirectory <b>$subdir_to_print</b><br />
   ENDMENUOUT4
         }
       $r->print(<<ENDMENUOUT5);
 <br /><hr /><br />  <br /><hr /><br />
 <h1>And what page format do you prefer?</h1>  <h1>And what page format do you prefer?</h1>
 <input type="radio" name="layout" value="CBI" checked>  CBI <br />  <table>
 <input type="radio" name="layout" value="CAPA"> CAPA <br />   <tr>
      <td>
        <input type="radio" name="layout" value="CBI"> Landscape <br />
        <input type="radio" name="layout" value="CAPA" checked>  Portrait <br />
      </td>
      <td>&nbsp;</td>
      <td rawspan="2">
        Number of columns: <select name="numberofcolumns">
                            <option> 1 </option>
                            <option selected> 2 </option>
                           </select> 
      </td>
      <td rawspan="2">
        Paper size (format [width x height]): <select name="papersize">
                                               <option selected> Letter [8 1/2x11 in] </option>
                                               <option> Legal [8 1/2x14 in] </option>
                                               <option> Ledger/Tabloid [11x17 in] </option>
                                               <option> Executive [7 1/2x10 in] </option>
                                               <option> A2 [420x594 mm] </option>
                                               <option> A3 [297x420 mm] </option>
                                               <option> A4 [210x297 mm] </option>
                                               <option> A5 [148x210 mm] </option>
                                               <option> A6 [105x148 mm] </option>
                                              </select> 
      </td>
    </tr>
   </table>
   </br> 
 <input type="submit" value="Submit your choice">  <input type="submit" value="Submit your choice">
   ENDMENUOUT5
   }
   
   
   sub problem_choice_menu {
       my $r = shift;
       my $subdirtoprint = &Apache::lonnet::filelocation("",$ENV{'form.url'});
       $subdirtoprint =~ s/\/[^\/]+$//;
       my @list_of_files = ();
       if ($ENV{'request.role'}=~m/^au\./ or $ENV{'request.role'}=~m/^ca\./) {
    $subdirtoprint =~ s/^[^~]*~(\w+)\//\/home\/$1\/public_html\//;
       } else {
    $subdirtoprint =~ s/.*(\/res\/)/$1/;
       }
       my @content_directory = ();
       if ($ENV{'request.role'}=~m/^au\./ or $ENV{'request.role'}=~m/^ca\./) {
    @content_directory = &Apache::lonnet::dirlist($subdirtoprint,$ENV{'user.domain'}, $ENV{'user.name'},'');
       } else {
    @content_directory = &Apache::lonnet::dirlist($subdirtoprint);
       }
       for (my $iy=0;$iy<=$#content_directory;$iy++) {
    my @tempo_array = split(/&/,$content_directory[$iy]);
    if ($tempo_array[0] =~ m/^[^\.]+\.(problem|exam|quiz|assess|survey|form|library)$/) {
       push(@list_of_files,$tempo_array[0]);
    }
       }
       $subdirtoprint =~ s/\/$//;
       for (my $i=0;$i<=$#list_of_files;$i++) {
    $list_of_files[$i] = $subdirtoprint.'/'.$list_of_files[$i];
       }
       $r->print(<<ENDMENUOUT1);
   <input type="hidden" name="url" value="$ENV{'form.url'}">
   <input type="hidden" name="choice" value="$ENV{'form.choice'}">
   <input type="hidden" name="layout" value="$ENV{'form.layout'}">
   <input type="hidden" name="numberofcolumns" value="$ENV{'form.numberofcolumns'}">
   <h1>Mark problems which you want to print</h1>
   <script>
       function checkall() {
    for (i=0; i<document.forms.printform.elements.length; i++) {
               if 
             (document.forms.printform.elements[i].name.indexOf('whattoprint')==0) {
         document.forms.printform.elements[i].checked=true;
               }
           }
       }
   
   
       function uncheckall() {
    for (i=0; i<document.forms.printform.elements.length; i++) {
               if 
             (document.forms.printform.elements[i].name.indexOf('whattoprint')==0) {
         document.forms.printform.elements[i].checked=false;
               }
           }
       }
   </script>
   <input type=button onClick="checkall()" value="Check All">&nbsp;
   <input type=button onClick="uncheckall()" value="Uncheck">
   <p>
   ENDMENUOUT1
       my $i;
       foreach my $file (@list_of_files) {
    $r->print('<br /><input type=checkbox name="whattoprint'.$i.'" value="'.$file.'"> '.
                     $file);
    $i++;
       }
       $r->print(<<ENDMENUOUT2);
   <br />
   <input type="hidden" name="numberofproblems" value="$i">
   <input type="hidden" name="phase" value="three">
   <input type="submit" value="Submit">
   ENDMENUOUT2
   }
   
   
   sub additional_class_menu {
       my $r = shift;
       $r->print(<<ENDMENUOUT1);
   <input type="hidden" name="url" value="$ENV{'form.url'}">
   <input type="hidden" name="choice" value="$ENV{'form.choice'}">
   <input type="hidden" name="layout" value="$ENV{'form.layout'}">
   <input type="hidden" name="numberofcolumns" value="$ENV{'form.numberofcolumns'}">
   <h1>Mark students which assignments you want to print</h1>
   ENDMENUOUT1
       my %courselist=&Apache::lonnet::dump(
                      'classlist',
      $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
      $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
       my $now=time;
       $r->print(<<ENDDISHEADER);
   <script>
       function checkall() {
    for (i=0; i<document.forms.printform.elements.length; i++) {
               if 
             (document.forms.printform.elements[i].name.indexOf('whomtoprint')==0) {
         document.forms.printform.elements[i].checked=true;
               }
           }
       }
   
       function checksec() {
    for (i=0; i<document.forms.printform.elements.length; i++) {
               if 
             (document.forms.printform.elements[i].value.indexOf
              (document.forms.printform.chksec.value)==0) {
         document.forms.printform.elements[i].checked=true;
               }
           }
       }
   
       function uncheckall() {
    for (i=0; i<document.forms.printform.elements.length; i++) {
               if 
             (document.forms.printform.elements[i].name.indexOf('whomtoprint')==0) {
         document.forms.printform.elements[i].checked=false;
               }
           }
       }
   </script>
   <input type=button onClick="checkall()" value="Check All">&nbsp;
   <input type=button onClick="checksec()" value="Check Section/Group">
   <input type=text size=5 name=chksec>&nbsp;
   <input type=button onClick="uncheckall()" value="Uncheck">
   <p>
   ENDDISHEADER
       my $i = 0;
       foreach (sort keys %courselist) {
           my ($end,$start)=split(/\:/,$courselist{$_});
           my $active=1;
           if (($end) && ($now>$end)) { $active=0; }
           if ($active) {
              my ($sname,$sdom)=split(/\:/,$_);
              my %reply=&Apache::lonnet::get('environment',
                 ['firstname','middlename','lastname','generation'],
                 $sdom,$sname);
              my $section=&Apache::lonnet::usection
          ($sdom,$sname,$ENV{'request.course.id'});
              $r->print(
           '<br /><input type=checkbox name="whomtoprint'.$i.'" value="'.$section.':'.$_.'"> '.
         $reply{'firstname'}.' '. 
                         $reply{'middlename'}.' '.
                         $reply{'lastname'}.' '.
                         $reply{'generation'}.
                         ' ('.$_.') '.$section);
      $i++;
           } 
       }
       $r->print(<<ENDMENUOUT2);
   <br />
   <input type="hidden" name="numberofstudents" value="$i">
   <input type="hidden" name="phase" value="three">
   <input type="submit" value="Submit">
   ENDMENUOUT2
   }
   
   
   sub additional_print_menu { 
       my $r = shift;
       my $what_to_print = '';
       for (my $i=0; $i<$ENV{'form.numberofstudents'};$i++) {
    $what_to_print .= '<input type="hidden" name="whomtoprint'.$i.'" value="'.$ENV{'form.whomtoprint'.$i}.'">';
       }
       for (my $i=0; $i<$ENV{'form.numberofproblems'};$i++) {
    $what_to_print .= '<input type="hidden" name="whattoprint'.$i.'" value="'.$ENV{'form.whattoprint'.$i}.'">';
       }
       $r->print(<<ENDMENUOUT);
       $what_to_print
   <input type="hidden" name="url" value="$ENV{'form.url'}">
   <input type="hidden" name="choice" value="$ENV{'form.choice'}">
   <input type="hidden" name="layout" value="$ENV{'form.layout'}">
   <input type="hidden" name="numberofstudents" value="$ENV{'form.numberofstudents'}">
   <input type="hidden" name="numberofproblems" value="$ENV{'form.numberofproblems'}">
   <input type="hidden" name="numberofcolumns" value="$ENV{'form.numberofcolumns'}">
   Define one column layout parameters: <br />
   <b>Width</b>: <input type="text" name="width" width="8" value="9cm"> <br />
   <b>Height</b>: <input type="text" name="height" width="8" value="25.9cm"> <br />
   <b>Left margin</b>: <input type="text" name="leftmargin" width="8" value="-0.57in"> <br />
   <input type="hidden" name="phase" value="four">
   <input type="submit" value="Submit">
 </form>  </form>
 </body>  </body>
 </html>  </html>
Line 84  ENDMENUOUT Line 329  ENDMENUOUT
 }  }
   
   
   
   
 sub output_data {  sub output_data {
     my $r = shift;      my $r = shift;
     $r->print(<<ENDPART);      $r->print(<<ENDPART);
Line 99  ENDPART Line 342  ENDPART
   
     my $choice = $ENV{'form.choice'};      my $choice = $ENV{'form.choice'};
     my $layout = $ENV{'form.layout'};      my $layout = $ENV{'form.layout'};
       my $numberofcolumns = $ENV{'form.numberofcolumns'};  
       my $papersize = $ENV{'form.papersize'};          
     my $laystyle = 'book';      my $laystyle = 'book';
     my $result = '';      my $result = '';
     my %mystyle;      my $number_of_columns = 1; #used only for pages to determine the width of the cell
     my $filename;      my $selectionmade = '';
    
     if ($choice eq 'Standard LaTeX output for current document') {      if ($choice eq 'Standard LaTeX output for current document') {
         #-- single document - problem, page, html, xml  
         $selectionmade = 1;
       my %moreenv;        my %moreenv;
       my $currequest=$ENV{'request.filename'};  
       $moreenv{'form.grade_target'}='tex';        $moreenv{'form.grade_target'}='tex';
         if ($ENV{'request.role'}=~m/^au\./ or $ENV{'request.role'}=~m/^ca\./) {
     $ENV{'form.url'}=~s/http:\/\/[^\/]+//;
         }
       $moreenv{'request.filename'}=$ENV{'form.url'};        $moreenv{'request.filename'}=$ENV{'form.url'};
       &Apache::lonnet::appenv(%moreenv);        &Apache::lonnet::appenv(%moreenv);
       my $texversion=&Apache::lonnet::ssi($ENV{'form.url'});        my $texversion=&Apache::lonnet::ssi($ENV{'form.url'});
       &Apache::lonnet::delenv('form.grade_target');        &Apache::lonnet::delenv('form.grade_target');
       %moreenv = ();  
       $moreenv{'request.filename'}=$currequest;  
       &Apache::lonnet::appenv(%moreenv);  
       $result .= $texversion;        $result .= $texversion;
         if ($ENV{'form.url'}=~m/\.page\s*$/) {
     } elsif ($choice eq 'Standard LaTeX output for the primary sequence') {    ($result,$number_of_columns) = &page_cleanup($result);
       my @master_seq = ();        }
       my $keyword = 0;      } elsif ($choice eq 'Standard LaTeX output for the primary sequence' or 
       my $output_seq = '';               $choice eq 'Standard LaTeX output for whole primary sequence') {
       my $current_file = '/res/'.$ENV{'request.ambiguous'};        #-- minimal sequence to which the current document belongs
       $current_file =~ s/(\/res\/physnet\/physnet)(\/m\d+)\/(.*)/$1$2$2\.sequence/;          #-- where is the primary sequence containing file?
       while ($current_file ne '') {   my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'});
  my $file=&Apache::lonnet::filelocation("",$current_file);   my @sequence = split('___',$symbolic);
  my $filecontents=&Apache::lonnet::getfile($file);   my $primary_sequence = '/res/'.$sequence[0];   
  my @file_seq = &content_map($filecontents);   my @master_seq = &coming_from_hash($primary_sequence,$sequence[0]);
  if (defined @file_seq) {          #-- produce an output string
 #-- adding an additional array to the master one   my $flag_latex_header_remove = 'NO';
   if (defined @master_seq) {   my $flag_page_in_sequence = 'NO';
     my $old_value = $#master_seq;   for (my $i=0;$i<=$#master_seq;$i++) {
     my $total_value = $#master_seq + $#file_seq +2;              my ($urlp,$symb) = split /&&/, $master_seq[$i];
     for (my $j=0; $j<=$old_value-$keyword+1; $j++) {      if ($choice eq 'Standard LaTeX output for the primary sequence') {
       $master_seq[$total_value-$j] = $master_seq[$old_value-$j];              #prints only problems
    $selectionmade = 2;
     if ($urlp =~ m/\.(problem|exam|quiz|assess|survey|form|library)/) {
       my %moreenv;
       $moreenv{'form.grade_target'}='tex';
       &Apache::lonnet::appenv(%moreenv);
       &Apache::lonnet::logthis("Trying to get $urlp with symb $symb");
       my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
       &Apache::lonnet::delenv('form.grade_target');
       if ($flag_latex_header_remove ne 'NO') {
    $texversion = &latex_header_footer_remove($texversion);
       } else {
    $texversion =~ s/\\end{document}//;
       }
       $result .= $texversion;        
       $flag_latex_header_remove = 'YES';
    }
       } elsif ($urlp =~ /\S+/) {
                 #prints problems, pages and any html/xml files
    $selectionmade = 3;
    my %moreenv;
    $moreenv{'form.grade_target'}='tex';
    &Apache::lonnet::appenv(%moreenv);
    my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
    &Apache::lonnet::delenv('form.grade_target');
    if ($urlp =~ m/\.page/) {
       ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
       if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
       $texversion =~ s/\\end{document}\d*/\\end{document}/;
       $flag_page_in_sequence = 'YES';
    } 
    if ($flag_latex_header_remove ne 'NO') {
       $texversion = &latex_header_footer_remove($texversion);
    } else {
       $texversion =~ s/\\end{document}//;
    }
    $result .= $texversion;         
    $flag_latex_header_remove = 'YES';   
     }      }
     for (my $j=0; $j<=$#file_seq; $j++){   }
       $master_seq[$keyword+$j] = $file_seq[$j];   if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;}
    $result .= '\end{document}';
       }  elsif ($choice eq 'Standard LaTeX output for the top level sequence') {
           # where is the main sequence of the course?
    $selectionmade = 4;
    my $main_seq = '/res/'.$ENV{'request.course.uri'};
    my @file_seq = &coming_from_hash_whole($main_seq);
    my $flag_latex_header_remove = 'NO';
           #-- produce an output string
    for (my $i=0;$i<=$#file_seq;$i++) {
               my ($urlp,$symb) = split /&&/, $file_seq[$i];
       $urlp=~s/\/home\/httpd\/html//;    
               if ($urlp=~m/\.(problem|exam|quiz|assess|survey|form|library)/) {
    my %moreenv;
    $moreenv{'form.grade_target'}='tex';
    &Apache::lonnet::appenv(%moreenv);
    my $texversion=&Apache::lonnet::ssi($urlp,('symb'=>$symb));
    &Apache::lonnet::delenv('form.grade_target');    
    if ($flag_latex_header_remove ne 'NO') {
       $texversion = &latex_header_footer_remove($texversion);
    } else {
       $texversion =~ s/\\end{document}//;
    }
    $result .= $texversion;  
    $flag_latex_header_remove = 'YES';
       }
    }    
    $result .= '\end{document}';
       } elsif ($choice eq 'All class print') { 
       #-- prints assignments for whole class or for selected students  
    $selectionmade = 5;
           my @students = ();
    for (my $i=0; $i<$ENV{'form.numberofstudents'};$i++) {
       if ($ENV{'form.whomtoprint'.$i}=~/:/) {
    push @students,$ENV{'form.whomtoprint'.$i};
     }      }
     @file_seq = ();  
     $keyword = 0;  
   } else {  
     @master_seq = @file_seq;  
     @file_seq = ();  
   }  
  }  
 #-- checking wether .sequence file is among the set of files  
  $current_file = '';  
  for (my $i=0; $i<=$#file_seq; $i++) {  
   $_ = $file_seq[$i];  
   if (m/(.*)\.sequence/) {  
     $current_file = $_;  
     $keyword = $i;  
     last;  
   }  
  }   }
       }   #where is the primary sequence containing current resource (the same for all students)?
 #-- produce an output string   my $symbolic = &Apache::lonnet::symbread($ENV{'form.url'});
       for (my $i=0;$i<=$#master_seq;$i++) {   my @sequence = split('___',$symbolic);
  $_ = $master_seq[$i];   my $primary_sequence = '/res/'.$sequence[0];
  m/\"(.*)\"/;   my @master_seq = &coming_from_hash($primary_sequence,$sequence[0); 
  if (index($1,'-tc.xml',0)==-1) {          #loop over students
   my $file=&Apache::lonnet::filelocation("",$1);   my $flag_latex_header_remove = 'NO';  
   my $filecontents=&Apache::lonnet::getfile($file);   foreach my $person (@students) {
   $output_seq .= $filecontents;      my $current_output = ''; 
       my ($usersection,$username,$userdomain) = split /:/,$person;
       my $fullname = &Apache::grades::get_fullname($username,$userdomain);
               #goes through all resources, checks if they are available for current student, and produces output   
       foreach my $curresline (@master_seq)  {
    my ($curres,$symb) = split /&&/, $curresline;
                   if ($curres=~ m/\.(problem|exam|quiz|assess|survey|form|library)/) {
       my ($map,$id,$res_url) = split(/___/,$symb);
       if (&Apache::lonnet::allowed('bre',$res_url)) {
    my $rendered = &Apache::loncommon::get_student_view($symb,$username,$userdomain,
                                                                           $ENV{'request.course.id'},'tex');
    if ($flag_latex_header_remove eq 'YES') {
       $rendered = &latex_header_footer_remove($rendered);
    } else {
       $rendered =~ s/\\end{document}//;
    }
    $current_output .= $rendered;
       }
       $flag_latex_header_remove = 'YES';
    }
       }
       if ($current_output=~/\\documentclass/) {
    $current_output =~ s/\\begin{document}/\\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\fbox{\\textbf{$fullname}}\\hskip 1\.4in } \\vskip 5 mm /;
       } else {
    $current_output = '\\vskip 3mm\noindent\parbox{\minipagewidth}{\noindent\fbox{\textbf{'.$fullname.'}}\hskip 1.4in } \vskip 5 mm '.$current_output;
       }
       $result .= $current_output;
  }   }
       }   $result .= '\end{document}'; 
 #-- cleanup of output string (temporary cbi-specific)      } elsif ($choice eq 'Subdirectory print') {      
       $output_seq =~ s/<physnet>//g;      #prints selected problems from the subdirectory 
       $output_seq =~ s/<\/physnet>//g;   $selectionmade = 6;
       $output_seq = '<physnet>'.$output_seq.' </physnet>';          my @list_of_files = ();
 #-- final accord   for (my $i=0; $i<$ENV{'form.numberofproblems'};$i++) {
       $result = &Apache::lonxml::xmlparse('tex',$output_seq,'',%mystyle);      if ($ENV{'form.whattoprint'.$i}=~/^\//) {
     }  elsif ($choice eq 'Standard LaTeX output for the top level sequence') {   push @list_of_files,$ENV{'form.whattoprint'.$i};
  my @master_seq = ();      }
  my $keyword = 0;   }
  my $output_seq = '';   my $flag_latex_header_remove = 'NO';  
 #-- where is the main sequence of the course?   for (my $i=0;$i<=$#list_of_files;$i++) {
  my $main_seq = '/res/'.$ENV{'request.course.uri'};      my $urlp = $list_of_files[$i];
  my $file=&Apache::lonnet::filelocation("",$main_seq);      if ($urlp=~/\//) {
  my $filecontents=&Apache::lonnet::getfile($file);  
  my @file_seq = &content_map($filecontents);  
 #-- temporary solution (without sequence inside sequence) - have to be generalized  
   
   
   
   
 # if (defined @master_seq) {  
 #                    my $old_value = $#master_seq;  
 #    my $total_value = $#master_seq + $#file_seq +2;  
 #                    for (my $j=0; $j<=$old_value-$keyword+1; $j++) {  
 # $master_seq[$total_value-$j] = $master_seq[$old_value-$j];  
 #    }  
 #                    for (my $j=0; $j<=$#file_seq; $j++){  
 # $master_seq[$keyword+$j] = $file_seq[$j];  
 #    }  
 #    @file_seq = ();  
 #    $keyword = 0;  
 # } else {  
     @master_seq = @file_seq;  
 #                    @file_seq = ();  
 # }  
   
 #-- checking wether .sequence file is among the set of files  
 #    my  $current_file = '';  
 #    for (my $i=0; $i<=$#file_seq; $i++) {  
 # $_ = $file_seq[$i];  
 # if (m/(.*)\.sequence/) {  
 #    $current_file = $_;  
 #    $keyword = $i;  
 #    last;  
 # }  
 #    }          
   
 #-- produce an output string  
  for (my $i=0;$i<=$#master_seq;$i++) {  
     $_ = $master_seq[$i];  
     m/\"(.*)\"/;  
             $_ = $1;  
             my $urlp = $1;  
             if (/\.problem/) {  
  my %moreenv;   my %moreenv;
  $moreenv{'form.grade_target'}='tex';   $moreenv{'form.grade_target'}='tex';
  &Apache::lonnet::appenv(%moreenv);   &Apache::lonnet::appenv(%moreenv);
    if ($ENV{'request.role'}=~m/^au\./ or $ENV{'request.role'}=~m/^ca\./) { 
       $urlp =~ s/\/home\/([^\/]*)\/public_html/\/~$1/; 
    }
  my $texversion=&Apache::lonnet::ssi($urlp);   my $texversion=&Apache::lonnet::ssi($urlp);
  &Apache::lonnet::delenv('form.grade_target');   &Apache::lonnet::delenv('form.grade_target');
  $texversion =~ s!\.gif!\.eps!;   $texversion =~ s/(\\begin{document})/$1 {\\tiny\\begin{verbatim}$urlp\\end{verbatim}}/;
  $result .= $texversion;           if ($flag_latex_header_remove ne 'NO') {
       $texversion = &latex_header_footer_remove($texversion);
    } else {
       $texversion =~ s/\\end{document}//;
    }
    $result .= $texversion;
     }      }
       $flag_latex_header_remove = 'YES';  
  }   }
 #-- additional cleanup for output   $result .= '\end{document}';      
  my $first_app = index($result,'\documentclass',0);  
  $first_app = index($result,'\documentclass',$first_app+5);  
  while ($first_app != -1) {  
     my $second_app = index($result,'begin{document}',$first_app);  
     $first_app = rindex($result,'\end{document}',$first_app);  
     substr($result,$first_app,$second_app-$first_app+15) = '\vskip 7 mm';  
     $first_app = index($result,'\documentclass',$first_app+5);  
  }  
     }      }
 #-- corrections for the different page formats  #-------------------------------------------------------- corrections for the different page formats
     if ($layout eq 'CBI') {  #    my ($textwidth,$textheight,$offset) = (0,0,0);
   #    if ($papersize=~/Letter/) {
   # $textwidth = ;
   #        $textheight = ;
   #        $offset = ;
   #    } elsif($papersize=~/Legal/) {
   # $textwidth = ;
   #        $textheight = ;
   #        $offset = ;
   #    } elsif($papersize=~/Ledger/) {
   # $textwidth = ;
   #        $textheight = ;
   #        $offset = ;
   #    } elsif($papersize=~/Executive/) {
   # $textwidth = ;
   #        $textheight = ;
   #        $offset = ;
   #    } elsif($papersize=~/A4/) {
   # $textwidth = ;
   #        $textheight = ;
   #        $offset = ;
   #    } elsif($papersize=~/A3/) {
   # $textwidth = ;
   #        $textheight = ;
   #        $offset = ;
   #    } elsif($papersize=~/A2/) {
   # $textwidth = ;
   #        $textheight = ;
   #        $offset = ;
   #    } elsif($papersize=~/A5/) {
   # $textwidth = ;
   #        $textheight = ;
   #        $offset = ;
   #    } elsif($papersize=~/A6/) {
   # $textwidth = ;
   #        $textheight = ;
   #        $offset = ;
   #                                           <option selected> Letter [8 1/2x11 in] </option>
   #                                            <option> Legal [8 1/2x14 in] </option>
   #                                            <option> Ledger/Tabloid [11x17 in] </option>
   #                                            <option> Executive [7 1/2x10 in] </option>
   #                                            <option> A2 [420x594 mm] </option>
   #                                            <option> A3 [297x420 mm] </option>
   #                                            <option> A4 [210x297 mm] </option>
   #                                            <option> A5 [148x210 mm] </option>
   #                                            <option> A6 [105x148 mm] </option>
   #
   #    }
   
       if ($layout eq 'CBI' and $numberofcolumns eq '1') {
    $result =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{-40pt}\\setlength{\\evensidemargin}{-60pt}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{4\.4in}\\setlength{\\textheight}{6\.8in}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt} \\begin{document}/;
    $result =~ s/\$number_of_columns/$number_of_columns/g;
           $laystyle = 'album';
       } elsif ($layout eq 'CBI' and $numberofcolumns eq '2') {
  $result =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{-40pt}\\setlength{\\evensidemargin}{-60pt}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{4\.4in}\\setlength{\\textheight}{6\.8in}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt} \\begin{document}/;   $result =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{-40pt}\\setlength{\\evensidemargin}{-60pt}\\setlength{\\topmargin}{200pt}\\setlength{\\textwidth}{4\.4in}\\setlength{\\textheight}{6\.8in}\\setlength{\\parindent}{20pt}\\setlength{\\marginparwidth}{90pt}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt} \\begin{document}/;
    $result =~ s/\$number_of_columns/$number_of_columns/g;
         $laystyle = 'album';          $laystyle = 'album';
     } elsif ($layout eq 'CAPA') {      } elsif ($layout eq 'CAPA') {
         my $courseidinfo = $ENV{'request.role'};          my $courseidinfo = $ENV{'request.role'};
         $_ = $courseidinfo;          $_ = $courseidinfo;
         m/.*\/(.*)/;          m/.*\/(.*)/;
         $courseidinfo = $ENV{'course.physnet_'.$1.'.description'};          $courseidinfo = $ENV{'course.physnet_'.$1.'.description'};
  $result =~ s/\\documentclass\[letterpaper\]{article}/\\documentclass\[twocolumn\]{article}/;   $result =~ s/\\documentclass\[letterpaper\]{article}/\\documentclass{article}/;
  $result =~ s/\\begin{document}/\\textheight 25\.9cm\\oddsidemargin = -0\.57in\\evensidemargin = -0\.57in\\textwidth= 7\.7in\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}\\noindent\\fbox{\\textbf{$ENV{'environment.firstname'} $ENV{'environment.lastname'}}}\\hskip 1\.4in $courseidinfo \\vskip 5 mm /;   if ($choice ne 'All class print') { 
  $result =~ s/\\includegraphics/\\includegraphics\[width=9\.0 cm\]/g;      $result =~ s/\\begin{document}/\\textheight 25\.9cm\\oddsidemargin = -0\.57in\\evensidemargin = -0\.57in\\textwidth= 9cm\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}\\parbox{\\minipagewidth}{\\noindent\\fbox{\\textbf{$ENV{'environment.firstname'} $ENV{'environment.lastname'}}}\\hskip 1\.4in $courseidinfo} \\vskip 5 mm /;
           } else {
       $result =~ s/\\begin{document}/\\textheight 25\.9cm\\oddsidemargin = -0\.57in\\evensidemargin = -0\.57in\\textwidth= 9cm\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\begin{document}\\voffset=-1\.8cm\\setcounter{page}{1}  \\vskip 5 mm /;
    }
    $result =~ s/\\includegraphics{/\\includegraphics\[width=9\.0 cm\]{/g;
   # $result =~ s/\\includegraphics{/\\includegraphics\[width=\\textwidth\]{/g;
   # $result =~ s/(\\end{document})/\\newline\\noindent\\makebox\[9.0cm\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Dept\. of Physics and Astronomy, MSU\\makebox\[1.5cm\]\[b\]{\\hfill}LON-CAPA\\copyright MSU GNU\/GPL $1/;
    $result =~ s/(\\end{document})/\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny \\makebox\[1.5cm\]\[b\]{\\hfill}LON-CAPA\\copyright Michigan State University Board of Trustees $1/;
   #        $result =~ s/(\\end{longtable}\s*)(\\newline\\noindent\\makebox\[9\.0cm\]\[b\]{\\hrulefill})/$2$1/g;
           $result =~ s/(\\end{longtable}\s*)(\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;
           $result =~ s/(\\end{longtable}\s*)\\newline/$1/g;
    $result =~ s/\$number_of_columns/$number_of_columns/g;
       }
       #changes page's parameters for the one column output 
       if ($ENV{'form.numberofcolumns'} == 1) {
    $result =~ s/\\textwidth= 9cm/\\textwidth= $ENV{'form.width'}/;
    $result =~ s/\\textheight 25\.9cm/\\textheight $ENV{'form.height'}/;
    $result =~ s/\\evensidemargin = -0\.57in/\\evensidemargin= $ENV{'form.leftmargin'}/;
    $result =~ s/\\oddsidemargin = -0\.57in/\\oddsidemargin= $ENV{'form.leftmargin'}/;
       }
   #-- LaTeX corrections     
       my $first_comment = index($result,'<!--',0);
       while ($first_comment != -1) {
    my $end_comment = index($result,'-->',$first_comment);
    substr($result,$first_comment,$end_comment-$first_comment+3) = '';
    $first_comment = index($result,'<!--',$first_comment);
     }      }
 #-- LaTeX corrections   
     $result =~ s/^\s+$//gm; #remove empty lines      $result =~ s/^\s+$//gm; #remove empty lines
     $result =~ s/%/\\%/g;   #corrects %      $result =~ s/(\s)+/$1/g; #removes more than one empty space
       $result =~ s/\\\\\s*\\vskip/\\vskip/gm;
       $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;
       $result =~ s/{\\par }\s*\\\\/\\\\/gm;
    $result =~ s/\\\\\s+\[/ \[/g;
       $result =~ s/&#952;/\$\\theta\$/g; #converts theta from html into tex
       $result =~ s/\b__+\b/\\makebox\[1 cm\]\[b\]{\\hrulefill}/g;
       #conversion of html characters to LaTeX equivalents
       if ($result =~ m/&(\w+|#\d+);/) {
    $result = &character_chart($result);
       }
       $result =~ s/(\\end{tabular})\s*\\vskip 0 mm/$1/g;
       $result =~ s/(\\begin{enumerate})\s*\\noindent/$1/g;
 #-- writing .tex file in prtspool   #-- writing .tex file in prtspool 
     my $temp_file;      my $temp_file;
     $filename = "/home/httpd/prtspool/$ENV{'environment.firstname'}$ENV{'environment.lastname'}temp$ENV{'user.login.time'}.tex";      my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".time."_".rand(10000000).".tex";
     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;
 $r->print(<<FINALEND);  $r->print(<<FINALEND);
 <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$filename&$laystyle">  <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$filename&$laystyle&$numberofcolumns&$selectionmade">
 </body>  </body>
 </html>  </html>
 FINALEND  FINALEND
 }  }
   
   
   sub coming_from_hash_whole {
   
       my $mainsequence = shift;
 sub content_map {      my @resourcelist = ();
 #-- find a list of files to print      my $mapid = $hash{'map_pc_'.$mainsequence};
     my $map_string = shift;      my $mapstart = $hash{'map_start_'.$mainsequence};
     my @number_seq = ();      my $mapfinish = $hash{'map_finish_'.$mainsequence};
     my @file_seq = ();      my $current_resource = $mapstart;
     my $startlink = index($map_string,'<link',0);      while ($current_resource ne $mapfinish) {
     my $endlink = index($map_string,'</link>',$startlink);   if ($hash{'src_'.$current_resource}=~/\.sequence$/) {
     my $chunk = substr($map_string,$startlink,$endlink-$startlink+7);      push @resourcelist,&coming_from_hash_whole($hash{'src_'.$current_resource});
     $_ = $chunk;   } else {
     m/from=\"(\d+)\"/;              $mainsequence =~ /\/res\/(.*)$/;
     push @number_seq,$1;      my $presymb = $1;
     while ($startlink != -1) {      my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
  $endlink = index($map_string,'</link>',$startlink);              if ($rid=~/,/) {
  $chunk = substr($map_string,$startlink,$endlink-$startlink+7);   my @rid = split /,/, $rid;
  substr($map_string,$startlink,$endlink-$startlink+7) = '';   foreach my $rid_element (@rid) {
  $_ = $chunk;      if ($rid_element =~ m/^$mapid\.(\d*)/) {
         m/to=\"(\d+)\"/;   $rid = $1; 
  push @number_seq,$1;   last;
  $startlink = index($map_string,'from="'.$1.'"',$startlink);      }
     }  
     my $stalink = index($map_string,' to="'.$number_seq[0].'"',$startlink);  
     while ($stalink != -1) {  
  $startlink = rindex($map_string,'<link ',$stalink);  
  $endlink = index($map_string,'</link>',$startlink);  
  $chunk = substr($map_string,$startlink,$endlink-$startlink+7);  
  substr($map_string,$startlink,$endlink-$startlink+7) = '';  
  $_ = $chunk;  
         m/from=\"(\d+)\"/;  
  unshift @number_seq,$1;  
  $stalink = index($map_string,' to="'.$number_seq[0].'"',0);  
     }  
     for (my $i=0;$i<=$#number_seq;$i++) {  
  $stalink = index($map_string,' id="'.$number_seq[$i].'"',0);  
         {      
     my $ahed1 = index($map_string,'src="',$stalink);  
     my $ahed2 = index($map_string,'</resource>',$stalink);  
     if ($ahed1 != -1) {  
  if ($ahed1 < $ahed2) {  
     $startlink = $ahed1;  
  } else {  
     $startlink = rindex($map_string,'src="',$stalink);  
  }   }
     } else {      } else {
  $startlink = rindex($map_string,'src="',$stalink);   $rid =~ m/^$mapid\.(\d*)/;
                   $rid = $1;  
     }      }
       $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
       my $symb = $presymb.'___'.$rid.'___'.$1;    
       push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb;
    }
    $current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}};
       }
       return @resourcelist;
   }
   
   
   sub coming_from_hash {
   
       my ($mainsequence,$symb) = @_;
       my @resourcelist = ();
       my $mapid = $hash{'map_pc_'.$mainsequence};
       my $mapstart = $hash{'map_start_'.$mainsequence};
       my $mapfinish = $hash{'map_finish_'.$mainsequence};
       my ($presymb) = split(/___/,$symb);
       $presymb = $presymb.'___';
       my $current_resource = $mapstart;
       while ($current_resource ne $mapfinish) {
    if (not $hash{'src_'.$current_resource}=~/\.sequence$/) {
       my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
               if ($rid=~/,/) {
    my @rid = split /,/, $rid;
    foreach my $rid_element (@rid) {
       if ($rid_element =~ m/^$mapid\.(\d*)/) {
    $rid = $1; 
    last;
       }
    }
       } else {
    $rid =~ m/^$mapid\.(\d*)/;
                   $rid = $1;  
       }
       $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
       $symb = $presymb.$rid.'___'.$1;
       push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb;
    } else {
       push @resourcelist,&coming_from_hash($hash{'src_'.$current_resource});
  }   }
  $startlink = index($map_string,'"',$startlink);   $current_resource = $hash{'goesto_'.$hash{'to_'.$current_resource}};
  $endlink = index($map_string,'"',$startlink+1);      }
  $chunk = substr($map_string,$startlink,$endlink-$startlink+1);      #needs if final resource in the map (type="finish") contains something
  push @file_seq,$chunk;      if (not $hash{'src_'.$current_resource}=~/\.sequence$/) {
       my $rid = $hash{'ids_'.$hash{'src_'.$current_resource}};
               if ($rid=~/,/) {
    my @rid = split /,/, $rid;
    foreach my $rid_element (@rid) {
       if ($rid_element =~ m/^$mapid\.(\d*)/) {
    $rid = $1; 
    last;
       }
    }
       } else {
    $rid =~ m/^$mapid\.(\d*)/;
                   $rid = $1;  
       }
       $hash{'src_'.$current_resource} =~ m/\/res\/(.*)$/;
       $symb = $presymb.$rid.'___'.$1;
    push @resourcelist,$hash{'src_'.$current_resource}.'&&'.$symb;
       } else {
    push @resourcelist,&coming_from_hash($hash{'src_'.$current_resource});
     }      }
     return @file_seq;      return @resourcelist;
 }  }
   
   
   sub latex_header_footer_remove {
       my $text = shift;
       $text =~ s/\\end{document}//;
       $text =~ s/\\documentclass([^&]*)\\begin{document}//;
       return $text;
   }
   
   
   sub character_chart {
       my $result = shift;
       $result =~ s/&#0?0?7;//g;
       $result =~ s/&#0?0?9;//g;
       $result =~ s/&#0?10;//g;
       $result =~ s/&#0?13;//g;
       $result =~ s/&#0?32;/ /g;
       $result =~ s/&#0?33;/!/g;
       $result =~ s/&#0?34;/"/g;
       $result =~ s/&quot;/"/g; 
       $result =~ s/&#0?35;/\\#/g;
   #    $result =~ s/&#0?36;/\\\$/g;
       $result =~ s/&#0?37;/\\%/g; 
       $result =~ s/&#0?38;/\\&/g; 
       $result =~ s/&amp;/\\&/g;
       $result =~ s/&#0?39;/'/g;
       $result =~ s/&#0?40;/(/g;
       $result =~ s/&#0?41;/)/g;
       $result =~ s/&#0?42;/\*/g;
       $result =~ s/&#0?43;/\+/g;
       $result =~ s/&#0?44;/,/g;
       $result =~ s/&#0?45;/-/g;
       $result =~ s/&#0?46;/\./g;
       $result =~ s/&#0?47;/\//g;
       $result =~ s/&#0?48;/0/g;
       $result =~ s/&#0?49;/1/g;
       $result =~ s/&#0?50;/2/g;
       $result =~ s/&#0?51;/3/g;
       $result =~ s/&#0?52;/4/g;
       $result =~ s/&#0?53;/5/g;
       $result =~ s/&#0?54;/6/g;
       $result =~ s/&#0?55;/7/g;
       $result =~ s/&#0?56;/8/g;
       $result =~ s/&#0?57;/9/g;
       $result =~ s/&#0?58;/:/g;
       $result =~ s/&#0?59;/;/g;
       $result =~ s/&#0?60;/\$<\$/g;
       $result =~ s/&lt;/\$<\$/g;
       $result =~ s/&#0?61;/\$=\$/g;
       $result =~ s/&#0?62;/\$>\$/g;
       $result =~ s/&gt;/\$>\$/g;
       $result =~ s/&#0?63;/?/g;
   #    $result =~ s/&#0?64;//g;
       $result =~ s/&#0?65;/A/g;
       $result =~ s/&#0?66;/B/g;
       $result =~ s/&#0?67;/C/g;
       $result =~ s/&#0?68;/D/g;
       $result =~ s/&#0?69;/E/g;
       $result =~ s/&#0?70;/F/g;
       $result =~ s/&#0?71;/G/g;
       $result =~ s/&#0?72;/H/g;
       $result =~ s/&#0?73;/I/g;
       $result =~ s/&#0?74;/J/g;
       $result =~ s/&#0?75;/K/g;
       $result =~ s/&#0?76;/L/g;
       $result =~ s/&#0?77;/M/g;
       $result =~ s/&#0?78;/N/g;
       $result =~ s/&#0?79;/O/g;
       $result =~ s/&#0?80;/P/g;
       $result =~ s/&#0?81;/Q/g;
       $result =~ s/&#0?82;/R/g;
       $result =~ s/&#0?83;/S/g;
       $result =~ s/&#0?84;/T/g;
       $result =~ s/&#0?85;/U/g;
       $result =~ s/&#0?86;/V/g;
       $result =~ s/&#0?87;/W/g;
       $result =~ s/&#0?88;/X/g;
       $result =~ s/&#0?89;/Y/g;
       $result =~ s/&#0?90;/Z/g;
       $result =~ s/&#0?91;/[/g;
       $result =~ s/&#0?92;/\\/g;
       $result =~ s/&#0?93;/]/g;
   #    $result =~ s/&#0?94;//g;
   #    $result =~ s/&#0?95;//g;
       $result =~ s/&#0?96;/`/g;
       $result =~ s/&#0?97;/a/g;
       $result =~ s/&#0?98;/b/g;
       $result =~ s/&#0?99;/c/g;
       $result =~ s/&#100;/d/g;
       $result =~ s/&#101;/e/g;
       $result =~ s/&#102;/f/g;
       $result =~ s/&#103;/g/g;
       $result =~ s/&#104;/h/g;
       $result =~ s/&#105;/i/g;
       $result =~ s/&#106;/j/g;
       $result =~ s/&#107;/k/g;
       $result =~ s/&#108;/l/g;
       $result =~ s/&#109;/m/g;
       $result =~ s/&#110;/n/g;
       $result =~ s/&#111;/o/g;
       $result =~ s/&#112;/p/g;
       $result =~ s/&#113;/q/g;
       $result =~ s/&#114;/r/g;
       $result =~ s/&#115;/s/g;
       $result =~ s/&#116;/t/g;
       $result =~ s/&#117;/u/g;
       $result =~ s/&#118;/v/g;
       $result =~ s/&#119;/w/g;
       $result =~ s/&#120;/x/g;
       $result =~ s/&#121;/y/g;
       $result =~ s/&#122;/z/g;
       $result =~ s/&#123;/\\{/g;
       $result =~ s/&#124;/\|/g;
       $result =~ s/&#125;/\\}/g;
       $result =~ s/&#126;/\~/g;
       $result =~ s/&#130;/,/g;
   #    $result =~ s/&#131;//g;
       $result =~ s/&#132;/''/g;
       $result =~ s/&#133;/\$\\ldots\$/g;
       $result =~ s/&#134;/\$\\dagger\$/g;
       $result =~ s/&#135;/\$\\ddagger\$/g;
   #    $result =~ s/&#136;//g;
   #    $result =~ s/&#137;//g;
   #    $result =~ s/&#138;//g;
       $result =~ s/&#139;/\$<\$/g;
   #    $result =~ s/&#140;//g;
       $result =~ s/&#145;/`/g;
       $result =~ s/&#146;/'/g;
       $result =~ s/&#147;/``/g;
       $result =~ s/&#148;/''/g;
       $result =~ s/&#149;/\$\\bullet\$/g;
   #    $result =~ s/&#150;//g;
   #    $result =~ s/&#151;//g;
       $result =~ s/&#152;/~/g;
   #    $result =~ s/&#153;//g;
   #    $result =~ s/&#154;//g;
       $result =~ s/&#155;/\$>\$/g;
       $result =~ s/&#156;/\\{\\oe\\}/g;
       $result =~ s/&#159;/\\"\\{Y\\}/g;
       $result =~ s/&#160;//g;
       $result =~ s/&nbsp;//g;
       $result =~ s/&#161;/!`/g;
       $result =~ s/&iexcl;/!`/g; #`
   #    $result =~ s/&#162;//g;
   #    $result =~ s/&cent;//g;
       $result =~ s/&#163;/\\pounds/g; 
       $result =~ s/&pound;/\\pounds/g;
   #    $result =~ s/&#164;//g;
   #    $result =~ s/&curren;//g;
   #    $result =~ s/&#165;//g;
   #    $result =~ s/&yen;//g;
   #    $result =~ s/&#166;//g;
   #    $result =~ s/&brvbar;//g;
   #    $result =~ s/&#167;//g;
   #    $result =~ s/&sect;//g;
   #    $result =~ s/&#168;//g;
   #    $result =~ s/&uml;//g;
       $result =~ s/&#169;/\\copyright/g;
       $result =~ s/&copy;/\\copyright/g;
   #    $result =~ s/&#170;//g;
   #    $result =~ s/&ordf;//g;
   #    $result =~ s/&#171;//g;
   #    $result =~ s/&laquo;//g;
       $result =~ s/&#172;/\$\\neg\$/g;
       $result =~ s/&not;/\$\\neg\$/g;
   #    $result =~ s/&#173;//g;
   #    $result =~ s/&shy;//g;
   #    $result =~ s/&#174;//g;
   #    $result =~ s/&reg;//g;
   #    $result =~ s/&#175;//g;
   #    $result =~ s/&macr;//g;
       $result =~ s/&#176;/\$^{\\circ}\$/g;
       $result =~ s/&deg;/\$^{\\circ}\$/g;
       $result =~ s/&#177;/\$\\pm\$/g;
       $result =~ s/&plusmn;/\$\\pm\$/g;
       $result =~ s/&#178;/\$^2\$/g;
       $result =~ s/&sup2;/\$^2\$/g;
       $result =~ s/&#179;/\$^3\$/g;
       $result =~ s/&sup3;/\$^3\$/g;
   #    $result =~ s/&#180;//g;
   #    $result =~ s/&acute;//g;
       $result =~ s/&#181;/\$\\mu\$/g;
       $result =~ s/&micro;/\$\\mu\$/g;
       $result =~ s/&#182;/\\P/g;
       $result =~ s/&para;/\\P/g;
       $result =~ s/&#183;/\$\\cdot\$/g;
       $result =~ s/&middot;/\$\\cdot\$/g;
   #    $result =~ s/&#184;//g;
   #    $result =~ s/&cedil;//g;
       $result =~ s/&#185;/\$^1\$/g;
       $result =~ s/&sup1;/\$^1\$/g;
   #    $result =~ s/&#186;//g;
   #    $result =~ s/&ordm;//g;
   #    $result =~ s/&#187;//g;
   #    $result =~ s/&raquo;//g;
   #    $result =~ s/&#188;//g;
   #    $result =~ s/&frac14;//g;
   #    $result =~ s/&#189;//g;
   #    $result =~ s/&frac12;//g;
   #    $result =~ s/&#190;//g;
   #    $result =~ s/&frac34;//g;
       $result =~ s/&#191;/?`/g;
       $result =~ s/&iquest;/?`/g; 
       $result =~ s/&#192;/\\`{A}/g;
       $result =~ s/&Agrave;/\\`{A}/g; 
       $result =~ s/&#193;/\\'{A}/g; 
       $result =~ s/&Aacute;/\\'{A}/g; 
       $result =~ s/&#194;/\\^{A}/g;
       $result =~ s/&Acirc;/\\^{A}/g;
       $result =~ s/&#195;/\\~{A}/g;
       $result =~ s/&Atilde;/\\~{A}/g;
       $result =~ s/&#196;/\\"{A}/g; 
       $result =~ s/&Auml;/\\"{A}/g; 
       $result =~ s/&#197;/{\\AA}/g;
       $result =~ s/&Aring;/{\\AA}/g;
       $result =~ s/&#198;/{\\AE}/g;
       $result =~ s/&AElig;/{\\AE}/g;
   #    $result =~ s/&#199;//g;
   #    $result =~ s/&Ccedil;//g;
       $result =~ s/&#200;/\\`{E}/g;
       $result =~ s/&Egrave;/\\`{E}/g;
       $result =~ s/&#201;/\\'{E}/g;
       $result =~ s/&Eacute;/\\'{E}/g;
       $result =~ s/&#202;/\\^{E}/g;
       $result =~ s/&Ecirc;/\\^{E}/g;
       $result =~ s/&#203;/\\`{E}/g;
       $result =~ s/&Euml;/\\`{E}/g;
       $result =~ s/&#204;/\\`{I}/g;
       $result =~ s/&Igrave;/\\`{I}/g; 
       $result =~ s/&#205;/\\'{I}/g; 
       $result =~ s/&Iacute;/\\'{I}/g; 
       $result =~ s/&#206;/\\^{I}/g;
       $result =~ s/&Icirc;/\\^{I}/g;
       $result =~ s/&#207;/\\"{I}/g; 
       $result =~ s/&Iuml;/\\"{I}/g; 
   #    $result =~ s/&#208;//g;
   #    $result =~ s/&ETH;//g;
       $result =~ s/&#209;/\\~{N}/g;
       $result =~ s/&Ntilde;/\\~{N}/g;
       $result =~ s/&#210;/\\`{O}/g;
       $result =~ s/&Ograve;/\\`{O}/g; 
       $result =~ s/&#211;/\\'{O}/g;
       $result =~ s/&Oacute;/\\'{O}/g; 
       $result =~ s/&#212;/\\^{O}/g;
       $result =~ s/&Ocirc;/\\^{O}/g;
       $result =~ s/&#213;/\\~{O}/g;
       $result =~ s/&Otilde;/\\~{O}/g;
       $result =~ s/&#214;/\\"{O}/g;
       $result =~ s/&Ouml;/\\"{O}/g; 
       $result =~ s/&#215;/\$\\times\$/g;
       $result =~ s/&times;/\$\\times\$/g;
       $result =~ s/&#216;/{\\O}/g;
       $result =~ s/&Oslash;/{\\O}/g;
       $result =~ s/&#217;/\\`{U}/g;
       $result =~ s/&Ugrave;/\\`{U}/g;
       $result =~ s/&#218;/\\'{U}/g;
       $result =~ s/&Uacute;/\\'{U}/g;
       $result =~ s/&#219;/\\^{U}/g;
       $result =~ s/&Ucirc;/\\^{U}/g;
       $result =~ s/&#220;/\\"{U}/g;
       $result =~ s/&Uuml;/\\"{U}/g;
       $result =~ s/&#221;/\\'{Y}/g;
       $result =~ s/&Yacute;/\\'{Y}/g;
   #    $result =~ s/&#222;//g;
   #    $result =~ s/&THORN;//g;
   #    $result =~ s/&#223;//g;
   #    $result =~ s/&szlig;//g;
       $result =~ s/&#224;/\\`{a}/g;
       $result =~ s/&agrave;/\\`{a}/g;
       $result =~ s/&#225;/\\'{a}/g;
       $result =~ s/&aacute;/\\'{a}/g;
       $result =~ s/&#226;/\\^{a}/g;
       $result =~ s/&acirc;/\\^{a}/g;
       $result =~ s/&#227;/\\~{a}/g;
       $result =~ s/&atilde;/\\~{a}/g;
       $result =~ s/&#228;/\\"{a}/g;
       $result =~ s/&auml;/\\"{a}/g;
       $result =~ s/&#229;/{\\aa}/g;
       $result =~ s/&aring;/{\\aa}/g;
       $result =~ s/&#230;/{\\ae}/g;
       $result =~ s/&aelig;/{\\ae}/g;
   #    $result =~ s/&#231;//g;
   #    $result =~ s/&ccedil;//g;
       $result =~ s/&#232;/\\`{e}/g;
       $result =~ s/&egrave;/\\`{e}/g;
       $result =~ s/&#233;/\\'{e}/g;
       $result =~ s/&eacute;/\\'{e}/g;
       $result =~ s/&#234;/\\^{e}/g;
       $result =~ s/&ecirc;/\\^{e}/g;
       $result =~ s/&#235;/\\"{e}/g;
       $result =~ s/&euml;/\\"{e}/g;
       $result =~ s/&#236;/\\`{i}/g;
       $result =~ s/&igrave;/\\`{i}/g;
       $result =~ s/&#237;/\\'{i}/g;
       $result =~ s/&iacute;/\\'{i}/g;
       $result =~ s/&#238;/\\^{i}/g;
       $result =~ s/&icirc;/\\^{i}/g;
       $result =~ s/&#239;/\\"{i}/g;
       $result =~ s/&iuml;/\\"{i}/g;
   #    $result =~ s/&#240;//g;
   #    $result =~ s/&eth;//g;
       $result =~ s/&#241;/\\~{n}/g;
       $result =~ s/&ntilde;/\\~{n}/g;
       $result =~ s/&#242;/\\`{o}/g;
       $result =~ s/&ograve;/\\`{o}/g;
       $result =~ s/&#243;/\\'{o}/g;
       $result =~ s/&oacute;/\\'{o}/g;
       $result =~ s/&#244;/\\^{o}/g;
       $result =~ s/&ocirc;/\\^{o}/g;
       $result =~ s/&#245;/\\~{o}/g;
       $result =~ s/&otilde;/\\~{o}/g;
       $result =~ s/&#246;/\\"{o}/g;
       $result =~ s/&ouml;/\\"{o}/g;
       $result =~ s/&#247;/\$\\div\$/g;
       $result =~ s/&divide;/\$\\div\$/g;
       $result =~ s/&#248;/{\\o}/g;
       $result =~ s/&oslash;/{\\o}/g;
       $result =~ s/&#249;/\\`{u}/g; 
       $result =~ s/&ugrave;/\\`{u}/g;
       $result =~ s/&#250;/\\'{u}/g;
       $result =~ s/&uacute;/\\'{u}/g;
       $result =~ s/&#251;/\\^{u}/g;
       $result =~ s/&ucirc;/\\^{u}/g;
       $result =~ s/&#252;/\\"{u}/g;
       $result =~ s/&uuml;/\\"{u}/g;
       $result =~ s/&#253;/\\'{y}/g;
       $result =~ s/&yacute;/\\'{y}/g;
   #    $result =~ s/&#254;//g;
   #    $result =~ s/&thorn;//g;
       $result =~ s/&#255;/\\"{y}/g;
       $result =~ s/&yuml;/\\"{y}/g;
       return $result;
   }
   
   
   #'"`
   
   
   sub page_cleanup {
       my $result = shift;
    
       $result =~ m/\\end{document}(\d*)$/;
       my $number_of_columns = $1;
       my $insert = '{';
       for (my $id=1;$id<=$number_of_columns;$id++) { $insert .='l'; }
       $insert .= '}';
       $result =~ s/(\\begin{longtable})INSERTTHEHEADOFLONGTABLE\\endfirsthead\\endhead/$1$insert/g;
       $result =~ s/&\s*REMOVETHEHEADOFLONGTABLE\\\\/\\\\/g;
       return $result,$number_of_columns;
   }
   
   
   sub details_for_menu {
   
       my $name_of_resourse = $hash{'title_'.$hash{'ids_'.$ENV{'form.postdata'}}};
       my $symbolic = &Apache::lonnet::symbread($ENV{'form.postdata'});
       my ($map,$id,$resource)=split(/___/,$symbolic);
       my $name_of_sequence = $hash{'title_'.$hash{'ids_/res/'.$map}};
       if ($name_of_sequence =~ /^\s*$/) {
         $map =~ m|([^/]+)$|;
         $name_of_sequence = $1;
       }
       my $name_of_map = $hash{'title_'.$hash{'ids_/res/'.$ENV{'request.course.uri'}}};
       if ($name_of_map =~ /^\s*$/) {
         $ENV{'request.course.uri'} =~ m|([^/]+)$|;
         $name_of_map = $1;
       }
       return ($name_of_resourse,$name_of_sequence,$name_of_map);
   
   }
   
   
 sub handler {  sub handler {
   
     my $r = shift;      my $r = shift;
   
       my $loaderror=&Apache::lonnet::overloaderror($r);
       if ($loaderror) { return $loaderror; }
       $loaderror=
          &Apache::lonnet::overloaderror($r,
            $ENV{'course.'.$ENV{'request.course.id'}.'.home'});
       if ($loaderror) { return $loaderror; }
   
     $r->content_type('text/html');      $r->content_type('text/html');
     $r->send_http_header;      $r->send_http_header;
       $r->print(&Apache::loncommon::bodytag("Printing"));
   
       if ($ENV{'request.course.id'}) {
    my $fn=$ENV{'request.course.fn'};
    tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640);
       }
   
 #-- start form  #-- start form
     &headerform($r);      &headerform($r);
Line 342  sub handler { Line 1139  sub handler {
     unless  ($ENV{'form.phase'}) {      unless  ($ENV{'form.phase'}) {
  &menu_for_output($r);   &menu_for_output($r);
     }      }
   #-- additional menu for class printing
        if ($ENV{'form.phase'} eq 'two') {
    if($ENV{'form.choice'} eq 'All class print') {
        &additional_class_menu($r);
    } elsif($ENV{'form.choice'} eq 'Subdirectory print') {
        &problem_choice_menu($r);
    } else {
        $ENV{'form.phase'} = 'three';
    }
        }
   #-- additional menu for page layout (one column case)
       if ($ENV{'form.phase'} eq 'three') {
    if($ENV{'form.numberofcolumns'} == 1) {
       &additional_print_menu($r);
    } else {
       $ENV{'form.phase'} = 'four';
    }
       }
 #-- core part   #-- core part 
     if ($ENV{'form.phase'} eq 'two') {      if ($ENV{'form.phase'} eq 'four') {
  &output_data($r);   &output_data($r);
       }
     }      untie %hash;
     return OK;      return OK;
      
 }   } 
   
   
 1;  1;
 __END__  __END__
   
   
   
   
 #### Test block  
 #    my $ere;  
 #    foreach $ere (%ENV) {  
 # $result .= ' SS '.$ere.' => '.$ENV{$ere}.' FF '."\n\n";  
 #    }  
 ####  

Removed from v.1.17  
changed lines
  Added in v.1.74


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.