'; }
- my %lastresponse=&Apache::lonnet::str2hash($lastresponse);
- if (&Apache::response::show_answer() ) {
- foreach my $name (@names) {
- if ($Apache::response::foilgroup{$name.'.value'} ne 'unused') {
- if ($direction eq 'horizontal') {
- $result.="
";
+ } else {
+ $result .= " ";
+ }
+ }
+
+ return $result;
+}
+##
+# Display foils in exam mode for latex
+#
+# @param $whichfoils - Reference to an array that contains the foil names to display
+# @param $bubbles_per_line - Number of bubbles on a line.
+# @param $direction - Rendering direction 'horizontal' is what we're looking for.
+# @param $vbegin - Start latex fragment in vertical rendering.
+# @param $vend - End latex fragmentin vertical rendering.
+#
+# @return string
+# @return the latex rendering of the exam problem.
+#
+#
+sub display_latex_exam {
+ my ($whichfoils, $bubbles_per_line, $direction, $vbegin, $vend) = @_;
+ my $result;
+ my $numlines;
+ my $bubble_number = 0;
+ my $line = 0;
+ my $i = 0;
+
+ &Apache::lonnet::logthis("LaTeX exam: $direction $vbegin $vend");
+
+ if ($direction eq 'horizontal') {
+
+ # Marshall the display text for each foil and turn things over to
+ # Apache::response::make_horizontal_bubbles:
+
+ my @foil_texts;
+ foreach my $name (@{$whichfoils}) {
+ push(@foil_texts, $Apache::response::foilgroup{$name . '.text'});
}
- for (my $i=0;$i<=$#bottomlist;$i++) {
- if ($bottomlist[$i]) { push(@whichfalse,$bottomlist[$i]) }
+ $result .= &Apache::caparesponse::make_horizontal_latex_bubbles(
+ $whichfoils, \@foil_texts, '$\bigcirc$');
+
+
+ } else {
+ $result .= $vbegin;
+
+ # This section puts out the prefix that tells the user
+ # (if necessary) to only choose one bubble in the next n lines
+ # for problems with more than one line worth of bubbles in the grid sheet:
+
+ my $numitems = scalar( @{$whichfoils} );
+ $numlines = int( $numitems / $bubbles_per_line );
+ if ( ( $numitems % $bubbles_per_line ) != 0 ) {
+ $numlines++;
+ }
+ if ( $numlines < 1 ) {
+ $numlines = 1;
+ }
+ if ( $numlines > 1 ) {
+ my $linetext;
+ for ( my $i = 0 ; $i < $numlines ; $i++ ) {
+ $linetext .= $Apache::lonxml::counter + $i . ', ';
+ }
+ $linetext =~ s/,\s$//;
+ $result .=
+ '\item[\small {\textbf{'
+ . $linetext . '}}]'
+ . ' {\footnotesize '
+ . &mt( '(Bubble once in [_1] lines)', $numlines )
+ . '} \hspace*{\fill} \\\\';
+ }
+ else {
+ $result .= '\item[\textbf{' . $Apache::lonxml::counter . '}.]';
+ }
+
+ # Now output the bubbles themselves:
+
+ foreach my $name (@{$whichfoils}) {
+ if ( $bubble_number >= $bubbles_per_line ) {
+ $line++;
+ $i = 0;
+ $bubble_number = 0;
+ }
+ my $identifier;
+ if ( $numlines > 1 ) {
+ $identifier = $Apache::lonxml::counter + $line;
+ }
+ $result .=
+ '{\small \textbf{'
+ . $identifier
+ . $alphabet[$i]
+ . '}}$\bigcirc$'
+ . $Apache::response::foilgroup{ $name . '.text' }
+ . '\\\\'; #' stupid emacs -- it thinks it needs that apostrophe to close the quote
+
+ $i++;
+ $bubble_number++;
}
- #if the true statement is randomized insert it into the list
- if ($dosplice) { splice(@whichfalse,$answer,0,$truelist[$whichtrue]); }
+ $result .= $vend
+
+ }
+
+ return $result;
+
+}
+
+##
+# Display latex when exam mode is not on.
+#
+# @param $whichfoils - The foils to display
+# @param $direction - Display direction ('horizontal' is what matters to us).
+# @param $vbegin - Begin the vertical environment being used.
+# @param $vend - End the vertical environment being used.
+#
+# @return string
+# @retval - The LaTeX rendering of the resource.'
+#
+sub display_latex {
+ my ($whichfoils, $direction, $vbegin, $vend) = @_;
+ my $result;
+
+ $result .= $vbegin;
+ foreach my $name (@{$whichfoils}) {
+ $result .= '\vspace*{-2 mm}\item '
+ . $Apache::response::foilgroup{ $name . '.text' };
}
- &Apache::lonxml::debug("Answer is $answer");
- return ($answer,@whichfalse);
+
+ $result .= $vend;
+
+ return $result;
+}
+
+
+##
+# Render foils for a PDF form. This is a variant of tex rednering that provides
+# sufficient markup that the final PDF is a form that can be filled in online,
+# or offline.
+#
+# @param $whichfoils - References an array of foils to display in the order in which
+# they should be displayed.
+# @param $direction - Rendering direction. 'horiztonal' means inputs are laid out
+# horizontally otherwise they are stacked vertically.
+#
+# @return string
+# @retval String containing the rendering of the resource.
+#
+sub display_pdf_form {
+ my ($whichfoils) = @_;
+ my $temp = 0;
+ my $result;
+
+ foreach my $name ( @{$whichfoils} ) {
+
+ my $fieldname =
+ $env{'request.symb'}
+ . '&part_'
+ . $Apache::inputtags::part
+ . '&radiobuttonresponse'
+ . '&HWVAL_'
+ . $Apache::inputtags::response['-1'];
+ $result .= '\item[{'
+ . &Apache::lonxml::print_pdf_radiobutton( $fieldname,
+ $temp )
+ . '}]'
+ . $Apache::response::foilgroup{ $name . '.text' }
+ . "\n";
+
+ $temp++;
+ }
+
+ return $result;
}
+
+##
+# Display selected foils: This is really just a dispatchter to appropriate renderers
+#
+# @param $target - Target (e.g. 'tex'...).
+# @param $answer - True if answers should be shown.
+# @param $whichfoils - Array of foil selectors that indicate which foils shouild be
+# rendered, in rendering order.
+# @param $direction- Rendering direction ('horizontal' is the one we look for,
+# otherwise foils are rendered one per line vertically.
+# @param $bubbles_per_line - number of exam bubbles per line.
+#
+# @return string
+# @retval The rendered problem.
+
sub displayfoils {
- my ($target,$max,$randomize,$direction)=@_;
+ my ( $target, $answer, $whichfoils, $direction, $bubbles_per_line ) = @_;
my $result;
- my ($answer,@whichfoils)=&whichfoils($max,$randomize);
- my $part=$Apache::inputtags::part;
- my $solved=$Apache::lonhomework::history{"resource.$part.solved"};
- if ( ($target ne 'tex') &&
- &Apache::response::show_answer() ) {
- if ($direction eq 'horizontal') {
- if ($target ne 'tex') {
- $result.='
';
- }
- }
- foreach my $name (@whichfoils) {
- if ($direction eq 'horizontal') {
- if ($target ne 'tex') { $result.='
'; }
- }
- if ($target ne 'tex') {
- $result.=" ";
- } else {
- $result.='\item \vskip -2 mm ';
- }
- if ($Apache::response::foilgroup{$name.'.value'} eq 'true') {
- if ($target ne 'tex') { $result.='Correct:'; } else { $result.='Correct: \textbf{';}
- } else {
- $result.='Incorrect:';
- }
- if ($target eq 'web') { $result.=""; }
- if ($Apache::response::foilgroup{$name.'.value'} eq 'true') {
- if ($target ne 'tex') { $result.='';} else {$result.='}';}
- }
- if ($direction eq 'horizontal') {
- if ($target ne 'tex') { $result.='
'; }
- }
- }
- if ($direction eq 'horizontal') {
- if ($target ne 'tex') {
- $result.='
';
- }
- }
+ my $part = $Apache::inputtags::part;
+ my $solved = $Apache::lonhomework::history{"resource.$part.solved"};
+
+ # Show answers html.
+
+ if ( ( $target ne 'tex' )
+ && &Apache::response::show_answer() )
+ {
+
+ $result = &display_foils_html(
+ $whichfoils, $target, $direction, $part, $solved, 1);
+
+ # other html
+ } elsif ($target ne 'tex') {
+ $result = &display_foils_html($whichfoils, $target, $direction, $part,
+ 0, 0);
+
+ # LaTeX rendering:
} else {
- my @alphabet = ('A'..'Z');
- my $i = 0;
- my $temp=0;
- my $id=$Apache::inputtags::response['-1'];
- my $part=$Apache::inputtags::part;
- my $lastresponse=$Apache::lonhomework::history{"resource.$part.$id.submission"};
- my %lastresponse=&Apache::lonnet::str2hash($lastresponse);
- if ($target ne 'tex' && $direction eq 'horizontal') {
- $result.="
";
- }
- foreach my $name (@whichfoils) {
- if ($target ne 'tex') {
- if ($direction eq 'horizontal') {
- $result.="