[LON-CAPA-cvs] cvs: loncom /xml londefdef.pm

sakharuk lon-capa-cvs@mail.lon-capa.org
Thu, 01 Apr 2004 16:11:58 -0000


This is a MIME encoded message

--sakharuk1080835918
Content-Type: text/plain

sakharuk		Thu Apr  1 11:11:58 2004 EDT

  Modified files:              
    /loncom/xml	londefdef.pm 
  Log:
  Table algorithm is changed. There are a lot of important changes:
  1. A new algorithm to define the cell width is implemented;
  2. A new way to store and use data from cells is used;
  3. More elegant but still not quite satisfactory way to define overall table width is used for the nested tables. But if you use TeXwidth attribute in the <table> tag everything looks really nice. At least this gives the authors rather powerfull possibility to predefine LaTeX output at the authoring stage;
  4. Additional attribute "DropEmptyColumns" in <table> tag allowing to remove empty columns from table is added. This is really important for the printing of chamical reactions equations.
  5. Attribute 'align' can be used both in <tr> and <td> tags and data in these cells can be align independently.
  6. LaTeX internal space between columns is changed to the reasonable value - allows save a lot of space inside the table.
  
  All this corrections allows me to close bugs
  2129 (printing of tables: justifying column content);
  2843 (Equation in the question does not print properly.).
  
  
  
--sakharuk1080835918
Content-Type: text/plain
Content-Disposition: attachment; filename="sakharuk-20040401111158.txt"

Index: loncom/xml/londefdef.pm
diff -u loncom/xml/londefdef.pm:1.205 loncom/xml/londefdef.pm:1.206
--- loncom/xml/londefdef.pm:1.205	Thu Apr  1 10:18:06 2004
+++ loncom/xml/londefdef.pm	Thu Apr  1 11:11:58 2004
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.205 2004/04/01 15:18:06 albertel Exp $
+# $Id: londefdef.pm,v 1.206 2004/04/01 16:11:58 sakharuk Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -1765,24 +1765,34 @@
 }
 
 #-- <table> tag (end tag required)
+#list of supported attributes: border,width,TeXwidth
 sub start_table {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
-    my $textwidth='';
-    if (not defined @Apache::londefdef::table) {
-	$textwidth=&recalc($ENV{'form.textwidth'});
-	$textwidth=~/(\d+\.?\d*)/;
-	$textwidth=0.95*$1;
-    } else {
-	$textwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
-    }
-    my $currentstring = '';
+    my ($textwidth,$currentstring)=('','');
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
 	my $aa = {};
 	push @Apache::londefdef::table, $aa; 
 	$Apache::londefdef::table[-1]{'row_number'} = -1;
-        #table's width
+        #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*)/;
+	    $textwidth=0.95*$1; #accounts "internal" LaTeX space for table frame
+	} else {
+	    if ($Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}]=~/\d/) {
+		#the maximum width of nested table is determined by LATeX width of parent cell
+		$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'};
+		for (my $i=0;$i<$Apache::londefdef::table[-2]{'counter_columns'};$i++) {
+		    $textwidth=$textwidth-$Apache::londefdef::table[-2]{'TeXlen'}[0][$i];
+		}
+	    }
+	}
 	my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
 	if (not defined $TeXwidth) {
 	    my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1);
@@ -1796,13 +1806,13 @@
 	} elsif ($TeXwidth=~/%/) {
 	    $Apache::londefdef::table[-1]{'percent'}=1;
 	    $TeXwidth=~/(\d+)/;
-	    my $value=$1*$textwidth/100;
-            $Apache::londefdef::table[-1]{'width'}=$value;
+            $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
 	} else {
-	    $Apache::londefdef::table[-1]{'width'}=$textwidth;
+	    $Apache::londefdef::table[-1]{'width'}=$TeXwidth;
 	}        
         #table's border
