--- loncom/interface/lonprintout.pm 2010/11/13 01:57:14 1.568.2.10
+++ loncom/interface/lonprintout.pm 2010/02/28 22:38:45 1.572
@@ -2,7 +2,7 @@
# The LearningOnline Network
# Printout
#
-# $Id: lonprintout.pm,v 1.568.2.10 2010/11/13 01:57:14 raeburn Exp $
+# $Id: lonprintout.pm,v 1.572 2010/02/28 22:38:45 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -306,16 +306,11 @@ sub set_font_size {
my ($text) = @_;
- # There appear to be cases where the font directive is empty.. in which
- # case the first substituion would insert a spurious \ oh happy day.
- # as this has been the cause of much mystery and hair pulling _sigh_
-
- if ($font_size ne '') {
-
- $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/;
- }
+ $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/;
$text =~ s/\\end{document}/}\\end{document}/;
return $text;
+
+
}
# include_pdf - PDF files are included into the
@@ -499,12 +494,15 @@ sub printf_style_subst {
# %a - Assignment name.
# %c - Course name.
# %n - Student name.
+# %s - The section if it is supplied.
#
sub format_page_header {
- my ($width, $format, $assignment, $course, $student) = @_;
+ my ($width, $format, $assignment, $course, $student, $section) = @_;
+
+
$width = &recalcto_mm($width); # Get width in mm.
- my $chars_per_line = int($width/2); # Character/textline.
+ my $chars_per_line = int($width/1.6); # Character/textline.
# Default format?
@@ -520,36 +518,58 @@ sub format_page_header {
# - Allow the assignment to be 2 lines (wrapped).
#
- 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}";
+ my $name_length = int($chars_per_line *3 /4);
+ my $sec_length = int($chars_per_line / 5);
+
+ $format = "%$name_length".'n';
+
+ if ($section) {
+ $format .= ' - Sec: '."%$sec_length".'s';
+ }
+
+ $format .= '\\\\%c \\\\ %a';
+
- } else {
- # An open question is how to handle long user formatted page headers...
- # A possible future is to support e.g. %na so that the user can control
- # 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!!!
}
+ # An open question is how to handle long user formatted page headers...
+ # A possible future is to support e.g. %na so that the user can control
+ # 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);
+ $format = &printf_style_subst("s", $format, $section);
+
+
+ # 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!!!
+ # If the user has role author, $course and $assignment are empty so
+ # there is '\\ \\ ' in the page header. That's cause a error in LaTeX
+ if($format =~ /\\\\\s\\\\\s/) {
+ #TODO find sensible caption for page header
+ my $testPrintout = '\\\\'.&mt('Construction Space').' \\\\'.&mt('Test-Printout ');
+ $format =~ s/\\\\\s\\\\\s/$testPrintout/;
+ }
+ #
+ # We're going to trust LaTeX to break lines appropriately, but
+ # we'll truncate anything that's more than 3 lines worth of
+ # text. This is also assuming (which will probably end badly)
+ # nobody's going to embed LaTeX control sequences in the title
+ # header or rather that those control sequences won't get broken
+ # by the stuff below.
+ #
+ my $total_length = 3*$chars_per_line;
+ if (length($format) > $total_length) {
+ $format = substr($format, 0, $total_length);
+ }
+
+
return $format;
+
}
#
@@ -1245,6 +1265,8 @@ sub get_course {
my $courseidinfo;
if (defined($env{'request.course.id'})) {
$courseidinfo = &Apache::lonxml::latex_special_symbols(&unescape($env{'course.'.$env{'request.course.id'}.'.description'}),'header');
+ my $sec = $env{'request.course.sec'};
+
}
return $courseidinfo;
}
@@ -1267,7 +1289,6 @@ sub page_format_transformation {
my $name = &get_name();
my $courseidinfo = &get_course();
- if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
my $header_text = $parmhash{'print_header_format'};
$header_text = &format_page_header($textwidth, $header_text, $assignment,
$courseidinfo, $name);
@@ -1288,13 +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') {
- my $papersize_text;
- if ($perm{'pav'}) {
- $papersize_text = '\\special{papersize=210mm,297mm}';
- } else {
- $papersize_text = '\special{papersize=210mm,297mm}';
- }
- $text =~ s/(\\begin{document})/$1$papersize_text/;
+ $text =~ s/(\\begin{document})/$1\\special{papersize=210mm,297mm}/;
}
}
if ($tableofcontents eq 'yes') {$text=~s/(\\setcounter\{page\}\{1\})/$1 \\tableofcontents\\newpage /;}
@@ -1525,9 +1540,7 @@ sub print_page_in_course {
my $title=&Apache::lonnet::gettitle($symb);
$title = &Apache::lonxml::latex_special_symbols($title);
} else {
- my $esc_currentURL= $currentURL;
- $esc_currentURL =~ s/_/\\_/g;
- $result.=$esc_currentURL;
+ $result.=$currentURL;
}
$result .= '\\\\';
@@ -1557,7 +1570,7 @@ sub print_page_in_course {
}
# these resources go through the XML transformer:
- elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
+ elsif ($resource_src =~ /\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm\xhtml|xhtm)$/) {
my $urlp = &Apache::lonnet::clutter($resource_src);
my %form;
my %moreenv;
@@ -1568,7 +1581,7 @@ sub print_page_in_course {
$form{'grade_target'} = 'tex';
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth);
- $form{'pdfFormFields'} = 'no';
+ $form{'pdfFormFiels'} = $pdfFormFields; #
$form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'};
$form{'problem_split'}=$parmhash{'problem_stream_switch'};
@@ -1672,9 +1685,8 @@ sub print_page_in_course {
# List of recently generated print files
#
sub recently_generated {
- my ($prtspool) = @_;
- my $output;
-
+ my $r=shift;
+ my $prtspool=$r->dir_config('lonPrtDir');
my $zip_result;
my $pdf_result;
opendir(DIR,$prtspool);
@@ -1707,10 +1719,10 @@ sub recently_generated {
if ($ext eq 'zip') { $zip_result .= $result; }
}
if ($zip_result || $pdf_result) {
- $output = '
';
+ $r->print('');
}
if ($zip_result) {
- $output .='
'
@@ -1729,9 +1742,9 @@ sub recently_generated {
.'
'.&mt('File Size (Bytes)').'
'
.&Apache::loncommon::end_data_table_header_row()
.$pdf_result
- .&Apache::loncommon::end_data_table();
+ .&Apache::loncommon::end_data_table()
+ );
}
- return $output;
}
#
@@ -1744,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");
@@ -1759,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.
@@ -1930,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'};
@@ -1959,7 +2090,7 @@ ENDPART
my %form;
$form{'grade_target'} = 'tex';
$form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth);
- $form{'pdfFormFields'} = 'no';
+ $form{'pdfFormFields'} = $pdfFormFields;
# If form.showallfoils is set, then request all foils be shown:
# privilege will be enforced both by not allowing the
@@ -2198,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];
@@ -2213,14 +2345,7 @@ ENDPART
&Apache::lonxml::remember_problem_counter();
if ($flag_latex_header_remove eq 'NO') {
$texversion.=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); # RF
- unless (($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') ||
- (($i==0) &&
- (($urlp=~/\.page$/) ||
- ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') ||
- ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')))) {
-
- $flag_latex_header_remove = 'YES';
- }
+ $flag_latex_header_remove = 'YES';
}
$texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form);
if ($urlp=~/\.page$/) {
@@ -2241,22 +2366,12 @@ ENDPART
&Apache::lonxml::restore_problem_counter();
my $answer=&ssi_with_retries($urlp, $ssi_retry_count, %answerform);
- if ($urlp =~ /\.page$/) {
- $answer =~ s/\\end{document}(\d*)$//;
- }
if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
- if ($urlp =~ /\.page$/) {
- my @probs = split(/\\keephidden{ENDOFPROBLEM}/,$texversion);
- my $lastprob = pop(@probs);
- $texversion = join('\keephidden{ENDOFPROBLEM}',@probs).
- $answer.'\keephidden{ENDOFPROBLEM}'.$lastprob;
- } else {
- $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
- }
+ $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
} else {
- if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page)$/) {
+ if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) {
$texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
-# $texversion =~ s/\\begin{document}//;
+ $texversion =~ s/\\begin{document}//;
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 ';
@@ -2286,7 +2401,6 @@ ENDPART
if (($selectionmade == 4) and ($assignment ne $prevassignment)) {
my $name = &get_name();
my $courseidinfo = &get_course();
- if (defined($courseidinfo)) { $courseidinfo=' - '.$courseidinfo }
$prevassignment=$assignment;
my $header_text = $parmhash{'print_header_format'};
$header_text = &format_page_header($textwidth, $header_text,
@@ -2323,11 +2437,7 @@ ENDPART
if ($i > 0) {
$result .= '\cleardoublepage';
}
- my $texfrompdf = &include_pdf($urlp);
- if ($flag_latex_header_remove ne 'NO') {
- $texfrompdf = &latex_header_footer_remove($texfrompdf);
- }
- $result .= $texfrompdf;
+ $result .= &include_pdf($urlp);
if ($i != $#master_seq) {
if ($numberofcolumns eq '1') {
$result .= '\newpage';
@@ -2821,10 +2931,11 @@ sub print_resources {
$current_output.= "\\newpage\n";
}
}
+ $current_output .= &get_extra_vspaces($helper, $curresline);
$i++;
if ( !($type eq 'problems' &&
- ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library|page)$/)) ) {
+ ($curresline!~ m/\.(problem|exam|quiz|assess|survey|form|library)$/)) ) {
my ($map,$id,$res_url) = &Apache::lonnet::decode_symb($curresline);
if (&Apache::lonnet::allowed('bre',$res_url)) {
if ($res_url!~m|^ext/|
@@ -2833,18 +2944,6 @@ sub print_resources {
&Apache::lonxml::remember_problem_counter();
my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
- if ($res_url =~ /\.page$/) {
- if ($remove_latex_header eq 'NO') {
- if (!($rendered =~ /\\begin\{document\}/)) {
- $rendered = &print_latex_header().$rendered;
- }
- }
- if ($remove_latex_header eq 'YES') {
- $rendered = &latex_header_footer_remove($rendered);
- } else {
- $rendered =~ s/\\end{document}\d*//;
- }
- }
if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
# Use a copy of the hash so we don't pervert it on future loop passes.
@@ -2862,9 +2961,7 @@ sub print_resources {
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
- unless ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only') {
- $header =~ s/\\begin{document}//; #<<<<<
- }
+ $header =~ s/\\begin{document}//; #<<<<<
my $title = &Apache::lonnet::gettitle($curresline);
$title = &Apache::lonxml::latex_special_symbols($title);
my $body ='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm ';
@@ -2925,21 +3022,20 @@ sub print_resources {
if (&Apache::loncommon::connection_aborted($r)) { last; }
}
- if ($syllabus_first) {
- $current_output =~ s/\\\\ Last updated:/Last updated:/
- }
+
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');
my $header_line =
&format_page_header($LaTeXwidth, $parmhash{'print_header_format'},
- $currentassignment, $courseidinfo, $fullname);
+ $currentassignment, $courseidinfo, $fullname, $usersection);
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'};
@@ -3083,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
@@ -3105,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'};
+
}
}
@@ -3227,7 +3330,16 @@ sub printHelper {
if ($perm{'pav'}) {
$start_new_option =
"before selected').
- "' variable='FINISHPAGE' />";
+ "' variable='FINISHPAGE' />".
+ "before selected').
+ "' variable='EXTRASPACE' type='text' />" .
+ "".
+ "check for mm').
+ "' variable='EXTRASPACE_UNITS' type='checkbox' />"
+ ;
+
+
}
# If not construction space user can print the components of a page:
@@ -3941,6 +4053,7 @@ FONT_SELECTION
Homework ProblemExam ProblemSurvey question
+ ,choice computer="anonsurvey"Anonymous survey question
PROBTYPE
&Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
@@ -3975,12 +4088,10 @@ PROBTYPE
return $helper;
}
- my $footer;
+ $r->print($helper->display());
if ($helper->{STATE} eq 'START') {
- my $prtspool=$r->dir_config('lonPrtDir');
- $footer = &recently_generated($prtspool);
+ &recently_generated($r);
}
- $r->print($helper->display($footer));
&Apache::lonhelper::unregisterHelperTags();
return OK;
@@ -4056,6 +4167,9 @@ sub render {
my $PaperType=&mt('Paper type');
my $landscape=&mt('Landscape');
my $portrait=&mt('Portrait');
+ my $pdfFormLabel=&mt('PDF-Formfields');
+ my $with=&mt('with Formfields');
+ my $without=&mt('without Formfields');
$result.='