--- loncom/interface/lonprintout.pm 2008/12/06 12:49:18 1.546 +++ loncom/interface/lonprintout.pm 2009/05/02 22:16:09 1.552 @@ -1,7 +1,7 @@ # The LearningOnline Network # Printout # -# $Id: lonprintout.pm,v 1.546 2008/12/06 12:49:18 bisitz Exp $ +# $Id: lonprintout.pm,v 1.552 2009/05/02 22:16:09 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; @@ -111,6 +114,65 @@ sub annotate { return $result; } +# 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. @@ -1021,12 +1083,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 +1211,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 { @@ -1443,7 +1472,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; @@ -1543,7 +1586,7 @@ ENDPART &Apache::lonnet::appenv({'construct.style' => $helper->{'VARS'}->{'style_file'}}); } elsif ($env{'construct.style'}) { - &Apache::lonnet::delenv('construct\\.style'); + &Apache::lonnet::delenv('construct.style'); } @@ -1634,6 +1677,7 @@ ENDPART + } # Print annotations. @@ -1659,7 +1703,7 @@ ENDPART && $currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') { #printing content of sequence from the construction space $currentURL=~s|\/~([^\/]+)\/|\/home\/$1\/public_html\/|; - $result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); +# $result .= &print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); $result .= &print_construction_sequence($currentURL, $helper, %form, $LaTeXwidth); $result .= '\end{document}'; @@ -1677,7 +1721,7 @@ ENDPART $texversion =~ s/(\\end{document})/$annotation$1/; } $result .= $texversion; - } elsif ($cleanURL =~/.tex$/) { + } elsif ($cleanURL =~/\.tex$/) { # For this sort of print of a single LaTeX file, # We can just print the LaTeX file as it is uninterpreted in any way: # @@ -1690,6 +1734,9 @@ ENDPART $do_postprocessing = 0; # Don't massage the result. + } elsif ($cleanURL =~ /\.pdf$/i) { + $result .= &include_pdf($cleanURL); + $result .= '\end{document}'; } else { $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}, $helper->{'VARS'}->{'symb'}); @@ -1783,6 +1830,7 @@ ENDPART } else { if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); + $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 '; @@ -1818,6 +1866,7 @@ ENDPART $assignment, $courseidinfo, $name); + if ($numberofcolumns eq '1') { $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm '; } else { @@ -1838,11 +1887,28 @@ ENDPART if ($flag_latex_header_remove ne 'NO') { $texversion = &latex_header_footer_remove($texversion); - } else { + } else { $texversion =~ s/\\end{document}/\\vskip 0\.5mm\\noindent\\makebox\[\\textwidth\/\$number_of_columns\]\[b\]\{\\hrulefill\}/; } $result .= $texversion; $flag_latex_header_remove = 'YES'; + } elsif ($urlp=~ /\.pdf$/i) { + if ($i > 0) { + $result .= '\cleardoublepage'; + } + $result .= &include_pdf($urlp); + if ($i != $#master_seq) { + if ($numberofcolumns eq '1') { + $result .= '\newpage'; + } else { + # the \\'s seem to be needed to let LaTeX know there's something + # on the page since LaTeX seems to not like to clear an empty page. + # + $result .= '\\ \cleardoublepage'; + } + } + $flag_latex_header_remove = 'YES'; + } else { $texversion=&unsupported($urlp,$helper->{'VARS'}->{'LATEX_TYPE'}, $master_seq[$i]); @@ -1854,7 +1920,9 @@ ENDPART $result .= $texversion; $flag_latex_header_remove = 'YES'; } - if (&Apache::loncommon::connection_aborted($r)) { last; } + if (&Apache::loncommon::connection_aborted($r)) { + last; + } } &Apache::lonxml::clear_problem_counter(); if ($flag_page_in_sequence eq 'YES') { @@ -1908,7 +1976,7 @@ ENDPART my @master_seq=split /\|\|\|/, $helper->{'VARS'}->{'RESOURCES'}; #loop over students - my $flag_latex_header_remove = 'NO'; + my $flag_latex_header_remove = 'NO'; my %moreenv; $moreenv{'instructor_comments'}='hide'; $moreenv{'textwidth'}=&get_textwidth($helper,$LaTeXwidth); @@ -2345,6 +2413,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 +2449,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 +2467,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 +2480,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 { @@ -2487,17 +2563,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 ''.$message.''; + if (defined($navmap)) { + 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 ''.$message.''; + } + } else { + $message = "Retrieval of information about ordering of resources failed."; + return ''.$message.''; } return; } @@ -2575,7 +2656,6 @@ sub printHelper { } - # Detect whether we're coming from construction space if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) { $helper->{VARS}->{'filename'} = "~$1/$2"; @@ -2692,7 +2772,6 @@ sub printHelper { } if (($helper->{'VARS'}->{'construction'} ne '1' ) && - $helper->{VARS}->{'postdata'} && $helper->{VARS}->{'assignment'}) { # Allow problems from sequence @@ -3630,50 +3709,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 .= <$text{'format'}

- - - - - - - - - - - - - - - - - -
$text{'width'} - -
$text{'height'} - -
$text{'margin'} - -
- - - -ELEMENTHTML + my %lt = &Apache::lonlocal::texthash( + 'format' => 'How should each column be formatted?', + 'width' => 'Width', + 'height' => 'Height', + 'margin' => 'Left Margin' + ); + + $result .= '

'.$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; }