--- loncom/xml/londefdef.pm 2004/02/19 19:57:48 1.199 +++ loncom/xml/londefdef.pm 2004/04/01 16:11:58 1.206 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.199 2004/02/19 19:57:48 albertel Exp $ +# $Id: londefdef.pm,v 1.206 2004/04/01 16:11:58 sakharuk Exp $ # # # Copyright Michigan State University Board of Trustees @@ -86,7 +86,6 @@ sub start_m { my $currentstring = ''; my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser); if ($target eq 'web' || $target eq 'analyze') { - $Apache::lonxml::prevent_entity_encode++; $inside ='\\documentstyle{article}'.$inside; &Apache::lonxml::debug("M is starting with:$inside:"); my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval); @@ -117,11 +116,8 @@ sub start_m { sub end_m { my ($target,$token) = @_; my $currentstring = ''; - if ($target eq 'web') { - $Apache::lonxml::prevent_entity_encode--; - } elsif ($target eq 'tex') { + if ($target eq 'tex') { $currentstring = ""; - } elsif ($target eq 'meta') { } return $currentstring; } @@ -393,7 +389,7 @@ sub start_meta { my $display=&Apache::lonxml::get_param ('display',$parstack,$safeeval,undef,1); if ($display) { - $display=&HTML::Entities::encode($display); + $display=&HTML::Entities::encode($display,'<>&"'); $currentstring.='<'.$name.'.display>'.$display. ''; } @@ -535,12 +531,13 @@ sub start_body { if ($ENV{'request.state'} ne 'published') { $currentstring.=(< - + EDITBUTTON } else { $currentstring.=&Apache::lonmenu::menubuttons(undef,$target,1); } + $currentstring.=&Apache::lonxml::message_location(); } elsif ($target eq 'tex') { $currentstring = '\begin{document}'; } @@ -1246,9 +1243,7 @@ sub start_font { my $currentstring = ''; if ($target eq 'web') { my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); - if ($face=~/symbol/i) { - $Apache::lonxml::prevent_entity_encode++; - } else { + if ($face!~/symbol/i) { if (($ENV{'browser.fontenhance'} eq 'on') || ($ENV{'browser.blackwhite'} eq 'on')) { return ''; } } @@ -1266,8 +1261,6 @@ sub end_font { my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_; my $currentstring = ''; if ($target eq 'web') { - my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval); - if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode--;} $currentstring = $token->[2]; } elsif ($target eq 'tex') { my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval); @@ -1337,7 +1330,7 @@ sub start_sub { if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - $currentstring .= "\$_{"; + $currentstring .= '\ensuremath{_{'; } return $currentstring; } @@ -1348,7 +1341,7 @@ sub end_sub { if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { - $currentstring .= "}\$"; + $currentstring .= '}}'; } return $currentstring; } @@ -1360,7 +1353,7 @@ sub start_sup { if ($target eq 'web') { $currentstring .= $token->[4]; } elsif ($target eq 'tex') { - $currentstring .= "\$^{"; + $currentstring .= '\ensuremath{^{'; } return $currentstring; } @@ -1371,7 +1364,7 @@ sub end_sup { if ($target eq 'web') { $currentstring .= $token->[2]; } elsif ($target eq 'tex') { - $currentstring .= "}\$"; + $currentstring .= '}}'; } return $currentstring; } @@ -1772,43 +1765,54 @@ sub end_dd { } #-- 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); if ($htmlwidth=~/%/) { + $Apache::londefdef::table[-1]{'percent'}=1; $htmlwidth=~/(\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; } } 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 '; @@ -1819,9 +1823,18 @@ sub start_table { $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; } @@ -1833,64 +1846,170 @@ sub end_table { } 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]; + } + } + #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]; + } + } } } } - for (my $jn=0;$jn<=$#length_row_final;$jn++) { - if ($length_row_final[$jn]==0) { - $length_row_final[$jn]=0.9*$available_length/$needed; + #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<=$#fwidth;$i++) { + $current+=$fwidth[$i]; + } + my $coef=$Apache::londefdef::table[-1]{'width'}/$current; + 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; @@ -1912,16 +2031,19 @@ sub start_tr { $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; } @@ -1935,8 +2057,6 @@ sub end_tr { 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; } @@ -1973,12 +2093,18 @@ sub tag_check { 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 ''; } @@ -1989,40 +2115,64 @@ sub end_td_tex { 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''; } @@ -3403,18 +3553,27 @@ sub recalc { 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; }