Diff for /loncom/interface/lonprintout.pm between versions 1.287 and 1.380

version 1.287, 2004/03/24 22:22:04 version 1.380, 2005/07/26 10:50:32
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 GDBM_File;  
   
   my $resources_printed = '';
   
 my %hash;  #   Compare two students by name.  The students are in the form
 my $LaTeXwidth = 0;  #   returned by the helper:
   #      user:domain:section:last,   first:status
   #   This is a helper function for the perl sort built-in  therefore:
   # Implicit Inputs:
   #    $a     - The first element to compare (global)
   #    $b     - The second element to compare (global)
   # Returns:
   #   -1   - $a < $b
   #    0   - $a == $b
   #   +1   - $a > $b
   #   Note that the initial comparison is done on the last names with the
   #   first names only used to break the tie.
   #
   #
   sub compare_names {
       #  First split the names up into the primary fields.
   
       my ($u1, $d1, $s1, $n1, $stat1) = split(/:/, $a);
       my ($u2, $d2, $s2, $n2, $stat2) = split(/:/, $b);
   
       # Now split the last name and first name of each n:
       #
   
       my ($l1,$f1) = split(/,/, $n1);
       my ($l2,$f2) = split(/,/, $n2);
   
       # We don't bother to remove the leading/trailing whitespace from the
       # firstname, unless the last names compare identical.
   
       if($l1 lt $l2) {
    return -1;
       }
       if($l1 gt $l2) {
    return  1;
       }
   
       # Break the tie on the first name, but there are leading (possibly trailing
       # whitespaces to get rid of first 
       #
       $f1 =~ s/^\s+//; # Remove leading...
       $f1 =~ s/\s+$//; # Trailing spaces from first 1...
       
       $f2 =~ s/^\s+//;
       $f2 =~ s/\s+$//; # And the same for first 2...
   
       if($f1 lt $f2) {
    return -1;
       }
       if($f1 gt $f2) {
    return 1;
       }
       
       #  Must be the same name.
   
       return 0;
   }
   
 sub latex_header_footer_remove {  sub latex_header_footer_remove {
     my $text = shift;      my $text = shift;
Line 229  sub character_chart { Line 283  sub character_chart {
     $result =~ s/&(\#219|Ucirc);/\\^{U}/g;      $result =~ s/&(\#219|Ucirc);/\\^{U}/g;
     $result =~ s/&(\#220|Uuml);/\\\"{U}/g;      $result =~ s/&(\#220|Uuml);/\\\"{U}/g;
     $result =~ s/&(\#221|Yacute);/\\\'{Y}/g;      $result =~ s/&(\#221|Yacute);/\\\'{Y}/g;
     $result =~ s/&(\#223|szlig);/\\ss/g;      $result =~ s/&(\#223|szlig);/{\\ss}/g;
     $result =~ s/&(\#224|agrave);/\\\`{a}/g;      $result =~ s/&(\#224|agrave);/\\\`{a}/g;
     $result =~ s/&(\#225|aacute);/\\\'{a}/g;      $result =~ s/&(\#225|aacute);/\\\'{a}/g;
     $result =~ s/&(\#226|acirc);/\\^{a}/g;      $result =~ s/&(\#226|acirc);/\\^{a}/g;
Line 373  sub character_chart { Line 427  sub character_chart {
 }  }
   
   
                     #width, height, oddsidemargin, evensidemargin, topmargin
   my %page_formats=
       ('letter' => {
    'book' => {
        '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'],
        '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm']
    },
    'album' => {
        '1' => [ '8.8 in', '6.8 in','-40 pt in',  '-60 pt','1 cm'],
        '2' => [ '4.4 in', '6.8 in','-0.5 in', '-1.5 in','3.5 in']
    },
        },
        'legal' => {
    'book' => {
        '1' => ['7.1 in','13 in',,'-0.57 in','-0.57 in','-0.5 in'],
        '2' => ['3.16 in','13 in','-0.57 in','-0.57 in','-0.5 in']
    },
    'album' => {
        '1' => ['12 in','7.1 in',,'-0.57 in','-0.57 in','-0.5 in'],
                '2' => ['6.0 in','7.1 in','-1 in','-1 in','5 in']
             },
        },
        'tabloid' => {
    'book' => {
        '1' => ['9.8 in','16 in','-0.57 in','-0.57 in','-0.5 in'],
        '2' => ['4.9 in','16 in','-0.57 in','-0.57 in','-0.5 in']
    },
    'album' => {
        '1' => ['16 in','9.8 in','-0.57 in','-0.57 in','-0.5 in'],
        '2' => ['16 in','4.9 in','-0.57 in','-0.57 in','-0.5 in']
             },
        },
        'executive' => {
    'book' => {
        '1' => ['6.8 in','9 in','-0.57 in','-0.57 in','1.2 in'],
        '2' => ['3.1 in','9 in','-0.57 in','-0.57 in','1.2 in']
    },
    'album' => {
        '1' => [],
        '2' => []
             },
        },
        'a2' => {
    'book' => {
        '1' => [],
        '2' => []
    },
    'album' => {
        '1' => [],
        '2' => []
             },
        },
        'a3' => {
    'book' => {
        '1' => [],
        '2' => []
    },
    'album' => {
        '1' => [],
        '2' => []
             },
        },
        'a4' => {
    'book' => {
        '1' => ['176 mm','272 mm','-40 pt in','-60 pt','-0.5 in'],
        '2' => [ '91 mm','272 mm','-40 pt in','-60 pt','-0.5 in']
    },
    'album' => {
        '1' => ['8.5 in','7.7 in','-40 pt in','-60 pt','0 in'],
        '2' => ['3.9 in','7.7 in','-40 pt in','-60 pt','0 in']
    },
        },
        'a5' => {
    'book' => {
        '1' => [],
        '2' => []
    },
    'album' => {
        '1' => [],
        '2' => []
             },
        },
        'a6' => {
    'book' => {
        '1' => [],
        '2' => []
    },
    'album' => {
        '1' => [],
        '2' => []
             },
        },
        );
   
 sub page_format {  sub page_format {
 #  #
 #Correspondence between $papersize variable and real paper format:  #Supported paper format: "Letter [8 1/2x11 in]",      "Legal [8 1/2x14 in]",
 # 0 - "Letter [8 1/2x11 in]"  #                        "Ledger/Tabloid [11x17 in]", "Executive [7 1/2x10 in]",
 # 1 - "Legal [8 1/2x14 in]"  #                        "A2 [420x594 mm]",           "A3 [297x420 mm]",
 # 2 - "Ledger/Tabloid [11x17 in]"  #                        "A4 [210x297 mm]",           "A5 [148x210 mm]",
 # 3 - "Executive [7 1/2x10 in]"  #                        "A6 [105x148 mm]"
 # 4 - "A2 [420x594 mm]"  
 # 5 - "A3 [297x420 mm]"  
 # 6 - "A4 [210x297 mm]"  
 # 7 - "A5 [148x210 mm]"  
 # 8 - "A6 [105x148 mm]"  
 #   # 
     my ($papersize,$layout,$numberofcolumns) = @_;       my ($papersize,$layout,$numberofcolumns) = @_; 
     my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = (0,0,0,0,0);      return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}};
     if ($papersize eq '0') {  
  if ($layout eq 'book') {  
     if ($numberofcolumns == 1) {  
  $textwidth = '7.1 in';      #'18 cm';  
  $textheight = '10.2 in';    #'25.9 cm';  
  $oddoffset = '-0.57 in';  
  $evenoffset = '-0.57 in';  
     } elsif ($numberofcolumns == 2) {  
  $textwidth = '3.66 in';     #'93 mm';  
  $textheight = '10.2 in';    #'25.9 cm';  
  $oddoffset = '-0.57 in';  
  $evenoffset = '-0.57 in';  
     }  
  } elsif ($layout eq 'album') {  
     if ($numberofcolumns eq '1') {  
  $textwidth = '8.8 in';  
  $textheight = '6.8 in';  
  $oddoffset = '-40 pt';  
  $evenoffset = '-60 pt';  
     } elsif ($numberofcolumns == 2) {  
  $textwidth = '4.4 in';  
  $textheight = '6.8 in';  
  $oddoffset = '-0.5 in';  
  $evenoffset = '-1.5 in';  
  $topmargin = '3.5 in';  
     }  
  }  
 #    } elsif($papersize eq '1') {  
 #    } elsif($papersize eq '2') {  
 #    } elsif($papersize eq '3'/) {  
     } elsif($papersize eq '6') {  
  if ($layout eq 'book') {  
     if ($numberofcolumns == 1) {  
  $textwidth = '18 cm';  
  $textheight = '28 cm';  
  $oddoffset = '-0.57 in';  
  $evenoffset = '-0.57 in';  
     } elsif ($numberofcolumns == 2) {  
  $textwidth = '96 mm';  
  $textheight = '2 cm';  
  $oddoffset = '-0.57 in';  
  $evenoffset = '-0.57 in';  
     }  
  } elsif ($layout eq 'album') {  
     if ($numberofcolumns eq '1') {  
  $textwidth = '8.5 in';  
  $textheight = '7.7 in';  
  $oddoffset = '-40 pt';  
  $evenoffset = '-60 pt';  
     } elsif ($numberofcolumns == 2) {  
  $textwidth = '3.9 in';  
  $textheight = '7.7 in';  
  $oddoffset = '-40 pt';  
  $evenoffset = '-60 pt';  
     }  
  }  
 #    } elsif($papersize eq '5') {  
 #    } elsif($papersize eq '4') {  
 #    } elsif($papersize eq '7') {  
 #    } elsif($papersize eq '8') {  
     }  
     return $textwidth,$textheight,$oddoffset,$evenoffset,$topmargin;  
 }  }
   
   
 sub get_name {  sub get_name {
     my ($uname,$udom)=@_;      my ($uname,$udom)=@_;
     if (!defined($uname)) { $uname=$ENV{'user.name'}; }      if (!defined($uname)) { $uname=$env{'user.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');
Line 465  sub get_name { Line 546  sub get_name {
   
 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(&Apache::lonnet::unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
     }      }
     return $courseidinfo;      return $courseidinfo;
 }  }
   
 sub page_format_transformation {  sub page_format_transformation {
     my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist) = @_;       my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist,$selectionmade) = @_; 
     my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);      my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);
     $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header');      if ($selectionmade eq '4') {
    $assignment='Problems from the Whole Course';
       } else {
    $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header');
       }
     ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);      ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin);
     my $name = &get_name();      my $name = &get_name();
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }      if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
       my $topmargintoinsert = '';
       if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';}
       my $fancypagestatement='';
       if ($numberofcolumns eq '2') {
    $fancypagestatement="\\fancyhead{}\\fancyhead[LO]{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}";
       } else {
    $fancypagestatement="\\rhead{}\\chead{}\\lhead{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}";
       }
     if ($layout eq 'album') {      if ($layout eq 'album') {
  my $topmargintoinsert = '';      $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\n\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\n\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\n\\pagestyle{fancy}$fancypagestatement\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}\n /;
  if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';}  
     $text =~ s/\\begin{document}/\\setlength{\\oddsidemargin}{$oddoffset}\\setlength{\\evensidemargin}{$evenoffset}$topmargintoinsert\\setlength{\\textwidth}{$textwidth}\\setlength{\\textheight}{$textheight}\\setlength{\\textfloatsep}{8pt plus 2\.0pt minus 4\.0pt}\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{}\\lhead{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}} \\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1} /;  
     } elsif ($layout eq 'book') {      } elsif ($layout eq 'book') {
  if ($choice ne 'All class print') {    if ($choice ne 'All class print') { 
     $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\pagestyle{fancy}\\rhead{}\\chead{}\\lhead{\\textbf{$name} $courseidinfo \\hfill \\thepage \\\\ \\textit{$assignment}}\\begin{document}\\voffset=-0\.8 cm\\setcounter{page}{1}/;      $text =~ s/\\begin{document}/\\textheight $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset $topmargintoinsert\n\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\n\\renewcommand{\\ref}{\\keephidden\}\\usepackage{fancyhdr}\\addtolength{\\headheight}{\\baselineskip}\\pagestyle{fancy}$fancypagestatement\\begin{document}\n\\voffset=-0\.8 cm\\setcounter{page}{1}\n/;
  } else {   } else {
     $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\\evensidemargin = $evenoffset\\textwidth= $textwidth\\newlength{\\minipagewidth}\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\begin{document}\\voffset=-0\.8cm\\setcounter{page}{1}  \\vskip 5 mm /;      $text =~ s/\\pagestyle{fancy}\\rhead{}\\chead{}\s*\\begin{document}/\\textheight = $textheight\\oddsidemargin = $evenoffset\n\\evensidemargin = $evenoffset $topmargintoinsert\\textwidth= $textwidth\\newlength{\\minipagewidth}\n\\setlength{\\minipagewidth}{\\textwidth\/\$number_of_columns-0\.2cm}\\renewcommand{\\ref}{\\keephidden\}\\pagestyle{fancy}\\rhead{}\\chead{}\\begin{document}\\voffset=-0\.8cm\n\\setcounter{page}{1}  \\vskip 5 mm\n /;
    }
    if ($papersize eq 'a4') {
       $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/;
  }   }
     }      }
     if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}      if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}
