Diff for /loncom/interface/lonprintout.pm between versions 1.469 and 1.510

version 1.469, 2006/07/31 10:32:00 version 1.510, 2007/10/11 22:49:49
Line 23 Line 23
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #  #
 # /home/httpd/html/adm/gpl.txt  # /home/httpd/html/adm/gpl.txt
 #  
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  #
 #  #
Line 39  use Apache::grades; Line 38  use Apache::grades;
 use Apache::edit;  use Apache::edit;
 use Apache::File();  use Apache::File();
 use Apache::lonnavmaps;  use Apache::lonnavmaps;
 use Apache::lonratedt;  use LONCAPA::map();
 use POSIX qw(strftime);  use POSIX qw(strftime);
 use Apache::lonlocal;  use Apache::lonlocal;
 use Carp;  use Carp;
 use lib '/home/httpd/lib/perl/';  
 use LONCAPA;  use LONCAPA;
   
 my %perm;  my %perm;
 my %parmhash;  my %parmhash;
 my $resources_printed;  my $resources_printed;
   
   # Fetch the contents of a resource, uninterpreted.
   # This is used here to fetch a latex file to be included
   # verbatim into the printout<
   # NOTE: Ask Guy if there is a lonnet function similar to this?
   #
   # Parameters:
   #   URL of the file
   #
   sub fetch_raw_resource {
       my ($url) = @_;
   
       my $filename  = &Apache::lonnet::filelocation("", $url);
       my $contents  = &Apache::lonnet::getfile($filename);
   
       if ($contents == -1) {
    return "File open failed for $filename";      # This will bomb the print.
       }
       return $contents;
   
       
   }
   
   #
   #   printf_style_subst  item format_string repl
   #  
   # Does printf style substitution for a format string that
   # can have %[n]item in it.. wherever, %[n]item occurs,
   # rep is substituted in format_string.  Note that
   # [n] is an optional integer length.  If provided,
   # repl is truncated to at most [n] characters prior to 
   # substitution.
   #
   sub printf_style_subst {
       my ($item, $format_string, $repl) = @_;
       my $result = "";
       while ($format_string =~ /(%)(\d*)\Q$item\E/g ) {
    my $fmt = $1;
    my $size = $2;
    my $subst = $repl;
    if ($size ne "") {
       $subst = substr($subst, 0, $size);
       
       #  Here's a nice edge case.. supose the end of the
       #  substring is a \.  In that case may have  just
       #  chopped off a TeX escape... in that case, we append
       #   " " for the trailing character, and let the field 
       #  spill over a bit (sigh).
       #  We don't just chop off the last character in order to deal
       #  with one last pathology, and that would be if substr had
       #  trimmed us to e.g. \\\  
   
   
       if ($subst =~ /\\$/) {
    $subst .= " ";
       }
    }
    my $item_pos = pos($format_string);
    $result .= substr($format_string, 0, $item_pos - length($size) -2) . $subst;
           $format_string = substr($format_string, pos($format_string));
       }
   
       # Put the residual format string into the result:
   
       $result .= $format_string;
   
       return $result;
   }
   
   
 # Format a header according to a format.    # Format a header according to a format.  
 #   # 
