--- loncom/interface/lonprintout.pm 2009/11/30 11:03:07 1.566 +++ loncom/interface/lonprintout.pm 2010/03/30 10:48:42 1.573 @@ -2,7 +2,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.566 2009/11/30 11:03:07 foxr Exp $ +# $Id: lonprintout.pm,v 1.573 2010/03/30 10:48:42 foxr Exp $ # # Copyright Michigan State University Board of Trustees # @@ -1309,7 +1309,7 @@ sub page_format_transformation { $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{}\\usepackage{booktabs}\\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}/; + $text =~ s/(\\begin{document})/$1\\\\special\{papersize=210mm,297mm\}/; } } if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;} @@ -1757,7 +1757,7 @@ sub recently_generated { # # # use Data::Dumper; -#sub dump_helper_vars { +# sub dump_helper_vars { # my ($helper) = @_; # my $helpervars = Dumper($helper->{'VARS'}); # &Apache::lonnet::logthis("Dump of helper vars:\n $helpervars"); @@ -1772,6 +1772,122 @@ sub get_page_breaks { } return %page_breaks; } +# +# Returns text to insert for any extra vskip prior to the resource. +# Parameters: +# helper - Reference to the helper object driving the printout. +# resource - Identifies the resource about to be printed. +# +# This is done as follows: +# POSSIBLE_RESOURCES has the list of possible resources. +# EXTRASPACE has the list of extra space values. +# EXTRASPACE_UNITS is the set of resources for which the units are +# mm. All others are 'in'. +# +# The resource is found in the POSSIBLE_RESOURCES to get the index +# of the EXTRASPACE value. +# +# In order to speed this up for lengthy printouts, the first time, +# POSSIBLE_RESOURCES is turned into a look up hash and +# EXTRASPACE is turned into an array. +# + + +my %possible_resources; +my %extraspace_mm; +my @extraspace; +my $skips_loaded = 0; + +# Function to load the skips hash and array + +sub load_skips { + + my ($helper) = @_; + + # If this is the first time, unrap the resources and extra spaces: + + if (!$skips_loaded) { + @extraspace = (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE'})); + my @resource_list = (split(/\|\|\|/, $helper->{'VARS'}->{'POSSIBLE_RESOURCES'})); + my $i = 0; + foreach my $resource (@resource_list) { + $possible_resources{$resource} = $i; + $i++; + } + foreach my $mm_resource (split(/\|\|\|/, $helper->{'VARS'}->{'EXTRASPACE_UNITS'})) { + $extraspace_mm{$mm_resource} = 1; + } + $skips_loaded = 1; + } +} + +sub get_extra_vspaces { + my ($helper, $resource) = @_; + + &load_skips($helper); + + # Lookup the resource in the possible resources hash.. that is the index + # into the extraspace array that gives us either an empty string or + # the number of mm to skip: + + my $index = $possible_resources{$resource}; + my $skip = $extraspace[$index]; + + my $result = ''; + if ($skip ne '') { + my $units = 'in'; + if (defined($extraspace_mm{$resource})) { + $units = 'mm'; + } + $result = '\vskip '.$skip.' '.$units; + } + + + return $result; + + +} + +# +# The resource chooser part of the helper needs more than just +# the value of the extraspaces var to recover the value into a text +# field option. This sub produces the required format for the saved var: +# specifically +# ||| separated fields of the form resourcename=value +# +# Parameters: +# $helper - Refers to the helper we are configuring +# Implicit input: +# $helper->{'VARS'}->{'EXTRASPACE'} - the spaces helper var has the text field +# value. +# $helper->{'VARS'}->{'EXTRASPACE_UNITS'} - units for the skips (checkboxes). +# $helper->{'VARS'}->{'POSSIBLE_RESOURCES'} - has the list of resources. ||| +# separated of course. +# Implicit outputs: +# $env{'form.extraspace'} +# $env{'form.extraspace_units'} +# +sub set_form_extraspace { + my ($helper) = @_; + + # the most convenient way to do this is to drive from the skips arrays/hash. + # may not be the fastest, but this is once per print request so it's not so + # speed critical: + + &load_skips($helper); + + my $result = ''; + + foreach my $resource (keys(%possible_resources)) { + my $vskip = $extraspace[$possible_resources{$resource}]; + $result .= $resource .'=' . $vskip . '|||'; + } + + $env{'form.extraspace'} = $result; + $env{'form.extraspace_units'} = $helper->{'VARS'}->{'EXTRASPACE_UNITS'}; + return $result; + +} # Output a sequence (recursively if neeed) # from construction space. @@ -1943,11 +2059,13 @@ ENDPART # indexed by symb and contains 1's for each break. $env{'form.pagebreaks'} = $helper->{'VARS'}->{'FINISHPAGE'}; + &set_form_extraspace($helper); $env{'form.lastprinttype'} = $helper->{'VARS'}->{'PRINT_TYPE'}; &Apache::loncommon::store_course_settings('print', {'pagebreaks' => 'scalar', + 'extraspace' => 'scalar', + 'extraspace_units' => 'scalar', 'lastprinttype' => 'scalar'}); - my %page_breaks = &get_page_breaks($helper); my $format_from_helper = $helper->{'VARS'}->{'FORMAT'}; @@ -2119,8 +2237,7 @@ ENDPART $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; if ($currentURL=~/\/syllabus$/) {$currentURL=~s/\/res//;} $resources_printed .= $currentURL.':'; - my $texversion = &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); - $texversion .= &ssi_with_retries($currentURL, $ssi_retry_count, %form); + my $texversion = &ssi_with_retries($currentURL, $ssi_retry_count, %form); if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { my $annotation = &annotate($currentURL); $texversion =~ s/(\\end{document})/$annotation$1/; @@ -2153,7 +2270,6 @@ ENDPART } else { - &Apache::lonnet::logthis("Unsupported type handler"); $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}, $helper->{'VARS'}->{'symb'}); } @@ -2213,6 +2329,7 @@ ENDPART $result.="\\newpage\n"; } } + $result .= &get_extra_vspaces($helper, $master_seq[$i]); my ($sequence,$middle_thingy,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]); $urlp=&Apache::lonnet::clutter($urlp); $form{'symb'}=$master_seq[$i]; @@ -2303,8 +2420,7 @@ ENDPART $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; if ($urlp=~/\/syllabus$/) {$urlp=~s/\/res//;} $resources_printed .= $urlp.':'; - my $texversion = &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); - $texversion .= &ssi_with_retries($urlp, $ssi_retry_count, %form); + my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { my $annotation = &annotate($urlp); $texversion =~ s/(\\end{document)/$annotation$1/; @@ -2808,13 +2924,14 @@ sub print_resources { # so we will just rely on prntout.pl to strip ENDOFSTUDENTSTAMP from the # postscript. Each ENDOFSTUDENTSTAMP will go on a line by itself. # - + my $syllabus_first = 0; foreach my $curresline (@{$master_seq}) { if (defined $page_breaks{$curresline}) { if($i != 0) { $current_output.= "\\newpage\n"; } } + $current_output .= &get_extra_vspaces($helper, $curresline); $i++; if ( !($type eq 'problems' && @@ -2867,6 +2984,9 @@ sub print_resources { } $current_output .= $rendered; } elsif ($res_url=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { + if ($i == 1) { + $syllabus_first = 1; + } $printed .= $curresline.':'; my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv); if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { @@ -2911,8 +3031,11 @@ sub print_resources { my $header_start = ($columns_in_format == 1) ? '\lhead' : '\fancyhead[LO]'; $header_line = $header_start.'{'.$header_line.'}'; - if ($current_output=~/\\documentclass/) { + if ($current_output=~/\\documentclass/ && (!$syllabus_first)) { $current_output =~ s/\\begin{document}/\\setlength{\\topmargin}{1cm} \\begin{document}\\noindent\\parbox{\\minipagewidth}{\\noindent$header_line$namepostfix}\\vskip 5 mm /; + } elsif ($syllabus_first) { + + $current_output =~ s/\\\\ Last updated:/Last updated:/ } else { my $blankpages = '\clearpage\strut\clearpage'x$helper->{'VARS'}->{'EMPTY_PAGES'}; @@ -3056,19 +3179,21 @@ sub printHelper { $helper->declareVar('PRINT_TYPE'); $helper->declareVar("showallfoils"); $helper->declareVar("STUDENTS"); - + $helper->declareVar("EXTRASPACE"); - # The page breaks can get loaded initially from the course environment: + # The page breaks and extra spaces + # can get loaded initially from the course environment: # But we only do this in the initial state so that they are allowed to change. # - # $helper->{VARS}->{FINISHPAGE} = ''; &Apache::loncommon::restore_course_settings('print', {'pagebreaks' => 'scalar', + 'extraspace' => 'scalar', + 'extraspace_units' => 'scalar', 'lastprinttype' => 'scalar'}); # This will persistently load in the data we want from the @@ -3078,10 +3203,15 @@ sub printHelper { if (!defined ($env{"form.CURRENT_STATE"})) { $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; + $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'}; + $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'}; } else { my $state = $env{"form.CURRENT_STATE"}; if ($state eq "START") { $helper->{VARS}->{FINISHPAGE} = $env{'form.pagebreaks'}; + $helper->{VARS}->{EXTRASPACE} = $env{'form.extraspace'}; + $helper->{VARS}->{EXTRASPACE_UNITS} = $env{'form.extraspace_units'}; + } } @@ -3200,7 +3330,16 @@ sub printHelper { if ($perm{'pav'}) { $start_new_option = "