-	my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval,undef,1); 
+	my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); 
+        my $permission=&Apache::lonxml::get_param('DropEmptyColumns',$parstack,$safeeval,undef,0);
 	unless (defined $border) { $border = 0; }
 	if ($border) { 
 	    $Apache::londefdef::table[-1]{'hinc'} = '\hline '; 
@@ -1813,9 +1823,18 @@
 	    $Apache::londefdef::table[-1]{'vinc'} = '&'; 
 	    $Apache::londefdef::table[-1]{'vvinc'} = '';
 	}
-	$Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} ';
-	$currentstring = '\keephidden{NEW TABLE ENTRY}';
-    }
+	if ($#Apache::londefdef::table==0) {
+	    $Apache::londefdef::table[-1]{'output'}='\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]{'maxlen'}=[];
+        $Apache::londefdef::table[-1]{'minlen'}=[];
+        $Apache::londefdef::table[-1]{'content'}=[];
+        $Apache::londefdef::table[-1]{'align'}=[];
+        $currentstring='\keephidden{NEW TABLE ENTRY}';
+   }
     return $currentstring;
 }
  
@@ -1827,75 +1846,170 @@
     } elsif ($target eq 'tex') {
 	my $inmemory = '';
 	my $output = '';
-	#construct header of the table
-	my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};
-	for (my $in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) {
-	    $header_of_table .= $Apache::londefdef::table[-1]{'columns'}[$in].$Apache::londefdef::table[-1]{'vvinc'};
+	my $WARNING='';
+        #width of columns from TeXwidth attributes
+	for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
+	    for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
+		if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]<$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn]) {
+		    $Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]=$Apache::londefdef::table[-1]{'TeXlen'}[$in][$jn];
+		}	
+	    }
 	}
-	$header_of_table .= '}';
-	#define the length of the table cells
-	#always starts with TeXwidth (if defined everything else is ignored)
-	my @length_row_final = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[0]);
-	for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
-	    my @length_row = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[$in]);
-	    for (my $jn=0;$jn<=$#length_row;$jn++) {
-		if ($length_row_final[$jn]<$length_row[$jn]) {$length_row_final[$jn]=$length_row[$jn];}
-	    }
-	}
-	#continues trying estimate the width of raw data
-	my @length_raw_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]);
-	for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
-	    my @length_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[$in]);
-	    for (my $jn=0;$jn<=$#length_row;$jn++) {
-		if ($length_raw_row[$jn]<$length_row[$jn]) {$length_raw_row[$jn]=$length_row[$jn];}
-	    }
-	}
-        #comparing of TeXwidth and raw data width
-	my $available_length=$Apache::londefdef::table[-1]{'width'};
-	my $needed=0;
-	for (my $jn=0;$jn<=$#length_row_final;$jn++) {
-	    if ($length_row_final[$jn]!=0) {
-		$available_length=$available_length-$length_row_final[$jn];
-		$needed++;
-	    }
-	}
-	$needed=$#length_row_final-$needed+1;
-	for (my $jn=0;$jn<=$#length_row_final;$jn++) {
-	    if ($length_row_final[$jn]==0) {
-		if ($length_raw_row[$jn]<$available_length) {
-		    $length_row_final[$jn]=$length_raw_row[$jn];
-		    $available_length=$available_length-$length_raw_row[$jn];
-		    $needed--;
-		}
+        #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'}");
+	for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
+	    if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]==0) {
+		$empty_columns++;
+	    } else {
+		$available_space=$available_space-$Apache::londefdef::table[-1]{'TeXlen'}[0][$jn];
 	    }
 	}
