--- loncom/interface/lonprintout.pm 2008/12/19 23:04:13 1.547
+++ 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.547 2008/12/19 23:04:13 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
#
@@ -1424,7 +1517,7 @@ sub print_construction_sequence {
$result.=$texversion;
} elsif ($urlp=~/\.(sequence|page)$/) {
-
+
# header:
$result.='\strut\newline\noindent Sequence/page '.$urlp.'\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent ';
@@ -1443,7 +1536,21 @@ sub print_construction_sequence {
$helper, %form,
$LaTeXwidth);
}
- }
+ }
+ elsif ($urlp =~ /\.pdf$/i) {
+ my $texversion;
+ if ($member != 0) {
+ $texversion .= '\cleardoublepage';
+ }
+
+ $texversion .= &include_pdf($urlp);
+ $texversion = &latex_header_footer_remove($texversion);
+ if ($member != $#order) {
+ $texversion .= '\\ \cleardoublepage';
+ }
+
+ $result .= $texversion;
+ }
}
if ($helper->{VARS}->{'construction'} eq '1') {$result=~s/(\\begin{document})/$1 \\fbox\{RANDOM SEED IS $rndseed\} /;}
return $result;
@@ -1454,6 +1561,7 @@ sub output_data {
my %parmhash = %$rparmhash;
$ssi_error = 0; # This will be set nonzero by failing ssi's.
$resources_printed = '';
+ $font_size = $helper->{'VARS'}->{'fontsize'};
my $do_postprocessing = 1;
my $js = < '.
+ $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:').
' '.&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.').''.&mt('An unrecoverable network error occurred:').'
'.$ssi_last_error_resource.'
'.$ssi_last_error.
'
'.
@@ -2323,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);
@@ -2345,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 ';
@@ -2380,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') {
@@ -2392,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 =
@@ -2403,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 {
@@ -2501,7 +2664,6 @@ sub get_randomly_ordered_warning {
return ''.&mt('Print Options').'
'
.&Apache::lonhtmlcommon::start_pick_box()
-# .&Apache::lonhtmlcommon::row_headline()
-# .''.&mt('Print Options').'
'
-# .&Apache::lonhtmlcommon::row_closure()
.&Apache::lonhtmlcommon::row_title(
'
$text{'width'} | -- | - - | -
$text{'height'} | -- | - - | -
$text{'margin'} | -- | - - | -
'.$lt{'format'}.'
' + .&Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title($lt{'width'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'height'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title($lt{'margin'}) + .'' + .'' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box(); + #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; }