--- loncom/xml/londefdef.pm	2002/07/03 15:37:10	1.68
+++ loncom/xml/londefdef.pm	2002/07/23 19:15:08	1.75
@@ -1,8 +1,7 @@
-
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.68 2002/07/03 15:37:10 sakharuk Exp $
+# $Id: londefdef.pm,v 1.75 2002/07/23 19:15:08 sakharuk Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -49,6 +48,7 @@ use Apache::lonnet;
 use strict;
 use Apache::lonxml;
 use Apache::File();
+use Image::Magick;
 
 BEGIN {
 
@@ -74,7 +74,7 @@ sub start_m {
   my $currentstring = '';
   if ($target eq 'web') {
     $Apache::lonxml::prevent_entity_encode++;
-    my $inside = &Apache::lonxml::get_all_text("/m",$$parser[-1]);
+    my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);
     $inside ='\\documentstyle{article}'.$inside;
     &Apache::lonxml::debug("M is starting with:$inside:");
     my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval);
@@ -90,7 +90,9 @@ sub start_m {
     }
     #&Apache::lonxml::debug("M is ends with:$currentstring:");
   } elsif ($target eq 'tex') {
-    $currentstring = "";
+    $currentstring = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);
+  } else {
+    my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);
   }
   return $currentstring;
 }
@@ -835,12 +837,15 @@ EDITBUTTON
 	}
 #-- <br> tag
         sub start_br {
-	    my ($target,$token) = @_;
+	    my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
             my $currentstring = '';
             if ($target eq 'web') {
 	       $currentstring .= $token->[4];
 	    } elsif ($target eq 'tex') {
-		$currentstring .= '\vskip 0 mm';
+		my @temp = @$tagstack;
+		if ($temp[-2] ne 'sub' && $temp[-2] ne 'sup') {
+		    $currentstring .= '\vskip 0 mm';
+		}
 	    } elsif ($target eq 'latexsource') {
 		$currentstring .= '\\';
 	    } 
@@ -1033,7 +1038,7 @@ EDITBUTTON
             if ($target eq 'web') {
 	       $currentstring .= $token->[4];
 	    } elsif ($target eq 'tex') {
-		$currentstring .= "\\hline ";
+		$currentstring .= '\vskip 0 mm \noindent\makebox[\textwidth - 8 mm][b]{\hrulefill}';
 	    } 
            return $currentstring;
 	}
@@ -1286,7 +1291,7 @@ EDITBUTTON
 		    $Apache::londefdef::table[-1]{'vvinc'} = '|';
 		} else {
 		    $Apache::londefdef::table[-1]{'hinc'} = ''; 
-		    $Apache::londefdef::table[-1]{'vinc'} = ''; 
+		    $Apache::londefdef::table[-1]{'vinc'} = '&'; 
 		    $Apache::londefdef::table[-1]{'vvinc'} = '';
 		}
 	    } 
@@ -1311,7 +1316,17 @@ EDITBUTTON
 		    chop $output;
 		    $output .= ' \\\\ ';
 		}
-		$Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}';
+                my @length = split(/,/,$Apache::londefdef::table[-1]{'length'});
+                my $how_many_columns = $#length+1;
+                my $parboxlength = '(\textwidth';
+                for (my $io=0; $io<=$#length;$io++) {
+		    if ($length[$io] ne '') {
+			$parboxlength .= ' - '.$length[$io].' ';
+		    }
+		}
+		$parboxlength .= ')/'.$how_many_columns.' - 7 mm';
+		$output =~ s/\\parbox{}/\\parbox{$parboxlength}/g;
+		$Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}\vskip 0 mm ';
 		if ($#Apache::londefdef::table > 0) {
 		    $inmemory = $Apache::londefdef::table[-1]{'output'};
 		    pop @Apache::londefdef::table;
@@ -1336,10 +1351,11 @@ EDITBUTTON
 		if ($alignchar ne '') {
 		    push @ {$Apache::londefdef::table[-1]{'rows'} }, $alignchar;
 		} else {
-		    push @ {$Apache::londefdef::table[-1]{'rows'} }, 'c';
+		    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]{'length'} = ''; #just added
 
 	    } 
 	   return $currentstring;