-	for (my $jn=0;$jn<=$#length_row_final;$jn++) {
-	    if ($length_row_final[$jn]==0) {
-		$length_row_final[$jn]=0.9*$available_length/$needed;
+        #boundaries for contents columns
+	my @min_len=();#columns can not be narrower 
+	my @max_len=();#maximum length of column
+	for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
+		my ($localmin,$localmax)=(0,0);
+		for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
+		    if ($localmin<$Apache::londefdef::table[-1]{'minlen'}[$in][$jn]) {
+			$localmin=$Apache::londefdef::table[-1]{'minlen'}[$in][$jn];
+		    }
+		    if ($localmax<$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn]) {
+			$localmax=$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn];
+		    }
+		}
+		push @min_len, $localmin;
+		push @max_len, $localmax;
+	}
+	for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
+	    my $localmin=0,;
+	    for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
+		if ($localmin<$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn]) {
+		    $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 ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]!=0) {
+		$min_len[$jn]=0;
+		$max_len[$jn]=0;
+	    }
+	}
+       #final adjustment of column width
+	my @fwidth=@{$Apache::londefdef::table[-1]{'TeXlen'}[0]};#final width array
+	my @adjust=();
+        #step 1. adjustment by maximum value
+	my $space_neeeded=0;
+	for (my $jn=0;$jn<=$#max_len;$jn++) {
+	    $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];
+		}
+	    }
+	} else {
+        #step 2. adjustment by minimum value (estimation)
+	    $space_neeeded=0;
+	    for (my $jn=0;$jn<=$#min_len;$jn++) {
+		$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];
+		    }
+		}
+	    } 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++) {
+		    $adjust[$jn]=$min_len[$jn]*$enlarge_coef;
+		    if ($adjust[$jn]>$max_len[$jn]) {
+			$fwidth[$jn]=$max_len[$jn];
+			$acsessive=$acsessive+$adjust[$jn]-$max_len[$jn];
+			$adjust[$jn]=0;
+		    }
+		}
+		if ($acsessive>0) {
+		#we have an excess of space and can redistribute it
+		    my $notempty_columns=0;
+		    for (my $jn=0;$jn<=$#min_len;$jn++) {
+			if ($adjust[$jn]!=0) {
+			    $notempty_columns++;
+			}
+		    }
+		    my $per_column=$acsessive/$notempty_columns;
+		    for (my $jn=0;$jn<=$#min_len;$jn++) {
+			if ($adjust[$jn]!=0) {
+			    $adjust[$jn]+=$per_column;
+			    $fwidth[$jn]=$adjust[$jn];
+			}
+		    }
+		}
 	    }
 	}
         #recalculation for the use of all available width if width is defined in %
         if ($Apache::londefdef::table[-1]{'percent'}==1) {
 	    my $current=0; 
-	    for (my $i=0;$i<=$#length_row_final;$i++) {  
-		$current+=$length_row_final[$i];
+	    for (my $i=0;$i<=$#fwidth;$i++) {  
+		$current+=$fwidth[$i];
 	    }
 	    my $coef=$Apache::londefdef::table[-1]{'width'}/$current;
-	    for (my $i=0;$i<=$#length_row_final;$i++) {  
-		$length_row_final[$i]*=$coef;
+	    for (my $i=0;$i<=$#fwidth;$i++) {  
+		$fwidth[$i]*=$coef;
+	    }
+	}
+        #removing of empty columns if allowed
+        my $permission=&Apache::lonxml::get_param('DropEmptyColumns',$parstack,$safeeval,undef,0);
+	if ($permission eq 'yes') {
+	    my @cleaned_table=();
+            my @cleaned_header=();
+	    my $colind=0;
+	    for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
+		if ($fwidth[$jn]!=0) {
+		    #we need to copy column
+		    for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
+			$cleaned_table[$in][$colind]=$Apache::londefdef::table[-1]{'content'}[$in][$jn];
+			$cleaned_header[$colind]=$fwidth[$jn];
+		    }
+		    $colind++;
+		}
 	    }
+	    $Apache::londefdef::table[-1]{'content'}=\@cleaned_table;
+	    @fwidth=@cleaned_header;
 	}
+	#construct header of the table
+	my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};
+	for (my $in=0;$in<=$#fwidth;$in++) {
+	    $header_of_table.='p{'.$fwidth[$in].' mm}'.$Apache::londefdef::table[-1]{'vvinc'};
+	}
+	$header_of_table .= '}';
 	#fill the table
 	for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
