--- loncom/interface/lonprintout.pm 2004/09/22 20:49:45 1.316.2.2 +++ loncom/interface/lonprintout.pm 2005/02/17 08:29:43 1.361 @@ -1,7 +1,7 @@ -# The LearningOnline Network +# The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.316.2.2 2004/09/22 20:49:45 albertel Exp $ +# $Id: lonprintout.pm,v 1.361 2005/02/17 08:29:43 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -41,12 +41,64 @@ use Apache::lonnavmaps; use Apache::lonratedt; use POSIX qw(strftime); use Apache::lonlocal; -use GDBM_File; +# Compare two students by name. The students are in the form +# 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... -my %hash; -my $LaTeXwidth = 0; + if($f1 lt $f2) { + return -1; + } + if($f1 gt $f2) { + return 1; + } + + # Must be the same name. + return 0; +} sub latex_header_footer_remove { my $text = shift; @@ -229,7 +281,7 @@ sub character_chart { $result =~ s/&(\#219|Ucirc);/\\^{U}/g; $result =~ s/&(\#220|Uuml);/\\\"{U}/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/&(\#225|aacute);/\\\'{a}/g; $result =~ s/&(\#226|acirc);/\\^{a}/g; @@ -373,83 +425,110 @@ 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' => [], + '2' => [] + }, + }, + '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' => [], + '2' => [] + }, + }, + '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 { # -#Correspondence between $papersize variable and real paper format: -# 0 - "Letter [8 1/2x11 in]" -# 1 - "Legal [8 1/2x14 in]" -# 2 - "Ledger/Tabloid [11x17 in]" -# 3 - "Executive [7 1/2x10 in]" -# 4 - "A2 [420x594 mm]" -# 5 - "A3 [297x420 mm]" -# 6 - "A4 [210x297 mm]" -# 7 - "A5 [148x210 mm]" -# 8 - "A6 [105x148 mm]" +#Supported paper format: "Letter [8 1/2x11 in]", "Legal [8 1/2x14 in]", +# "Ledger/Tabloid [11x17 in]", "Executive [7 1/2x10 in]", +# "A2 [420x594 mm]", "A3 [297x420 mm]", +# "A4 [210x297 mm]", "A5 [148x210 mm]", +# "A6 [105x148 mm]" # my ($papersize,$layout,$numberofcolumns) = @_; - my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = (0,0,0,0,0); - 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 = '176 mm'; - $textheight = '254 mm'; - $oddoffset = '-0.57 in'; - $evenoffset = '-0.57 in'; - } elsif ($numberofcolumns == 2) { - $textwidth = '91 mm'; - $textheight = '254 mm'; - $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; + return @{$page_formats{$papersize}->{$layout}->{$numberofcolumns}}; } @@ -483,15 +562,24 @@ sub page_format_transformation { my $name = &get_name(); my $courseidinfo = &get_course(); 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') { - my $topmargintoinsert = ''; - 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} /; + $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 /; } elsif ($layout eq 'book') { 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 { - $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 /;} @@ -518,9 +606,11 @@ sub page_cleanup { sub details_for_menu { - - my $name_of_resourse = &Apache::lonnet::gettitle($ENV{'form.postdata'}); - my $symbolic = &Apache::lonnet::symbread($ENV{'form.postdata'}); + my ($helper)=@_; + my $postdata=$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); $map=&Apache::lonnet::clutter($map); my $name_of_sequence = &Apache::lonnet::gettitle($map); @@ -533,8 +623,7 @@ sub details_for_menu { $ENV{'request.course.uri'} =~ m|([^/]+)$|; $name_of_map = $1; } - return ($name_of_resourse,$name_of_sequence,$name_of_map); - + return ($name_of_resource,$name_of_sequence,$name_of_map); } @@ -606,25 +695,26 @@ sub IndexCreation { sub print_latex_header { my $mode=shift; my $output='\documentclass[letterpaper]{article}'; - if ($mode eq 'batchmode') { + if (($mode eq 'batchmode') || (!$ENV{'request.role.adv'})) { $output.='\batchmode'; } - $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'. - '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'. - '\usepackage[dvips]{graphicx}\usepackage{epsfig}\usepackage{calc}'. - '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'. - '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'. - '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'. - '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'. - '\setlength{\abovedisplayshortskip}{-0.04in}'. - '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'. - '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'. - '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'. - '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'. - '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'. - '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'. - '\setlength{\abovedisplayshortskip}{-0.04in}'. - '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}'; + $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n". + '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n". + '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n". + '\usepackage{picins}\usepackage{calc}'."\n". + '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'."\n". + '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'."\n". + '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'."\n". + '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'."\n". + '\setlength{\abovedisplayshortskip}{-0.04in}'."\n". + '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'."\n". + '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'."\n". + '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'."\n". + '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'."\n". + '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'."\n". + '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'."\n". + '\setlength{\abovedisplayshortskip}{-0.04in}'."\n". + '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}'."\n"; return $output; } @@ -633,7 +723,7 @@ sub path_to_problem { my $newurlp = ''; $colwidth=~s/\s*mm\s*$//; #characters average about 2 mm in width - if (length($urlp)*2 > $LaTeXwidth) { + if (length($urlp)*2 > $colwidth) { my @elements = split '/',$urlp; my $curlength=0; foreach my $element (@elements) { @@ -654,11 +744,11 @@ sub path_to_problem { sub recalcto_mm { my $textwidth=shift; my $LaTeXwidth; - if ($textwidth=~/(\d+\.?\d*)\s*cm/) { + if ($textwidth=~/(-?\d+\.?\d*)\s*cm/) { $LaTeXwidth = $1*10; - } elsif ($textwidth=~/(\d+\.?\d*)\s*mm/) { + } elsif ($textwidth=~/(-?\d+\.?\d*)\s*mm/) { $LaTeXwidth = $1; - } elsif ($textwidth=~/(\d+\.?\d*)\s*in/) { + } elsif ($textwidth=~/(-?\d+\.?\d*)\s*in/) { $LaTeXwidth = $1*25.4; } $LaTeXwidth.=' mm'; @@ -694,10 +784,12 @@ sub unsupported { sub output_data { my ($r,$helper,$rparmhash) = @_; my %parmhash = %$rparmhash; + my $html=&Apache::lonxml::xmlbegin(); my $bodytag=&Apache::loncommon::bodytag('Preparing Printout'); $r->print(< - - LON-CAPA output for printing $bodytag @@ -743,35 +834,43 @@ ENDPART my $LaTeXwidth=&recalcto_mm($textwidth); my @print_array=(); 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 ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { #-- single document - problem, page, html, xml, ... - my $currentURL; + my ($currentURL,$cleanURL); if ($helper->{'VARS'}->{'construction'} ne '1') { #prints published resource $currentURL=$helper->{'VARS'}->{'postdata'}; + $cleanURL=&Apache::lonenc::check_decrypt($currentURL); } else { #prints resource from the construction space $currentURL='/'.$helper->{'VARS'}->{'filename'}; if ($currentURL=~/([^?]+)/) {$currentURL=$1;} + $cleanURL=$currentURL; } $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 $texversion=''; if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { my %moreenv; - $moreenv{'request.filename'}=$currentURL; + $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); } - 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{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; @@ -790,7 +889,7 @@ ENDPART } if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { - my %form; + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'rndseed'}=$rndseed; @@ -801,10 +900,10 @@ ENDPART $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); if ($helper->{'VARS'}->{'construction'} ne '1') { $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 { $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/; $texversion.=&path_to_problem ($URLpath,$LaTeXwidth); } @@ -837,9 +936,6 @@ ENDPART if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { my $texversion=''; 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{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; @@ -849,10 +945,10 @@ ENDPART if((($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) && ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) { - my %form; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'rndseed'}=$rndseed; + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; if ($urlp=~/\/res\//) {$ENV{'request.state'}='published';} my $answer=&Apache::lonnet::ssi($urlp,%form); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { @@ -883,10 +979,7 @@ ENDPART } if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} $result .= '\end{document}'; - } elsif ($currentURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { - my %form; - $form{'grade_target'}='tex'; - $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); + } elsif ($cleanURL=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} my $texversion=&Apache::lonnet::ssi($currentURL,%form); @@ -894,9 +987,10 @@ ENDPART } else { $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}); } - } 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 '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')) { #-- produce an output string if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') { @@ -905,12 +999,11 @@ ENDPART $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; } - my %form=(); - $form{'grade_target'}='tex'; - $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'suppress_tries'}=$parmhash{'suppress_tries'}; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; @@ -919,10 +1012,23 @@ ENDPART my $flag_latex_header_remove = 'NO'; my $flag_page_in_sequence = 'NO'; my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; + my %page_breaks; + foreach my $break (split /\|\|\|/, $helper->{'VARS'}->{'FINISHPAGE'}) { + $page_breaks{$break} = 1; + } my $prevassignment=''; &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); 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]); $urlp=&Apache::lonnet::clutter($urlp); $form{'symb'}=$master_seq[$i]; @@ -930,7 +1036,6 @@ ENDPART 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 ($i==0) {$prevassignment=$assignment;} - #&Apache::lonnet::logthis("Trying to get $urlp with symb $master_seq[$i]"); my $texversion=''; if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { $texversion.=&Apache::lonnet::ssi($urlp,%form); @@ -948,7 +1053,6 @@ ENDPART my $current_counter=$ENV{'form.counter'}; if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { - my %form; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; my $answer=&Apache::lonnet::ssi($urlp,%form); @@ -979,14 +1083,11 @@ ENDPART 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 .='\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)$/) { - my %form; - $form{'grade_target'}='tex'; - $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} my $texversion=&Apache::lonnet::ssi($urlp,%form); @@ -1007,12 +1108,17 @@ ENDPART $result .= $texversion; $flag_latex_header_remove = 'YES'; } + if (&Apache::loncommon::connection_aborted($r)) { last; } } &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}'; } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') || ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'resources_for_students')){ + + #-- prints assignments for whole class or for selected students my $type; if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_for_students') { @@ -1023,21 +1129,34 @@ ENDPART $type='resources'; } 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' || $helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq 'all' ) { $helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1; } my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; + #loop over students my $flag_latex_header_remove = 'NO'; my %moreenv; $moreenv{'instructor_comments'}='hide'; $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); $moreenv{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'}; + $moreenv{'problem_split'} = $parmhash{'problem_stream_switch'}; 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); + my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1,'inline','75'); my $student_counter=-1; 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); @@ -1045,11 +1164,16 @@ ENDPART } $student_counter++; 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)=&print_resources($r,$helper, + $person,$type, + \%moreenv,\@master_seq, + $flag_latex_header_remove, + $LaTeXwidth); $print_array[$i].=$output; $student_names[$i].=$person.':'.$fullname.'_END_'; &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,&mt('last student').' '.$fullname); $flag_latex_header_remove = 'YES'; + if (&Apache::loncommon::connection_aborted($r)) { last; } } &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); $result .= $print_array[0].' \end{document}'; @@ -1060,20 +1184,14 @@ ENDPART 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 @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; - my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'}); - 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 %moreenv = ('textwidth' => &get_textwidth($helper,$LaTeXwidth)); - my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$num_todo,'inline','75'); + $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); @@ -1087,18 +1205,28 @@ ENDPART } @allcodes=keys(%allcodes); } + my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; + my ($type) = split(/_/,$helper->{'VARS'}->{'PRINT_TYPE'}); + 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)= &print_resources($r,$helper,'anonymous',$type,\%moreenv, - \@master_seq,$flag_latex_header_remove); + \@master_seq,$flag_latex_header_remove, + $LaTeXwidth); $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}'; @@ -1116,9 +1244,7 @@ ENDPART my $urlp = $list_of_files[$i]; $urlp=~s|//|/|; if ($urlp=~/\//) { - my %form; - $form{'grade_target'}='tex'; - $form{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; $form{'rndseed'}=$rndseed; if ($urlp =~ m|/home/([^/]+)/public_html|) { $urlp =~ s|/home/([^/]*)/public_html|/~$1|; @@ -1128,7 +1254,6 @@ ENDPART my $texversion=&Apache::lonnet::ssi($urlp,%form); if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { - my %form; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; @@ -1180,10 +1305,10 @@ ENDPART 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 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/\\textheight\s*=\s*\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /; - $result =~ s/\\evensidemargin\s*=\s*\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; - $result =~ s/\\oddsidemargin\s*=\s*\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; + $result =~ s/\\textwidth\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /; + $result =~ s/\\textheight\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /; + $result =~ s/\\evensidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; + $result =~ s/\\oddsidemargin\s*=\s*-?\d*\.?\d*\s*(cm|mm|in)/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; } #-- writing .tex file in prtspool my $temp_file; @@ -1238,7 +1363,7 @@ ENDPART my $URLback=''; #link to original document if ($helper->{'VARS'}->{'construction'} ne '1') { #prints published resource - $URLback=$helper->{'VARS'}->{'postdata'}; + $URLback=&Apache::lonnet::escape('/adm/flip?postdata=return:'); } else { #prints resource from the construction space $URLback='/'.$helper->{'VARS'}->{'filename'}; @@ -1261,7 +1386,9 @@ ENDPART 'cgi.'.$identifier.'backref' => $URLback,); $r->print(< +Continue FINALEND @@ -1290,18 +1417,32 @@ sub get_CODE { } 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 ($username,$userdomain,$usersection) = split /:/,$person; my $fullname = &get_name($username,$userdomain); + my $namepostfix; if ($person =~ 'anon') { + $namepostfix="\\\\Name: "; $fullname = "CODE - ".$moreenv->{'CODE'}; } + my %page_breaks; + foreach my $break (split /\|\|\|/,$helper->{'VARS'}->{'FINISHPAGE'}) { + $page_breaks{$break} = 1; + } + my $i = 0; #goes through all resources, checks if they are available for #current student, and produces output &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); foreach my $curresline (@{$master_seq}) { + if (defined $page_breaks{$curresline}) { + if($i != 0) { + $current_output.= "\\newpage\n"; + } + } + $i++; if ( !($type eq 'problems' && ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) { my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline); @@ -1316,10 +1457,9 @@ sub print_resources { my $current_counter=$ENV{'form.counter'}; if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { - my %form; - $form{'answer_output_mode'}='tex'; - $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; - my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$ENV{'request.course.id'},%form); + $moreenv->{'answer_output_mode'}='tex'; + $moreenv->{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; + my $ansrendered = &Apache::loncommon::get_student_answers($curresline,$username,$userdomain,$ENV{'request.course.id'},%{$moreenv}); &Apache::lonnet::appenv(('form.counter' => $current_counter)); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/; @@ -1362,17 +1502,18 @@ sub print_resources { } $remove_latex_header = 'YES'; } + if (&Apache::loncommon::connection_aborted($r)) { last; } } my $courseidinfo = &get_course(); if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } if ($usersection ne '') {$courseidinfo.=' - Sec. '.$usersection} my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header'); 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 { my $blankpages = ''; for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blankpages.='\clearpage\strut\clearpage';} - $current_output = '\strut\vspace*{-6 mm}\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\vspace*{-2 mm}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blankpages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}}} \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); @@ -1406,13 +1547,15 @@ sub handler { # return OK; my %parmhash=&Apache::lonnet::coursedescription($ENV{'request.course.id'}); - + # my $key; # foreach $key (keys %parmhash) { # $r->print(' '.$key.'->'.$parmhash{$key}.'<-
'); # } -# return OK; +# + + &output_data($r,$helper,\%parmhash); return OK; } @@ -1431,11 +1574,6 @@ use Data::Dumper; sub printHelper { 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 ($ENV{'browser.mathml'}) { &Apache::loncommon::content_type($r,'text/xml'); @@ -1470,6 +1608,7 @@ sub printHelper { $helper->declareVar('construction'); $helper->declareVar('assignment'); $helper->declareVar('style_file'); + $helper->declareVar('student_sort'); # This will persistently load in the data we want from the # very first screen. @@ -1496,8 +1635,9 @@ sub printHelper { $helper->{VARS}->{'symb'} = &Apache::lonnet::symbread($helper->{VARS}->{'postdata'}); } - - my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu; + $helper->{VARS}->{'symb'}= + &Apache::lonenc::check_encrypt($helper->{VARS}->{'symb'}); + my ($resourceTitle,$sequenceTitle,$mapTitle) = &details_for_menu($helper); if ($sequenceTitle ne '') {$helper->{VARS}->{'assignment'}=$sequenceTitle;} @@ -1514,7 +1654,8 @@ sub printHelper { 0, rindex($helper->{VARS}->{'filename'}, '/') + 1); } else { ($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 my $postdata = $helper->{VARS}->{'postdata'}; @@ -1569,8 +1710,8 @@ sub printHelper { my $isNotMap = '!$res->is_sequence()'; $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden; my $isMap = '$res->is_map()'; - my $symbFilter = '$res->symb()'; - my $urlValue = '$res->src()'; + my $symbFilter = '$res->shown_symb()'; + my $urlValue = '$res->link()'; $helper->declareVar('SEQUENCE'); @@ -1580,6 +1721,7 @@ sub printHelper { # If we're in a sequence... if (($helper->{'VARS'}->{'construction'} ne '1') && + $helper->{VARS}->{'postdata'} && $helper->{VARS}->{'assignment'}) { # Allow problems from sequence @@ -1596,6 +1738,7 @@ sub printHelper { return $isProblem; $map return $symbFilter; +