--- loncom/xml/londefdef.pm	2003/09/25 15:52:57	1.172
+++ loncom/xml/londefdef.pm	2003/10/21 19:40:32	1.185
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # Tags Default Definition Module 
 #
-# $Id: londefdef.pm,v 1.172 2003/09/25 15:52:57 sakharuk Exp $
+# $Id: londefdef.pm,v 1.185 2003/10/21 19:40:32 albertel Exp $
 # 
 #
 # Copyright Michigan State University Board of Trustees
@@ -92,9 +92,15 @@ sub start_m {
 	    $Apache::lontexconvert::errorstring='';
 	}
 	#&Apache::lonxml::debug("M is ends with:$currentstring:");
+	$Apache::lonxml::post_evaluate=0;
     } elsif ($target eq 'tex') {
 	$currentstring = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);
+	my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval);
+	if ($eval eq 'on') {
+	    $currentstring=&Apache::run::evaluate($currentstring,$safeeval,$$parstack[-1]);
+	}
 	if ($currentstring=~/^(\s*\\\\\s*)*$/) {$currentstring = ' \vskip 0 mm ';}
+	$Apache::lonxml::post_evaluate=0;
     } else {
 	my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);
     }
@@ -134,7 +140,7 @@ sub end_tthoption {
     return $result;
 }
 
-#-- <html> tag    
+#-- <html> tag (end tag optional)
 sub start_html {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -182,7 +188,7 @@ sub end_html {
     return $currentstring;
 }
 
-#-- <head> tag
+#-- <head> tag (end tag optional)
 sub start_head {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -195,14 +201,14 @@ sub start_head {
 sub end_head {
     my ($target,$token) = @_;
     my $currentstring = '';
-    if ($target eq 'web') {
+    if ($target eq 'web' && $ENV{'request.state'} eq 'published') {
 	$currentstring = &Apache::lonmenu::registerurl(undef,$target).
 	    $token->[2];    
     } 
     return $currentstring;
 }
 
-#-- <map> tag
+#-- <map> tag (end tag required)
 sub start_map {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -221,13 +227,15 @@ sub end_map {
     return $currentstring;
 }
 
-#-- <select> tag
+#-- <select> tag (end tag required)
 sub start_select {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
-    } 
+    }  elsif ($target eq 'tex') {
+	$Apache::londefdef::select=0;
+    }
     return $currentstring;
 }
 
@@ -240,13 +248,20 @@ sub end_select {
     return $currentstring;
 }
 
-#-- <option> tag
+#-- <option> tag (end tag optional)
 sub start_option {
-    my ($target,$token) = @_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
-    } 
+    } elsif ($target eq 'tex') {
+	$Apache::londefdef::select++;
+	if ($Apache::londefdef::select == 1) {
+	    $currentstring='\noindent\fbox{'.&Apache::lonxml::get_param('value',$parstack,$safeeval).'}\keephidden{';
+	} else {
+	    $currentstring='\keephidden{';
+	}
+    }
     return $currentstring;
 }
 
@@ -255,11 +270,13 @@ sub end_option {
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[2];    
-    } 
+    }  elsif ($target eq 'tex') {
+	$currentstring='}';
+    }
     return $currentstring;
 }
 