-	    for (my $jn=0;$jn<=$#length_row_final;$jn++) {
-		my $substituted=$length_row_final[$jn];
-		$Apache::londefdef::table[-1]{'rowdata'}[$in]=~s/TOBECHANGEDONNUMBER/$substituted mm/;
-	    }
-	    $output .=  $Apache::londefdef::table[-1]{'rowdata'}[$in];
-	    chop $output;
-	    $output .= ' \\\\ ';
+	    for (my $jn=0;$jn<=$#fwidth;$jn++) {
+		if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
+		    $output.='\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}';
+		} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
+		    $output.='} ';
+		}
+                if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};}
+	    }
+	    $output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' ';
 	}
-	$Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}\vskip 0 mm ';
+	$Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\vskip 0 mm ';
 	if ($#Apache::londefdef::table > 0) {	    
 	    my $inmemory = $Apache::londefdef::table[-1]{'output'};
 	    pop @Apache::londefdef::table;
@@ -1917,16 +2031,19 @@
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
 	$Apache::londefdef::table[-1]{'row_number'}++;
-	my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
+	my $alignchar=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
 	if ($alignchar ne '') {
-	    push @ {$Apache::londefdef::table[-1]{'rows'} }, $alignchar;
+	    push @ {$Apache::londefdef::table[-1]{'rows'} },substr($alignchar,0,1);
 	} else {
 	    push @ {$Apache::londefdef::table[-1]{'rows'} }, 'l';
 	}
 	push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'});
 	$Apache::londefdef::table[-1]{'counter_columns'} = -1;
-	$Apache::londefdef::table[-1]{'TeXlength'} = '';
- 	$Apache::londefdef::table[-1]{'length'} = '';
+	push @ {$Apache::londefdef::table[-1]{'TeXlen'}}, [];
+	push @ {$Apache::londefdef::table[-1]{'objectlen'}}, [];
+	push @ {$Apache::londefdef::table[-1]{'minlen'}}, [];
+	push @ {$Apache::londefdef::table[-1]{'maxlen'}}, [];
+	push @ {$Apache::londefdef::table[-1]{'content'}}, [];
     } 
     return $currentstring;
 }
@@ -1940,8 +2057,6 @@
 	if ($Apache::londefdef::TD_redirection) {
 	    &end_td_tex($parstack,$parser,$safeeval);    
 	}
-	push @{ $Apache::londefdef::table[-1]{'TeXlengthrow'} },$Apache::londefdef::table[-1]{'TeXlength'};
-	push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'};
     }
     return $currentstring;
 }
@@ -1978,12 +2093,18 @@
  
 sub start_td_tex {
     my ($parstack,$parser,$safeeval) = @_;
-    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);;
+    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]{'columns'} }, $what_to_push;
+    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 '';
 }
@@ -1994,40 +2115,64 @@
     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,';
+	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)*)/) {
-	    my $current_length=&recalc($1);
-	    $current_length=~/(\d+\.?\d*)/;
-	    $Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';
-	    $Apache::londefdef::table[-1]{'length'} .= '0,';
+	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=0;
+	    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=1.8*LATEX_length($elementdata);
+		    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=1.8*LATEX_length($data);
+		$current_length=2.5*&LATEX_length($data);
+                    my @words=split(/ /,$data);
+		    foreach my $word (@words) {
+			my $lengthword=2.5*&LATEX_length($word);
+			if ($min_length<$lengthword) {$min_length=$lengthword;}
+		    }
 	    }
-	    $Apache::londefdef::table[-1]{'length'} .= $current_length.',';
-	    $Apache::londefdef::table[-1]{'TeXlength'} .= '0,';
+	    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]/;
 	}
-    @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
+    push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data;
     return'';
 }
 
