--- loncom/xml/londefdef.pm 2005/12/20 23:12:03 1.304 +++ loncom/xml/londefdef.pm 2006/02/05 18:32:40 1.319 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.304 2005/12/20 23:12:03 foxr Exp $ +# $Id: londefdef.pm,v 1.319 2006/02/05 18:32:40 albertel Exp $ # # # Copyright Michigan State University Board of Trustees @@ -68,7 +68,6 @@ BEGIN { # for ($row =0; $row <= $lastrow; $row++ ) { # my $text = Dumper($Apache::londefdef::table[$row]); # &Apache::lonnet::logthis("table [ $row ]".$text); -# # } #} sub initialize_londefdef { @@ -106,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:"); @@ -174,11 +183,12 @@ sub start_html { if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) { $currentstring = &Apache::lonxml::xmlbegin(); } elsif ($target eq 'tex') { - $currentstring .= '\documentclass[letterpaper]{article}'; + $currentstring .= '\documentclass[letterpaper,twoside]{article}'; if (($env{'form.latex_type'}=~'batchmode') || (!$env{'request.role.adv'})) {$currentstring .='\batchmode';} $currentstring .= '\newcommand{\keephidden}[1]{}'. '\renewcommand{\deg}{$^{\circ}$}'. + '\usepackage{multirow}'. '\usepackage{longtable}'. '\usepackage{textcomp}'. '\usepackage{makeidx}'. @@ -594,20 +604,26 @@ sub end_body { return $currentstring; } +# \begin{center} causes a new paragprah spacing that looks odd inside +# of a table cell +sub center_correction { return '\vspace*{-6 mm}'; } #--
in tables. + } else { + $closing_string = '\strut\\\\\strut '; + } } } @@ -1524,6 +1548,9 @@ sub start_div { if ($align eq 'center') { $currentstring .= '\begin{center}'; $endstring = '\end{center}'; + if (&is_inside_of($tagstack, "table")) { + $currentstring = ¢er_correction().$currentstring; + } } elsif ($align eq 'right') { $currentstring .= '\begin{flushright}'; @@ -1944,11 +1971,16 @@ sub start_table { # width either comes forced from the TeXwidth or the width parameters. # in either case it can be a percentage or absolute width. - + # in the width case we ignore absolute width my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); - if (not defined $TeXwidth) { - $TeXwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1); - + if (!defined($TeXwidth)) { + my $htmlwidth = &Apache::lonxml::get_param('width',$parstack, + $safeeval,undef,1); + if ($htmlwidth =~ /%/) { + $TeXwidth = $htmlwidth; + } else { + $TeXwidth = $textwidth; + } } else { $Apache::londefdef::table[-1]{'forcedtablewidth'} = 1; } @@ -1958,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); @@ -2002,6 +2039,7 @@ sub end_table { my $inmemory = ''; my $output = ''; my $WARNING=''; + # &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++) { @@ -2186,6 +2224,7 @@ sub end_table { $header_of_table .= '}'; #fill the table for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { + my $have_rowspan = 0; for (my $jn=0;$jn<=$#fwidth;$jn++) { # # Do the appropriate magic if this has a colspan @@ -2196,19 +2235,34 @@ sub end_table { $colspan .'}{|l|}{'; } + my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn]; + + # Start a rowspan if necessary: + + if ($rowspan > 1) { + $have_rowspan++; + $output .= '\multirow{'.$rowspan.'}[0]{'.$fwidth[$jn].'mm}{'; + } + if (($rowspan eq '^') || ($rowspan eq '_')) { + $have_rowspan++; + } + if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { - # $output.='\vspace*{-6 mm}\begin{center}'; - $output.='\begin{center}'; + $output.=¢er_correction().'\begin{center}'; } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { $output.=' \hfill \llap{' } $output.=$Apache::londefdef::table[-1]{'content'}[$in][$jn]; if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { - # $output.='\end{center}\vspace*{-6 mm}'; $output.='\end{center}'; } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { $output.='} '; } + # Close off any open multirow: + + if ($rowspan > 1) { + $output .= '}'; + } # Close off the colspan... # if ($colspan > 1) { @@ -2217,7 +2271,24 @@ sub end_table { } if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};} } - $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' '; + # If have_rowspan > 0, and borders are on, then + # we need to do more than put an \hline at the bottom of row. + # we need to do the appropriate \cline to ensure that + # the spanned rows don't have \hlines through them. + + if (($Apache::londefdef::table[-1]{'hinc'} =~ /\\hline/) && $have_rowspan) { + $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.'} '; + } + } + + } else { + $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' '; + } } # Note that \newline destroys alignment env's produced by e.g.