--- loncom/xml/londefdef.pm	2004/04/15 19:08:31	1.210
+++ loncom/xml/londefdef.pm	2004/08/16 17:11:10	1.232
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.210 2004/04/15 19:08:31 albertel Exp $
+# $Id: londefdef.pm,v 1.232 2004/08/16 17:11:10 sakharuk Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -154,26 +154,32 @@ sub start_html {
 	    &Apache::lonxml::fontsettings();     
     } elsif ($target eq 'tex') {
 	@Apache::londefdef::table = ();
-	$currentstring .= '\documentclass[letterpaper]{article}';
+	$currentstring .= '\documentclass[letterpaper]{book}';
 	if ($ENV{'form.latex_type'}=~'batchmode') {$currentstring .='\batchmode';} 
-	$currentstring .= '\newcommand{\keephidden}[1]{}
-                           \renewcommand{\deg}{$^{\circ}$}
-                           \usepackage{longtable}
-                           \usepackage{textcomp}
-                           \usepackage{makeidx}
-                           \usepackage[dvips]{graphicx}
-                           \usepackage{epsfig}\usepackage{calc}
-\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}
-\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}';
+	$currentstring .= '\newcommand{\keephidden}[1]{}'.
+                          '\renewcommand{\deg}{$^{\circ}$}'.
+                          '\usepackage{longtable}'.
+                          '\usepackage{textcomp}'.
+                          '\usepackage{makeidx}'.
+                          '\usepackage[dvips]{graphicx}'.
+                          '\usepackage{epsfig}'.
+                          '\usepackage{calc}'.
+                          '\usepackage{amsmath}'.
+                          '\usepackage{amssymb}'.
+                          '\usepackage{amsfonts}'.
+                          '\usepackage{amsthm}'.
+                          '\usepackage{amscd}'.
+                          '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'.
+                          '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}';
     }
     return $currentstring;
 }
 
 sub end_html {
-    my ($target,$token) = @_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
-	$currentstring = &Apache::lonxml::xmlend();
+	$currentstring = &Apache::lonxml::xmlend($target,$parser);
     }
     return $currentstring;
 }