Line 514  sub page_cleanup { Line 608  sub page_cleanup {
   
   
 sub details_for_menu {  sub details_for_menu {
       my ($helper)=@_;
     my $name_of_resourse = &Apache::lonnet::gettitle($ENV{'form.postdata'});      my $postdata=$env{'form.postdata'};
     my $symbolic = &Apache::lonnet::symbread($ENV{'form.postdata'});      if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; }
       my $name_of_resource = &Apache::lonnet::gettitle($postdata);
       my $symbolic = &Apache::lonnet::symbread($postdata);
     my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic);      my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic);
     $map=&Apache::lonnet::clutter($map);      $map=&Apache::lonnet::clutter($map);
     my $name_of_sequence = &Apache::lonnet::gettitle($map);      my $name_of_sequence = &Apache::lonnet::gettitle($map);
Line 524  sub details_for_menu { Line 620  sub details_for_menu {
  $map =~ m|([^/]+)$|;   $map =~ m|([^/]+)$|;
  $name_of_sequence = $1;   $name_of_sequence = $1;
     }      }
     my $name_of_map = &Apache::lonnet::gettitle($ENV{'request.course.uri'});      my $name_of_map = &Apache::lonnet::gettitle($env{'request.course.uri'});
     if ($name_of_map =~ /^\s*$/) {      if ($name_of_map =~ /^\s*$/) {
  $ENV{'request.course.uri'} =~ m|([^/]+)$|;   $env{'request.course.uri'} =~ m|([^/]+)$|;
  $name_of_map = $1;   $name_of_map = $1;
     }      }
     return ($name_of_resourse,$name_of_sequence,$name_of_map);      return ($name_of_resource,$name_of_sequence,$name_of_map);
   
 }  }
   
   
 sub latex_corrections {  sub latex_corrections {
   
     my ($number_of_columns,$result) = @_;      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;
     $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/;      if ($selectionmade ne '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/;
       } 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{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;      $result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;
     $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g;      $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g;
 #-- LaTeX corrections       #-- LaTeX corrections     
Line 551  sub latex_corrections { Line 650  sub latex_corrections {
  $first_comment = index($result,'<!--',$first_comment);   $first_comment = index($result,'<!--',$first_comment);
     }      }
     $result =~ s/^\s+$//gm; #remove empty lines      $result =~ s/^\s+$//gm; #remove empty lines
     $result =~ s/(\s)(\s+)/$1/g; #removes more than one empty space      #removes more than one empty space
       $result =~ s|(\s\s+)|($1=~/[\n\r]/)?"\n":" "|ge;
     $result =~ s/\\\\\s*\\vskip/\\vskip/gm;      $result =~ s/\\\\\s*\\vskip/\\vskip/gm;
     $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;      $result =~ s/\\\\\s*\\noindent\s*(\\\\)+/\\\\\\noindent /g;
     $result =~ s/{\\par }\s*\\\\/\\\\/gm;      $result =~ s/{\\par }\s*\\\\/\\\\/gm;
  $result =~ s/\\\\\s+\[/ \[/g;      $result =~ s/\\\\\s+\[/ \[/g;
     $result =~ s/\b__+\b/\\makebox\[1 cm\]\[b\]{\\hrulefill}/g;  
     #conversion of html characters to LaTeX equivalents      #conversion of html characters to LaTeX equivalents
     if ($result =~ m/&(\w+|#\d+);/) {      if ($result =~ m/&(\w+|#\d+);/) {
  $result = &character_chart($result);   $result = &character_chart($result);
Line 599  sub IndexCreation { Line 698  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]{article}';
     if ($mode eq 'batchmode') {      if (($mode eq 'batchmode') || (!$env{'request.role.adv'})) {
  $output.='\batchmode';   $output.='\batchmode';
     }      }
     $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'.      $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".
      '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'.       '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".
      '\usepackage[dvips]{graphicx}\usepackage{epsfig}\usepackage{calc}'.       '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".
      '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'.       '\usepackage{picins}\usepackage{calc}'."\n".
      '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'.       '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n".
      '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'.       '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n".
      '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'.       '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n".
      '\setlength{\abovedisplayshortskip}{-0.04in}'.       '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'."\n".
      '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'.       '\setlength{\abovedisplayshortskip}{-0.04in}'."\n".
      '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'.       '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'."\n".
      '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'.       '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'."\n".
      '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'.       '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'."\n".
      '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'.       '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'."\n".
      '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'.       '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'."\n".
      '\setlength{\abovedisplayshortskip}{-0.04in}'.       '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'."\n".
      '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}';       '\setlength{\abovedisplayshortskip}{-0.04in}'."\n".
        '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}'."\n";
     return $output;           return $output;     
 }  }
   
 sub path_to_problem {  sub path_to_problem {
     my ($urlp,$LaTeXwidth)=@_;      my ($urlp,$colwidth)=@_;
     my $newurlp = '';      my $newurlp = '';
     $LaTeXwidth=~s/\s*mm\s*$//;      $colwidth=~s/\s*mm\s*$//;
     my $HowMany = length($urlp)*2;  #characters average about 2 mm in width
     if ($HowMany > $LaTeXwidth) {      if (length($urlp)*2 > $colwidth) {
  my @temporrary = split '/',$urlp;   my @elements = split '/',$urlp;
  my $HowManyNew = 0;   my $curlength=0;
  for (my $ii=0;$ii<=$#temporrary;$ii++) {   foreach my $element (@elements) {
     if ($temporrary[$ii] ne '') {      if ($curlength+(length($element)*2) > $colwidth) {
  $HowManyNew += length($temporrary[$ii])*2;   $newurlp .=  '|\vskip -1 mm \noindent \verb|';
  if ($HowManyNew < $LaTeXwidth ) {   $curlength=0;
     $newurlp .=  '/'.$temporrary[$ii];      } else {
  } else {   $curlength+=length($element)*2;
     $HowManyNew = 0;  
     $newurlp .=  '|\vskip -1 mm \noindent \verb|';  
     $ii--;  
  }  
     }      }
       $newurlp.='/'.$element;
  }   }
     } else {      } else {
  $newurlp=$urlp;   $newurlp=$urlp;
Line 650  sub path_to_problem { Line 747  sub path_to_problem {
 sub recalcto_mm {  sub recalcto_mm {
     my $textwidth=shift;      my $textwidth=shift;
     my $LaTeXwidth;      my $LaTeXwidth;
     if ($textwidth=~/(\d+\.?\d*)\s*cm/) {      if ($textwidth=~/(-?\d+\.?\d*)\s*cm/) {
  $LaTeXwidth = $1*10;   $LaTeXwidth = $1*10;
     } elsif ($textwidth=~/(\d+\.?\d*)\s*mm/) {      } elsif ($textwidth=~/(-?\d+\.?\d*)\s*mm/) {
  $LaTeXwidth = $1;   $LaTeXwidth = $1;
     } elsif ($textwidth=~/(\d+\.?\d*)\s*in/) {      } elsif ($textwidth=~/(-?\d+\.?\d*)\s*in/) {
  $LaTeXwidth = $1*25.4;   $LaTeXwidth = $1*25.4;
     }      }
     $LaTeXwidth.=' mm';      $LaTeXwidth.=' mm';
Line 672  sub get_textwidth { Line 769  sub get_textwidth {
     return $textwidth;      return $textwidth;
 }  }
   
   
   sub unsupported {
       my ($currentURL,$mode)=@_;
       if ($mode ne '') {$mode='\\'.$mode}
       my $result.= &print_latex_header($mode);
       if ($currentURL=~/\/ext\//) {
    $result.=' \strut \\\\ THIS IS EXTERNAL RESOURCE WITH URL \strut \\\\ '.$currentURL.' ';
       } else {
    $result.=$currentURL;
       }
       $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';
       return $result;
   }
   
   
   #
   #   Retrieve the hash of page breaks.
   #
   #  Inputs:
   #    helper   - reference to helper object.
   #  Outputs
   #    A reference to a page break hash.
   #
   #
   
   sub get_page_breaks  {
       my ($helper) = @_;
       my %page_breaks;
       
       foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) {
    $page_breaks{$break} = 1;
       }
       
       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 $bodytag=&Apache::loncommon::bodytag('Preparing Printout');      my $bodytag=&Apache::loncommon::bodytag('Preparing Printout');
     $r->print(<<ENDPART);      $r->print(<<ENDPART);
 <html>  $html
 <script type="text/javascript" language="Javascript" >  <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 702  sub output_data { Line 837  sub output_data {
         editbrowser.focus();          editbrowser.focus();
     }      }
 </script>  </script>
 <head>  
 <title>LON-CAPA output for printing</title>  <title>LON-CAPA output for printing</title>
 </head>  </head>
 $bodytag  $bodytag
 Please stand by while processing your print request, this may take some time ...  Please stand by while processing your print request, this may take some time ...
 ENDPART  ENDPART
   
   
   
       # fetch the pagebreaks and store them in the course environment
       # The page breaks will be pulled into the hash %page_breaks which is
       # indexed by symb and contains 1's for each break.
   
       $env{'form.pagebreaks'}  = $helper->{'VARS'}->{'FINISHPAGE'};
       $env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'}; 
       &Apache::loncommon::store_course_settings('print',
         {'pagebreaks'    => 'scalar',
          'lastprinttype' => 'scalar'});
   
       my %page_breaks  = &get_page_breaks($helper);
   
     my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};      my $format_from_helper = $helper->{'VARS'}->{'FORMAT'};
     my ($result,$selectionmade) = ('','');      my ($result,$selectionmade) = ('','');
     my $number_of_columns = 1; #used only for pages to determine the width of the cell      my $number_of_columns = 1; #used only for pages to determine the width of the cell
Line 720  ENDPART Line 868  ENDPART
  $laystyle='book';   $laystyle='book';
     }      }
     my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);      my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns);
     my $assignment =  $ENV{'form.assignment'};      my $assignment =  $env{'form.assignment'};
     my $LaTeXwidth=&recalcto_mm($textwidth);       my $LaTeXwidth=&recalcto_mm($textwidth); 
     my @print_array=();      my @print_array=();
     my @student_names=();      my @student_names=();
       
       #  Common settings for the %form has:
       # In some cases these settings get overriddent by specific cases, but the
       # settings are common enough to make it worthwhile factoring them out
       # here.
       #
       my %form;
       $form{'grade_target'} = 'tex';
       $form{'textwidth'}    = &get_textwidth($helper, $LaTeXwidth);
   
       # If form.showallfoils is set, then request all foils be shown:
       # privilege will be enforced both by not allowing the 
       # check box selecting this option to be presnt unless it's ok,
       # and by lonresponse's priv. check.
       # The if is here because lonresponse.pm only cares that
       # showallfoils is defined, not what the value is.
   
       if ($helper->{'VARS'}->{'showallfoils'} eq "1") { 
    $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
       }
   
     if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') {      if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') {
       #-- single document - problem, page, html, xml, ...        #-- single document - problem, page, html, xml, ...
  my $currentURL;   my ($currentURL,$cleanURL);
   
  if ($helper->{'VARS'}->{'construction'} ne '1') {   if ($helper->{'VARS'}->{'construction'} ne '1') {
             #prints published resource              #prints published resource
     $currentURL=$helper->{'VARS'}->{'postdata'};      $currentURL=$helper->{'VARS'}->{'postdata'};
       $cleanURL=&Apache::lonenc::check_decrypt($currentURL);
  } else {   } else {
             #prints resource from the construction space              #prints resource from the construction space
     $currentURL='/'.$helper->{'VARS'}->{'filename'};      $currentURL='/'.$helper->{'VARS'}->{'filename'};
     if ($currentURL=~/([^?]+)/) {$currentURL=$1;}      if ($currentURL=~/([^?]+)/) {$currentURL=$1;}
       $cleanURL=$currentURL;
  }   }
  $selectionmade = 1;   $selectionmade = 1;
  if ($currentURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {   if ($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') {
  my %moreenv;   my %moreenv;
  $moreenv{'request.filename'}=$currentURL;   $moreenv{'request.filename'}=$cleanURL;
  if ($helper->{'VARS'}->{'style_file'}=~/\w/) {   if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
     $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'};      $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'};
     my $dom = $ENV{'user.domain'};      my $dom = $env{'user.domain'};
     my $user = $ENV{'user.name'};      my $user = $env{'user.name'};
     my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);      my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);
  }   }
  my %form;                  if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
    $form{'suppress_tries'}=$parmhash{'suppress_tries'};
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
    $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
    if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$form{'problem_split'}='yes';}
  if ($helper->{'VARS'}->{'curseed'}) {   if ($helper->{'VARS'}->{'curseed'}) {
     $rndseed=$helper->{'VARS'}->{'curseed'};      $rndseed=$helper->{'VARS'}->{'curseed'};
  }   }
Line 761  ENDPART Line 933  ENDPART
  &Apache::lonnet::appenv(%moreenv);   &Apache::lonnet::appenv(%moreenv);
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  &Apache::lonxml::init_counter();   &Apache::lonxml::init_counter();
    $resources_printed .= $currentURL.':';
  $texversion.=&Apache::lonnet::ssi($currentURL,%form);   $texversion.=&Apache::lonnet::ssi($currentURL,%form);
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  &Apache::lonnet::delenv('request.filename');   &Apache::lonnet::delenv('request.filename');
     }      }
     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')) {
  my %form;   $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;
    $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') {
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
Line 778  ENDPART Line 952  ENDPART
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     if ($helper->{'VARS'}->{'construction'} ne '1') {      if ($helper->{'VARS'}->{'construction'} ne '1') {
  $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';   $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
  $texversion.=&path_to_problem ($currentURL,$LaTeXwidth);   $texversion.=&path_to_problem($cleanURL,$LaTeXwidth);
     } else {      } else {
  $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';   $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';
  my $URLpath=$currentURL;   my $URLpath=$cleanURL;
  $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;   $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;
  $texversion.=&path_to_problem ($URLpath,$LaTeXwidth);   $texversion.=&path_to_problem ($URLpath,$LaTeXwidth);
     }      }
Line 814  ENDPART Line 988  ENDPART
  if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {   if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
     my $texversion='';      my $texversion='';
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
  my %form;  
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
    $form{'suppress_tries'}=$parmhash{'suppress_tries'};
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
    $resources_printed .=$urlp.':';
  $texversion=&Apache::lonnet::ssi($urlp,%form);   $texversion=&Apache::lonnet::ssi($urlp,%form);
     }      }
     if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||      if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
        ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) &&          ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && 
        ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) {         ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) {
  my %form;   #  Don't permanently modify %$form...
  $form{'grade_target'}='answer';   my %answerform = %form;
  $form{'answer_output_mode'}='tex';   $answerform{'grade_target'}='answer';
  $form{'rndseed'}=$rndseed;   $answerform{'answer_output_mode'}='tex';
                         if ($urlp=~/\/res\//) {$ENV{'request.state'}='published';}   $answerform{'rndseed'}=$rndseed;
  my $answer=&Apache::lonnet::ssi($urlp,%form);   $answerform{'problem_split'}=$parmhash{'problem_stream_switch'};
                           if ($urlp=~/\/res\//) {$env{'request.state'}='published';}
    $resources_printed .= $urlp.':';
    my $answer=&Apache::lonnet::ssi($urlp,%answerform);
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
  } else {   } else {
Line 859  ENDPART Line 1035  ENDPART
     }      }
     if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}      if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
     $result .= '\end{document}';         $result .= '\end{document}';   
  } elsif ($currentURL=~/\/smppg$/) {    } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
  my %form;  
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
    if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;}
    $resources_printed .= $currentURL.':';
  my $texversion=&Apache::lonnet::ssi($currentURL,%form);   my $texversion=&Apache::lonnet::ssi($currentURL,%form);
  $result .= $texversion;   $result .= $texversion;
  } else {   } else {
   $result.='\documentclass[letterpaper]{article}\usepackage{calc}\begin{document}Printout of this type of document is currently not supported: ';      $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'});
   if ($currentURL=~/\/(aboutme|syllabus|bulletinboard|smppg)$/) {  
       $result.=$1;  
   } elsif ($currentURL=~/\/ext\//) {  
       $result.=' \strut \\\\ THIS IS EXTERNAL RESOURCE WITH URL \strut \\\\ '.$currentURL.' ';  
   } else {  
       $result.=$currentURL;  
   }  
   $result.=' \end{document}'  
  }   }
     } 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
              ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or               ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems')       or
        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources')      or # BUGBUG
      ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) {        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences')) { 
         #-- produce an output string          #-- produce an output string
  my %form=();      if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
  $form{'grade_target'}='tex';      $selectionmade = 2;
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);   } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {
       $selectionmade = 3;
    } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') {
       $selectionmade = 4;
    } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') {  #BUGBUG
       $selectionmade = 4;
    } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') {
       $selectionmade = 7;
    }
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
    $form{'suppress_tries'}=$parmhash{'suppress_tries'};
  $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
    $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
    if ($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') {$form{'problem_split'}='yes';}
  my $flag_latex_header_remove = 'NO';   my $flag_latex_header_remove = 'NO';
  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'};
Line 894  ENDPART Line 1073  ENDPART
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  &Apache::lonxml::init_counter();   &Apache::lonxml::init_counter();
  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
       # prior to the first resource
   
       if (defined $page_breaks{$master_seq[$i]}) {
    if($i != 0) {
       $result.="\\newpage\n";
    }
       }
     my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);      my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
     $urlp=&Apache::lonnet::clutter($urlp);      $urlp=&Apache::lonnet::clutter($urlp);
     if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {  
  $selectionmade = 2;  
     } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {  
  $selectionmade = 3;  
     } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') {  
  $selectionmade = 4;  
     } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'select_sequences') {  
  $selectionmade = 7;  
     }  
     $form{'symb'}=$master_seq[$i];      $form{'symb'}=$master_seq[$i];
     my ($sequence)=&Apache::lonnet::decode_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'); #tittle 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;}
     #&Apache::lonnet::logthis("Trying to get $urlp with symb $master_seq[$i]");      my $texversion='';
     my $texversion.=&Apache::lonnet::ssi($urlp,%form);      if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
     if ($urlp=~/\.page$/) {   $resources_printed .= $urlp.':';
  ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);   $texversion.=&Apache::lonnet::ssi($urlp,%form);
  if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;}    if ($urlp=~/\.page$/) {
  $texversion =~ s/\\end{document}\d*/\\end{document}/;      ($texversion,my $number_of_columns_page) = &page_cleanup($texversion);
  $flag_page_in_sequence = 'YES';      if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} 
     }       $texversion =~ s/\\end{document}\d*/\\end{document}/;
     my $lonidsdir=$r->dir_config('lonIDsDir');      $flag_page_in_sequence = 'YES';
     my $envfile=$ENV{'user.environment'};   } 
     $envfile=~/\/([^\/]+)\.id$/;   my $lonidsdir=$r->dir_config('lonIDsDir');
             $envfile=$1;   my $envfile=$env{'user.environment'};
     &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);   $envfile=~/\/([^\/]+)\.id$/;
     my $current_counter=$ENV{'form.counter'};   $envfile=$1;
     if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||   &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
        ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {   my $current_counter=$env{'form.counter'};
  my %form;   if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
  $form{'grade_target'}='answer';     ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
  $form{'answer_output_mode'}='tex';      #  Don't permanently pervert the %form hash
  my $answer=&Apache::lonnet::ssi($urlp,%form);      my %answerform = %form;
                 &Apache::lonnet::appenv(('form.counter' => $current_counter));      $answerform{'grade_target'}='answer';
  if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      $answerform{'answer_output_mode'}='tex';
     $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;      $resources_printed .= $urlp.':';
  } else {      my $answer=&Apache::lonnet::ssi($urlp,%answerform);
     if ($urlp=~/\.(problem|exam|quiz|library)$/) {      &Apache::lonnet::appenv(('form.counter' => $current_counter));
  $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
  $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($urlp).'}\vskip 0 mm ';   $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
  $texversion.=&path_to_problem ($urlp,$LaTeXwidth);  
  $texversion.='\vskip 1 mm '.$answer;  
     } else {      } else {
  $texversion='';   if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
       $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
       $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($urlp).'}\vskip 0 mm ';
       $texversion.=&path_to_problem ($urlp,$LaTeXwidth);
       $texversion.='\vskip 1 mm '.$answer;
    } else {
       $texversion='';
    }
     }      }
  }   }
     }   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 {
       $texversion =~ s/\\end{document}//;
    }
    if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
       $texversion=&IndexCreation($texversion,$urlp);
    }
    if (($selectionmade == 4) and ($assignment ne $prevassignment)) {
       my $name = &get_name();
       my $courseidinfo = &get_course();
       if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
       $prevassignment=$assignment;
       $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip 5 mm ';
    }
    $result .= $texversion;
    $flag_latex_header_remove = 'YES';   
       } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { 
    $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
    if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;}
    $resources_printed .= $urlp.':';
    my $texversion=&Apache::lonnet::ssi($urlp,%form);
    if ($flag_latex_header_remove ne 'NO') {
       $texversion = &latex_header_footer_remove($texversion);
    } else {
       $texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/;
    }
    $result .= $texversion;
    $flag_latex_header_remove = 'YES'; 
     } else {      } else {
  $texversion =~ s/\\end{document}//;   $texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'});
     }   if ($flag_latex_header_remove ne 'NO') {
     if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {      $texversion = &latex_header_footer_remove($texversion);
  $texversion=&IndexCreation($texversion,$urlp);   } else {
     }      $texversion =~ s/\\end{document}//;
     if (($selectionmade == 4) and ($assignment ne $prevassignment)) {   }
  my $name = &get_name();   $result .= $texversion;
  my $courseidinfo = &get_course();   $flag_latex_header_remove = 'YES';   
  if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }      }    
  $prevassignment=$assignment;      if (&Apache::loncommon::connection_aborted($r)) { last; }
  $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$name.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$assignment.'}}} \vskip -5 mm ';  
     }  
     $result .= $texversion;  
     $flag_latex_header_remove = 'YES';     
  }   }
  &Apache::lonnet::delenv('form.counter');   &Apache::lonnet::delenv('form.counter');
  if ($flag_page_in_sequence eq 'YES') {$result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;}   if ($flag_page_in_sequence eq 'YES') {
       $result =~ s/\\usepackage{calc}/\\usepackage{calc}\\usepackage{longtable}/;
    }
  $result .= '\end{document}';   $result .= '\end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||       } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') ||
       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){        ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){
   
   
      #-- prints assignments for whole class or for selected students         #-- prints assignments for whole class or for selected students  
  my $type;   my $type;
  if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') {   if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') {
Line 977  ENDPART Line 1187  ENDPART
      $type='resources';       $type='resources';
  }   }
  my @students=split /\|\|\|/, $helper->{'VARS'}->{'STUDENTS'};   my @students=split /\|\|\|/, $helper->{'VARS'}->{'STUDENTS'};
    #   The normal sort order is by section then by students within the
    #   section. If the helper var student_sort is 1, then the user has elected
    #   to override this and output the students by name.
    #    Each element of the students array is of the form:
    #       username:domain:section:last, first:status
    #    
    #   
    if ($helper->{'VARS'}->{'student_sort'}    eq 1) {
        @students = sort compare_names  @students;
    }
          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;
  }   }
  my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};   my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
   
  #loop over students   #loop over students
  my $flag_latex_header_remove = 'NO';    my $flag_latex_header_remove = 'NO'; 
  my %moreenv;   my %moreenv;
            $moreenv{'instructor_comments'}='hide';
  $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);   $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);
  my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1);   $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'};
    $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
    $moreenv{'suppress_tries'}   = $parmhash{'suppress_tries'};
    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 $student_counter=-1;   my $student_counter=-1;
  foreach my $person (@students) {   foreach my $person (@students) {
   
                my $duefile="/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.due";
        if (-e $duefile) {
    my $temp_file = Apache::File->new('>>'.$duefile);
    print $temp_file "1969\n";
        }
      $student_counter++;       $student_counter++;
      my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});       my $i=int($student_counter/$helper->{'VARS'}{'NUMBER_TO_PRINT'});
      my ($output,$fullname)=&print_resources($r,$helper,$person,$type,\%moreenv,\@master_seq,$flag_latex_header_remove);       my ($output,$fullname, $printed)=&print_resources($r,$helper,
        $person,$type,
        \%moreenv,\@master_seq,
        $flag_latex_header_remove,
        $LaTeXwidth);
        $resources_printed .= ":";
      $print_array[$i].=$output;       $print_array[$i].=$output;
      $student_names[$i].=$person.':'.$fullname.'_END_';       $student_names[$i].=$person.':'.$fullname.'_END_';
      &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);       &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname);
      $flag_latex_header_remove = 'YES';       $flag_latex_header_remove = 'YES';
        if (&Apache::loncommon::connection_aborted($r)) { last; }
  }   }
  &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);   &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
  $result .= $print_array[0].'  \end{document}';   $result .= $print_array[0].'  \end{document}';
      } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||       } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_anon')     ||
       ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon')  ) {         ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_anon')  ) { 
  $selectionmade="Seems to be useless";   my $cdom =$env{'course.'.$env{'request.course.id'}.'.domain'};
    my $cnum =$env{'course.'.$env{'request.course.id'}.'.num'};
    my $num_todo=$helper->{'VARS'}->{'NUMBER_TO_PRINT_TOTAL'};
    my $code_name=$helper->{'VARS'}->{'ANON_CODE_STORAGE_NAME'};
    my $old_name=$helper->{'VARS'}->{'REUSE_OLD_CODES'};
    my %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth));
    $moreenv{'problem_split'}    = $parmhash{'problem_stream_switch'};
    my $seed=time+($$<<16)+($$);
    my @allcodes;
    if ($old_name) {
        my %result=&Apache::lonnet::get('CODEs',[$old_name],$cdom,$cnum);
        @allcodes=split(',',$result{$old_name});
        $num_todo=scalar(@allcodes);
    } else {
        my %allcodes;
        srand($seed);
        for (my $i=0;$i<$num_todo;$i++) {
    $moreenv{'CODE'}=&get_CODE(\%allcodes,$i,$seed,'6');
        }
        if ($code_name) {
    &Apache::lonnet::put('CODEs',
         {$code_name =>join(',',keys(%allcodes))},
         $cdom,$cnum);
        }
        @allcodes=keys(%allcodes);
    }
  my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};   my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'};
      my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'});
     } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') {         my $number_per_page=$helper->{'VARS'}->{'NUMBER_TO_PRINT'};
    if ($number_per_page eq '0' || $number_per_page eq 'all') {
        $number_per_page=$num_todo;
    }
    my $flag_latex_header_remove = 'NO'; 
    my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline','75');
    my $count=0;
    foreach my $code (sort(@allcodes)) {
        my $file_num=int($count/$number_per_page);
        $moreenv{'CODE'}=&num_to_letters($code);
        my ($output,$fullname, $printed)=
    &print_resources($r,$helper,'anonymous',$type,\%moreenv,
     \@master_seq,$flag_latex_header_remove,
     $LaTeXwidth);
        $resources_printed .= ":";
        $print_array[$file_num].=$output;
        &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,
          &mt('last assignment').' '.$fullname);
        $flag_latex_header_remove = 'YES';
        $count++;
        if (&Apache::loncommon::connection_aborted($r)) { last; }
    }
    &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state);
    $result .= $print_array[0].'  \end{document}';
        } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') {      
     #prints selected problems from the subdirectory       #prints selected problems from the subdirectory 
  $selectionmade = 6;   $selectionmade = 6;
         my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};          my @list_of_files=split /\|\|\|/, $helper->{'VARS'}->{'FILES'};
