--- loncom/interface/lonprintout.pm 2008/10/02 17:12:18 1.543 +++ loncom/interface/lonprintout.pm 2009/08/17 10:48:28 1.560.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.560.2.1 2009/08/17 10:48:28 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 @@ -97,7 +104,7 @@ sub fetch_raw_resource { sub annotate { my ($symb) = @_; - my $annotation_text = &Apache::admannotations::get_annotation($symb, 1); + my $annotation_text = &Apache::loncommon::get_annotation($symb, 1); my $result = ""; @@ -111,9 +118,86 @@ 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. +# ssi_with_retries- Does the server side include of a resource. # if the ssi call returns an error we'll retry it up to # the number of times requested by the caller. # If we still have a proble, no text is appended to the @@ -146,6 +230,10 @@ sub annotate { sub ssi_with_retries { my ($resource, $retries, %form) = @_; + my $target = $form{'grade_target'}; + my $aom = $form{'answer_output_mode'}; + + my ($content, $response) = &Apache::loncommon::ssi_with_retries($resource, $retries, %form); if (!$response->is_success) { @@ -860,6 +948,7 @@ sub old_character_chart { $result =~ s/&(rdquo|#8221);/\'\'/g; + return $result; } @@ -1021,12 +1110,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 +1238,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 { @@ -1254,6 +1310,180 @@ sub unsupported { return $result; } +# +# Map from helper layout style to the book/album: +# +sub map_laystyle { + my ($laystyle) = @_; + if ($laystyle eq 'L') { + $laystyle='album'; + } else { + $laystyle='book'; + } + return $laystyle; +} + +sub print_page_in_course { + my ($helper, $rparmhash, $currentURL, $resources) = @_; + my %parmhash = %$rparmhash; + my @page_resources = @$resources; + my $mode = $helper->{'VARS'}->{'LATEX_TYPE'}; + my $symb = $helper->{'VARS'}->{'symb'}; + + + my $format_from_helper = $helper->{'VARS'}->{'FORMAT'}; + + + my @temporary_array=split /\|/,$format_from_helper; + my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array; + $laystyle = &map_laystyle($laystyle); + my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle, + $numberofcolumns); + my $LaTeXwidth=&recalcto_mm($textwidth); + + + 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); + } else { + $result.=$currentURL; + } + $result .= '\\\\'; + + if ($helper->{'VARS'}->{'style_file'}=~/\w/) { + &Apache::lonnet::appenv({'construct.style' => + $helper->{'VARS'}->{'style_file'}}); + } elsif ($env{'construct.style'}) { + &Apache::lonnet::delenv('construct.style'); + } + + # First is the overall 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); + + foreach my $resource (@page_resources) { + my $resource_src = $resource->src(); # Essentially the URL of the resource. + $result .= $resource->title() . '\\\\'; + + # Recurse if a .page: + + if ($resource_src =~ /.page$/i) { + my $navmap = Apache::lonnavmaps::navmap->new(); + my @page_resources = $navmap->retrieveResources($resource_src); + $result .= &print_page_in_course($helper, $rparmhash, + $resource_src, \@page_resources); + } + # these resources go through the XML transformer: + + 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; + + &Apache::lonxml::remember_problem_counter(); + $moreenv{'request.filename'}=$urlp; + if ($helper->{'VARS'}->{'probstatus'} eq 'exam') {$form{'problemtype'}='exam';} + + $form{'grade_target'} = 'tex'; + $form{'textwidth'} = &get_textwidth($helper, $LaTeXwidth); + $form{'pdfFormFiels'} = $pdfFormFields; # + $form{'showallfoils'} = $helper->{'VARS'}->{'showallfoils'}; + + $form{'problem_split'}=$parmhash{'problem_stream_switch'}; + $form{'suppress_tries'}=$parmhash{'suppress_tries'}; + $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; + $form{'print_discussions'}=$helper->{'VARS'}->{'PRINT_DISCUSSIONS'}; + $form{'print_annotations'}=$helper->{'VARS'}->{'PRINT_ANNOTATIONS'}; + if (($helper->{'VARS'}->{'PRINT_DISCUSSIONS'} eq 'yes') || + ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes')) { + $form{'problem_split'}='yes'; + } + my $rndseed = time; + if ($helper->{'VARS'}->{'curseed'}) { + $rndseed=$helper->{'VARS'}->{'curseed'}; + } + $form{'rndseed'}=$rndseed; + &Apache::lonnet::appenv(\%moreenv); + + &Apache::lonxml::clear_problem_counter(); + + my $texversion = &ssi_with_retries($urlp, $ssi_retry_count, %form); + + # There seems to be an extraneous \vskip 1mm \\\\ : + + $texversion =~ s/^\\vskip 1mm \\\\\\\\//; + + # current document with answers.. no need to encap in minipage + # since there's only one answer. + + if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') || + ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) { + my %answerform = %form; + + + $answerform{'problem_split'}=$parmhash{'problem_stream_switch'}; + $answerform{'grade_target'}='answer'; + $answerform{'answer_output_mode'}='tex'; + $answerform{'rndseed'}=$rndseed; + if ($helper->{'VARS'}->{'probstatus'} eq 'exam') { + $answerform{'problemtype'}='exam'; + } + $resources_printed .= $urlp.':'; + my $answer=&ssi_with_retries($urlp,$ssi_retry_count, %answerform); + + if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') { + $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; + } else { + $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'}); + if ($helper->{'VARS'}->{'construction'} ne '1') { + my $title = &Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}); + $title = &Apache::lonxml::latex_special_symbols($title); + $texversion.='\vskip 0 mm \noindent\textbf{'.$title.'}\vskip 0 mm '; + $texversion.=&path_to_problem($urlp,$LaTeXwidth); + } else { + $texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm '; + my $URLpath=$urlp; + $URLpath=~s/~([^\/]+)/public_html\/$1\/$1/; + $texversion.=&path_to_problem($URLpath,$LaTeXwidth); + } + $texversion.='\vskip 1 mm '.$answer.'\end{document}'; + } + + + + + + } + # Print annotations. + + + if ($helper->{'VARS'}->{'PRINT_ANNOTATIONS'} eq 'yes') { + my $annotation .= &annotate($currentURL); + $texversion =~ s/(\\keephidden{ENDOFPROBLEM})/$annotation$1/; + } + + if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') { + $texversion=&IndexCreation($texversion,$currentURL); + } + if ($helper->{'VARS'}->{'CONSTR_RESOURSE_URL'} eq 'yes') { + $texversion=~s/(\\addcontentsline\{toc\}\{subsection\}\{[^\}]*\})/$1 URL: \\verb|$currentURL| \\strut\\\\\\strut /; + + } + $result .= $texversion; + if ($currentURL=~m/\.page\s*$/) { + ($result,$numberofcolumns) = &page_cleanup($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 +1511,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() + .'' + .''.$ext_text.'' + .'' + .''.&Apache::lonlocal::locallocaltime($cctime).'' + .''.$csize.'' + .&Apache::loncommon::end_data_table_row(); if ($ext eq 'pdf') { $pdf_result .= $result; } if ($ext eq 'zip') { $zip_result .= $result; } } + if ($zip_result || $pdf_result) { + $r->print('
'); + } if ($zip_result) { - $r->print('

'.&mt('Recently generated printout zip files')."

\n" - .$zip_result); + $r->print('

'.&mt('Recently generated printout zip files')."

\n" + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.&mt('Download').'' + .''.&mt('Creation Date').'' + .''.&mt('File Size (Bytes)').'' + .&Apache::loncommon::end_data_table_header_row() + .$zip_result + .&Apache::loncommon::end_data_table() + ); } if ($pdf_result) { - $r->print('

'.&mt('Recently generated printouts')."

\n" - .$pdf_result); + $r->print('

'.&mt('Recently generated printouts')."

\n" + .&Apache::loncommon::start_data_table() + .&Apache::loncommon::start_data_table_header_row() + .''.&mt('Download').'' + .''.&mt('Creation Date').'' + .''.&mt('File Size (Bytes)').'' + .&Apache::loncommon::end_data_table_header_row() + .$pdf_result + .&Apache::loncommon::end_data_table() + ); } } @@ -1401,7 +1654,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 '; @@ -1420,7 +1673,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; @@ -1431,6 +1698,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 = < @@ -1460,8 +1728,16 @@ sub output_data { ENDPART - - my $start_page = &Apache::loncommon::start_page('Preparing Printout',$js); + # Breadcrumbs + #FIXME: Choose better/different breadcrumbs?!? Links? + my $brcrum = [{'href' => '', + 'text' => 'Helper'}, #FIXME: Different origin possible than print out helper? + {'href' => '', + 'text' => 'Preparing Printout'}]; + + my $start_page = &Apache::loncommon::start_page('Preparing Printout', + $js, + {'bread_crumbs' => $brcrum,}); my $msg = &mt('Please stand by while processing your print request, this may take some time ...'); $r->print($start_page."\n

\n$msg\n

\n"); @@ -1483,11 +1759,8 @@ ENDPART my $number_of_columns = 1; #used only for pages to determine the width of the cell my @temporary_array=split /\|/,$format_from_helper; my ($laystyle,$numberofcolumns,$papersize,$pdfFormFields)=@temporary_array; - if ($laystyle eq 'L') { - $laystyle='album'; - } else { - $laystyle='book'; - } + + $laystyle = &map_laystyle($laystyle); my ($textwidth,$textheight,$oddoffset,$evenoffset) = &page_format($papersize,$laystyle,$numberofcolumns); my $assignment = $env{'form.assignment'}; my $LaTeXwidth=&recalcto_mm($textwidth); @@ -1520,7 +1793,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'); } @@ -1541,7 +1814,7 @@ ENDPART } $selectionmade = 1; if ($cleanURL!~m|^/adm/| - && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + && $cleanURL=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) { my $rndseed=time; my $texversion=''; if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') { @@ -1611,6 +1884,7 @@ ENDPART + } # Print annotations. @@ -1633,10 +1907,12 @@ ENDPART ($result,$number_of_columns) = &page_cleanup($result); } } elsif ($cleanURL!~m|^/adm/| - && $currentURL=~/\.sequence$/ && $helper->{'VARS'}->{'construction'} eq '1') { + && $currentURL=~/\.(sequence|page)$/ && $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}'; @@ -1654,7 +1930,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: # @@ -1667,11 +1943,27 @@ ENDPART $do_postprocessing = 0; # Don't massage the result. + } elsif ($cleanURL =~ /\.pdf$/i) { + $result .= &include_pdf($cleanURL); + $result .= '\end{document}'; + } elsif ($cleanURL =~ /\.page$/i) { # Print page in non construction space contexts. + + # Determine the set of resources in the map of the page: + + my $navmap = Apache::lonnavmaps::navmap->new(); + my @page_resources = $navmap->retrieveResources($cleanURL); + $result .= &print_page_in_course($helper, $rparmhash, + $cleanURL, \@page_resources); + + } else { + &Apache::lonnet::logthis("Unsupported type handler"); $result.=&unsupported($currentURL,$helper->{'VARS'}->{'LATEX_TYPE'}, $helper->{'VARS'}->{'symb'}); } } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') or + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page') or ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') or ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_resources') or # BUGBUG @@ -1680,9 +1972,13 @@ ENDPART #-- produce an output string - if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') { + if (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') or + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_in_page') ) { $selectionmade = 2; - } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') { + } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') or + ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_resources_in_page')) + { + &Apache::lonnet::logthis("Selectionmade => 3"); $selectionmade = 3; } elsif (($helper->{'VARS'}->{'PRINT_TYPE'} eq 'all_problems') ) { @@ -1726,7 +2022,7 @@ ENDPART $urlp=&Apache::lonnet::clutter($urlp); $form{'symb'}=$master_seq[$i]; - + &Apache::lonnet::logthis("Element $i Sequence $sequence Middle $middle_thingy URLP $urlp"); my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #title of the assignment which contains this problem if ($selectionmade==7) {$helper->{VARS}->{'assignment'}=$assignment;} @@ -1734,10 +2030,13 @@ ENDPART my $texversion=''; if ($urlp!~m|^/adm/| && $urlp=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) { + &Apache::lonnet::logthis("Problem"); $resources_printed .= $urlp.':'; &Apache::lonxml::remember_problem_counter(); $texversion.=&ssi_with_retries($urlp, $ssi_retry_count, %form); + &Apache::lonnet::logthis("texversion so far: $texversion"); if ($urlp=~/\.page$/) { + &Apache::lonnet::("Special page actions"); ($texversion,my $number_of_columns_page) = &page_cleanup($texversion); if ($number_of_columns_page > $number_of_columns) {$number_of_columns=$number_of_columns_page;} $texversion =~ s/\\end{document}\d*/\\end{document}/; @@ -1759,7 +2058,9 @@ ENDPART $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/; } else { if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library)$/) { + &Apache::lonnet::logthis("problem printing"); $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 '; @@ -1795,6 +2096,7 @@ ENDPART $assignment, $courseidinfo, $name); + if ($numberofcolumns eq '1') { $result .='\newpage \noindent\parbox{\minipagewidth}{\noindent\\lhead{'.$header_text.'}} \vskip 5 mm '; } else { @@ -1802,6 +2104,7 @@ ENDPART } } $result .= $texversion; + &Apache::lonnet::logthis("About to set rem header true with $result"); $flag_latex_header_remove = 'YES'; } elsif ($urlp=~/\/(smppg|syllabus|aboutme|bulletinboard)$/) { $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'}; @@ -1815,11 +2118,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]); @@ -1831,7 +2151,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') { @@ -1885,7 +2207,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); @@ -2131,6 +2453,11 @@ ENDPART $URLback=~s|^/~|/priv/|; } } + # + # Final adjustment of the font size: + # + + $result = set_font_size($result); #-- writing .tex file in prtspool my $temp_file; @@ -2215,7 +2542,7 @@ ENDPART # If there's been an unrecoverable SSI error, report it to the user if ($ssi_error) { my $helpurl = &Apache::loncommon::top_nav_help('Helpdesk'); - $r->print('

'.&mt('An unrecoverable network error occurred:').'

'. + $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 +2627,6 @@ 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::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 +2648,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 +2684,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 +2702,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 +2715,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 +2798,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; } @@ -2552,7 +2891,6 @@ sub printHelper { } - # Detect whether we're coming from construction space if ($env{'form.postdata'}=~/^(?:http:\/\/[^\/]+\/|\/|)\~([^\/]+)\/(.*)$/) { $helper->{VARS}->{'filename'} = "~$1/$2"; @@ -2599,6 +2937,8 @@ sub printHelper { $subdir = substr($helper->{VARS}->{'filename'}, 0, rindex($helper->{VARS}->{'filename'}, '/') + 1); } else { + # From course space: + if ($symb ne '') { ($map, $id, $url) = &Apache::lonnet::decode_symb($symb); $helper->{VARS}->{'postdata'} = @@ -2606,9 +2946,9 @@ sub printHelper { } else { $url = $helper->{VARS}->{'postdata'}; $is_published=1; # From resource space. + &Apache::lonnet::logthis("Resource url $url"); } $url = &Apache::lonnet::clutter($url); - if (!$resourceTitle) { # if the resource doesn't have a title, use the filename my $postdata = $helper->{VARS}->{'postdata'}; $resourceTitle = substr($postdata, rindex($postdata, '/') + 1); @@ -2667,16 +3007,73 @@ sub printHelper { "


"); + &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"; + + + + + return 'normalsize'; + + Tiny + Script Size + Footnote Size + Small + Normal (default) + larger than normal + Even larger than normal + Still larger than normal + huge font size + Largest possible size + +FONT_SELECTION + &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); + &addMessage(&Apache::lonhtmlcommon::row_closure(1)); } if ($perm{'pav'}) { @@ -3153,10 +3584,12 @@ CHOOSE_FROM_ANY_SEQUENCE ": "); + &addMessage(&Apache::lonhtmlcommon::row_closure()); if (not $helper->{VARS}->{'construction'}) { - addMessage(""); - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure()); # Prompt for printing annotations too. - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure()); - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure(1)); } if ($helper->{'VARS'}->{'construction'}) { @@ -3242,32 +3684,44 @@ CHOOSE_FROM_ANY_SEQUENCE my $stylefiletext=&mt("Use style file"); my $selectfiletext=&mt("Select style file"); - my $xmlfrag .= <<"RNDSEED"; - -RNDSEED +   + ' + .'' + .&Apache::lonhtmlcommon::row_closure() + .''; &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); - addMessage(""); + &addMessage(&Apache::lonhtmlcommon::row_closure(1)); - } + + + } } if ($startedTable) { - addMessage("
". - ': "); + &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 +3544,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 +3605,13 @@ CHOOSE_FROM_ANY_SEQUENCE } Apache::lonhelper::dropdown->new(); - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'TABLE_CONTENTS'; $helper->declareVar('TABLE_CONTENTS'); @@ -3183,13 +3619,15 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
". - ': "); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = 'TABLE_INDEX'; $helper->declareVar('TABLE_INDEX'); @@ -3197,11 +3635,13 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); - 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 +3649,16 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes'] ]; Apache::lonhelper::dropdown->new(); - addMessage("
". - ':"); + &addMessage(&Apache::lonhtmlcommon::row_title( + '' + ) + ); $paramHash = Apache::lonhelper::getParamHash(); $paramHash->{'variable'} = "PRINT_ANNOTATIONS"; $helper->declareVar("PRINT_ANNOTATIONS"); @@ -3224,16 +3666,16 @@ CHOOSE_FROM_ANY_SEQUENCE ['No', 'no'], ['Yes', 'yes']]; Apache::lonhelper::dropdown->new(); - addMessage("
"); + &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("
- : - - - - return $helper->{VARS}->{'curseed'}; - - -
- : - + my $xmlfrag .= '' + .&Apache::lonhtmlcommon::row_title('' + ) + .' + + + return '.$helper->{VARS}->{'curseed'}.'; + ' + .'' + .'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title('' + ) + .' - - return $stylevalue; - -   $selectfiletext
+ + return '.$stylevalue.'; + +  ' +.qq|| +.$selectfiletext.'' + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title(&mt('Show All Foils')) + .' - Show all foils - -
Problem Type:"); + &addMessage(&Apache::lonhtmlcommon::row_title(&mt('Problem Type'))); # # Initial value from construction space: # @@ -3285,17 +3739,18 @@ RNDSEED PROBTYPE &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag); - - addMessage("
"); + &addMessage(&Apache::lonhtmlcommon::end_pick_box()); } Apache::lonprintout::page_format_state->new("FORMAT"); @@ -3397,31 +3852,31 @@ sub render { my $pdfFormLabel=&mt('PDF-Formfields'); my $with=&mt('with Formfields'); my $without=&mt('without Formfields'); - $result .= < - - - - - - - - - - ' + .'' + .'' + .'' + .&Apache::loncommon::end_data_table_header_row() + .&Apache::loncommon::start_data_table_row() + .''; + + $result.=' -
$PageLayout$NumberOfColumns$PaperType$pdfFormLabel
-
- -
- '.$PageLayout.''.$NumberOfColumns.''.$PaperType.''.$pdfFormLabel.'' + .'
' + .'' + .'
' + .'
HTML + $result.=&Apache::loncommon::end_data_table_row() + .&Apache::loncommon::end_data_table(); return $result; } @@ -3543,12 +3999,8 @@ sub render { my ($laystyle, $cols, $papersize) = split(/\|/, $format); ($papersize) = split(/ /, $papersize); + $laystyle = &Apache::lonprintout::map_laystyle($laystyle); - if ($laystyle eq 'L') { - $laystyle = 'album'; - } else { - $laystyle = 'book'; - } my %size; @@ -3577,50 +4029,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; } @@ -3643,11 +4081,8 @@ sub preprocess { ($papersize) = split(/ /, $papersize); - if ($laystyle eq 'L') { - $laystyle = 'album'; - } else { - $laystyle = 'book'; - } + $laystyle = &Apache::lonprintout::map_laystyle($laystyle); + # Figure out some good defaults for the print out and set them: my %size;