--- loncom/xml/londefdef.pm	2007/03/09 17:10:33	1.357
+++ loncom/xml/londefdef.pm	2008/11/24 18:55:01	1.397
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.357 2007/03/09 17:10:33 foxr Exp $
+# $Id: londefdef.pm,v 1.397 2008/11/24 18:55:01 jms Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -46,6 +46,7 @@ use Apache::File();
 use Image::Magick;
 use Apache::lonmenu();
 use Apache::lonmeta();
+use Apache::lonlocal;
 use Apache::Constants qw(:common);
 use File::Basename;
 use LONCAPA();
@@ -106,13 +107,13 @@ sub start_m {
 	my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval);
 	if ($eval eq 'on') {
 	    $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);
-	    #&Apache::lonxml::debug("M is evaulated to:$inside:");
+	    #&Apache::lonxml::debug("M is evaluated to:$inside:");
 	}
 	my $tex = $inside;
 	my $display=&Apache::lonxml::get_param('display',$parstack,$safeeval);
 	$currentstring = &Apache::lontexconvert::converted(\$inside,$display);
 	if ($Apache::lontexconvert::errorstring) {
-	    my $errormsg='<pre>'.&HTML::Entities::encode($Apache::lontexconvert::errorstring,'<>&"').'</pre> occured while attempting to convert this TeX: <pre>';
+	    my $errormsg='<pre>'.&HTML::Entities::encode($Apache::lontexconvert::errorstring,'<>&"').'</pre> occurred while attempting to convert this TeX: <pre>';
 	    $tex = &HTML::Entities::encode($tex,'<>&"');
 	    my ($linenumber) =
 		($Apache::lontexconvert::errorstring =~ /Line (\d+)/);
@@ -128,6 +129,7 @@ sub start_m {
 	#&Apache::lonxml::debug("M is ends with:$currentstring:");
 	$Apache::lonxml::post_evaluate=0;
     } elsif ($target eq 'tex') {
+
 	$currentstring = $inside;
 	my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval);
 	if ($eval eq 'on') {
@@ -135,11 +137,13 @@ sub start_m {
 	}
 	if ($currentstring=~/^(\s*\\\\\s*)*$/) {$currentstring = ' \vskip 0 mm ';}
 	# detect simple math mode entry exits, and convert them
-        # to use \ensuremath
-	if ($currentstring=~/^\s*\$[^\$].*[^\$]\$\s*$/) {
-	    $currentstring=~s/^(\s*)\$/$1/;
-	    $currentstring=~s/\$(\s*)$/$1/;
-	    $currentstring='\ensuremath{'.$currentstring.'}';
+        # to use \ensuremath ... unless there's a \verb inside.
+	if (! ($currentstring=~/\\verb/)) {
+	    if ($currentstring=~/^\s*\$[^\$].*\$\s*$/) {
+		$currentstring=~s/^(\s*)\$/$1/;
+		$currentstring=~s/\$(\s*)$/$1/;
+		$currentstring='\ensuremath{'.$currentstring.'}';
+	    }
 	}
 	$Apache::lonxml::post_evaluate=0;
     }
@@ -197,14 +201,27 @@ sub start_html {
                           '\usepackage[dvips]{graphicx}'.
 			  '\usepackage{wrapfig}'.
 			  '\usepackage{picins}'.
+			  '\usepackage[T1]{fontenc}'."\n".
+                          '\usepackage{lmodern}'."\n".
+			  '\usepackage[postscript]{ucs}'."\n".
+			  '\usepackage[utf8x]{inputenc}'."\n".
+			  '\usepackage{pifont}' ."\n".
+			  '\usepackage{latexsym}'."\n".
                           '\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}}'.
+                          '\usepackage{amscd}';
+
+        if($env{'form.pdfFormFields'} eq 'yes') {
+            $currentstring .= '\usepackage{hyperref}'.
+                              '\usepackage{eforms}'.
+                              '\usepackage{tabularx}';
+        } 
+
+        $currentstring .= '\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;
@@ -445,6 +462,16 @@ sub start_meta {
 	if ((not defined $content) && (not defined $name)) {
 	    &Apache::lonxml::startredirection();
 	}
+    } elsif ($target eq 'edit') {
+	$currentstring .= &Apache::edit::tag_start($target,$token);
+	$currentstring .= &Apache::edit::text_arg('Name:','name',$token,30);
+	$currentstring .= &Apache::edit::text_arg('Content:','content',$token,70);
+	$currentstring .= &Apache::edit::end_row();
+    } elsif ($target eq 'modified') {
+	my $constructtag =
+	    &Apache::edit::get_new_args($token,$parstack,$safeeval,
+					'name','content');
+	if ($constructtag) { $currentstring = &Apache::edit::rebuild_tag($token); }
     }
     return $currentstring;
 }
@@ -468,23 +495,38 @@ sub end_meta {
     return $currentstring;
 }
 
+sub insert_meta {
+    return '
+    <meta />';
+}
+
 # accessrule
 sub start_accessrule {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
     my $currentstring = '';
-    my $eff=&Apache::lonxml::get_param
-	('effect',$parstack,$safeeval,undef,1);
-    my $realm=&Apache::lonxml::get_param
-	('realm',$parstack,$safeeval,undef,1);
-    my $role=&Apache::lonxml::get_param
-	('role',$parstack,$safeeval,undef,1);
-    $realm=~s/\s+//g;
-    $realm=~s/\//\_/g;
-    $realm=~s/^\_//;
-    $realm=~s/\W/\;/g;
-    $role=~s/\s+//g;
-    $role=~s/\//\_/g;
-    $role=~s/\W/\;/g;
+    my $eff  =&Apache::lonxml::get_param('effect',$parstack,$safeeval,undef,1);
+    my $realm=&Apache::lonxml::get_param('realm', $parstack,$safeeval,undef,1);
+    my $role =&Apache::lonxml::get_param('role',  $parstack,$safeeval,undef,1);
+    my $type =&Apache::lonxml::get_param('type',  $parstack,$safeeval,undef,1);
+
+    my ($dom,$crs,$sec,$separator);
+    if ($type eq 'user') {
+	($dom,$crs,$sec)=split(m{/},$realm);
+	$crs = &LONCAPA::clean_username($crs);
+	$separator = '/';
+    } else {
+	($dom,$crs,$sec)=split(/\_/,$realm);
+	$crs = &LONCAPA::clean_courseid($crs);
+	$separator = '_';
+    }
+    $dom = &LONCAPA::clean_domain($dom);
+
+    $sec =~s/\W//;
+    $realm = $dom;
+    if ($crs =~ /\S/) { $realm .= $separator.$crs; }
+    if ($sec =~ /\S/) { $realm .= $separator.$sec; }
+    $role=~s/\W//g;
+
     if ($target eq 'web') {
 	my $args='';
 	if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
@@ -495,7 +537,7 @@ sub start_accessrule {
 	}
     }
     if ($target eq 'meta') {
-	$currentstring='<rule>'.$eff.':'.$realm.':'.$role.'</rule>';
+	$currentstring='<rule>'.$eff.':'.$realm.':'.$role.':'.$type.'</rule>';
     }
     return $currentstring;
 }
@@ -513,6 +555,17 @@ sub end_accessrule {
     return $currentstring;
 }
 
+sub generate_css_links {
+    my $links;
+    my $css_href = &Apache::lonnet::EXT('resource.0.cssfile');
+    if ($css_href =~ /\S/) {
+	&Apache::lonxml::extlink($css_href);
+	$links .= 
+	    '<link rel="stylesheet" type="text/css" href="'.$css_href.'" />';
+    }
+    return $links;
+}
+
 #-- <body> tag (end tag required)
 sub start_body {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
@@ -527,21 +580,20 @@ sub start_body {
 	if (&is_inside_of($tagstack, "head")) {
 	    &end_head(@_);
 	}
+	
+	my $extra_head = &generate_css_links();
+
 	$currentstring = 
 	    &Apache::loncommon::start_page($Apache::londefdef::title,
-					   $Apache::londefdef::head,
+					   $Apache::londefdef::head
+					      .$extra_head,
 					   {'add_entries'    => $token->[2],
 					    'no_title'       => 1,
 					    'force_register' => 1});
 
 	if ($env{'request.state'} ne 'published') {
 	    $currentstring.=&Apache::lonmenu::constspaceform();
-	    $currentstring.=(<<EDITBUTTON);
-<form method="post">
-<input type="submit" name="editmode" accesskey="e" value="Edit" />
-</form>
-<br />
-EDITBUTTON
+	    $currentstring.=&Apache::londefdef::edit_controls();
 	}
 	$currentstring.=&Apache::lonxml::message_location();
     } elsif ($target eq 'tex') {
@@ -550,6 +602,20 @@ EDITBUTTON
     return $currentstring;
 }
 
+sub edit_controls {
+    my $result .= '
+<form method="post">
+<div class="LC_edit_problem_header">
+<div class="LC_edit_problem_header_row1">'.
+&Apache::lonxml::renderingoptions().'
+<input type="submit" name="changeproblemmode" value="'.&mt('Change View').'" />
+</div>
+<div class="LC_edit_problem_header_edit_row"><input type="submit" name="editmode" accesskey="e" value="'.&mt('Edit').'" /></div></div>
+</form>
+<br />';
+    return $result;
+}
+
 sub end_body {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = &end_p();	# Close off unclosed <p>
@@ -1225,9 +1291,7 @@ sub start_br {
 		$signal = 1;
 	    }
 	}
-	if ($signal eq 1) {
-	    $currentstring .= ' \vskip 0 mm ';
-	} else {
+	if ($signal != 1) {
 	    $currentstring .= '\strut \\\\ \strut ';
 	}
     
@@ -1458,6 +1522,27 @@ sub start_hr {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
+
+	# <hr /> can't be inside of <sup><sub> thank you LaTeX.
+	# 
+	my $restart_sub = 0;
+	my $restart_sup = 0;
+
+	# Since <sub> and <sup> are simple tags it's ok to turn off/on
+	# using the start_ stop_ functions.. those tags only care about
+	# $target.
+
+	if (&is_inside_of($tagstack, "sub")) {
+	    $restart_sub = 1;
+	    $currentstring .= &end_sub($target, $token, $tagstack, 
+				       $parstack, $parser, $safeeval);
+	}
+	if (&is_inside_of($tagstack, "sup")) {
+	    $restart_sup = 1;
+	    $currentstring .= &end_sup($target, $token, $tagstack,
+				       $parstack, $parser, $safeeval);
+	}	
+
 	my $LaTeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
 	if (defined $LaTeXwidth) {
 	    if ($LaTeXwidth=~/^%/) {
@@ -1478,6 +1563,16 @@ sub start_hr {
 	}
 	$currentstring .= ' \vskip 0 mm \noindent\makebox['.$LaTeXwidth.']{'.$pre.'\makebox['.
                                     $LaTeXwidth.'][b]{\hrulefill}'.$post.'}\vskip 0 mm ';
+	# Turn stuff back on that we can't be inside of.
+
+	if ($restart_sub) {
+	    $currentstring .= &start_sub($target, $token, $tagstack,
+					$parstack, $parser, $safeeval);
+	}
+	if ($restart_sup) {
+	    $currentstring .= &start_sup($target, $token, $tagstack,
+					 $parstack, $parser, $safeeval);
+	}	
     } 
     return $currentstring;
 }
@@ -1508,6 +1603,9 @@ sub start_div {
     } 
     if ($target eq 'tex') {
 	# 4 possible alignments: left, right, center, and -missing-.
+        # If inside a table row, we must let the table logic
+	# do the alignment, however.
+	# 
 
 	my $endstring = '';
 
@@ -1518,6 +1616,7 @@ sub start_div {
 	    $endstring      = '\end{center}';
 	    if (&is_inside_of($tagstack, "table")) {
 		$currentstring = &center_correction().$currentstring;
+		$endstring    .= &center_end_correction(); 
 	    }
 	}
 	elsif ($align eq 'right') {
@@ -1573,10 +1672,18 @@ sub end_a {
 	    &Apache::lonxml::get_param('href',$parstack,$safeeval,undef,1);
 	my $name =
 	    &Apache::lonxml::get_param('name',$parstack,$safeeval,undef,1);
-	if ($href =~ /\S/) {
+        my $uriprint =
+            &Apache::lonxml::get_param('uriprint',$parstack,$safeeval,undef,1);
+        my $anchorprint =
+            &Apache::lonxml::get_param('anchorprint',$parstack,$safeeval,undef,1);
+	if (($href =~ /\S/) && ($uriprint=~/^on|uriprint|yes|1$/i)) {
 	    $href =~ s/([^\\])%/$1\\\%/g;
-	    $currentstring .= ' ({\tt URI:'.&Apache::lonxml::latex_special_symbols($href).'})';
-	} elsif ($name =~ /\S/) {
+	    # Substitute special symbols... and allow line breaks at each /
+	    #
+	    $href = &Apache::lonxml::latex_special_symbols($href);
+	    $href =~ s/\//\/\\-/g;              # Map / to /\- to allow hyphenation.
+	    $currentstring .= ' ({\tt URI:'.$href.'})';
+	} elsif (($name =~ /\S/) && ($anchorprint=~/^on|anchorprint|yes|1$/i)) {
 	    $currentstring .= ' ({\tt Anchor:'.&Apache::lonxml::latex_special_symbols($name).'})';
 	} else {
 	    $currentstring.='';
@@ -1919,13 +2026,14 @@ sub start_table {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring .= $token->[4];     
     } elsif ($target eq 'tex') {
+	&disable_para();	# Can't have paras in a table.
 	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) {
 	    $textwidth=&recalc($env{'form.textwidth'}); #result is always in mm
 	    $textwidth=~/(\d+\.?\d*)/;
-	    $textwidth=0.95*$1; #accounts "internal" LaTeX space for table frame
+	    $textwidth=0.85*$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
@@ -1951,11 +2059,11 @@ sub start_table {
 	    } else { 
 		$TeXwidth = $textwidth;
 	    }
-	} else {
-	    $Apache::londefdef::table[-1]{'forcedtablewidth'} = 1;
 	}
+	# if the width is specified as a % it is converted to an absolute width.
+	# otherwise.. just plugged right in the hash
+
 	if ($TeXwidth=~/%/) {
-	    $Apache::londefdef::table[-1]{'percent'}=1;
 	    $TeXwidth=~/(\d+)/;
             $Apache::londefdef::table[-1]{'width'}=$1*$textwidth/100;
 	} else {
@@ -1966,7 +2074,6 @@ sub start_table {
 	if ($Apache::londefdef::table[-1]{'width'} > $textwidth) {
 	    $Apache::londefdef::table[-1]{'width'} = $textwidth;
 	}
-
         #table's border
 	my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval); 
         my $permission=&Apache::lonxml::get_param('TeXDropEmptyColumns',$parstack,$safeeval,undef,0);
@@ -2006,11 +2113,16 @@ sub end_table {
     if ($target eq 'web' || $target eq 'webgrade') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
+	my $border =  &Apache::lonxml::get_param('border',$parstack,$safeeval);
 	my $inmemory = '';
 	my $output = '';
 	my $WARNING='';
         #width of columns from TeXwidth attributes
 
+	# Protect against unbalanced </table> tag.
+
+	if (scalar(@Apache::londefdef::table) > 0) {
+
 	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]) {
@@ -2028,6 +2140,7 @@ sub end_table {
 		$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
@@ -2101,11 +2214,12 @@ sub end_table {
 	my @fwidth=@{$Apache::londefdef::table[-1]{'TeXlen'}[0]};#final width array
 	my @adjust=();
         #step 1. adjustment by maximum value
-	my $space_neeeded=0;
+	my $space_needed=0;
 	for (my $jn=0;$jn<=$#max_len;$jn++) {
-	    $space_neeeded=$space_neeeded+$max_len[$jn];
+	    $space_needed=$space_needed+$max_len[$jn];
 	}
-	if ($space_neeeded<=$available_space) {
+	if ($space_needed<=$available_space) {
+
 	    for (my $jn=0;$jn<=$#max_len;$jn++) {
 		if ($fwidth[$jn]==0) {
 		    $fwidth[$jn]=$max_len[$jn];
@@ -2113,11 +2227,11 @@ sub end_table {
 	    }
 	} else {
         #step 2. adjustment by minimum value (estimation)
-	    $space_neeeded=0;
+	    $space_needed=0;
 	    for (my $jn=0;$jn<=$#min_len;$jn++) {
-		$space_neeeded+=$min_len[$jn];
+		$space_needed+=$min_len[$jn];
 	    }
-	    if ($space_neeeded>$available_space) {
+	    if ($space_needed>$available_space) {
 		$WARNING=' \textbf{NOT ENOUGH SPACE FOR TABLE} ';
 		for (my $jn=0;$jn<=$#max_len;$jn++) {
 		    if ($fwidth[$jn]==0) {
@@ -2134,7 +2248,7 @@ sub end_table {
 		    }
 		}
 		if ($how_many_to_scale>0) {
-		    my $space_to_adjust=($space_neeeded-$available_space)/$how_many_to_scale;
+		    my $space_to_adjust=($space_needed-$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)*)/;
@@ -2156,7 +2270,7 @@ sub end_table {
 		}
 	    } else {
 	      #step 3. adjustment over minimal + corrections
-		my $enlarge_coef=$available_space/$space_neeeded;
+		my $enlarge_coef=$available_space/$space_needed;
 		my $acsessive=0;
 		for (my $jn=0;$jn<=$#min_len;$jn++) {
 		    $adjust[$jn]=$min_len[$jn]*$enlarge_coef;
@@ -2189,16 +2303,19 @@ sub end_table {
 		}
 	    }
 	}
-        #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;
-	    }
+        # use all available width or specified width as if not specified,
+	# the specified width gets defaulted to the available width.
+
+	my $current=0; 
+	for (my $i=0;$i<=$#fwidth;$i++) {  
+	    $current+=$fwidth[$i];
+	}
+	if ($current == 0) {
+            $current = $Apache::londefdef::table[-1]{'width'};
+        }
+	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);
@@ -2219,6 +2336,8 @@ sub end_table {
 	    $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++) {
@@ -2246,6 +2365,10 @@ sub end_table {
 		#  Do the appropriate magic if this has a colspan
 		# 
 		
+		my $border_char = "";
+		if ($border) {
+		    $border_char = "|";
+		}
 		my $spanwidth = 0;
 		if ($colspan > 1) {
 		    for (my $spancol = $jn; $spancol < $jn + $colspan; $spancol++) {
@@ -2255,12 +2378,12 @@ sub end_table {
 			$colspan
 			."}";
 		    if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
-			$output .= '{|c|}{';
+			$output .= '{'.$border_char.'c'.$border_char.'}{';
 		    } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
-			$output .= '{|r|}{';
+			$output .= '{'.$border_char.'r'.$border_char.'}{';
 		    }
 		    else {
-			$output .= "{|p{$spanwidth mm}|}{";
+			$output .= '{'.$border_char."p{$spanwidth mm}".$border_char.'}{';
 		    }
 		    
 		} else {
@@ -2276,10 +2399,10 @@ sub end_table {
 		if ($rowspan > 1) {
 		    if ($colspan == 1) {
 			if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
-			    $output .= '\multicolumn{1}{|c|}{';
+			    $output .= '\multicolumn{1}{'.$border_char.'c'.$border_char.'}{';
 			    $multirow_aligned = 1;
 			} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
-			    $output .= '\multicolumn{1}{|r|}{';
+			    $output .= '\multicolumn{1}{'.$border_char.'r'.$border_char.'}{';
 			    $multirow_aligned = 1;
 			}
 		    }
@@ -2316,9 +2439,9 @@ sub end_table {
 		#
 		if ($colspan == 1  && $rowspan == 1) {
 		    if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') {
-			$output .= '\multicolumn{1}{|c|}{';
+			$output .= '\multicolumn{1}{'.$border_char.'c'.$border_char.'}{';
 		    } elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') {
-			$output .= '\multicolumn{1}{|r|}{';
+			$output .= '\multicolumn{1}{'.$border_char.'r'.$border_char.'}{';
 		    }
 		}
 
@@ -2402,6 +2525,8 @@ sub end_table {
 	    pop @Apache::londefdef::table;
 	    undef @Apache::londefdef::table;
 	}
+	}
+	&enable_para();
     }
     return $currentstring;
 }
@@ -2901,7 +3026,7 @@ sub start_img {
 
 	# &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src");
 
-	#if original gif/jpg/png file exist do following:
+	#if original bmp/gif/jpg/png file exist do following:
 	my $origsrc=$src;
 	my ($path,$file) = &get_eps_image($src);
 	# &Apache::lonnet::logthis("Image source: $src result: $path $file");
@@ -2945,9 +3070,10 @@ sub start_img {
 	# 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') {
+        my $only = join(',',&Apache::loncommon::filecategorytypes('Pictures'));
 	$currentstring .=&Apache::edit::tag_start($target,$token);
 	$currentstring .=&Apache::edit::text_arg('Image Url:','src',$token,70).
-	    &Apache::edit::browse('src',undef,'alt').' '.
+	    &Apache::edit::browse('src',undef,'alt',$only).' '.
 	    &Apache::edit::search('src',undef,'alt').'<br />';
 	$currentstring .=&Apache::edit::text_arg('Description:','alt',$token,70).'<br />';
 	$currentstring .=&Apache::edit::text_arg('width (pixel):','width',$token,5);
@@ -2966,11 +3092,14 @@ sub start_img {
 	my $width=  &Apache::lonxml::get_param('width',$parstack,$safeeval);
 	my $height= &Apache::lonxml::get_param('height',$parstack,$safeeval);
 
-
-	$currentstring .= '<img src="'.$src.'" alt="'.$alt.'" ';
-	if ($width) { $currentstring.=' width="'.$width.'" '; }
-	if ($height) { $currentstring.=' height="'.$height.'" '; }
-	$currentstring .= ' />';
+        if ($token->[2]{'src'}=~/\$/) {
+           $currentstring.='Variable image source';
+        } else {
+	   $currentstring .= '<img src="'.$src.'" alt="'.$alt.'" ';
+	   if ($width) { $currentstring.=' width="'.$width.'" '; }
+	   if ($height) { $currentstring.=' height="'.$height.'" '; }
+	   $currentstring .= ' />';
+        }
     } elsif ($target eq 'modified') {
 	my ($osrc,$owidth,$oheight)=
 	    ($token->[2]{'src'},$token->[2]{'width'},$token->[2]{'height'});
@@ -3053,6 +3182,29 @@ sub start_applet {
 	    $currentstring='[APPLET: '.$alttag.']';
 	}
     } elsif ($target eq 'tex') {
+	# Turn off some stuff we can't be inside thank you LaTeX
+	
+
+	my $restart_sub = 0;
+	my $restart_sup = 0;
+
+	# Since <sub> and <sup> are simple tags it's ok to turn off/on
+	# using the start_ stop_ functions.. those tags only care about
+	# $target.
+
+	if (&is_inside_of($tagstack, "sub")) {
+	    $restart_sub = 1;
+	    $currentstring .= &end_sub($target, $token, $tagstack, 
+				       $parstack, $parser, $safeeval);
+	}
+	if (&is_inside_of($tagstack, "sup")) {
+	    $restart_sup = 1;
+	    $currentstring .= &end_sup($target, $token, $tagstack,
+				       $parstack, $parser, $safeeval);
+	}
+
+	# Now process the applet; just replace it with its alt attribute.
+
 	my $alttag= &Apache::lonxml::get_param('alt',$parstack,
 					       $safeeval,undef,1);
 	unless ($alttag) {
@@ -3063,6 +3215,17 @@ sub start_applet {
 	}
 	$currentstring.='\begin{center} \fbox{Java Applet: '.$alttag.
 	    '.}\end{center}';
+
+	# Turn stuff back on that we can't be inside of.
+
+	if ($restart_sub) {
+	    $currentstring .= &start_sub($target, $token, $tagstack,
+					$parstack, $parser, $safeeval);
+	}
+	if ($restart_sup) {
+	    $currentstring .= &start_sup($target, $token, $tagstack,
+					 $parstack, $parser, $safeeval);
+	}
     } 
     return $currentstring;
 }
@@ -4141,27 +4304,9 @@ sub image_replication {
     }
     return '';
 }
-#
-#   Get correct sizing parameter for an image given
-#   it's initial ht. and wid.  This allows sizing of
-#   images that are generated on-the-fly (e.g. gnuplot)
-#   as well as serving as a utility for image_size.
-# 
-#  Parameter:
-#        height_param
-#        width_param    - Initial picture dimensions.
-#        scaling        - A scale factor.
-#        parstack,      - the current stack of tag attributes 
-#                         from the xml parser
-#        safeeval,      - pointer to the safespace
-#        depth,         - from what level in the stack to look for attributes
-#                         (assumes -1 if unspecified)
-#        cis            - look for attrubutes case insensitively
-#                         (assumes false)
-#
-# Returns:
-#   height, width   - new dimensions.
-#
+
+
+
 sub resize_image {
     my ($height_param, $width_param, $scaling,
 	$parstack, $safeeval, $depth, $cis) = @_;
@@ -4264,8 +4409,8 @@ 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);
-    $src=~s/\.(gif|png|jpg|jpeg)$/\.eps/i;
+    my ($spath, $sname, $sext) = &fileparse($src, qr/\.(bmp|gif|png|jpg|jpeg)/i);
+    $src=~s/\.(bmp|gif|png|jpg|jpeg)$/\.eps/i;
     $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
     &Apache::lonxml::debug("Filelocation gives: $src");
     if (! -e $src) {
@@ -4326,7 +4471,7 @@ sub eps_generation {
     my $temp_file = Apache::File->new('>>'.$filename); 
     print $temp_file "$src\n";
     my $newsrc = $src;
-    $newsrc =~ s/(\.gif|\.jpg|\.jpeg)$/\.eps/i;
+    $newsrc =~ s/(\.bmp|\.gif|\.jpg|\.jpeg)$/\.eps/i;
     $newsrc=~s{/home/httpd/html/res}{};
     $newsrc=~s{/home/($LONCAPA::username_re)/public_html/}{/$1/};
     $newsrc=~s{/\./}{/};
@@ -4351,11 +4496,8 @@ sub file_path {
     } 
     return $file,$path;
 }
-#  Converts a measurement in to mm from any of 
-#  the other valid LaTeX units of measure.
-#  If the units of measure are missing from the 
-#  parameter, it is assumed to be in and returned
-#  with mm units of measure
+
+
 sub recalc {
     my $argument = shift;
     if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';}
@@ -4399,23 +4541,17 @@ 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.
-# Returns:
-#    The 1/2 wrapped image and the stuff required to close the
-#    wrappage.  This allows e.g. randomlabel to insert more stuff
-#    into the closure.
-#
+
 sub align_latex_image {
     my ($align, $latex_rendering, $image, $width, $height) = @_;
     my $currentstring;        # The 1/2 wrapped image.
     my $closure;              # The closure of the wrappage.
+
+    # if it's none just return it back
+    if ($latex_rendering eq 'none') {
+	return ($image,'');
+    }
+
     #    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,
@@ -4472,16 +4608,7 @@ sub align_latex_image {
     return ($currentstring, $closure);
 }
 
-# is_inside_of $tagstack $tag
-#    This sub returns true if the current state of Xml processing
-#    is inside of the tag.   
-# Parameters:
-#     tagstack   - The tagstack from the parser.
-#     tag        - The tag (without the <>'s.).
-# Sample usage:
-#     if (is_inside_of($tagstack "table")) {
-#          # I'm in a table....
-#      }
+
 sub is_inside_of {
     my ($tagstack, $tag) = @_;
     my @stack = @$tagstack;
@@ -4494,5 +4621,106 @@ sub is_inside_of {
 }
 
 
+=pod
+
+=head1 NAME
+
+Apache::londefdef.pm
+
+=head1 SYNOPSIS
+
+Tags Default Definition Module
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+
+=head1 NOTABLE SUBROUTINES
+
+=over
+
+=item start_hideweboutput()
+
+=item end_hideweboutput()
+
+=item image_replication()
+
+=item resize_image()
+
+	Get correct sizing parameter for an image given
+	it's initial ht. and wid.  This allows sizing of
+	images that are generated on-the-fly (e.g. gnuplot)
+	as well as serving as a utility for image_size.
+ 
+	Parameter:
+        height_param
+        width_param    - Initial picture dimensions.
+        scaling        - A scale factor.
+        parstack,      - the current stack of tag attributes 
+                         from the xml parser
+        safeeval,      - pointer to the safespace
+        depth,         - from what level in the stack to look for attributes
+                         (assumes -1 if unspecified)
+        cis            - look for attrubutes case insensitively
+                         (assumes false)
+
+	Returns:
+		height, width   - new dimensions.
+
+=item image_size()
+
+=item image_width()
+
+=item image_height()
+
+=item get_eps_image()
+
+=item eps_generation()
+
+=item file_path()
+
+=item recalc()
+
+	Converts a measurement in to mm from any of 
+	the other valid LaTeX units of measure.
+	If the units of measure are missing from the 
+	parameter, it is assumed to be in and returned
+	with mm units of measure
+
+=item LATEX_length()
+
+=item align_latex_image()
+
+  	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.
+ 	Returns:
+    	The 1/2 wrapped image and the stuff required to close the
+    	wrappage.  This allows e.g. randomlabel to insert more stuff
+    	into the closure.
+
+
+=item is_inside_of($tagstack, $tag)
+   	This sub returns true if the current state of Xml processing is inside of the tag.   
+	Parameters:
+    	tagstack   - The tagstack from the parser.
+    	tag        - The tag (without the <>'s.).
+	Sample usage:
+    	if (is_inside_of($tagstack "table")) {
+     	   I'm in a table....
+     	}
+
+
+
+=back
+
+=cut
+
+
 1;
 __END__