Line 1018  ENDPART Line 1305  ENDPART
     my $urlp = $list_of_files[$i];      my $urlp = $list_of_files[$i];
     $urlp=~s|//|/|;      $urlp=~s|//|/|;
     if ($urlp=~/\//) {      if ($urlp=~/\//) {
  my %form;   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'grade_target'}='tex';  
  $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth);  
  $form{'rndseed'}=$rndseed;   $form{'rndseed'}=$rndseed;
  if ($urlp =~ m|/home/([^/]+)/public_html|) {   if ($urlp =~ m|/home/([^/]+)/public_html|) {
     $urlp =~ s|/home/([^/]*)/public_html|/~$1|;      $urlp =~ s|/home/([^/]*)/public_html|/~$1|;
  } else {   } else {
     $urlp =~ s|^/home/httpd/html||;      $urlp =~ s|^$Apache::lonnet::perlvar{'lonDocRoot'}||;
  }   }
    $resources_printed .= $urlp.':';
  my $texversion=&Apache::lonnet::ssi($urlp,%form);   my $texversion=&Apache::lonnet::ssi($urlp,%form);
  if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||   if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
    ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {     ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
     my %form;      #  Don't permanently pervert %form:
     $form{'grade_target'}='answer';      my %answerform = %form;
     $form{'answer_output_mode'}='tex';      $answerform{'grade_target'}='answer';
     $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};      $answerform{'answer_output_mode'}='tex';
     $form{'rndseed'}=$rndseed;      $answerform{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
     my $answer=&Apache::lonnet::ssi($urlp,%form);      $answerform{'rndseed'}=$rndseed;
       $resources_printed .= $urlp.':';
       my $answer=&Apache::lonnet::ssi($urlp,%answerform);
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
  $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;   $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
     } else {      } else {
Line 1077  ENDPART Line 1365  ENDPART
  $result .= '\end{document}';         $result .= '\end{document}';      
     }      }
 #-------------------------------------------------------- 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'});      $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);      $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]);}      for (my $i=1;$i<=$#print_array;$i++) {$print_array[$i] = &latex_corrections($number_of_columns,$print_array[$i],$selectionmade);}
     #changes page's parameters for the one column output       #changes page's parameters for the one column output 
     if ($numberofcolumns == 1) {      if ($numberofcolumns == 1) {
  $result =~ s/\\textwidth\s*=\s*\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /;   $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/\\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/\\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'} /;   $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();
     my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".$identifier.".tex";      my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout_$identifier.tex";
     if (!($#print_array>0)) {       if (!($#print_array>0)) { 
  unless ($temp_file = Apache::File->new('>'.$filename)) {   unless ($temp_file = Apache::File->new('>'.$filename)) {
     $r->log_error("Couldn't open $filename for output $!");      $r->log_error("Couldn't open $filename for output $!");
Line 1113  ENDPART Line 1402  ENDPART
     my $temp_file;      my $temp_file;
     my $newfilename=$filename;      my $newfilename=$filename;
     my $num=$i+1;      my $num=$i+1;
     $newfilename =~s/\.tex$/_$num\.tex/;       $newfilename =~s/\.tex$//; 
       $newfilename=sprintf("%s_%03d.tex",$newfilename, $num);
     unless ($temp_file = Apache::File->new('>'.$newfilename)) {      unless ($temp_file = Apache::File->new('>'.$newfilename)) {
  $r->log_error("Couldn't open $newfilename for output $!");   $r->log_error("Couldn't open $newfilename for output $!");
  return SERVER_ERROR;    return SERVER_ERROR; 
Line 1130  ENDPART Line 1420  ENDPART
  if ($#student_names>-1) {   if ($#student_names>-1) {
     $student_names=$student_names[0].'_ENDPERSON_';      $student_names=$student_names[0].'_ENDPERSON_';
  } else {   } else {
     my $fullname = &get_name($ENV{'user.name'},$ENV{'user.domain'});      my $fullname = &get_name($env{'user.name'},$env{'user.domain'});
     $student_names=join(':',$ENV{'user.name'},$ENV{'user.domain'},      $student_names=join(':',$env{'user.name'},$env{'user.domain'},
  $ENV{'request.course.sec'},$fullname).   $env{'request.course.sec'},$fullname).
     '_ENDPERSON_'.'_END_';      '_ENDPERSON_'.'_END_';
  }   }
     }      }
Line 1140  ENDPART Line 1430  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=$helper->{'VARS'}->{'postdata'};   $URLback=&Apache::lonnet::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 1149  ENDPART Line 1439  ENDPART
     $URLback=~s|^/~|/priv/|;      $URLback=~s|^/~|/priv/|;
  }   }
     }      }
       # logic for now is too complex to trace if this has been defined
       #  yet.
       my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
       my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
     &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,      &Apache::lonnet::appenv('cgi.'.$identifier.'.file'   => $filename,
                             'cgi.'.$identifier.'.layout'  => $laystyle,                              'cgi.'.$identifier.'.layout'  => $laystyle,
                             'cgi.'.$identifier.'.numcol'  => $numberofcolumns,                              'cgi.'.$identifier.'.numcol'  => $numberofcolumns,
       'cgi.'.$identifier.'.paper'  => $papersize,
                             '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' => $env{'request.role.adv'},
                             '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,);
        &Apache::lonnet::appenv("cgi.$identifier.user"    => $env{'user.name'},
       "cgi.$identifier.domain"  => $env{'user.domain'},
       "cgi.$identifier.courseid" => $cnum, 
       "cgi.$identifier.coursedom" => $cdom, 
       "cgi.$identifier.resources" => $resources_printed);
   
 $r->print(<<FINALEND);  $r->print(<<FINALEND);
 <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier">  <br />
   <meta http-equiv="Refresh" content="0; url=/cgi-bin/printout.pl?$identifier" />
   <a href="/cgi-bin/printout.pl?$identifier">Continue</a>
 </body>  </body>
 </html>  </html>
 FINALEND  FINALEND
 }  }
   
   sub num_to_letters {
       my ($num) = @_;
       my @nums= split('',$num);
       my @num_to_let=('A'..'Z');
       my $word;
       foreach my $digit (@nums) { $word.=$num_to_let[$digit]; }
       return $word;
   }
   
   sub get_CODE {
       my ($all_codes,$num,$seed,$size)=@_;
       my $max='1'.'0'x$size;
       my $newcode;
       while(1) {
    $newcode=sprintf("%06d",int(rand($max)));
    if (!exists($$all_codes{$newcode})) {
       $$all_codes{$newcode}=1;
       return &num_to_letters($newcode);
    }
       }
   }
   
 sub print_resources {  sub print_resources {
     my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header)=@_;      my ($r,$helper,$person,$type,$moreenv,$master_seq,$remove_latex_header,
    $LaTeXwidth)=@_;
     my $current_output = '';       my $current_output = ''; 
       my $printed = '';
     my ($username,$userdomain,$usersection) = split /:/,$person;      my ($username,$userdomain,$usersection) = split /:/,$person;
     my $fullname = &get_name($username,$userdomain);      my $fullname = &get_name($username,$userdomain);
           my $namepostfix;
       if ($person =~ 'anon') {
    $namepostfix="\\\\Name: ";
    $fullname = "CODE - ".$moreenv->{'CODE'};
       }
       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::lonnet::delenv('form.counter');
     &Apache::lonxml::init_counter();      &Apache::lonxml::init_counter();
   
       my %page_breaks  = &get_page_breaks($helper);
   
     foreach my $curresline (@{$master_seq})  {      foreach my $curresline (@{$master_seq})  {
    if (defined $page_breaks{$curresline}) {
       if($i != 0) {
    $current_output.= "\\newpage\n";
       }
    }
    $i++;
  if ( !($type eq 'problems' &&    if ( !($type eq 'problems' && 
        ($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)) {
  my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$ENV{'request.course.id'},'tex',$moreenv);   if ($res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
  my $lonidsdir=$r->dir_config('lonIDsDir');      $printed .= $curresline.':';
  my $envfile=$ENV{'user.environment'};      my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
  $envfile=~/\/([^\/]+)\.id$/;      my $lonidsdir=$r->dir_config('lonIDsDir');
  $envfile=$1;      my $envfile=$env{'user.environment'};
  &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);      $envfile=~/\/([^\/]+)\.id$/;
  my $current_counter=$ENV{'form.counter'};      $envfile=$1;
  if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||      &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile);
    ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {      my $current_counter=$env{'form.counter'};
     my %form;      if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
     $form{'answer_output_mode'}='tex';         ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
     $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};   #   Use a copy of the hash so we don't pervert it on future loop passes.
     my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$ENV{'request.course.id'},%form);   my %answerenv = %{$moreenv};
     &Apache::lonnet::appenv(('form.counter' => $current_counter));   $answerenv{'answer_output_mode'}='tex';
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {   $answerenv{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
  $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/;   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') {
       $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/;
    } 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);
       $rendered.='\vskip 1 mm '.$ansrendered;
    }
       }
       if ($remove_latex_header eq 'YES') {
    $rendered = &latex_header_footer_remove($rendered);
     } else {      } else {
  $rendered=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});   $rendered =~ s/\\end{document}//;
  $rendered.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm ';  
  $rendered.=&path_to_problem ($curresline,$LaTeXwidth);  
  $rendered.='\vskip 1 mm '.$ansrendered;  
     }      }
  }      $current_output .= $rendered;    
  if ($remove_latex_header eq 'YES') {   } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) {
     $rendered = &latex_header_footer_remove($rendered);      $printed .= $curresline.':';
       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') {
    $rendered = &latex_header_footer_remove($rendered);
       } else {
    $rendered =~ s/\\end{document}//;
       }
       $current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';
  } else {   } else {
     $rendered =~ s/\\end{document}//;      my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'});
       if ($remove_latex_header ne 'NO') {
    $rendered = &latex_header_footer_remove($rendered);
       } else {
    $rendered =~ s/\\end{document}//;
       }
       $current_output .= $rendered;
  }   }
  $current_output .= $rendered;  
     }      }
     $remove_latex_header = 'YES';      $remove_latex_header = 'YES';
  }   }
    if (&Apache::loncommon::connection_aborted($r)) { last; }
     }      }
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }      if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     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\\lhead{\\textit{\\textbf{$fullname}}$courseidinfo \\hfill \\thepage \\\\ \\textit{$currentassignment}}\\vskip 3 mm /;   $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 {      } 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\\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 }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}}} \vskip -5 mm '.$current_output;   $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;
     }      }
     return ($current_output,$fullname);      return ($current_output,$fullname, $printed);
   
 }  }
   
