--- loncom/xml/londefdef.pm 2006/01/12 23:48:00 1.313 +++ loncom/xml/londefdef.pm 2006/02/15 11:57:44 1.320 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.313 2006/01/12 23:48:00 foxr Exp $ +# $Id: londefdef.pm,v 1.320 2006/02/15 11:57:44 foxr Exp $ # # # Copyright Michigan State University Board of Trustees @@ -105,11 +105,21 @@ sub start_m { $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]); #&Apache::lonxml::debug("M is evaulated to:$inside:"); } + my $tex = $inside; my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval); $currentstring = &Apache::lontexconvert::converted(\$inside,$display); if ($Apache::lontexconvert::errorstring) { - &Apache::lonxml::warning("tth error: ". - $Apache::lontexconvert::errorstring); + my $errormsg='
'.&HTML::Entities::encode($Apache::lontexconvert::errorstring,'<>&"').'occured while attempting to convert this TeX:
'; + $tex = &HTML::Entities::encode($tex,'<>&"'); + my ($linenumber) = + ($Apache::lontexconvert::errorstring =~ /Line (\d+)/); + if (defined($linenumber)) { + my @tex=split("\n",$tex); + $tex[$linenumber]=''. + $tex[$linenumber].''; + $tex=join("\n",@tex); + } + &Apache::lonxml::warning($errormsg.$tex.''); $Apache::lontexconvert::errorstring=''; } #&Apache::lonxml::debug("M is ends with:$currentstring:"); @@ -619,9 +629,6 @@ sub end_center { $currentstring = $token->[2]; } elsif ($target eq 'tex') { $currentstring = '\end{center}'; - if (&is_inside_of($tagstack, "table")) { - $currentstring .= ¢er_correction(); - } } return $currentstring; } @@ -1195,7 +1202,6 @@ sub start_p { $closing_string = '\end{center}'; if (&is_inside_of($tagstack, "table")) { $currentstring = ¢er_correction().$currentstring; - $closing_string .= ¢er_correction(); } } elsif ($align eq 'right') { $currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{'; @@ -1206,7 +1212,7 @@ sub start_p { } else { $currentstring.='\par '; if (&is_inside_of($tagstack, 'table')) { - $closing_string = '\vskip 12pt'; # Safer in tables. + $closing_string = '\vskip 0pt'; # Seems to be consistent with
in tables. } else { $closing_string = '\strut\\\\\strut '; } @@ -1544,7 +1550,6 @@ sub start_div { $endstring = '\end{center}'; if (&is_inside_of($tagstack, "table")) { $currentstring = ¢er_correction().$currentstring; - $endstring .= ¢er_correction(); } } elsif ($align eq 'right') { @@ -1985,7 +1990,12 @@ sub start_table { $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100; } else { $Apache::londefdef::table[-1]{'width'}=$TeXwidth; - } + } + # In the end, however the table width cannot be wider than $textwidth... + + if ($Apache::londefdef::table[-1]{'width'} > $textwidth) { + $Apache::londefdef::table[-1]{'width'} = $textwidth; + } #table's border my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); @@ -2029,7 +2039,7 @@ sub end_table { my $inmemory = ''; my $output = ''; my $WARNING=''; - # &debug_dump_table($Apache::londefdef::table[-1]); + &debug_dump_table($Apache::londefdef::table[-1]); #width of columns from TeXwidth attributes for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { @@ -2216,18 +2226,26 @@ sub end_table { for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { my $have_rowspan = 0; for (my $jn=0;$jn<=$#fwidth;$jn++) { + + #----------------------------------------------------------- + # I think this order of doing things will ensure that + # single rowspan, columspan and combined row/colspans will + # work correctly. LaTeX is delicate here. + # RF. + + # Start a rowspan if necessary: + + my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn]; + my $colspan = $Apache::londefdef::table[-1]{'colspan'}[$in][$jn]; # # Do the appropriate magic if this has a colspan # - my $colspan = $Apache::londefdef::table[-1]{'colspan'}[$in][$jn]; + if ($colspan > 1) { $output .= '\multicolumn{'. $colspan .'}{|l|}{'; } - my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn]; - - # Start a rowspan if necessary: if ($rowspan > 1) { $have_rowspan++; @@ -2236,6 +2254,7 @@ sub end_table { if (($rowspan eq '^') || ($rowspan eq '_')) { $have_rowspan++; } + #-------------------------------------------------------------- if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { $output.=¢er_correction().'\begin{center}'; @@ -2244,7 +2263,7 @@ sub end_table { } $output.=$Apache::londefdef::table[-1]{'content'}[$in][$jn]; if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { - $output.='\end{center}'.¢er_correction(); + $output.='\end{center}'; } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { $output.='} '; } @@ -2270,9 +2289,11 @@ sub end_table { $output .= ' \\\\ '; for (my $jn=0; $jn<=$#fwidth;$jn++) { my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn]; - if (($rowspan <= 1) || ($rowspan eq '_')) { - my $column = $jn+1; - $output .= '\cline{'.$column.'-'.$column.'} '; + if ($rowspan ne "^") { + if (($rowspan <= 1) || ($rowspan eq '_')) { + my $column = $jn+1; + $output .= '\cline{'.$column.'-'.$column.'} '; + } } } @@ -2442,6 +2463,13 @@ sub end_td_tex { $Apache::londefdef::table[-1]{'counter_columns'} = $current_column; + # Get the column and row spans. + # Colspan can be done via \multicolumn if I can figure out the data structs. + + my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 0); + if (!$colspan) { + $colspan = 1; + } my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 0); if (!$rowspan) { @@ -2450,11 +2478,13 @@ sub end_td_tex { - $Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] = $rowspan; - for (my $i = 1; $i < $rowspan; $i++) { - $Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column] = '^'; - if ($i == ($rowspan-1)) { - $Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column] = '_'; + for (my $c = 0; $c < $colspan; $c++) { + $Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column+$c] = $rowspan; + for (my $i = 1; $i < $rowspan; $i++) { + $Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column+$c] = '^'; + if ($i == ($rowspan-1)) { + $Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column+$c] = '_'; + } } } @@ -2549,13 +2579,7 @@ sub end_td_tex { push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data; - # Get the column and row spans. - # Colspan can be done via \multicolumn if I can figure out the data structs. - my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 0); - if (!$colspan) { - $colspan = 1; - } # the colspan array will indicate how many columns will be spanned by this @@ -2564,14 +2588,16 @@ sub end_td_tex { # counter_columns is incremented in the start_td_tex, we adjust by colspan-1. # - $Apache::londefdef::table[-1]{'colspan'}[$current_row][$current_column] = $colspan; $Apache::londefdef::table[-1]{'counter_columns'} += $colspan -1; - - # Put empty text in spanned cols. - for (my $i = 0; $i < ($colspan -1); $i++) { push @ {$Apache::londefdef::table[-1]{'content'}[-1] },''; } + for (my $r = 0; $r < $rowspan; $r++) { + $Apache::londefdef::table[-1]{'colspan'}[$current_row+$r][$current_column] = $colspan; + # Put empty text in spanned cols. + + } + return ''; @@ -3169,6 +3195,7 @@ sub start_pre { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { $currentstring .= '\begin{verbatim}'; + &Apache::lonxml::disable_LaTeX_substitutions(); } return $currentstring; } @@ -3180,6 +3207,7 @@ sub end_pre { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { $currentstring .= '\end{verbatim}'; + &Apache::lonxml::enable_LaTeX_substitutions(); } return $currentstring; }