@@ -637,7 +653,7 @@ sub start_h1 {
} elsif ($target eq 'tex') {
my $pre;
my $align=lc(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1));
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -660,9 +676,9 @@ sub end_h1 {
if ($target eq 'web') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -686,7 +702,7 @@ sub start_h2 {
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -706,9 +722,9 @@ sub end_h2 {
if ($target eq 'web') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -729,7 +745,7 @@ sub start_h3 {
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -749,9 +765,9 @@ sub end_h3 {
if ($target eq 'web') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -772,7 +788,7 @@ sub start_h4 {
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -792,9 +808,9 @@ sub end_h4 {
if ($target eq 'web') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -815,7 +831,7 @@ sub start_h5 {
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -835,9 +851,9 @@ sub end_h5 {
if ($target eq 'web') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -858,7 +874,7 @@ sub start_h6 {
} elsif ($target eq 'tex') {
my $pre;
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$pre='\begin{center}';
} elsif ($align eq 'left') {
$pre='\rlap{';
@@ -878,9 +894,9 @@ sub end_h6 {
if ($target eq 'web') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- my $post;
+ my $post='\vskip 0 mm ';
my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if (($align eq 'center') || (not defined $align)) {
+ if ($align eq 'center') {
$post='\end{center}';
} elsif ($align eq 'left') {
$post='} \hfill'.'\vskip 0 mm ';
@@ -1114,7 +1130,9 @@ sub start_p {
$currentstring='\makebox['.$ENV{'form.textwidth'}.']{\hfill\llap{';
} elsif ($align eq 'left') {
$currentstring='\noindent\makebox['.$ENV{'form.textwidth'}.']{\rlap{';
- }
+ } else {
+ $currentstring='\par ';
+ }
my $signal=1;# does not work inside ...
foreach my $tag (@$tagstack) {if (lc($tag) eq 'b') {$signal=0;}
if (!$signal) {$currentstring = '';}
@@ -1129,16 +1147,16 @@ sub end_p {
if ($target eq 'web') {
$currentstring .= $token->[2];
} elsif ($target eq 'tex') {
- if ($$tagstack[-1] eq 'p') {
- my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
- if ($align eq 'center') {
- $currentstring .= '\end{center}';
- } elsif ($align eq 'right') {
- $currentstring .= '}}';
- } elsif ($align eq 'left') {
- $currentstring .= '}\hfill}';
- }
- }
+ my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
+ if (not defined $align) {
+ $currentstring.='\strut\\\\\strut ';
+ } elsif ($align eq 'center') {
+ $currentstring .= '\end{center}';
+ } elsif ($align eq 'right') {
+ $currentstring .= '}}';
+ } elsif ($align eq 'left') {
+ $currentstring .= '}\hfill}';
+ }
}
return $currentstring;
}
@@ -1150,8 +1168,20 @@ sub start_br {
if ($target eq 'web') {
$currentstring .= $token->[4];
} elsif ($target eq 'tex') {
- if ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') {
- $currentstring .= '\vskip 0.2 mm ';
+ my @tempo=@$tagstack;
+ my $signal=0;
+ for (my $i=$#tempo;$i>=0;$i--) {
+ if (($tempo[$i] eq 'b') || ($tempo[$i] eq 'strong') ||
+ ($tempo[$i] eq 'ol') || ($tempo[$i] eq 'ul') ||
+ ($tempo[$i] eq 'td') || ($tempo[$i] eq 'th')) {
+ $signal=1;
+ last;
+ }
+ }
+ if ($signal) {
+ $currentstring .= ' \vskip 0 mm ';
+ } elsif ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') {
+ $currentstring .= '\strut \\\\ \strut ';
}
}
return $currentstring;
@@ -1247,9 +1277,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 ''; }
}
@@ -1267,8 +1295,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);
@@ -1441,7 +1467,9 @@ sub start_a {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
my $currentstring = '';
if ($target eq 'web') {
- $currentstring .= $token->[4];
+ my $href=&Apache::lonxml::get_param('href',$parstack,$safeeval,
+ undef,1);
+ $currentstring=&Apache::lonenc::encrypt_ref($token,{'href'=>$href});
} elsif ($target eq 'tex') {
my $a=&Apache::lonxml::get_param('href',$parstack,$safeeval,undef,1);
my $b=&Apache::lonxml::get_param('name',$parstack,$safeeval,undef,1);
@@ -1473,17 +1501,28 @@ sub start_li {
if ($target eq 'web') {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
- my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,1);
- if ($type=~/circle/) {
- $currentstring .= ' \item[o] ';
+ my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
+ my $value=&Apache::lonxml::get_param('value',$parstack,$safeeval,undef,0);
+ #FIXME need to support types i and I
+ if ($type=~/disc/) {
+ $currentstring .= ' \item[$\bullet$] ';
+ } elsif ($type=~/circle/) {
+ $currentstring .= ' \item[$\circ$] ';
} elsif ($type=~/square/) {
- $currentstring .= ' \item[$\Box$] ';
- } elsif ($type ne '') {
- $currentstring .= ' \item['.$type.'] ';
+ $currentstring .= ' \item[$\diamond$] ';
+ } elsif ($type eq '1') {
+ $currentstring .= ' \item['.($Apache::londefdef::list_index+1).'.]';
+ } elsif ($type eq 'A') {
+ $currentstring .= ' \item['.('A'..'Z')[$Apache::londefdef::list_index].'.]';
+ } elsif ($type eq 'a') {
+ $currentstring .= ' \item['.('a'..'z')[$Apache::londefdef::list_index].'.]';
+ } elsif ($value ne '') {
+ $currentstring .= ' \item['.$value.'] ';
} else {
$currentstring .= ' \item ';
}
- }
+ $Apache::londefdef::list_index++;
+ }
return $currentstring;
}
@@ -1530,23 +1569,24 @@ sub start_ul {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
my $TeXtype=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
+ $Apache::londefdef::list_index=0;
if ($TeXtype eq 'disc') {
- $currentstring .= ' \renewcommand{\labelitemi}{$\bullet$}
- \renewcommand{\labelitemii}{$\bullet$}
- \renewcommand{\labelitemiii}{$\bullet$}
- \renewcommand{\labelitemiv}{$\bullet$}';
+ $currentstring .= '\renewcommand{\labelitemi}{$\bullet$}'.
+ '\renewcommand{\labelitemii}{$\bullet$}'.
+ '\renewcommand{\labelitemiii}{$\bullet$}'.
+ '\renewcommand{\labelitemiv}{$\bullet$}';
} elsif ($TeXtype eq 'circle') {
- $currentstring .= ' \renewcommand{\labelitemi}{$\circ$}
- \renewcommand{\labelitemii}{$\circ$}
- \renewcommand{\labelitemiii}{$\circ$}
- \renewcommand{\labelitemiv}{$\circ$}';
+ $currentstring .= '\renewcommand{\labelitemi}{$\circ$}'.
+ '\renewcommand{\labelitemii}{$\circ$}'.
+ '\renewcommand{\labelitemiii}{$\circ$}'.
+ '\renewcommand{\labelitemiv}{$\circ$}';
} elsif ($TeXtype eq 'square') {
- $currentstring .= ' \renewcommand{\labelitemi}{$\diamond$}
- \renewcommand{\labelitemii}{$\diamond$}
- \renewcommand{\labelitemiii}{$\diamond$}
- \renewcommand{\labelitemiv}{$\diamond$}';
+ $currentstring .= '\renewcommand{\labelitemi}{$\diamond$}'.
+ '\renewcommand{\labelitemii}{$\diamond$}'.
+ '\renewcommand{\labelitemiii}{$\diamond$}'.
+ '\renewcommand{\labelitemiv}{$\diamond$}';
}
- $currentstring .= '\begin{itemize}';
+ $currentstring .= '\strut \begin{itemize}';
}
return $currentstring;
}
@@ -1557,10 +1597,10 @@ sub end_ul {
if ($target eq 'web') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
- $currentstring = '\end{itemize} \renewcommand{\labelitemi}{$\bullet$}
- \renewcommand{\labelitemii}{$\bullet$}
- \renewcommand{\labelitemiii}{$\bullet$}
- \renewcommand{\labelitemiv}{$\bullet$}';
+ $currentstring = '\end{itemize} \renewcommand{\labelitemi}{$\bullet$}'.
+ '\renewcommand{\labelitemii}{$\bullet$}'.
+ '\renewcommand{\labelitemiii}{$\bullet$}'.
+ '\renewcommand{\labelitemiv}{$\bullet$}\strut ';
}
return $currentstring;
}
@@ -1618,34 +1658,35 @@ sub start_ol {
if ($target eq 'web') {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
+ $Apache::londefdef::list_index=0;
my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
if ($type eq '1') {
- $currentstring .= ' \renewcommand{\labelenumi}{\arabic{enumi}.}
- \renewcommand{\labelenumii}{\arabic{enumii}.}
- \renewcommand{\labelenumiii}{\arabic{enumiii}.}
- \renewcommand{\labelenumiv}{\arabic{enumiv}.}';
+ $currentstring .= '\renewcommand{\labelenumi}{\arabic{enumi}.}'.
+ '\renewcommand{\labelenumii}{\arabic{enumii}.}'.
+ '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.
+ '\renewcommand{\labelenumiv}{\arabic{enumiv}.}';
} elsif ($type eq 'A') {
- $currentstring .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}
- \renewcommand{\labelenumii}{\Alph{enumii}.}
- \renewcommand{\labelenumiii}{\Alph{enumiii}.}
- \renewcommand{\labelenumiv}{\Alph{enumiv}.}';
+ $currentstring .= '\renewcommand{\labelenumi}{\Alph{enumi}.}'.
+ '\renewcommand{\labelenumii}{\Alph{enumii}.}'.
+ '\renewcommand{\labelenumiii}{\Alph{enumiii}.}'.
+ '\renewcommand{\labelenumiv}{\Alph{enumiv}.}';
} elsif ($type eq 'a') {
- $currentstring .= ' \renewcommand{\labelenumi}{\alph{enumi}.}
- \renewcommand{\labelenumii}{\alph{enumii}.}
- \renewcommand{\labelenumiii}{\alph{enumiii}.}
- \renewcommand{\labelenumiv}{\alph{enumiv}.} ';
+ $currentstring .= '\renewcommand{\labelenumi}{\alph{enumi}.}'.
+ '\renewcommand{\labelenumii}{\alph{enumii}.}'.
+ '\renewcommand{\labelenumiii}{\alph{enumiii}.}'.
+ '\renewcommand{\labelenumiv}{\alph{enumiv}.}';
} elsif ($type eq 'i') {
- $currentstring .= ' \renewcommand{\labelenumi}{\roman{enumi}.}
- \renewcommand{\labelenumii}{\roman{enumii}.}
- \renewcommand{\labelenumiii}{\roman{enumiii}.}
- \renewcommand{\labelenumiv}{\roman{enumiv}.} ';
+ $currentstring .= '\renewcommand{\labelenumi}{\roman{enumi}.}'.
+ '\renewcommand{\labelenumii}{\roman{enumii}.}'.
+ '\renewcommand{\labelenumiii}{\roman{enumiii}.}'.
+ '\renewcommand{\labelenumiv}{\roman{enumiv}.}';
} elsif ($type eq 'I') {
- $currentstring .= ' \renewcommand{\labelenumi}{\Roman{enumi}.}
- \renewcommand{\labelenumii}{\Roman{enumii}.}
- \renewcommand{\labelenumiii}{\Roman{enumiii}.}
- \renewcommand{\labelenumiv}{\Roman{enumiv}.} ';
+ $currentstring .= '\renewcommand{\labelenumi}{\Roman{enumi}.}'.
+ '\renewcommand{\labelenumii}{\Roman{enumii}.}'.
+ '\renewcommand{\labelenumiii}{\Roman{enumiii}.}'.
+ '\renewcommand{\labelenumiv}{\Roman{enumiv}.}';
}
- $currentstring .= '\begin{enumerate}';
+ $currentstring .= '\strut \begin{enumerate}';
}
return $currentstring;
}
@@ -1656,10 +1697,10 @@ sub end_ol {
if ($target eq 'web') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
- $currentstring = '\end{enumerate} \renewcommand{\labelenumi}{\arabic{enumi}.}
- \renewcommand{\labelenumii}{\arabic{enumii}.}
- \renewcommand{\labelenumiii}{\arabic{enumiii}.}
- \renewcommand{\labelenumiv}{\arabic{enumiv}.}';
+ $currentstring = '\end{enumerate}\renewcommand{\labelenumi}{\arabic{enumi}.}'.
+ '\renewcommand{\labelenumii}{\arabic{enumii}.}'.
+ '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.
+ '\renewcommand{\labelenumiv}{\arabic{enumiv}.}\strut ';
}
return $currentstring;
}
@@ -1672,9 +1713,11 @@ sub start_dl {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
$currentstring = '\begin{description}';
- @Apache::londefdef::description=();
- $Apache::londefdef::DD_redirection=0;
- $Apache::londefdef::DT_redirection=0;
+ $Apache::londefdef::DL++;
+ push(@Apache::londefdef::description,[]);
+ $Apache::londefdef::DD[$Apache::londefdef::DL]=0;
+ $Apache::londefdef::DT[$Apache::londefdef::DL]=0;
+ $Apache::londefdef::seenDT[$Apache::londefdef::DL]=0;
}
return $currentstring;
}
@@ -1685,18 +1728,17 @@ sub end_dl {
if ($target eq 'web') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
- if ($Apache::londefdef::DT_redirection) {
- my $data=&item_cleanup;
- push @Apache::londefdef::description,'\item['.$data.']';
- $Apache::londefdef::DT_redirection=0;
- } elsif ($Apache::londefdef::DD_redirection) {
- $Apache::londefdef::description[-1].=&Apache::lonxml::endredirection();
- }
- foreach my $element (@Apache::londefdef::description) {
+ if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }
+ if ($Apache::londefdef::DD[-1]) { &end_dd(@_); }
+ foreach my $element (@{$Apache::londefdef::description[-1]}) {
$currentstring.=' '.$element.' ';
}
- @Apache::londefdef::description=();
+ pop(@Apache::londefdef::description);
$currentstring.='\end{description}';
+ delete($Apache::londefdef::DD[$Apache::londefdef::DL]);
+ delete($Apache::londefdef::DT[$Apache::londefdef::DL]);
+ delete($Apache::londefdef::seenDT[$Apache::londefdef::DL]);
+ $Apache::londefdef::DL--;
}
return $currentstring;
}
@@ -1708,16 +1750,11 @@ sub start_dt {
if ($target eq 'web') {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
- if ($Apache::londefdef::DT_redirection) {
- my $data=&item_cleanup;
- push @Apache::londefdef::description,'\item['.$data.']';
- $Apache::londefdef::DT_redirection=0;
- } elsif ($Apache::londefdef::DD_redirection) {
- $Apache::londefdef::description[-1].=&Apache::lonxml::endredirection();
- $Apache::londefdef::DD_redirection=0;
- }
+ if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }
+ if ($Apache::londefdef::DD[-1]) { &end_dd(@_); }
&Apache::lonxml::startredirection();
- $Apache::londefdef::DT_redirection=1;
+ $Apache::londefdef::DT[-1]++;
+ $Apache::londefdef::seenDT[-1]=1;
}
return $currentstring;
}
@@ -1728,9 +1765,11 @@ sub end_dt {
if ($target eq 'web') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
- my $data=&item_cleanup;
- push @Apache::londefdef::description,'\item['.$data.']';
- $Apache::londefdef::DT_redirection=0;
+ if ($Apache::londefdef::DT[-1]) {
+ my $data=&item_cleanup();
+ push(@{$Apache::londefdef::description[-1]},'\item['.$data.'] \strut \vskip 0mm');
+ $Apache::londefdef::DT[-1]--;
+ }
}
return $currentstring;
}
@@ -1749,12 +1788,14 @@ sub start_dd {
if ($target eq 'web') {
$currentstring = $token->[4];
} elsif ($target eq 'tex') {
- if ($Apache::londefdef::DT_redirection) {
- my $data=&item_cleanup;
- push @Apache::londefdef::description,'\item['.$data.']';
- $Apache::londefdef::DT_redirection=0;
- }
- $Apache::londefdef::DD_redirection=1;
+ if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }
+ if ($Apache::londefdef::DD[-1]) { &end_dd(@_);}
+ if (!$Apache::londefdef::seenDT[-1]) {
+ push(@{$Apache::londefdef::description[-1]},'\item[\strut] \strut \vskip 0mm ');
+ }
+ push(@{$Apache::londefdef::description[-1]},'');
+ $Apache::londefdef::description[-1]->[-1].=' \strut ';
+ $Apache::londefdef::DD[-1]++;
&Apache::lonxml::startredirection();
}
return $currentstring;
@@ -1766,50 +1807,62 @@ sub end_dd {
if ($target eq 'web') {
$currentstring = $token->[2];
} elsif ($target eq 'tex') {
- $Apache::londefdef::description[-1].=&Apache::lonxml::endredirection();
- $Apache::londefdef::DD_redirection=0;
+ $Apache::londefdef::description[-1]->[-1].=
+ &Apache::lonxml::endredirection().' \vskip 0mm ';
+ $Apache::londefdef::DD[-1]--;
}
return $currentstring;
}
#--
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 ';
@@ -1820,9 +1873,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;
}
@@ -1834,64 +1897,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;
@@ -1913,16 +2119,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;
}
@@ -1936,8 +2145,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;
}
@@ -1974,12 +2181,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 '';
}
@@ -1990,40 +2203,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'';
}
@@ -2046,71 +2303,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);
@@ -2120,35 +2462,80 @@ sub start_img {
}
$currentstring.='[IMAGE: '.$alttag.']';
}
+
+ # and render unto TeX that which is LaTeX
+
} elsif ($target eq 'tex') {
- $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
+ #
+ # 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");
+
#if original gif/jpg/png file exist do following:
+ my ($path,$file) = &get_eps_image($src);
+ $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
if (-e $src) {
- #what is the image size?
- my $width_param=&image_size($src,$scaling,$parstack,$safeeval);
- my ($file,$path)=&file_path($src);
- my $newsrc = $src;
- $newsrc =~ s/\.(gif|jpg|png)$/.eps/i;
- $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.'} ';
+ my ($height_param,$width_param)=
+ &image_size($src,0.3,$parstack,$safeeval);
+ $currentstring .= '\graphicspath{{'.$path.'}}'
+ .'\includegraphics[width='.$width_param.' mm,height='.$height_param.'mm]{'.$file.'} ';
+
+ # 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 = "\\strut\\newline\n".
+ '\parbox{'.$width_param.'mm}{'.$currentstring.'}';
}
- } else {
- #there is no eps counterpart for image - check for ps one
- $newsrc =~ s/\.eps$/\.ps/;
- if (-e $newsrc) {
- #ps counterpart for image exist
- $file =~ s/\.eps$/\.ps/;
- if ($path) {
- $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
- }
- } else {
- #care about eps dynamical generation
- $currentstring.='\vskip 1 mm '.&eps_generation($src,$file,$width_param);
+ } 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
@@ -2158,12 +2545,11 @@ sub start_img {
$alt=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src);
}
- if ($alt) {
- $currentstring .= ' '.$alt.' ';
- } else {
- # tag will care about replication
- }
+ if ($alt) { $currentstring .= ' '.$alt.' '; }
}
+
+ # 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).
@@ -2174,35 +2560,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;
}
@@ -2232,7 +2644,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);
@@ -2275,7 +2690,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);
@@ -2311,7 +2726,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;
@@ -2334,7 +2758,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);
@@ -3332,32 +3756,86 @@ sub image_replication {
}
sub image_size {
- my ($src,$scaling,$parstack,$safeeval)=@_;
+ my ($src,$scaling,$parstack,$safeeval,$depth,$cis)=@_;
#size of image from gif/jpg/jpeg/png
+ $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
my $image = Image::Magick->new;
my $current_figure = $image->Read($src);
my $width_param = $image->Get('width') * $scaling;;
my $height_param = $image->Get('height') * $scaling;;
- undef $image;
+ undef($image);
#do we have any specified LaTeX size of the picture?
- my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval);
- my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval);
+ my $toget='TeXwidth'; if ($cis) { $toget=lc($toget); }
+ my $TeXwidth = &Apache::lonxml::get_param($toget,$parstack,
+ $safeeval,$depth,$cis);
+ $toget='TeXheight'; if ($cis) { $toget=lc($toget); }
+ my $TeXheight = &Apache::lonxml::get_param($toget,$parstack,
+ $safeeval,$depth,$cis);
#do we have any specified web size of the picture?
my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval,
- undef,1);
- if ($TeXwidth ne '') {
+ $depth,1);
+ if ($TeXwidth) {
+ my $old_width_param=$width_param;
if ($TeXwidth=~/(\d+)\s*\%/) {
$width_param = $1*$ENV{'form.textwidth'}/100;
} else {
$width_param = $TeXwidth;
}
- } elsif ($TeXheight ne '') {
- $width_param = $TeXheight/$height_param*$width_param;
- } elsif ($width ne '') {
- $width_param = $width*$scaling;
+ $height_param=$TeXwidth/$old_width_param*$height_param;
+ } elsif ($TeXheight) {
+ $height_param = $TeXheight;
+ $width_param = $TeXheight/$height_param*$width_param;
+ } elsif ($width) {
+ 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;
+ }
+ 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 get_eps_image {
+ my ($src)=@_;
+ my $orig_src=$src;
+ $src=~s/\.(gif|png|jpg|jpeg)$/\.eps/i;
+ $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
+ if (! -e $src) {
+ if (&Apache::lonnet::repcopy($src) ne OK ) {
+ #if replication failed try to find ps file
+ $src=~s/\.eps$/\.ps/;
+ #if no ps file try to replicate it
+ if (not -e $src &&
+ &Apache::lonnet::repcopy($src) ne OK) {
+ #if replication failed try to produce eps file dynamically
+ $src=~s/\.ps$/\.eps/;
+ my $temp_file;
+ open(FILE,">>/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat");
+ my $newsrc=$orig_src;
+ $newsrc =~ s|(.*)/res/|/home/httpd/html/res/|;
+ print FILE "$newsrc\n";
+ $src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
+ $src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;
+ }
+ }
}
- if ($width_param > $ENV{'form.textwidth'}) {$width_param =0.95*$ENV{'form.textwidth'}}
- return $width_param;
+ my ($path,$file)=($src=~m|(.*)/([^/]*)$|);
+ return ($path.'/',$file);
}
sub eps_generation {
@@ -3371,7 +3849,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 {
@@ -3404,18 +3890,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;
}