--- loncom/interface/lonprintout.pm 2008/10/02 17:12:18 1.543
+++ loncom/interface/lonprintout.pm 2009/07/14 09:30:20 1.557.2.1
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Printout
#
-# $Id: lonprintout.pm,v 1.543 2008/10/02 17:12:18 raeburn Exp $
+# $Id: lonprintout.pm,v 1.557.2.1 2009/07/14 09:30:20 foxr Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -40,6 +40,9 @@ use Apache::lonnavmaps;
use Apache::admannotations;
use Apache::lonenc;
use Apache::entities;
+use Apache::londefdef;
+
+use File::Basename;
use HTTP::Response;
@@ -67,6 +70,10 @@ my $ssi_last_error; # The error text fr
my $ssi_retry_count = 5; # Some arbitrary value.
+# Font size:
+
+my $font_size = 'normalsize'; # Default is normalsize...
+
# Fetch the contents of a resource, uninterpreted.
# This is used here to fetch a latex file to be included
@@ -111,6 +118,83 @@ sub annotate {
return $result;
}
+#
+# Set a global document font size:
+# This is done by replacing \begin{document}
+# with \begin{document}{\some-font-directive
+# and \end{document} with
+# }\end{document
+#
+sub set_font_size {
+
+ my ($text) = @_;
+
+ $text =~ s/\\begin{document}/\\begin{document}{\\$font_size/;
+ $text =~ s/\\end{document}/}\\end{document}/;
+ return $text;
+
+
+}
+
+# include_pdf - PDF files are included into the
+# output as follows:
+# - The PDF, if necessary, is replicated.
+# - The PDF is added to the list of files to convert to postscript (along with the images).
+# - The LaTeX is added to include the final converted postscript in the file as an included
+# job. The assumption is that the includedpsheader.ps header will be included.
+#
+# Parameters:
+# pdf_uri - URI of the PDF file to include.
+#
+# Returns:
+# The LaTeX to include.
+#
+# Assumptions:
+# The uri is actually a PDF file
+# The postscript will have the includepsheader.ps included.
+#
+#
+sub include_pdf {
+ my ($pdf_uri) = @_;
+
+ # Where is the file? If not local we'll need to repcopy it:'
+
+ my $file = &Apache::lonnet::filelocation('', $pdf_uri);
+ if (! -e $file) {
+ &Apache::lonnet::repcopy($file);
+ $file = &Apache::lonnet::filelocation('',$pdf_uri);
+ }
+
+ # The file isn ow replicated locally.. or it did not exist in the first place
+ # (unlikely). If it did exist, add the pdf to the set of files/images that
+ # need tob e converted for this print job:
+
+ $file =~ s|(.*)/res/|/home/httpd/html/res/|;
+
+ open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat");
+ print FILE ("$file\n");
+ close (FILE);
+
+ # Construct the special to put out. To do this we need to get the
+ # resulting filename after conversion. The file will have the same name
+ # but will be in the user's spool directory with converted images.
+
+ my $dirname = "/home/httpd/prtspool/$env{'user.name'}/";
+ my ( $base, $path, $ext) = &fileparse($file, '.pdf');
+# my $destname = $dirname.'/'.$base.'.eps'; # Not really an eps but easier in printout.pl
+ $base =~ s/ /\_/g;
+
+
+ my $output = &print_latex_header();
+ $output .= '\special{ps: _begin_job_ ('
+ .$base.'.pdf.eps'.
+ ')run _end_job_}';
+
+ return $output;
+
+
+}
+
#
# ssi_with_retries - Does the server side include of a resource.
@@ -859,6 +943,8 @@ sub old_character_chart {
$result =~ s/&(ldquo|#8220);/\`\`/g;
$result =~ s/&(rdquo|#8221);/\'\'/g;
+&Apache::lonnet::logthis("After pass through old character chart: '$result'");
+
return $result;
}
@@ -1021,12 +1107,12 @@ sub page_format_transformation {
$fancypagestatement="\\rhead{}\\chead{}\\lhead{$header_text}";
}
if ($layout eq 'album') {
- $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 /;
+ $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\\usepackage{booktabs}\\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 $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/;
+ $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\\usepackage{booktabs}\\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\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 /;
+ $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}/;
@@ -1149,41 +1235,8 @@ sub IndexCreation {
sub print_latex_header {
my $mode=shift;
- my $output='\documentclass[letterpaper,twoside]{article}\raggedbottom';
- if (($mode eq 'batchmode') || (!$perm{'pav'})) {
- $output.='\batchmode';
- }
- $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'."\n".
- '\usepackage{multirow}'."\n".
- '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'."\n".
- '\usepackage[dvips]{graphicx}\usepackage{epsfig}'."\n".
- '\usepackage{wrapfig}'.
- '\usepackage{picins}\usepackage{calc}'."\n".
- '\usepackage[T1]{fontenc}'."\n".
- '\usepackage{lmodern}'."\n".
- '\usepackage[postscript]{ucs}'."\n".
- '\usepackage[utf8x]{inputenc}'."\n".
- '\usepackage{pifont}' . "\n".
- '\usepackage{latexsym}'."\n".
- '\usepackage{amsmath}'.
- '\usepackage{amssymb}'.
- '\usepackage{amsfonts}'.
- '\usepackage{amsthm}'.
- '\usepackage{amscd}'.
- '\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;
+
+ return &Apache::londefdef::latex_header($mode);
}
sub path_to_problem {
@@ -1255,6 +1308,46 @@ sub unsupported {
}
+sub print_page_in_course {
+ my ($helper, $currentURL, $resources) = @_;
+ my @page_resources = @$resources;
+ my $mode = $helper->{'VARS'}->{'LATEX_TYPE'};
+ my $symb = $helper->{'VARS'}->{'symb'};
+
+ if ($mode ne '') {$mode='\\'.$mode}
+ my $result.= &print_latex_header($mode);
+ if ($currentURL=~m|^(/adm/wrapper/)?ext/|) {
+ $currentURL=~s|^(/adm/wrapper/)?ext/|http://|;
+ my $title=&Apache::lonnet::gettitle($symb);
+ $title = &Apache::lonxml::latex_special_symbols($title);
+ $result.=' \strut \\\\ '.$title.' \strut \\\\ '.$currentURL.' ';
+ } else {
+ $result.=$currentURL;
+ }
+
+ # First is theo verall page description. This is then followed by the
+ # components of the page. Each of which must be printed independently.
+
+ my $the_page = shift(@page_resources);
+ $result .= "URL: $currentURL " .'\\\\';
+
+ foreach my $resource (@page_resources) {
+ my $resource_src = $resource->src();
+ my $resource_symb = $resource->symb();
+ $resource_symb = &Apache::lonnet::clutter($resource_symb);
+ my $resource_kind = $resource->kind();
+ my $resource_title = $resource->title();
+
+ $result .= &Apache::lonxml::latex_special_symbols("Src: $resource_src symb: $resource_symb ");
+ $result .= &Apache::lonxml::latex_special_symbols("Kind: $resource_kind Title: $resource_title");
+ $result .= '\\\\';
+ }
+
+ $result.= '\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill} \end{document}';
+ return $result;
+}
+
+
#
# List of recently generated print files
#
@@ -1281,20 +1374,43 @@ sub recently_generated {
$cuid,$cgid,$crdev,$csize,
$catime,$cmtime,$cctime,
$cblksize,$cblocks)=stat($prtspool.'/'.$filename);
- my $result="".
- &mt('Generated [_1] ([_2] bytes)',
- &Apache::lonlocal::locallocaltime($cctime),$csize).
- '
';
+ my $ext_text = 'pdf' ? &mt('PDF File'):&mt('Zip File');
+ my $result=&Apache::loncommon::start_data_table_row()
+ .'
'.
+ $r->print('
'.&mt('An unrecoverable network error occurred:').'
'.
&mt('At least one of the resources you chose to print could not be rendered due to an unrecoverable error when communicating with a server:').
'
'.$ssi_last_error_resource.'
'.$ssi_last_error.
'
'.&mt('You can continue using the link provided below, but make sure to carefully inspect your output file! The errors will be marked in the file.').'
'.
@@ -2300,7 +2478,7 @@ sub print_resources {
if ($res_url!~m|^ext/|
&& $res_url=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
$printed .= $curresline.':';
-
+ &Apache::lonnet::logthis("At line 2427 printing $curresline");
&Apache::lonxml::remember_problem_counter();
my $rendered = &get_student_view_with_retries($curresline,$ssi_retry_count,$username,$userdomain,$env{'request.course.id'},'tex',$moreenv);
@@ -2322,6 +2500,7 @@ sub print_resources {
my $header =&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
+ $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 ';
@@ -2357,7 +2536,13 @@ sub print_resources {
$rendered =~ s/\\end{document}//;
}
$current_output .= $rendered.'\vskip 0.5mm\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\strut \vskip 0 mm \strut ';
-
+ } elsif($res_url = ~/\.pdf$/) {
+ my $url = &Apache::lonnet::clutter($res_url);
+ my $rendered = &include_pdf($url);
+ if ($remove_latex_header ne 'NO') {
+ $rendered = &latex_header_footer_remove($rendered);
+ }
+ $current_output .= $rendered;
} else {
my $rendered = &unsupported($res_url,$helper->{'VARS'}->{'LATEX_TYPE'},$curresline);
if ($remove_latex_header ne 'NO') {
@@ -2369,9 +2554,11 @@ sub print_resources {
}
}
$remove_latex_header = 'YES';
- }
+ }
if (&Apache::loncommon::connection_aborted($r)) { last; }
}
+
+
my $courseidinfo = &get_course();
my $currentassignment=&Apache::lonxml::latex_special_symbols($helper->{VARS}->{'assignment'},'header');
my $header_line =
@@ -2380,7 +2567,6 @@ sub print_resources {
my $header_start = ($columns_in_format == 1) ? '\lhead'
: '\fancyhead[LO]';
$header_line = $header_start.'{'.$header_line.'}';
-
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 {
@@ -2464,17 +2650,22 @@ sub get_randomly_ordered_warning {
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 '
");
+ &addMessage(&Apache::lonhtmlcommon::end_pick_box());
}
Apache::lonprintout::page_format_state->new("FORMAT");
@@ -3397,31 +3642,31 @@ sub render {
my $pdfFormLabel=&mt('PDF-Formfields');
my $with=&mt('with Formfields');
my $without=&mt('without Formfields');
- $result .= < ");
+ &addMessage(&Apache::lonhtmlcommon::row_closure());
$startedTable = 1;
+
+#
+# Select font size.
+#
+
+ $helper->declareVar('fontsize');
+ &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Font Size')));
+ my $xmlfrag = << "FONT_SELECTION";
+
+
+ ".
- ': ");
+ &addMessage('
'
+ .''.&mt('Print Options').'
'
+ .&Apache::lonhtmlcommon::start_pick_box()
+ .&Apache::lonhtmlcommon::row_title(
+ ''
+ )
+ );
$paramHash = Apache::lonhelper::getParamHash();
$paramHash->{'variable'} = 'ANSWER_TYPE';
$helper->declareVar('ANSWER_TYPE');
@@ -3141,8 +3334,36 @@ CHOOSE_FROM_ANY_SEQUENCE
['Only Answers', 'only']
];
Apache::lonhelper::dropdown->new();
- addMessage("");
$startedTable = 1;
} else {
- addMessage(" ".
- ': ");
+ &addMessage(&Apache::lonhtmlcommon::row_title(
+ ''
+ )
+ );
}
$paramHash = Apache::lonhelper::getParamHash();
$paramHash->{'variable'} = 'LATEX_TYPE';
@@ -3172,10 +3395,13 @@ CHOOSE_FROM_ANY_SEQUENCE
}
Apache::lonhelper::dropdown->new();
- addMessage(" ");
+ &addMessage(&Apache::lonhtmlcommon::row_closure());
if (not $helper->{VARS}->{'construction'}) {
- addMessage("".
- ': ");
+ &addMessage(&Apache::lonhtmlcommon::row_closure()
+ .&Apache::lonhtmlcommon::row_title(
+ ''
+ )
+ );
$paramHash = Apache::lonhelper::getParamHash();
$paramHash->{'variable'} = 'TABLE_CONTENTS';
$helper->declareVar('TABLE_CONTENTS');
@@ -3183,13 +3409,15 @@ CHOOSE_FROM_ANY_SEQUENCE
['No', 'no'],
['Yes', 'yes'] ];
Apache::lonhelper::dropdown->new();
- addMessage(" ");
- addMessage("".
- ': ");
+ &addMessage(&Apache::lonhtmlcommon::row_title(
+ ''
+ )
+ );
$paramHash = Apache::lonhelper::getParamHash();
$paramHash->{'variable'} = 'TABLE_INDEX';
$helper->declareVar('TABLE_INDEX');
@@ -3197,11 +3425,13 @@ CHOOSE_FROM_ANY_SEQUENCE
['No', 'no'],
['Yes', 'yes'] ];
Apache::lonhelper::dropdown->new();
- addMessage(" ");
+ &addMessage(&Apache::lonhtmlcommon::row_closure());
# Prompt for printing annotations too.
- addMessage("".
- ': ");
+ &addMessage(&Apache::lonhtmlcommon::row_closure());
+ &addMessage(&Apache::lonhtmlcommon::row_title(
+ ''
+ )
+ );
$paramHash = Apache::lonhelper::getParamHash();
$paramHash->{'variable'} = 'PRINT_DISCUSSIONS';
$helper->declareVar('PRINT_DISCUSSIONS');
@@ -3209,14 +3439,16 @@ CHOOSE_FROM_ANY_SEQUENCE
['No', 'no'],
['Yes', 'yes'] ];
Apache::lonhelper::dropdown->new();
- addMessage(" ");
+ &addMessage(&Apache::lonhtmlcommon::row_closure());
- addMessage("".
- ': ");
+ &addMessage(&Apache::lonhtmlcommon::row_title(
+ ''
+ )
+ );
$paramHash = Apache::lonhelper::getParamHash();
$paramHash->{'variable'} = "PRINT_ANNOTATIONS";
$helper->declareVar("PRINT_ANNOTATIONS");
@@ -3224,16 +3456,16 @@ CHOOSE_FROM_ANY_SEQUENCE
['No', 'no'],
['Yes', 'yes']];
Apache::lonhelper::dropdown->new();
- addMessage(" ");
+ &addMessage(&Apache::lonhtmlcommon::row_closure(1));
}
if ($helper->{'VARS'}->{'construction'}) {
@@ -3242,32 +3474,44 @@ CHOOSE_FROM_ANY_SEQUENCE
my $stylefiletext=&mt("Use style file");
my $selectfiletext=&mt("Select style file");
- my $xmlfrag .= <<"RNDSEED";
- ");
+ &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Foils')));
$paramHash = Apache::lonhelper::getParamHash();
$paramHash->{'multichoice'} = "true";
$paramHash->{'allowempty'} = "true";
$paramHash->{'variable'} = "showallfoils";
- $paramHash->{'CHOICES'} = [ ["Show all foils", "1"] ];
+ $paramHash->{'CHOICES'} = [ [&mt('Show All Foils'), "1"] ];
Apache::lonhelper::choices->new();
- addMessage("
- :
-
-
- :
-
+ my $xmlfrag .= '
+ ");
+ &addMessage(&Apache::lonhtmlcommon::row_closure(1));
- }
+
+
+ }
}
if ($startedTable) {
- addMessage("Problem Type: ");
+ &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Problem Type')));
#
# Initial value from construction space:
#
@@ -3285,17 +3529,18 @@ RNDSEED
PROBTYPE
&Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
-
- addMessage("
-
HTML
+ $result.=&Apache::loncommon::end_data_table_row()
+ .&Apache::loncommon::end_data_table();
return $result;
}
@@ -3577,50 +3823,36 @@ sub render {
} 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 .= <
-
- $PageLayout
- $NumberOfColumns
- $PaperType
- $pdfFormLabel
-
-
-
-
-
-
-
$text{'width'} | -- |
- |
-
$text{'height'} | -- |
- |
-
$text{'margin'} | -- |
- |
-
'.$lt{'format'}.'
' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'width'}) + .'' + .'Hint: Some instructors like to leave scratch space for the student by + # making the width much smaller than the width of the page.
return $result; }