--- loncom/interface/lonprintout.pm	2003/09/17 17:32:56	1.236
+++ loncom/interface/lonprintout.pm	2003/10/01 19:51:31	1.246
@@ -1,7 +1,7 @@
 # The LearningOnline Network
 # Printout
 #
-# $Id: lonprintout.pm,v 1.236 2003/09/17 17:32:56 albertel Exp $
+# $Id: lonprintout.pm,v 1.246 2003/10/01 19:51:31 sakharuk Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -611,6 +611,54 @@ sub IndexCreation {
     return $texversion;
 }
 
+sub print_latex_header {
+    my $mode=shift;
+    my $output='\documentclass[letterpaper]{article}';
+    if ($mode eq 'batchmode') {
+	$output.='\batchmode';
+    }
+    $output.='\newcommand{\keephidden}[1]{}\renewcommand{\deg}{$^{\circ}$}'.
+	     '\usepackage{longtable}\usepackage{textcomp}\usepackage{makeidx}'.
+	     '\usepackage[dvips]{graphicx}\usepackage{epsfig}\usepackage{calc}'.
+	     '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}'.
+	     '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}'.
+	     '\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}'.
+	     '\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}'.
+	     '\setlength{\abovedisplayshortskip}{-0.04in}'.
+	     '\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'.
+	     '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large'.
+	     '\textbf{Index}} \newline \setlength{\rightmargin}{0in}'.
+	     '\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}'.
+	     '\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}'.
+	     '\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}'.
+	     '\setlength{\abovedisplayshortskip}{-0.04in}'.
+	     '\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}\begin{document}';
+    return $output;	     
+}
+
+sub path_to_problem {
+    my ($urlp,$LaTeXwidth)=@_;
+    my $newurlp = '';
+    $LaTeXwidth=~s/\s*mm\s*$//;
+    my $HowMany = length($urlp)*2;
+    if ($HowMany > $LaTeXwidth) {
+	my @temporrary = split '/',$urlp;
+	my $HowManyNew = 0;
+	for (my $ii=0;$ii<=$#temporrary;$ii++) {
+	    if ($temporrary[$ii] ne '') {
+		$HowManyNew += length($temporrary[$ii])*2;
+		if ($HowManyNew < $LaTeXwidth ) {
+		    $newurlp .=  '/'.$temporrary[$ii];
+		} else {
+		    $HowManyNew = 0;
+		    $newurlp .=  '|\vskip -1 mm \noindent \verb|';
+		    $ii--;
+		}
+	    }
+	}
+    }
+    return '{\small\noindent\verb|'.$newurlp.'|\vskip 0 mm}';
+}
 
 sub output_data {
     my ($r,$helper,$rparmhash) = @_;
@@ -655,38 +703,54 @@ ENDPART
 	    $currentURL=$helper->{'VARS'}->{'postdata'};
 	} else {
             #prints resource from the construction space
-	    $currentURL=$helper->{'VARS'}->{'filename'};
-	    $currentURL=~s/\/home\//\/~/;
-	    $currentURL=~s/public_html\///;
+	    $currentURL='/'.$helper->{'VARS'}->{'filename'};
 	    if ($currentURL=~/([^?]+)/) {$currentURL=$1;}
 	}
 	$selectionmade = 1;
 	if ($currentURL=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)$/) {
-	    my %moreenv;
-	    $moreenv{'request.filename'}=$currentURL;
-	    my %form;
-	    $form{'grade_target'}='tex';
-	    $form{'textwidth'}=$LaTeXwidth;	
-	    $form{'problem_split'}=$parmhash{'problem_stream_switch'};
-	    $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
 	    my $rndseed=time;
-	    if ($helper->{'VARS'}->{'curseed'}) {
-		$rndseed=$helper->{'VARS'}->{'curseed'};
+	    my $texversion='';
+	    if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
+		my %moreenv;
+		$moreenv{'request.filename'}=$currentURL;
+		my %form;
+		$form{'grade_target'}='tex';
+		$form{'textwidth'}=$LaTeXwidth;	
+		$form{'problem_split'}=$parmhash{'problem_stream_switch'};
+		$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
+		if ($helper->{'VARS'}->{'curseed'}) {
+		    $rndseed=$helper->{'VARS'}->{'curseed'};
+		}
+		$form{'rndseed'}=$rndseed;
+		&Apache::lonnet::appenv(%moreenv);
+		&Apache::lonnet::delenv('form.counter');
+		&Apache::lonxml::init_counter();
+		$texversion=&Apache::lonnet::ssi($currentURL,%form);
+		&Apache::lonnet::delenv('form.counter');
+		&Apache::lonnet::delenv('request.filename');
 	    }
-	    $form{'rndseed'}=$rndseed;
-	    &Apache::lonnet::appenv(%moreenv);
-	    &Apache::lonnet::delenv('form.counter');
-	    &Apache::lonxml::init_counter();
-	    my $texversion=&Apache::lonnet::ssi($currentURL,%form);
-	    &Apache::lonnet::delenv('form.counter');
-	    &Apache::lonnet::delenv('request.filename');
-	    if($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
+	    if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
+	       ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
 		my %form;
 		$form{'grade_target'}='answer';
 		$form{'answer_output_mode'}='tex';
 		$form{'rndseed'}=$rndseed;
 		my $answer=&Apache::lonnet::ssi($currentURL,%form);
-		$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
+		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') {
+			$texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
+			$texversion.=&path_to_problem ($currentURL,$LaTeXwidth);
+		    } else {
+			$texversion.='\vskip 0 mm \noindent\textbf{Prints from construction space - there is no title.}\vskip 0 mm ';
+			my $URLpath=$currentURL;
+			$URLpath=~s/~([^\/]+)/public_html\/$1\/$1/;
+			$texversion.=&path_to_problem ($URLpath,$LaTeXwidth);
+		    }
+		    $texversion.='\vskip 1 mm '.$answer.'\end{document}';
+		}
 	    }
 	    if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
 		$texversion=&IndexCreation($texversion,$currentURL);
