--- loncom/xml/londefdef.pm	2006/11/06 11:39:02	1.341
+++ loncom/xml/londefdef.pm	2007/01/22 11:28:08	1.353
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.341 2006/11/06 11:39:02 foxr Exp $
+# $Id: londefdef.pm,v 1.353 2007/01/22 11:28:08 foxr Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -48,6 +48,7 @@ use Apache::lonmenu();
 use Apache::lonmeta();
 use Apache::Constants qw(:common);
 use File::Basename;
+use LONCAPA();
 # use Data::Dumper;
 
 BEGIN {
@@ -1558,17 +1559,6 @@ sub start_a {
 	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);
-	if ($a=~/\S/) {
-	    $a=~s/([^\\])%/$1\\\%/g;
-	    $currentstring .= '\ref{URI: '.$a.'}';
-	} elsif ($b=~/\S/) {
-	    $currentstring .= '\ref{Anchor: '.$b.'}';
-	} else {
-	    $currentstring.='';
-	}
     }
     return $currentstring;
 }
@@ -1579,6 +1569,20 @@ sub end_a {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring .= $token->[2];
     }
+    if ($target eq 'tex') {
+	my $href =
+	    &Apache::lonxml::get_param('href',$parstack,$safeeval,undef,1);
+	my $name =
+	    &Apache::lonxml::get_param('name',$parstack,$safeeval,undef,1);
+	if ($href =~ /\S/) {
+	    $href =~ s/([^\\])%/$1\\\%/g;
+	    $currentstring .= ' ({\tt URI:'.&Apache::lonxml::latex_special_symbols($href).'})';
+	} elsif ($name =~ /\S/) {
+	    $currentstring .= ' ({\tt Anchor:'.&Apache::lonxml::latex_special_symbols($name).'})';
+	} else {
+	    $currentstring.='';
+	}	
+    }
     return $currentstring;
 }
 
@@ -1916,8 +1920,7 @@ sub start_table {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring .= $token->[4];     
     } elsif ($target eq 'tex') {
-	my $aa = {};
-	push @Apache::londefdef::table, $aa; 
+	push(@Apache::londefdef::table, {}); 
 	$Apache::londefdef::table[-1]{'row_number'} = -1;
         #maximum table's width (default coincides with text line length)
 	if ($#Apache::londefdef::table==0) {
@@ -2251,6 +2254,12 @@ sub end_table {
 		    }
 		    $have_rowspan++;
 		    $output .= '\multirow{'.$rowspan.'}[0]{*}{';
+		    
+		    $Apache::londefdef::table[-1]{'content'}[$in][$jn] =~
+			s{^\s*\\par\s*}{};
+		    $Apache::londefdef::table[-1]{'content'}[$in][$jn] =~
+			s{\s*\\vskip\s*0pt\s*$}{};
+
 		    #
 		    # If we did not throw in a multicolumn to align, then add 
 		    # an extra {
@@ -2859,56 +2868,21 @@ sub start_img {
 	    &Apache::lonxml::debug("$src exists");
 	    my ($height_param,$width_param)=
 		&image_size($origsrc,0.3,$parstack,$safeeval);
-	    my $destpath = $path;
-	    $destpath    =~ s/ /\_/g; # Spaces in path cause LaTex to vomit.
-	    my $destfile = $file;
-	    $destfile    =~ s/ /\_/g;
 	    my $size;
 	    if ($width_param)  { $size.='width='.$width_param.' mm,'; }
 	    if ($height_param) { $size.='height='.$height_param.' mm]'; }
 	    # Default size if not able to extract that (e.g. eps image).
 	    
 	    # &Apache::lonnet::logthis("Size = $size");
-	    if ($size eq "0 mm") {
-		$size = "50 mm]";     # Default to 1 column width for 2 column.
-	    }
 	    
 	    $size='['.$size;
 	    $size=~s/,$/]/; 
-	    $currentstring .= '\graphicspath{{'.$destpath.'}}'
-		.'\includegraphics'.$size.'{'.$destfile.'} ';
-
-	    #    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 {    	                                 # wrapfig render
-		    $currentstring = '\begin{wrapfigure}{l}{'.$width_param.'mm}'
-			.'\scalebox{1.0}{'.$currentstring.'}\end{wrapfigure}';
-		}
-	    } elsif ($align eq "right")  {   
-		if ($latex_rendering eq "parpic") {
-		    $currentstring = '\parpic[r]{'.$currentstring.'}';
-		} else {	                                 # wrapfig rendering
-		    $currentstring = '\begin{wrapfigure}{r}{'.$width_param.'mm}'
-			.'\scalebox{1.0}{'.$currentstring.'}\end{wrapfigure}';
-
-		}
-	    } else {		# Bottom is also default.
-		# $currentstring = '\raisebox{'.$height_param.'mm}{'.$currentstring.'}';
-	    }
+	    $currentstring .= '\graphicspath{{'.$path.'}}'
+		.'\includegraphics'.$size.'{'.$file.'} ';
+	    $currentstring = &align_latex_image($align, $latex_rendering, 
+						$currentstring, 
+						$width_param, $height_param);
+						
 	} else {
 	    &Apache::lonxml::debug("$src does not exist");
 	    #original image file doesn't exist so check the alt attribute
@@ -2936,7 +2910,7 @@ sub start_img {
 	$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);
+						   ['', 'none','parbox', 'parpic', 'wrapfigure'], $token, 2);
 	$currentstring .=&Apache::edit::select_arg('Encrypt URL:','encrypturl',
 						   ['no','yes'], $token, 2);
 	$currentstring .=&Apache::edit::end_row().&Apache::edit::start_spanning_row();
