--- loncom/xml/londefdef.pm 2005/12/01 18:46:17 1.299
+++ loncom/xml/londefdef.pm 2006/01/03 23:41:52 1.307
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Tags Default Definition Module
#
-# $Id: londefdef.pm,v 1.299 2005/12/01 18:46:17 albertel Exp $
+# $Id: londefdef.pm,v 1.307 2006/01/03 23:41:52 foxr Exp $
#
#
# Copyright Michigan State University Board of Trustees
@@ -48,7 +48,7 @@ use Apache::lonmenu();
use Apache::lonmeta();
use Apache::Constants qw(:common);
use File::Basename;
-#use Data::Dumper;
+# use Data::Dumper;
BEGIN {
@@ -68,10 +68,8 @@ BEGIN {
# for ($row =0; $row <= $lastrow; $row++ ) {
# my $text = Dumper($Apache::londefdef::table[$row]);
# &Apache::lonnet::logthis("table [ $row ]".$text);
-#
# }
#}
-
sub initialize_londefdef {
$Apache::londefdef::TD_redirection=0;
@Apache::londefdef::table = ();
@@ -175,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}'.
@@ -2003,6 +2002,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++) {
@@ -2187,7 +2187,29 @@ 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
+ #
+ 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++;
+ $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}';
@@ -2201,9 +2223,37 @@ sub end_table {
} 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) {
+ $output .= '}';
+ $jn += $colspan-1; # Adjust for number of rows really left.
+ }
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 ';
@@ -2218,9 +2268,9 @@ sub end_table {
my $min_nested_width = 0;
my $max_nested_width = 0;
for (my $col = 0; $col <= $Apache::londefdef::table[-1]{'counter_columns'}; $col++) {
-
$min_nested_width += $min_len[$col];
$max_nested_width += $max_len[$col];
+
}
# Fudge in an extra 5 mm for borders etc:
@@ -2262,6 +2312,10 @@ sub start_tr {
push @ {$Apache::londefdef::table[-1]{'rows'} }, 'l';
}
push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'});
+ #
+ # Need to save the number of table columns to preserve the max # columns.
+ #
+ $Apache::londefdef::table[-1]{'prior_columns'} = $Apache::londefdef::table[-1]{'counter_columns'};
$Apache::londefdef::table[-1]{'counter_columns'} = -1;
push @ {$Apache::londefdef::table[-1]{'TeXlen'}}, [];
push @ {$Apache::londefdef::table[-1]{'objectlen'}}, [];
@@ -2281,6 +2335,11 @@ sub end_tr {
if ($Apache::londefdef::TD_redirection) {
&end_td_tex($parstack,$parser,$safeeval);
}
+ # Counter columns must be the maximum number of columns seen
+ # in the table so far so:
+ if ($Apache::londefdef::table[-1]{'prior_columns'} > $Apache::londefdef::table[-1]{'counter_columns'}) {
+ $Apache::londefdef::table[-1]{'counter_columns'} = $Apache::londefdef::table[-1]{'prior_columns'};
+ }
@@ -2338,8 +2397,42 @@ sub start_td_tex {
sub end_td_tex {
my ($parstack,$parser,$safeeval) = @_;
- my $current_row = $Apache::londefdef::table[-1]{'row_number'};
- my $data=&Apache::lonxml::endredirection();
+ my $current_row = $Apache::londefdef::table[-1]{'row_number'};
+ my $current_column = $Apache::londefdef::table[-1]{'counter_columns'};
+ my $data = &Apache::lonxml::endredirection();
+
+ # 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] =~ /[\^\_]/)) {
+ # Part of a span.
+ push @ {$Apache::londefdef::table[-1]{'content'}[-1]}, '';
+ $current_column++;
+ }
+ $Apache::londefdef::table[-1]{'counter_columns'} = $current_column;
+
+
+
+ my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 0);
+ if (!$rowspan) {
+ $rowspan = 1;
+ }
+
+
+
+ $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);
if (defined $TeXwidth) {
push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
@@ -2416,16 +2509,47 @@ sub end_td_tex {
push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;
}
}
- for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {
- my $nested = $Apache::londefdef::table[-1]{'include'}[$in];
- &Apache::lonnet::logthis("Nested: $nested");
- $nested =~ s/\\end\{tabular\}\\strut\\\\/\\end\{tabular\}/;
- &Apache::lonnet::logthis("After sub: $nested");
- # $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
- $data =~ s/\\keephidden\{NEW TABLE ENTRY\}/$nested/;
- }
+ # Substitute all of the tables nested in this cell in their appropriate places.
+
+
+ my $nested_count = $#{$Apache::londefdef::table[-1]{'include'}}; # This one is constant...
+ for (my $in=0; $in<=$nested_count; $in++) {
+ my $nested = shift @{$Apache::londefdef::table[-1]{'include'}};
+ $nested =~ s/\\end\{tabular\}\\strut\\\\/\\end\{tabular\}/;
+ # $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
+ $data =~ s/\\keephidden\{NEW TABLE ENTRY\}/$nested/;
+
+ }
+ # Should be be killing off the 'include' elements as they're used up?
+
push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data;
- return'';
+
+ # 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
+ # cell..this requires that counter_columns also be adjusted accordingly
+ # so that the next bunch of text goes in the right cell. Note that since
+ # 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] },'';
+ }
+
+
+ return '';
}
sub end_td {