@@ -712,22 +776,32 @@ ENDPART
 		$Apache::lonratedt::resources[$Apache::lonratedt::order[$member]]=~/^([^:]*):([^:]*):/;
 		my $urlp=$2;
 		if ($urlp=~/\.(problem|exam|quiz|assess|survey|form|library|xml|html|htm|xhtml|xhtm)$/) {
-		    my %form;
-		    $form{'grade_target'}='tex';
-		    $form{'textwidth'}=$LaTeXwidth;
-		    $form{'problem_split'}=$parmhash{'problem_stream_switch'};
-		    $form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
-		    $form{'rndseed'}=$rndseed;
-		    my $texversion=&Apache::lonnet::ssi($urlp,%form);
-		    if($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
+		    my $texversion='';
+		    if ($helper->{'VARS'}->{'ANSWER_TYPE'} ne 'only') {
+			my %form;
+			$form{'grade_target'}='tex';
+			$form{'textwidth'}=$LaTeXwidth;
+			$form{'problem_split'}=$parmhash{'problem_stream_switch'};
+			$form{'latex_type'}=$helper->{'VARS'}->{'LATEX_TYPE'};
+			$form{'rndseed'}=$rndseed;
+			$texversion=&Apache::lonnet::ssi($urlp,%form);
+		    }
+		    if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
+		       ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
 			my %form;
 			$form{'grade_target'}='answer';
 			$form{'answer_output_mode'}='tex';
 			$form{'rndseed'}=$rndseed;
                         if ($urlp=~/\/res\//) {$ENV{'request.state'}='published';}
-			####my $answer=' SSSSSS '.$ENV{'request.state'}.' FFFFFFF ';
 			my $answer=&Apache::lonnet::ssi($urlp,%form);
-			$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
+			if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
+			    $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
+			} else {
+			    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
+			    $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
+			    $texversion.=&path_to_problem ($currentURL,$LaTeXwidth);
+			    $texversion.='\vskip 1 mm '.$answer.'\end{document}';
+			}
 		    }
 		    if ($flag_latex_header_remove ne 'NO') {
 			$texversion = &latex_header_footer_remove($texversion);
@@ -776,7 +850,7 @@ ENDPART
 	&Apache::lonxml::init_counter();
 	for (my $i=0;$i<=$#master_seq;$i++) {
 	    my (undef,undef,$urlp)=&Apache::lonnet::decode_symb($master_seq[$i]);
-	    $urlp=&Apache::lonnet::declutter($urlp);
+	    $urlp=&Apache::lonnet::clutter($urlp);
 	    if ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems') {
 		$selectionmade = 2;
 	    } elsif ($helper->{'VARS'}->{'PRINT_TYPE'} eq 'map_problems_pages') {
@@ -787,6 +861,7 @@ ENDPART
 	    $form{'symb'}=$master_seq[$i];
 	    my ($sequence)=&Apache::lonnet::decode_symb($master_seq[$i]);
 	    my $assignment=&Apache::lonxml::latex_special_symbols(&Apache::lonnet::gettitle($sequence),'header'); #tittle of the assignment which contains this problem
+	    my $texversion='';
 	    #&Apache::lonnet::logthis("Trying to get $urlp with symb $master_seq[$i]");
 	    my $texversion=&Apache::lonnet::ssi($urlp,%form);
 	    if ($urlp=~/\.page$/) {
@@ -795,17 +870,25 @@ ENDPART
 		$texversion =~ s/\\end{document}\d*/\\end{document}/;
 		$flag_page_in_sequence = 'YES';
 	    } 
-	    if ($flag_latex_header_remove ne 'NO') {
-		$texversion = &latex_header_footer_remove($texversion);
-	    } else {
-		$texversion =~ s/\\end{document}//;
-	    }
-	    if($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
+	    if(($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') ||
+	       ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'only')) {
 		my %form;
 		$form{'grade_target'}='answer';
 		$form{'answer_output_mode'}='tex';
 		my $answer=&Apache::lonnet::ssi($urlp,%form);
-		$texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
+		if ($helper->{'VARS'}->{'ANSWER_TYPE'} eq 'no') {
+		    $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
+		} else {
+		    $texversion=&print_latex_header($helper->{'VARS'}->{'LATEX_TYPE'});
+		    $texversion.='\vskip 0 mm \noindent\textbf{'.&Apache::lonnet::gettitle($helper->{'VARS'}->{'symb'}).'}\vskip 0 mm ';
+		    $texversion.=&path_to_problem ($urlp,$LaTeXwidth);
+		    $texversion.='\vskip 1 mm '.$answer;
+		}
+	    }
+	    if ($flag_latex_header_remove ne 'NO') {
+		$texversion = &latex_header_footer_remove($texversion);
+	    } else {
+		$texversion =~ s/\\end{document}//;
 	    }
 	    if ($helper->{'VARS'}->{'TABLE_INDEX'} eq 'yes') {
 		$texversion=&IndexCreation($texversion,$urlp);
@@ -919,25 +1002,8 @@ ENDPART
 		    $texversion=~s/(\\keephidden{ENDOFPROBLEM})/$answer$1/;
 		}
                 #this chunck is responsible for printing the path to problem
-		my $newurlp = '';
-		my $HowMany = length($urlp)*2;
-		if ($HowMany > $LaTeXwidth) {
-		    my @temporrary = split '/',$urlp;
-		    my $HowManyNew = 0;
-		    for (my $ii=0;$ii<=$#temporrary;$ii++) {
-			if ($temporrary[$ii] ne '') {
-			    $HowManyNew += length($temporrary[$ii])*2;
-			    if ($HowManyNew < $LaTeXwidth ) {
-				$newurlp .=  '/'.$temporrary[$ii];
-			    } else {
-				$HowManyNew = 0;
-				$newurlp .=  '|\vskip -1 mm \noindent \verb|';
-				$ii--;
-			    }
-			}
-		    }
-		}
-		$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 {\\small\\noindent\\verb|$newurlp\|\\vskip 0 mm}/;
+		my $newurlp=&path_to_problem($urlp,$LaTeXwidth);
+		$texversion =~ s/(\\begin{minipage}{\\textwidth})/$1 $newurlp/;
 		if ($flag_latex_header_remove ne 'NO') {
 		    $texversion = &latex_header_footer_remove($texversion);
 		} else {
@@ -1035,6 +1101,8 @@ sub addMessage {
     Apache::lonhelper::message->new();
 }
 
+use Data::Dumper;
+
 sub printHelper {
     my $r = shift;
 
@@ -1045,9 +1113,9 @@ sub printHelper {
 
     if ($r->header_only) {
         if ($ENV{'browser.mathml'}) {
-            $r->content_type('text/xml');
+            &Apache::loncommon::content_type($r,'text/xml');
         } else {
-            $r->content_type('text/html');
+            &Apache::loncommon::content_type($r,'text/html');
         }
         $r->send_http_header;
         return OK;
@@ -1055,9 +1123,9 @@ sub printHelper {
 
     # Send header, nocache
     if ($ENV{'browser.mathml'}) {
-        $r->content_type('text/xml');
+        &Apache::loncommon::content_type($r,'text/xml');
     } else {
-        $r->content_type('text/html');
+        &Apache::loncommon::content_type($r,'text/html');
     }
     &Apache::loncommon::no_cache($r);
     $r->send_http_header;
@@ -1122,8 +1190,8 @@ sub printHelper {
         $helper->{VARS}->{'postdata'} = Apache::lonnet::clutter($url);
 
         if (!$resourceTitle) { # if the resource doesn't have a title, use the filename
-            my $url = $helper->{VARS}->{'postdata'};
-            $resourceTitle = substr($url, rindex($url, '/') + 1);
+            my $postdata = $helper->{VARS}->{'postdata'};
+            $resourceTitle = substr($postdata, rindex($postdata, '/') + 1);
         }
         $subdir = &Apache::lonnet::filelocation("", $url);
     }
@@ -1160,26 +1228,37 @@ sub printHelper {
     my $printChoices = [];
     my $paramHash;
 
-    if ($resourceTitle && $helper->{VARS}->{'postdata'}) {
+    if ($resourceTitle) {
         push @{$printChoices}, ["<b>$resourceTitle</b> (what you just saw on the screen)", 'current_document', 'PAGESIZE'];
     }
 
 #    $r->print($helper->{VARS}->{'postdata'});
 
+    # Useful filter strings
+    my $isProblem = '$res->is_problem()';
+    $isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
+    my $isProblemOrMap = '$res->is_problem() || $res->is_map()';
+    my $isNotMap = '!$res->is_map()';
+    $isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
+    my $isMap = '$res->is_map()';
+    my $symbFilter = '$res->symb()';
+    my $urlValue = '$res->src()';
+
+    $helper->declareVar('SEQUENCE');
+
+    # Useful for debugging: Dump the help vars
+    #$r->print(Dumper($helper->{VARS}));
+    #$r->print($map);
+
     # If we're in a sequence...
     if (($helper->{'VARS'}->{'construction'} ne '1') &&
-	$helper->{VARS}->{'postdata'}) {
+	$helper->{VARS}->{'postdata'} &&
+	$helper->{VARS}->{'assignment'}) {
         # Allow problems from sequence
-        push @{$printChoices}, ["<b>Selected problems</b> in $sequenceTitle", 'map_problems', 'CHOOSE_PROBLEMS'];
+        push @{$printChoices}, ["<b>Problems</b> in $sequenceTitle", 'map_problems', 'CHOOSE_PROBLEMS'];
         # Allow all resources from sequence
-        push @{$printChoices}, ["<b>Selected resources</b> in $sequenceTitle", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
+        push @{$printChoices}, ["<b>Resources</b> in $sequenceTitle", 'map_problems_pages', 'CHOOSE_PROBLEMS_HTML'];
 
-        my $isProblem = '$res->is_problem()';
-	$isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
-        my $isProblemOrMap = '$res->is_problem() || $res->is_map()';
-        my $isNotMap = '!$res->is_map()';
-	$isNotMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
-        my $symb = '$res->symb()';
         my $helperFragment = <<HELPERFRAGMENT;
   <state name="CHOOSE_PROBLEMS" title="Select Problem(s) to print">
     <message>(mark them then click "next" button) <br /></message>
@@ -1187,7 +1266,7 @@ sub printHelper {
       <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isProblem;</filterfunc>
       <mapurl>$map</mapurl>
-      <valuefunc>return $symb;</valuefunc>
+      <valuefunc>return $symbFilter;</valuefunc>
       </resource>
     </state>
 
@@ -1197,7 +1276,7 @@ sub printHelper {
       <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isNotMap;</filterfunc>
       <mapurl>$map</mapurl>
-      <valuefunc>return $symb;</valuefunc>
+      <valuefunc>return $symbFilter;</valuefunc>
       </resource>
     </state>
 HELPERFRAGMENT
@@ -1208,14 +1287,11 @@ HELPERFRAGMENT
     # If the user is priviledged, allow them to print all 
     # problems in the course, optionally for selected students
     if ($userPriviledged && ($helper->{VARS}->{'postdata'}=~/\/res\//)) { 
-        push @{$printChoices}, ['Selected problems from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];
-        push @{$printChoices}, ["Selected problems from $sequenceTitle for <b>selected students</b>", 'problems_for_students', 'CHOOSE_STUDENTS'];
+        push @{$printChoices}, ['Problems from <b>entire course</b>', 'all_problems', 'ALL_PROBLEMS'];
+	if ($helper->{VARS}->{'assignment'}) {
+	    push @{$printChoices}, ["Problems from $sequenceTitle for <b>selected students</b>", 'problems_for_students', 'CHOOSE_STUDENTS'];
+	}
 
-        my $isProblem = '$res->is_problem()';
-	$isProblem .= ' && !$res->randomout()' if !$userCanSeeHidden;
-        my $isProblemOrMap = '($res->is_problem() || $res->is_map())';
-	$isProblemOrMap .= ' && !$res->randomout()' if !$userCanSeeHidden;
-        my $symb = '$res->symb()';
         &Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_STUDENTS);
   <state name="ALL_PROBLEMS" title="Select Problem(s) to print">
     <message>(mark them then click "next" button) <br /></message>
@@ -1224,7 +1300,7 @@ HELPERFRAGMENT
       <nextstate>PAGESIZE</nextstate>
       <filterfunc>return $isProblemOrMap;</filterfunc>
       <choicefunc>return $isProblem;</choicefunc>
-      <valuefunc>return $symb;</valuefunc>
+      <valuefunc>return $symbFilter;</valuefunc>
       </resource>
     </state>
 
@@ -1234,7 +1310,7 @@ HELPERFRAGMENT
     <resource variable="RESOURCES" multichoice="1" addstatus="1">
       <filterfunc>return $isProblem</filterfunc>
       <mapurl>$map</mapurl>
-      <valuefunc>return $symb</valuefunc>
+      <valuefunc>return $symbFilter</valuefunc>
       </resource>
     <message><br /><big><i><b>How should the results be printed?</b></i></big><br /></message>
     <choices variable="EMPTY_PAGES">
@@ -1248,9 +1324,9 @@ CHOOSE_STUDENTS
     }
 
     # FIXME: That RE should come from a library somewhere.
-    if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $ENV{'request.role.adv'}) {    
+    if ((((&Apache::lonnet::allowed('bre',$subdir) eq 'F') and ($helper->{VARS}->{'postdata'}=~/\.(problem|exam|quiz|assess|survey|form|library|page|xml|html|htm|xhtml|xhtm)/)) or defined $helper->{'VARS'}->{'construction'}) and $ENV{'request.role.adv'} and $subdir ne '/home/httpd/html/res/') {    
         push @{$printChoices}, ["Problems from current subdirectory <b>$subdir</b>", 'problems_from_directory', 'CHOOSE_FROM_SUBDIR'];
-        
+
         my $f = '$filename';
         my $xmlfrag = <<CHOOSE_FROM_SUBDIR;
   <state name="CHOOSE_FROM_SUBDIR" title="Select File(s) from <b><small>$subdir</small></b> to print">
@@ -1260,6 +1336,8 @@ CHOOSE_STUDENTS
       <filechoice>return '$subdir';</filechoice>
 CHOOSE_FROM_SUBDIR
         
+        # this is broken up because I really want interpolation above,
+        # and I really DON'T want it below
         $xmlfrag .= <<'CHOOSE_FROM_SUBDIR';
       <filefilter>return Apache::lonhelper::files::not_old_version($filename) &&
 	  $filename =~ m/\.(problem|exam|quiz|assess|survey|form|library)$/;
@@ -1270,6 +1348,36 @@ CHOOSE_FROM_SUBDIR
         &Apache::lonxml::xmlparse($r, 'helper', $xmlfrag);
     }
 
+    # Allow the user to select any sequence in the course, feed it to
+    # another resource selector for that sequence
+    if (!$helper->{VARS}->{'construction'}) {
+	push @$printChoices, ["Resources from <b>selected sequence</b> in course",
+			      'map_problems_pages', 'CHOOSE_SEQUENCE'];
+	my $escapedSequenceName = $helper->{VARS}->{'SEQUENCE'};
+	#Escape apostrophes and backslashes for Perl
+	$escapedSequenceName =~ s/\\/\\\\/g;
+	$escapedSequenceName =~ s/'/\\'/g;
+	&Apache::lonxml::xmlparse($r, 'helper', <<CHOOSE_FROM_ANY_SEQUENCE);
+  <state name="CHOOSE_SEQUENCE" title="Select Sequence To Print From">
+    <message>Select the sequence to print resources from:</message>
+    <resource variable="SEQUENCE">
+      <nextstate>CHOOSE_FROM_ANY_SEQUENCE</nextstate>
+      <filterfunc>return \$res->is_sequence;</filterfunc>
+      <valuefunc>return $urlValue;</valuefunc>
+      </resource>
+    </state>
+  <state name="CHOOSE_FROM_ANY_SEQUENCE" title="Select Resources To Print">
+    <message>(mark desired resources then click "next" button) <br /></message>
+    <resource variable="RESOURCES" multichoice="1" toponly='1' addstatus="1">
+      <nextstate>PAGESIZE</nextstate>
+      <filterfunc>return $isProblem</filterfunc>
+      <mapurl evaluate='1'>return '$escapedSequenceName';</mapurl>
+      <valuefunc>return $symbFilter;</valuefunc>
+      </resource>
+    </state>
+CHOOSE_FROM_ANY_SEQUENCE
+}
+
     # Generate the first state, to select which resources get printed.
     Apache::lonhelper::state->new("START", "Select Printing Options:");
     $paramHash = Apache::lonhelper::getParamHash();
@@ -1286,13 +1394,14 @@ CHOOSE_FROM_SUBDIR
 
     if (($ENV{'request.role.adv'} and &Apache::lonnet::allowed('vgr',$ENV{'request.course.id'})) or 
 	($helper->{VARS}->{'construction'} eq '1')) {
-	addMessage("<hr width='33%' /><table><tr><td align='right'>Print With Answers:</td><td>");
+	addMessage("<hr width='33%' /><table><tr><td align='right'>Print: </td><td>");
         $paramHash = Apache::lonhelper::getParamHash();
 	$paramHash->{'variable'} = 'ANSWER_TYPE';   
 	$helper->declareVar('ANSWER_TYPE');         
         $paramHash->{CHOICES} = [
-                                   ['No', 'yes'],
-                                   ['Yes', 'no'] ];
+                                   ['Without Answers', 'yes'],
+                                   ['With Answers', 'no'],
+                                   ['Only Answers', 'only'] ];
         Apache::lonhelper::dropdown->new();
 	addMessage("</td></tr>");
 	$startedTable = 1;