Line 1241  sub handler { Line 1607  sub handler {
 #    if ($loaderror) { return $loaderror; }  #    if ($loaderror) { return $loaderror; }
 #    $loaderror=  #    $loaderror=
 #       &Apache::lonnet::overloaderror($r,  #       &Apache::lonnet::overloaderror($r,
 #         $ENV{'course.'.$ENV{'request.course.id'}.'.home'});  #         $env{'course.'.$env{'request.course.id'}.'.home'});
 #    if ($loaderror) { return $loaderror; }  #    if ($loaderror) { return $loaderror; }
   
     my $result = printHelper($r);      my $result = printHelper($r);
Line 1254  sub handler { Line 1620  sub handler {
 # foreach $key (keys %{$helper->{'VARS'}}) {  # foreach $key (keys %{$helper->{'VARS'}}) {
 #    $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-<br />');  #    $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-<br />');
 # }  # }
 # foreach $key (keys %ENV) {  # foreach $key (keys %env) {
 #    $r->print(' '.$key.'->'.$ENV{$key}.'<-<br />');  #    $r->print(' '.$key.'->'.$env{$key}.'<-<br />');
 # }  # }
 # return OK;  # return OK;
   
     my %parmhash=&Apache::lonnet::coursedescription($ENV{'request.course.id'});      my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
        
 # my $key;   # my $key; 
 # foreach $key (keys %parmhash) {  # foreach $key (keys %parmhash) {
 #    $r->print(' '.$key.'->'.$parmhash{$key}.'<-<br />');  #    $r->print(' '.$key.'->'.$parmhash{$key}.'<-<br />');
 # }  # }
 # return OK;  #
   
   
       #  If a figure conversion queue file exists for this user.domain
       # we delete it since it can only be bad (if it were good, printout.pl
       # would have deleted it the last time around.
   
       my $conversion_queuefile = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";
       if(-e $conversion_queuefile) {
    unlink $conversion_queuefile;
       }
     &output_data($r,$helper,\%parmhash);      &output_data($r,$helper,\%parmhash);
     return OK;      return OK;
 }   } 
Line 1285  use Data::Dumper; Line 1660  use Data::Dumper;
 sub printHelper {  sub printHelper {
     my $r = shift;      my $r = shift;
   
     if ($ENV{'request.course.id'}) {  
  my $fn=$ENV{'request.course.fn'};  
  tie(%hash,'GDBM_File',"$fn.db",&GDBM_READER(),0640);  
     }  
   
     if ($r->header_only) {      if ($r->header_only) {
         if ($ENV{'browser.mathml'}) {          if ($env{'browser.mathml'}) {
             &Apache::loncommon::content_type($r,'text/xml');              &Apache::loncommon::content_type($r,'text/xml');
         } else {          } else {
             &Apache::loncommon::content_type($r,'text/html');              &Apache::loncommon::content_type($r,'text/html');
Line 1301  sub printHelper { Line 1671  sub printHelper {
     }      }
   
     # Send header, nocache      # Send header, nocache
     if ($ENV{'browser.mathml'}) {      if ($env{'browser.mathml'}) {
         &Apache::loncommon::content_type($r,'text/xml');          &Apache::loncommon::content_type($r,'text/xml');
     } else {      } else {
         &Apache::loncommon::content_type($r,'text/html');          &Apache::loncommon::content_type($r,'text/html');
Line 1318  sub printHelper { Line 1688  sub printHelper {
     my $helper = Apache::lonhelper::helper->new("Printing Helper");      my $helper = Apache::lonhelper::helper->new("Printing Helper");
     $helper->declareVar('symb');      $helper->declareVar('symb');
     $helper->declareVar('postdata');          $helper->declareVar('postdata');    
     $helper->declareVar('curseed');          $helper->declareVar('curseed'); 
       $helper->declareVar('probstatus');   
     $helper->declareVar('filename');      $helper->declareVar('filename');
     $helper->declareVar('construction');      $helper->declareVar('construction');
     $helper->declareVar('assignment');      $helper->declareVar('assignment');
     $helper->declareVar('style_file');      $helper->declareVar('style_file');
       $helper->declareVar('student_sort');
       $helper->declareVar('FINISHPAGE');
       $helper->declareVar('PRINT_TYPE');
       $helper->declareVar("showallfoils");
   
       #  The page breaks can get loaded initially from the course environment:
   
       if((!defined($env{"form.CURRENT_STATE"}))  ||
          ($env{'form.CURRENT_STATE'} == "START")) {
    $helper->{VARS}->{FINISHPAGE} = ""; # In case they did a back e.g.
       }
   
   
       
       &Apache::loncommon::restore_course_settings('print',
    {'pagebreaks'  => 'scalar',
            'lastprinttype' => 'scalar'});
   
       
       if("$helper->{VARS}->{PRINT_TYPE}" eq "$env{'form.lastprinttype'}") {
    $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.
     # Detect whether we're coming from construction space      # Detect whether we're coming from construction space
     if ($ENV{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {      if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) {
         $helper->{VARS}->{'filename'} = "~$1/$2";          $helper->{VARS}->{'filename'} = "~$1/$2";
         $helper->{VARS}->{'construction'} = 1;          $helper->{VARS}->{'construction'} = 1;
     } else {      } else {
         if ($ENV{'form.postdata'}) {          if ($env{'form.postdata'}) {
             $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($ENV{'form.postdata'});              $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($env{'form.postdata'});
         }          }
         if ($ENV{'form.symb'}) {          if ($env{'form.symb'}) {
             $helper->{VARS}->{'symb'} = $ENV{'form.symb'};              $helper->{VARS}->{'symb'} = $env{'form.symb'};
         }          }
         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'}) {
         $helper->{VARS}->{'symb'} = $ENV{'form.symb'};          $helper->{VARS}->{'symb'} = $env{'form.symb'};
     }      }
     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'});
   
     }      }
           $helper->{VARS}->{'symb'}=
     my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu;   &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'});
       my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper);
     if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}      if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;}
   
           
Line 1367  sub printHelper { Line 1762  sub printHelper {
                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);                           0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
     } else {      } else {
         ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);          ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
         $helper->{VARS}->{'postdata'} = Apache::lonnet::clutter($url);          $helper->{VARS}->{'postdata'} = 
       &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));
   
         if (!$resourceTitle) { # if the resource doesn't have a title, use the filename          if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
             my $postdata = $helper->{VARS}->{'postdata'};              my $postdata = $helper->{VARS}->{'postdata'};
Line 1375  sub printHelper { Line 1771  sub printHelper {
         }          }
         $subdir = &Apache::lonnet::filelocation("", $url);          $subdir = &Apache::lonnet::filelocation("", $url);
     }      }
     if (!$helper->{VARS}->{'curseed'} && $ENV{'form.curseed'}) {      if (!$helper->{VARS}->{'curseed'} && $env{'form.curseed'}) {
  $helper->{VARS}->{'curseed'}=$ENV{'form.curseed'};   $helper->{VARS}->{'curseed'}=$env{'form.curseed'};
       }
       if (!$helper->{VARS}->{'probstatus'} && $env{'form.problemtype'}) {
    $helper->{VARS}->{'probstatus'}=$env{'form.problemtype'};
     }      }
   
     my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();      my $userCanSeeHidden = Apache::lonnavmaps::advancedUser();
     my $userPriviledged = ($ENV{'request.role'}=~m/^cc\./ or      my $userPriviledged = ($env{'request.role'}=~m/^cc\./ or
    $ENV{'request.role'}=~m/^in\./ or     $env{'request.role'}=~m/^in\./ or
    $ENV{'request.role'}=~m/^ta\./);     $env{'request.role'}=~m/^ta\./);
   
     Apache::lonhelper::registerHelperTags();      Apache::lonhelper::registerHelperTags();
   
     # "Delete everything after the last slash."      # "Delete everything after the last slash."
     $subdir =~ s|/[^/]+$||;      $subdir =~ s|/[^/]+$||;
     if (not $helper->{VARS}->{'construction'}) {      if (not $helper->{VARS}->{'construction'}) {
  $subdir='/home/httpd/html/res/'.$subdir;   $subdir=$Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$subdir;
     }      }
     # "Remove all duplicate slashes."      # "Remove all duplicate slashes."
     $subdir =~ s|/+|/|g;      $subdir =~ s|/+|/|g;
Line 1409  sub printHelper { Line 1808  sub printHelper {
     my $paramHash;      my $paramHash;
   
     if ($resourceTitle) {      if ($resourceTitle) {
         push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (what you just saw on the screen)", 'current_document', 'PAGESIZE'];          push @{$printChoices}, ["<b><i>$resourceTitle</i></b> (".&mt('what you just saw on the screen').")", 'current_document', 'PAGESIZE'];
     }      }
   
 #    $r->print($helper->{VARS}->{'postdata'});  
   
     # Useful filter strings      # Useful filter strings
     my $isProblem = '($res->is_problem()||$res->contains_problem) ';      my $isProblem = '($res->is_problem()||$res->contains_problem) ';
     $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;      $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
Line 1421  sub printHelper { Line 1818  sub printHelper {
     my $isNotMap = '!$res->is_sequence()';      my $isNotMap = '!$res->is_sequence()';
     $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;      $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
     my $isMap = '$res->is_map()';      my $isMap = '$res->is_map()';
     my $symbFilter = '$res->symb()';      my $symbFilter = '$res->shown_symb()';
     my $urlValue = '$res->src()';      my $urlValue = '$res->link()';
   
     $helper->declareVar('SEQUENCE');      $helper->declareVar('SEQUENCE');
   
     # Useful for debugging: Dump the help vars      # Useful for debugging: Dump the help vars
     #$r->print(Dumper($helper->{VARS}));  #    $r->print(Dumper($helper->{VARS}));
     #$r->print($map);  #    $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') &&
   
  $helper->{VARS}->{'postdata'} &&   $helper->{VARS}->{'postdata'} &&
  $helper->{VARS}->{'assignment'}) {   $helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence          # Allow problems from sequence
         push @{$printChoices}, ["<b>Problems</b> in <b><i>$sequenceTitle</i></b>", 'map_problems', 'CHOOSE_PROBLEMS'];          push @{$printChoices}, ["<b>".&mt('Problems')."</b> ".&mt('in')." <b><i>$sequenceTitle</i></b>", 'map_problems', 'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence          # Allow all resources from sequence
         push @{$printChoices}, ["<b>Resources</b> in <b><i>$sequenceTitle</i></b>", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];          push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('in')." <b><i>$sequenceTitle</i></b>", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
   
         my $helperFragment = <<HELPERFRAGMENT;          my $helperFragment = <<HELPERFRAGMENT;
   <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">    <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">
Line 1448  sub printHelper { Line 1846  sub printHelper {
       <filterfunc>return $isProblem;</filterfunc>        <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
   
Line 1459  sub printHelper { Line 1858  sub printHelper {
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
 HELPERFRAGMENT  HELPERFRAGMENT
   
         &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);    &Apache::lonxml::xmlparse($r, 'helper', $helperFragment);
     }      }
   
     # If the user is priviledged, allow them to print all       # If the user is privileged, allow them to print all 
     # problems in the course, optionally for selected students      # problems and resources  in the entier course, optionally for selected students
     if ($userPriviledged && ($helper->{VARS}->{'postdata'}=~/\/res\//)) {       if ($userPriviledged && 
           ($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'];
    push @{$printChoices}, ['<b>Resources</b> from <b>entire course</b>', 'all_resources', 'ALL_RESOURCES'];
          &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);           &Apache::lonxml::xmlparse($r, 'helper', <<ALL_PROBLEMS);
   <state name="ALL_PROBLEMS" title="Select Problem(s) to print">    <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
     <message>(mark them then click "next" button) <br /></message>      <message>(mark them then click "next" button) <br /></message>
Line 1479  HELPERFRAGMENT Line 1882  HELPERFRAGMENT
       <filterfunc>return $isProblemOrMap;</filterfunc>        <filterfunc>return $isProblemOrMap;</filterfunc>
       <choicefunc>return $isNotMap;</choicefunc>        <choicefunc>return $isNotMap;</choicefunc>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>
     </state>
     <state name="ALL_RESOURCES" title="Select Resource(s) to print">
       <message>(Mark them then click "next" button) <br /> </message>
       <resource variable="RESOURCES" toponly='0' multichoice='1'
                 suppressEmptySequences='0' addstatus='1' closeallpages='1'>
         <nextstate>PAGESIZE</nextstate>
         <filterfunc>return $isNotMap; </filterfunc>
         <valuefunc>return $symbFilter;</valuefunc>
         <option text='NewPage' variable='FINISHPAGE' />
     </resource>      </resource>
   </state>    </state>
 ALL_PROBLEMS  ALL_PROBLEMS
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
     push @{$printChoices}, ["<b>Problems</b> from <b><i>$sequenceTitle</i></b> for <b>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>Problems</b> from <b><i>$sequenceTitle</i></b> for <b>anonymous students</b>", 'problems_for_anonymous', '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'];
  }   }
  my $resource_selector=<<RESOURCE_SELECTOR;   my $resource_selector=<<RESOURCE_SELECTOR;
    <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>
Line 1494  ALL_PROBLEMS Line 1908  ALL_PROBLEMS
       <filterfunc>return $isProblem;</filterfunc>        <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='New Page' variable='FINISHPAGE' />
       </resource>        </resource>
     <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">
Line 1508  RESOURCE_SELECTOR Line 1923  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" />        <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1"/>
         <message><b>Select sort order</b> </message>
       <choices variable='student_sort'>
         <choice computer='0'>Sort by section then student</choice>
         <choice computer='1'>Sort by students across sections.</choice>
       </choices>
     $resource_selector      $resource_selector
   </state>    </state>
 CHOOSE_STUDENTS  CHOOSE_STUDENTS
   
    my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
    my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
           my @names=&Apache::lonnet::getkeys('CODEs',$cdom,$cnum);
    my $namechoice='<choice></choice>';
    foreach my $name (sort {uc($a) cmp uc($b)} @names) {
       if ($name =~ /^error: 2 /) { next; }
       $namechoice.='<choice computer="'.$name.'">'.$name.'</choice>';
    }
         &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">
     <message><hr width='33%' /><b>Number of anonymous assignments to print?</b></message>      <nextstate>PAGESIZE</nextstate>
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"></string>      <message><hr width='33%' /></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">
          <validator>
    if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
       !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) {
       return "You need to specify the number of assignments to print";
    }
    return undef;
          </validator>
       </string>
       <message></td></tr><tr><td></message>
       <message><b>Names to store the CODEs under for later:</b></message>
       <message></td><td></message>
       <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
       <message></td></tr></table></message>
       <message><hr width='33%' /></message>
       <message><b>Reprint a set of saved CODEs:</b></message>
       <dropdown variable="REUSE_OLD_CODES">
           $namechoice
       </dropdown>
     <message><hr width='33%' /></message>      <message><hr width='33%' /></message>
     $resource_selector      $resource_selector
   </state>    </state>
Line 1524  CHOOSE_ANON1 Line 1972  CHOOSE_ANON1
   
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
     push @{$printChoices}, ["<b>Resources</b> from <b><i>$sequenceTitle</i></b> for <b>selected students</b>", 'resources_for_students', 'CHOOSE_STUDENTS1'];      push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('selected students')."</b>", 'resources_for_students', 'CHOOSE_STUDENTS1'];
     push @{$printChoices}, ["<b>Resources</b> from <b><i>$sequenceTitle</i></b> for <b>anonymous students</b>", 'resources_for_anonymous', 'CHOOSE_ANON2'];      push @{$printChoices}, ["<b>".&mt('Resources')."</b> ".&mt('from')." <b><i>$sequenceTitle</i></b> ".&mt('for')." <b>".&mt('anonymous students')."</b>", 'resources_for_anon', 'CHOOSE_ANON2'];
  }   }
           
   
Line 1536  CHOOSE_ANON1 Line 1984  CHOOSE_ANON1
       <filterfunc>return $isNotMap;</filterfunc>        <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>        <mapurl>$map</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     <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">
Line 1550  RESOURCE_SELECTOR Line 1999  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" />      <student multichoice='1' variable="STUDENTS" nextstate="PAGESIZE" coursepersonnel="1" />
       <choices variable='student_sort'>
         <choice computer='0'>Sort by section then student</choice>
         <choice computer='1'>Sort by students across sections.</choice>
       </choices>
   
     $resource_selector      $resource_selector
     </state>      </state>
 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">
     <message><hr width='33%' /><b>How many Anonymous exams to print?</b></message>      <nextstate>PAGESIZE</nextstate>
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5"></string>      <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">
          <validator>
    if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
       !\$helper->{'VARS'}{'REUSE_OLD_CODES'}) {
       return "You need to specify the number of assignments to print";
    }
    return undef;
          </validator>
       </string>
       <message></td></tr><tr><td></message>
       <message><b>Names to store the CODEs under for later:</b></message>
       <message></td><td></message>
       <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
       <message></td></tr></table></message>
       <message><hr width='33%' /></message>
       <message><b>Reprint a set of saved CODEs:</b></message>
       <dropdown variable="REUSE_OLD_CODES">
           $namechoice
       </dropdown>
     <message><hr width='33%' /></message>      <message><hr width='33%' /></message>
     $resource_selector      $resource_selector
   </state>    </state>
Line 1566  CHOOSE_ANON2 Line 2039  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 '/home/httpd/html/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 $env{'request.role.adv'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {    
         push @{$printChoices}, ["<b>Problems</b> 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';
         my $xmlfrag = <<CHOOSE_FROM_SUBDIR;          my $xmlfrag = <<CHOOSE_FROM_SUBDIR;
Line 1606  CHOOSE_FROM_SUBDIR Line 2079  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' />
       </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 1616  CHOOSE_FROM_SUBDIR Line 2090  CHOOSE_FROM_SUBDIR
       <filterfunc>return $isProblem</filterfunc>        <filterfunc>return $isProblem</filterfunc>
       <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>        <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
       <valuefunc>return $symbFilter;</valuefunc>        <valuefunc>return $symbFilter;</valuefunc>
         <option text='Newpage' variable='FINISHPAGE' />
       </resource>        </resource>
     </state>      </state>
 CHOOSE_FROM_ANY_SEQUENCE  CHOOSE_FROM_ANY_SEQUENCE
Line 1628  CHOOSE_FROM_ANY_SEQUENCE Line 2103  CHOOSE_FROM_ANY_SEQUENCE
     Apache::lonhelper::message->new();      Apache::lonhelper::message->new();
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'PRINT_TYPE';      $paramHash->{'variable'} = 'PRINT_TYPE';
     $helper->declareVar('PRINT_TYPE');  
     $paramHash->{CHOICES} = $printChoices;      $paramHash->{CHOICES} = $printChoices;
     Apache::lonhelper::choices->new();      Apache::lonhelper::choices->new();
   
     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 (($env{'request.role.adv'} 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 1644  CHOOSE_FROM_ANY_SEQUENCE Line 2118  CHOOSE_FROM_ANY_SEQUENCE
         $paramHash->{CHOICES} = [          $paramHash->{CHOICES} = [
                                    ['Without Answers', 'yes'],                                     ['Without Answers', 'yes'],
                                    ['With Answers', 'no'],                                     ['With Answers', 'no'],
                                    ['Only Answers', 'only'] ];                                     ['Only Answers', 'only']
                                   ];
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
  addMessage("</td></tr>");   addMessage("</td></tr>");
  $startedTable = 1;   $startedTable = 1;
     }      }
   
     if ($ENV{'request.role.adv'}) {      if ($env{'request.role.adv'}) {
  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 1691  CHOOSE_FROM_ANY_SEQUENCE Line 2166  CHOOSE_FROM_ANY_SEQUENCE
      ['Yes', 'yes'] ];       ['Yes', 'yes'] ];
     Apache::lonhelper::dropdown->new();      Apache::lonhelper::dropdown->new();
     addMessage("</td></tr>");      addMessage("</td></tr>");
       addMessage("<tr><td align='right'>Print Discussions: </td><td>");
       $paramHash = Apache::lonhelper::getParamHash();
       $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';   
       $helper->declareVar('PRINT_DISCUSSIONS');         
       $paramHash->{CHOICES} = [
        ['No', 'no'],
        ['Yes', 'yes'] ];
       Apache::lonhelper::dropdown->new();
       addMessage("</td></tr>");
   
               #  If advanced roles, then allow to show all foils.
   
               if ($env{'request.role.adv'}) {
    addMessage("<tr><td align = 'right'>  </td><td>");
    $paramHash = Apache::lonhelper::getParamHash();
    $paramHash->{'multichoice'} = "true";
    $paramHash->{'allowempty'}  = "true";
    $paramHash->{'variable'}   = "showallfoils";
    $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ];
    Apache::lonhelper::choices->new();
    addMessage("</td></tr>");
               }
   
  }   }
   
  if ($helper->{'VARS'}->{'construction'}) {    if ($helper->{'VARS'}->{'construction'}) { 
     my $stylevalue=$ENV{'construct.style'};      my $stylevalue=$env{'construct.style'};
     my $xmlfrag .= <<"RNDSEED";      my $xmlfrag .= <<"RNDSEED";
     <message><tr><td align='right'>Use random seed: </td><td></message>      <message><tr><td align='right'>Use random seed:  </td><td></message>
     <string variable="curseed" size="15" maxlength="15">      <string variable="curseed" size="15" maxlength="15">
  <defaultvalue>   <defaultvalue>
             return $helper->{VARS}->{'curseed'};              return $helper->{VARS}->{'curseed'};
         </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><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></td></tr></message>       <choices allowempty="1" multichoice="true" variable="showallfoils">
                   <choice computer="1">Show all foils?</choice>
                </choices>
        <message></td></tr></message>
 RNDSEED  RNDSEED
             &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);              &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
     $helper->{'VARS'}->{'style_file'}=$ENV{'form.style_file_value'};      $helper->{'VARS'}->{'style_file'}=$env{'form.style_file_value'};
  }      
    } 
   
     }      }
   
   
Line 1736  RNDSEED Line 2239  RNDSEED
   
     $r->print($helper->display());      $r->print($helper->display());
   
     Apache::lonhelper::unregisterHelperTags();      &Apache::lonhelper::unregisterHelperTags();
   
     untie %hash;  
   
     return OK;      return OK;
 }  }
