version 1.249.4.1, 2012/01/16 11:54:37
|
version 1.250, 2012/02/01 17:35:24
|
Line 36 use Apache::lonnet;
|
Line 36 use Apache::lonnet;
|
use Apache::lonmsg(); |
use Apache::lonmsg(); |
use Apache::response(); |
use Apache::response(); |
use Storable qw(dclone); |
use Storable qw(dclone); |
use Apache::lonnet; |
|
|
|
BEGIN { |
BEGIN { |
&Apache::lonxml::register('Apache::caparesponse',('numericalresponse','stringresponse','formularesponse')); |
&Apache::lonxml::register('Apache::caparesponse',('numericalresponse','stringresponse','formularesponse')); |
Line 44 BEGIN {
|
Line 43 BEGIN {
|
|
|
my %answer; |
my %answer; |
my @answers; |
my @answers; |
my @alphabet=('A'..'Z'); |
|
|
|
sub get_answer { return %answer; }; |
sub get_answer { return %answer; }; |
sub push_answer{ push(@answers,dclone(\%answer)); undef(%answer) } |
sub push_answer{ push(@answers,dclone(\%answer)); undef(%answer) } |
sub pop_answer { %answer = %{pop(@answers)}; }; |
sub pop_answer { %answer = %{pop(@answers)}; }; |
Line 296 sub start_numericalresponse {
|
Line 293 sub start_numericalresponse {
|
} elsif ($token->[1] eq 'formularesponse') { |
} elsif ($token->[1] eq 'formularesponse') { |
$constructtag=&Apache::edit::get_new_args($token,$parstack, |
$constructtag=&Apache::edit::get_new_args($token,$parstack, |
$safeeval,'answer', |
$safeeval,'answer', |
'samples','preproces'); |
'samples','preprocess'); |
} |
} |
if ($constructtag) { |
if ($constructtag) { |
$result = &Apache::edit::rebuild_tag($token); |
$result = &Apache::edit::rebuild_tag($token); |
Line 614 sub end_numericalresponse {
|
Line 611 sub end_numericalresponse {
|
my $number_of_bubbles = scalar(@{ $bubble_values }); |
my $number_of_bubbles = scalar(@{ $bubble_values }); |
my $unit=&Apache::lonxml::get_param_var('unit',$parstack, |
my $unit=&Apache::lonxml::get_param_var('unit',$parstack, |
$safeeval); |
$safeeval); |
|
my @alphabet=('A'..'Z'); |
if ($target eq 'web') { |
if ($target eq 'web') { |
if ($tag eq 'numericalresponse') { |
if ($tag eq 'numericalresponse') { |
if ($unit=~/\S/) {$result.=' (in '.$unit.')<br /><br />';} |
if ($unit=~/\S/) {$result.=' (in '.$unit.')<br /><br />';} |
Line 636 sub end_numericalresponse {
|
Line 634 sub end_numericalresponse {
|
$result.=' \textit{(in} \verb|'.$unit.'|\textit{)} '; |
$result.=' \textit{(in} \verb|'.$unit.'|\textit{)} '; |
} |
} |
if ($tag eq 'numericalresponse') { |
if ($tag eq 'numericalresponse') { |
$result .= &make_latex_bubbles($bubble_values, $bubble_display); |
my ($celllength,$number_of_tables,@table_range)= |
|
&get_table_sizes($number_of_bubbles,$bubble_display); |
|
my $j=0; |
|
my $cou=0; |
|
$result.='\vskip 2mm \noindent '; |
|
$result .= '\textbf{'.$Apache::lonxml::counter.'.} \vskip -3mm '; |
|
|
|
for (my $i=0;$i<$number_of_tables;$i++) { |
|
if ($i == 0) { |
|
$result .= '\vskip -1mm '; |
|
} else { |
|
$result .= '\vskip 1mm '; |
|
} |
|
$result.='\noindent \setlength{\tabcolsep}{2 mm}\hskip 2pc\begin{tabular}{'; |
|
for (my $ind=0;$ind<$table_range[$j];$ind++) { |
|
$result.='p{3 mm}p{'.$celllength.' mm}'; |
|
} |
|
$result.='}'; |
|
for (my $ind=$cou;$ind<$cou+$table_range[$j];$ind++) { |
|
$result.='\hskip -4 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$ & \hskip -3 mm {\small '.$bubble_display->[$ind].'} '; |
|
if ($ind != $cou+$table_range[$j]-1) {$result.=' & ';} |
|
} |
|
$cou += $table_range[$j]; |
|
$j++; |
|
$result.='\\\\\end{tabular}\vskip 0 mm '; |
|
} |
} else { |
} else { |
$increment = &Apache::response::repetition(); |
$increment = &Apache::response::repetition(); |
} |
} |
Line 894 sub get_table_sizes {
|
Line 917 sub get_table_sizes {
|
my ($number_of_bubbles,$rbubble_values)=@_; |
my ($number_of_bubbles,$rbubble_values)=@_; |
my $scale=2; #mm for one digit |
my $scale=2; #mm for one digit |
my $cell_width=0; |
my $cell_width=0; |
&Apache::lonnet::logthis("textwidth envvar: " . $env{'form.textwidth'}); |
|
foreach my $member (@$rbubble_values) { |
foreach my $member (@$rbubble_values) { |
my $cell_width_real=0; |
my $cell_width_real=0; |
if ($member=~/(\+|-)?(\d*)\.?(\d*)\s*\$?\\times\s*10\^{(\+|-)?(\d+)}\$?/) { |
if ($member=~/(\+|-)?(\d*)\.?(\d*)\s*\$?\\times\s*10\^{(\+|-)?(\d+)}\$?/) { |
Line 1057 sub make_numerical_bubbles {
|
Line 1079 sub make_numerical_bubbles {
|
return (\@bubble_values,\@bubble_display,$correct); |
return (\@bubble_values,\@bubble_display,$correct); |
} |
} |
|
|
## |
|
# Produce LaTeX bubbles given a set of bubble values: |
|
# |
|
# @param bubble_values - reference to an array of bubble 'values' |
|
# @param bubble_display - reference to the array of texts to display to the user |
|
# for each bubble_value (this is mostly for numerical response |
|
# when the displayed value may not be an exact |
|
# representation of the bubble value. |
|
# |
|
# @return string - the LaTeX fragment that produces the bubbles. |
|
# |
|
sub make_latex_bubbles { |
|
my ($bubble_values, $bubble_display) = @_; |
|
my $result; |
|
|
|
my $number_of_bubbles = scalar(@{$bubble_values}); |
|
|
|
# Get the number of rows and columns in each row of the bubble |
|
# table: |
|
|
|
my ($celllength, $number_of_tables, @table_range) = |
|
&get_table_sizes($number_of_bubbles, $bubble_display); |
|
|
|
my $j=0; |
|
my $cou=0; |
|
$result.='\vskip 2mm \noindent '; |
|
$result .= '\textbf{'.$Apache::lonxml::counter.'.} \vskip -3mm '; |
|
|
|
for (my $i=0;$i<$number_of_tables;$i++) { |
|
if ($i == 0) { |
|
$result .= '\vskip -1mm '; |
|
} else { |
|
$result .= '\vskip 1mm '; |
|
} |
|
$result.='\noindent \setlength{\tabcolsep}{2 mm}\hskip 2pc\begin{tabular}{'; |
|
for (my $ind=0;$ind<$table_range[$j];$ind++) { |
|
$result.='p{3 mm}p{'.$celllength.' mm}'; |
|
} |
|
$result.='}'; |
|
for (my $ind=$cou;$ind<$cou+$table_range[$j];$ind++) { |
|
$result.='\hskip -4 mm {\small \textbf{'.$alphabet[$ind].'}}$\bigcirc$ & \hskip -3 mm {\small '.$bubble_display->[$ind].'} '; |
|
if ($ind != $cou+$table_range[$j]-1) {$result.=' & ';} |
|
} |
|
$cou += $table_range[$j]; |
|
$j++; |
|
$result.='\\\\\end{tabular}\vskip 0 mm '; |
|
} |
|
return $result; |
|
} |
|
|
|
sub get_tolrange { |
sub get_tolrange { |
my ($ans,$tol)=@_; |
my ($ans,$tol)=@_; |
my ($high,$low); |
my ($high,$low); |