Diff for /loncom/xml/londefdef.pm between versions 1.77 and 1.184

version 1.77, 2002/07/24 20:23:21 version 1.184, 2003/10/21 13:36:32
Line 25 Line 25
 # /home/httpd/html/adm/gpl.txt  # /home/httpd/html/adm/gpl.txt
 #  #
 # http://www.lon-capa.org/  # http://www.lon-capa.org/
 #  ## Copyright for TtHfunc and TtMfunc by Ian Hutchinson. 
 # Copyright for TtHfunc and TtMfunc by Ian Hutchinson.   
 # TtHfunc and TtMfunc (the "Code") may be compiled and linked into   # TtHfunc and TtMfunc (the "Code") may be compiled and linked into 
 # binary executable programs or libraries distributed by the   # binary executable programs or libraries distributed by the 
 # Michigan State University (the "Licensee"), but any binaries so   # Michigan State University (the "Licensee"), but any binaries so 
Line 44 Line 43
   
 package Apache::londefdef;   package Apache::londefdef; 
   
 use Apache::lonnet;  use Apache::lonnet();
 use strict;  use strict;
 use Apache::lonxml;  use Apache::lonxml;
 use Apache::File();  use Apache::File();
 use Image::Magick;  use Image::Magick;
   use Apache::lonmenu();
   use Apache::lonmeta();
   
   $Apache::londefdef::TD_redirection=0;
   
 BEGIN {  BEGIN {
   
     &Apache::lonxml::register('Apache::londefdef',('m','html','head','map','select','option','input','textarea','form','meta','title','body','center','b','strong','dt','h1','h2','h3','h4','h5','h6','cite','i','address','dd','dl','dir','ol','ul','menu','dfn','kbd','tt','code','em','q','p','br','big','small','basefont','font','s','sub','strike','sup','hr','a','li','u','output','param','applet','img','embed','allow','frameset','pre','insert','externallink','table','tr','th','td','blankspace','bubble','bubbles','bubbleline'));      &Apache::lonxml::register('Apache::londefdef',('a','abbr','acronym','accessrule','address','allow','applet','area','b','base','basefont','bgo','bgsound','big','blink','blockquote','blankspace','body','br','button','caption','center','cite','code','col','colgroup','dd','del','dfn','dir','div','dl','dt','em','embed','externallink','fieldset','font','form','frame','frameset','h1','h2','h3','h4','h5','h6','head','hr','html','i','iframe','img','input','ins','insert','isindex','kbd','keygen','label','layer','legend','li','link','m','map','marquee','menu','meta','multicol','nobr','noembed','noframes','nolayer','noscript','object','ol','optgroup','option','output','p','param','pre','q','s','samp','select','server','small','spacer','span','strike','strong','sub','sup','table','tbody','td','textarea','tfoot','th','thead','title','tr','tt','tthoption','u','ul','var','wbr','hideweboutput'));
   
 }  }
   
 #======================= TAG SUBROUTINES =====================  #======================= TAG SUBROUTINES =====================
 #-- <output>  #-- <output>
 sub start_output {  sub start_output {
   my ($target) = @_;      my ($target) = @_;
   if ($target eq 'meta') { $Apache::lonxml::metamode--; }      if ($target eq 'meta') { $Apache::lonxml::metamode--; }
   return '';      return '';
 }  }
 sub end_output {  sub end_output {
   my ($target) = @_;      my ($target) = @_;
   if ($target eq 'meta') { $Apache::lonxml::metamode++; }      if ($target eq 'meta') { $Apache::lonxml::metamode++; }
   return '';      return '';
 }  }
 #-- <m> tag  #-- <m> tag
 sub start_m {  sub start_m {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
   my $currentstring = '';      my $currentstring = '';
   if ($target eq 'web') {      if ($target eq 'web') {
     $Apache::lonxml::prevent_entity_encode++;   $Apache::lonxml::prevent_entity_encode++;
     my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);   my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);
     $inside ='\\documentstyle{article}'.$inside;   $inside ='\\documentstyle{article}'.$inside;
     &Apache::lonxml::debug("M is starting with:$inside:");   &Apache::lonxml::debug("M is starting with:$inside:");
     my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval);   my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval);
     if ($eval eq 'on') {   if ($eval eq 'on') {
       $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);      $inside=&Apache::run::evaluate($inside,$safeeval,$$parstack[-1]);
       #&Apache::lonxml::debug("M is evaulated to:$inside:");      #&Apache::lonxml::debug("M is evaulated to:$inside:");
     }   }
     $currentstring = &Apache::lontexconvert::converted(\$inside);   $currentstring = &Apache::lontexconvert::converted(\$inside);
     if ($Apache::lontexconvert::errorstring) {   if ($Apache::lontexconvert::errorstring) {
       &Apache::lonxml::warning("tth error: ".      &Apache::lonxml::warning("tth error: ".
        $Apache::lontexconvert::errorstring);       $Apache::lontexconvert::errorstring);
       $Apache::lontexconvert::errorstring='';      $Apache::lontexconvert::errorstring='';
     }   }
     #&Apache::lonxml::debug("M is ends with:$currentstring:");   #&Apache::lonxml::debug("M is ends with:$currentstring:");
   } elsif ($target eq 'tex') {   $Apache::lonxml::post_evaluate=0;
     $currentstring = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);      } elsif ($target eq 'tex') {
     if ($currentstring=~/\s*\\\\\s*/) {$currentstring = ' \vskip 0 mm ';}   $currentstring = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);
   } else {   my $eval=&Apache::lonxml::get_param('eval',$parstack,$safeeval);
     my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);   if ($eval eq 'on') {
   }      $currentstring=&Apache::run::evaluate($currentstring,$safeeval,$$parstack[-1]);
   return $currentstring;   }
    if ($currentstring=~/^(\s*\\\\\s*)*$/) {$currentstring = ' \vskip 0 mm ';}
    $Apache::lonxml::post_evaluate=0;
       } else {
    my $inside = &Apache::lonxml::get_all_text_unbalanced("/m",$parser);
       }
       return $currentstring;
 }  }
   
 sub end_m {  sub end_m {
   my ($target,$token) = @_;      my ($target,$token) = @_;
   my $currentstring = '';      my $currentstring = '';
   if ($target eq 'web') {      if ($target eq 'web') {
     $Apache::lonxml::prevent_entity_encode--;   $Apache::lonxml::prevent_entity_encode--;
   } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
     $currentstring = "";   $currentstring = "";
   } elsif ($target eq 'meta') {      } elsif ($target eq 'meta') {
   }      }
   return $currentstring;      return $currentstring;
 }  }
 #-- <html> tag      
       sub start_html {  sub start_tthoption {
     my ($target,$token) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $result;
     if ($ENV{'browser.mathml'}) {      if ($target eq 'web') {
       &tth::ttminit();   my $inside = &Apache::lonxml::get_all_text("/tthoption",$parser);
     } else {   $inside=~s/^\s*//;
       &tth::tthinit();   if ($ENV{'browser.mathml'}) {
     }      &tth::ttmoptions($inside);
             if ($target eq 'web') {   } else {
               $currentstring = &Apache::lonxml::xmlbegin().      &tth::tthoptions($inside);
                                &Apache::lonxml::fontsettings();       
     } elsif ($target eq 'tex') {  
       @Apache::londefdef::table = ();  
       $currentstring .= '\documentclass[letterpaper]{article}  
                                  \newcommand{\keephidden}[1]{}  
                                  \renewcommand{\deg}{$^{\circ}$}  
                                  \usepackage[dvips]{graphicx}  
                                  \usepackage{epsfig}\usepackage{calc}';  
     }  
    return $currentstring;  
  }  
         sub end_html {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
  $currentstring = &Apache::lonxml::xmlend();  
     }  
    return $currentstring;  
  }  
 #-- <head> tag  
       sub start_head {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     }   
    return $currentstring;  
  }   }
         sub end_head {      }
     my ($target,$token) = @_;      return $result;
             my $currentstring = '';  }
             if ($target eq 'web') {  
               $currentstring = &Apache::lonxml::registerurl(undef,$target).  sub end_tthoption {
                                $token->[2];          my ($target,$token) = @_;
             }       my $result;
    return $currentstring;      return $result;
  }  }
 #-- <map> tag  
       sub start_map {  #-- <html> tag (end tag optional)
     my ($target,$token) = @_;  sub start_html {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[4];           if ($ENV{'browser.mathml'}) {
     }    &tth::ttminit();
    return $currentstring;   if ($ENV{'browser.unicode'}) {
       &tth::ttmoptions('-L -u1');
    } else {
       &tth::ttmoptions('-L -u0');
    }
       } else {
    &tth::tthinit();
    if ($ENV{'browser.unicode'}) {
       &tth::tthoptions('-L -u1');
    } else {
       &tth::tthoptions('-L -u0');
  }   }
         sub end_map {      }
     my ($target,$token) = @_;      if ($target eq 'web') {
             my $currentstring = '';   $currentstring = &Apache::lonxml::xmlbegin().
             if ($target eq 'web') {      &Apache::lonxml::fontsettings();     
               $currentstring = $token->[2];          } elsif ($target eq 'tex') {
             }    @Apache::londefdef::table = ();
    return $currentstring;   $currentstring .= '\documentclass[letterpaper]{article}';
  }   if ($ENV{'form.latex_type'}=~'batchmode') {$currentstring .='\batchmode';} 
 #-- <select> tag   $currentstring .= '\newcommand{\keephidden}[1]{}
       sub start_select {                             \renewcommand{\deg}{$^{\circ}$}
     my ($target,$token) = @_;                             \usepackage{longtable}
             my $currentstring = '';                             \usepackage{textcomp}
             if ($target eq 'web') {                             \usepackage{makeidx}
               $currentstring = $token->[4];                                  \usepackage[dvips]{graphicx}
     }                              \usepackage{epsfig}\usepackage{calc}
    return $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;
   }
   
   sub end_html {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = &Apache::lonxml::xmlend();
       }
       return $currentstring;
   }
   
   #-- <head> tag (end tag optional)
   sub start_head {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_head {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web' && $ENV{'request.state'} eq 'published') {
    $currentstring = &Apache::lonmenu::registerurl(undef,$target).
       $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <map> tag (end tag required)
   sub start_map {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_map {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <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;
   }
   
   sub end_select {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <option> tag (end tag optional)
   sub start_option {
       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{';
  }   }
         sub end_select {      }
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
               $currentstring = $token->[2];      sub end_option {
             }       my ($target,$token) = @_;
    return $currentstring;      my $currentstring = '';
  }      if ($target eq 'web') {
 #-- <option> tag   $currentstring = $token->[2];    
       sub start_option {      }  elsif ($target eq 'tex') {
     my ($target,$token) = @_;   $currentstring='}';
             my $currentstring = '';      }
             if ($target eq 'web') {      return $currentstring;
               $currentstring = $token->[4];       }
     }   
    return $currentstring;  #-- <input> tag (end tag forbidden)
   sub start_input {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_input {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <textarea> tag (end tag required)
   sub start_textarea {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_textarea {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <form> tag (end tag required)
   sub start_form {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_form {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <title> tag (end tag required)
   sub start_title {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    $currentstring .= '\keephidden{Title of the document:  ' 
       }
       if ($target eq 'meta') {
    $currentstring='<title>';
    &start_output();
       }
       return $currentstring;
   }
   
   sub end_title {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       }  
       if ($target eq 'meta') {
    &end_output();
    $currentstring='</title>';
       } 
       return $currentstring;
   }
   
   #-- <meta> tag (end tag forbidden)
   sub start_meta {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    my $args='';
    if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
    if ($args eq '') {
       &Apache::lonxml::get_all_text("/meta",$parser);
    } else {
       $currentstring = $token->[4];
  }   }
         sub end_option {      } elsif ($target eq 'meta') {
     my ($target,$token) = @_;   unless (&Apache::lonxml::get_param
             my $currentstring = '';   ('http-equiv',$parstack,$safeeval,undef,1)) {
             if ($target eq 'web') {      my $name=$token->[2]->{'name'};
               $currentstring = $token->[2];          $name=~tr/A-Z/a-z/;
             }       $name=~s/\s/\_/gs;
    return $currentstring;      $name=~s/\W//gs;
  }      if ($name) {
 #-- <input> tag   $currentstring='<'.$name;
       sub start_input {                   my $display=&Apache::lonxml::get_param
     my ($target,$token) = @_;   ('display',$parstack,$safeeval,undef,1);
             my $currentstring = '';                  if ($display) {
             if ($target eq 'web') {                      $display=~s/\"/\'/g;
               $currentstring = $token->[4];           $currentstring.=' display="'.$display.'"';
     }                   }
    return $currentstring;   $currentstring.='>'.
       &Apache::lonxml::get_param
    ('content',$parstack,$safeeval,undef,1).
    '</'.$name.'>';
       }
               my $display=&Apache::lonxml::get_param
    ('display',$parstack,$safeeval,undef,1);
               if ($display) {
    $display=&HTML::Entities::encode($display);
    $currentstring.='<'.$name.'.display>'.$display.
                                  '</'.$name.'.display>';
               }
  }   }
         sub end_input {      } elsif ($target eq 'tex') {
     my ($target,$token) = @_;   my $content=&Apache::lonxml::get_param('content',$parstack,$safeeval);
             my $currentstring = '';   my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval);
             if ($target eq 'web') {   if ((not defined $content) && (not defined $name)) {
               $currentstring = $token->[2];          &Apache::lonxml::startredirection();
             }   
    return $currentstring;  
  }  
 #-- <textarea> tag  
       sub start_textarea {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     }   
    return $currentstring;  
  }   }
         sub end_textarea {      }
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
               $currentstring = $token->[2];      sub end_meta {
             }       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
    return $currentstring;      my $currentstring = '';
  }      if ($target eq 'web') {
 #-- <form> tag   my $args='';
       sub start_form {   if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
     my ($target,$token) = @_;   if ($args ne '') {
             my $currentstring = '';      $currentstring = $token->[4];
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     }   
    return $currentstring;  
  }   }
         sub end_form {      } elsif ($target eq 'tex') {
     my ($target,$token) = @_;   my $content=&Apache::lonxml::get_param('content',$parstack,$safeeval);
             my $currentstring = '';   my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval);
             if ($target eq 'web') {   if ((not defined $content) && (not defined $name)) {
               $currentstring = $token->[2];          &Apache::lonxml::endredirection();
             }   
    return $currentstring;  
  }  
 #-- <title> tag  
       sub start_title {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
               $currentstring .= '\keephidden{'   
     }  
             if ($target eq 'meta') {  
  $currentstring='<title>';  
                 &start_output();  
             }  
    return $currentstring;  
  }   }
         sub end_title {      }
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
               $currentstring = $token->[2];      # accessrule
             } elsif ($target eq 'tex') {  sub start_accessrule {
               $currentstring .= '}';      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     }        my $currentstring = '';
             if ($target eq 'meta') {      my $eff=&Apache::lonxml::get_param
                &end_output();   ('effect',$parstack,$safeeval,undef,1);
                $currentstring='</title>';      my $realm=&Apache::lonxml::get_param
             }    ('realm',$parstack,$safeeval,undef,1);
    return $currentstring;      my $role=&Apache::lonxml::get_param
  }   ('role',$parstack,$safeeval,undef,1);
 #-- <meta> tag      $realm=~s/\s+//g;
       sub start_meta {      $realm=~s/\//\_/g;
     my ($target,$token,$tagstack,$parstack,$parser) = @_;      $realm=~s/^\_//;
             my $currentstring = '';      $realm=~s/\W/\;/g;
             if ($target eq 'web') {      $role=~s/\s+//g;
       my $args='';      $role=~s/\//\_/g;
       if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }      $role=~s/\W/\;/g;
       if ($args eq '') {      if ($target eq 'web') {
  &Apache::lonxml::get_all_text("/meta",$$parser[$#$parser]);   my $args='';
       } else {   if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
  $currentstring = $token->[4];   if ($args eq '') {
       }      &Apache::lonxml::get_all_text("/accessrule",$parser);
     }   } else {
             if ($target eq 'meta') {      $currentstring = $token->[4];
  unless ($token->[2]->{'http-equiv'}) {  
     my $name=$token->[2]->{'name'};  
                     $name=~tr/A-Z/a-z/;  
                     $name=~s/\s/\_/g;  
                     if ($name) {  
                        $currentstring='<'.$name.'>'.  
                                          $token->[2]->{'content'}.  
               '</'.$name.'>';  
     }  
                 }  
     }  
    return $currentstring;  
  }   }
       sub end_meta {      }
  my ($target,$token,$tagstack,$parstack,$parser) = @_;      if ($target eq 'meta') {
  my $currentstring = '';   $currentstring='<rule>'.$eff.':'.$realm.':'.$role.'</rule>';
  if ($target eq 'web') {      }
   my $args='';      return $currentstring;
   if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }  }
   if ($args ne '') {  
   sub end_accessrule {
       my ($target,$token,$tagstack,$parstack,$parser) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    my $args='';
    if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
    if ($args ne '') {
     $currentstring = $token->[4];      $currentstring = $token->[4];
   }   }
  }       } 
  return $currentstring;      return $currentstring;
       }  }
 #-- <body> tag  
         sub start_body {  #-- <body> tag (end tag required)
             my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;  sub start_body {
 #    my ($target,$token) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
       if (!$Apache::lonxml::registered) {   if ($Apache::lonhomework::parsing_a_problem) {
  $currentstring.='<head>'.      &Apache::lonxml::warning("<body> tag found inside of <problem> tag this can cause problems.");
     &Apache::lonxml::registerurl(undef,$target).'</head>';      return '';
       }   }
       my $onLoad='';   if (!$Apache::lonxml::registered && 
       foreach my $key (keys(%{$token->[2]})) {      $ENV{'request.state'} eq 'published') {
  if ($key =~ /^onload$/i) {      $currentstring.='<head>'.
   $onLoad.=$token->[2]->{$key}.';';   &Apache::lonmenu::registerurl(undef,$target).'</head>';
   delete($token->[2]->{$key});   }
  }  # Accessibility
       }   if ($ENV{'browser.imagesuppress'} eq 'on') {
       $token->[2]->{'onLoad'}=&Apache::lonxml::loadevents().      delete($token->[2]->{'background'});
                        ';'.$onLoad;   }
       my $onUnload='';   if ($ENV{'browser.fontenhance'} eq 'on') {
       foreach my $key (keys(%{$token->[2]})) {      my $style='';
  if ($key =~ /^onunload$/i) {      foreach my $key (keys(%{$token->[2]})) {
   $onUnload.=$token->[2]->{$key}.';';   if ($key =~ /^style$/i) {
   delete($token->[2]->{$key});      $style.=$token->[2]->{$key}.';';
       delete($token->[2]->{$key});
  }   }
       }      }
       $token->[2]->{'onUnload'}=&Apache::lonxml::unloadevents().      $token->[2]->{'style'}=$style.'; font-size: x-large;';
                          ';'.$onUnload;   }
    if ($ENV{'browser.blackwhite'} eq 'on') {
       $currentstring .= '<'.$token->[1];      delete($token->[2]->{'font'});
       foreach (keys %{$token->[2]}) {      delete($token->[2]->{'link'});
        $currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"';      delete($token->[2]->{'alink'});
       }      delete($token->[2]->{'vlink'});
       $currentstring.='>';      delete($token->[2]->{'bgcolor'});
       if ($ENV{'request.state'} ne 'published') {      delete($token->[2]->{'background'});
  $currentstring.=(<<EDITBUTTON);   }
   # Overload loads
    my $onLoad='';
    foreach my $key (keys(%{$token->[2]})) {
       if ($key =~ /^onload$/i) {
    $onLoad.=$token->[2]->{$key}.';';
    delete($token->[2]->{$key});
       }
    }
    $token->[2]->{'onload'}=&Apache::lonmenu::loadevents().';'.$onLoad;
    my $onUnload='';
    foreach my $key (keys(%{$token->[2]})) {
       if ($key =~ /^onunload$/i) {
    $onUnload.=$token->[2]->{$key}.';';
    delete($token->[2]->{$key});
       }
    }
    $token->[2]->{'onunload'}=&Apache::lonmenu::unloadevents().
       ';'.$onUnload;
   
    $currentstring .= '<'.$token->[1];
    foreach (keys %{$token->[2]}) {
       $currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"';
    }
    $currentstring.='>';
    if ($ENV{'request.state'} ne 'published') {
       $currentstring.=(<<EDITBUTTON);
  <form method="post">   <form method="post">
  <input type="submit" name="editmode" value="Edit" />   <input type="submit" name="editmode" value="Edit" />
  </form>   </form>
 EDITBUTTON  EDITBUTTON
       }   } else {
            } elsif ($target eq 'tex') {      $currentstring.=&Apache::lonmenu::menubuttons(undef,$target,1);
               $currentstring = '\begin{document}';    
     }   
    return $currentstring;  
  }  
         sub end_body {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];       
     } elsif ($target eq 'tex') {  
               $currentstring = '\end{document}';    
     }   
    return $currentstring;  
  }   }
 #-- <center> tag      } elsif ($target eq 'tex') {
         sub start_center {   $currentstring = '\begin{document}';  
     my ($target,$token) = @_;      } 
             my $currentstring = '';      return $currentstring;
             if ($target eq 'web') {  }
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  sub end_body {
               $currentstring = '\begin{center}';        my ($target,$token) = @_;
     }  elsif ($target eq 'latexsource') {      my $currentstring = '';
               $currentstring = '\begin{center}';        if ($target eq 'web') {
     }    $currentstring = $token->[2];     
    return $currentstring;      } elsif ($target eq 'tex') {
  }   $currentstring = '\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent \end{document}';  
         sub end_center {      } 
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
               $currentstring = $token->[2];       #-- <center> tag (end tag required)
     } elsif ($target eq 'tex') {  sub start_center {
               $currentstring = '\end{center}';        my ($target,$token) = @_;
     }  elsif ($target eq 'latexsource') {      my $currentstring = '';
               $currentstring = '\end{center}';        if ($target eq 'web') {
     }    $currentstring = $token->[4];     
    return $currentstring;      } elsif ($target eq 'tex') {
  }   $currentstring = '\begin{center}';  
 #-- <b> tag      }
         sub start_b {      return $currentstring;
     my ($target,$token) = @_;  }
             my $currentstring = '';  
             if ($target eq 'web') {  sub end_center {
               $currentstring = $token->[4];           my ($target,$token) = @_;
     } elsif ($target eq 'tex') {      my $currentstring = '';
               $currentstring = '\textbf{';        if ($target eq 'web') {
     }  elsif ($target eq 'latexsource') {   $currentstring = $token->[2];     
               $currentstring = '\textbf{';        } elsif ($target eq 'tex') {
     }    $currentstring = '\end{center}';  
    return $currentstring;      }
  }      return $currentstring;
         sub end_b {  }
     my ($target,$token) = @_;  
             my $currentstring = '';  #-- <b> tag (end tag required)
             if ($target eq 'web') {  sub start_b {
               $currentstring = $token->[2];           my ($target,$token) = @_;
     } elsif ($target eq 'tex') {      my $currentstring = '';
               $currentstring = '}';        if ($target eq 'web') {
    $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    $currentstring = '\textbf{';  
       } 
       return $currentstring;
   }
   
   sub end_b {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
    $currentstring = '}';  
       } 
       return $currentstring;
   }
   
   #-- <strong> tag (end tag required)
   sub start_strong {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    $currentstring = '\textbf{';  
       } 
       return $currentstring;
   }
   
   sub end_strong {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
    $currentstring = '}';  
       }
       return $currentstring;
   }
   
   #-- <h1> tag (end tag required)
   sub start_h1 {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    my $pre;
    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
    if (($align eq 'center') || (not defined $align)) {
       $pre='\begin{center}';
    } elsif ($align eq 'left') {
       $pre='\rlap{';
    } elsif ($align eq 'right') {
       $pre=' \hfill \llap{';
    }
    my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
    if (not defined $TeXsize) {$TeXsize="large";}
    $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; 
       } elsif ($target eq 'meta') {
    $currentstring='<subject>';
    &start_output();
       }
       return $currentstring;
   }
   
   sub end_h1 {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    my $post;
    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
    if (($align eq 'center') || (not defined $align)) {
       $post='\end{center}';
    } elsif ($align eq 'left') {
       $post='} \hfill'.'\vskip 0 mm ';
    } elsif ($align eq 'right') {
       $post='}'.'\vskip 0 mm ';
    }
    $currentstring .= '}}'.$post;
       } elsif ($target eq 'meta') {
    &end_output();
    $currentstring='</subject>';
       } 
       return $currentstring;
   }
   
     } elsif ($target eq 'latexsource') {  
               $currentstring = '}';    
     }   
    return $currentstring;  
  }  
 #-- <strong> tag  
         sub start_strong {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
               $currentstring = '\textbf{';    
     } elsif ($target eq 'latexsource') {  
               $currentstring = '\textbf{';    
     }   
    return $currentstring;  
  }  
         sub end_strong {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
   
               $currentstring = $token->[2];       
     } elsif ($target eq 'tex') {  
               $currentstring = '}';    
     }  elsif ($target eq 'latexsource') {  
               $currentstring = '}';    
     }   
    return $currentstring;  
  }  
 #-- <h1> tag  
         sub start_h1 {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '\large{\textbf{';  
     } elsif ($target eq 'meta') {  
  $currentstring='<subject>';  
                 &start_output();  
             }  
            return $currentstring;  
  }  
         sub end_h1 {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '}}';  
     } elsif ($target eq 'meta') {  
                 &end_output();  
  $currentstring='</subject>';  
             }   
            return $currentstring;  
  }  
 #-- <h2> tag  #-- <h2> tag
         sub start_h2 {  sub start_h2 {
     my ($target,$token) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
        $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\large{\textbf{';   my $pre;
     }    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
            return $currentstring;   if (($align eq 'center') || (not defined $align)) {
  }      $pre='\begin{center}';
         sub end_h2 {   } elsif ($align eq 'left') {
     my ($target,$token) = @_;      $pre='\rlap{';
             my $currentstring = '';   } elsif ($align eq 'right') {
             if ($target eq 'web') {      $pre=' \hfill \llap{';
        $currentstring .= $token->[2];   }
     } elsif ($target eq 'tex') {   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  $currentstring .= '}}';   if (not defined $TeXsize) {$TeXsize="large";}
     }    $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; 
            return $currentstring;      } 
       return $currentstring;
   }
   
   sub end_h2 {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    my $post;
    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
    if (($align eq 'center') || (not defined $align)) {
       $post='\end{center}';
    } elsif ($align eq 'left') {
       $post='} \hfill'.'\vskip 0 mm ';
    } elsif ($align eq 'right') {
       $post='}'.'\vskip 0 mm ';
  }   }
    $currentstring .= '}}'.$post;
       } 
       return $currentstring;
   }
   
 #-- <h3> tag  #-- <h3> tag
         sub start_h3 {  sub start_h3 {
     my ($target,$token) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
        $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\large{\textbf{';   my $pre;
     }    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
            return $currentstring;   if (($align eq 'center') || (not defined $align)) {
  }      $pre='\begin{center}';
         sub end_h3 {   } elsif ($align eq 'left') {
     my ($target,$token) = @_;      $pre='\rlap{';
             my $currentstring = '';   } elsif ($align eq 'right') {
             if ($target eq 'web') {      $pre=' \hfill \llap{';
        $currentstring .= $token->[2];   }
     } elsif ($target eq 'tex') {   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  $currentstring .= '}}';   if (not defined $TeXsize) {$TeXsize="large";}
     }    $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; 
            return $currentstring;      } 
       return $currentstring;
   }
   
   sub end_h3 {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    my $post;
    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
    if (($align eq 'center') || (not defined $align)) {
       $post='\end{center}';
    } elsif ($align eq 'left') {
       $post='} \hfill'.'\vskip 0 mm ';
    } elsif ($align eq 'right') {
       $post='}'.'\vskip 0 mm ';
  }   }
    $currentstring .= '}}'.$post;
       } 
       return $currentstring;
   }
   
 #-- <h4> tag  #-- <h4> tag
         sub start_h4 {  sub start_h4 {
     my ($target,$token) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
        $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\large{\textbf{';   my $pre;
     }    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
            return $currentstring;   if (($align eq 'center') || (not defined $align)) {
  }      $pre='\begin{center}';
         sub end_h4 {   } elsif ($align eq 'left') {
     my ($target,$token) = @_;      $pre='\rlap{';
             my $currentstring = '';   } elsif ($align eq 'right') {
             if ($target eq 'web') {      $pre=' \hfill \llap{';
        $currentstring .= $token->[2];   }
     } elsif ($target eq 'tex') {   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  $currentstring .= '}}';   if (not defined $TeXsize) {$TeXsize="large";}
     }    $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; 
            return $currentstring;      } 
       return $currentstring;
   }
   
   sub end_h4 {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    my $post;
    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
    if (($align eq 'center') || (not defined $align)) {
       $post='\end{center}';
    } elsif ($align eq 'left') {
       $post='} \hfill'.'\vskip 0 mm ';
    } elsif ($align eq 'right') {
       $post='}'.'\vskip 0 mm ';
  }   }
    $currentstring .= '}}'.$post;
       } 
       return $currentstring;
   }
   
 #-- <h5> tag  #-- <h5> tag
         sub start_h5 {  sub start_h5 {
     my ($target,$token) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
        $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\large{\textbf{';   my $pre;
     }    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
            return $currentstring;   if (($align eq 'center') || (not defined $align)) {
  }      $pre='\begin{center}';
         sub end_h5 {   } elsif ($align eq 'left') {
     my ($target,$token) = @_;      $pre='\rlap{';
             my $currentstring = '';   } elsif ($align eq 'right') {
             if ($target eq 'web') {      $pre=' \hfill \llap{';
        $currentstring .= $token->[2];   }
     } elsif ($target eq 'tex') {   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  $currentstring .= '}}';   if (not defined $TeXsize) {$TeXsize="large";}
     }    $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; 
            return $currentstring;      } 
       return $currentstring;
   }
   
   sub end_h5 {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    my $post;
    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
    if (($align eq 'center') || (not defined $align)) {
       $post='\end{center}';
    } elsif ($align eq 'left') {
       $post='} \hfill'.'\vskip 0 mm ';
    } elsif ($align eq 'right') {
       $post='}'.'\vskip 0 mm ';
  }   }
    $currentstring .= '}}'.$post;
       } 
       return $currentstring;
   }
   
 #-- <h6> tag  #-- <h6> tag
         sub start_h6 {  sub start_h6 {
     my ($target,$token) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
        $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\large{\textbf{';   my $pre;
     }    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
            return $currentstring;   if (($align eq 'center') || (not defined $align)) {
  }      $pre='\begin{center}';
         sub end_h6 {   } elsif ($align eq 'left') {
     my ($target,$token) = @_;      $pre='\rlap{';
             my $currentstring = '';   } elsif ($align eq 'right') {
             if ($target eq 'web') {      $pre=' \hfill \llap{';
        $currentstring .= $token->[2];   }
     } elsif ($target eq 'tex') {   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  $currentstring .= '}}';   if (not defined $TeXsize) {$TeXsize="large";}
     }    $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; 
            return $currentstring;      } 
  }      return $currentstring;
 #--- <cite> tag  }
         sub start_cite {  
     my ($target,$token) = @_;  sub end_h6 {
             my $currentstring = '';      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= $token->[4];      if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring .= $token->[2];
  $currentstring .= "\\textit{";      } elsif ($target eq 'tex') {
     }  elsif ($target eq 'latexsource') {   my $post;
  $currentstring .= "\\textit{";   my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
     }    if (($align eq 'center') || (not defined $align)) {
            return $currentstring;      $post='\end{center}';
    } elsif ($align eq 'left') {
       $post='} \hfill'.'\vskip 0 mm ';
    } elsif ($align eq 'right') {
       $post='}'.'\vskip 0 mm ';
  }   }
         sub end_cite {   $currentstring .= '}}'.$post;
     my ($target,$token) = @_;      } 
             my $currentstring = '';      return $currentstring;
             if ($target eq 'web') {  }
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  #--- <cite> tag (end tag required)
  $currentstring .= "}";  sub start_cite {
     }  elsif ($target eq 'latexsource') {      my ($target,$token) = @_;
  $currentstring .= "}";      my $currentstring = '';
     }       if ($target eq 'web') {
            return $currentstring;   $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    $currentstring .= '\textit{';
       }
       return $currentstring;
   }
   
   sub end_cite {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       }
       return $currentstring;
   }
   
   #-- <i> tag (end tag required)
   sub start_i {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    $currentstring .= '\textit{';
       }
       return $currentstring;
   }
   
   sub end_i {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       } 
       return $currentstring;
   }
   
   #-- <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{';
       }
       return $currentstring;
   }
   
   sub end_address {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       }
       return $currentstring;
   }
   
   #-- <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{';
       } 
       return $currentstring;
   }
   
   sub end_dfn {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       }
       return $currentstring;
   }
   
   #-- <tt> tag (end tag required)
   sub start_tt {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    $currentstring .= '\texttt{';
       }
       return $currentstring;
   }
   
   sub end_tt {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       }
       return $currentstring;
   }
   
   #-- <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{';
       }
       return $currentstring;
   }
   
   sub end_kbd {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       }
       return $currentstring;
   }
   
   #-- <code> tag (end tag required)
   sub start_code {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    $currentstring .= '\texttt{';
       } 
       return $currentstring;
   }
   
   sub end_code {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       } 
       return $currentstring;
   }
   
   #-- <em> tag (end tag required)
   sub start_em {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    $currentstring .= '\emph{';
       }
       return $currentstring;
   }
   
   sub end_em {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       } 
       return $currentstring;
   }
   
   #-- <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{';
       }
       return $currentstring;
   }
   
   sub end_q {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       } 
       return $currentstring;
   }
   
   #-- <p> tag (end tag optional)
   sub start_p {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    my $signal=1;
    foreach my $tag (@$tagstack) {if (lc($tag) eq 'b') {$signal=0;}}
    if ($signal) {$currentstring .= '\par ';}
       }
       return $currentstring;
   }
   
   sub end_p {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       }
       return $currentstring;
   }
   
   #-- <br> tag (end tag forbidden)
   sub start_br {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my $currentstring = '';
       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 ';
  }   }
 #-- <i> tag      }
         sub start_i {      return $currentstring;
     my ($target,$token) = @_;  }
             my $currentstring = '';  
             if ($target eq 'web') {  sub end_br {
        $currentstring .= $token->[4];      my ($target,$token) = @_;
     } elsif ($target eq 'tex') {      my $currentstring = '';
  $currentstring .= '\textit{';      if ($target eq 'web') {
     }  elsif ($target eq 'latexsource') {   $currentstring .= $token->[2];
  $currentstring .= '\textit{';      }
     }       return $currentstring;
            return $currentstring;  }
   
   #-- <big> tag (end tag required)
   sub start_big {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    $currentstring .= '{\large ';
       } 
       return $currentstring;
   }
   
   sub end_big {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       }
       return $currentstring;
   }
   
   #-- <small> tag (end tag required)
   sub start_small {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    $currentstring .= '{\footnotesize ';
       }
       return $currentstring;
   }
   
   sub end_small {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '}';
       }
       return $currentstring;
   }
   
   #-- <basefont> tag (end tag forbidden)
   sub start_basefont {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
    if (defined $basesize) {
       $currentstring = '{\\'.$basesize.' ';
  }   }
         sub end_i {      }
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  sub end_basefont {
     } elsif ($target eq 'tex') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
  $currentstring .= '}';      my $currentstring = '';
     } elsif ($target eq 'latexsource') {      if ($target eq 'web') {
  $currentstring .= '}';   $currentstring = $token->[4];     
     }       } elsif ($target eq 'tex') {
            return $currentstring;   my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
    if (defined $basesize) {
       $currentstring = '}';
  }   }
 #-- <address> tag      }
         sub start_address {      return $currentstring;
     my ($target,$token) = @_;  }
             my $currentstring = '';  
             if ($target eq 'web') {  #-- <font> tag (end tag required)
        $currentstring .= $token->[4];  sub start_font {
     } elsif ($target eq 'tex') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
  $currentstring .= "\\textit{";      my $currentstring = '';
     } elsif ($target eq 'latexsource') {      if ($target eq 'web') {
  $currentstring .= "\\textit{";   my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);
     }    if ($face=~/symbol/i) {
            return $currentstring;      $Apache::lonxml::prevent_entity_encode++;
    } else {
       if (($ENV{'browser.fontenhance'} eq 'on') || 
    ($ENV{'browser.blackwhite'} eq 'on')) { return ''; }
    }
    $currentstring = $token->[4];     
       }  elsif ($target eq 'tex') {
    my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
    if (defined $fontsize) {
       $currentstring = '{\\'.$fontsize.' ';
  }   }
         sub end_address {      }
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  sub end_font {
     } elsif ($target eq 'tex') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
  $currentstring .= "}";      my $currentstring = '';
     } elsif ($target eq 'latexsource') {      if ($target eq 'web') {
  $currentstring .= "}";   my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);
     }   if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode--;}
            return $currentstring;   $currentstring = $token->[2];    
  }      }  elsif ($target eq 'tex') {
 #-- <dfn> tag   my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
         sub start_dfn {   if (defined $fontsize) {
     my ($target,$token) = @_;      $currentstring = '}';
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= "\\textit{";  
     } elsif ($target eq 'latexsource') {  
  $currentstring .= "\\textit{";  
     }   
            return $currentstring;  
  }   }
         sub end_dfn {      }
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {   
        $currentstring .= $token->[2];  #-- <strike> tag (end tag required)
     } elsif ($target eq 'tex') {  sub start_strike {
  $currentstring .= "}";      my ($target,$token) = @_;
     } elsif ($target eq 'latexsource') {      my $currentstring = '';
  $currentstring .= "}";      if ($target eq 'web') {
     }    $currentstring .= $token->[4];
            return $currentstring;      } elsif ($target eq 'tex') {
    &Apache::lonxml::startredirection();
       } 
       return $currentstring;
   }
   
   sub end_strike {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring=&Apache::lonxml::endredirection();
    $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g; 
    $currentstring=~s/^\s*(\S)/\\underline\{$1/; 
    $currentstring=~s/(\S)\s*$/$1\}/;
       }
       return $currentstring;
   }
   
   #-- <s> tag (end tag required)
   sub start_s {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    &Apache::lonxml::startredirection();
       } 
       return $currentstring;
   }
   
   sub end_s {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring=&Apache::lonxml::endredirection();
    $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;
    $currentstring=~s/^\s*(\S)/\\underline\{$1/;
    $currentstring=~s/(\S)\s*$/$1\}/;
       }
       return $currentstring;
   }
   
   #-- <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 .= "\$_{";
       } 
       return $currentstring;
   }
   
   sub end_sub {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= "}\$";
       }
       return $currentstring;
   }
   
   #-- <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 .= "\$^{";
       } 
       return $currentstring;
   }
   
   sub end_sup {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= "}\$";
       }
       return $currentstring;
   }
   
   #-- <hr> tag (end tag forbidden)
   sub start_hr {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    my $LaTeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
    if (defined $LaTeXwidth) {
       if ($LaTeXwidth=~/^%/) {
    substr($LaTeXwidth,0,1)='';
    $LaTeXwidth=($LaTeXwidth/100).'\textwidth';
       }
    } else {
       $LaTeXwidth ='0.9\textwidth';
    }
    my ($pre,$post);
    my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
    if (($align eq 'center') || (not defined $align)) {
       $pre=''; $post='';
    } elsif ($align eq 'left') {
       $pre='\rlap{'; $post='} \hfill';
    } elsif ($align eq 'right') {
       $pre=' \hfill \llap{'; $post='}';
  }   }
 #-- <tt> tag   $currentstring .= ' \vskip 0 mm \noindent\makebox['.$LaTeXwidth.']{'.$pre.'\makebox['.
         sub start_tt {                                      $LaTeXwidth.'][b]{\hrulefill}'.$post.'}\vskip 0 mm ';
     my ($target,$token) = @_;      } 
             my $currentstring = '';      return $currentstring;
             if ($target eq 'web') {  }
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  sub end_hr {
  $currentstring .= '\texttt{';      my ($target,$token) = @_;
     } elsif ($target eq 'latexsource') {      my $currentstring = '';
  $currentstring .= '\texttt{';      if ($target eq 'web') {
     }    $currentstring .= $token->[2];
            return $currentstring;      }
       return $currentstring;
   }
   
   #-- <div> tag (end tag required)
   sub start_div {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } 
       return $currentstring;
   }
   
   sub end_div {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } 
       return $currentstring;
   }
   
   #-- <a> tag (end tag required)
   sub start_a {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } 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.='';
  }   }
         sub end_tt {      }
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  sub end_a {
     } elsif ($target eq 'tex') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
  $currentstring .= '}';      my $currentstring = '';
     } elsif ($target eq 'latexsource') {      if ($target eq 'web') {
  $currentstring .= '}';   $currentstring .= $token->[2];
     }      }
            return $currentstring;      return $currentstring;
  }  }
 #-- <kbd> tag  
         sub start_kbd {  #-- <li> tag (end tag optional)
     my ($target,$token) = @_;  sub start_li {
             my $currentstring = '';      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= $token->[4];      if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring = $token->[4];     
  $currentstring .= "\\texttt";      } elsif ($target eq 'tex') {
     } elsif ($target eq 'latexsource') {   my  $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,1);
  $currentstring .= "\\texttt{";   if ($type=~/circle/) {
     }       $currentstring .= ' \item[o] ';
            return $currentstring;   } elsif ($type=~/square/) {
       $currentstring .= ' \item[$\Box$] ';
    } elsif ($type ne '') { 
       $currentstring .= ' \item['.$type.'] ';
    } else {
       $currentstring .= ' \item ';
    }  
       } 
       return $currentstring;
   }
   
   sub end_li {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } 
       return $currentstring;
   }
   
   #-- <u> tag (end tag required)
   sub start_u {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    &Apache::lonxml::startredirection();
       } 
       return $currentstring;
   }
   
   sub end_u {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring=&Apache::lonxml::endredirection();
    $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;
    $currentstring=~s/^\s*(\S)/\\underline\{$1/;
    $currentstring=~s/(\S)\s*$/$1\}/;
       }
       return $currentstring;
   }
   
   #-- <ul> tag (end tag required)
   sub start_ul {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 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$}';
    } elsif ($TeXtype eq 'circle') {
       $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$}';
  }   }
         sub end_kbd {   $currentstring .= '\begin{itemize}';  
     my ($target,$token) = @_;      } 
             my $currentstring = '';      return $currentstring;
             if ($target eq 'web') {  }
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  sub end_ul {
  $currentstring .= "}";      my ($target,$token) = @_;
     } elsif ($target eq 'latexsource') {      my $currentstring = '';
  $currentstring .= "}";      if ($target eq 'web') {
     }    $currentstring = $token->[2];     
            return $currentstring;      } elsif ($target eq 'tex') {
    $currentstring = '\end{itemize} \renewcommand{\labelitemi}{$\bullet$}
                                   \renewcommand{\labelitemii}{$\bullet$} 
                                   \renewcommand{\labelitemiii}{$\bullet$}
                                   \renewcommand{\labelitemiv}{$\bullet$}';  
       } 
       return $currentstring;
   }
   
   #-- <menu> tag (end tag required)
   sub start_menu {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    $currentstring = " \\begin{itemize} ";  
       } 
       return $currentstring;
   }
   
   sub end_menu {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
    $currentstring = " \\end{itemize}";  
       } 
       return $currentstring;
   }
   
   #-- <dir> tag (end tag required)
   sub start_dir {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    $currentstring = " \\begin{itemize} ";  
       } 
       return $currentstring;
   }
   
   sub end_dir {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
    $currentstring = " \\end{itemize}";  
       } 
       return $currentstring;
   }
   
   #-- <ol> tag (end tag required)
   sub start_ol {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 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}.}';
    } elsif ($type eq 'A') {
       $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}.} ';
    } elsif ($type eq 'i') {
       $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}.} ';
  }   }
 #-- <code> tag   $currentstring .= '\begin{enumerate}';  
         sub start_code {      } 
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  sub end_ol {
     } elsif ($target eq 'tex') {      my ($target,$token) = @_;
  $currentstring .= '\texttt{';      my $currentstring = '';
     }       if ($target eq 'web') {
            return $currentstring;   $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}.}';  
       } 
       return $currentstring;
   }
   
   #-- <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}';
    @Apache::londefdef::description=();
    $Apache::londefdef::DD_redirection=0;
    $Apache::londefdef::DT_redirection=0;
       } 
       return $currentstring;
   }
   
   sub end_dl {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
    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();
  }   }
         sub end_code {   foreach my $element (@Apache::londefdef::description) {
     my ($target,$token) = @_;      $currentstring.=' '.$element.' ';
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '}';  
     }   
            return $currentstring;  
  }   }
 #-- <em> tag   @Apache::londefdef::description=();
         sub start_em {   $currentstring.='\end{description}';  
     my ($target,$token) = @_;      } 
             my $currentstring = '';      return $currentstring;
             if ($target eq 'web') {  }
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  #-- <dt> tag (end tag optional)
  $currentstring .= '\emph{';  sub start_dt {
     } elsif ($target eq 'latexsource') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
  $currentstring .= '\emph{';      my $currentstring='';
     }       if ($target eq 'web') {
            return $currentstring;   $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    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;
  }   }
         sub end_em {   &Apache::lonxml::startredirection();
     my ($target,$token) = @_;   $Apache::londefdef::DT_redirection=1;
             my $currentstring = '';      } 
             if ($target eq 'web') {      return $currentstring;
        $currentstring .= $token->[2];  }
     } elsif ($target eq 'tex') {  
  $currentstring .= '}';  sub end_dt {
     } elsif ($target eq 'latexsource') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
  $currentstring .= '}';      my $currentstring = '';
     }        if ($target eq 'web') {
            return $currentstring;   $currentstring = $token->[2];    
  }      } elsif ($target eq 'tex') {
 #-- <q> tag   my $data=&item_cleanup;
         sub start_q {   push @Apache::londefdef::description,'\item['.$data.']';
     my ($target,$token) = @_;   $Apache::londefdef::DT_redirection=0;
             my $currentstring = '';      } 
             if ($target eq 'web') {      return $currentstring;
        $currentstring .= $token->[4];  }
     } elsif ($target eq 'tex') {  
  $currentstring .= "\\emph{";  sub item_cleanup {
     }  elsif ($target eq 'latexsource') {      my $item=&Apache::lonxml::endredirection();
  $currentstring .= "\\emph{";      $item=~s/\\begin{center}//g;
     }      $item=~s/\\end{center}//g;
            return $currentstring;      return $item;
  }  }
         sub end_q {  
     my ($target,$token) = @_;  #-- <dd> tag (end tag optional)
             my $currentstring = '';  sub start_dd {
             if ($target eq 'web') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
        $currentstring .= $token->[2];      my $currentstring = '';
     } elsif ($target eq 'tex') {      if ($target eq 'web') {
  $currentstring .= "}";   $currentstring = $token->[4];     
     } elsif ($target eq 'latexsource') {      } elsif ($target eq 'tex') {
  $currentstring .= "}";   if ($Apache::londefdef::DT_redirection) {
     }        my $data=&item_cleanup;
            return $currentstring;      push @Apache::londefdef::description,'\item['.$data.']';
  }      $Apache::londefdef::DT_redirection=0;
 #-- <p> tag  
         sub start_p {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '{\par ';  
     } elsif ($target eq 'latexsource') {  
  $currentstring .= '{\par ';  
     }   
            return $currentstring;  
  }   }
         sub end_p {   $Apache::londefdef::DD_redirection=1;
     my ($target,$token) = @_;   &Apache::lonxml::startredirection();
             my $currentstring = '';      } 
             if ($target eq 'web') {      return $currentstring;
        $currentstring .= $token->[2];  }
     } elsif ($target eq 'tex') {  
         $currentstring .= '}';  sub end_dd {
             } elsif ($target eq 'latexsource') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
         $currentstring .= '}';      my $currentstring = '';
             }      if ($target eq 'web') {
            return $currentstring;   $currentstring = $token->[2];    
       }  elsif ($target eq 'tex') {
    $Apache::londefdef::description[-1].=&Apache::lonxml::endredirection();
    $Apache::londefdef::DD_redirection=0;
       }
       return $currentstring;
   }
   
   #-- <table> tag (end tag required)
   sub start_table {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $textwidth='';
       if (not defined @Apache::londefdef::table) {
    $textwidth=&recalc($ENV{'form.textwidth'});
    $textwidth=~/(\d+\.?\d*)/;
    $textwidth=0.95*$1;
       } else {
    $textwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
       }
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    my $aa = {};
    push @Apache::londefdef::table, $aa; 
    $Apache::londefdef::table[-1]{'row_number'} = -1;
           #table's width
    my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
    if (not defined $TeXwidth) {
       my $htmlwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1);
       if ($htmlwidth=~/%/) {
    $htmlwidth=~/(\d+)/;
    my $value=$1*$textwidth/100;
    $Apache::londefdef::table[-1]{'width'}=$value;
       } else {
    $Apache::londefdef::table[-1]{'width'}=$textwidth;
       }
    } elsif ($TeXwidth=~/%/) {
       $TeXwidth=~/(\d+)/;
       my $value=$1*$textwidth/100;
               $Apache::londefdef::table[-1]{'width'}=$value;
    } else {
       $Apache::londefdef::table[-1]{'width'}=$textwidth;
    }        
           #table's border
    my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval,undef,1); 
    unless (defined $border) { $border = 0; }
    if ($border) { 
       $Apache::londefdef::table[-1]{'hinc'} = '\hline '; 
       $Apache::londefdef::table[-1]{'vinc'} = '&'; 
       $Apache::londefdef::table[-1]{'vvinc'} = '|';
    } else {
       $Apache::londefdef::table[-1]{'hinc'} = ''; 
       $Apache::londefdef::table[-1]{'vinc'} = '&'; 
       $Apache::londefdef::table[-1]{'vvinc'} = '';
  }   }
 #-- <br> tag   $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} ';
         sub start_br {   $currentstring = '\keephidden{NEW TABLE ENTRY}';
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      }
             my $currentstring = '';      return $currentstring;
             if ($target eq 'web') {  }
        $currentstring .= $token->[4];   
     } elsif ($target eq 'tex') {  sub end_table {
  if ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     $currentstring .= '\vskip 0 mm';      my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
    my $inmemory = '';
    my $output = '';
    #construct header of the table
    my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};
    for (my $in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) {
       $header_of_table .= $Apache::londefdef::table[-1]{'columns'}[$in].$Apache::londefdef::table[-1]{'vvinc'};
    }
    $header_of_table .= '}';
    #define the length of the table cells
    #always starts with TeXwidth (if defined everything else is ignored)
    my @length_row_final = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[0]);
    for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
       my @length_row = split(/,/,$Apache::londefdef::table[-1]{'TeXlengthrow'}[$in]);
       for (my $jn=0;$jn<=$#length_row;$jn++) {
    if ($length_row_final[$jn]<$length_row[$jn]) {$length_row_final[$jn]=$length_row[$jn];}
       }
    }
    #continues trying estimate the width of raw data
    my @length_raw_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]);
    for (my $in=1;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
       my @length_row = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[$in]);
       for (my $jn=0;$jn<=$#length_row;$jn++) {
    if ($length_raw_row[$jn]<$length_row[$jn]) {$length_raw_row[$jn]=$length_row[$jn];}
       }
    }
           #comparing of TeXwidth and raw data width
    my $available_length=$Apache::londefdef::table[-1]{'width'};
    my $needed=0;
    for (my $jn=0;$jn<=$#length_row_final;$jn++) {
       if ($length_row_final[$jn]!=0) {
    $available_length=$available_length-$length_row_final[$jn];
    $needed++;
       }
    }
    $needed=$#length_row_final-$needed+1;
    for (my $jn=0;$jn<=$#length_row_final;$jn++) {
       if ($length_row_final[$jn]==0) {
    if ($length_raw_row[$jn]<$available_length) {
       $length_row_final[$jn]=$length_raw_row[$jn];
       $available_length=$available_length-$length_raw_row[$jn];
       $needed--;
  }   }
     } elsif ($target eq 'latexsource') {      }
  $currentstring .= '\\';  
     }   
            return $currentstring;  
  }  
         sub end_br {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     }  
            return $currentstring;  
  }  
 #-- <big> tag  
         sub start_big {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '\large{';  
     } elsif ($target eq 'latexsource') {  
  $currentstring .= '{\Large ';  
     }    
            return $currentstring;  
  }  
         sub end_big {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
         $currentstring .= '}';  
             } elsif ($target eq 'latexsource') {  
         $currentstring .= '}';  
             }  
            return $currentstring;  
  }  
 #-- <small> tag  
         sub start_small {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '{\footnotesize ';  
     } elsif ($target eq 'latexsource') {  
  $currentstring .= '{\footnotesize ';  
     }   
            return $currentstring;  
  }  
         sub end_small {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
         $currentstring .= '}';  
             } elsif ($target eq 'latexsource') {  
         $currentstring .= '}';  
             }  
            return $currentstring;  
  }  
 #-- <basefont> tag  
       sub start_basefont {  
  my ($target,$token) = @_;  
  my $currentstring = '';  
  if ($target eq 'web') {  
   $currentstring = $token->[4];       
  }   
  return $currentstring;  
       }  
       sub end_basefont {  
  my ($target,$token) = @_;  
  my $currentstring = '';  
  if ($target eq 'web') {  
   $currentstring = $token->[4];       
  }   
  return $currentstring;  
       }  
 #-- <font> tag  
          sub start_font {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
       my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);  
       if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode++;}  
               $currentstring = $token->[4];       
     }   
    return $currentstring;  
  }  
         sub end_font {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
       my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);  
       if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode--;}  
               $currentstring = $token->[2];      
             }   
    return $currentstring;  
  }   
 #-- <strike> tag  
         sub start_strike {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '\underline{';  
     }   
            return $currentstring;  
  }  
         sub end_strike {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
         $currentstring .= '}';  
             }  
            return $currentstring;  
  }  
 #-- <s> tag  
         sub start_s {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '\underline{';  
     }   
            return $currentstring;  
  }  
         sub end_s {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
         $currentstring .= '}';  
             }  
            return $currentstring;  
  }  
 #-- <sub> tag  
         sub start_sub {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= "\$_{ ";  
     }   
            return $currentstring;  
  }  
         sub end_sub {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
         $currentstring .= " }\$";  
             }  
            return $currentstring;  
  }  
 #-- <sup> tag  
         sub start_sup {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= "\$^{ ";  
     }   
            return $currentstring;  
  }  
         sub end_sup {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
         $currentstring .= " }\$";  
             }  
            return $currentstring;  
  }  
 #-- <hr> tag  
         sub start_hr {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '\vskip 0 mm \noindent\makebox[\textwidth - 8 mm][b]{\hrulefill}';  
     }   
            return $currentstring;  
  }  
         sub end_hr {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
     }   
            return $currentstring;  
  }  
 #-- <a> tag  
         sub start_a {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
     }  
            return $currentstring;  
  }  
         sub end_a {  
     my ($target,$token,$tagstack,$stackref) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
                 my  $tempor_var = $stackref->[$#$stackref];  
  if (index($tempor_var,'name') != -1 ) {  
     $tempor_var =~ s/name=([^,]*),/$1/g;  
 #        $currentstring .= " \\label{$tempor_var}";  
         } elsif (index($tempor_var,'href') != -1 ) {  
     $tempor_var =~ s/href=([^,]*),/$1/g;  
         $currentstring .= " \\ref{$tempor_var}";  
         }  
             }  
            return $currentstring;  
  }  
 #-- <li> tag  
         sub start_li {  
     my ($target,$token,$tagstack,$stackref) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
                 my  $tempor_var = $stackref->[$#$stackref];  
                 if (index($tempor_var,'circle') != -1 ) {  
           $currentstring .= " \\item[o] ";  
         } elsif (index($tempor_var,'square') != -1 ) {  
                $currentstring .= " \\item[$\Box$] ";  
         } elsif ($tempor_var ne '') {   
        $_ = $tempor_var;  
                        m/my\s*([^=]*)=/;  
        $currentstring .= " \\item[$1] ";  
  } else {  
     $currentstring .= " \\item ";  
         }    
     }   
    return $currentstring;  
  }  
         sub end_li {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];       
     }   
    return $currentstring;  
  }  
 #-- <u> tag  
         sub start_u {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '\underline{';  
     }   
            return $currentstring;  
  }  
         sub end_u {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
         $currentstring .= '}';  
             }  
            return $currentstring;  
  }  
 #-- <ul> tag  
         sub start_ul {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
               $currentstring = '\begin{itemize}';    
     }   
    return $currentstring;  
  }  
         sub end_ul {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];       
     } elsif ($target eq 'tex') {  
               $currentstring = '\end{itemize}';    
     }   
    return $currentstring;  
  }  
 #-- <menu> tag  
         sub start_menu {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
               $currentstring = " \\begin{itemize} ";    
     }   
    return $currentstring;  
  }  
         sub end_menu {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];       
     } elsif ($target eq 'tex') {  
               $currentstring = " \\end{itemize}";    
     }   
    return $currentstring;  
  }  
 #-- <dir> tag  
         sub start_dir {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
               $currentstring = " \\begin{itemize} ";    
     }   
    return $currentstring;  
  }  
         sub end_dir {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];       
     } elsif ($target eq 'tex') {  
               $currentstring = " \\end{itemize}";    
     }   
    return $currentstring;  
  }  
 #-- <ol> tag  
         sub start_ol {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
               $currentstring = '\begin{enumerate}';    
     }   
    return $currentstring;  
  }   }
         sub end_ol {   for (my $jn=0;$jn<=$#length_row_final;$jn++) {
     my ($target,$token) = @_;      if ($length_row_final[$jn]==0) {
             my $currentstring = '';   $length_row_final[$jn]=0.9*$available_length/$needed;
             if ($target eq 'web') {      }
               $currentstring = $token->[2];        }
     } elsif ($target eq 'tex') {   #fill the table
               $currentstring = '\end{enumerate}';     for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
     }       for (my $jn=0;$jn<=$#length_row_final;$jn++) {
    return $currentstring;   my $substituted=$length_row_final[$jn];
    $Apache::londefdef::table[-1]{'rowdata'}[$in]=~s/TOBECHANGEDONNUMBER/$substituted mm/;
       }
       $output .=  $Apache::londefdef::table[-1]{'rowdata'}[$in];
       chop $output;
       $output .= ' \\\\ ';
    }
    $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$output.$Apache::londefdef::table[-1]{'hinc'}.'\end{tabular}\vskip 0 mm ';
    if ($#Apache::londefdef::table > 0) {    
       my $inmemory = $Apache::londefdef::table[-1]{'output'};
       pop @Apache::londefdef::table;
       push @{$Apache::londefdef::table[-1]{'include'}}, $inmemory;
    } else {
       $currentstring .= $Apache::londefdef::table[-1]{'output'};
       pop @Apache::londefdef::table;
       undef @Apache::londefdef::table;
  }   }
 #-- <dl> tag      }
         sub start_dl {      return $currentstring;
     my ($target,$token) = @_;  }
             my $currentstring = '';  
             if ($target eq 'web') {  #-- <tr> tag (end tag optional)
               $currentstring = $token->[4];       sub start_tr {
     } elsif ($target eq 'tex') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
               $currentstring = '\begin{description}';        my $currentstring = '';
     }       if ($target eq 'web') {
    return $currentstring;   $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    $Apache::londefdef::table[-1]{'row_number'}++;
    my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
    if ($alignchar ne '') {
       push @ {$Apache::londefdef::table[-1]{'rows'} }, $alignchar;
    } else {
       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]{'TeXlength'} = '';
     $Apache::londefdef::table[-1]{'length'} = '';
       } 
       return $currentstring;
   }
           
   sub end_tr {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
    if ($Apache::londefdef::TD_redirection) {
       &end_td_tex($parstack,$parser,$safeeval);    
  }   }
         sub end_dl {   push @{ $Apache::londefdef::table[-1]{'TeXlengthrow'} },$Apache::londefdef::table[-1]{'TeXlength'};
     my ($target,$token) = @_;   push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'};
             my $currentstring = '';      }
             if ($target eq 'web') {      return $currentstring;
               $currentstring = $token->[2];       }
     } elsif ($target eq 'tex') {  
               $currentstring = '\end{description}';    #-- <td> tag (end tag optional)
     }   sub start_td {
    return $currentstring;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    $Apache::londefdef::TD_redirection = 1;
    &tag_check('tr','td',$tagstack,$parstack,$parser,$safeeval);
       } 
       return $currentstring;
   }   
       
   sub tag_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_td_tex($parstack,$parser,$safeeval);
       last;
    } elsif (lc($$tagstack[$i]) eq $bad_tag) {
       splice @ar, $i+1;
       &end_td_tex(\@ar,$parser,$safeeval);
       &start_td_tex($parstack,$parser,$safeeval);
       last;
  }   }
 #-- <dt> tag      }
         sub start_dt {      return '';
     my ($target,$token) = @_;  }
             my $currentstring = '';   
             if ($target eq 'web') {  sub start_td_tex {
               $currentstring = $token->[4];           my ($parstack,$parser,$safeeval) = @_;
     } elsif ($target eq 'tex') {      my $what_to_push = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1),0,1);
               $currentstring = '\item[';        if ($what_to_push eq '') {
     }    $what_to_push = substr($Apache::londefdef::table[-1]{'rows'}[0],0,1);;
    return $currentstring;      }
       push @{ $Apache::londefdef::table[-1]{'columns'} }, $what_to_push;
       $Apache::londefdef::table[-1]{'counter_columns'}++;
       &Apache::lonxml::startredirection();
       return '';
   }
   
   sub end_td_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) {
    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+\.?\d*)/;
       $Apache::londefdef::table[-1]{'TeXlength'} .= $1.',';
       $Apache::londefdef::table[-1]{'length'} .= '0,';
    } else {  
       $data=~s/^\s+(\S.*)/$1/; 
       $data=~s/(.*\S)\s+$/$1/;
       $data=~s/(\s)+/$1/;
       my $current_length=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=1.8*LATEX_length($elementdata);
       if ($lengthnewdata>$current_length) {$current_length=$lengthnewdata;}
    }
       } else {
    $current_length=1.8*LATEX_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]/;
  }   }
         sub end_dt {      @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
     my ($target,$token) = @_;      return'';
             my $currentstring = '';  }
             if ($target eq 'web') {  
               $currentstring = $token->[2];      sub end_td {
             } elsif ($target eq 'tex') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
               $currentstring = ']';        my $currentstring = '';
     }       if ($target eq 'web') {
    return $currentstring;   $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
           $Apache::londefdef::TD_redirection =0;
    &end_td_tex($parstack,$parser,$safeeval);
       }
       return $currentstring;
   }
   
   #-- <th> tag (end tag optional)
   sub start_th {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       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();
       } 
       return $currentstring;
   }   
        
   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,';
       }        
  }   }
 #-- <dd> tag   for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {                                
         sub start_dd {      $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     }   
    return $currentstring;  
  }   }
         sub end_dd {   $data='\textbf{'.$data.'}';
     my ($target,$token) = @_;   @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
             my $currentstring = '';      }
             if ($target eq 'web') {      return $currentstring;
               $currentstring = $token->[2];      }
             }   #-- <img> tag (end tag forbidden)
    return $currentstring;  sub start_img {
  }      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
 #-- <table> tag      my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,
         sub start_table {   undef,1);
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      my $width_param = '';
               $currentstring = $token->[4];           my $height_param = '';
     } elsif ($target eq 'tex') {      my $scaling = .3;
  my $aa = {};      if ($target eq 'web') {
  push @Apache::londefdef::table, $aa;    if ($ENV{'browser.imagesuppress'} ne 'on') {
  $Apache::londefdef::table[-1]{'row_number'} = -1;      $currentstring.= $token->[4];
  $Apache::londefdef::table[-1]{'output'} = '\begin{tabular} ';   } else {
  my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval);      my $alttag= &Apache::lonxml::get_param
  unless (defined $border) { $border = 0; }   ('alt',$parstack,$safeeval,undef,1);
  if ($border) {       unless ($alttag) {
     $Apache::londefdef::table[-1]{'hinc'} = '\hline ';    $alttag=&Apache::lonmeta::alttag
     $Apache::londefdef::table[-1]{'vinc'} = '&';       ($Apache::lonxml::pwd[-1],$src);
     $Apache::londefdef::table[-1]{'vvinc'} = '|';      }
  } else {      $currentstring.='[IMAGE: '.$alttag.']';
     $Apache::londefdef::table[-1]{'hinc'} = '';   
     $Apache::londefdef::table[-1]{'vinc'} = '&';   
     $Apache::londefdef::table[-1]{'vvinc'} = '';  
  }  
     }   
    return $currentstring;  
  }   }
         sub end_table {      } elsif ($target eq 'tex') {
     my ($target,$token) = @_;   $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
             my $currentstring = '';   &image_replication($src);
             if ($target eq 'web') {   #if original gif/jpg/png file exist do following:
               $currentstring = $token->[2];        if (-e $src) {          
     } elsif ($target eq 'tex') {      #defines the default size of image
  my $inmemory = '';      my $image = Image::Magick->new;
  my $output = '';      my $current_figure = $image->Read($src);
  my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};      $width_param = $image->Get('width') * $scaling;;
  my $in;      $height_param = $image->Get('height') * $scaling;;
  for ($in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) {      undef $image;
     $header_of_table .= $Apache::londefdef::table[-1]{'columns'}[$in].$Apache::londefdef::table[-1]{'vvinc'};      #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,
      undef,1);
       if ($TeXwidth ne '') {  
    if ($TeXwidth=~/(\d+)\s*\%/) {
       $width_param = $1*$ENV{'form.textwidth'}/100;
    } else { 
       $width_param = $TeXwidth;
  }   }
  $header_of_table .= '}';      } elsif ($TeXheight ne '') {
  for ($in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {   $width_param = $TeXheight/$height_param*$width_param;
     $output .=  $Apache::londefdef::table[-1]{'rowdata'}[$in];      } elsif ($width ne '') {
     chop $output;   $width_param = $width*$scaling;      
     $output .= ' \\\\ ';      }
       if ($width_param > $ENV{'form.textwidth'}) {$width_param =0.95*$ENV{'form.textwidth'}}
       my $file;
       my $path;
       if ($src =~ m!(.*)/([^/]*)$!) {
    $file = $2; 
    $path = $1.'/'; 
       } 
       my $newsrc = $src;
       $newsrc =~ s/\.(gif|jpg|png)$/.eps/i;
       $file=~s/\.(gif|jpg|png)$/.eps/i;
       #where can we find the picture?
       if (-e $newsrc) {
    #eps counterpart for image exist 
    if ($path) {
       $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
  }   }
                 my @length = split(/,/,$Apache::londefdef::table[-1]{'length'});      } else {
                 my $how_many_columns = $#length+1;   #there is no eps counterpart for image - check for ps one
                 my $parboxlength = '(\textwidth';   $newsrc =~ s/\.eps$/\.ps/;
                 for (my $io=0; $io<=$#length;$io++) {   if (-e $newsrc) {
     if ($length[$io] ne '') {      #ps counterpart for image exist 
  $parboxlength .= ' - '.$length[$io].' ';      $file =~ s/\.eps$/\.ps/;
       if ($path) {
    $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
     }      }
  }  
  $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;  
     $Apache::londefdef::table[-1]{'rowdata'}[$Apache::londefdef::table[-1]{'row_number'}] .= $inmemory;  
  } else {   } else {
     $currentstring = $Apache::londefdef::table[-1]{'output'};      #there aren't eps or ps - so create eps 
     $currentstring =~ s/\\\\\s+\\\\/\\\\/g;       my $temp_file;
     pop @Apache::londefdef::table;      my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat";
       $temp_file = Apache::File->new('>>'.$filename); 
       print $temp_file "$src\n";
       $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.'} ';
  }   }
     }      }
    return $currentstring;   } else {
       #original image file doesn't exist so check the alt attribute
       my $alt = 
    &Apache::lonxml::get_param('alt',$parstack,$safeeval,undef,1);
       unless ($alt) {
    $alt=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src);
       }
   
       if ($alt) {
    $currentstring .= ' '.$alt.' ';
       } else {
    #<allow> tag will care about replication 
       }
  }   }
 #-- <tr> tag      }
         sub start_tr {      return $currentstring;
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;  }
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
  $Apache::londefdef::table[-1]{'row_number'}++;  
  my $alignchar = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval),0,1);  
  if ($alignchar ne '') {  
     push @ {$Apache::londefdef::table[-1]{'rows'} }, $alignchar;  
  } else {  
     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  
   
     }   sub end_img {
    return $currentstring;      my ($target,$token) = @_;
  }              my $currentstring = '';
         sub end_tr {      if ($target eq 'web') {
     my ($target,$token) = @_;   $currentstring = $token->[2];
             my $currentstring = '';      } elsif ($target eq 'tex') {
             if ($target eq 'web') {   $currentstring = '';
  $currentstring = $token->[2];           }
     } elsif ($target eq 'tex') {      return $currentstring;
 # $currentstring .= ' START ROW '. $Apache::londefdef::table[-1]{'rowdata'}[$Apache::londefdef::table[-1]{'row_number'}].' END ROW ';  }
     }  
    return $currentstring;  #-- <applet> tag (end tag required)
  }  sub start_applet {
 #-- <td> tag      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
         sub start_td {      
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my $code=&Apache::lonxml::get_param('code',$parstack,$safeeval,undef,1);
             my $currentstring = '';      $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$code;
             if ($target eq 'web') {      
               $currentstring = $token->[4];           my $archive=&Apache::lonxml::get_param('archive',$parstack,$safeeval,
     } elsif ($target eq 'tex') {     undef,1);
  my $what_to_push = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval),0,1);      $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$archive;
  if ($what_to_push eq '') {      
     $what_to_push = substr($Apache::londefdef::table[-1]{'rows'}[0],0,1);;      my $currentstring = '';
  }      if ($target eq 'web') {
     push @{ $Apache::londefdef::table[-1]{'columns'} }, $what_to_push;   if ($ENV{'browser.appletsuppress'} ne 'on') {
  $Apache::londefdef::table[-1]{'counter_columns'}++;      $currentstring = $token->[4];
  &Apache::lonxml::startredirection();   } else {
 ;      my $alttag= &Apache::lonxml::get_param('alt',$parstack,
     }      $safeeval,undef,1);
    return $currentstring;      unless ($alttag) {
  }           $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],
         sub end_td {   $code);
     my ($target,$token) = @_;      }
             my $currentstring = '';      $currentstring='[APPLET: '.$alttag.']';
             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();  
  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;  
  }  
 #-- <th> tag  
         sub start_th {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
  my $what_to_push = substr(&Apache::lonxml::get_param('align',$parstack,$safeeval),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();  
 ;  
     }   
    return $currentstring;  
  }          
         sub end_th {  
     my ($target,$token) = @_;  
             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();  
  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;  
  }  
 #-- <img> tag  
         sub start_img {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;  
             $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=  
                                         $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 $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)$/\.eps/i;  
       if (not -e $epssrc) {  
   my $localfile = $epssrc;  
   $localfile =~ s/.*(\/res)/$1/;  
   my $file;  
   my $path;  
   if ($localfile =~ m!(.*)/([^/]*)$!) {  
       $file = $2;  
       $path = $1.'/';   
   }  
   my $signal_eps = 0;  
   my @content_directory = &Apache::lonnet::dirlist($path);  
   for (my $iy=0;$iy<=$#content_directory;$iy++) {  
       my @tempo_array = split(/&/,$content_directory[$iy]);  
       $content_directory[$iy] = $tempo_array[0];  
       if ($file eq $tempo_array[0]) {  
   $signal_eps = 1;  
   last;  
       }  
   }  
   if ($signal_eps) {  
       my $eps_file = &Apache::lonnet::getfile($localfile);  
   } else {  
       $localfile = $src;  
       $localfile =~ s/.*(\/res)/$1/;  
       my $as = &Apache::lonnet::getfile($src);        
   }  
       }  
       my $file;  
       my $path;  
               if ($src =~ m!(.*)/([^/]*)$!) {  
   $file = $2;  
   $path = $1.'/';   
       }  
       my $newsrc = $src;  
       $newsrc =~ 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='.$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='.$width_param.' mm]{'.$file.'}} ';  
       }  
     }  
     return $currentstring;  
  }  
         sub end_img {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];  
     } elsif ($target eq 'tex') {  
               $currentstring = '';  
     }  
    return $currentstring;  
  }  
 #-- <applet> tag  
   
         sub start_applet {  
     my ($target,$token) = @_;  
               $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=     
                                         $token->[2]->{'code'};  
               $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=  
                                         $token->[2]->{'archive'};  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];  
     } elsif ($target eq 'tex') {  
               $currentstring = " \\begin{figure} ";  
     }   
    return $currentstring;  
  }   }
       } elsif ($target eq 'tex') {
    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;
   }
   
 sub end_applet {  sub end_applet {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web') {      if ($target eq 'web') {
  $currentstring = $token->[2];   $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = " \\end{figure}";  
     }       } 
     return $currentstring;      return $currentstring;
 }  }
   
 #-- <embed> tag  #-- <embed> tag (end tag optional/required)
   
 sub start_embed {      sub start_embed {    
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
       $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src;
       my $currentstring = '';
       if ($target eq 'web') {
    if ($ENV{'browser.embedsuppress'} ne 'on') {
       $currentstring = $token->[4];
    } else {
       my $alttag=&Apache::lonxml::get_param
    ('alt',$parstack,$safeeval,undef,1);
       unless ($alttag) {
    $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src);
       }
       $currentstring='[EMBED: '.$alttag.']';
    }
       } elsif ($target eq 'tex') {
       } 
       return $currentstring;
   }
   
   sub end_embed {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=  
  $token->[2]->{'src'};  
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web') {      if ($target eq 'web') {
  $currentstring = $token->[4];   $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {  
       } 
       return $currentstring;
   }
   
   #-- <param> tag (end tag forbidden)
   sub start_param {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       if (&Apache::lonxml::get_param
    ('name',$parstack,$safeeval,undef,1)=~/^cabbase$/i) {
    $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
       &Apache::lonxml::get_param('value',$parstack,$safeeval,undef,1);
       }   
       $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=   
    &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = " \\begin{figure} ";    
     }       } 
     return $currentstring;      return $currentstring;
 }  }
         sub end_embed {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];       
     } elsif ($target eq 'tex') {  
               $currentstring = " \\end{figure}";    
     }   
    return $currentstring;  
  }  
   
 #-- <param> tag  sub end_param {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
       } 
       return $currentstring;
   }
   
   #-- <allow> tag
   sub start_allow {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
       $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
       $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=
    &Apache::lonnet::clutter($src);
       &image_replication($src);
       my $result;
       if ($target eq 'edit') {
    $result .=&Apache::edit::tag_start($target,$token);
    $result .=&Apache::edit::text_arg('File Spec:','src',$token,70);
    $result .=&Apache::edit::end_row();#.&Apache::edit::start_spanning_row();
       } elsif ($target eq 'modified') {
    my $constructtag=&Apache::edit::get_new_args($token,$parstack,
        $safeeval,'src');
    if ($constructtag) { $result = &Apache::edit::rebuild_tag($token); }
       }
       return $result;
   }
   
   sub end_allow {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       if ( $target eq 'edit') { return (&Apache::edit::end_table()); }
       return '';
   }
   
         sub start_param {  #-- Frames (end tag required)
     my ($target,$token) = @_;  #-- <frameset>
     if ($token->[2]->{'name'} eq 'cabbase') {  sub start_frameset {
                       $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=      my ($target,$token) = @_;
      $token->[2]->{'value'};      my $currentstring = '';
             }         if ($target eq 'web') { 
             $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=      if (!$Apache::lonxml::registered &&
                                         $token->[2]->{'src'};      $ENV{'request.state'} eq 'published') {
             my $currentstring = '';      $currentstring.='<head>'.
             if ($target eq 'web') {   &Apache::lonmenu::registerurl(undef,$target).'</head>';
               $currentstring = $token->[4];        }
     } elsif ($target eq 'tex') {   my $onLoad='';
               $currentstring = " \\begin{figure} ";     foreach my $key (keys(%{$token->[2]})) {
     }       if ($key =~ /^onload$/i) {
    return $currentstring;   $onLoad.=$token->[2]->{$key}.';';
  }   delete($token->[2]->{$key});
         sub end_param {      }
     my ($target,$token) = @_;   }
             my $currentstring = '';   $token->[2]->{'onload'}=&Apache::lonmenu::loadevents().';'.$onLoad;
             if ($target eq 'web') {   my $onUnload='';
               $currentstring = $token->[2];        foreach my $key (keys(%{$token->[2]})) {
     } elsif ($target eq 'tex') {      if ($key =~ /^onunload$/i) {
               $currentstring = " \\end{figure}";     $onUnload.=$token->[2]->{$key}.';';
     }    delete($token->[2]->{$key});
    return $currentstring;      }
    }
    $token->[2]->{'onunload'}=&Apache::lonmenu::unloadevents().
       ';'.$onUnload;
   
    $currentstring .= '<'.$token->[1];
    foreach (keys %{$token->[2]}) {
       $currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"';
  }   }
    $currentstring.='>';
       }
       return $currentstring;
   }
   
 #-- <allow> tag  sub end_frameset {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];
       }
       return $currentstring;
   }
   
         sub start_allow {  #-- <xmp> (end tag required)
     my ($target,$token) = @_;  sub start_xmp {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    $currentstring .= '\begin{verbatim}';
       } 
       return $currentstring;
   }
   
             $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=     sub end_xmp {
                                         $token->[2]->{'src'};      my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '\end{verbatim}';
       }
       return $currentstring;
   }
   
   #-- <pre> (end tag required)
   sub start_pre {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } elsif ($target eq 'tex') {
    $currentstring .= '\begin{verbatim}';
       } 
       return $currentstring;
   }
   
   sub end_pre {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '\end{verbatim}';
       }
       return $currentstring;
   }
   
    return '';  
  }  
         sub end_allow {  
    return '';  
  }  
 #-- Frames  
  sub start_frameset {  
   my ($target,$token) = @_;  
   my $currentstring = '';  
   if ($target eq 'web') {   
     if (!$Apache::lonxml::registered) {  
       $currentstring.='<head>'.  
   &Apache::lonxml::registerurl(undef,$target).'</head>';  
     }  
     $currentstring .= $token->[4];  
   }  
   return $currentstring;  
  }  
         sub end_frameset {  
   my ($target,$token) = @_;  
   my $currentstring = '';  
   if ($target eq 'web') {  
     $currentstring = $token->[2];  
   }  
   return $currentstring;  
  }  
 #-- <pre>  
  sub start_pre {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[4];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '\begin{verbatim}';  
     }   
            return $currentstring;  
  }  
         sub end_pre {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     } elsif ($target eq 'tex') {  
  $currentstring .= '\end{verbatim}';  
     }  
            return $currentstring;  
  }  
 #-- <insert>  #-- <insert>
  sub start_insert {  sub start_insert {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
  my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval);   my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval,undef,1);
        $currentstring .= '<b>'.$display.'</b>';;   $currentstring .= '<b>'.$display.'</b>';;
     }      }
            return $currentstring;      return $currentstring;
  }  }
         sub end_insert {  
     my ($target,$token) = @_;  sub end_insert {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= '';      if ($target eq 'web') {
     }   $currentstring .= '';
            return $currentstring;      }
  }      return $currentstring;
   }
   
 #-- <externallink>  #-- <externallink>
  sub start_externallink {  sub start_externallink {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
  my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval);   my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval,undef,1);
        $currentstring .= '<b>'.$display.'</b>';;   $currentstring .= '<b>'.$display.'</b>';;
     }      }
            return $currentstring;      return $currentstring;
  }  }
         sub end_externallink {  
     my ($target,$token) = @_;  sub end_externallink {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= '';      if ($target eq 'web') {
     }   $currentstring .= '';
            return $currentstring;      }
  }      return $currentstring;
   }
   
 #-- <blankspace heigth="">  #-- <blankspace heigth="">
         sub start_blankspace {  sub start_blankspace {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'tex') {      if ($target eq 'tex') {
  my $howmuch = &Apache::lonxml::get_param('heigth',$parstack,$safeeval);   my $howmuch = &Apache::lonxml::get_param('heigth',$parstack,$safeeval,undef,1);
  $currentstring .= '\vskip '.$howmuch.' ';   $currentstring .= '\vskip '.$howmuch.' ';
     }      }
            return $currentstring;      return $currentstring;
  }  }
         sub end_blankspace {  
     my ($target,$token) = @_;  sub end_blankspace {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'tex') {      my $currentstring = '';
        $currentstring .= '';      if ($target eq 'tex') {
    $currentstring .= '';
       }
       return $currentstring;
   }
   
   #-- <abbr> tag (end tag required)
   sub start_abbr {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_abbr {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <acronym> tag (end tag required)
   sub start_acronym {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_acronym {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <area> tag (end tag forbidden)
   sub start_area {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_area {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <base> tag (end tag forbidden)
   sub start_base {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       }
       return $currentstring;
   }
   
   sub end_base {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <bdo> tag (end tag required)
   sub start_bdo {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_bdo {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <bgsound> tag (end tag optional)
   sub start_bgsound {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_bgsound {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <blink> tag (end tag required)
   sub start_blink {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_blink {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <blockquote> tag (end tag required)
   sub start_blockquote {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_blockquote {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <button> tag (end tag required)
   sub start_button {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_button {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <caption> tag (end tag required)
   sub start_caption {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_caption {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <col> tag (end tag forbdden)
   sub start_col {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_col {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <colgroup> tag (end tag optional)
   sub start_colgroup {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_colgroup {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <del> tag (end tag required)
   sub start_del {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_del {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <fieldset> tag (end tag required)
   sub start_fieldset {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_fieldset {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <frame> tag (end tag forbidden)
   sub start_frame {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_frame {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <iframe> tag (end tag required)
   sub start_iframe {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_iframe {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <ins> tag (end tag required)
   sub start_ins {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_ins {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <isindex> tag (end tag forbidden)
   sub start_isindex {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_isindex {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <keygen> tag (end tag forbidden)
   sub start_keygen {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_keygen {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <label> tag
   sub start_label {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_label {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <layer> tag (end tag required)
   sub start_layer {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_layer {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <legend> tag (end tag required)
   sub start_legend {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_legend {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <link> tag (end tag forbidden)
   sub start_link {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_link {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <marquee> tag (end tag optional)
   sub start_marquee {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_marquee {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <multicol> tag (end tag required)
   sub start_multicol {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_multicol {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <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;
   }
   
   sub end_nobr {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       }   elsif ($target eq 'tex') {
    $currentstring='}';
       }
       return $currentstring;
   }
   
   #-- <noembed> tag (end tag required)
   sub start_noembed {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_noembed {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <noframes> tag (end tag required)
   sub start_noframes {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_noframes {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <nolayer> tag (end tag required)
   sub start_nolayer {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_nolayer {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <noscript> tag (end tag required)
   sub start_noscript {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_noscript {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <object> tag (end tag required)
   sub start_object {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_object {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <optgroup> tag (end tag required)
   sub start_optgroup {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_optgroup {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <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;
   }
   
   sub end_samp {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } elsif ($target eq 'tex') {
    $currentstring='}';
       }
       return $currentstring;
   }
   
   #-- <server> tag
   sub start_server {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_server {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <spacer> tag (end tag forbidden)
   sub start_spacer {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_spacer {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <span> tag (end tag required)
   sub start_span {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_span {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <tbody> tag (end tag optional)
   sub start_tbody {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_tbody {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <tfoot> tag (end tag optional)
   sub start_tfoot {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_tfoot {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <thead> tag (end tag optional)
   sub start_thead {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_thead {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <var> tag
   sub start_var {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } elsif ($target eq 'tex') {
    $currentstring = '\textit{'; 
       }
       return $currentstring;
   }
   
   sub end_var {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring = '}'; 
       } 
       return $currentstring;
   }
   
   #-- <wbr> tag (end tag forbidden)
   sub start_wbr {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[4];     
       } 
       return $currentstring;
   }
   
   sub end_wbr {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <hideweboutput> tag
   sub start_hideweboutput {
       my ($target,$token) = @_;
       if ($target eq 'web') {
    &Apache::lonxml::startredirection();     
       } 
       return '';
   }
   
   sub end_hideweboutput {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = &Apache::lonxml::endredirection();    
       } 
       return '';
   }
   
   
   sub image_replication {
       my $src = shift;
       if (not -e $src) {
    #replicates image itself
    &Apache::lonnet::repcopy($src);
    #replicates eps or ps 
    my $newsrc = $src;
    $newsrc =~ s/\.(gif|jpg|jpeg|png)$/.eps/i;
    if (not -e $newsrc) {
       if (&Apache::lonnet::repcopy($newsrc) ne 'OK') {
    $newsrc =~ s/\.eps$/\.ps/;
    &Apache::lonnet::repcopy($newsrc);
     }      }
            return $currentstring;  
  }   }
       }
       return '';
   }
   
   sub recalc {
       my $argument = shift;
       if (not $argument=~/(mm|cm|in|pc|pt)/) {return $argument.' mm';}
       $argument=~/\s*(\d+\.?\d*)\s*(mm|cm|in|pc|pt)/;
       my $value=$1;
       my $units=$2;
       if ($units eq 'cm') {
    $value*=10;
       } elsif ($units eq 'in') {
    $value*=25.4;
       } elsif ($units eq 'pc') {
    $value*=(25.4*12/72.27);
       } elsif ($units eq 'pt') {
    $value*=(25.4/72.27);
       }
       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;  1;
 __END__  __END__

Removed from v.1.77  
changed lines
  Added in v.1.184


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.