Line 1777  no strict; Line 2278  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
 use Apache::lonlocal;  use Apache::lonlocal;
   use Apache::lonnet;
   
 my $maxColumns = 2;  my $maxColumns = 2;
 my @paperSize = ("Letter [8 1/2x11 in]", "Legal [8 1/2x14 in]",   # it'd be nice if these all worked
                  "Ledger/Tabloid [11x17 in]", "Executive [7 1/2x10 in]",  #my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", 
                  "A2 [420x594 mm]", "A3 [297x420 mm]", "A4 [210x297 mm]",   #                 "tabloid (ledger) [11x17 in]", "executive [7 1/2x10 in]",
                  "A5 [148x210 mm]", "A6 [105x148 mm]" );  #                 "a2 [420x594 mm]", "a3 [297x420 mm]", "a4 [210x297 mm]", 
   #                 "a5 [148x210 mm]", "a6 [105x148 mm]" );
   my @paperSize = ("letter [8 1/2x11 in]", "legal [8 1/2x14 in]", 
    "a4 [210x297 mm]");
   
 # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |  # Tentative format: Orientation (L = Landscape, P = portrait) | Colnum |
 #                   Paper type  #                   Paper type
Line 1818  sub render { Line 2323  sub render {
   </tr>    </tr>
   <tr>    <tr>
     <td>      <td>
       <input type="radio" name="${var}.layout" value="L" /> Landscape<br />        <label><input type="radio" name="${var}.layout" value="L" /> Landscape </label><br />
       <input type="radio" name="${var}.layout" value="P" checked='1'  /> Portrait        <label><input type="radio" name="${var}.layout" value="P" checked='1'  /> Portrait </label>
     </td>      </td>
     <td align="center">      <td align="center">
       <select name="${var}.cols">        <select name="${var}.cols">
Line 1837  STATEHTML Line 2342  STATEHTML
     $result .= "</select></td><td>\n";      $result .= "</select></td><td>\n";
     $result .= "<select name='${var}.paper'>\n";      $result .= "<select name='${var}.paper'>\n";
   
       my %parmhash=&Apache::lonnet::coursedescription($env{'request.course.id'});
       my $DefaultPaperSize=$parmhash{'default_paper_size'};
       if ($DefaultPaperSize eq '') {$DefaultPaperSize='letter';}
     $i = 0;      $i = 0;
     foreach (@paperSize) {      foreach (@paperSize) {
         if ($i == 0) {   $_=~/(\w+)/;
             $result .= "<option selected value='$i'>" . $paperSize[$i] . "</option>\n";   my $papersize=$1;
           if ($paperSize[$i]=~/$DefaultPaperSize/) {
               $result .= "<option selected value='$papersize'>" . $paperSize[$i] . "</option>\n";
         } else {          } else {
             $result .= "<option value='$i'>" . $paperSize[$i] . "</option>\n";              $result .= "<option value='$papersize'>" . $paperSize[$i] . "</option>\n";
         }          }
         $i++;          $i++;
     }      }
   
     $result .= "</select></td></tr></table>";      $result .= "</select></td></tr></table>";
     return $result;      return $result;
 }  }