@@ -1380,7 +1396,10 @@ EDITBUTTON
 	    } elsif ($target eq 'tex') {
 		my $current_row = $Apache::londefdef::table[-1]{'row_number'};
 		my $data=&Apache::lonxml::endredirection();
-		@{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= $data.' '.$Apache::londefdef::table[-1]{'vinc'};
+		if ($data=~m/width\s*=\s*(\d+\.*\d*\s*(mm|cm))/) {                 #just added
+                    $Apache::londefdef::table[-1]{'length'} .= $1.',';             #just added
+		}                                                                  #just added
+		@{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$1.'}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
 	    }
 	   return $currentstring;
 	}
@@ -1410,7 +1429,10 @@ EDITBUTTON
 	    } elsif ($target eq 'tex') {
 		my $current_row = $Apache::londefdef::table[-1]{'row_number'};
 		my $data=&Apache::lonxml::endredirection();
-		@{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\bf{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
+		if ($data=~m/width\s*=\s*(\d+\.*\d*\s*(mm|cm))/) {                 #just added
+                    $Apache::londefdef::table[-1]{'length'} .= $1.',';             #just added
+		}                                                                  #just added
+		@{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$1.'}{\textbf{'.$data.'}} '.$Apache::londefdef::table[-1]{'vinc'};
 	    }
 	   return $currentstring;
 	}
@@ -1421,31 +1443,21 @@ EDITBUTTON
                                         $token->[2]->{'src'};
             my $currentstring = '';
 	    my $width_param = '';
+	    my $height_param = '';
+	    my $scaling = .3;
 
 	    if ($target eq 'web') {
               $currentstring = $token->[4];     
 	    } elsif ($target eq 'tex') {
-	      my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval); 
-              my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval); 
-	      my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval);
-	      if ($TeXwidth ne '') { 
-		  $width_param = $TeXwidth; 
-	      } elsif ($TeXheight ne '') { 
-		  $width_param = $TeXheight; 
-	      } else {
-		  if ($width ne '') {
-		      $width_param = $width*.3;
-		      if ($width_param <= 900) {
-			  $width_param = '[width='.$width_param.'mm]';
-		      } else {
-			  $width_param = '[width= \textwidth]';
-		      }
-		  }
-	      }
 	      my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval);
 	      $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
+              my $image = Image::Magick->new;
+              my $current_figure = $image->Read($src);
+              $width_param = $image->Get('width') * $scaling;;
+	      $height_param = $image->Get('height') * $scaling;;
+	      undef $image;
 	      my $epssrc = $src;
-	      $epssrc =~ s/(\.gif|\.jpg|\.GIF|\.JPG)$/\.eps/;
+	      $epssrc =~ s/(\.gif|\.jpg)$/\.eps/i;
 	      if (not -e $epssrc) {
 		  my $localfile = $epssrc;
 		  $localfile =~ s/.*(\/res)/$1/;	
@@ -1470,8 +1482,7 @@ EDITBUTTON
 		  } else {
 		      $localfile = $src;
 		      $localfile =~ s/.*(\/res)/$1/;	
-		      my $as = &Apache::lonnet::getfile($src);
-		      
+		      my $as = &Apache::lonnet::getfile($src);		      
 		  }
 	      }
 	      my $file;
@@ -1482,17 +1493,29 @@ EDITBUTTON
 	      }
 	      my $newsrc = $src;
 	      $newsrc =~ s/(\.gif|\.jpg)$/\.eps/i;
-		  $file=~s/(\.gif|\.jpg)$/\.eps/i;
+	      $file=~s/(\.gif|\.jpg)$/\.eps/i;
+              #do we have any specified size of the picture?
+	      my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval); 
+              my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval); 
+	      my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval);
+	      if ($TeXwidth ne '') { 
+		  $width_param = $TeXwidth; 
+	      } elsif ($TeXheight ne '') { 
+		  $width_param = $TeXheight/$height_param*$width_param;
+	      } elsif ($width ne '') {
+		  $width_param = $width*$scaling;      
+	      }
+              #where can we find the picture?
 	      if (-e $newsrc) {
 		  if ($path) {
-		      $currentstring .= '\noindent\graphicspath{{'.$path.'}}\fbox{\includegraphics'.$width_param.'{'.$file.'}}';
+		      $currentstring .= '\noindent\graphicspath{{'.$path.'}}\fbox{\includegraphics[width='.$width_param.' mm]{'.$file.'}} ';
 		  }
 	      } else {
 		  my $temp_file;
 		  my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat";
 		  $temp_file = Apache::File->new('>>'.$filename); 
 		  print $temp_file "$src\n";
-		  $currentstring .= '\graphicspath{{/home/httpd/prtspool/}}\fbox{\includegraphics'.$width_param.'{'.$file.'}}';
+		  $currentstring .= '\graphicspath{{/home/httpd/prtspool/}}\fbox{\includegraphics[width='.$width_param.' mm]{'.$file.'}} ';
 	      }
 	    }
 	    return $currentstring;