@@ -633,7 +639,7 @@ sub start_h1 {
     } elsif ($target eq 'tex') {
 	my $pre;
 	my $align=lc(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1));
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $pre='\begin{center}';
 	} elsif ($align eq 'left') {
 	    $pre='\rlap{';
@@ -656,9 +662,9 @@ sub end_h1 {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	my $post;
+	my $post='\vskip 0 mm ';
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $post='\end{center}';
 	} elsif ($align eq 'left') {
 	    $post='} \hfill'.'\vskip 0 mm ';
@@ -682,7 +688,7 @@ sub start_h2 {
     } elsif ($target eq 'tex') {
 	my $pre;
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $pre='\begin{center}';
 	} elsif ($align eq 'left') {
 	    $pre='\rlap{';
@@ -702,9 +708,9 @@ sub end_h2 {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	my $post;
+	my $post='\vskip 0 mm ';
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $post='\end{center}';
 	} elsif ($align eq 'left') {
 	    $post='} \hfill'.'\vskip 0 mm ';
@@ -725,7 +731,7 @@ sub start_h3 {
     } elsif ($target eq 'tex') {
 	my $pre;
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $pre='\begin{center}';
 	} elsif ($align eq 'left') {
 	    $pre='\rlap{';
@@ -745,9 +751,9 @@ sub end_h3 {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	my $post;
+	my $post='\vskip 0 mm ';
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $post='\end{center}';
 	} elsif ($align eq 'left') {
 	    $post='} \hfill'.'\vskip 0 mm ';
@@ -768,7 +774,7 @@ sub start_h4 {
     } elsif ($target eq 'tex') {
 	my $pre;
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $pre='\begin{center}';
 	} elsif ($align eq 'left') {
 	    $pre='\rlap{';
@@ -788,9 +794,9 @@ sub end_h4 {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	my $post;
+	my $post='\vskip 0 mm ';
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $post='\end{center}';
 	} elsif ($align eq 'left') {
 	    $post='} \hfill'.'\vskip 0 mm ';
@@ -811,7 +817,7 @@ sub start_h5 {
     } elsif ($target eq 'tex') {
 	my $pre;
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $pre='\begin{center}';
 	} elsif ($align eq 'left') {
 	    $pre='\rlap{';
@@ -831,9 +837,9 @@ sub end_h5 {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	my $post;
+	my $post='\vskip 0 mm ';
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $post='\end{center}';
 	} elsif ($align eq 'left') {
 	    $post='} \hfill'.'\vskip 0 mm ';
@@ -854,7 +860,7 @@ sub start_h6 {
     } elsif ($target eq 'tex') {
 	my $pre;
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $pre='\begin{center}';
 	} elsif ($align eq 'left') {
 	    $pre='\rlap{';
@@ -874,9 +880,9 @@ sub end_h6 {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	my $post;
+	my $post='\vskip 0 mm ';
 	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	if (($align eq 'center') || (not defined $align)) {
+	if ($align eq 'center') {
 	    $post='\end{center}';
 	} elsif ($align eq 'left') {
 	    $post='} \hfill'.'\vskip 0 mm ';
@@ -1110,7 +1116,9 @@ sub start_p {
 	    $currentstring='\makebox['.$ENV{'form.textwidth'}.']{\hfill\llap{';
 	} elsif ($align eq 'left') {
 	    $currentstring='\noindent\makebox['.$ENV{'form.textwidth'}.']{\rlap{';
-	}
+	} else {
+            $currentstring='\par ';
+        }
 	my $signal=1;#<p> does not work inside <b>...</b> 
 	foreach my $tag (@$tagstack) {if (lc($tag) eq 'b') {$signal=0;}
 	if (!$signal) {$currentstring = '';}
@@ -1125,15 +1133,13 @@ sub end_p {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	if ($$tagstack[-1] eq 'p') {
-	    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
-	    if ($align eq 'center') {		
-		$currentstring .= '\end{center}';
-	    } elsif ($align eq 'right') {
-		$currentstring .= '}}';
-	    } elsif ($align eq 'left') {
-		$currentstring .= '}\hfill}';
-	    }
+	my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
+	if ($align eq 'center') {		
+	    $currentstring .= '\end{center}';
+	} elsif ($align eq 'right') {
+	    $currentstring .= '}}';
+	} elsif ($align eq 'left') {
+	    $currentstring .= '}\hfill}';
 	}
     }
     return $currentstring;
@@ -1146,8 +1152,20 @@ sub start_br {
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	if ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') {
-	    $currentstring .= '\vskip 0.2 mm ';
+	my @tempo=@$tagstack;
+	my $signal=0;
+	for (my $i=$#tempo;$i>=0;$i--) {
+	    if (($tempo[$i] eq 'b') || ($tempo[$i] eq 'strong') ||
+                ($tempo[$i] eq 'ol') || ($tempo[$i] eq 'ul') ||
+                ($tempo[$i] eq 'td') || ($tempo[$i] eq 'th'))  {
+		$signal=1;
+		last;
+	    }
+	}
+	if ($signal) {
+	    $currentstring .= ' \vskip 0 mm ';
+	} elsif ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') {
+	    $currentstring .= '\strut \\\\ \strut ';
 	}
     }
     return $currentstring;
@@ -1523,22 +1541,22 @@ sub start_ul {
     } elsif ($target eq 'tex') {
 	my $TeXtype=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
 	if ($TeXtype eq 'disc') {
-	    $currentstring .= ' \renewcommand{\labelitemi}{$\bullet$}
-                                \renewcommand{\labelitemii}{$\bullet$} 
-                                \renewcommand{\labelitemiii}{$\bullet$}
-                                \renewcommand{\labelitemiv}{$\bullet$}';
+	    $currentstring .= '\renewcommand{\labelitemi}{$\bullet$}'.
+                              '\renewcommand{\labelitemii}{$\bullet$}'. 
+                              '\renewcommand{\labelitemiii}{$\bullet$}'.
+                              '\renewcommand{\labelitemiv}{$\bullet$}';
 	} elsif ($TeXtype eq 'circle') {
-	    $currentstring .= ' \renewcommand{\labelitemi}{$\circ$}
-                                \renewcommand{\labelitemii}{$\circ$} 
-                                \renewcommand{\labelitemiii}{$\circ$}
-                                \renewcommand{\labelitemiv}{$\circ$}';
+	    $currentstring .= '\renewcommand{\labelitemi}{$\circ$}'.
+                              '\renewcommand{\labelitemii}{$\circ$}'. 
+                              '\renewcommand{\labelitemiii}{$\circ$}'.
+                              '\renewcommand{\labelitemiv}{$\circ$}';
 	} elsif ($TeXtype eq 'square') {
-	    $currentstring .= ' \renewcommand{\labelitemi}{$\diamond$}
-                                \renewcommand{\labelitemii}{$\diamond$} 
-                                \renewcommand{\labelitemiii}{$\diamond$}
-                                \renewcommand{\labelitemiv}{$\diamond$}';
+	    $currentstring .= '\renewcommand{\labelitemi}{$\diamond$}'.
+                              '\renewcommand{\labelitemii}{$\diamond$}'. 
+                              '\renewcommand{\labelitemiii}{$\diamond$}'.
+                              '\renewcommand{\labelitemiv}{$\diamond$}';
 	}
-	$currentstring .= '\begin{itemize}';  
+	$currentstring .= '\strut \begin{itemize}';  
     } 
     return $currentstring;
 }
@@ -1549,10 +1567,10 @@ sub end_ul {
     if ($target eq 'web') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
-	$currentstring = '\end{itemize} \renewcommand{\labelitemi}{$\bullet$}
-                                \renewcommand{\labelitemii}{$\bullet$} 
-                                \renewcommand{\labelitemiii}{$\bullet$}
-                                \renewcommand{\labelitemiv}{$\bullet$}';  
+	$currentstring = '\end{itemize} \renewcommand{\labelitemi}{$\bullet$}'.
+                               '\renewcommand{\labelitemii}{$\bullet$}'. 
+                               '\renewcommand{\labelitemiii}{$\bullet$}'.
+                               '\renewcommand{\labelitemiv}{$\bullet$}\strut ';  
     } 
     return $currentstring;
 }
@@ -1612,32 +1630,32 @@ sub start_ol {
     } elsif ($target eq 'tex') {
 	my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
 	if ($type eq '1') {
-	    $currentstring .= ' \renewcommand{\labelenumi}{\arabic{enumi}.}
-                                \renewcommand{\labelenumii}{\arabic{enumii}.} 
-                                \renewcommand{\labelenumiii}{\arabic{enumiii}.}
-                                \renewcommand{\labelenumiv}{\arabic{enumiv}.}';
+	    $currentstring .= '\renewcommand{\labelenumi}{\arabic{enumi}.}'.
+                              '\renewcommand{\labelenumii}{\arabic{enumii}.}'. 
+                              '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.
+                              '\renewcommand{\labelenumiv}{\arabic{enumiv}.}';
 	} elsif ($type eq 'A') {
-	    $currentstring .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}
-                                \renewcommand{\labelenumii}{\Alph{enumii}.} 
-                                \renewcommand{\labelenumiii}{\Alph{enumiii}.}
-                                \renewcommand{\labelenumiv}{\Alph{enumiv}.}';
+	    $currentstring .= '\renewcommand{\labelenumi}{\Alph{enumi}.}'.
+                              '\renewcommand{\labelenumii}{\Alph{enumii}.}'. 
+                              '\renewcommand{\labelenumiii}{\Alph{enumiii}.}'.
+                              '\renewcommand{\labelenumiv}{\Alph{enumiv}.}';
 	} elsif ($type eq 'a') {
-	    $currentstring .= ' \renewcommand{\labelenumi}{\alph{enumi}.}
-                                \renewcommand{\labelenumii}{\alph{enumii}.}
-                                \renewcommand{\labelenumiii}{\alph{enumiii}.}
-                                \renewcommand{\labelenumiv}{\alph{enumiv}.} ';
+	    $currentstring .= '\renewcommand{\labelenumi}{\alph{enumi}.}'.
+                              '\renewcommand{\labelenumii}{\alph{enumii}.}'.
+                              '\renewcommand{\labelenumiii}{\alph{enumiii}.}'.
+                              '\renewcommand{\labelenumiv}{\alph{enumiv}.}';
 	} elsif ($type eq 'i') {
-	    $currentstring .= ' \renewcommand{\labelenumi}{\roman{enumi}.}
-                                \renewcommand{\labelenumii}{\roman{enumii}.}
-                                \renewcommand{\labelenumiii}{\roman{enumiii}.}
-                                \renewcommand{\labelenumiv}{\roman{enumiv}.} ';
+	    $currentstring .= '\renewcommand{\labelenumi}{\roman{enumi}.}'.
+                              '\renewcommand{\labelenumii}{\roman{enumii}.}'.
+                              '\renewcommand{\labelenumiii}{\roman{enumiii}.}'.
+                              '\renewcommand{\labelenumiv}{\roman{enumiv}.}';
 	} elsif ($type eq 'I') {
-	    $currentstring .= ' \renewcommand{\labelenumi}{\Roman{enumi}.}
-                                \renewcommand{\labelenumii}{\Roman{enumii}.}
-                                \renewcommand{\labelenumiii}{\Roman{enumiii}.}
-                                \renewcommand{\labelenumiv}{\Roman{enumiv}.} ';
+	    $currentstring .= '\renewcommand{\labelenumi}{\Roman{enumi}.}'.
+                              '\renewcommand{\labelenumii}{\Roman{enumii}.}'.
+                              '\renewcommand{\labelenumiii}{\Roman{enumiii}.}'.
+                              '\renewcommand{\labelenumiv}{\Roman{enumiv}.}';
 	}
-	$currentstring .= '\begin{enumerate}';  
+	$currentstring .= '\strut \begin{enumerate}';  
     } 
     return $currentstring;
 }
@@ -1648,10 +1666,10 @@ sub end_ol {
     if ($target eq 'web') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
-	$currentstring = '\end{enumerate} \renewcommand{\labelenumi}{\arabic{enumi}.}
-                                          \renewcommand{\labelenumii}{\arabic{enumii}.}
-                                          \renewcommand{\labelenumiii}{\arabic{enumiii}.}
-                                          \renewcommand{\labelenumiv}{\arabic{enumiv}.}';  
+	$currentstring = '\end{enumerate}\renewcommand{\labelenumi}{\arabic{enumi}.}'.
+                                        '\renewcommand{\labelenumii}{\arabic{enumii}.}'.
+                                        '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.
+                                        '\renewcommand{\labelenumiv}{\arabic{enumiv}.}\strut ';  
     } 
     return $currentstring;
 }
@@ -1775,8 +1793,7 @@ sub start_table {
 	my $aa = {};
 	push @Apache::londefdef::table, $aa; 
 	$Apache::londefdef::table[-1]{'row_number'} = -1;
-        #table's width 
-        #default coincides with text line length
+        #maximum table's width (default coincides with text line length)
 	if ($#Apache::londefdef::table==0) {
 	    $textwidth=&recalc($ENV{'form.textwidth'}); #result is always in mm
 	    $textwidth=~/(\d+\.?\d*)/;
@@ -1787,7 +1804,7 @@ sub start_table {
 		$textwidth=$Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}]; 
 	    } else {
               #try to use all space not used before (minus 5% for LaTeX table internal) - rather silly
-		my $textwidth=$Apache::londefdef::table[-2]{'width'};
+		$textwidth=$Apache::londefdef::table[-2]{'width'};
 		for (my $i=0;$i<$Apache::londefdef::table[-2]{'counter_columns'};$i++) {
 		    $textwidth=$textwidth-$Apache::londefdef::table[-2]{'TeXlen'}[0][$i];
 		}
@@ -1808,6 +1825,7 @@ sub start_table {
 	    $TeXwidth=~/(\d+)/;
             $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
 	} else {
+	    $Apache::londefdef::table[-1]{'forcetablewidth'}=1;
 	    $Apache::londefdef::table[-1]{'width'}=$TeXwidth;
 	}        
         #table's border
@@ -1824,11 +1842,12 @@ sub start_table {
 	    $Apache::londefdef::table[-1]{'vvinc'} = '';
 	}
 	if ($#Apache::londefdef::table==0) {
-	    $Apache::londefdef::table[-1]{'output'}='\newline\setlength{\tabcolsep}{1 mm}';
+	    $Apache::londefdef::table[-1]{'output'}='\strut\newline\strut\setlength{\tabcolsep}{1 mm}';
 	}
 	$Apache::londefdef::table[-1]{'output'}.=' \noindent \begin{tabular} ';
         $Apache::londefdef::table[-1]{'TeXlen'}=[];
         $Apache::londefdef::table[-1]{'objectlen'}=[];
+        $Apache::londefdef::table[-1]{'objectsignal'}=[];
         $Apache::londefdef::table[-1]{'maxlen'}=[];
         $Apache::londefdef::table[-1]{'minlen'}=[];
         $Apache::londefdef::table[-1]{'content'}=[];
@@ -1857,7 +1876,7 @@ sub end_table {
 	}
         #free space and number of empty columns
 	my ($available_space,$empty_columns)=($Apache::londefdef::table[-1]{'width'},0);
-##	&Apache::lonnet::logthis("Available space $Apache::londefdef::table[-1]{'width'}");
+	if ($#Apache::londefdef::table ne 0) {$available_space=0.9*$available_space;} 
 	for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
 	    if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]==0) {
 		$empty_columns++;
@@ -1888,8 +1907,14 @@ sub end_table {
 		    $localmin=$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn];
 		}
 	    }
-	    if ($max_len[$jn]<$localmin) {$max_len[$jn]=$localmin;}#object size is bigger
-	    if ($min_len[$jn]<$localmin) {$min_len[$jn]=$localmin;}#object size is bigger
+	    if ($max_len[$jn]<$localmin) {
+		$max_len[$jn]=$localmin;
+	    	$Apache::londefdef::table[-1]{'objectsignal'}[$jn]=1;
+	    }#object size is bigger
+	    if ($min_len[$jn]<$localmin) {
+		$min_len[$jn]=$localmin;
+		$Apache::londefdef::table[-1]{'objectsignal'}[$jn]=1;
+	    }#object size is bigger
 	    if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]!=0) {
 		$min_len[$jn]=0;
 		$max_len[$jn]=0;
@@ -1904,7 +1929,6 @@ sub end_table {
 	    $space_neeeded=$space_neeeded+$max_len[$jn];
 	}
 	if ($space_neeeded<=$available_space) {
-##	    &Apache::lonnet::logthis("I am in position 1: $space_neeeded <= $available_space");
 	    for (my $jn=0;$jn<=$#max_len;$jn++) {
 		if ($fwidth[$jn]==0) {
 		    $fwidth[$jn]=$max_len[$jn];
@@ -1917,16 +1941,44 @@ sub end_table {
 		$space_neeeded+=$min_len[$jn];
 	    }
 	    if ($space_neeeded>$available_space) {
-##		&Apache::lonnet::logthis("I am in position 2");
 		$WARNING=' \textbf{NOT ENOUGH SPACE FOR TABLE} ';
 		for (my $jn=0;$jn<=$#max_len;$jn++) {
 		    if ($fwidth[$jn]==0) {
 			$fwidth[$jn]=$min_len[$jn];
 		    }
 		}
+		#check if we have objects which can be scaled
+		my $how_many_to_scale=0;
+		my @to_scale=();
+		for (my $jn=0;$jn<=$#max_len;$jn++) {
+		    if ($Apache::londefdef::table[-1]{'objectsignal'}[$jn] eq '1') {
+			$how_many_to_scale++;
+			push @to_scale, $jn;
+		    }
+		}
+		if ($how_many_to_scale>0) {
+		    my $space_to_adjust=($space_neeeded-$available_space)/$how_many_to_scale;
+		    foreach my $jn (@to_scale) {
+			for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
+			    $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/;
+			    if ($1 ne '') {
+				my $current_length=&recalc($1);
+				$current_length=~/(\d+\.?\d*)/;
+				$current_length=$current_length-$space_to_adjust;
+				$Apache::londefdef::table[-1]{'content'}[$in][$jn]=~s/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/width=$current_length mm/;
+			    }
+			    $Apache::londefdef::table[-1]{'content'}[$in][$jn]=~m/\[(\d+\.?\d*)\s*mm\]/;
+			    if ($1 ne '') {
+				my $current_length=$1;
+				$current_length=$current_length-$space_to_adjust;
+				$Apache::londefdef::table[-1]{'content'}[$in][$jn]=~s/\[(\d+\.?\d*)\s*mm\]/\[$current_length mm\]/;
+			    }				
+			}
+			$fwidth[$jn]=$fwidth[$jn]-$space_to_adjust;
+		    }
+		}
 	    } else {
 	      #step 3. adjustment over minimal + corrections
-##		&Apache::lonnet::logthis("I am in position 3");
 		my $enlarge_coef=$available_space/$space_neeeded;
 		my $acsessive=0;
 		for (my $jn=0;$jn<=$#min_len;$jn++) {
@@ -1952,11 +2004,15 @@ sub end_table {
 			    $fwidth[$jn]=$adjust[$jn];
 			}
 		    }
+		} else {
+		    for (my $jn=0;$jn<=$#min_len;$jn++) {
+			$fwidth[$jn]=$adjust[$jn];
+		    }
 		}
 	    }
 	}
-        #recalculation for the use of all available width if width is defined in %
-        if ($Apache::londefdef::table[-1]{'percent'}==1) {
+        #use all available width if it is defined in % or as TeXwidth
+        if (($Apache::londefdef::table[-1]{'percent'}==1) || ($Apache::londefdef::table[-1]{'forcetablewidth'}==1)) {
 	    my $current=0; 
 	    for (my $i=0;$i<=$#fwidth;$i++) {  
 		$current+=$fwidth[$i];
@@ -1995,13 +2051,13 @@ sub end_table {
 	for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
 	    for (my $jn=0;$jn<=$#fwidth;$jn++) {
 		if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
-		    $output.='\begin{center}';
+		    $output.='\vspace*{-6 mm}\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}';
+		    $output.='\end{center}\vspace*{-6 mm}';
 		} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
 		    $output.='} ';
 		}
@@ -2009,7 +2065,7 @@ sub end_table {
 	    }
 	    $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' ';
 	}
-	$Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\vskip 0 mm ';
+	$Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut ';
 	if ($#Apache::londefdef::table > 0) {	    
 	    my $inmemory = $Apache::londefdef::table[-1]{'output'};
 	    pop @Apache::londefdef::table;
@@ -2137,6 +2193,26 @@ sub end_td_tex {
 	    push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;
 	    push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
 	    push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	} elsif ($data=~/\\parbox\{\s*\d+\.?\d*\s*(mm|cm|in|pc|pt)*\s*\}/ or $data=~/\\epsfxsize\s*=\s*\d+\.?\d*\s*(mm|cm|in|pc|pt)*/) {
+	    my $garbage_data=$data;
+	    my $fwidth=0;
+            while ($garbage_data=~/\\parbox\{\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)\s*\}/) {
+		my $current_length=&recalc($1);
+		$current_length=~/(\d+\.?\d*)/;
+		if ($fwidth<$1) {$fwidth=$1;}
+		$garbage_data=~s/\\parbox\{\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)//;
+	    }
+            while ($garbage_data=~/\\epsfxsize\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) {
+		my $current_length=&recalc($1);
+		$current_length=~/(\d+\.?\d*)/;
+		if ($fwidth<$1) {$fwidth=$1;}
+		$garbage_data=~s/\\epsfxsize\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)//;
+	    }
+	    push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	    push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;
+	    push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	    push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	    $data=~s/\\\\\s*$//; 
 	} else {  
 	    $data=~s/^\s+(\S.*)/$1/; 
 	    $data=~s/(.*\S)\s+$/$1/;
@@ -2159,7 +2235,7 @@ sub end_td_tex {
 		$current_length=2.5*&LATEX_length($data);
                     my @words=split(/ /,$data);
 		    foreach my $word (@words) {
-			my $lengthword=2.5*&LATEX_length($word);
+			my $lengthword=2*&LATEX_length($word);
 			if ($min_length<$lengthword) {$min_length=$lengthword;}
 		    }
 	    }
@@ -2195,55 +2271,128 @@ sub start_th {
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
-	my $what_to_push = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
-	if ($what_to_push eq '') {
-	    $what_to_push = substr($Apache::londefdef::table[-1]{'rows'}[0],0,1);;
-	}
-	push @{ $Apache::londefdef::table[-1]{'columns'} }, $what_to_push;
-	$Apache::londefdef::table[-1]{'counter_columns'}++;
-	&Apache::lonxml::startredirection();
+	$Apache::londefdef::TD_redirection = 1;
+	&tagg_check('tr','th',$tagstack,$parstack,$parser,$safeeval);
     } 
     return $currentstring;
 }   
-     
+    
+sub tagg_check {
+    my ($good_tag,$bad_tag,$tagstack,$parstack,$parser,$safeeval) = @_;
+    my @ar=@$parstack; 
+    for (my $i=$#ar-1;$i>=0;$i--) {
+	if (lc($$tagstack[$i]) eq $good_tag) {
+	    &start_th_tex($parstack,$parser,$safeeval);
+	    last;
+	} elsif (lc($$tagstack[$i]) eq $bad_tag) {
+	    splice @ar, $i+1;
+	    &end_th_tex(\@ar,$parser,$safeeval);
+	    &start_th_tex($parstack,$parser,$safeeval);
+	    last;
+	}
+    }
+    return '';
+}
+ 
+sub start_th_tex {
+    my ($parstack,$parser,$safeeval) = @_;
+    my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
+    if ($alignchar eq '') {
+	$alignchar = $Apache::londefdef::table[-1]{'rows'}[-1];
+    }
+    push @{ $Apache::londefdef::table[-1]{'align'}[$Apache::londefdef::table[-1]{'row_number'}] }, $alignchar;
+    $Apache::londefdef::table[-1]{'counter_columns'}++;
+    my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
+    if (defined $TeXwidth) {		
+	my $current_length=&recalc($TeXwidth);
+	$current_length=~/(\d+\.?\d*)/;
+	push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$1;
+    }
+    &Apache::lonxml::startredirection();
+    return '';
+}
+
+sub end_th_tex {
+    my ($parstack,$parser,$safeeval) = @_;
+    my $current_row = $Apache::londefdef::table[-1]{'row_number'};
+    my $data=&Apache::lonxml::endredirection();
+    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';
+	push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+    } else {
+	if (($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) or ($data=~m/\[(\d+\.?\d*)\s*mm\]/)) {
+	    my $garbage_data=$data;
+	    my $fwidth=0;
+            while ($garbage_data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) {
+		my $current_length=&recalc($1);
+		$current_length=~/(\d+\.?\d*)/;
+		if ($fwidth<$1) {$fwidth=$1;}
+		$garbage_data=~s/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)//;
+	    }
+            while ($garbage_data=~m/\[(\d+\.?\d*)\s*mm\]/) {
+		my $current_length=$1;
+		if ($fwidth<$current_length) {$fwidth=$current_length;}
+		$garbage_data=~s/\[(\d+\.?\d*)\s*mm\]//;
+	    }
+	    push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	    push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;
+	    push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	    push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	} else {  
+	    $data=~s/^\s+(\S.*)/$1/; 
+	    $data=~s/(.*\S)\s+$/$1/;
+	    $data=~s/(\s)+/$1/;
+	    my ($current_length,$min_length)=(0,0);
+	    if ($data=~/\\vskip/) {
+                my $newdata=$data;
+		$newdata=~s/\\vskip \d*\.?\d*\s*mm/THISISJUSTTEMPORARYSEPARATOR/g;
+		my @newdata=split(/THISISJUSTTEMPORARYSEPARATOR/,$newdata);
+		foreach my $elementdata (@newdata) {
+		    my $lengthnewdata=2.5*&LATEX_length($elementdata);
+		    if ($lengthnewdata>$current_length) {$current_length=$lengthnewdata;}
+                    my @words=split(/ /,$elementdata);
+		    foreach my $word (@words) {
+			my $lengthword=2.5*&LATEX_length($word);
+			if ($min_length<$lengthword) {$min_length=$lengthword;}
+		    }
+		}
+	    } else {
+		$current_length=2.5*&LATEX_length($data);
+                    my @words=split(/ /,$data);
+		    foreach my $word (@words) {
+			my $lengthword=2*&LATEX_length($word);
+			if ($min_length<$lengthword) {$min_length=$lengthword;}
+		    }
+	    }
+	    push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	    push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
+	    push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length;
+	    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++) {         
+	    $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
+	}
+    #make data bold
+    $data='\textbf{'.$data.'}';
+    push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data;
+    return'';
+}
+
 sub end_th {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
-	my $current_row = $Apache::londefdef::table[-1]{'row_number'};
-	my $data=&Apache::lonxml::endredirection();
-	my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
-	if (defined $TeXwidth) {		
-	    my $current_length=&recalc($TeXwidth);
-	    $current_length=~/(\d+)/;
-	    $Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';
-	    $Apache::londefdef::table[-1]{'length'} .= '0,';
-	} else {
-	    if ($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) {
-		my $current_length=&recalc($1);
-		$current_length=~/(\d+)/;
-		$Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';
-		$Apache::londefdef::table[-1]{'length'} .= '0,';
-	    } else {     
-		$data=~/^\s*(\S.*)/;
-		$data=$1;
-		$data=~/(.*\S)\s*$/;
-		$data=$1;
-		my $current_length=2*length($data);
-		$Apache::londefdef::table[-1]{'length'} .= $current_length.',';
-		$Apache::londefdef::table[-1]{'TeXlength'} .= '0,';
-	    }        
-	}
-	for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {                                
-	    $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
-	}
-	$data='\textbf{'.$data.'}';
-	@{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
+        $Apache::londefdef::TD_redirection =0;
+	&end_th_tex($parstack,$parser,$safeeval);
     }
     return $currentstring;
 }
+     
 #-- <img> tag (end tag forbidden)
 sub start_img {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
@@ -2251,7 +2400,6 @@ sub start_img {
 					 undef,1);
     if (not $src and ($target eq 'web' or $target eq 'tex')) { 
 	my $inside = &Apache::lonxml::get_all_text("/img",$parser);
-	&Apache::lonnet::logthis("inside was $inside");
 	return '';
     }
     $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src;
@@ -2271,6 +2419,12 @@ sub start_img {
 	}
     } elsif ($target eq 'tex') {
 	$src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
+        #if uploaded restore the path
+	if ($src=~/^\/uploaded\/([^\/]+)\/([^\/]+)\/simplepage\/([^\/]+)$/) {
+	    $src=&Apache::loncommon::propath($1,$2).'/userfiles/simplepage/'.$3;
+	} elsif ($src=~/^\/uploaded\/([^\/]+)\/([^\/]+)\/aboutme\/([^\/]+)$/) {
+	    $src=&Apache::loncommon::propath($1,$2).'/userfiles/aboutme/'.$3;
+	}
 	#if original gif/jpg/png file exist do following:
 	if (-e $src) {
 	    #what is the image size?
@@ -2344,7 +2498,6 @@ sub start_img {
 	my $loc=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$nsrc);
 	&image_replication($loc);
 	my ($iwidth,$iheight);
-	&Apache::lonnet::logthis("loc is $loc");
 	if (-e $loc) {
 	    my $image = Image::Magick->new;
 	    $image->Read($loc);
@@ -3541,6 +3694,10 @@ sub eps_generation {
     $newsrc=~s/\/home\/([^\/]*)\/public_html\//\/$1\//;
     $newsrc=~s/\/\.\//\//;
     $newsrc=~s/\/([^\/]+)\.(ps|eps)/\//;
+    if ($newsrc=~/\/home\/httpd\/lonUsers\//) {
+	$newsrc=~s/\/home\/httpd\/lonUsers//;
+	$newsrc=~s/\/([^\/]+)\/(\w)\/(\w)\/(\w)\//\/$1\//;
+    }
     return ' \graphicspath{{/home/httpd/prtspool'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
 }
 
@@ -3593,8 +3750,6 @@ sub LATEX_length {
     $garbage=~s|\\(\w+)\\|\\|g;	 
     $garbage=~s|\\(\w+)(\s*)|$2|g;	 	 
     $garbage=~s|\+|11|g;
-
-    &Apache::lonnet::logthis("garbage was just $garbage");
     my  $value=length($garbage);
     return $value;
 }