-#-- <input> tag
+#-- <input> tag (end tag forbidden)
 sub start_input {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -278,7 +295,7 @@ sub end_input {
     return $currentstring;
 }
 
-#-- <textarea> tag
+#-- <textarea> tag (end tag required)
 sub start_textarea {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -297,7 +314,7 @@ sub end_textarea {
     return $currentstring;
 }
 
-#-- <form> tag
+#-- <form> tag (end tag required)
 sub start_form {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -316,7 +333,7 @@ sub end_form {
     return $currentstring;
 }
 
-#-- <title> tag
+#-- <title> tag (end tag required)
 sub start_title {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -327,7 +344,7 @@ sub start_title {
     }
     if ($target eq 'meta') {
 	$currentstring='<title>';
-	&start_output();
+	&start_output($target);
     }
     return $currentstring;
 }
@@ -341,13 +358,13 @@ sub end_title {
 	$currentstring .= '}';
     }  
     if ($target eq 'meta') {
-	&end_output();
+	&end_output($target);
 	$currentstring='</title>';
     } 
     return $currentstring;
 }
 
-#-- <meta> tag
+#-- <meta> tag (end tag forbidden)
 sub start_meta {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -461,7 +478,7 @@ sub end_accessrule {
     return $currentstring;
 }
 
-#-- <body> tag
+#-- <body> tag (end tag required)
 sub start_body {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -470,7 +487,8 @@ sub start_body {
 	    &Apache::lonxml::warning("<body> tag found inside of <problem> tag this can cause problems.");
 	    return '';
 	}
-	if (!$Apache::lonxml::registered) {
+	if (!$Apache::lonxml::registered && 
+	    $ENV{'request.state'} eq 'published') {
 	    $currentstring.='<head>'.
 		&Apache::lonmenu::registerurl(undef,$target).'</head>';
 	}
@@ -546,7 +564,7 @@ sub end_body {
     return $currentstring;
 }
 
-#-- <center> tag
+#-- <center> tag (end tag required)
 sub start_center {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -569,7 +587,7 @@ sub end_center {
     return $currentstring;
 }
 
-#-- <b> tag
+#-- <b> tag (end tag required)
 sub start_b {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -592,7 +610,7 @@ sub end_b {
     return $currentstring;
 }
 
-#-- <strong> tag
+#-- <strong> tag (end tag required)
 sub start_strong {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -607,8 +625,7 @@ sub start_strong {
 sub end_strong {
     my ($target,$token) = @_;
     my $currentstring = '';
-    if ($target eq 'web') {
-	
+    if ($target eq 'web') {	
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
 	$currentstring = '}';  
@@ -616,7 +633,7 @@ sub end_strong {
     return $currentstring;
 }
 
-#-- <h1> tag
+#-- <h1> tag (end tag required)
 sub start_h1 {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -637,7 +654,7 @@ sub start_h1 {
 	$currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; 
     } elsif ($target eq 'meta') {
 	$currentstring='<subject>';
-	&start_output();
+	&start_output($target);
     }
     return $currentstring;
 }
@@ -659,7 +676,7 @@ sub end_h1 {
 	}
 	$currentstring .= '}}'.$post;
     } elsif ($target eq 'meta') {
-	&end_output();
+	&end_output($target);
 	$currentstring='</subject>';
     } 
     return $currentstring;
@@ -880,14 +897,14 @@ sub end_h6 {
     return $currentstring;
 }
 
-#--- <cite> tag
+#--- <cite> tag (end tag required)
 sub start_cite {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	$currentstring .= "\\textit{";
+	$currentstring .= '\textit{';
     }
     return $currentstring;
 }
@@ -898,12 +915,12 @@ sub end_cite {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	$currentstring .= "}";
+	$currentstring .= '}';
     }
     return $currentstring;
 }
 
-#-- <i> tag
+#-- <i> tag (end tag required)
 sub start_i {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -926,14 +943,14 @@ sub end_i {
     return $currentstring;
 }
 
-#-- <address> tag
+#-- <address> tag (end tag required)
 sub start_address {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	$currentstring .= "\\textit{";
+	$currentstring .= '\textit{';
     }
     return $currentstring;
 }
@@ -944,19 +961,19 @@ sub end_address {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	$currentstring .= "}";
+	$currentstring .= '}';
     }
     return $currentstring;
 }
 
-#-- <dfn> tag
+#-- <dfn> tag (end tag required)
 sub start_dfn {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	$currentstring .= "\\textit{";
+	$currentstring .= '\textit{';
     } 
     return $currentstring;
 }
@@ -967,12 +984,12 @@ sub end_dfn {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	$currentstring .= "}";
+	$currentstring .= '}';
     }
     return $currentstring;
 }
 
-#-- <tt> tag
+#-- <tt> tag (end tag required)
 sub start_tt {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -995,14 +1012,14 @@ sub end_tt {
     return $currentstring;
 }
 
-#-- <kbd> tag
+#-- <kbd> tag (end tag required)
 sub start_kbd {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	$currentstring .= "\\texttt";
+	$currentstring .= '\texttt{';
     }
     return $currentstring;
 }
@@ -1013,12 +1030,12 @@ sub end_kbd {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	$currentstring .= "}";
+	$currentstring .= '}';
     }
     return $currentstring;
 }
 
-#-- <code> tag
+#-- <code> tag (end tag required)
 sub start_code {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1041,7 +1058,7 @@ sub end_code {
     return $currentstring;
 }
 
-#-- <em> tag
+#-- <em> tag (end tag required)
 sub start_em {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1064,14 +1081,14 @@ sub end_em {
     return $currentstring;
 }
 
-#-- <q> tag
+#-- <q> tag (end tag required)
 sub start_q {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	$currentstring .= "\\emph{";
+	$currentstring .= '\emph{';
     }
     return $currentstring;
 }
@@ -1082,12 +1099,12 @@ sub end_q {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	$currentstring .= "}";
+	$currentstring .= '}';
     } 
     return $currentstring;
 }
 
-#-- <p> tag
+#-- <p> tag (end tag optional)
 sub start_p {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -1110,7 +1127,7 @@ sub end_p {
     return $currentstring;
 }
 
-#-- <br> tag
+#-- <br> tag (end tag forbidden)
 sub start_br {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $currentstring = '';
@@ -1133,7 +1150,7 @@ sub end_br {
     return $currentstring;
 }
 
-#-- <big> tag
+#-- <big> tag (end tag required)
 sub start_big {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1156,7 +1173,7 @@ sub end_big {
     return $currentstring;
 }
 
-#-- <small> tag
+#-- <small> tag (end tag required)
 sub start_small {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1179,7 +1196,7 @@ sub end_small {
     return $currentstring;
 }
 
-#-- <basefont> tag
+#-- <basefont> tag (end tag forbidden)
 sub start_basefont {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $currentstring = '';
@@ -1208,7 +1225,7 @@ sub end_basefont {
     return $currentstring;
 }
 
-#-- <font> tag
+#-- <font> tag (end tag required)
 sub start_font {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $currentstring = '';
@@ -1246,7 +1263,7 @@ sub end_font {
     return $currentstring;
 }
  
-#-- <strike> tag
+#-- <strike> tag (end tag required)
 sub start_strike {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1272,7 +1289,7 @@ sub end_strike {
     return $currentstring;
 }
 
-#-- <s> tag
+#-- <s> tag (end tag required)
 sub start_s {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1298,14 +1315,14 @@ sub end_s {
     return $currentstring;
 }
 
-#-- <sub> tag
+#-- <sub> tag (end tag required)
 sub start_sub {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	$currentstring .= "\$_{ ";
+	$currentstring .= "\$_{";
     } 
     return $currentstring;
 }
@@ -1316,19 +1333,19 @@ sub end_sub {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	$currentstring .= " }\$";
+	$currentstring .= "}\$";
     }
     return $currentstring;
 }
 
-#-- <sup> tag
+#-- <sup> tag (end tag required)
 sub start_sup {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring .= $token->[4];
     } elsif ($target eq 'tex') {
-	$currentstring .= "\$^{ ";
+	$currentstring .= "\$^{";
     } 
     return $currentstring;
 }
@@ -1339,12 +1356,12 @@ sub end_sup {
     if ($target eq 'web') {
 	$currentstring .= $token->[2];
     } elsif ($target eq 'tex') {
-	$currentstring .= " }\$";
+	$currentstring .= "}\$";
     }
     return $currentstring;
 }
 
-#-- <hr> tag
+#-- <hr> tag (end tag forbidden)
 sub start_hr {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -1384,7 +1401,7 @@ sub end_hr {
     return $currentstring;
 }
 
-#-- <div> tag
+#-- <div> tag (end tag required)
 sub start_div {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1403,7 +1420,7 @@ sub end_div {
     return $currentstring;
 }
 
-#-- <a> tag
+#-- <a> tag (end tag required)
 sub start_a {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -1433,7 +1450,7 @@ sub end_a {
     return $currentstring;
 }
 
-#-- <li> tag
+#-- <li> tag (end tag optional)
 sub start_li {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -1463,7 +1480,7 @@ sub end_li {
     return $currentstring;
 }
 
-#-- <u> tag
+#-- <u> tag (end tag required)
 sub start_u {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1489,7 +1506,7 @@ sub end_u {
     return $currentstring;
 }
 
-#-- <ul> tag
+#-- <ul> tag (end tag required)
 sub start_ul {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -1532,7 +1549,7 @@ sub end_ul {
     return $currentstring;
 }
 
-#-- <menu> tag
+#-- <menu> tag (end tag required)
 sub start_menu {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1555,7 +1572,7 @@ sub end_menu {
     return $currentstring;
 }
 
-#-- <dir> tag
+#-- <dir> tag (end tag required)
 sub start_dir {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -1578,7 +1595,7 @@ sub end_dir {
     return $currentstring;
 }
 
-#-- <ol> tag
+#-- <ol> tag (end tag required)
 sub start_ol {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -1631,25 +1648,39 @@ sub end_ol {
     return $currentstring;
 }
 
-#-- <dl> tag
+#-- <dl> tag (end tag required)
 sub start_dl {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
-	$currentstring = '\begin{description}';  
+	$currentstring = '\begin{description}';
+	@Apache::londefdef::description=();
+	$Apache::londefdef::DD_redirection=0;
+	$Apache::londefdef::DT_redirection=0;
     } 
     return $currentstring;
 }
 
 sub end_dl {
-    my ($target,$token) = @_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
-	$currentstring = '\end{description}';  
+	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) {
+	    $currentstring.=' '.$element.' ';
+	}
+	@Apache::londefdef::description=();
+	$currentstring.='\end{description}';  
     } 
     return $currentstring;
 }
@@ -1661,7 +1692,16 @@ sub start_dt {
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
-	&Apache::lonxml::startredirection();; 
+	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;
+	}
+	&Apache::lonxml::startredirection();
+	$Apache::londefdef::DT_redirection=1;
     } 
     return $currentstring;
 }
@@ -1672,38 +1712,51 @@ sub end_dt {
     if ($target eq 'web') {
 	$currentstring = $token->[2];    
     } elsif ($target eq 'tex') {
-	my $data=&Apache::lonxml::endredirection();
-	$data=~s/\\begin{center}//g;
-	$data=~s/\\end{center}//g;
-	$currentstring.='\item['.$data.']';
+	my $data=&item_cleanup;
+	push @Apache::londefdef::description,'\item['.$data.']';
+	$Apache::londefdef::DT_redirection=0;
     } 
     return $currentstring;
 }
 
-#-- <dd> tag
+sub item_cleanup {
+    my $item=&Apache::lonxml::endredirection();
+    $item=~s/\\begin{center}//g;
+    $item=~s/\\end{center}//g;
+    return $item;
+}
+
+#-- <dd> tag (end tag optional)
 sub start_dd {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
-	if ($$tagstack[-2] eq 'dt') {
-	    $currentstring.='\item['.&Apache::lonxml::endredirection().']';
+	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;
+	&Apache::lonxml::startredirection();
     } 
     return $currentstring;
 }
 
 sub end_dd {
-    my ($target,$token) = @_;
+    my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[2];    
-    } 
+    }  elsif ($target eq 'tex') {
+	$Apache::londefdef::description[-1].=&Apache::lonxml::endredirection();
+	$Apache::londefdef::DD_redirection=0;
+    }
     return $currentstring;
 }
 
-#-- <table> tag
+#-- <table> tag (end tag required)
 sub start_table {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $textwidth='';
@@ -1941,14 +1994,11 @@ sub end_td_tex {
 		$newdata=~s/\\vskip \d*\.?\d*\s*mm/THISISJUSTTEMPORARYSEPARATOR/g;
 		my @newdata=split(/THISISJUSTTEMPORARYSEPARATOR/,$newdata);
 		foreach my $elementdata (@newdata) {
-		    $elementdata=~s/^\s+(\S.*)/$1/; 
-		    $elementdata=~s/(.*\S)\s+$/$1/;
-		    $elementdata=~s/(\s)+/$1/;
-		    my $lengthnewdata=1.8*length($elementdata);
+		    my $lengthnewdata=1.8*LATEX_length($elementdata);
 		    if ($lengthnewdata>$current_length) {$current_length=$lengthnewdata;}
 		}
 	    } else {
-		$current_length=1.8*length($data);
+		$current_length=1.8*LATEX_length($data);
 	    }
 	    $Apache::londefdef::table[-1]{'length'} .= $current_length.',';
 	    $Apache::londefdef::table[-1]{'TeXlength'} .= '0,';
@@ -2029,7 +2079,7 @@ sub end_th {
     }
     return $currentstring;
 }
-#-- <img> tag
+#-- <img> tag (end tag forbidden)
 sub start_img {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,
@@ -2109,7 +2159,9 @@ sub start_img {
 		    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 .= '\vskip 1 mm \graphicspath{{/home/httpd/prtspool/}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
+		    $newsrc=~s/\/home\/httpd\/html\/res//;
+		    $newsrc=~s/\/([^\/]+)\.(ps|eps)/\//;
+		    $currentstring .= '\vskip 1 mm \graphicspath{{/home/httpd/prtspool'.$newsrc.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
 		}
 	    }
 	} else {
@@ -2141,7 +2193,7 @@ sub end_img {
     return $currentstring;
 }
 
-#-- <applet> tag
+#-- <applet> tag (end tag required)
 sub start_applet {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     
@@ -2166,7 +2218,16 @@ sub start_applet {
 	    $currentstring='[APPLET: '.$alttag.']';
 	}
     } elsif ($target eq 'tex') {
-	$currentstring = " \\begin{figure} ";
+	my $alttag= &Apache::lonxml::get_param('alt',$parstack,
+					       $safeeval,undef,1);
+	unless ($alttag) {
+	    my $code=&Apache::lonxml::get_param('code',$parstack,$safeeval,
+						undef,1);
+	    $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],
+					     $code);
+	}
+	$currentstring.='\begin{center} \fbox{Java Applet: '.$alttag.
+	    '.}\end{center}';
     } 
     return $currentstring;
 }
@@ -2177,12 +2238,11 @@ sub end_applet {
     if ($target eq 'web') {
 	$currentstring = $token->[2];
     } elsif ($target eq 'tex') {
-	$currentstring = " \\end{figure}";
     } 
     return $currentstring;
 }
 
-#-- <embed> tag
+#-- <embed> tag (end tag optional/required)
 sub start_embed {    
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
@@ -2200,7 +2260,6 @@ sub start_embed {
 	    $currentstring='[EMBED: '.$alttag.']';
 	}
     } elsif ($target eq 'tex') {
-	$currentstring = " \\begin{figure} ";  
     } 
     return $currentstring;
 }
@@ -2210,13 +2269,12 @@ sub end_embed {
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[2];     
-    } elsif ($target eq 'tex') {
-	$currentstring = " \\end{figure}";  
+    } elsif ($target eq 'tex') {  
     } 
     return $currentstring;
 }
 
-#-- <param> tag
+#-- <param> tag (end tag forbidden)
 sub start_param {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     if (&Apache::lonxml::get_param
@@ -2230,7 +2288,6 @@ sub start_param {
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
     } elsif ($target eq 'tex') {
-	$currentstring = " \\begin{figure} ";  
     } 
     return $currentstring;
 }
@@ -2241,7 +2298,6 @@ sub end_param {
     if ($target eq 'web') {
 	$currentstring = $token->[2];     
     } elsif ($target eq 'tex') {
-	$currentstring = " \\end{figure}";  
     } 
     return $currentstring;
 }
@@ -2273,12 +2329,14 @@ sub end_allow {
     return '';
 }
 
-#-- Frames
+#-- Frames (end tag required)
+#-- <frameset>
 sub start_frameset {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') { 
-	if (!$Apache::lonxml::registered) {
+	if (!$Apache::lonxml::registered &&
+	    $ENV{'request.state'} eq 'published') {
 	    $currentstring.='<head>'.
 		&Apache::lonmenu::registerurl(undef,$target).'</head>';
 	}
@@ -2318,7 +2376,7 @@ sub end_frameset {
     return $currentstring;
 }
 
-#-- <xmp>
+#-- <xmp> (end tag required)
 sub start_xmp {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -2341,7 +2399,7 @@ sub end_xmp {
     return $currentstring;
 }
 
-#-- <pre>
+#-- <pre> (end tag required)
 sub start_pre {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';
@@ -2424,7 +2482,7 @@ sub end_blankspace {
     return $currentstring;
 }
 
-#-- <abbr> tag
+#-- <abbr> tag (end tag required)
 sub start_abbr {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2443,7 +2501,7 @@ sub end_abbr {
     return $currentstring;
 }
 
-#-- <acronym> tag
+#-- <acronym> tag (end tag required)
 sub start_acronym {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2462,7 +2520,7 @@ sub end_acronym {
     return $currentstring;
 }
 
-#-- <area> tag
+#-- <area> tag (end tag forbidden)
 sub start_area {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2481,7 +2539,7 @@ sub end_area {
     return $currentstring;
 }
 
-#-- <base> tag
+#-- <base> tag (end tag forbidden)
 sub start_base {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2500,7 +2558,7 @@ sub end_base {
     return $currentstring;
 }
 
-#-- <bdo> tag
+#-- <bdo> tag (end tag required)
 sub start_bdo {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2519,7 +2577,7 @@ sub end_bdo {
     return $currentstring;
 }
 
-#-- <bgsound> tag
+#-- <bgsound> tag (end tag optional)
 sub start_bgsound {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2538,7 +2596,7 @@ sub end_bgsound {
     return $currentstring;
 }
 
-#-- <blink> tag
+#-- <blink> tag (end tag required)
 sub start_blink {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2557,7 +2615,7 @@ sub end_blink {
     return $currentstring;
 }
 
-#-- <blockquote> tag
+#-- <blockquote> tag (end tag required)
 sub start_blockquote {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2576,7 +2634,7 @@ sub end_blockquote {
     return $currentstring;
 }
 
-#-- <button> tag
+#-- <button> tag (end tag required)
 sub start_button {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2595,7 +2653,7 @@ sub end_button {
     return $currentstring;
 }
 
-#-- <caption> tag
+#-- <caption> tag (end tag required)
 sub start_caption {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2614,7 +2672,7 @@ sub end_caption {
     return $currentstring;
 }
 
-#-- <col> tag
+#-- <col> tag (end tag forbdden)
 sub start_col {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2633,7 +2691,7 @@ sub end_col {
     return $currentstring;
 }
 
-#-- <colgroup> tag
+#-- <colgroup> tag (end tag optional)
 sub start_colgroup {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2652,7 +2710,7 @@ sub end_colgroup {
     return $currentstring;
 }
 
-#-- <del> tag
+#-- <del> tag (end tag required)
 sub start_del {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2671,7 +2729,7 @@ sub end_del {
     return $currentstring;
 }
 
-#-- <fieldset> tag
+#-- <fieldset> tag (end tag required)
 sub start_fieldset {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2690,7 +2748,7 @@ sub end_fieldset {
     return $currentstring;
 }
 
-#-- <frame> tag
+#-- <frame> tag (end tag forbidden)
 sub start_frame {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2709,7 +2767,7 @@ sub end_frame {
     return $currentstring;
 }
 
-#-- <iframe> tag
+#-- <iframe> tag (end tag required)
 sub start_iframe {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2728,7 +2786,7 @@ sub end_iframe {
     return $currentstring;
 }
 
-#-- <ins> tag
+#-- <ins> tag (end tag required)
 sub start_ins {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2747,7 +2805,7 @@ sub end_ins {
     return $currentstring;
 }
 
-#-- <isindex> tag
+#-- <isindex> tag (end tag forbidden)
 sub start_isindex {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2766,7 +2824,7 @@ sub end_isindex {
     return $currentstring;
 }
 
-#-- <keygen> tag
+#-- <keygen> tag (end tag forbidden)
 sub start_keygen {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2804,7 +2862,7 @@ sub end_label {
     return $currentstring;
 }
 
-#-- <layer> tag
+#-- <layer> tag (end tag required)
 sub start_layer {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2823,7 +2881,7 @@ sub end_layer {
     return $currentstring;
 }
 
-#-- <legend> tag
+#-- <legend> tag (end tag required)
 sub start_legend {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2842,7 +2900,7 @@ sub end_legend {
     return $currentstring;
 }
 
-#-- <link> tag
+#-- <link> tag (end tag forbidden)
 sub start_link {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2861,7 +2919,7 @@ sub end_link {
     return $currentstring;
 }
 
-#-- <marquee> tag
+#-- <marquee> tag (end tag optional)
 sub start_marquee {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2880,8 +2938,8 @@ sub end_marquee {
     return $currentstring;
 }
 
-#-- <malticol> tag
-sub start_malticol {
+#-- <multicol> tag (end tag required)
+sub start_multicol {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
@@ -2890,7 +2948,7 @@ sub start_malticol {
     return $currentstring;
 }
 
-sub end_malticol {
+sub end_multicol {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
@@ -2899,13 +2957,15 @@ sub end_malticol {
     return $currentstring;
 }
 
-#-- <nobr> tag
+#-- <nobr> tag (end tag required)
 sub start_nobr {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
-    } 
+    }  elsif ($target eq 'tex') {
+	$currentstring='\mbox{';
+    }
     return $currentstring;
 }
 
@@ -2914,11 +2974,13 @@ sub end_nobr {
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[2];    
-    } 
+    }   elsif ($target eq 'tex') {
+	$currentstring='}';
+    }
     return $currentstring;
 }
 
-#-- <noembed> tag
+#-- <noembed> tag (end tag required)
 sub start_noembed {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2937,7 +2999,7 @@ sub end_noembed {
     return $currentstring;
 }
 
-#-- <noframes> tag
+#-- <noframes> tag (end tag required)
 sub start_noframes {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2956,7 +3018,7 @@ sub end_noframes {
     return $currentstring;
 }
 
-#-- <nolayer> tag
+#-- <nolayer> tag (end tag required)
 sub start_nolayer {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2975,7 +3037,7 @@ sub end_nolayer {
     return $currentstring;
 }
 
-#-- <noscript> tag
+#-- <noscript> tag (end tag required)
 sub start_noscript {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -2994,7 +3056,7 @@ sub end_noscript {
     return $currentstring;
 }
 
-#-- <object> tag
+#-- <object> tag (end tag required)
 sub start_object {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -3013,7 +3075,7 @@ sub end_object {
     return $currentstring;
 }
 
-#-- <optgroup> tag
+#-- <optgroup> tag (end tag required)
 sub start_optgroup {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -3032,13 +3094,15 @@ sub end_optgroup {
     return $currentstring;
 }
 
-#-- <samp> tag
+#-- <samp> tag (end tag required)
 sub start_samp {
     my ($target,$token) = @_;
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[4];     
-    } 
+    } elsif ($target eq 'tex') {
+	$currentstring='\texttt{';
+    }
     return $currentstring;
 }
 
@@ -3047,7 +3111,9 @@ sub end_samp {
     my $currentstring = '';
     if ($target eq 'web') {
 	$currentstring = $token->[2];    
-    } 
+    } elsif ($target eq 'tex') {
+	$currentstring='}';
+    }
     return $currentstring;
 }
 
@@ -3070,7 +3136,7 @@ sub end_server {
     return $currentstring;
 }
 
-#-- <spacer> tag
+#-- <spacer> tag (end tag forbidden)
 sub start_spacer {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -3089,7 +3155,7 @@ sub end_spacer {
     return $currentstring;
 }
 
-#-- <span> tag
+#-- <span> tag (end tag required)
 sub start_span {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -3108,7 +3174,7 @@ sub end_span {
     return $currentstring;
 }
 
-#-- <tbody> tag
+#-- <tbody> tag (end tag optional)
 sub start_tbody {
     my ($target,$token) = @_;
     my $currentstring = '';
@@ -3262,5 +3328,26 @@ sub recalc {
     return $value.' mm';
 }
 
+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/(\\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; 
+    my  $value=length($garbage);
+    return $value;
+}
+
+
+
+
 1;
 __END__