--- loncom/xml/londefdef.pm 2004/04/01 16:11:58 1.206 +++ loncom/xml/londefdef.pm 2004/07/20 15:05:32 1.231 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Tags Default Definition Module # -# $Id: londefdef.pm,v 1.206 2004/04/01 16:11:58 sakharuk Exp $ +# $Id: londefdef.pm,v 1.231 2004/07/20 15:05:32 sakharuk Exp $ # # # Copyright Michigan State University Board of Trustees @@ -156,15 +156,21 @@ sub start_html { @Apache::londefdef::table = (); $currentstring .= '\documentclass[letterpaper]{article}'; if ($ENV{'form.latex_type'}=~'batchmode') {$currentstring .='\batchmode';} - $currentstring .= '\newcommand{\keephidden}[1]{} - \renewcommand{\deg}{$^{\circ}$} - \usepackage{longtable} - \usepackage{textcomp} - \usepackage{makeidx} - \usepackage[dvips]{graphicx} - \usepackage{epsfig}\usepackage{calc} -\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}} -\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}'; + $currentstring .= '\newcommand{\keephidden}[1]{}'. + '\renewcommand{\deg}{$^{\circ}$}'. + '\usepackage{longtable}'. + '\usepackage{textcomp}'. + '\usepackage{makeidx}'. + '\usepackage[dvips]{graphicx}'. + '\usepackage{epsfig}'. + '\usepackage{calc}'. + '\usepackage{amsmath}'. + '\usepackage{amssymb}'. + '\usepackage{amsfonts}'. + '\usepackage{amsthm}'. + '\usepackage{amscd}'. + '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'. + '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}'; } return $currentstring; } @@ -633,7 +639,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{'; @@ -656,9 +662,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 '; @@ -682,7 +688,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{'; @@ -702,9 +708,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 '; @@ -725,7 +731,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{'; @@ -745,9 +751,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 '; @@ -768,7 +774,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{'; @@ -788,9 +794,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 '; @@ -811,7 +817,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{'; @@ -831,9 +837,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 '; @@ -854,7 +860,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{'; @@ -874,9 +880,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 '; @@ -1110,7 +1116,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 = '';}
@@ -1125,15 +1133,13 @@ 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 ($align eq 'center') {
+ $currentstring .= '\end{center}';
+ } elsif ($align eq 'right') {
+ $currentstring .= '}}';
+ } elsif ($align eq 'left') {
+ $currentstring .= '}\hfill}';
}
}
return $currentstring;
@@ -1146,8 +1152,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;
@@ -1523,22 +1541,22 @@ sub start_ul {
} elsif ($target eq 'tex') {
my $TeXtype=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,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;
}
@@ -1549,10 +1567,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;
}
@@ -1612,32 +1630,32 @@ sub start_ol {
} elsif ($target eq 'tex') {
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;
}
@@ -1648,10 +1666,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;
}
@@ -1775,8 +1793,7 @@ sub start_table {
my $aa = {};
push @Apache::londefdef::table, $aa;
$Apache::londefdef::table[-1]{'row_number'} = -1;
- #table's width
- #default coincides with text line length
+ #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*)/;
@@ -1787,7 +1804,7 @@ sub start_table {
$textwidth=$Apache::londefdef::table[-2]{'TeXlen'}[$Apache::londefdef::table[-2]{'row_number'}][$Apache::londefdef::table[-2]{'counter_columns'}];
} else {
#try to use all space not used before (minus 5% for LaTeX table internal) - rather silly
- my $textwidth=$Apache::londefdef::table[-2]{'width'};
+ $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];
}
@@ -1808,11 +1825,12 @@ sub start_table {
$TeXwidth=~/(\d+)/;
$Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
} else {
+ $Apache::londefdef::table[-1]{'forcetablewidth'}=1;
$Apache::londefdef::table[-1]{'width'}=$TeXwidth;
}
#table's border
my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);
- my $permission=&Apache::lonxml::get_param('DropEmptyColumns',$parstack,$safeeval,undef,0);
+ my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);
unless (defined $border) { $border = 0; }
if ($border) {
$Apache::londefdef::table[-1]{'hinc'} = '\hline ';
@@ -1824,11 +1842,12 @@ sub start_table {
$Apache::londefdef::table[-1]{'vvinc'} = '';
}
if ($#Apache::londefdef::table==0) {
- $Apache::londefdef::table[-1]{'output'}='\setlength{\tabcolsep}{1 mm}';
+ $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'}=[];
@@ -1857,7 +1876,7 @@ sub end_table {
}
#free space and number of empty columns
my ($available_space,$empty_columns)=($Apache::londefdef::table[-1]{'width'},0);
-## &Apache::lonnet::logthis("Available space $Apache::londefdef::table[-1]{'width'}");
+ 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++;
@@ -1888,8 +1907,14 @@ sub end_table {
$localmin=$Apache::londefdef::table[-1]{'objectlen'}[$in][$jn];
}
}
- if ($max_len[$jn]<$localmin) {$max_len[$jn]=$localmin;}#object size is bigger
- if ($min_len[$jn]<$localmin) {$min_len[$jn]=$localmin;}#object size is bigger
+ if ($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;
@@ -1904,7 +1929,6 @@ sub end_table {
$space_neeeded=$space_neeeded+$max_len[$jn];
}
if ($space_neeeded<=$available_space) {
-## &Apache::lonnet::logthis("I am in position 1: $space_neeeded <= $available_space");
for (my $jn=0;$jn<=$#max_len;$jn++) {
if ($fwidth[$jn]==0) {
$fwidth[$jn]=$max_len[$jn];
@@ -1917,16 +1941,44 @@ sub end_table {
$space_neeeded+=$min_len[$jn];
}
if ($space_neeeded>$available_space) {
-## &Apache::lonnet::logthis("I am in position 2");
$WARNING=' \textbf{NOT ENOUGH SPACE FOR TABLE} ';
for (my $jn=0;$jn<=$#max_len;$jn++) {
if ($fwidth[$jn]==0) {
$fwidth[$jn]=$min_len[$jn];
}
}
+ #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
-## &Apache::lonnet::logthis("I am in position 3");
my $enlarge_coef=$available_space/$space_neeeded;
my $acsessive=0;
for (my $jn=0;$jn<=$#min_len;$jn++) {
@@ -1952,11 +2004,15 @@ sub end_table {
$fwidth[$jn]=$adjust[$jn];
}
}
+ } else {
+ for (my $jn=0;$jn<=$#min_len;$jn++) {
+ $fwidth[$jn]=$adjust[$jn];
+ }
}
}
}
- #recalculation for the use of all available width if width is defined in %
- if ($Apache::londefdef::table[-1]{'percent'}==1) {
+ #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];
@@ -1967,7 +2023,7 @@ sub end_table {
}
}
#removing of empty columns if allowed
- my $permission=&Apache::lonxml::get_param('DropEmptyColumns',$parstack,$safeeval,undef,0);
+ my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);
if ($permission eq 'yes') {
my @cleaned_table=();
my @cleaned_header=();
@@ -1995,13 +2051,13 @@ sub end_table {
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
for (my $jn=0;$jn<=$#fwidth;$jn++) {
if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
- $output.='\begin{center}';
+ $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}';
+ $output.='\end{center}\vspace*{-6 mm}';
} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
$output.='} ';
}
@@ -2009,7 +2065,7 @@ sub end_table {
}
$output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' ';
}
- $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\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;
@@ -2137,6 +2193,26 @@ sub end_td_tex {
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/;
@@ -2159,7 +2235,7 @@ sub end_td_tex {
$current_length=2.5*&LATEX_length($data);
my @words=split(/ /,$data);
foreach my $word (@words) {
- my $lengthword=2.5*&LATEX_length($word);
+ my $lengthword=2*&LATEX_length($word);
if ($min_length<$lengthword) {$min_length=$lengthword;}
}
}
@@ -2195,55 +2271,128 @@ 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)
sub start_img {
my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
@@ -2251,7 +2400,6 @@ sub start_img {
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;
@@ -2271,6 +2419,12 @@ sub start_img {
}
} elsif ($target eq 'tex') {
$src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
+ #if uploaded restore the path
+ if ($src=~/^\/uploaded\/([^\/]+)\/([^\/]+)\/simplepage\/([^\/]+)$/) {
+ $src=&Apache::loncommon::propath($1,$2).'/userfiles/simplepage/'.$3;
+ } elsif ($src=~/^\/uploaded\/([^\/]+)\/([^\/]+)\/aboutme\/([^\/]+)$/) {
+ $src=&Apache::loncommon::propath($1,$2).'/userfiles/aboutme/'.$3;
+ }
#if original gif/jpg/png file exist do following:
if (-e $src) {
#what is the image size?
@@ -2333,25 +2487,45 @@ sub start_img {
if ($height) { $currentstring.=' height="'.$height.'" '; }
$currentstring .= ' />';
} elsif ($target eq 'modified') {
- my $constructtag=&Apache::edit::get_new_args($token,$parstack,
- $safeeval,'src','alt',
- 'TeXwidth','TeXheight',
- 'width','height');
- $src=$token->[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',
+ 'TeXwidth','TeXheight',
+ '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;
}
@@ -3520,6 +3694,10 @@ sub eps_generation {
$newsrc=~s/\/home\/([^\/]*)\/public_html\//\/$1\//;
$newsrc=~s/\/\.\//\//;
$newsrc=~s/\/([^\/]+)\.(ps|eps)/\//;
+ if ($newsrc=~/\/home\/httpd\/lonUsers\//) {
+ $newsrc=~s/\/home\/httpd\/lonUsers//;
+ $newsrc=~s/\/([^\/]+)\/(\w)\/(\w)\/(\w)\//\/$1\//;
+ }
return ' \graphicspath{{/home/httpd/prtspool'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
}
@@ -3572,8 +3750,6 @@ sub LATEX_length {
$garbage=~s|\\(\w+)\\|\\|g;
$garbage=~s|\\(\w+)(\s*)|$2|g;
$garbage=~s|\+|11|g;
-
- &Apache::lonnet::logthis("garbage was just $garbage");
my $value=length($garbage);
return $value;
}