Diff for /loncom/xml/londefdef.pm between versions 1.205 and 1.206

version 1.205, 2004/04/01 15:18:06 version 1.206, 2004/04/01 16:11:58
Line 1765  sub end_dd { Line 1765  sub end_dd {
 }  }
   
 #-- <table> tag (end tag required)  #-- <table> tag (end tag required)
   #list of supported attributes: border,width,TeXwidth
 sub start_table {  sub start_table {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $textwidth='';      my ($textwidth,$currentstring)=('','');
     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 = '';  
     if ($target eq 'web') {      if ($target eq 'web') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $aa = {};   my $aa = {};
  push @Apache::londefdef::table, $aa;    push @Apache::londefdef::table, $aa; 
  $Apache::londefdef::table[-1]{'row_number'} = -1;   $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);   my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
  if (not defined $TeXwidth) {   if (not defined $TeXwidth) {
     my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1);      my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1);
Line 1796  sub start_table { Line 1806  sub start_table {
  } elsif ($TeXwidth=~/%/) {   } elsif ($TeXwidth=~/%/) {
     $Apache::londefdef::table[-1]{'percent'}=1;      $Apache::londefdef::table[-1]{'percent'}=1;
     $TeXwidth=~/(\d+)/;      $TeXwidth=~/(\d+)/;
     my $value=$1*$textwidth/100;              $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
             $Apache::londefdef::table[-1]{'width'}=$value;  
  } else {   } else {
     $Apache::londefdef::table[-1]{'width'}=$textwidth;      $Apache::londefdef::table[-1]{'width'}=$TeXwidth;
  }           }        
         #table's border          #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; }   unless (defined $border) { $border = 0; }
  if ($border) {    if ($border) { 
     $Apache::londefdef::table[-1]{'hinc'} = '\hline ';       $Apache::londefdef::table[-1]{'hinc'} = '\hline '; 
Line 1813  sub start_table { Line 1823  sub start_table {
     $Apache::londefdef::table[-1]{'vinc'} = '&';       $Apache::londefdef::table[-1]{'vinc'} = '&'; 
     $Apache::londefdef::table[-1]{'vvinc'} = '';      $Apache::londefdef::table[-1]{'vvinc'} = '';
  }   }
  $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} ';   if ($#Apache::londefdef::table==0) {
  $currentstring = '\keephidden{NEW TABLE ENTRY}';      $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;      return $currentstring;
 }  }
     
Line 1827  sub end_table { Line 1846  sub end_table {
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $inmemory = '';   my $inmemory = '';
  my $output = '';   my $output = '';
  #construct header of the table   my $WARNING='';
  my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};          #width of columns from TeXwidth attributes
  for (my $in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) {   for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
     $header_of_table .= $Apache::londefdef::table[-1]{'columns'}[$in].$Apache::londefdef::table[-1]{'vvinc'};      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 .= '}';          #free space and number of empty columns
  #define the length of the table cells   my ($available_space,$empty_columns)=($Apache::londefdef::table[-1]{'width'},0);
  #always starts with TeXwidth (if defined everything else is ignored)  ## &Apache::lonnet::logthis("Available space $Apache::londefdef::table[-1]{'width'}");
  my @length_row_final = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[0]);   for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
  for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {      if ($Apache::londefdef::table[-1]{'TeXlen'}[0][$jn]==0) {
     my @length_row = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[$in]);   $empty_columns++;
     for (my $jn=0;$jn<=$#length_row;$jn++) {      } else {
  if ($length_row_final[$jn]<$length_row[$jn]) {$length_row_final[$jn]=$length_row[$jn];}   $available_space=$available_space-$Apache::londefdef::table[-1]{'TeXlen'}[0][$jn];
     }      }
  }   }
  #continues trying estimate the width of raw data          #boundaries for contents columns
  my @length_raw_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]);   my @min_len=();#columns can not be narrower 
  for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {   my @max_len=();#maximum length of column
     my @length_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[$in]);   for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
     for (my $jn=0;$jn<=$#length_row;$jn++) {   my ($localmin,$localmax)=(0,0);
  if ($length_raw_row[$jn]<$length_row[$jn]) {$length_raw_row[$jn]=$length_row[$jn];}   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];
         #comparing of TeXwidth and raw data width      }
  my $available_length=$Apache::londefdef::table[-1]{'width'};      if ($localmax<$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn]) {
  my $needed=0;   $localmax=$Apache::londefdef::table[-1]{'maxlen'}[$in][$jn];
  for (my $jn=0;$jn<=$#length_row_final;$jn++) {      }
     if ($length_row_final[$jn]!=0) {   }
  $available_length=$available_length-$length_row_final[$jn];   push @min_len, $localmin;
  $needed++;   push @max_len, $localmax;
     }   }
  }   for (my $jn=0;$jn<=$Apache::londefdef::table[-1]{'counter_columns'};$jn++) {
  $needed=$#length_row_final-$needed+1;      my $localmin=0,;
  for (my $jn=0;$jn<=$#length_row_final;$jn++) {      for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
     if ($length_row_final[$jn]==0) {   if ($localmin<$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn]) {
  if ($length_raw_row[$jn]<$available_length) {      $localmin=$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn];
     $length_row_final[$jn]=$length_raw_row[$jn];  
     $available_length=$available_length-$length_raw_row[$jn];  
     $needed--;  
  }   }
     }      }
       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;
       }
  }   }
  for (my $jn=0;$jn<=$#length_row_final;$jn++) {         #final adjustment of column width
     if ($length_row_final[$jn]==0) {   my @fwidth=@{$Apache::londefdef::table[-1]{'TeXlen'}[0]};#final width array
  $length_row_final[$jn]=0.9*$available_length/$needed;   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 %          #recalculation for the use of all available width if width is defined in %
         if ($Apache::londefdef::table[-1]{'percent'}==1) {          if ($Apache::londefdef::table[-1]{'percent'}==1) {
     my $current=0;       my $current=0; 
     for (my $i=0;$i<=$#length_row_final;$i++) {        for (my $i=0;$i<=$#fwidth;$i++) {  
  $current+=$length_row_final[$i];   $current+=$fwidth[$i];
     }      }
     my $coef=$Apache::londefdef::table[-1]{'width'}/$current;      my $coef=$Apache::londefdef::table[-1]{'width'}/$current;
     for (my $i=0;$i<=$#length_row_final;$i++) {        for (my $i=0;$i<=$#fwidth;$i++) {  
  $length_row_final[$i]*=$coef;   $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   #fill the table
  for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {   for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
     for (my $jn=0;$jn<=$#length_row_final;$jn++) {      for (my $jn=0;$jn<=$#fwidth;$jn++) {
  my $substituted=$length_row_final[$jn];   if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
  $Apache::londefdef::table[-1]{'rowdata'}[$in]=~s/TOBECHANGEDONNUMBER/$substituted mm/;      $output.='\begin{center}';
     }   } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
     $output .=  $Apache::londefdef::table[-1]{'rowdata'}[$in];      $output.=' \hfill \llap{'
     chop $output;   }
     $output .= ' \\\\ ';   $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) {       if ($#Apache::londefdef::table > 0) {    
     my $inmemory = $Apache::londefdef::table[-1]{'output'};      my $inmemory = $Apache::londefdef::table[-1]{'output'};
     pop @Apache::londefdef::table;      pop @Apache::londefdef::table;
Line 1917  sub start_tr { Line 2031  sub start_tr {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $Apache::londefdef::table[-1]{'row_number'}++;   $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 '') {   if ($alignchar ne '') {
     push @ {$Apache::londefdef::table[-1]{'rows'} }, $alignchar;      push @ {$Apache::londefdef::table[-1]{'rows'} },substr($alignchar,0,1);
  } else {   } else {
     push @ {$Apache::londefdef::table[-1]{'rows'} }, 'l';      push @ {$Apache::londefdef::table[-1]{'rows'} }, 'l';
  }   }
  push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'});   push ( @{ $Apache::londefdef::table[-1]{'rowdata'} }, $Apache::londefdef::table[-1]{'hinc'});
  $Apache::londefdef::table[-1]{'counter_columns'} = -1;   $Apache::londefdef::table[-1]{'counter_columns'} = -1;
  $Apache::londefdef::table[-1]{'TeXlength'} = '';   push @ {$Apache::londefdef::table[-1]{'TeXlen'}}, [];
   $Apache::londefdef::table[-1]{'length'} = '';   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;      return $currentstring;
 }  }
Line 1940  sub end_tr { Line 2057  sub end_tr {
  if ($Apache::londefdef::TD_redirection) {   if ($Apache::londefdef::TD_redirection) {
     &end_td_tex($parstack,$parser,$safeeval);          &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;      return $currentstring;
 }  }
Line 1978  sub tag_check { Line 2093  sub tag_check {
     
 sub start_td_tex {  sub start_td_tex {
     my ($parstack,$parser,$safeeval) = @_;      my ($parstack,$parser,$safeeval) = @_;
     my $what_to_push = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);      my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
     if ($what_to_push eq '') {      if ($alignchar eq '') {
  $what_to_push = substr($Apache::londefdef::table[-1]{'rows'}[0],0,1);;   $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'}++;      $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();      &Apache::lonxml::startredirection();
     return '';      return '';
 }  }
Line 1994  sub end_td_tex { Line 2115  sub end_td_tex {
     my $data=&Apache::lonxml::endredirection();      my $data=&Apache::lonxml::endredirection();
     my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);      my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
     if (defined $TeXwidth) {      if (defined $TeXwidth) {
  my $current_length=&recalc($TeXwidth);   push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
  $current_length=~/(\d+)/;   push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
  $Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';   push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
  $Apache::londefdef::table[-1]{'length'} .= '0,';  
     } else {      } else {
  if ($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) {   if (($data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) or ($data=~m/\[(\d+\.?\d*)\s*mm\]/)) {
     my $current_length=&recalc($1);      my $garbage_data=$data;
     $current_length=~/(\d+\.?\d*)/;      my $fwidth=0;
     $Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';              while ($garbage_data=~m/width\s*=\s*(\d+\.?\d*\s*(mm|cm|in|pc|pt)*)/) {
     $Apache::londefdef::table[-1]{'length'} .= '0,';   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 {     } else {  
     $data=~s/^\s+(\S.*)/$1/;       $data=~s/^\s+(\S.*)/$1/; 
     $data=~s/(.*\S)\s+$/$1/;      $data=~s/(.*\S)\s+$/$1/;
     $data=~s/(\s)+/$1/;      $data=~s/(\s)+/$1/;
     my $current_length=0;      my ($current_length,$min_length)=(0,0);
     if ($data=~/\\vskip/) {      if ($data=~/\\vskip/) {
                 my $newdata=$data;                  my $newdata=$data;
  $newdata=~s/\\vskip \d*\.?\d*\s*mm/THISISJUSTTEMPORARYSEPARATOR/g;   $newdata=~s/\\vskip \d*\.?\d*\s*mm/THISISJUSTTEMPORARYSEPARATOR/g;
  my @newdata=split(/THISISJUSTTEMPORARYSEPARATOR/,$newdata);   my @newdata=split(/THISISJUSTTEMPORARYSEPARATOR/,$newdata);
  foreach my $elementdata (@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;}      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 {      } 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.',';      push @ {$Apache::londefdef::table[-1]{'TeXlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
     $Apache::londefdef::table[-1]{'TeXlength'} .= '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++) {            for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {         
     $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$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'';      return'';
 }  }
   
Line 3408  sub recalc { Line 3553  sub recalc {
   
 sub LATEX_length {  sub LATEX_length {
     my $garbage=shift;      my $garbage=shift;
     $garbage=~s/^\s+(\S.*)/$1/;       $garbage=~s/^\s+$//;
     $garbage=~s/(.*\S)\s+$/$1/;      $garbage=~s/^\s+(\S.*)/$1/;#space before 
     $garbage=~s/(\s)+/$1/;      $garbage=~s/(.*\S)\s+$/$1/;#space after 
     $garbage=~s/(\\begin{([^\}]+)}|\\end{([^\}]+)})//g;      $garbage=~s/(\s)+/$1/;#only one space
     $garbage=~s/(\$\_\{|\$\_|\$\^{|\$\^|\}\$|\$)//g;      $garbage=~s/(\\begin{([^\}]+)}|\\end{([^\}]+)})//g;#remove LaTeX \begin{...} and \end{...}
     $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/(\$\_\{|\$\_|\$\^{|\$\^|\}\$)//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/(\\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/(\\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/(\\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/(\\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)/ /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;       $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);      my  $value=length($garbage);
     return $value;      return $value;
 }  }

Removed from v.1.205  
changed lines
  Added in v.1.206


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>