--- loncom/xml/londefdef.pm 2005/12/23 00:12:32 1.305
+++ loncom/xml/londefdef.pm 2006/01/12 23:48:00 1.313
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.305 2005/12/23 00:12:32 foxr Exp $
+# $Id: londefdef.pm,v 1.313 2006/01/12 23:48:00 foxr Exp $
#
#
# Copyright Michigan State University Board of Trustees
@@ -173,11 +173,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}'.
@@ -593,25 +594,34 @@ 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}'; }
#--
tag (end tag required)
sub start_center {
- my ($target,$token) = @_;
+ my ($target,$token,$tagstack) = @_;
my $currentstring = &end_p(); # Close off any prior para.
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring .= ¢er_correction();
+ }
$currentstring .= '\begin{center}';
}
return $currentstring;
}
sub end_center {
- my ($target,$token) = @_;
+ my ($target,$token,$tagstack) = @_;
my $currentstring = '';
if ($target eq 'web') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
$currentstring = '\end{center}';
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring .= ¢er_correction();
+ }
}
return $currentstring;
}
@@ -1177,11 +1187,16 @@ sub start_p {
$closing_string = ''; # Deal correctly with e.g.
}
} elsif ($target eq 'tex' && !$para_disabled) {
+
$currentstring .= &end_p(); # close off prior para if in progress.
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
if ($align eq 'center') {
$currentstring .='\begin{center}\par';
$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{';
$closing_string= '}}';
@@ -1190,7 +1205,11 @@ sub start_p {
$closing_string = '}\hfill}';
} else {
$currentstring.='\par ';
- $closing_string = '\strut\\\\\strut ';
+ if (&is_inside_of($tagstack, 'table')) {
+ $closing_string = '\vskip 12pt'; # Safer in tables.
+ } else {
+ $closing_string = '\strut\\\\\strut ';
+ }
}
}
@@ -1523,6 +1542,10 @@ sub start_div {
if ($align eq 'center') {
$currentstring .= '\begin{center}';
$endstring = '\end{center}';
+ if (&is_inside_of($tagstack, "table")) {
+ $currentstring = ¢er_correction().$currentstring;
+ $endstring .= ¢er_correction();
+ }
}
elsif ($align eq 'right') {
$currentstring .= '\begin{flushright}';
@@ -1943,11 +1966,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;
}
@@ -2186,6 +2214,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 +2225,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}';
+ $output.='\end{center}'.¢er_correction();
} 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 +2261,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.
# $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut ';
@@ -2368,11 +2429,12 @@ sub end_td_tex {
# The rowspan array of the table indicates which cells are part of a span.
# n indicates the start of a span set of n rows.
# ^ indicates a cell that continues a span set.
+ # _ indicates the cell is at the bottom of a span set.
# If this and subsequent cells are part of a rowspan, we must
# push along the row until we find one that is not.
while ((defined $Apache::londefdef::table[-1]{'rowspan'}[$current_row] [$current_column])
- && $Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] eq '^') {
+ && ($Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] =~ /[\^\_]/)) {
# Part of a span.
push @ {$Apache::londefdef::table[-1]{'content'}[-1]}, '';
$current_column++;
@@ -2391,6 +2453,9 @@ 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] = '_';
+ }
}
my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
@@ -2705,11 +2770,7 @@ sub start_img {
$safeeval,
undef,1));
if(!$align) {
- if (&is_inside_of($tagstack, "table")) {
- $align = "right"; # Force wraptext use.
- } else {
$align = "bottom"; # This is html's default so it's ours too.
- }
}
#
&Apache::lonxml::debug("Alignemnt = $align");
@@ -2724,11 +2785,17 @@ sub start_img {
$parstack,
$safeeval,
undef,0);
- &Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
+ # &Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
if(!$latex_rendering) {
- $latex_rendering = "texwrap";
+ $latex_rendering = "texwrap";
+ }
+ # using texwrap inside a table does not work. So, if after all of this,
+ # texwrap is on, we turn it off if we detect we're in a table:
+ #
+ if (($latex_rendering eq 'texwrap') && &is_inside_of($tagstack, "table")) {
+ $latex_rendering = 'parpic';
}
- &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
+ # &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
#if original gif/jpg/png file exist do following:
my $origsrc=$src;