@@ -4243,12 +4217,11 @@ sub get_eps_image {
 	&Apache::lonnet::repcopy($orig_src); # Failure is not completely fatal.
     }
     &Apache::lonxml::debug("get_eps_image: Original image: $orig_src");
-    my ($spath, $sname, $sext) = fileparse($src, qr/\.(gif|png|jpg|jpeg)/i);
+    my ($spath, $sname, $sext) = &fileparse($src, qr/\.(gif|png|jpg|jpeg)/i);
     $src=~s/\.(gif|png|jpg|jpeg)$/\.eps/i;
     $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
     &Apache::lonxml::debug("Filelocation gives: $src");
     if (! -e $src) {
-	# &Apache::lonnet::logthis("$src does not exist...repcopying");
 	&Apache::lonxml::debug("$src does not exist");
 	if (&Apache::lonnet::repcopy($src) ne 'ok' ) {
 	    &Apache::lonxml::debug("Repcopy of $src failed (1)");
@@ -4260,7 +4233,6 @@ sub get_eps_image {
 	    &Apache::lonxml::debug("repcopy of $src ... $didrepcopy");
 	    if ( (not -e $src) ||
 		($didrepcopy ne 'ok')) {
-		# &Apache::lonnet::logthis("queuing $orig_src for dynamic eps gen");
 		&Apache::lonxml::debug("Failed to find or replicate $src");
 
 		#if replication failed try to produce eps file dynamically
@@ -4270,8 +4242,8 @@ sub get_eps_image {
 		my $newsrc=$orig_src;
 		$newsrc =~ s|(.*)/res/|/home/httpd/html/res/|;
 		&Apache::lonxml::debug("queueing $newsrc for dynamic eps production.");
-		print FILE "$newsrc\n";
-		close FILE;
+		print FILE ("$newsrc\n");
+		close(FILE);
 		$src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
 		$src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;
 		if ($sext ne "") {	 # Put the ext. back in to uniquify.
@@ -4279,10 +4251,9 @@ sub get_eps_image {
 		}
 
 	    }
+
 	}
     } else {
-# 	&Apache::lonnet::logthis("$src exists. queueing for copy.");
-# 	&Apache::lonnet::logthis("Got eps already.. queue for copy");
 	# If the postscript file has spaces in its name,
 	# LaTeX will gratuitiously vomit.  Therefore
 	# queue such files for copy with " " replaced by "_".
@@ -4290,13 +4261,14 @@ sub get_eps_image {
 	my $newsrc = $orig_src;
 	$newsrc    =~  s|(.*)/res/|/home/httpd/html/res/|;
 	open(FILE,">>/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat");
-#	&Apache::lonnet::logthis("Queueing $newsrc for copy");
-	print FILE "$newsrc\n";
+	print FILE "$src\n";
 	close FILE;
 	$src=~s|/home/httpd/html/res|/home/httpd/prtspool|;
 	$src=~s|/home/([^/]*)/public_html/|/home/httpd/prtspool/$1/|;
     }
     my ($path,$file)=($src=~m|(.*)/([^/]*)$|);
+    $path =~ s/ /\_/g;
+    $file =~ s/ /\_/g;
     &Apache::lonxml::debug("get_eps_image returning: $path / $file<BR />");
     return ($path.'/',$file);
 }
@@ -4308,15 +4280,15 @@ sub eps_generation {
     print $temp_file "$src\n";
     my $newsrc = $src;
     $newsrc =~ s/(\.gif|\.jpg|\.jpeg)$/\.eps/i;
-    $newsrc=~s/\/home\/httpd\/html\/res//;
-    $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\//;
+    $newsrc=~s{/home/httpd/html/res}{};
+    $newsrc=~s{/home/($LONCAPA::username_re)/public_html/}{/$1/};
+    $newsrc=~s{/\./}{/};
+    $newsrc=~s{/([^/]+)\.(ps|eps)}{/};
+    if ($newsrc=~m{/home/httpd/lonUsers/}) {
+	$newsrc=~s{/home/httpd/lonUsers}{};
+	$newsrc=~s{/($LONCAPA::domain_re)/./././}{/$1/};
     }
-    if ($newsrc=~/\/userfiles\//) {
+    if ($newsrc=~m{/userfiles/}) {
 	return ' \graphicspath{{'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
     } else {
 	return ' \graphicspath{{/home/httpd/prtspool'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
@@ -4380,6 +4352,62 @@ sub LATEX_length {
     return $value;
 }
 
+#   Wrap image 'stuff' inside of the LaTeX required to implement 
+#   alignment:
+#     align_tex_image(align, latex_rendering, image)
+#   Where:
+#     align   - The HTML alignment specification.
+#     latex_rendering - rendering hint for latex.
+#     image   - The LaTeX needed to insert the image itsef.
+#     width,height - dimensions of the image.
+#
+sub align_latex_image {
+    my ($align, $latex_rendering, $image, $width, $height) = @_;
+    my $currentstring;        # The result.
+    
+    #    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.'mm}{'.$image.'}';
+    } elsif (($align eq "center") || ($align eq "middle")) { # Being kind
+	my $offset = $height/2;
+	$currentstring = '\raisebox{-'.$offset.'mm}{'.$image.'}';
+    } elsif ($align eq "left")   { 
+	if ($latex_rendering eq "parpic") { 
+	    $currentstring = '\parpic[l]{'.$image.'}';
+	} elsif ($latex_rendering eq "parbox") {
+	    $currentstring = '\begin{minipage}[l]{'.$width.'mm}'
+		.$image.'\end{minipage}';
+	} elsif ($latex_rendering eq "wrapfigure"
+		 || $latex_rendering ne 'none') {  # wrapfig render
+	    $currentstring = 
+		'\begin{wrapfigure}{l}{'.$width.'mm}'
+		.'\scalebox{1.0}{'.$image.'}\end{wrapfigure}';
+	}
+    } elsif ($align eq "right")  {   
+	if ($latex_rendering eq "parpic") {
+	    $currentstring = '\parpic[r]{'.$image.'}';
+	} elsif ($latex_rendering eq "parbox") {
+	    $currentstring =  '\begin{minipage}[r]{'.$width.'mm}'
+		.$image.'\end{minipage}';
+	} elsif ($latex_rendering eq "wrapfigure"
+		 || $latex_rendering ne 'none') {  # wrapfig render
+	    $currentstring = 
+		'\begin{wrapfigure}{r}{'.$width.'mm}'
+		.'\scalebox{1.0}{'.$image.'}\end{wrapfigure}';
+	}
+    } else {		# Bottom is also default.
+	# $currentstring = '\raisebox{'.$height.'mm}{'.$image.'}';
+	$currentstring = $image;
+    }
+    return $currentstring;
+}
 
 # is_inside_of $tagstack $tag
 #    This sub returns true if the current state of Xml processing