--- loncom/interface/lonprintout.pm 2003/10/15 18:01:10 1.255 +++ loncom/interface/lonprintout.pm 2004/02/03 21:38:18 1.272 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.255 2003/10/15 18:01:10 www Exp $ +# $Id: lonprintout.pm,v 1.272 2004/02/03 21:38:18 sakharuk Exp $ # # Copyright Michigan State University Board of Trustees # @@ -475,11 +475,7 @@ sub page_format_transformation { my ($papersize,$layout,$numberofcolumns,$choice,$text,$assignment,$tableofcontents,$indexlist) = @_; my ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin); $assignment=&Apache::lonxml::latex_special_symbols($assignment,'header'); - if ($numberofcolumns != 1) { - ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); - } else { - ($textwidth,$textheight,$oddoffset,$evenoffset) = ($ENV{'form.width'},$ENV{'form.height'},$ENV{'form.leftmargin'},$ENV{'form.leftmargin'}); - } + ($textwidth,$textheight,$oddoffset,$evenoffset,$topmargin) = &page_format($papersize,$layout,$numberofcolumns,$topmargin); my $name = &get_name(); my $courseidinfo = &get_course(); if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo } @@ -519,17 +515,16 @@ sub page_cleanup { sub details_for_menu { - my $name_of_resourse = $hash{'title_'.$hash{'ids_'.$ENV{'form.postdata'}}}; + my $name_of_resourse = &Apache::lonnet::gettitle($ENV{'form.postdata'}); my $symbolic = &Apache::lonnet::symbread($ENV{'form.postdata'}); my ($map,$id,$resource)=&Apache::lonnet::decode_symb($symbolic); $map=&Apache::lonnet::clutter($map); - my $name_of_sequence; - $name_of_sequence = $hash{'title_'.$hash{'ids_'.$map}}; + my $name_of_sequence = &Apache::lonnet::gettitle($map); if ($name_of_sequence =~ /^\s*$/) { $map =~ m|([^/]+)$|; $name_of_sequence = $1; } - my $name_of_map = $hash{'title_'.$hash{'ids_'.&Apache::lonnet::clutter($ENV{'request.course.uri'})}}; + my $name_of_map = &Apache::lonnet::gettitle($ENV{'request.course.uri'}); if ($name_of_map =~ /^\s*$/) { $ENV{'request.course.uri'} =~ m|([^/]+)$|; $name_of_map = $1; @@ -658,6 +653,30 @@ sub output_data { my $bodytag=&Apache::loncommon::bodytag('Preparing Printout'); $r->print(< + LON-CAPA output for printing @@ -686,6 +705,7 @@ ENDPART $LaTeXwidth = $1*25.4; } $LaTeXwidth.=' mm'; + my @print_array=(); if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'current_document') { #-- single document - problem, page, html, xml, ... @@ -705,6 +725,12 @@ ENDPART if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { my %moreenv; $moreenv{'request.filename'}=$currentURL; + 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; $form{'grade_target'}='tex'; $form{'textwidth'}=$LaTeXwidth; @@ -815,6 +841,13 @@ ENDPART } if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;} $result .= '\end{document}'; + } elsif ($currentURL=~/\/smppg$/) { + my %form; + $form{'grade_target'}='tex'; + $form{'textwidth'}=$LaTeXwidth; + $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; + my $texversion=&Apache::lonnet::ssi($currentURL,%form); + $result .= $texversion; } else { $result.='\documentclass[letterpaper]{article}\usepackage{calc}\begin{document}Printout of this type of document is currently not supported: '; if ($currentURL=~/\/(aboutme|syllabus|bulletinboard|smppg)$/) { @@ -857,21 +890,29 @@ ENDPART $form{'symb'}=$master_seq[$i]; my ($sequence)=&Apache::lonnet::decode_symb($master_seq[$i]); my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #tittle of the assignment which contains this problem + 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=&Apache::lonnet::ssi($urlp,%form); + my $texversion.=&Apache::lonnet::ssi($urlp,%form); if ($urlp=~/\.page$/) { ($texversion,my $number_of_columns_page) = &page_cleanup($texversion); if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} $texversion =~ s/\\end{document}\d*/\\end{document}/; $flag_page_in_sequence = 'YES'; } + my $lonidsdir=$r->dir_config('lonIDsDir'); + my $envfile=$ENV{'user.environment'}; + $envfile=~/\/([^\/]+)\.id$/; + $envfile=$1; + &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile); + my $current_counter=$ENV{'form.counter'}; if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { my %form; $form{'grade_target'}='answer'; $form{'answer_output_mode'}='tex'; my $answer=&Apache::lonnet::ssi($urlp,%form); + &Apache::lonnet::appenv(('form.counter' => $current_counter)); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; } else { @@ -914,6 +955,7 @@ ENDPART $selectionmade=8; } my @students=split /\|\|\|/, $helper->{'VARS'}->{'STUDENTS'}; + if ($helper->{'VARS'}->{'NUMBER_TO_PRINT'} eq '0') {$helper->{'VARS'}->{'NUMBER_TO_PRINT'}=$#students+1;} my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; #loop over students my $flag_latex_header_remove = 'NO'; @@ -921,10 +963,11 @@ ENDPART $moreenv{'form.textwidth'}=$LaTeXwidth; &Apache::lonnet::appenv(%moreenv); my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin($r,'Print Status','Class Print Status',$#students+1); + my $student_counter=-1; foreach my $person (@students) { + $student_counter++; my $current_output = ''; -# my ($usersection,$username,$userdomain) = split /:/,$person; - my ($username,$userdomain) = split /:/,$person; + my ($username,$userdomain,$usersection) = split /:/,$person; my $fullname = &get_name($username,$userdomain); if ($parmhash{'anonymous_quiz'}=~/yes/) {$fullname=' ';} #put here something reasonable for anonymous exams or quiz @@ -937,12 +980,19 @@ ENDPART if (&Apache::lonnet::allowed('bre',$res_url)) { my $rendered = &Apache::loncommon::get_student_view($curresline,$username,$userdomain, $ENV{'request.course.id'},'tex'); + my $lonidsdir=$r->dir_config('lonIDsDir'); + my $envfile=$ENV{'user.environment'}; + $envfile=~/\/([^\/]+)\.id$/; + $envfile=$1; + &Apache::lonnet::transfer_profile_to_env($lonidsdir,$envfile); + my $current_counter=$ENV{'form.counter'}; if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || ($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); + &Apache::lonnet::appenv(('form.counter' => $current_counter)); if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { $rendered=~s/(\\keephidden{ENDOFPROBLEM})/$ansrendered$1/; } else { @@ -964,6 +1014,7 @@ ENDPART } 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 /; @@ -972,14 +1023,14 @@ ENDPART for (my $j=0;$j<$helper->{'VARS'}->{'EMPTY_PAGES'};$j++) {$blanspages.='\clearpage\strut\clearpage';} $current_output = '\strut\\newline\\noindent\\makebox[\\textwidth/$number_of_columns][b]{\\hrulefill}\\newline\\noindent{\\tiny Printed from LON-CAPA\\copyright MSU{\\hfill} Licensed under GNU General Public License }\\newpage '.$blanspages.'\setcounter{page}{1}\noindent\parbox{\minipagewidth}{\noindent\\lhead{\\textit{\\textbf{'.$fullname.'}}'.$courseidinfo.' \\hfill \\thepage \\\\ \\textit{'.$currentassignment.'}}} \vskip -5 mm '.$current_output; } - $result .= $current_output; + $print_array[int($student_counter/$helper->{'VARS'}->{'NUMBER_TO_PRINT'})].=$current_output; &Apache::lonnet::delenv('form.counter'); &Apache::lonxml::init_counter(); &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state, &mt('last student').' '.$fullname); } &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); - $result .= '\end{document}'; + $result .= $print_array[0].' \end{document}'; &Apache::lonnet::delenv('form.textwidth'); } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'problems_from_directory') { #prints selected problems from the subdirectory @@ -1056,29 +1107,54 @@ ENDPART #-------------------------------------------------------- corrections for the different page formats $result = &page_format_transformation($papersize,$laystyle,$numberofcolumns,$helper->{'VARS'}->{'PRINT_TYPE'},$result,$helper->{VARS}->{'assignment'},$helper->{'VARS'}->{'TABLE_CONTENTS'},$helper->{'VARS'}->{'TABLE_INDEX'}); $result = &latex_corrections($number_of_columns,$result); + for (my $i=1;$i<=$#print_array;$i++) {$print_array[$i] = &latex_corrections($number_of_columns,$print_array[$i]);} #changes page's parameters for the one column output if ($numberofcolumns == 1) { - $result =~ s/\\textwidth= 9cm/\\textwidth= $helper->{'VARS'}->{'pagesize.width'} $helper->{'VARS'}->{'pagesize.widthunit'} /; - $result =~ s/\\textheight 25\.9cm/\\textheight $helper->{'VARS'}->{'pagesize.height'} $helper->{'VARS'}->{'pagesize.heightunit'} /; - $result =~ s/\\evensidemargin = -0\.57in/\\evensidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; - $result =~ s/\\oddsidemargin = -0\.57in/\\oddsidemargin= $helper->{'VARS'}->{'pagesize.lmargin'} $helper->{'VARS'}->{'pagesize.lmarginunit'} /; - } - if ($helper->{'VARS'}->{'TABLE_CONTENTS'} eq 'yes') {$selectionmade*=10;} - if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { - if ($selectionmade<10) {$selectionmade*=100;} else {$selectionmade*=10;} + $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'} /; } - if ($ENV{'request.role.adv'}) {$selectionmade*=10000;} #-- writing .tex file in prtspool my $temp_file; my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout_".time."_".rand(10000000).".tex"; unless ($temp_file = Apache::File->new('>'.$filename)) { $r->log_error("Couldn't open $filename for output $!"); return SERVER_ERROR; - } + } print $temp_file $result; + my $begin=index($result,'\begin{document}',0); + my $inc=substr($result,0,$begin+16); + my $newfilename=$filename; + if ($#print_array>0) { + for (my $i=1;$i<=$#print_array;$i++) { + my $anobegin=index($print_array[$i],'\setcounter{page}',0); + substr($print_array[$i],0,$anobegin)=''; + $print_array[$i]=$inc.$print_array[$i].'\end{document}'; + my $temp_file; + $newfilename =~s/\.tex$/_add$i\.tex/; + unless ($temp_file = Apache::File->new('>'.$newfilename)) { + $r->log_error("Couldn't open $newfilename for output $!"); + return SERVER_ERROR; + } + print $temp_file $print_array[$i]; + } + + } + + my $identifier = time.'_'.int(rand(1000)); + &Apache::lonnet::appenv('cgi.'.$identifier.'.file' => $filename, + 'cgi.'.$identifier.'.layout' => $laystyle, + 'cgi.'.$identifier.'.numcol' => $numberofcolumns, + 'cgi.'.$identifier.'.selection' => $selectionmade, + 'cgi.'.$identifier.'tableofcontents' => $helper->{'VARS'}->{'TABLE_CONTENTS'}, + 'cgi.'.$identifier.'tableofindex' => $helper->{'VARS'}->{'TABLE_INDEX'}, + 'cgi.'.$identifier.'role' => $ENV{'request.role.adv'}, + 'cgi.'.$identifier.'numberoffiles' => $#print_array); + $r->print(< + FINALEND @@ -1108,6 +1184,9 @@ sub handler { # foreach $key (keys %{$helper->{'VARS'}}) { # $r->print(' '.$key.'->'.$helper->{'VARS'}->{$key}.'<-
'); # } +# foreach $key (keys %ENV) { +# $r->print(' '.$key.'->'.$ENV{$key}.'<-
'); +# } # return OK; my %parmhash=&Apache::lonnet::coursedescription($ENV{'request.course.id'}); @@ -1173,6 +1252,7 @@ sub printHelper { $helper->declareVar('filename'); $helper->declareVar('construction'); $helper->declareVar('assignment'); + $helper->declareVar('style_file'); # This will persistently load in the data we want from the # very first screen. @@ -1321,7 +1401,6 @@ HELPERFRAGMENT if ($helper->{VARS}->{'assignment'}) { push @{$printChoices}, ["Problems from $sequenceTitle for selected students", 'problems_for_students', 'CHOOSE_STUDENTS']; } - &Apache::lonxml::xmlparse($r, 'helper', < (mark them then click "next" button)
@@ -1352,10 +1431,16 @@ HELPERFRAGMENT CHOOSE_STUDENTS + addMessage("
Number of assignments printed at the same time: "); + $paramHash = Apache::lonhelper::getParamHash(); + $paramHash->{'variable'} = 'NUMBER_TO_PRINT'; + $helper->declareVar('NUMBER_TO_PRINT'); + addMessage("
"); + if ($helper->{VARS}->{'assignment'}) { push @{$printChoices}, ["Resources from $sequenceTitle for selected students", 'resources_for_students', 'CHOOSE_STUDENTS1']; } - &Apache::lonxml::xmlparse($r, 'helper', <
Select resources for the assignment
@@ -1374,6 +1459,11 @@ CHOOSE_STUDENTS CHOOSE_STUDENTS1 + addMessage("
Number of assignments printed at the same time: "); + $paramHash = Apache::lonhelper::getParamHash(); + $paramHash->{'variable'} = 'NUMBER_TO_PRINT'; + $helper->declareVar('NUMBER_TO_PRINT'); + addMessage("
"); } # FIXME: That RE should come from a library somewhere. @@ -1503,31 +1593,27 @@ CHOOSE_FROM_ANY_SEQUENCE addMessage(""); } - if ($helper->{VARS}->{'construction'}) { - addMessage("Print With URL: "); - $paramHash = Apache::lonhelper::getParamHash(); - $paramHash->{'variable'} = 'CONSTR_RESOURSE_URL'; - $helper->declareVar('CONSTR_RESOURSE_URL'); - $paramHash->{CHOICES} = [ - ['No', 'no'], - ['Yes', 'yes'] ]; - Apache::lonhelper::dropdown->new(); - addMessage(""); - } if ($helper->{'VARS'}->{'construction'}) { - my $xmlfrag .= <<'RNDSEED'; + my $stylevalue=$ENV{'construct.style'}; + my $xmlfrag .= <<"RNDSEED"; Use random seed: return $helper->{VARS}->{'curseed'}; - + + Use style file: +   Select style file RNDSEED &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); + $helper->{'VARS'}->{'style_file'}=$ENV{'form.style_file_value'}; } } + + + if ($startedTable) { addMessage(""); } @@ -1590,6 +1676,7 @@ use Apache::lonhelper; no strict; @ISA = ("Apache::lonhelper::element"); use strict; +use Apache::lonlocal; my $maxColumns = 2; my @paperSize = ("Letter [8 1/2x11 in]", "Legal [8 1/2x14 in]", @@ -1617,15 +1704,17 @@ sub render { my $helper = Apache::lonhelper::getHelper(); my $result = ''; my $var = $self->{'variable'}; - + my $PageLayout=&mt('Page layout'); + my $NumberOfColumns=&mt('Number of columns'); + my $PaperType=&mt('Paper type'); $result .= < - - - + + +
Page layoutNumber of columnsPaper type$PageLayout$NumberOfColumns$PaperType