Line 1857  sub postprocess { Line 2366  sub postprocess {
     my $var = $self->{'variable'};      my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();      my $helper = Apache::lonhelper->getHelper();
     $helper->{VARS}->{$var} =       $helper->{VARS}->{$var} = 
         $ENV{"form.$var.layout"} . '|' . $ENV{"form.$var.cols"} . '|' .          $env{"form.$var.layout"} . '|' . $env{"form.$var.cols"} . '|' .
         $ENV{"form.$var.paper"};          $env{"form.$var.paper"};
     return 1;      return 1;
 }  }
   
Line 1888  is no tag interface. You actually pass p Line 2397  is no tag interface. You actually pass p
 =cut  =cut
   
 use Apache::lonhelper;  use Apache::lonhelper;
   use Apache::lonnet;
 no strict;  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
Line 1986  sub postprocess { Line 2495  sub postprocess {
   
     my $var = $self->{'variable'};      my $var = $self->{'variable'};
     my $helper = Apache::lonhelper->getHelper();      my $helper = Apache::lonhelper->getHelper();
     my $width = $helper->{VARS}->{$var .'.width'} = $ENV{"form.${var}.width"};       my $width = $helper->{VARS}->{$var .'.width'} = $env{"form.${var}.width"}; 
     my $height = $helper->{VARS}->{$var .'.height'} = $ENV{"form.${var}.height"};       my $height = $helper->{VARS}->{$var .'.height'} = $env{"form.${var}.height"}; 
     my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $ENV{"form.${var}.lmargin"};       my $lmargin = $helper->{VARS}->{$var .'.lmargin'} = $env{"form.${var}.lmargin"}; 
     $helper->{VARS}->{$var .'.widthunit'} = $ENV{"form.${var}.widthunit"};       $helper->{VARS}->{$var .'.widthunit'} = $env{"form.${var}.widthunit"}; 
     $helper->{VARS}->{$var .'.heightunit'} = $ENV{"form.${var}.heightunit"};       $helper->{VARS}->{$var .'.heightunit'} = $env{"form.${var}.heightunit"}; 
     $helper->{VARS}->{$var .'.lmarginunit'} = $ENV{"form.${var}.lmarginunit"};       $helper->{VARS}->{$var .'.lmarginunit'} = $env{"form.${var}.lmarginunit"}; 
   
     my $error = '';      my $error = '';
   

Removed from v.1.287  
changed lines
  Added in v.1.380


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