@@ -3408,18 +3553,27 @@
 
 sub LATEX_length {
     my $garbage=shift;
-    $garbage=~s/^\s+(\S.*)/$1/; 
-    $garbage=~s/(.*\S)\s+$/$1/;
-    $garbage=~s/(\s)+/$1/;
-    $garbage=~s/(\\begin{([^\}]+)}|\\end{([^\}]+)})//g;
-    $garbage=~s/(\$\_\{|\$\_|\$\^{|\$\^|\}\$|\$)//g;
-    $garbage=~s/(\\alpha|\\beta|\\gamma|\\delta|\\epsilon|\\verepsilon|\\zeta|\\eta|\\theta|\\vartheta|\\iota|\\kappa|\\lambda|\\mu|\\nu|\\xi|\\pi|\\varpi|\\rho|\\varrho|\\sigma|\\varsigma|\\tau|\\upsilon|\\phi|\\varphi|\\chi|\\psi|\\omega|\\Gamma|\\Delta|\\Theta|\\Lambda|\\Xi|\\Pi|\\Sigma|\\Upsilon|\\Phi|\\Psi|\\Omega)/1/g;
+    $garbage=~s/^\s+$//;
+    $garbage=~s/^\s+(\S.*)/$1/;#space before 
+    $garbage=~s/(.*\S)\s+$/$1/;#space after 
+    $garbage=~s/(\s)+/$1/;#only one space
+    $garbage=~s/(\\begin{([^\}]+)}|\\end{([^\}]+)})//g;#remove LaTeX \begin{...} and \end{...}
+    $garbage=~s/(\$\_\{|\$\_|\$\^{|\$\^|\}\$)//g;#remove $_{,$_,$^{,$^,}$
+    $garbage=~s/([^\\])\$/$1/g;#$
+    $garbage=~s/(\\ensuremath\{\_\{|\\ensuremath\{\_|\\ensuremath\{\^{|\\ensuremath\{\^|\})//g;#remove \ensuremath{...}
+   $garbage=~s/(\\alpha|\\beta|\\gamma|\\delta|\\epsilon|\\verepsilon|\\zeta|\\eta|\\theta|\\vartheta|\\iota|\\kappa|\\lambda|\\mu|\\nu|\\xi|\\pi|\\varpi|\\rho|\\varrho|\\sigma|\\varsigma|\\tau|\\upsilon|\\phi|\\varphi|\\chi|\\psi|\\omega|\\Gamma|\\Delta|\\Theta|\\Lambda|\\Xi|\\Pi|\\Sigma|\\Upsilon|\\Phi|\\Psi|\\Omega)/1/g;
     $garbage=~s/(\\pm|\\mp|\\times|\\div|\\cdot|\\ast|\\star|\\dagger|\\ddagger|\\amalg|\\cap|\\cup|\\uplus|\\sqcap|\\sqcup|\\vee|\\wedge|\\oplus|\\ominus|\\otimes|\\circ|\\bullet|\\diamond|\\lhd|\\rhd|\\unlhd|\\unrhd|\\oslash|\\odot|\\bigcirc|\\Box|\\Diamond|\\bigtriangleup|\\bigtriangledown|\\triangleleft|\\triangleright|\\setminus|\\wr)/1/g;
     $garbage=~s/(\\le|\\ll|\\leq|\\ge|\\geq|\\gg|\\neq|\\doreq|\\sim|\\simeq|\\subset|\\subseteq|\\sqsubset|\\sqsubseteq|\\in|\\vdash|\\models|\\supset|\\supseteq|\\sqsupset|\\sqsupseteq|\\ni|\\dash|\\perp|\\approx|\\cong|\\equiv|\\propto|\\prec|\\preceq|\\parallel|\\asymp|\\smile|\\frown|\\bowtie|\\succ|\\succeq|\\mid)/1/g;
     $garbage=~s/(\\not<|\\\\not\\le|\\not\\prec|\\not\\preceq|\\not\\subset|\\not\\subseteq|\\not\\sqsubseteq|\\not\\in|\\not>|\\not\\ge|\\not\\succ|\\notsucceq|\\not\\supset|\\notsupseteq|\\not\\sqsupseteq|\\notin|\\not=|\\not\\equiv|\\not\\sim|\\not\\simeq|\\not\\approx|\\not\\cong|\\not\\asymp)/1/g;
-    $garbage=~s/(\\leftarrow|\\gets|\\Leftarrow|\\rightarrow|\\to|\\Rightarrow|\\leftrightarrow|\\Leftrightarrow|\\mapsto|\\hookleftarrow|\\leftharpoonup|\\leftkarpoondown|\\rightleftharpoons|\\longleftarrow|\\Longleftarrow|\\longrightarrow|\\Longrightarrow|\\longleftrightarrow|\\Longleftrightarrow|\\longmapsto|\\hookrightarrow|\\rightharpoonup|\\rightharpoondown|\\uparrow|\\Uparrow|\\downarrow|\\Downarrow|\\updownarrow|\\Updownarrow|\\nearrow|\\searrow|\\swarrow|\\nwarrow)/1/g;
-    $garbage=~s/(\\aleph|\\hbar|\\imath|\\jmath|\\ell|\\wp|\\Re|\\Im|\\mho|\\prime|\\emptyset|\\nabla|\\surd|\\partial|\\top|\\bot|\\vdash|\\dashv|\\forall|\\exists|\\neg|\\flat|\\natural|\\sharp|\\\||\\angle|\\backslash|\\Box|\\Diamond|\\triangle|\\clubsuit|\\diamondsuit|\\heartsuit|\\spadesuit|\\Join|\\infty)/ /g;
-    $garbage=~s/(\\hat{([^}]+)}|\\check{([^}]+)}|\\dot{([^}]+)}|\\breve{([^}]+)}|\\acute{([^}]+)}|\\ddot{([^}]+)}|\\grave{([^}]+)}|\\tilde{([^}]+)}|\\mathring{([^}]+)}|\\bar{([^}]+)}|\\vec{([^}]+)})/$1/g; 
+    $garbage=~s/(\\leftarrow|\\gets|\\Leftarrow|\\rightarrow|\\to|\\Rightarrow|\\leftrightarrow|\\Leftrightarrow|\\mapsto|\\hookleftarrow|\\leftharpoonup|\\leftkarpoondown|\\rightleftharpoons|\\longleftarrow|\\Longleftarrow|\\longrightarrow|\\Longrightarrow|\\longleftrightarrow|\\Longleftrightarrow|\\longmapsto|\\hookrightarrow|\\rightharpoonup|\\rightharpoondown|\\uparrow|\\Uparrow|\\downarrow|\\Downarrow|\\updownarrow|\\Updownarrow|\\nearrow|\\searrow|\\swarrow|\\nwarrow)/11/g;
+    $garbage=~s/(\\aleph|\\hbar|\\imath|\\jmath|\\ell|\\wp|\\Re|\\Im|\\mho|\\prime|\\emptyset|\\nabla|\\surd|\\partial|\\top|\\bot|\\vdash|\\dashv|\\forall|\\exists|\\neg|\\flat|\\natural|\\sharp|\\\||\\angle|\\backslash|\\Box|\\Diamond|\\triangle|\\clubsuit|\\diamondsuit|\\heartsuit|\\spadesuit|\\Join|\\infty)/11/g;
+    $garbage=~s/(\\hat{([^}]+)}|\\check{([^}]+)}|\\dot{([^}]+)}|\\breve{([^}]+)}|\\acute{([^}]+)}|\\ddot{([^}]+)}|\\grave{([^}]+)}|\\tilde{([^}]+)}|\\mathring{([^}]+)}|\\bar{([^}]+)}|\\vec{([^}]+)})/$1/g;
+    #remove some other LaTeX command
+    $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;
 }

--sakharuk1080835918--