Line 60  my $resources_printed; Line 126  my $resources_printed;
 #     %n    - Student name.  #     %n    - Student name.
 #  #
 sub format_page_header {  sub format_page_header {
     my ($format, $assignment, $course, $student) = @_;      my ($width, $format, $assignment, $course, $student) = @_;
           
       $width = &recalcto_mm($width); # Get width in mm.
     #  Default format?      #  Default format?
   
     if ($format eq '') {      if ($format eq '') {
    # For the default format, we may need to truncate
    # elements..  To do this we need to get the page width.
    # we assume that each character is about 2mm in width.
    # (correct for the header text size??).  We ignore
    # any formatting (e.g. boldfacing in this).
    # 
    # - Allow the student/course to be one line.
    #   but only truncate the course.
    # - Allow the assignment to be 2 lines (wrapped).
    #
    my $chars_per_line = $width/2; # Character/textline.
   
   
    my $firstline = "$student $course";
    if (length($firstline) > $chars_per_line) {
       my $lastchar = $chars_per_line - length($student) - 1;
       if ($lastchar > 0) {
    $course = substr($course, 0, $lastchar);
       } else { # Nothing left of course:
    $course = '';
       }
    }
    if (length($assignment) > $chars_per_line) {
       $assignment = substr($assignment, 0, $chars_per_line);
    }
   
  $format =  "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}";   $format =  "\\textbf{$student} $course \\hfill \\thepage \\\\ \\textit{$assignment}";
   
     } else {      } else {
  $format =~ s/%a/$assignment/g;   # An open question is how to handle long user formatted page headers...
  $format =~ s/%c/$course/g;   # A possible future is to support e.g. %na so that the user can control
  $format =~ s/%n/$student/g;   # the truncation of the elements that can appear in the header.
    #
    $format =  &printf_style_subst("a", $format, $assignment);
    $format =  &printf_style_subst("c", $format, $course);
    $format =  &printf_style_subst("n", $format, $student);
   
    # If the user put %'s in the format string, they  must be escaped
    # to \% else LaTeX will think they are comments and terminate
    # the line.. which is bad!!!
   
   
     }      }
           
   
Line 94  sub num_to_letters { Line 197  sub num_to_letters {
 sub letters_to_num {  sub letters_to_num {
     my ($letters) = @_;      my ($letters) = @_;
     my @letters = split('', uc($letters));      my @letters = split('', uc($letters));
     my %substitution;     my %substitution;
     my $digit = 0;      my $digit = 0;
     foreach my $letter ('A'..'J') {      foreach my $letter ('A'..'J') {
  $substitution{$letter} = $digit;   $substitution{$letter} = $digit;
Line 409  sub character_chart { Line 512  sub character_chart {
     $result =~ s/&\#147;/\`\`/g;      $result =~ s/&\#147;/\`\`/g;
     $result =~ s/&\#148;/\'\'/g;      $result =~ s/&\#148;/\'\'/g;
     $result =~ s/&\#149;/\\ensuremath\{\\bullet\}/g;      $result =~ s/&\#149;/\\ensuremath\{\\bullet\}/g;
     $result =~ s/&\#150;/--/g;      $result =~ s/&(\#150|\#8211);/--/g;
     $result =~ s/&\#151;/---/g;      $result =~ s/&\#151;/---/g;
     $result =~ s/&\#152;/\\ensuremath\{\\sim\}/g;      $result =~ s/&\#152;/\\ensuremath\{\\sim\}/g;
     $result =~ s/&\#153;/\\texttrademark /g;      $result =~ s/&\#153;/\\texttrademark /g;
Line 616  sub character_chart { Line 719  sub character_chart {
     $result =~ s/&(clubs|\#9827);/\\ensuremath\{\\clubsuit\}/g;      $result =~ s/&(clubs|\#9827);/\\ensuremath\{\\clubsuit\}/g;
     $result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g;      $result =~ s/&(hearts|\#9829);/\\ensuremath\{\\heartsuit\}/g;
     $result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g;      $result =~ s/&(diams|\#9830);/\\ensuremath\{\\diamondsuit\}/g;
   #   Chemically useful 'things' contributed by Hon Kie (bug 4652).
       $result =~ s/&\#8636;/\\ensuremath\{\\leftharpoonup\}/g;
       $result =~ s/&\#8637;/\\ensuremath\{\\leftharpoondown\}/g;
       $result =~ s/&\#8640;/\\ensuremath\{\\rightharpoonup\}/g;
       $result =~ s/&\#8641;/\\ensuremath\{\\rightharpoondown\}/g;
       $result =~ s/&\#8652;/\\ensuremath\{\\rightleftharpoons\}/g;
       $result =~ s/&\#8605;/\\ensuremath\{\\leadsto\}/g;
       $result =~ s/&\#8617;/\\ensuremath\{\\hookleftarrow\}/g;
       $result =~ s/&\#8618;/\\ensuremath\{\\hookrightarrow\}/g;
       $result =~ s/&\#8614;/\\ensuremath\{\\mapsto\}/g;
       $result =~ s/&\#8599;/\\ensuremath\{\\nearrow\}/g;
       $result =~ s/&\#8600;/\\ensuremath\{\\searrow\}/g;
       $result =~ s/&\#8601;/\\ensuremath\{\\swarrow\}/g;
       $result =~ s/&\#8598;/\\ensuremath\{\\nwarrow\}/g;
     return $result;      return $result;
 }  }
   
Line 624  sub character_chart { Line 741  sub character_chart {
 my %page_formats=  my %page_formats=
     ('letter' => {      ('letter' => {
  'book' => {   'book' => {
      '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm'],       '1' => [ '7.1 in','9.8 in', '-0.57 in','-0.57 in','0.275 in'],
      '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.7 cm']       '2' => ['3.66 in','9.8 in', '-0.57 in','-0.57 in','0.275 in']
  },   },
  'album' => {   'album' => {
      '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.83 in','1 cm'],       '1' => [ '8.8 in', '6.8 in','-0.55 in',  '-0.55 in','0.394 in'],
      '2' => [ '4.4 in', '6.8 in','-0.5 in', '-1.5 in','3.5 in']       '2' => [ '4.8 in', '6.8 in','-0.5 in', '-1.0 in','3.5 in']
  },   },
      },       },
      'legal' => {       'legal' => {
Line 684  my %page_formats= Line 801  my %page_formats=
      },       },
      'a4' => {       'a4' => {
  'book' => {   'book' => {
      '1' => ['17.6 cm','27.2 cm','-0.55  in','-0.83 in','-0.5 in'],       '1' => ['17.6 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm'],
      '2' => [ '9.1 cm','27.2 cm','-0.55  in','-0.83 in','-0.5 in']       '2' => [ '9.1 cm','27.2 cm','-1.397 cm','-2.11 cm','-1.27 cm']
  },   },
  'album' => {   'album' => {
      '1' => ['8.5 in','7.7 in','-0.55 in','-0.83 in','0 in'],       '1' => ['21.59 cm','19.558 cm','-1.397cm','-2.11 cm','0 cm'],
      '2' => ['3.9 in','7.7 in','-0.55 in','-0.83 in','0 in']       '2' => ['9.91 cm','19.558 cm','-1.397 cm','-2.11 cm','0 cm']
  },   },
      },       },
      'a5' => {       'a5' => {
Line 750  sub page_format_transformation { Line 867  sub page_format_transformation {
     my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);      my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin);
   
     if ($selectionmade eq '4') {      if ($selectionmade eq '4') {
  $assignment='Problems from the Whole Course';   if ($choice eq 'all_problems') {
       $assignment='Problems from the Whole Course';
    } else {
       $assignment='Resources from the Whole Course';
    }
     } else {      } else {
  $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header');   $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header');
     }      }
Line 761  sub page_format_transformation { Line 882  sub page_format_transformation {
     my $courseidinfo = &get_course();      my $courseidinfo = &get_course();
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }      if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     my $header_text  = $parmhash{'print_header_format'};      my $header_text  = $parmhash{'print_header_format'};
     $header_text     = &format_page_header($header_text, $assignment,      $header_text     = &format_page_header($textwidth, $header_text, $assignment,
    $courseidinfo, $name);     $courseidinfo, $name);
     my $topmargintoinsert = '';      my $topmargintoinsert = '';
     if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';}      if ($topmargin ne '0') {$topmargintoinsert='\setlength{\topmargin}{'.$topmargin.'}';}
Line 812  sub details_for_menu { Line 933  sub details_for_menu {
     if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; }      if (!$postdata) { $postdata=$helper->{VARS}{'postdata'}; }
     my $name_of_resource = &Apache::lonnet::gettitle($postdata);      my $name_of_resource = &Apache::lonnet::gettitle($postdata);
     my $symbolic = &Apache::lonnet::symbread($postdata);      my $symbolic = &Apache::lonnet::symbread($postdata);
       return if ( $symbolic eq '');
   
     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 827  sub details_for_menu { Line 950  sub details_for_menu {
     return ($name_of_resource,$name_of_sequence,$name_of_map);      return ($name_of_resource,$name_of_sequence,$name_of_map);
 }  }
   
   sub copyright_line {
       return '\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 } ';
   }
   my $end_of_student = "\n".'\special{ps:ENDOFSTUDENTSTAMP}'."\n";
   
 sub latex_corrections {  sub latex_corrections {
     my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_;      my ($number_of_columns,$result,$selectionmade,$answer_mode) = @_;
 #    $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;  #    $result =~ s/\\includegraphics{/\\includegraphics\[width=\\minipagewidth\]{/g;
     $result =~ s/\$number_of_columns/$number_of_columns/g;      my $copyright = &copyright_line();
     if ($selectionmade eq '1' || $answer_mode eq 'only') {      if ($selectionmade eq '1' || $answer_mode eq 'only') {
  $result =~ s/(\\end{document})/\\strut\\vskip 0 mm\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License  $1/;   $result =~ s/(\\end{document})/\\strut\\vskip 0 mm $copyright $end_of_student $1/;
     } else {      } else {
  $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill}\\newline\\noindent\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License  $1/;   $result =~ s/(\\end{document})/\\strut\\vspace\*{-4 mm}\\newline $copyright $end_of_student $1/;
     }      }
       $result =~ s/\$number_of_columns/$number_of_columns/g;
     $result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;      $result =~ s/(\\end{longtable}\s*)(\\strut\\newline\\noindent\\makebox\[\\textwidth\/$number_of_columns\]\[b\]{\\hrulefill})/$2$1/g;
     $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g;      $result =~ s/(\\end{longtable}\s*)\\strut\\newline/$1/g;
 #-- LaTeX corrections       #-- LaTeX corrections     
Line 893  sub IndexCreation { Line 1021  sub IndexCreation {
   
 sub print_latex_header {  sub print_latex_header {
     my $mode=shift;      my $mode=shift;
     my $output='\documentclass[letterpaper,twoside]{article}';      my $output='\documentclass[letterpaper,twoside]{article}\raggedbottom';
     if (($mode eq 'batchmode') || (!$perm{'pav'})) {      if (($mode eq 'batchmode') || (!$perm{'pav'})) {
  $output.='\batchmode';   $output.='\batchmode';
     }      }
Line 1077  sub print_construction_sequence { Line 1205  sub print_construction_sequence {
     if ($helper->{'VARS'}->{'curseed'}) {      if ($helper->{'VARS'}->{'curseed'}) {
  $rndseed=$helper->{'VARS'}->{'curseed'};   $rndseed=$helper->{'VARS'}->{'curseed'};
     }      }
     my $errtext=&Apache::lonratedt::mapread($currentURL);      my $errtext=&LONCAPA::map::mapread($currentURL);
     #       # 
     #  These make this all support recursing for subsequences.      #  These make this all support recursing for subsequences.
     #      #
     my @order    = @Apache::lonratedt::order;      my @order    = @LONCAPA::map::order;
     my @resources = @Apache::lonratedt::resources;       my @resources = @LONCAPA::map::resources; 
     for (my $member=0;$member<=$#order;$member++) {      for (my $member=0;$member<=$#order;$member++) {
  $resources[$order[$member]]=~/^([^:]*):([^:]*):/;   $resources[$order[$member]]=~/^([^:]*):([^:]*):/;
  my $urlp=$2;   my $urlp=$2;
Line 1114  sub print_construction_sequence { Line 1242  sub print_construction_sequence {
     # If necessary, encapsulate answer in minipage:      # If necessary, encapsulate answer in minipage:
           
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     my $body ='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';      my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
       $title = &Apache::lonxml::latex_special_symbols($title);
       my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
     $body.=&path_to_problem($urlp,$LaTeXwidth);      $body.=&path_to_problem($urlp,$LaTeXwidth);
     $body.='\vskip 1 mm '.$answer.'\end{document}';      $body.='\vskip 1 mm '.$answer.'\end{document}';
     $body = &encapsulate_minipage($body);      $body = &encapsulate_minipage($body);
Line 1161  sub output_data { Line 1291  sub output_data {
     my ($r,$helper,$rparmhash) = @_;      my ($r,$helper,$rparmhash) = @_;
     my %parmhash = %$rparmhash;      my %parmhash = %$rparmhash;
     $resources_printed = '';      $resources_printed = '';
       my $do_postprocessing = 1;
     my $js = <<ENDPART;      my $js = <<ENDPART;
 <script type="text/javascript">  <script type="text/javascript">
     var editbrowser;      var editbrowser;
Line 1240  ENDPART Line 1371  ENDPART
     if ($helper->{'VARS'}->{'showallfoils'} eq "1") {       if ($helper->{'VARS'}->{'showallfoils'} eq "1") { 
  $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};   $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
     }      }
       
       if ($helper->{'VARS'}->{'style_file'}=~/\w/) {
    &Apache::lonnet::appenv('construct.style' =>
    $helper->{'VARS'}->{'style_file'});
       } elsif ($env{'construct.style'}) {
    &Apache::lonnet::delenv('construct\\.style');
       }
   
   
     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, ...
Line 1263  ENDPART Line 1402  ENDPART
     if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {      if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
  my %moreenv;   my %moreenv;
  $moreenv{'request.filename'}=$cleanURL;   $moreenv{'request.filename'}=$cleanURL;
  if ($helper->{'VARS'}->{'style_file'}=~/\w/) {  
     $moreenv{'construct.style'}=$helper->{'VARS'}->{'style_file'};  
     my $dom = $env{'user.domain'};  
     my $user = $env{'user.name'};  
     my $put_result = &Apache::lonnet::put('environment',{'construct.style'=>$helper->{'VARS'}->{'style_file'}},$dom,$user);  
  }  
                 if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}                  if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';}
  $form{'problem_split'}=$parmhash{'problem_stream_switch'};   $form{'problem_split'}=$parmhash{'problem_stream_switch'};
  $form{'suppress_tries'}=$parmhash{'suppress_tries'};   $form{'suppress_tries'}=$parmhash{'suppress_tries'};
Line 1309  ENDPART Line 1442  ENDPART
  } else {   } else {
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     if ($helper->{'VARS'}->{'construction'} ne '1') {      if ($helper->{'VARS'}->{'construction'} ne '1') {
  $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';   my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'});
    $title = &Apache::lonxml::latex_special_symbols($title);
    $texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
  $texversion.=&path_to_problem($cleanURL,$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=$cleanURL;   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);
     }      }
     $texversion.='\vskip 1 mm '.$answer.'\end{document}';      $texversion.='\vskip 1 mm '.$answer.'\end{document}';
  }   }
Line 1349  ENDPART Line 1484  ENDPART
  $resources_printed .= $currentURL.':';   $resources_printed .= $currentURL.':';
  my $texversion=&Apache::lonnet::ssi($currentURL,%form);   my $texversion=&Apache::lonnet::ssi($currentURL,%form);
  $result .= $texversion;   $result .= $texversion;
    } elsif ($cleanURL =~/.tex$/) {
       # For this sort of print of a single LaTeX file,
       # We can just print the LaTeX file as it is uninterpreted in any way:
       #
   
       $result = &fetch_raw_resource($currentURL);
       $do_postprocessing = 0; # Don't massage the result.
   
  } else {   } else {
     $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},      $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'},
   $helper->{'VARS'}->{'symb'});    $helper->{'VARS'}->{'symb'});
Line 1430  ENDPART Line 1573  ENDPART
     } else {      } else {
  if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {   if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
     $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     my $body ='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($master_seq[$i]).'}\vskip 0 mm ';      my $title = &Apache::lonnet::gettitle($master_seq[$i]);
       $title = &Apache::lonxml::latex_special_symbols($title);
       my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
     $body   .= &path_to_problem ($urlp,$LaTeXwidth);      $body   .= &path_to_problem ($urlp,$LaTeXwidth);
     $body   .='\vskip 1 mm '.$answer;      $body   .='\vskip 1 mm '.$answer;
     $body    = &encapsulate_minipage($body);      $body    = &encapsulate_minipage($body);
Line 1454  ENDPART Line 1599  ENDPART
     if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }      if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
     $prevassignment=$assignment;      $prevassignment=$assignment;
     my $header_text = $parmhash{'print_header_format'};      my $header_text = $parmhash{'print_header_format'};
     $header_text    = &format_page_header($header_text,      $header_text    = &format_page_header($textwidth, $header_text,
   $assignment,     $assignment, 
   $courseidinfo,     $courseidinfo, 
   $name);    $name);
Line 1751  ENDPART Line 1896  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'},$selectionmade);  
     $result = &latex_corrections($number_of_columns,$result,$selectionmade,      # Only post process if that has not been turned off e.g. by a raw latex resource.
  $helper->{'VARS'}->{'ANSWER_TYPE'});  
     for (my $i=1;$i<=$#print_array;$i++) {      if ($do_postprocessing) {
  $print_array[$i] =    $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'},$selectionmade);
     &latex_corrections($number_of_columns,$print_array[$i],   $result = &latex_corrections($number_of_columns,$result,$selectionmade,
        $selectionmade,        $helper->{'VARS'}->{'ANSWER_TYPE'});
        $helper->{'VARS'}->{'ANSWER_TYPE'});   #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;
Line 1786  ENDPART Line 1930  ENDPART
     if ($i==0) {      if ($i==0) {
  $print_array[$i]=$result;   $print_array[$i]=$result;
     } else {      } else {
    $print_array[$i].='\end{document}';
    $print_array[$i] = 
       &latex_corrections($number_of_columns,$print_array[$i],
          $selectionmade, 
          $helper->{'VARS'}->{'ANSWER_TYPE'});
   
  my $anobegin=index($print_array[$i],'\setcounter{page}',0);   my $anobegin=index($print_array[$i],'\setcounter{page}',0);
  substr($print_array[$i],0,$anobegin)='';   substr($print_array[$i],0,$anobegin)='';
  $print_array[$i]=$inc.$print_array[$i].'\end{document}';   $print_array[$i]=$inc.$print_array[$i];
     }      }
     my $temp_file;      my $temp_file;
     my $newfilename=$filename;      my $newfilename=$filename;
Line 1819  ENDPART Line 1969  ENDPART
     }      }
   
     my $URLback=''; #link to original document      my $URLback=''; #link to original document
     if ($helper->{'VARS'}->{'construction'} ne '1') {      if ($helper->{'VARS'}->{'construction'} eq '1') {
  #prints published resource  
  $URLback=&escape('/adm/flip?postdata=return:');  
     } else {  
  #prints resource from the construction space   #prints resource from the construction space
  $URLback='/'.$helper->{'VARS'}->{'filename'};   $URLback='/'.$helper->{'VARS'}->{'filename'};
  if ($URLback=~/([^?]+)/) {   if ($URLback=~/([^?]+)/) {
Line 1885  sub print_resources { Line 2032  sub print_resources {
     my $printed = '';      my $printed = '';
     my ($username,$userdomain,$usersection) = split /:/,$person;      my ($username,$userdomain,$usersection) = split /:/,$person;
     my $fullname = &get_name($username,$userdomain);      my $fullname = &get_name($username,$userdomain);
     my $namepostfix;      my $namepostfix = "\\\\"; # Both anon and not anon should get the same vspace.
     if ($person =~ 'anon') {      if ($person =~ 'anon') {
  $namepostfix="\\\\Name: ";   $namepostfix .="Name: ";
  $fullname = "CODE - ".$moreenv->{'CODE'};   $fullname = "CODE - ".$moreenv->{'CODE'};
     }      }
     #  Fullname may have special latex characters that need \ prefixing:      #  Fullname may have special latex characters that need \ prefixing:
Line 1899  sub print_resources { Line 2046  sub print_resources {
   
     &Apache::lonxml::clear_problem_counter();      &Apache::lonxml::clear_problem_counter();
     my %page_breaks  = &get_page_breaks($helper);      my %page_breaks  = &get_page_breaks($helper);
     my @format_array = split(/\|/,$helper->{'VARS'}->{'FORMAT'});      my $columns_in_format = (split(/\|/,$helper->{'VARS'}->{'FORMAT'}))[1];
     my $columns_in_format = $format_array[1];  
     #      #
     #   end each student with a       #   end each student with a 
     #   Special that allows the post processor to even out the page      #   Special that allows the post processor to even out the page
Line 1948  sub print_resources { Line 2094  sub print_resources {
   
           
     my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});      my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
     my $body   ='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($curresline).'}\vskip 0 mm ';      my $title = &Apache::lonnet::gettitle($curresline);
     $body     .=&path_to_problem($res_url,$LaTeXwidth);          $title = &Apache::lonxml::latex_special_symbols($title);
       my $body   ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
       $body     .=&path_to_problem($res_url,$LaTeXwidth);
     $body     .='\vskip 1 mm '.$ansrendered;      $body     .='\vskip 1 mm '.$ansrendered;
     $body     = &encapsulate_minipage($body);      $body     = &encapsulate_minipage($body);
     $rendered = $header.$body;      $rendered = $header.$body;
Line 1990  sub print_resources { Line 2138  sub print_resources {
     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');
     my $HeaderLine = $parmhash{'print_header_format'};      my $header_line =
     $HeaderLine = format_page_header($HeaderLine, $currentassignment, $courseidinfo, $fullname);   &format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
     if ($current_output=~/\\documentclass/) {      $currentassignment, $courseidinfo, $fullname);
  if ($columns_in_format == 1) {      my $header_start = ($columns_in_format == 1) ? '\lhead'
     $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\lhead{$HeaderLine$namepostfix}}\\vskip 5 mm /;                                           : '\fancyhead[LO]';
  } else {      $header_line = $header_start.'{'.$header_line.'}';
         $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent\\fancyhead[LO]{$HeaderLine$namepostfix}}\\vskip 5 mm /;  
   
  }      if ($current_output=~/\\documentclass/) {
    $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /;
     } else {      } else {
  my $blankpages = '';   my $blankpages = 
  for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';}      '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'};
  if ($columns_in_format == 1) {      
     $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$HeaderLine.'}'.$namepostfix.'} \vskip 5 mm '.$current_output;   $current_output = '\strut\vspace*{-6 mm}\\newline'.
  } else {      &copyright_line().' \newpage '.$blankpages.$end_of_student.
    $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\fancyhead[LO]{'.$HeaderLine.'}'.$namepostfix.'} \vskip 5 mm '.$current_output;      '\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent'.
  }      $header_line.$namepostfix.'} \vskip 5 mm '.$current_output;
     }      }
     #      #
     #  Close the student bracketing.      #  Close the student bracketing.
     #      #
     $current_output .= "\n\\special{ps:ENDOFSTUDENTSTAMP}\n";  
     return ($current_output,$fullname, $printed);      return ($current_output,$fullname, $printed);
   
 }  }
Line 2072  sub init_perm { Line 2219  sub init_perm {
     }      }
 }  }
   
   sub get_randomly_ordered_warning {
       my ($helper,$map) = @_;
   
       my $message;
   
       my $postdata = $env{'form.postdata'} || $helper->{VARS}{'postdata'};
       my $navmap = Apache::lonnavmaps::navmap->new();
       my $res = $navmap->getResourceByUrl($map);
       if ($res) {
    my $func = 
       sub { return ($_[0]->is_map() && $_[0]->randomorder); };
    my @matches = $navmap->retrieveResources($res, $func,1,1,1);
    if (@matches) {
       $message = "Some of the items below are in folders set to be randomly ordered. However, when printing the contents of these folders, they will be printed in the original order for all students, not the randomized order.";
    }
       }
       if ($message) {
    return '<message type="warning">'.$message.'</message>';
       }
       return;
   }
   
 sub printHelper {  sub printHelper {
     my $r = shift;      my $r = shift;
   
Line 2113  sub printHelper { Line 2282  sub printHelper {
     $helper->declareVar('FINISHPAGE');      $helper->declareVar('FINISHPAGE');
     $helper->declareVar('PRINT_TYPE');      $helper->declareVar('PRINT_TYPE');
     $helper->declareVar("showallfoils");      $helper->declareVar("showallfoils");
       $helper->declareVar("STUDENTS");
   
     #  The page breaks can get loaded initially from the course environment:      #  The page breaks can get loaded initially from the course environment:
     # But we only do this in the initial state so that they are allowed to change.      # But we only do this in the initial state so that they are allowed to change.
Line 2124  sub printHelper { Line 2294  sub printHelper {
  {'pagebreaks'  => 'scalar',   {'pagebreaks'  => 'scalar',
          'lastprinttype' => 'scalar'});           'lastprinttype' => 'scalar'});
           
       # This will persistently load in the data we want from the
       # very first screen.
           
     if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {      if($helper->{VARS}->{PRINT_TYPE} eq $env{'form.lastprinttype'}) {
  if (!defined ($env{"form.CURRENT_STATE"})) {   if (!defined ($env{"form.CURRENT_STATE"})) {
Line 2138  sub printHelper { Line 2310  sub printHelper {
   
     }      }
   
       
     # This will persistently load in the data we want from the  
     # 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";
Line 2148  sub printHelper { Line 2318  sub printHelper {
     } 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 ( $helper->{VARS}->{'symb'} eq '') {
    $helper->{VARS}->{'postdata'} = $env{'form.postdata'};
       }
         }          }
         if ($env{'form.symb'}) {          if ($env{'form.symb'}) {
             $helper->{VARS}->{'symb'} = $env{'form.symb'};              $helper->{VARS}->{'symb'} = $env{'form.symb'};
Line 2175  sub printHelper { Line 2348  sub printHelper {
     my $symb = $helper->{VARS}->{'symb'};      my $symb = $helper->{VARS}->{'symb'};
     my ($map, $id, $url);      my ($map, $id, $url);
     my $subdir;      my $subdir;
       my $is_published=0; # True when printing from resource space.
   
     # Get the resource name from construction space      # Get the resource name from construction space
     if ($helper->{VARS}->{'construction'}) {      if ($helper->{VARS}->{'construction'}) {
Line 2183  sub printHelper { Line 2357  sub printHelper {
         $subdir = substr($helper->{VARS}->{'filename'},          $subdir = substr($helper->{VARS}->{'filename'},
                          0, rindex($helper->{VARS}->{'filename'}, '/') + 1);                           0, rindex($helper->{VARS}->{'filename'}, '/') + 1);
     } else {      } else {
         ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);   if ($symb ne '') {
         $helper->{VARS}->{'postdata'} =       ($map, $id, $url) = &Apache::lonnet::decode_symb($symb);
     &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));      $helper->{VARS}->{'postdata'} = 
    &Apache::lonenc::check_encrypt(&Apache::lonnet::clutter($url));
    } else {
       $url = $helper->{VARS}->{'postdata'};
       $is_published=1; # From resource space.
    }
    $url = &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 2206  sub printHelper { Line 2386  sub printHelper {
   
     # "Delete everything after the last slash."      # "Delete everything after the last slash."
     $subdir =~ s|/[^/]+$||;      $subdir =~ s|/[^/]+$||;
     if (not $helper->{VARS}->{'construction'}) {  
  $subdir=$Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'.$subdir;  
     }  
     # "Remove all duplicate slashes."  
     $subdir =~ s|/+|/|g;  
   
     # What can be printed is a very dynamic decision based on      # What can be printed is a very dynamic decision based on
     # lots of factors. So we need to dynamically build this list.      # lots of factors. So we need to dynamically build this list.
Line 2251  sub printHelper { Line 2426  sub printHelper {
     "' variable='FINISHPAGE' />";      "' variable='FINISHPAGE' />";
     }      }
   
     if (($helper->{'VARS'}->{'construction'} ne '1') &&      if (($helper->{'VARS'}->{'construction'} ne '1' ) &&
   
  $helper->{VARS}->{'postdata'} &&   $helper->{VARS}->{'postdata'} &&
  $helper->{VARS}->{'assignment'}) {   $helper->{VARS}->{'assignment'}) {
Line 2289  HELPERFRAGMENT Line 2464  HELPERFRAGMENT
   
     # If the user has pfo (print for otheres) allow them to print all       # If the user has pfo (print for otheres) allow them to print all 
     # problems and resources  in the entier course, optionally for selected students      # problems and resources  in the entier course, optionally for selected students
     if ($perm{'pfo'} &&       if ($perm{'pfo'} &&  !$is_published  &&
         ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) {           ($helper->{VARS}->{'postdata'}=~/\/res\// || $helper->{VARS}->{'postdata'}=~/\/(syllabus|smppg|aboutme|bulletinboard)$/)) { 
   
         push @{$printChoices}, ['Selected <b>Problems</b> from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];          push @{$printChoices}, [&mtn('Selected <b>Problems</b> from <b>entire course</b>'), 'all_problems', 'ALL_PROBLEMS'];
  push @{$printChoices}, ['Selected <b>Resources</b> from <b>entire course</b>', 'all_resources', 'ALL_RESOURCES'];   push @{$printChoices}, [&mtn('Selected <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">
     <resource variable="RESOURCES" toponly='0' multichoice="1"      <resource variable="RESOURCES" toponly='0' multichoice="1"
Line 2317  HELPERFRAGMENT Line 2492  HELPERFRAGMENT
 ALL_PROBLEMS  ALL_PROBLEMS
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
     push @{$printChoices}, [&mt("Selected <b>Problems</b> from folder <b><i>[_1]</i></b> for <b>selected students</b>",$sequenceTitle), 'problems_for_students', 'CHOOSE_STUDENTS'];      push @{$printChoices}, [&mt("Selected <b>Problems</b> from folder <b><i>[_1]</i></b> for <b>selected people</b>",$sequenceTitle), 'problems_for_students', 'CHOOSE_STUDENTS'];
     push @{$printChoices}, [&mt("Selected <b>Problems</b> from folder <b><i>[_1]</i></b> for <b>anonymous students</b>",$sequenceTitle), 'problems_for_anon', 'CHOOSE_ANON1'];      push @{$printChoices}, [&mt("Selected <b>Problems</b> from folder <b><i>[_1]</i></b> for <b>CODEd assignments</b>",$sequenceTitle), 'problems_for_anon', 'CHOOSE_ANON1'];
  }   }
   
    my $randomly_ordered_warning = 
       &get_randomly_ordered_warning($helper,$map);
   
  # resource_selector will hold a few states that:   # resource_selector will hold a few states that:
  #   - Allow resources to be selected for printing.   #   - Allow resources to be selected for printing.
  #   - Determine pagination between assignments.   #   - Determine pagination between assignments.
Line 2332  ALL_PROBLEMS Line 2510  ALL_PROBLEMS
  #   #
  my $resource_selector=<<RESOURCE_SELECTOR;   my $resource_selector=<<RESOURCE_SELECTOR;
     <state name="SELECT_PROBLEMS" title="Select resources to print">      <state name="SELECT_PROBLEMS" title="Select resources to print">
       $randomly_ordered_warning
   
    <nextstate>PRINT_FORMATTING</nextstate>      <nextstate>PRINT_FORMATTING</nextstate> 
    <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
     <resource variable="RESOURCES" multichoice="1" addstatus="1"       <resource variable="RESOURCES" multichoice="1" addstatus="1" 
Line 2364  RESOURCE_SELECTOR Line 2544  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">
       <message><b>Select sort order</b> </message>        <message><b>Select sorting order of printout</b> </message>
     <choices variable='student_sort'>      <choices variable='student_sort'>
       <choice computer='0'>Sort by section then student</choice>        <choice computer='0'>Sort by section then student</choice>
       <choice computer='1'>Sort by students across sections.</choice>        <choice computer='1'>Sort by students across sections.</choice>
Line 2405  CHOOSE_STUDENTS Line 2585  CHOOSE_STUDENTS
  }   }
  if (%codes_to_print) {   if (%codes_to_print) {
     $code_selection .='         $code_selection .='   
     <message><b>Choose single code from list</b></message>      <message><b>Choose single CODE from list:</b></message>
  <message></td><td></message>   <message></td><td></message>
  <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">   <dropdown variable="CODE_SELECTED_FROM_LIST" multichoice="0" allowempty="0">
                   <choice></choice>                    <choice></choice>
Line 2451  CHOOSE_STUDENTS Line 2631  CHOOSE_STUDENTS
        </validator>         </validator>
     </string>      </string>
     <message></td></tr><tr><td></message>      <message></td></tr><tr><td></message>
     <message><b>Names to store the CODEs under for later:</b></message>      <message><b>Names to save the CODEs under for later:</b></message>
     <message></td><td></message>      <message></td><td></message>
     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />      <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
     <message></td></tr><tr><td></message>      <message></td></tr><tr><td></message>
Line 2462  CHOOSE_STUDENTS Line 2642  CHOOSE_STUDENTS
     </dropdown>      </dropdown>
     <message></td></tr><tr><td colspan="2"></td></tr><tr><td></message>      <message></td></tr><tr><td colspan="2"></td></tr><tr><td></message>
     <message></td></tr><tr><td></table></message>      <message></td></tr><tr><td></table></message>
     <message><br /><hr /><h3>Print a Specific Code </h3><br /><table></message>      <message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message>
     <message><tr><td><b>Enter a CODE to print:</b></td><td></message>      <message><tr><td><b>Enter a CODE to print:</b></td><td></message>
     <string variable="SINGLE_CODE" size="10">      <string variable="SINGLE_CODE" size="10">
         <validator>          <validator>
Line 2476  CHOOSE_STUDENTS Line 2656  CHOOSE_STUDENTS
    }     }
         </validator>          </validator>
     </string>      </string>
     <message></td</tr><tr><td></message>      <message></td></tr><tr><td></message>
         $code_selection          $code_selection
     <message></td></tr></table></message>      <message></td></tr></table></message>
     <message><hr /><h3>Reprint a Set of Saved Codes</h3><table><tr><td></message>      <message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message>
     <message><b>Select saved CODEs:</b></message>      <message><b>Select saved CODEs:</b></message>
     <message></td><td></message>      <message></td><td></message>
     <dropdown variable="REUSE_OLD_CODES">      <dropdown variable="REUSE_OLD_CODES">
Line 2492  CHOOSE_ANON1 Line 2672  CHOOSE_ANON1
   
   
  if ($helper->{VARS}->{'assignment'}) {   if ($helper->{VARS}->{'assignment'}) {
     push @{$printChoices}, [&mt("Selected <b>Resources</b> from folder <b><i>[_1]</i></b> for <b>selected students</b>",$sequenceTitle), 'resources_for_students', 'CHOOSE_STUDENTS1'];      push @{$printChoices}, [&mt("Selected <b>Resources</b> from folder <b><i>[_1]</i></b> for <b>selected people</b>",$sequenceTitle), 'resources_for_students', 'CHOOSE_STUDENTS1'];
     push @{$printChoices}, [&mt("Selected <b>Resources</b> from folder <b><i>[_1]</i></b> for <b>anonymous students</b>",$sequenceTitle), 'resources_for_anon', 'CHOOSE_ANON2'];      push @{$printChoices}, [&mt("Selected <b>Resources</b> from folder <b><i>[_1]</i></b> for <b>CODEd assignments</b>",$sequenceTitle), 'resources_for_anon', 'CHOOSE_ANON2'];
  }   }
           
   
  $resource_selector=<<RESOURCE_SELECTOR;   $resource_selector=<<RESOURCE_SELECTOR;
     <state name="SELECT_RESOURCES" title="Select Resources">      <state name="SELECT_RESOURCES" title="Select Resources">
       $randomly_ordered_warning
   
     <nextstate>PRINT_FORMATTING</nextstate>      <nextstate>PRINT_FORMATTING</nextstate>
     <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>      <message><br /><big><i><b>Select resources for the assignment</b></i></big><br /></message>
     <resource variable="RESOURCES" multichoice="1" addstatus="1"       <resource variable="RESOURCES" multichoice="1" addstatus="1" 
Line 2544  RESOURCE_SELECTOR Line 2726  RESOURCE_SELECTOR
 CHOOSE_STUDENTS1  CHOOSE_STUDENTS1
   
  &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);   &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_ANON2);
   <state name="CHOOSE_ANON2" title="Select Students and Resources">    <state name="CHOOSE_ANON2" title="Select CODEd Assignments">
     <nextstate>SELECT_RESOURCES</nextstate>      <nextstate>SELECT_RESOURCES</nextstate>
     <message><table><tr><td><b>Number of anonymous assignments to print:</b></td><td></message>      <message><h4>Fill out one of the forms below</h4></message>
       <message><br /><hr /> <br /></message>
       <message><h3>Generate new CODEd Assignments</h3></message>
       <message><table><tr><td><b>Number of CODEd assignments to print:</b></td><td></message>
     <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">      <string variable="NUMBER_TO_PRINT_TOTAL" maxlength="5" size="5">
        <validator>         <validator>
  if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&   if (((\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}+0) < 1) &&
Line 2559  CHOOSE_STUDENTS1 Line 2744  CHOOSE_STUDENTS1
        </validator>         </validator>
     </string>      </string>
     <message></td></tr><tr><td></message>      <message></td></tr><tr><td></message>
     <message><b>Names to store the CODEs under for later:</b></message>      <message><b>Names to save the CODEs under for later:</b></message>
     <message></td><td></message>      <message></td><td></message>
     <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />      <string variable="ANON_CODE_STORAGE_NAME" maxlength="50" size="20" />
     <message></td></tr><tr><td></message>      <message></td></tr><tr><td></message>
Line 2568  CHOOSE_STUDENTS1 Line 2753  CHOOSE_STUDENTS1
     <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">      <dropdown variable="CODE_OPTION" multichoice="0" allowempty="0">
     $codechoice      $codechoice
     </dropdown>      </dropdown>
     <message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message>      <message></td></tr><tr><td></table></message>
     <message></td></tr><tr><td></message>      <message><br /><hr /><h3>Print a Specific CODE </h3><br /><table></message>
     <message><b>Enter a CODE to print:</b></td><td></message>      <message><tr><td><b>Enter a CODE to print:</b></td><td></message>
     <string variable="SINGLE_CODE" size="10">      <string variable="SINGLE_CODE" size="10">
         <validator>          <validator>
    if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&     if(!\$helper->{'VARS'}{'NUMBER_TO_PRINT_TOTAL'}           &&
Line 2583  CHOOSE_STUDENTS1 Line 2768  CHOOSE_STUDENTS1
    }     }
         </validator>          </validator>
     </string>      </string>
     <message></td></tr><tr><td colspan="2"><hr width='33%' /></td></tr><tr><td></message>      <message></td></tr><tr><td></message>
         $code_selection          $code_selection
     <message><b>Reprint a set of saved CODEs:</b></message>      <message></td></tr></table></message>
       <message><hr /><h3>Reprint a Set of Saved CODEs</h3><table><tr><td></message>
       <message><b>Select saved CODEs:</b></message>
     <message></td><td></message>      <message></td><td></message>
     <dropdown variable="REUSE_OLD_CODES">      <dropdown variable="REUSE_OLD_CODES">
         $namechoice          $namechoice
     </dropdown>      </dropdown>
     <message></td></tr></table></message>      <message></td></tr></table></message>
     <message><hr width='33%' /></message>  
   </state>    </state>
     $resource_selector      $resource_selector
 CHOOSE_ANON2  CHOOSE_ANON2
     }      }
   
     # FIXME: That RE should come from a library somewhere.      # FIXME: That RE should come from a library somewhere.
     if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $perm{'pav'} and $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/') {          if (($perm{'pav'} 
         push @{$printChoices}, [&mt("Selected <b>Problems</b> from current subdirectory <b><i>[_1]</i></b>",$subdir), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];   && $subdir ne $Apache::lonnet::perlvar{'lonDocRoot'}.'/res/'
    && (defined($helper->{'VARS'}->{'construction'})
       ||
       (&Apache::lonnet::allowed('bre',$subdir) eq 'F'
        && 
        $helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)
       )) 
    && $helper->{VARS}->{'assignment'} eq ""
    ) {
   
         my $f = '$filename';   my $pretty_dir = &Apache::lonnet::hreflocation($subdir);
           push @{$printChoices}, [&mt("Selected <b>Problems</b> from current subdirectory <b><i>[_1]</i></b>",$pretty_dir), 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
         my $xmlfrag = <<CHOOSE_FROM_SUBDIR;          my $xmlfrag = <<CHOOSE_FROM_SUBDIR;
   <state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$subdir</small></b> to print">    <state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$pretty_dir</small></b> to print">
   
     <files variable="FILES" multichoice='1'>      <files variable="FILES" multichoice='1'>
       <nextstate>PAGESIZE</nextstate>        <nextstate>PAGESIZE</nextstate>
Line 2624  CHOOSE_FROM_SUBDIR Line 2819  CHOOSE_FROM_SUBDIR
   
     # Allow the user to select any sequence in the course, feed it to      # Allow the user to select any sequence in the course, feed it to
     # another resource selector for that sequence      # another resource selector for that sequence
     if (!$helper->{VARS}->{'construction'}) {      if (!$helper->{VARS}->{'construction'} && !$is_published) {
  push @$printChoices, ["Selected <b>Resources</b> from <b>selected folder</b> in course",   push @$printChoices, [&mtn("Selected <b>Resources</b> from <b>selected folder</b> in course"),
       'select_sequences', 'CHOOSE_SEQUENCE'];        'select_sequences', 'CHOOSE_SEQUENCE'];
  my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'};   my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'};
  #Escape apostrophes and backslashes for Perl   #Escape apostrophes and backslashes for Perl
Line 2671  CHOOSE_FROM_ANY_SEQUENCE Line 2866  CHOOSE_FROM_ANY_SEQUENCE
   
     if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or       if (($perm{'pav'} and &Apache::lonnet::allowed('vgr',$env{'request.course.id'})) or 
  ($helper->{VARS}->{'construction'} eq '1')) {   ($helper->{VARS}->{'construction'} eq '1')) {
  addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");   addMessage("<hr width='33%' /><table><tr><td align='right'>".
                      '<label for="ANSWER_TYPE_forminput">'.
                      &mt('Print').
                      "</label>: </td><td>");
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'ANSWER_TYPE';      $paramHash->{'variable'} = 'ANSWER_TYPE';   
  $helper->declareVar('ANSWER_TYPE');            $helper->declareVar('ANSWER_TYPE');         
Line 2687  CHOOSE_FROM_ANY_SEQUENCE Line 2885  CHOOSE_FROM_ANY_SEQUENCE
   
     if ($perm{'pav'}) {      if ($perm{'pav'}) {
  if (!$startedTable) {   if (!$startedTable) {
     addMessage("<hr width='33%' /><table><tr><td align='right'>LaTeX mode: </td><td>");      addMessage("<hr width='33%' /><table><tr><td align='right'>".
                          '<label for="LATEX_TYPE_forminput">'.
                          &mt('LaTeX mode').
                          "</label>: </td><td>");
     $startedTable = 1;      $startedTable = 1;
  } else {   } else {
     addMessage("<tr><td align='right'>LaTeX mode: </td><td>");      addMessage("<tr><td align='right'>".
                          '<label for="LATEX_TYPE_forminput">'.
                           &mt('LaTeX mode').
                          "</label>: </td><td>");
  }   }
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'LATEX_TYPE';      $paramHash->{'variable'} = 'LATEX_TYPE';   
Line 2706  CHOOSE_FROM_ANY_SEQUENCE Line 2910  CHOOSE_FROM_ANY_SEQUENCE
  }   }
         Apache::lonhelper::dropdown->new();          Apache::lonhelper::dropdown->new();
     
  addMessage("</td></tr><tr><td align='right'>Print Table of Contents: </td><td>");   addMessage("</td></tr><tr><td align='right'>".
                      '<label for="TABLE_CONTENTS_forminput">'.
                      &mt('Print Table of Contents').
                      "</label>: </td><td>");
         $paramHash = Apache::lonhelper::getParamHash();          $paramHash = Apache::lonhelper::getParamHash();
  $paramHash->{'variable'} = 'TABLE_CONTENTS';      $paramHash->{'variable'} = 'TABLE_CONTENTS';   
  $helper->declareVar('TABLE_CONTENTS');            $helper->declareVar('TABLE_CONTENTS');         
Line 2717  CHOOSE_FROM_ANY_SEQUENCE Line 2924  CHOOSE_FROM_ANY_SEQUENCE
  addMessage("</td></tr>");   addMessage("</td></tr>");
                   
  if (not $helper->{VARS}->{'construction'}) {   if (not $helper->{VARS}->{'construction'}) {
     addMessage("<tr><td align='right'>Print Index: </td><td>");      addMessage("<tr><td align='right'>".
                          '<label for="TABLE_INDEX_forminput">'.
                          &mt('Print Index').
                          "</label>: </td><td>");
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'TABLE_INDEX';         $paramHash->{'variable'} = 'TABLE_INDEX';   
     $helper->declareVar('TABLE_INDEX');               $helper->declareVar('TABLE_INDEX');         
Line 2726  CHOOSE_FROM_ANY_SEQUENCE Line 2936  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>");      addMessage("<tr><td align='right'>".
                          '<label for="PRINT_DISCUSSIONS_forminput">'.
                          &mt('Print Discussions').
                          "</label>: </td><td>");
     $paramHash = Apache::lonhelper::getParamHash();      $paramHash = Apache::lonhelper::getParamHash();
     $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';         $paramHash->{'variable'} = 'PRINT_DISCUSSIONS';   
     $helper->declareVar('PRINT_DISCUSSIONS');               $helper->declareVar('PRINT_DISCUSSIONS');         
Line 2747  CHOOSE_FROM_ANY_SEQUENCE Line 2960  CHOOSE_FROM_ANY_SEQUENCE
  }   }
   
  if ($helper->{'VARS'}->{'construction'}) {    if ($helper->{'VARS'}->{'construction'}) { 
     my $stylevalue=$env{'construct.style'};      my $stylevalue='$Apache::lonnet::env{"construct.style"}';
               my $randseedtext=&mt("Use random seed");
               my $stylefiletext=&mt("Use style file");
               my $selectfiletext=&mt("Select style file");
   
     my $xmlfrag .= <<"RNDSEED";      my $xmlfrag .= <<"RNDSEED";
     <message><tr><td align='right'>Use random seed:  </td><td></message>      <message><tr><td align='right'>
               <label for="curseed_forminput">$randseedtext</label>:
               </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">
              <message><input type="text" size="40" name="style_file_value" value="$stylevalue"  />&nbsp; <a href="javascript:openbrowser('helpform','style_file_value','sty')">Select style file</a> </td><tr><td></message>               <label for="style_file">$stylefiletext</label>:
                </td><td></message>
                <string variable="style_file" size="40">
    <defaultvalue>
               return $stylevalue;
           </defaultvalue>
                </string><message>&nbsp; <a href="javascript:openbrowser('helpform','style_file_forminput','sty')">$selectfiletext</a> </td></tr><tr><td></td><td align="left"></message>
      <choices allowempty="1" multichoice="true" variable="showallfoils">       <choices allowempty="1" multichoice="true" variable="showallfoils">
                 <choice computer="1">Show all foils?</choice>                  <choice computer="1">Show all foils</choice>
              </choices>               </choices>
      <message></td></tr></message>       <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'};  
       
  }    } 
     }      }
   
Line 2869  sub render { Line 3092  sub render {
     my $PageLayout=&mt('Page layout');      my $PageLayout=&mt('Page layout');
     my $NumberOfColumns=&mt('Number of columns');      my $NumberOfColumns=&mt('Number of columns');
     my $PaperType=&mt('Paper type');      my $PaperType=&mt('Paper type');
       my $landscape=&mt('Landscape');
       my $portrait=&mt('Portrait');
     $result .= <<STATEHTML;      $result .= <<STATEHTML;
   
 <hr width="33%" />  <hr width="33%" />
Line 2880  sub render { Line 3105  sub render {
   </tr>    </tr>
   <tr>    <tr>
     <td>      <td>
       <label><input type="radio" name="${var}.layout" value="L" /> Landscape </label><br />        <label><input type="radio" name="${var}.layout" value="L" /> $landscape </label><br />
       <label><input type="radio" name="${var}.layout" value="P" checked='1'  /> Portrait </label>        <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 3030  sub render { Line 3255  sub render {
  }   }
     }      }
   
     $result .= <<ELEMENTHTML;      # Adjust margin for LaTeX margin: .. requires units == cm or in.
   
       if ($size{'margin_unit'} eq 'in') {
    $size{'margin'} += 1;
       }  else {
    $size{'margin'} += 2.54;
       }
       my %text = ('format' => 'How should each column be formatted?',
    'width'  => 'Width:',
    'height' => 'Height:',
    'margin' => 'Left Margin:',);
       %text = &Apache::lonlocal::texthash(%text);
   
       $result .= <<ELEMENTHTML;
   
 <p>How should each column be formatted?</p>  <p>$text{'format'}</p>
   
 <table cellpadding='3'>  <table cellpadding='3'>
   <tr>    <tr>
     <td align='right'><b>Width</b>:</td>      <td align='right'><b>$text{'width'}</b></td>
     <td align='left'><input type='text' name='$var.width' value="$size{'width'}" size='4' /></td>      <td align='left'><input type='text' name='$var.width' value="$size{'width'}" size='4' /></td>
     <td align='left'>      <td align='left'>
       <select name='$var.widthunit'>        <select name='$var.widthunit'>
Line 3047  sub render { Line 3283  sub render {
     </td>      </td>
   </tr>    </tr>
   <tr>    <tr>
     <td align='right'><b>Height</b>:</td>      <td align='right'><b>$text{'height'}</b></td>
     <td align='left'><input type='text' name="$var.height" value="$size{'height'}" size='4' /></td>      <td align='left'><input type='text' name="$var.height" value="$size{'height'}" size='4' /></td>
     <td align='left'>      <td align='left'>
       <select name='$var.heightunit'>        <select name='$var.heightunit'>
Line 3056  sub render { Line 3292  sub render {
     </td>      </td>
   </tr>    </tr>
   <tr>    <tr>
     <td align='right'><b>Left margin</b>:</td>      <td align='right'><b>$text{'margin'}</b></td>
     <td align='left'><input type='text' name='$var.lmargin' value="$size{'margin'}" size='4' /></td>      <td align='left'><input type='text' name='$var.lmargin' value="$size{'margin'}" size='4' /></td>
     <td align='left'>      <td align='left'>
       <select name='$var.lmarginunit'>        <select name='$var.lmarginunit'>
Line 3074  ELEMENTHTML Line 3310  ELEMENTHTML
     return $result;      return $result;
 }  }
   
 # If the user didn't select 1 column, skip this state.  
 sub preprocess {  sub preprocess {
     my $self = shift;      my $self = shift;
     my $helper = Apache::lonhelper::getHelper();      my $helper = Apache::lonhelper::getHelper();
Line 3107  sub preprocess { Line 3343  sub preprocess {
   
  foreach my $dim ('width', 'height', 'lmargin') {   foreach my $dim ('width', 'height', 'lmargin') {
     my ($value, $units) = split(/ /, $size{$dim});      my ($value, $units) = split(/ /, $size{$dim});
               
     &Apache::lonnet::logthis("$dim : $value : $units");  
       
     $helper->{VARS}->{"$var.".$dim}      = $value;      $helper->{VARS}->{"$var.".$dim}      = $value;
     $helper->{VARS}->{"$var.".$dim.'unit'} = $units;      $helper->{VARS}->{"$var.".$dim.'unit'} = $units;
           
Line 3149  sub postprocess { Line 3383  sub postprocess {
     }      }
     if ($lmargin !~  /^-?[0-9]*(\.[0-9]*)?$/) {      if ($lmargin !~  /^-?[0-9]*(\.[0-9]*)?$/) {
         $error .= "Invalid left margin; please type only a number.<br />\n";          $error .= "Invalid left margin; please type only a number.<br />\n";
       } else {
    # Adjust for LaTeX 1.0 inch margin:
   
    if ($env{"form.${var}.lmarginunit"} eq "in") {
       $helper->{VARS}->{$var.'.lmargin'} = $lmargin - 1;
    } else {
       $helper->{VARS}->{$var.'.lmargin'} = $lmargin - 2.54;
    }
     }      }
   
     if (!$error) {      if (!$error) {

Removed from v.1.469  
changed lines
  Added in v.1.510


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