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
+ #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*)/;
+ $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
+ $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]{'forcetablewidth'}=1;
+ $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('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);
unless (defined $border) { $border = 0; }
if ($border) {
$Apache::londefdef::table[-1]{'hinc'} = '\hline ';
@@ -1819,9 +1869,19 @@ 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'}='\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'}=[];
+ $Apache::londefdef::table[-1]{'align'}=[];
+ $currentstring='\keephidden{NEW TABLE ENTRY}';
+ }
return $currentstring;
}
@@ -1833,64 +1893,207 @@ 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);
+ 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++;
+ } 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;
+ $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;
+ }
+ }
+ #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) {
+ 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) {
+ $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
+ 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];
+ }
+ }
+ } else {
+ for (my $jn=0;$jn<=$#min_len;$jn++) {
+ $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;
+ #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];
+ }
+ 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('TeXDropEmptyColumns',$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.='\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}\vspace*{-6 mm}';
+ } 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}\strut\newline\strut ';
if ($#Apache::londefdef::table > 0) {
my $inmemory = $Apache::londefdef::table[-1]{'output'};
pop @Apache::londefdef::table;
@@ -1912,16 +2115,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 +2141,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 +2177,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 +2199,84 @@ 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';
+ } 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/;
$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*&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'';
}
@@ -2045,71 +2299,156 @@ 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;
}
+
#-- tag (end tag forbidden)
+#
+# Render the tag.
+# has the following attributes (in addition to the
+# standard HTML ones:
+# TeXwrap - Governs how the tex target will try to wrap text around
+# horizontally aligned images.
+# TeXwidth - The width of the image when rendered for print (mm).
+# TeXheight - The height of the image when rendered for print (mm)
+# (Note there seems to also be support for this as a % of page size)
+#
sub start_img {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,
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;
my $currentstring = '';
my $scaling = .3;
+
+ # Render unto browsers that which are the browser's...
+
if ($target eq 'web') {
if ($ENV{'browser.imagesuppress'} ne 'on') {
- $currentstring.= $token->[4];
+ $currentstring.=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});
} else {
my $alttag= &Apache::lonxml::get_param
('alt',$parstack,$safeeval,undef,1);
@@ -2119,21 +2458,61 @@ sub start_img {
}
$currentstring.='[IMAGE: '.$alttag.']';
}
+
+ # and render unto TeX that which is LaTeX
+
} elsif ($target eq 'tex') {
+ #
+ # The alignment will require some superstructure to be put around
+ # the \includegraphics stuff. At present we can only partially
+ # simulate the alignments offered by html.
+ #
+ #
+ my $align = lc(&Apache::lonxml::get_param('align',
+ $parstack,
+ $safeeval,
+ undef,1));
+ if(!$align) {
+ $align = "bottom"; # This is html's default so it's ours too.
+ }
+ #
+ &Apache::lonxml::debug("Alignemnt = $align");
+ # LaTeX's image/text wrapping is really bad since it wants to
+ # make figures float.
+ # The user has the optional parameter (applicable only to l/r
+ # alignment to use the picins/parpic directive to get wrapped text
+ # this is also imperfect.. that's why we give them a choice...
+ # so they can't yell at us for our choice.
+ #
+ my $latex_rendering = &Apache::lonxml::get_param('TeXwrap',
+ $parstack,
+ $safeeval,
+ undef,0);
+ &Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
+ if(!$latex_rendering) {
+ $latex_rendering = "parbox";
+ }
+ &Apache::lonxml::debug("LaTeX rendering = $latex_rendering");
+
+ my $oldSRC=$src;
+ $oldSRC=~s/\.(gif|jpg|png)$/\.eps/;
$src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
#if original gif/jpg/png file exist do following:
if (-e $src) {
#what is the image size?
- my $width_param=&image_size($src,$scaling,$parstack,$safeeval);
+ my $width_param=&image_width($src,$scaling,$parstack,$safeeval);
+ my $height_param=&image_height($src,$scaling,$parstack,$safeeval);
my ($file,$path)=&file_path($src);
my $newsrc = $src;
$newsrc =~ s/\.(gif|jpg|png)$/.eps/i;
+ &Apache::lonnet::repcopy($oldSRC);
$file=~s/\.(gif|jpg|png)$/.eps/i;
#where can we find the picture?
if (-e $newsrc) {
#eps counterpart for image exist
if ($path) {
- $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
+ $currentstring .= '\graphicspath{{'.$path.'}}'
+ .'\includegraphics[width='.$width_param.' mm,height='.$height_param.'mm]{'.$file.'} ';
}
} else {
#there is no eps counterpart for image - check for ps one
@@ -2142,13 +2521,42 @@ sub start_img {
#ps counterpart for image exist
$file =~ s/\.eps$/\.ps/;
if ($path) {
- $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
+ $currentstring .= '\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
}
} else {
#care about eps dynamical generation
- $currentstring.='\vskip 1 mm '.&eps_generation($src,$file,$width_param);
+ $currentstring.=&eps_generation($src,$file,$width_param);
}
}
+ # If there's an alignment specification we need to honor it here.
+ # For the horizontal alignments, we will also honor the
+ # value of the latex specfication. The default is parbox,
+ # and that's used for illegal values too.
+ #
+ # Even though we set a default alignment value, the user
+ # could have given us an illegal value. In that case we
+ # just use the default alignment of bottom..
+ if ($align eq "top") {
+ $currentstring = '\raisebox{-'.$height_param.'mm}{'.$currentstring.'}';
+ } elsif (($align eq "center") || ($align eq "middle")) { # Being kind
+ my $offset = $height_param/2;
+ $currentstring = '\raisebox{-'.$offset.'mm}{'.$currentstring.'}';
+ } elsif ($align eq "left") {
+ if ($latex_rendering eq "parpic") {
+ $currentstring = '\parpic[l]{'.$currentstring.'}';
+ } else { # parbox rendering
+ $currentstring = '\newline'."\n".'\parbox{'.$width_param.'mm}{'.$currentstring.'}';
+ }
+ } elsif ($align eq "right") {
+ if ($latex_rendering eq "parpic") {
+ $currentstring = '\parpic[r]{'.$currentstring.'}';
+ } else { # parbox rendering.
+ $currentstring = '\parbox{'.$width_param.'mm}{\begin{flushright}'
+ .$currentstring.'\end{flushright}} \newline'."\n";
+ }
+ } else { # Bottom is also default.
+ # $currentstring = '\raisebox{'.$height_param.'mm}{'.$currentstring.'}';
+ }
} else {
#original image file doesn't exist so check the alt attribute
my $alt =
@@ -2163,6 +2571,11 @@ sub start_img {
# tag will care about replication
}
}
+
+ # And here's where the semi-quote breaks down: allow the user
+ # to edit the beast as well by rendering the problem for edit:
+
+
} elsif ($target eq 'edit') {
$currentstring .=&Apache::edit::tag_start($target,$token);
$currentstring .=&Apache::edit::text_arg('Image Url:','src',$token,70).
@@ -2173,35 +2586,61 @@ sub start_img {
$currentstring .=&Apache::edit::text_arg('height (pixel):','height',$token,5).' ';
$currentstring .=&Apache::edit::text_arg('TeXwidth (mm):','TeXwidth',$token,5);
$currentstring .=&Apache::edit::text_arg('TeXheight (mm):','TeXheight',$token,5);
+ $currentstring .=&Apache::edit::select_arg('Alignment:','align',
+ ['','bottom','middle','top','left','right'],$token,5);
+ $currentstring .=&Apache::edit::select_arg('TeXwrap:', 'TeXwrap',
+ ['', 'parbox', 'parpic'], $token, 2);
$currentstring .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
- my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval);
- my $alt=&Apache::lonxml::get_param('alt',$parstack,$safeeval);
- my $width=&Apache::lonxml::get_param('width',$parstack,$safeeval);
- my $height=&Apache::lonxml::get_param('height',$parstack,$safeeval);
+ my $src= &Apache::lonxml::get_param('src',$parstack,$safeeval);
+ my $alt= &Apache::lonxml::get_param('alt',$parstack,$safeeval);
+ my $width= &Apache::lonxml::get_param('width',$parstack,$safeeval);
+ my $height= &Apache::lonxml::get_param('height',$parstack,$safeeval);
+
+
$currentstring .= '[2]{'src'};
- if (!$token->[2]{'width'} && !$token->[2]{'height'}) {
- $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
- &image_replication($src);
- if (-e $src) {
- my $image = Image::Magick->new;
- my ($width, $height, $size, $format) = $image->Ping($src);
- if ($width && $height) {
- $token->[2]{'width'} =$width;
- $token->[2]{'height'}=$height;
- $constructtag=1;
+ my ($osrc,$owidth,$oheight)=
+ ($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'});
+ my $ctag=&Apache::edit::get_new_args($token,$parstack,
+ $safeeval,'src','alt','align',
+ 'TeXwidth','TeXheight', 'TeXwrap',
+ 'width','height');
+ my ($nsrc,$nwidth,$nheight)=
+ ($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'});
+ my $loc=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$nsrc);
+ &image_replication($loc);
+ my ($iwidth,$iheight);
+ if (-e $loc) {
+ my $image = Image::Magick->new;
+ $image->Read($loc);
+ ($iwidth, $iheight) = ($image->Get('width'),
+ $image->Get('height'));
+ }
+ if ($osrc ne $nsrc || (!$nwidth && !$nheight)) {
+ # changed image or no size specified,
+ # if they didn't explicitly change the
+ # width or height use the ones from the image
+ if ($iwidth && $iheight) {
+ if ($owidth == $nwidth || (!$nwidth && !$nheight)) {
+ $token->[2]{'width'} = $iwidth;$ctag=1;
+ }
+ if ($oheight == $nheight || (!$nwidth && !$nheight)) {
+ $token->[2]{'height'}=$iheight;$ctag=1;
}
}
}
- if ($constructtag) {$currentstring=&Apache::edit::rebuild_tag($token);}
+ my ($cwidth,$cheight)=($token->[2]{'width'},$token->[2]{'height'});
+ # if we don't have a width or height
+ if ($iwidth && $cwidth && !$cheight) {
+ $token->[2]{'height'}=int(($cwidth/$iwidth)*$iheight);$ctag=1;
+ }
+ if ($iheight && $cheight && !$cwidth) {
+ $token->[2]{'width'}=int(($cheight/$iheight)*$iwidth);$ctag=1;
+ }
+ if ($ctag) {$currentstring=&Apache::edit::rebuild_tag($token);}
}
return $currentstring;
}
@@ -2231,7 +2670,10 @@ sub start_applet {
my $currentstring = '';
if ($target eq 'web') {
if ($ENV{'browser.appletsuppress'} ne 'on') {
- $currentstring = $token->[4];
+ $currentstring = &Apache::lonenc::encrypt_ref($token,
+ {'code'=>$code,
+ 'archive'=>$archive}
+ );
} else {
my $alttag= &Apache::lonxml::get_param('alt',$parstack,
$safeeval,undef,1);
@@ -2274,7 +2716,7 @@ sub start_embed {
my $currentstring = '';
if ($target eq 'web') {
if ($ENV{'browser.embedsuppress'} ne 'on') {
- $currentstring = $token->[4];
+ $currentstring=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});
} else {
my $alttag=&Apache::lonxml::get_param
('alt',$parstack,$safeeval,undef,1);
@@ -2310,7 +2752,16 @@ sub start_param {
&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
my $currentstring = '';
if ($target eq 'web') {
- $currentstring = $token->[4];
+ my %toconvert;
+ my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
+ if ($src) { $toconvert{'src'}= $src; }
+ my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval,
+ undef,1);
+ if ($name=~/^cabbase$/i) {
+ $toconvert{'value'}=&Apache::lonxml::get_param('value',$parstack,
+ $safeeval,undef,1);
+ }
+ $currentstring = &Apache::lonenc::encrypt_ref($token,\%toconvert);
} elsif ($target eq 'tex') {
}
return $currentstring;
@@ -2333,7 +2784,7 @@ sub start_allow {
$src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
$Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
&Apache::lonnet::clutter($src);
- &image_replication($src);
+ if ($target eq 'tex') { &image_replication($src); }
my $result;
if ($target eq 'edit') {
$result .=&Apache::edit::tag_start($target,$token);
@@ -3345,18 +3796,39 @@ sub image_size {
my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval,
undef,1);
if ($TeXwidth ne '') {
+ my $old_width_param=$width_param;
if ($TeXwidth=~/(\d+)\s*\%/) {
$width_param = $1*$ENV{'form.textwidth'}/100;
} else {
$width_param = $TeXwidth;
}
+ $height_param=$TeXwidth/$old_width_param*$height_param;
} elsif ($TeXheight ne '') {
- $width_param = $TeXheight/$height_param*$width_param;
+ $height_param = $TeXheight;
+ $width_param = $TeXheight/$height_param*$width_param;
} elsif ($width ne '') {
+ my $old_width_param=$width_param;
$width_param = $width*$scaling;
+ $height_param=$width_param/$old_width_param*$height_param;
+ }
+ if ($width_param > $ENV{'form.textwidth'}) {
+ my $old_width_param=$width_param;
+ $width_param =0.95*$ENV{'form.textwidth'};
+ $height_param=$width_param/$old_width_param*$height_param;
}
- if ($width_param > $ENV{'form.textwidth'}) {$width_param =0.95*$ENV{'form.textwidth'}}
- return $width_param;
+ return ($height_param, $width_param);
+}
+
+sub image_width {
+ my ($height, $width) = &image_size(@_);
+ return $width;
+}
+# Not yet 100% sure this is correct in all circumstances..
+# due to my uncertainty about mods to image_size.
+#
+sub image_height {
+ my ($height, $width) = &image_size(@_);
+ return $height;
}
sub eps_generation {
@@ -3370,7 +3842,15 @@ sub eps_generation {
$newsrc=~s/\/home\/([^\/]*)\/public_html\//\/$1\//;
$newsrc=~s/\/\.\//\//;
$newsrc=~s/\/([^\/]+)\.(ps|eps)/\//;
- return ' \graphicspath{{/home/httpd/prtspool'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
+ if ($newsrc=~/\/home\/httpd\/lonUsers\//) {
+ $newsrc=~s/\/home\/httpd\/lonUsers//;
+ $newsrc=~s/\/([^\/]+)\/(\w)\/(\w)\/(\w)\//\/$1\//;
+ }
+ if ($newsrc=~/\/userfiles\//) {
+ return ' \graphicspath{{'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
+ } else {
+ return ' \graphicspath{{/home/httpd/prtspool'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
+ }
}
sub file_path {
@@ -3403,18 +3883,25 @@ 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;
my $value=length($garbage);
return $value;
}
500 Internal Server Error
Internal Server Error
The server encountered an internal error or
misconfiguration and was unable to complete
your request.
Please contact the server administrator at
root@localhost to inform them of the time this error occurred,
and the actions you performed just before this error.
More information about this error may be available
in the server error log.