Diff for /loncom/xml/londefdef.pm between versions 1.112 and 1.178

version 1.112, 2003/02/07 22:03:21 version 1.178, 2003/10/01 21:13:50
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',('a','abbr','acronym','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'));      &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;
 }  }
   
 sub start_tthoption {  sub start_tthoption {
   my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
   my $result;      my $result;
   if ($target eq 'web') {      if ($target eq 'web') {
       my $inside = &Apache::lonxml::get_all_text("/tthoption",$parser);   my $inside = &Apache::lonxml::get_all_text("/tthoption",$parser);
       $inside=~s/^\s*//;   $inside=~s/^\s*//;
       if ($ENV{'browser.mathml'}) {   if ($ENV{'browser.mathml'}) {
   &tth::ttmoptions($inside);      &tth::ttmoptions($inside);
       } else {   } else {
   &tth::tthoptions($inside);      &tth::tthoptions($inside);
       }   }
   }      }
       return $result;
 }  }
   
 sub end_tthoption {  sub end_tthoption {
   my ($target,$token) = @_;      my ($target,$token) = @_;
   my $result;      my $result;
   return $result;      return $result;
 }  }
   
 #-- <html> tag      #-- <html> tag    
Line 153  sub start_html { Line 164  sub start_html {
     &Apache::lonxml::fontsettings();           &Apache::lonxml::fontsettings();     
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  @Apache::londefdef::table = ();   @Apache::londefdef::table = ();
  $currentstring .= '\documentclass[letterpaper]{article}   $currentstring .= '\documentclass[letterpaper]{article}';
                                  \newcommand{\keephidden}[1]{}   if ($ENV{'form.latex_type'}=~'batchmode') {$currentstring .='\batchmode';} 
                                  \renewcommand{\deg}{$^{\circ}$}   $currentstring .= '\newcommand{\keephidden}[1]{}
                                  \usepackage[dvips]{graphicx}                             \renewcommand{\deg}{$^{\circ}$}
                                  \usepackage{epsfig}\usepackage{calc}                             \usepackage{longtable}
                                  \newenvironment{choicelist}{\begin{enumerate}}{\end{enumerate}}';                             \usepackage{textcomp}
                              \usepackage{makeidx}
                              \usepackage[dvips]{graphicx}
                              \usepackage{epsfig}\usepackage{calc}
   \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;      return $currentstring;
 }  }
         sub end_html {  
     my ($target,$token) = @_;  sub end_html {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
  $currentstring = &Apache::lonxml::xmlend();      if ($target eq 'web') {
     }   $currentstring = &Apache::lonxml::xmlend();
    return $currentstring;      }
  }      return $currentstring;
   }
   
 #-- <head> tag  #-- <head> tag
       sub start_head {  sub start_head {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_head {  
     my ($target,$token) = @_;  sub end_head {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = &Apache::lonxml::registerurl(undef,$target).      if ($target eq 'web') {
                                $token->[2];       $currentstring = &Apache::lonmenu::registerurl(undef,$target).
             }       $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <map> tag  #-- <map> tag
       sub start_map {  sub start_map {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_map {  
     my ($target,$token) = @_;  sub end_map {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <select> tag  #-- <select> tag
       sub start_select {  sub start_select {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_select {  
     my ($target,$token) = @_;  sub end_select {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <option> tag  #-- <option> tag
       sub start_option {  sub start_option {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
   }
   
   sub end_option {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
   #-- <input> tag
   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
   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
   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
   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
   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) {
    $currentstring='<'.$name;
                    my $display=&Apache::lonxml::get_param
    ('display',$parstack,$safeeval,undef,1);
                   if ($display) {
                       $display=~s/\"/\'/g;
       $currentstring.=' display="'.$display.'"';
                   }
    $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>';
               }
  }   }
 #-- <input> tag      } elsif ($target eq 'tex') {
       sub start_input {   my $content=&Apache::lonxml::get_param('content',$parstack,$safeeval);
     my ($target,$token) = @_;   my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval);
             my $currentstring = '';   if ((not defined $content) && (not defined $name)) {
             if ($target eq 'web') {      &Apache::lonxml::startredirection();
               $currentstring = $token->[4];       
     }   
    return $currentstring;  
  }   }
         sub end_input {      }
     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') {
    my $args='';
    if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
    if ($args ne '') {
       $currentstring = $token->[4];
  }   }
 #-- <textarea> tag      } elsif ($target eq 'tex') {
       sub start_textarea {   my $content=&Apache::lonxml::get_param('content',$parstack,$safeeval);
     my ($target,$token) = @_;   my $name=&Apache::lonxml::get_param('name',$parstack,$safeeval);
             my $currentstring = '';   if ((not defined $content) && (not defined $name)) {
             if ($target eq 'web') {      &Apache::lonxml::endredirection();
               $currentstring = $token->[4];       
     }   
    return $currentstring;  
  }   }
         sub end_textarea {      }
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
               $currentstring = $token->[2];      # accessrule
             }   sub start_accessrule {
    return $currentstring;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       my $eff=&Apache::lonxml::get_param
    ('effect',$parstack,$safeeval,undef,1);
       my $realm=&Apache::lonxml::get_param
    ('realm',$parstack,$safeeval,undef,1);
       my $role=&Apache::lonxml::get_param
    ('role',$parstack,$safeeval,undef,1);
       $realm=~s/\s+//g;
       $realm=~s/\//\_/g;
       $realm=~s/^\_//;
       $realm=~s/\W/\;/g;
       $role=~s/\s+//g;
       $role=~s/\//\_/g;
       $role=~s/\W/\;/g;
       if ($target eq 'web') {
    my $args='';
    if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }
    if ($args eq '') {
       &Apache::lonxml::get_all_text("/accessrule",$parser);
    } else {
       $currentstring = $token->[4];
  }   }
 #-- <form> tag      }
       sub start_form {      if ($target eq 'meta') {
     my ($target,$token) = @_;   $currentstring='<rule>'.$eff.':'.$realm.':'.$role.'</rule>';
             my $currentstring = '';      }
             if ($target eq 'web') {      return $currentstring;
               $currentstring = $token->[4];       }
     }   
    return $currentstring;  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];
  }   }
         sub end_form {      } 
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
               $currentstring = $token->[2];      #-- <body> tag
             }   sub start_body {
    return $currentstring;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    if ($Apache::lonhomework::parsing_a_problem) {
       &Apache::lonxml::warning("<body> tag found inside of <problem> tag this can cause problems.");
       return '';
    }
    if (!$Apache::lonxml::registered) {
       $currentstring.='<head>'.
    &Apache::lonmenu::registerurl(undef,$target).'</head>';
    }
   # Accessibility
    if ($ENV{'browser.imagesuppress'} eq 'on') {
       delete($token->[2]->{'background'});
    }
    if ($ENV{'browser.fontenhance'} eq 'on') {
       my $style='';
       foreach my $key (keys(%{$token->[2]})) {
    if ($key =~ /^style$/i) {
       $style.=$token->[2]->{$key}.';';
       delete($token->[2]->{$key});
    }
       }
       $token->[2]->{'style'}=$style.'; font-size: x-large;';
  }   }
 #-- <title> tag   if ($ENV{'browser.blackwhite'} eq 'on') {
       sub start_title {      delete($token->[2]->{'font'});
     my ($target,$token) = @_;      delete($token->[2]->{'link'});
             my $currentstring = '';      delete($token->[2]->{'alink'});
             if ($target eq 'web') {      delete($token->[2]->{'vlink'});
               $currentstring = $token->[4];           delete($token->[2]->{'bgcolor'});
     } elsif ($target eq 'tex') {      delete($token->[2]->{'background'});
               $currentstring .= '\keephidden{'   
     }  
             if ($target eq 'meta') {  
  $currentstring='<title>';  
                 &start_output();  
             }  
    return $currentstring;  
  }   }
         sub end_title {  # Overload loads
     my ($target,$token) = @_;   my $onLoad='';
             my $currentstring = '';   foreach my $key (keys(%{$token->[2]})) {
             if ($target eq 'web') {      if ($key =~ /^onload$/i) {
               $currentstring = $token->[2];       $onLoad.=$token->[2]->{$key}.';';
             } elsif ($target eq 'tex') {   delete($token->[2]->{$key});
               $currentstring .= '}';      }
     }    
             if ($target eq 'meta') {  
                &end_output();  
                $currentstring='</title>';  
             }   
    return $currentstring;  
  }   }
 #-- <meta> tag   $token->[2]->{'onload'}=&Apache::lonmenu::loadevents().';'.$onLoad;
       sub start_meta {   my $onUnload='';
     my ($target,$token,$tagstack,$parstack,$parser) = @_;   foreach my $key (keys(%{$token->[2]})) {
             my $currentstring = '';      if ($key =~ /^onunload$/i) {
             if ($target eq 'web') {   $onUnload.=$token->[2]->{$key}.';';
       my $args='';   delete($token->[2]->{$key});
       if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }  
       if ($args eq '') {  
  &Apache::lonxml::get_all_text("/meta",$parser);  
       } else {  
  $currentstring = $token->[4];  
       }  
     }  
             if ($target eq 'meta') {  
  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 {   $token->[2]->{'onunload'}=&Apache::lonmenu::unloadevents().
  my ($target,$token,$tagstack,$parstack,$parser) = @_;      ';'.$onUnload;
  my $currentstring = '';  
  if ($target eq 'web') {   $currentstring .= '<'.$token->[1];
   my $args='';   foreach (keys %{$token->[2]}) {
   if ( $#$parstack > -1 ) { $args=$$parstack[$#$parstack]; }      $currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"';
   if ($args ne '') {   }
     $currentstring = $token->[4];   $currentstring.='>';
   }   if ($ENV{'request.state'} ne 'published') {
  }       $currentstring.=(<<EDITBUTTON);
  return $currentstring;  
       }  
 #-- <body> tag  
         sub start_body {  
             my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
       if (!$Apache::lonxml::registered) {  
  $currentstring.='<head>'.  
     &Apache::lonxml::registerurl(undef,$target).'</head>';  
       }  
       my $onLoad='';  
       foreach my $key (keys(%{$token->[2]})) {  
  if ($key =~ /^onload$/i) {  
   $onLoad.=$token->[2]->{$key}.';';  
   delete($token->[2]->{$key});  
  }  
       }  
       $token->[2]->{'onload'}=&Apache::lonxml::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::lonxml::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;  
  }   }
       } elsif ($target eq 'tex') {
    $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 = '\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent \end{document}';  
       } 
       return $currentstring;
   }
   
 #-- <center> tag  #-- <center> tag
         sub start_center {  sub start_center {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 = '\begin{center}';     $currentstring = '\begin{center}';  
     }  elsif ($target eq 'latexsource') {      }
               $currentstring = '\begin{center}';        return $currentstring;
     }   }
    return $currentstring;  
  }  sub end_center {
         sub end_center {      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{center}';  
               $currentstring = '\end{center}';        }
     }  elsif ($target eq 'latexsource') {      return $currentstring;
               $currentstring = '\end{center}';    }
     }   
    return $currentstring;  
  }  
 #-- <b> tag  #-- <b> tag
         sub start_b {  sub start_b {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 = '\textbf{';     $currentstring = '\textbf{';  
     }  elsif ($target eq 'latexsource') {      } 
               $currentstring = '\textbf{';        return $currentstring;
     }   }
    return $currentstring;  
  }  sub end_b {
         sub end_b {      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 = '}';  
               $currentstring = '}';        } 
       return $currentstring;
   }
   
     } elsif ($target eq 'latexsource') {  
               $currentstring = '}';    
     }   
    return $currentstring;  
  }  
 #-- <strong> tag  #-- <strong> tag
         sub start_strong {  sub start_strong {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 = '\textbf{';     $currentstring = '\textbf{';  
     } elsif ($target eq 'latexsource') {      } 
               $currentstring = '\textbf{';        return $currentstring;
     }   }
    return $currentstring;  
  }  sub end_strong {
         sub end_strong {      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 = '}';  
               $currentstring = '}';        }
     }  elsif ($target eq 'latexsource') {      return $currentstring;
               $currentstring = '}';    }
     }   
    return $currentstring;  
  }  
 #-- <h1> tag  #-- <h1> tag
         sub start_h1 {  sub start_h1 {
     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;
     } elsif ($target eq 'meta') {   my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
  $currentstring='<subject>';   if (($align eq 'center') || (not defined $align)) {
                 &start_output();      $pre='\begin{center}';
             }   } elsif ($align eq 'left') {
            return $currentstring;      $pre='\rlap{';
  }   } elsif ($align eq 'right') {
         sub end_h1 {      $pre=' \hfill \llap{';
     my ($target,$token) = @_;   }
             my $currentstring = '';   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
             if ($target eq 'web') {   if (not defined $TeXsize) {$TeXsize="large";}
        $currentstring .= $token->[2];   $currentstring .= $pre.'{\\'.$TeXsize.' \textbf{'; 
     } elsif ($target eq 'tex') {      } elsif ($target eq 'meta') {
  $currentstring .= '}}';   $currentstring='<subject>';
     } elsif ($target eq 'meta') {   &start_output();
                 &end_output();      }
  $currentstring='</subject>';      return $currentstring;
             }   }
            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;
   }
   
 #-- <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;
   }
   
   sub end_h6 {
       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;
   }
   
 #--- <cite> tag  #--- <cite> tag
         sub start_cite {  sub start_cite {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= "\\textit{";   $currentstring .= "\\textit{";
     }  elsif ($target eq 'latexsource') {      }
  $currentstring .= "\\textit{";      return $currentstring;
     }   }
            return $currentstring;  
  }  sub end_cite {
         sub end_cite {      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 .= "}";
  $currentstring .= "}";      }
     }  elsif ($target eq 'latexsource') {      return $currentstring;
  $currentstring .= "}";  }
     }   
            return $currentstring;  
  }  
 #-- <i> tag  #-- <i> tag
         sub start_i {  sub start_i {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= '\textit{';   $currentstring .= '\textit{';
     }  elsif ($target eq 'latexsource') {      }
  $currentstring .= '\textit{';      return $currentstring;
     }   }
            return $currentstring;  
  }  sub end_i {
         sub end_i {      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 .= '}';
  $currentstring .= '}';      } 
     } elsif ($target eq 'latexsource') {      return $currentstring;
  $currentstring .= '}';  }
     }   
            return $currentstring;  
  }  
 #-- <address> tag  #-- <address> tag
         sub start_address {  sub start_address {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= "\\textit{";   $currentstring .= "\\textit{";
     } elsif ($target eq 'latexsource') {      }
  $currentstring .= "\\textit{";      return $currentstring;
     }   }
            return $currentstring;  
  }  sub end_address {
         sub end_address {      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 .= "}";
  $currentstring .= "}";      }
     } elsif ($target eq 'latexsource') {      return $currentstring;
  $currentstring .= "}";  }
     }  
            return $currentstring;  
  }  
 #-- <dfn> tag  #-- <dfn> tag
         sub start_dfn {  sub start_dfn {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= "\\textit{";   $currentstring .= "\\textit{";
     } elsif ($target eq 'latexsource') {      } 
  $currentstring .= "\\textit{";      return $currentstring;
     }   }
            return $currentstring;  
  }  sub end_dfn {
         sub end_dfn {      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 .= "}";
  $currentstring .= "}";      }
     } elsif ($target eq 'latexsource') {      return $currentstring;
  $currentstring .= "}";  }
     }   
            return $currentstring;  
  }  
 #-- <tt> tag  #-- <tt> tag
         sub start_tt {  sub start_tt {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= '\texttt{';   $currentstring .= '\texttt{';
     } elsif ($target eq 'latexsource') {      }
  $currentstring .= '\texttt{';      return $currentstring;
     }   }
            return $currentstring;  
  }  sub end_tt {
         sub end_tt {      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 .= '}';
  $currentstring .= '}';      }
     } elsif ($target eq 'latexsource') {      return $currentstring;
  $currentstring .= '}';  }
     }  
            return $currentstring;  
  }  
 #-- <kbd> tag  #-- <kbd> tag
         sub start_kbd {  sub start_kbd {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= "\\texttt";   $currentstring .= "\\texttt";
     } elsif ($target eq 'latexsource') {      }
  $currentstring .= "\\texttt{";      return $currentstring;
     }   }
            return $currentstring;  
  }  sub end_kbd {
         sub end_kbd {      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 .= "}";
  $currentstring .= "}";      }
     } elsif ($target eq 'latexsource') {      return $currentstring;
  $currentstring .= "}";  }
     }   
            return $currentstring;  
  }  
 #-- <code> tag  #-- <code> tag
         sub start_code {  sub start_code {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= '\texttt{';   $currentstring .= '\texttt{';
     }       } 
            return $currentstring;      return $currentstring;
  }  }
         sub end_code {  
     my ($target,$token) = @_;  sub end_code {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= $token->[2];      if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring .= $token->[2];
  $currentstring .= '}';      } elsif ($target eq 'tex') {
     }    $currentstring .= '}';
            return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <em> tag  #-- <em> tag
         sub start_em {  sub start_em {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= '\emph{';   $currentstring .= '\emph{';
     } elsif ($target eq 'latexsource') {      }
  $currentstring .= '\emph{';      return $currentstring;
     }   }
            return $currentstring;  
  }  sub end_em {
         sub end_em {      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 .= '}';
  $currentstring .= '}';      } 
     } elsif ($target eq 'latexsource') {      return $currentstring;
  $currentstring .= '}';  }
     }    
            return $currentstring;  
  }  
 #-- <q> tag  #-- <q> tag
         sub start_q {  sub start_q {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= "\\emph{";   $currentstring .= "\\emph{";
     }  elsif ($target eq 'latexsource') {      }
  $currentstring .= "\\emph{";      return $currentstring;
     }  }
            return $currentstring;  
  }  sub end_q {
         sub end_q {      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 .= "}";
  $currentstring .= "}";      } 
     } elsif ($target eq 'latexsource') {      return $currentstring;
  $currentstring .= "}";  }
     }    
            return $currentstring;  
  }  
 #-- <p> tag  #-- <p> tag
         sub start_p {  sub start_p {
     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 .= '{\par ';   my $signal=1;
     } elsif ($target eq 'latexsource') {   foreach my $tag (@$tagstack) {if (lc($tag) eq 'b') {$signal=0;}}
  $currentstring .= '{\par ';   if ($signal) {$currentstring .= '\par ';}
     }       }
            return $currentstring;      return $currentstring;
  }  }
         sub end_p {  
     my ($target,$token) = @_;  sub end_p {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= $token->[2];      if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring .= $token->[2];
         $currentstring .= '}';      }
             } elsif ($target eq 'latexsource') {      return $currentstring;
         $currentstring .= '}';  }
             }  
            return $currentstring;  
  }  
 #-- <br> tag  #-- <br> tag
         sub start_br {  sub start_br {
     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') {
        $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  if ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') {   if ($$tagstack[-2] ne 'sub' && $$tagstack[-2] ne 'sup') {
     $currentstring .= '\vskip 0.2 mm';      $currentstring .= '\vskip 0.2 mm ';
  }  
     } elsif ($target eq 'latexsource') {  
  $currentstring .= '\\';  
     }   
            return $currentstring;  
  }  
         sub end_br {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= $token->[2];  
     }  
            return $currentstring;  
  }   }
       }
       return $currentstring;
   }
   
   sub end_br {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       }
       return $currentstring;
   }
   
 #-- <big> tag  #-- <big> tag
         sub start_big {  sub start_big {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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{';   $currentstring .= '{\large ';
     } elsif ($target eq 'latexsource') {      } 
  $currentstring .= '{\Large ';      return $currentstring;
     }    }
            return $currentstring;  
  }  sub end_big {
         sub end_big {      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 .= '}';
         $currentstring .= '}';      }
             } elsif ($target eq 'latexsource') {      return $currentstring;
         $currentstring .= '}';  }
             }  
            return $currentstring;  
  }  
 #-- <small> tag  #-- <small> tag
         sub start_small {  sub start_small {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= '{\footnotesize ';   $currentstring .= '{\footnotesize ';
     } elsif ($target eq 'latexsource') {      }
  $currentstring .= '{\footnotesize ';      return $currentstring;
     }   }
            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
   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_small {      }
     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 = '}';
  }   }
 #-- <basefont> tag      }
       sub start_basefont {      return $currentstring;
  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  #-- <font> tag
          sub start_font {  sub start_font {
     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 $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);   my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);
       if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode++;}   if ($face=~/symbol/i) {
               $currentstring = $token->[4];           $Apache::lonxml::prevent_entity_encode++;
     }    } else {
    return $currentstring;      if (($ENV{'browser.fontenhance'} eq 'on') || 
    ($ENV{'browser.blackwhite'} eq 'on')) { return ''; }
  }   }
         sub end_font {   $currentstring = $token->[4];     
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      }  elsif ($target eq 'tex') {
             my $currentstring = '';   my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
             if ($target eq 'web') {   if (defined $fontsize) {
       my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);      $currentstring = '{\\'.$fontsize.' ';
       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') {  
        &Apache::lonxml::startredirection();  
     }   
            return $currentstring;  
  }   }
         sub end_strike {      }
     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=&Apache::lonxml::endredirection();      my $currentstring = '';
        $currentstring=~s/(\S)(\s+)(\S)/$1}$2\\underline{$3/g;      if ($target eq 'web') {
        $currentstring=~s/^\s*(\S)/\\underline{$1/;   my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);
        $currentstring=~s/(\S)\s*$/$1}/;          if ($face=~/symbol/i) {$Apache::lonxml::prevent_entity_encode--;}
             }   $currentstring = $token->[2];    
            return $currentstring;      }  elsif ($target eq 'tex') {
    my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
    if (defined $fontsize) {
       $currentstring = '}';
  }   }
       }
       return $currentstring;
   }
    
   #-- <strike> tag
   sub start_strike {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[4];
       } 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  #-- <s> tag
         sub start_s {  sub start_s {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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') {
        &Apache::lonxml::startredirection();   &Apache::lonxml::startredirection();
     }       } 
            return $currentstring;      return $currentstring;
  }  }
         sub end_s {  
     my ($target,$token) = @_;  sub end_s {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= $token->[2];      if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring .= $token->[2];
        $currentstring=&Apache::lonxml::endredirection();      } elsif ($target eq 'tex') {
        $currentstring=~s/(\S)(\s+)(\S)/$1}$2\\underline{$3/g;   $currentstring=&Apache::lonxml::endredirection();
        $currentstring=~s/^\s*(\S)/\\underline{$1/;   $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;
        $currentstring=~s/(\S)\s*$/$1}/;   $currentstring=~s/^\s*(\S)/\\underline\{$1/;
             }   $currentstring=~s/(\S)\s*$/$1\}/;
            return $currentstring;      }
  }      return $currentstring;
   }
   
 #-- <sub> tag  #-- <sub> tag
         sub start_sub {  sub start_sub {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= "\$_{ ";   $currentstring .= "\$_{ ";
     }       } 
            return $currentstring;      return $currentstring;
  }  }
         sub end_sub {  
     my ($target,$token) = @_;  sub end_sub {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= $token->[2];      if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring .= $token->[2];
         $currentstring .= " }\$";      } elsif ($target eq 'tex') {
             }   $currentstring .= " }\$";
            return $currentstring;      }
  }      return $currentstring;
   }
   
 #-- <sup> tag  #-- <sup> tag
         sub start_sup {  sub start_sup {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 .= "\$^{ ";   $currentstring .= "\$^{ ";
     }       } 
            return $currentstring;      return $currentstring;
  }  }
         sub end_sup {  
     my ($target,$token) = @_;  sub end_sup {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= $token->[2];      if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring .= $token->[2];
         $currentstring .= " }\$";      } elsif ($target eq 'tex') {
             }   $currentstring .= " }\$";
            return $currentstring;      }
  }      return $currentstring;
   }
   
 #-- <hr> tag  #-- <hr> tag
         sub start_hr {  sub start_hr {
     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 .= '\vskip 0 mm \noindent\makebox[\textwidth/2 ][b]{\hrulefill}\vskip 0 mm ';   my $LaTeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0);
     }    if (defined $LaTeXwidth) {
            return $currentstring;      if ($LaTeXwidth=~/^%/) {
    substr($LaTeXwidth,0,1)='';
    $LaTeXwidth=($LaTeXwidth/100).'\textwidth';
       }
    } else {
       $LaTeXwidth ='0.9\textwidth';
  }   }
         sub end_hr {   my ($pre,$post);
     my ($target,$token) = @_;   my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
             my $currentstring = '';   if (($align eq 'center') || (not defined $align)) {
             if ($target eq 'web') {      $pre=''; $post='';
        $currentstring .= $token->[2];   } elsif ($align eq 'left') {
     } elsif ($target eq 'tex') {      $pre='\rlap{'; $post='} \hfill';
     }    } elsif ($align eq 'right') {
            return $currentstring;      $pre=' \hfill \llap{'; $post='}';
  }   }
    $currentstring .= ' \vskip 0 mm \noindent\makebox['.$LaTeXwidth.']{'.$pre.'\makebox['.
                                       $LaTeXwidth.'][b]{\hrulefill}'.$post.'}\vskip 0 mm ';
       } 
       return $currentstring;
   }
   
   sub end_hr {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       }
       return $currentstring;
   }
   
 #-- <div> tag  #-- <div> tag
         sub start_div {  sub start_div {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
        $currentstring .= $token->[4];   $currentstring .= $token->[4];
     }       } 
            return $currentstring;      return $currentstring;
  }  }
         sub end_div {  
     my ($target,$token) = @_;  sub end_div {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= $token->[2];      if ($target eq 'web') {
     }    $currentstring .= $token->[2];
            return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <a> tag  #-- <a> tag
         sub start_a {  sub start_a {
     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') {
     }   my $a=&Apache::lonxml::get_param('href',$parstack,$safeeval,undef,1);
            return $currentstring;   my $b=&Apache::lonxml::get_param('name',$parstack,$safeeval,undef,1);
  }   if ($a=~/\S/) {
         sub end_a {      $a=~s/([^\\])%/$1\\\%/g;
     my ($target,$token,$tagstack,$stackref) = @_;      $currentstring .= '\ref{URI: '.$a.'}';
             my $currentstring = '';   } elsif ($b=~/\S/) {
             if ($target eq 'web') {      $currentstring .= '\ref{Anchor: '.$b.'}';
        $currentstring .= $token->[2];   } else {
     } elsif ($target eq 'tex') {      $currentstring.='';
                 my  $tempor_var = $stackref->[$#$stackref];  
  if (index($tempor_var,'name') != -1 ) {  
     $tempor_var =~ s/name=([^,]*),/$1/g;  
         } elsif (index($tempor_var,'href') != -1 ) {  
     $tempor_var =~ s/href=([^,]*),/$1/g;  
         $currentstring .= " \\ref{$tempor_var}";  
         }  
             }  
            return $currentstring;  
  }   }
       }
       return $currentstring;
   }
   
   sub end_a {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       }
       return $currentstring;
   }
   
 #-- <li> tag  #-- <li> tag
         sub start_li {  sub start_li {
     my ($target,$token,$tagstack,$stackref) = @_;      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') {
                 my  $tempor_var = $stackref->[$#$stackref];   my  $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,1);
                 if (index($tempor_var,'circle') != -1 ) {   if ($type=~/circle/) {
           $currentstring .= " \\item[o] ";      $currentstring .= ' \item[o] ';
         } elsif (index($tempor_var,'square') != -1 ) {   } elsif ($type=~/square/) {
                $currentstring .= " \\item[$\Box$] ";      $currentstring .= ' \item[$\Box$] ';
         } elsif ($tempor_var ne '') {    } elsif ($type ne '') { 
        $_ = $tempor_var;      $currentstring .= ' \item['.$type.'] ';
                        m/my\s*([^=]*)=/;   } else {
        $currentstring .= " \\item[$1] ";      $currentstring .= ' \item ';
  } else {   }  
     $currentstring .= " \\item ";      } 
         }        return $currentstring;
     }   }
    return $currentstring;  
  }  sub end_li {
         sub end_li {      my ($target,$token) = @_;
     my ($target,$token) = @_;      my $currentstring = '';
             my $currentstring = '';      if ($target eq 'web') {
             if ($target eq 'web') {   $currentstring = $token->[2];     
               $currentstring = $token->[2];           } 
     }       return $currentstring;
    return $currentstring;  }
  }  
 #-- <u> tag  #-- <u> tag
         sub start_u {  sub start_u {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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') {
        &Apache::lonxml::startredirection();   &Apache::lonxml::startredirection();
     }       } 
            return $currentstring;      return $currentstring;
  }  }
         sub end_u {  
     my ($target,$token) = @_;  sub end_u {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
        $currentstring .= $token->[2];      if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring .= $token->[2];
        $currentstring=&Apache::lonxml::endredirection();      } elsif ($target eq 'tex') {
        $currentstring=~s/(\S)(\s+)(\S)/$1}$2\\underline{$3/g;   $currentstring=&Apache::lonxml::endredirection();
        $currentstring=~s/^\s*(\S)/\\underline{$1/;   $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;
        $currentstring=~s/(\S)\s*$/$1}/;   $currentstring=~s/^\s*(\S)/\\underline\{$1/;
             }   $currentstring=~s/(\S)\s*$/$1\}/;
            return $currentstring;      }
  }      return $currentstring;
   }
   
 #-- <ul> tag  #-- <ul> tag
         sub start_ul {  sub start_ul {
     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 = '\begin{itemize}';     my $TeXtype=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
     }    if ($TeXtype eq 'disc') {
    return $currentstring;      $currentstring .= ' \renewcommand{\labelitemi}{$\bullet$}
  }                                  \renewcommand{\labelitemii}{$\bullet$} 
         sub end_ul {                                  \renewcommand{\labelitemiii}{$\bullet$}
     my ($target,$token) = @_;                                  \renewcommand{\labelitemiv}{$\bullet$}';
             my $currentstring = '';   } elsif ($TeXtype eq 'circle') {
             if ($target eq 'web') {      $currentstring .= ' \renewcommand{\labelitemi}{$\circ$}
               $currentstring = $token->[2];                                       \renewcommand{\labelitemii}{$\circ$} 
     } elsif ($target eq 'tex') {                                  \renewcommand{\labelitemiii}{$\circ$}
               $currentstring = '\end{itemize}';                                    \renewcommand{\labelitemiv}{$\circ$}';
     }    } elsif ($TeXtype eq 'square') {
    return $currentstring;      $currentstring .= ' \renewcommand{\labelitemi}{$\diamond$}
                                   \renewcommand{\labelitemii}{$\diamond$} 
                                   \renewcommand{\labelitemiii}{$\diamond$}
                                   \renewcommand{\labelitemiv}{$\diamond$}';
  }   }
    $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} \renewcommand{\labelitemi}{$\bullet$}
                                   \renewcommand{\labelitemii}{$\bullet$} 
                                   \renewcommand{\labelitemiii}{$\bullet$}
                                   \renewcommand{\labelitemiv}{$\bullet$}';  
       } 
       return $currentstring;
   }
   
 #-- <menu> tag  #-- <menu> tag
         sub start_menu {  sub start_menu {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 = " \\begin{itemize} ";     $currentstring = " \\begin{itemize} ";  
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_menu {  
     my ($target,$token) = @_;  sub end_menu {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];           if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring = $token->[2];     
               $currentstring = " \\end{itemize}";        } elsif ($target eq 'tex') {
     }    $currentstring = " \\end{itemize}";  
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <dir> tag  #-- <dir> tag
         sub start_dir {  sub start_dir {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 = " \\begin{itemize} ";     $currentstring = " \\begin{itemize} ";  
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_dir {  
     my ($target,$token) = @_;  sub end_dir {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];           if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring = $token->[2];     
               $currentstring = " \\end{itemize}";        } elsif ($target eq 'tex') {
     }    $currentstring = " \\end{itemize}";  
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <ol> tag  #-- <ol> tag
         sub start_ol {  sub start_ol {
     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 = '\begin{enumerate}';     my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
     }    if ($type eq '1') {
    return $currentstring;      $currentstring .= ' \renewcommand{\labelenumi}{\arabic{enumi}.}
  }                                  \renewcommand{\labelenumii}{\arabic{enumii}.} 
         sub end_ol {                                  \renewcommand{\labelenumiii}{\arabic{enumiii}.}
     my ($target,$token) = @_;                                  \renewcommand{\labelenumiv}{\arabic{enumiv}.}';
             my $currentstring = '';   } elsif ($type eq 'A') {
             if ($target eq 'web') {      $currentstring .= ' \renewcommand{\labelenumi}{\Alph{enumi}.}
               $currentstring = $token->[2];                                       \renewcommand{\labelenumii}{\Alph{enumii}.} 
     } elsif ($target eq 'tex') {                                  \renewcommand{\labelenumiii}{\Alph{enumiii}.}
               $currentstring = '\end{enumerate}';                                    \renewcommand{\labelenumiv}{\Alph{enumiv}.}';
     }    } elsif ($type eq 'a') {
    return $currentstring;      $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}.} ';
  }   }
    $currentstring .= '\begin{enumerate}';  
       } 
       return $currentstring;
   }
   
   sub end_ol {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $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  #-- <dl> tag
         sub start_dl {  sub start_dl {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             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 = '\begin{description}';     $currentstring = '\begin{description}';
     }    @Apache::londefdef::description=();
    return $currentstring;   $Apache::londefdef::DD_redirection=0;
  }   $Apache::londefdef::DT_redirection=0;
         sub end_dl {      } 
     my ($target,$token) = @_;      return $currentstring;
             my $currentstring = '';  }
             if ($target eq 'web') {  
               $currentstring = $token->[2];       sub end_dl {
     } elsif ($target eq 'tex') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
               $currentstring = '\end{description}';        my $currentstring = '';
     }       if ($target eq 'web') {
    return $currentstring;   $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();
  }   }
 #-- <dt> tag   foreach my $element (@Apache::londefdef::description) {
         sub start_dt {      $currentstring.=' '.$element.' ';
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
               $currentstring = '\item[';    
     }   
    return $currentstring;  
  }   }
         sub end_dt {   @Apache::londefdef::description=();
     my ($target,$token) = @_;   $currentstring.='\end{description}';  
             my $currentstring = '';      } 
             if ($target eq 'web') {      return $currentstring;
               $currentstring = $token->[2];      }
             } elsif ($target eq 'tex') {  
               $currentstring = ']';    #-- <dt> tag (end tag optional)
     }   sub start_dt {
    return $currentstring;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring='';
       if ($target eq 'web') {
    $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;
  }   }
    &Apache::lonxml::startredirection();
    $Apache::londefdef::DT_redirection=1;
       } 
       return $currentstring;
   }
   
   sub end_dt {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } elsif ($target eq 'tex') {
    my $data=&item_cleanup;
    push @Apache::londefdef::description,'\item['.$data.']';
    $Apache::londefdef::DT_redirection=0;
       } 
       return $currentstring;
   }
   
   sub item_cleanup {
       my $item=&Apache::lonxml::endredirection();
       $item=~s/\\begin{center}//g;
       $item=~s/\\end{center}//g;
       return $item;
   }
   
 #-- <dd> tag  #-- <dd> tag
         sub start_dd {  sub start_dd {
     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') {
    return $currentstring;   if ($Apache::londefdef::DT_redirection) {
  }      my $data=&item_cleanup;
         sub end_dd {      push @Apache::londefdef::description,'\item['.$data.']';
     my ($target,$token) = @_;      $Apache::londefdef::DT_redirection=0;
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];      
             }   
    return $currentstring;  
  }   }
    $Apache::londefdef::DD_redirection=1;
    &Apache::lonxml::startredirection();
       } 
       return $currentstring;
   }
   
   sub end_dd {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       }  elsif ($target eq 'tex') {
    $Apache::londefdef::description[-1].=&Apache::lonxml::endredirection();
    $Apache::londefdef::DD_redirection=0;
       }
       return $currentstring;
   }
   
 #-- <table> tag  #-- <table> tag
 sub start_table {  sub start_table {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      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 = '';      my $currentstring = '';
     if ($target eq 'web') {      if ($target eq 'web') {
  $currentstring = $token->[4];        $currentstring = $token->[4];     
Line 1339  sub start_table { Line 1763  sub start_table {
  my $aa = {};   my $aa = {};
  push @Apache::londefdef::table, $aa;    push @Apache::londefdef::table, $aa; 
  $Apache::londefdef::table[-1]{'row_number'} = -1;   $Apache::londefdef::table[-1]{'row_number'} = -1;
  $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} ';          #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);    my $border = &Apache::lonxml::get_param('border',$parstack,$safeeval,undef,1); 
  unless (defined $border) { $border = 0; }   unless (defined $border) { $border = 0; }
  if ($border) {    if ($border) { 
Line 1351  sub start_table { Line 1793  sub start_table {
     $Apache::londefdef::table[-1]{'vinc'} = '&';       $Apache::londefdef::table[-1]{'vinc'} = '&'; 
     $Apache::londefdef::table[-1]{'vvinc'} = '';      $Apache::londefdef::table[-1]{'vvinc'} = '';
  }   }
  my $width;   $Apache::londefdef::table[-1]{'output'} = ' \noindent \begin{tabular} ';
  foreach my $key (keys(%{$token->[2]})) {   $currentstring = '\keephidden{NEW TABLE ENTRY}';
     if ($key =~ /^width$/i) {      }
  $width = &Apache::lonxml::get_param($key,$parstack,$safeeval,undef,1);      return $currentstring;
   }
    
   sub end_table {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       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--;
    }
     }      }
  }   }
  if (defined($width)) { $Apache::londefdef::table[-1]{'width'}=$width; }   for (my $jn=0;$jn<=$#length_row_final;$jn++) {
       if ($length_row_final[$jn]==0) {
    $length_row_final[$jn]=0.9*$available_length/$needed;
       }
    }
    #fill the table
    for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {
       for (my $jn=0;$jn<=$#length_row_final;$jn++) {
    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;
    }
       }
       return $currentstring;
   }
   
   #-- <tr> tag (end tag optional)
   sub start_tr {
       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,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);    
    }
    push @{ $Apache::londefdef::table[-1]{'TeXlengthrow'} },$Apache::londefdef::table[-1]{'TeXlength'};
    push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'};
     }      }
     return $currentstring;      return $currentstring;
 }  }
         sub end_table {  
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;  #-- <td> tag (end tag optional)
             my $currentstring = '';  sub start_td {
             if ($target eq 'web') {      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
               $currentstring = $token->[2];           my $currentstring = '';
     } elsif ($target eq 'tex') {      if ($target eq 'web') {
  my $inmemory = '';   $currentstring = $token->[4];     
  my $output = '';      } elsif ($target eq 'tex') {
                 #construct header of the table   $Apache::londefdef::TD_redirection = 1;
  my $header_of_table = '{'.$Apache::londefdef::table[-1]{'vvinc'};   &tag_check('tr','td',$tagstack,$parstack,$parser,$safeeval);
  my $in;      } 
  for ($in=0;$in<=$Apache::londefdef::table[-1]{'counter_columns'};$in++) {      return $currentstring;
     $header_of_table .= $Apache::londefdef::table[-1]{'columns'}[$in].$Apache::londefdef::table[-1]{'vvinc'};  }   
       
   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;
    }
       }
       return '';
   }
    
   sub start_td_tex {
       my ($parstack,$parser,$safeeval) = @_;
       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 '';
   }
   
   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) {
       $elementdata=~s/^\s+(\S.*)/$1/; 
       $elementdata=~s/(.*\S)\s+$/$1/;
       $elementdata=~s/(\s)+/$1/;
       my $lengthnewdata=1.8*length($elementdata);
       if ($lengthnewdata>$current_length) {$current_length=$lengthnewdata;}
  }   }
  $header_of_table .= '}';      } else {
                 #fill the table   $current_length=1.8*length($data);
  for ($in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) {      }
     $output .=  $Apache::londefdef::table[-1]{'rowdata'}[$in];      $Apache::londefdef::table[-1]{'length'} .= $current_length.',';
     chop $output;      $Apache::londefdef::table[-1]{'TeXlength'} .= '0,';
     $output .= ' \\\\ ';   }        
       }
    for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {         
       $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
    }
       @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
       return'';
   }
   
   sub end_td {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $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,';
       }        
    }
    for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {                                
       $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
    }
    $data='\textbf{'.$data.'}';
    @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{TOBECHANGEDONNUMBER}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};
       }
       return $currentstring;
   }
   #-- <img> tag
   sub start_img {
       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 = '';
       my $width_param = '';
       my $height_param = '';
       my $scaling = .3;
       if ($target eq 'web') {
    if ($ENV{'browser.imagesuppress'} 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.='[IMAGE: '.$alttag.']';
    }
       } elsif ($target eq 'tex') {
    $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
    &image_replication($src);
    #if original gif/jpg/png file exist do following:
    if (-e $src) {          
       #defines the default size of image
       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;
       #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;
  }   }
                 #define the length of the table cells      } elsif ($TeXheight ne '') {
  my @lengthforoutput = split(/,/,$Apache::londefdef::table[-1]{'lengthrow'}[0]);   $width_param = $TeXheight/$height_param*$width_param;
  my $how_many_columns = $#lengthforoutput + 1; #total number of columns in the table       } elsif ($width ne '') {
  my $filled_columns = 0; #number of columns with information about width   $width_param = $width*$scaling;      
  my $available_space = ' ';      }
  foreach my $tempo_length (@{ $Apache::londefdef::table[-1]{'lengthrow'} }) {      if ($width_param > $ENV{'form.textwidth'}) {$width_param =0.95*$ENV{'form.textwidth'}}
     my @length = split(/,/,$tempo_length);      my $file;
     for (my $ico=0;$ico<=$#lengthforoutput;$ico++) {      my $path;
  $lengthforoutput[$ico] =~ m/(\d*\.?\d*)\s*(\w+)/;      if ($src =~ m!(.*)/([^/]*)$!) {
  my $old_value = $1;   $file = $2; 
  my $old_unit = $2;    $path = $1.'/'; 
  if ($old_unit eq 'cm') {       } 
     $old_value = $old_value * 10;      my $newsrc = $src;
  } elsif ($old_unit eq 'in') {       $newsrc =~ s/\.(gif|jpg|png)$/.eps/i;
     $old_value = $old_value * 25.4;      $file=~s/\.(gif|jpg|png)$/.eps/i;
  } elsif ($old_unit eq 'pt') {      #where can we find the picture?
     $old_value = $old_value * 25.4/72.27;      if (-e $newsrc) {
  } elsif ($old_unit eq 'pc') {   #eps counterpart for image exist 
     $old_value = $old_value * 25.4/6.022;   if ($path) {
  }      $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
  $old_unit = 'mm';  
   $length[$ico] =~ m/(\d*\.?\d*)\s*(\w+)/;  
  my $new_value = $1;  
  my $new_unit = $2;  
  if ($new_unit eq 'cm') {   
     $new_value = $new_value * 10;  
  } elsif ($old_unit eq 'in') {   
     $new_value = $new_value * 25.4;  
  } elsif ($old_unit eq 'pt') {  
     $new_value = $new_value * 25.4/72.27;  
  } elsif ($old_unit eq 'pc') {  
     $new_value = $new_value * 25.4/6.022;  
  }  
  $new_unit = 'mm';  
  if ($old_value < $new_value) {  
     $lengthforoutput[$ico] = $new_value.' mm';  
  } else {  
     $lengthforoutput[$ico] = $old_value.' mm';  
  }    
     }  
  }   }
  for (my $ico=0;$ico<=$#lengthforoutput;$ico++) {      } else {
     if (not $lengthforoutput[$ico]=~m/^\s*0\s*\w*\s*$/) {   #there is no eps counterpart for image - check for ps one
  $filled_columns++;   $newsrc =~ s/\.eps$/\.ps/;
  $available_space = $available_space.' - '.$lengthforoutput[$ico];   if (-e $newsrc) {
       #ps counterpart for image exist 
       $file =~ s/\.eps$/\.ps/;
       if ($path) {
    $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
     }      }
  }  
  my $temp_file;  
  my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.tbl";  
  if (-e $filename) {  
     $temp_file = Apache::File->new($filename);   
     my @tbl_file_content = <$temp_file>;  
     my ($one,$two,$three) = split(/,/,$tbl_file_content[0]);  
         $how_many_columns+=$one-1;  
         $filled_columns+=$two;  
     if($three=~/\S/) {$available_space = $available_space.' - '.$three;}  
  } else {   } else {
       #there aren't eps or ps - so create eps 
       my $temp_file;
       my $filename = "/home/httpd/prtspool/$ENV{'user.name'}_$ENV{'user.domain'}_printout.dat";
     $temp_file = Apache::File->new('>>'.$filename);       $temp_file = Apache::File->new('>>'.$filename); 
  }      print $temp_file "$src\n";
  print $temp_file "$how_many_columns,$filled_columns,$available_space\n";      $currentstring .= '\vskip 1 mm \graphicspath{{/home/httpd/prtspool/}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';
  $output =~ s/\\parbox{TOBECHANGEDONNUMBER}{}/\\parbox{1 mm}{}/g;  
  $output =~ s/\\parbox{TOBECHANGEDONNUMBER}/\\parbox{\$SpacePerColumn}/g;  
  my @tagar = @$tagstack;  
  my $signature = 1;  
  for (my $ico=0;$ico<$#tagar;$ico++) {  
      if ($tagar[$ico] eq 'table') { $signature = 0; }  
  }  
  if ($signature) {  
     my $NumberEmptyLength = $how_many_columns - $filled_columns;  
     my $SpacePerColumn = '(\textwidth '.$available_space.')/'.$NumberEmptyLength;  
     my $shorthand = ($filled_columns+1)*4;  
     $output =~ s/\$SpacePerColumn/$SpacePerColumn - $shorthand mm/g;  
  }  
  if ($how_many_columns==1) {  #start of block with width correction for one column table  
   $output=~s/^\s*\\parbox{([^}]*)}/\\parbox{\\textwidth - 1 cm}/;  
  }                            #end of block with width correction for one column table  
  $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 {  
     $currentstring = $Apache::londefdef::table[-1]{'output'};  
     $currentstring =~ s/\\\\\s+\\\\/\\\\/g;   
     pop @Apache::londefdef::table;  
     if (-e $filename) {  
  unlink $filename;  
     }  
  }   }
     }      }
    return $currentstring;   } else {
  }      #original image file doesn't exist so check the alt attribute
 #-- <tr> tag      my $alt = 
         sub start_tr {   &Apache::lonxml::get_param('alt',$parstack,$safeeval,undef,1);
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      unless ($alt) {
             my $currentstring = '';   $alt=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src);
             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,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]{'length'} = '';   
     }   
    return $currentstring;  
  }          
         sub end_tr {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
  $currentstring = $token->[2];       
     } elsif ($target eq 'tex') {  
  push @{ $Apache::londefdef::table[-1]{'lengthrow'} },$Apache::londefdef::table[-1]{'length'};  
   
     }  
    return $currentstring;  
  }  
 #-- <td> tag  
         sub start_td {  
     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_td {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             my $tempolen = '';  
             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|in|pc|pt))/) {                   
                     $Apache::londefdef::table[-1]{'length'} .= $1.',';  
     $tempolen = $1;           
  } else {  
     if (length($data)<5) {  
  $Apache::londefdef::table[-1]{'length'} .= '0 mm,';  
  $tempolen = '6 mm';  
     } else {  
  $Apache::londefdef::table[-1]{'length'} .= '0 mm,';  
  $tempolen = 'TOBECHANGEDONNUMBER';  
     }  
                 }                                          
  @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$tempolen.'}{'.$data.'} '.$Apache::londefdef::table[-1]{'vinc'};  
     }      }
    return $currentstring;  
  }      if ($alt) {
 #-- <th> tag   $currentstring .= ' '.$alt.' ';
         sub start_th {      } else {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;   #<allow> tag will care about replication 
             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) = @_;  
             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))/) {                   
                     $Apache::londefdef::table[-1]{'length'} .= $1.',';               
  } else {  
     $Apache::londefdef::table[-1]{'length'} .= '0 mm,';   
                 }                                                             
  @{ $Apache::londefdef::table[-1]{'rowdata'} }[$current_row] .= '\parbox{'.$1.'}{\textbf{'.$data.'}} '.$Apache::londefdef::table[-1]{'vinc'};  
     }      }
    return $currentstring;  
  }   }
 #-- <img> tag      }
         sub start_img {      return $currentstring;
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;  }
     my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,  
  undef,1);  sub end_img {
             $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
     my $width_param = '';      if ($target eq 'web') {
     my $height_param = '';   $currentstring = $token->[2];
     my $scaling = .3;      } elsif ($target eq 'tex') {
    $currentstring = '';
     if ($target eq 'web') {      }
               $currentstring = $token->[4];      return $currentstring;
     } elsif ($target eq 'tex') {  }
       &image_replication($src);  
       $src=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);  #-- <applet> tag
               #if original gif/jpg/png file exist do following:  sub start_applet {
               if (-e $src) {                my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
                   #defines the default size of image      
   my $image = Image::Magick->new;      my $code=&Apache::lonxml::get_param('code',$parstack,$safeeval,undef,1);
   my $current_figure = $image->Read($src);      $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$code;
   $width_param = $image->Get('width') * $scaling;;      
   $height_param = $image->Get('height') * $scaling;;      my $archive=&Apache::lonxml::get_param('archive',$parstack,$safeeval,
   undef $image;     undef,1);
   #do we have any specified size of the picture?      $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$archive;
   my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval);      
   my $TeXheight = &Apache::lonxml::get_param('TeXheight',$parstack,$safeeval);      my $currentstring = '';
   my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval,      if ($target eq 'web') {
                                                          undef,1);   if ($ENV{'browser.appletsuppress'} ne 'on') {
   if ($TeXwidth ne '') {        $currentstring = $token->[4];
       if ($TeXwidth=~/(\d+)\s*\%/) {   } else {
   $width_param = $1*$ENV{'form.textwidth'}/100;      my $alttag= &Apache::lonxml::get_param('alt',$parstack,
       } else {      $safeeval,undef,1);
   $width_param = $TeXwidth;      unless ($alttag) {
       }   $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],
   } elsif ($TeXheight ne '') {   $code);
   $width_param = $TeXheight/$height_param*$width_param;  
   } elsif ($width ne '') {  
       $width_param = $width*$scaling;        
   }  
   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.'} ';  
       }  
   } else {  
                       #there is no eps counterpart for image - check for ps one  
       $newsrc =~ s/\.eps$/\.ps/;  
       if (-e $newsrc) {  
   #ps counterpart for image exist   
   $file =~ s/\.eps$/\.ps/;  
   if ($path) {  
       $currentstring .= '\vskip 1 mm \noindent\graphicspath{{'.$path.'}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';  
   }  
       } else {  
   #there aren't eps or ps - so create eps   
   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 .= '\vskip 1 mm \graphicspath{{/home/httpd/prtspool/}}\includegraphics[width='.$width_param.' mm]{'.$file.'} ';  
       }  
   }  
       } else {  
   #original image file doesn't exist so check the alt attribute  
   my $alt = &Apache::lonxml::get_param('alt',$parstack,$safeeval,undef,1);  
                   if ($alt) {  
       $currentstring .= ' '.$alt.' ';  
   } else {  
                      #<allow> tag will care about replication   
   }  
       }  
     }  
     return $currentstring;  
  }  
         sub end_img {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];  
     } elsif ($target eq 'tex') {  
               $currentstring = '';  
     }      }
    return $currentstring;      $currentstring='[APPLET: '.$alttag.']';
  }   }
 #-- <applet> tag      } elsif ($target eq 'tex') {
    my $alttag= &Apache::lonxml::get_param('alt',$parstack,
         sub start_applet {         $safeeval,undef,1);
     my ($target,$token) = @_;   unless ($alttag) {
               $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=         my $code=&Apache::lonxml::get_param('code',$parstack,$safeeval,
                                         $token->[2]->{'code'};   undef,1);
               $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=      $alttag=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],
                                         $token->[2]->{'archive'};       $code);
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];  
     } elsif ($target eq 'tex') {  
               $currentstring = " \\begin{figure} ";  
     }   
    return $currentstring;  
  }   }
    $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
   
 sub start_embed {      sub start_embed {    
     my ($target,$token) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=      my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
  $token->[2]->{'src'};      $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=$src;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web') {      if ($target eq 'web') {
  $currentstring = $token->[4];   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') {      } elsif ($target eq 'tex') {
  $currentstring = " \\begin{figure} ";    
     }       } 
     return $currentstring;      return $currentstring;
 }  }
         sub end_embed {  
     my ($target,$token) = @_;  sub end_embed {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];           if ($target eq 'web') {
     } elsif ($target eq 'tex') {   $currentstring = $token->[2];     
               $currentstring = " \\end{figure}";        } elsif ($target eq 'tex') {  
     }       } 
    return $currentstring;      return $currentstring;
  }  }
   
 #-- <param> tag  #-- <param> tag
   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') {
       } 
       return $currentstring;
   }
   
   sub end_param {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];     
       } elsif ($target eq 'tex') {
       } 
       return $currentstring;
   }
   
         sub start_param {  
     my ($target,$token) = @_;  
     if ($token->[2]->{'name'} eq 'cabbase') {  
                       $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=  
      $token->[2]->{'value'};  
             }     
             $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=     
                                         $token->[2]->{'src'};  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[4];       
     } elsif ($target eq 'tex') {  
               $currentstring = " \\begin{figure} ";    
     }   
    return $currentstring;  
  }  
         sub end_param {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
               $currentstring = $token->[2];       
     } elsif ($target eq 'tex') {  
               $currentstring = " \\end{figure}";    
     }   
    return $currentstring;  
  }  
 #-- <allow> tag  #-- <allow> tag
 sub start_allow {  sub start_allow {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     $Apache::lonxml::extlinks[$#Apache::lonxml::extlinks+1]=  
  $token->[2]->{'src'};  
     my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);      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);      &image_replication($src);
     my $result;      my $result;
     if ($target eq 'edit') {      if ($target eq 'edit') {
Line 1782  sub end_allow { Line 2318  sub end_allow {
     if ( $target eq 'edit') { return (&Apache::edit::end_table()); }      if ( $target eq 'edit') { return (&Apache::edit::end_table()); }
     return '';      return '';
 }  }
   
 #-- Frames  #-- Frames
  sub start_frameset {  sub start_frameset {
   my ($target,$token) = @_;      my ($target,$token) = @_;
   my $currentstring = '';      my $currentstring = '';
   if ($target eq 'web') {       if ($target eq 'web') { 
     if (!$Apache::lonxml::registered) {   if (!$Apache::lonxml::registered) {
       $currentstring.='<head>'.      $currentstring.='<head>'.
   &Apache::lonxml::registerurl(undef,$target).'</head>';   &Apache::lonmenu::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 $onLoad='';
     my ($target,$token) = @_;   foreach my $key (keys(%{$token->[2]})) {
             my $currentstring = '';      if ($key =~ /^onload$/i) {
             if ($target eq 'web') {   $onLoad.=$token->[2]->{$key}.';';
        $currentstring .= $token->[2];   delete($token->[2]->{$key});
     } elsif ($target eq 'tex') {  
  $currentstring .= '\end{verbatim}';  
     }      }
            return $currentstring;  
  }   }
 #-- <insert>   $token->[2]->{'onload'}=&Apache::lonmenu::loadevents().';'.$onLoad;
  sub start_insert {   my $onUnload='';
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;   foreach my $key (keys(%{$token->[2]})) {
             my $currentstring = '';      if ($key =~ /^onunload$/i) {
             if ($target eq 'web') {   $onUnload.=$token->[2]->{$key}.';';
  my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval,undef,1);   delete($token->[2]->{$key});
        $currentstring .= '<b>'.$display.'</b>';;  
     }  
            return $currentstring;  
  }  
         sub end_insert {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= '';  
     }      }
            return $currentstring;  
  }   }
 #-- <externallink>   $token->[2]->{'onunload'}=&Apache::lonmenu::unloadevents().
  sub start_externallink {      ';'.$onUnload;
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;  
             my $currentstring = '';   $currentstring .= '<'.$token->[1];
             if ($target eq 'web') {   foreach (keys %{$token->[2]}) {
  my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval,undef,1);      $currentstring.=' '.$_.'="'.$token->[2]->{$_}.'"';
        $currentstring .= '<b>'.$display.'</b>';;  
     }  
            return $currentstring;  
  }  
         sub end_externallink {  
     my ($target,$token) = @_;  
             my $currentstring = '';  
             if ($target eq 'web') {  
        $currentstring .= '';  
     }  
            return $currentstring;  
  }   }
    $currentstring.='>';
       }
       return $currentstring;
   }
   
   sub end_frameset {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];
       }
       return $currentstring;
   }
   
   #-- <xmp>
   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;
   }
   
   sub end_xmp {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= $token->[2];
       } elsif ($target eq 'tex') {
    $currentstring .= '\end{verbatim}';
       }
       return $currentstring;
   }
   
   #-- <pre>
   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;
   }
   
   #-- <insert>
   sub start_insert {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval,undef,1);
    $currentstring .= '<b>'.$display.'</b>';;
       }
       return $currentstring;
   }
   
   sub end_insert {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $currentstring .= '';
       }
       return $currentstring;
   }
   
   #-- <externallink>
   sub start_externallink {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    my $display = &Apache::lonxml::get_param('display',$parstack,$safeeval,undef,1);
    $currentstring .= '<b>'.$display.'</b>';;
       }
       return $currentstring;
   }
   
   sub end_externallink {
       my ($target,$token) = @_;
       my $currentstring = '';
       if ($target eq 'web') {
    $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,undef,1);   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;      }
  }      return $currentstring;
   }
   
 #-- <abbr> tag  #-- <abbr> tag
       sub start_abbr {  sub start_abbr {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_abbr {  
     my ($target,$token) = @_;  sub end_abbr {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <acronym> tag  #-- <acronym> tag
       sub start_acronym {  sub start_acronym {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_acronym {  
     my ($target,$token) = @_;  sub end_acronym {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <area> tag  #-- <area> tag
       sub start_area {  sub start_area {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_area {  
     my ($target,$token) = @_;  sub end_area {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <base> tag  #-- <base> tag
       sub start_base {  sub start_base {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       }
    return $currentstring;      return $currentstring;
  }  }
         sub end_base {  
     my ($target,$token) = @_;  sub end_base {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <bdo> tag  #-- <bdo> tag
       sub start_bdo {  sub start_bdo {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_bdo {  
     my ($target,$token) = @_;  sub end_bdo {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <bgsound> tag  #-- <bgsound> tag
       sub start_bgsound {  sub start_bgsound {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_bgsound {  
     my ($target,$token) = @_;  sub end_bgsound {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <blink> tag  #-- <blink> tag
       sub start_blink {  sub start_blink {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_blink {  
     my ($target,$token) = @_;  sub end_blink {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <blockquote> tag  #-- <blockquote> tag
       sub start_blockquote {  sub start_blockquote {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_blockquote {  
     my ($target,$token) = @_;  sub end_blockquote {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <button> tag  #-- <button> tag
       sub start_button {  sub start_button {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_button {  
     my ($target,$token) = @_;  sub end_button {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <caption> tag  #-- <caption> tag
       sub start_caption {  sub start_caption {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_caption {  
     my ($target,$token) = @_;  sub end_caption {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <col> tag  #-- <col> tag
       sub start_col {  sub start_col {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_col {  
     my ($target,$token) = @_;  sub end_col {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <colgroup> tag  #-- <colgroup> tag
       sub start_colgroup {  sub start_colgroup {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_colgroup {  
     my ($target,$token) = @_;  sub end_colgroup {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <del> tag  #-- <del> tag
       sub start_del {  sub start_del {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_del {  
     my ($target,$token) = @_;  sub end_del {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <fieldset> tag  #-- <fieldset> tag
       sub start_fieldset {  sub start_fieldset {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_fieldset {  
     my ($target,$token) = @_;  sub end_fieldset {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <frame> tag  #-- <frame> tag
       sub start_frame {  sub start_frame {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_frame {  
     my ($target,$token) = @_;  sub end_frame {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <iframe> tag  #-- <iframe> tag
       sub start_iframe {  sub start_iframe {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_iframe {  
     my ($target,$token) = @_;  sub end_iframe {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <ins> tag  #-- <ins> tag
       sub start_ins {  sub start_ins {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_ins {  
     my ($target,$token) = @_;  sub end_ins {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <isindex> tag  #-- <isindex> tag
       sub start_isindex {  sub start_isindex {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_isindex {  
     my ($target,$token) = @_;  sub end_isindex {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <keygen> tag  #-- <keygen> tag
       sub start_keygen {  sub start_keygen {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_keygen {  
     my ($target,$token) = @_;  sub end_keygen {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <label> tag  #-- <label> tag
       sub start_label {  sub start_label {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_label {  
     my ($target,$token) = @_;  sub end_label {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <layer> tag  #-- <layer> tag
       sub start_layer {  sub start_layer {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_layer {  
     my ($target,$token) = @_;  sub end_layer {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <legend> tag  #-- <legend> tag
       sub start_legend {  sub start_legend {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_legend {  
     my ($target,$token) = @_;  sub end_legend {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <link> tag  #-- <link> tag
       sub start_link {  sub start_link {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_link {  
     my ($target,$token) = @_;  sub end_link {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <marquee> tag  #-- <marquee> tag
       sub start_marquee {  sub start_marquee {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_marquee {  
     my ($target,$token) = @_;  sub end_marquee {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <malticol> tag  #-- <malticol> tag
       sub start_malticol {  sub start_malticol {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_malticol {  
     my ($target,$token) = @_;  sub end_malticol {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <nobr> tag  #-- <nobr> tag
       sub start_nobr {  sub start_nobr {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_nobr {  
     my ($target,$token) = @_;  sub end_nobr {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <noembed> tag  #-- <noembed> tag
       sub start_noembed {  sub start_noembed {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_noembed {  
     my ($target,$token) = @_;  sub end_noembed {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <noframes> tag  #-- <noframes> tag
       sub start_noframes {  sub start_noframes {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_noframes {  
     my ($target,$token) = @_;  sub end_noframes {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <nolayer> tag  #-- <nolayer> tag
       sub start_nolayer {  sub start_nolayer {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_nolayer {  
     my ($target,$token) = @_;  sub end_nolayer {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <noscript> tag  #-- <noscript> tag
       sub start_noscript {  sub start_noscript {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_noscript {  
     my ($target,$token) = @_;  sub end_noscript {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <object> tag  #-- <object> tag
       sub start_object {  sub start_object {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_object {  
     my ($target,$token) = @_;  sub end_object {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <optgroup> tag  #-- <optgroup> tag
       sub start_optgroup {  sub start_optgroup {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_optgroup {  
     my ($target,$token) = @_;  sub end_optgroup {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <samp> tag  #-- <samp> tag
       sub start_samp {  sub start_samp {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_samp {  
     my ($target,$token) = @_;  sub end_samp {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <server> tag  #-- <server> tag
       sub start_server {  sub start_server {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_server {  
     my ($target,$token) = @_;  sub end_server {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <spacer> tag  #-- <spacer> tag
       sub start_spacer {  sub start_spacer {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_spacer {  
     my ($target,$token) = @_;  sub end_spacer {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <span> tag  #-- <span> tag
       sub start_span {  sub start_span {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_span {  
     my ($target,$token) = @_;  sub end_span {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
   }
   
 #-- <tbody> tag  #-- <tbody> tag
       sub start_tbody {  sub start_tbody {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } 
    return $currentstring;      return $currentstring;
  }  }
         sub end_tbody {  
     my ($target,$token) = @_;  sub end_tbody {
             my $currentstring = '';      my ($target,$token) = @_;
             if ($target eq 'web') {      my $currentstring = '';
               $currentstring = $token->[2];          if ($target eq 'web') {
             }    $currentstring = $token->[2];    
    return $currentstring;      } 
  }      return $currentstring;
 #-- <tfoot> tag  }
       sub start_tfoot {  
     my ($target,$token) = @_;  #-- <tfoot> tag (end tag optional)
             my $currentstring = '';  sub start_tfoot {
             if ($target eq 'web') {      my ($target,$token) = @_;
               $currentstring = $token->[4];           my $currentstring = '';
     }       if ($target eq 'web') {
    return $currentstring;   $currentstring = $token->[4];     
  }      } 
         sub end_tfoot {      return $currentstring;
     my ($target,$token) = @_;  }
             my $currentstring = '';  
             if ($target eq 'web') {  sub end_tfoot {
               $currentstring = $token->[2];          my ($target,$token) = @_;
             }       my $currentstring = '';
    return $currentstring;      if ($target eq 'web') {
  }   $currentstring = $token->[2];    
 #-- <thead> tag      } 
       sub start_thead {      return $currentstring;
     my ($target,$token) = @_;  }
             my $currentstring = '';  
             if ($target eq 'web') {  #-- <thead> tag (end tag optional)
               $currentstring = $token->[4];       sub start_thead {
     }       my ($target,$token) = @_;
    return $currentstring;      my $currentstring = '';
  }      if ($target eq 'web') {
         sub end_thead {   $currentstring = $token->[4];     
     my ($target,$token) = @_;      } 
             my $currentstring = '';      return $currentstring;
             if ($target eq 'web') {  }
               $currentstring = $token->[2];      
             }   sub end_thead {
    return $currentstring;      my ($target,$token) = @_;
  }      my $currentstring = '';
       if ($target eq 'web') {
    $currentstring = $token->[2];    
       } 
       return $currentstring;
   }
   
 #-- <var> tag  #-- <var> tag
       sub start_var {  sub start_var {
     my ($target,$token) = @_;      my ($target,$token) = @_;
             my $currentstring = '';      my $currentstring = '';
             if ($target eq 'web') {      if ($target eq 'web') {
               $currentstring = $token->[4];        $currentstring = $token->[4];     
     }       } elsif ($target eq 'tex') {
    return $currentstring;   $currentstring = '\textit{'; 
  }      }
         sub end_var {      return $currentstring;
     my ($target,$token) = @_;  }
             my $currentstring = '';  
             if ($target eq 'web') {  sub end_var {
               $currentstring = $token->[2];          my ($target,$token) = @_;
             }       my $currentstring = '';
    return $currentstring;      if ($target eq 'web') {
  }   $currentstring = $token->[2];
 #-- <wbr> tag      } elsif ($target eq 'tex') {
       sub start_wbr {   $currentstring = '}'; 
     my ($target,$token) = @_;      } 
             my $currentstring = '';      return $currentstring;
             if ($target eq 'web') {  }
               $currentstring = $token->[4];       
     }   #-- <wbr> tag (end tag forbidden)
    return $currentstring;  sub start_wbr {
  }      my ($target,$token) = @_;
         sub end_wbr {      my $currentstring = '';
     my ($target,$token) = @_;      if ($target eq 'web') {
             my $currentstring = '';   $currentstring = $token->[4];     
             if ($target eq 'web') {      } 
               $currentstring = $token->[2];          return $currentstring;
             }   }
    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 {  sub image_replication {
     my $src = shift;      my $src = shift;
     if (not -e '/home/httpd/html'.$src) {      if (not -e $src) {
  #replicates image itself   #replicates image itself
  &Apache::lonnet::repcopy('/home/httpd/html'.$src);   &Apache::lonnet::repcopy($src);
  #replicates eps or ps    #replicates eps or ps 
  my $newsrc = $src;   my $newsrc = $src;
  $newsrc =~ s/\.(gif|jpg|png)$/.eps/;   $newsrc =~ s/\.(gif|jpg|jpeg|png)$/.eps/i;
  if (not-e $newsrc && &Apache::lonnet::repcopy('/home/httpd/html'.$newsrc) ne 'OK') {   if (not -e $newsrc) {
     $newsrc =~ s/\.eps$/\.ps/;      if (&Apache::lonnet::repcopy($newsrc) ne 'OK') {
     &Apache::lonnet::repcopy('/home/httpd/html'.$newsrc);   $newsrc =~ s/\.eps$/\.ps/;
    &Apache::lonnet::repcopy($newsrc);
       }
  }   }
     }      }
     return '';      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';
   }
   
 1;  1;
 __END__  __END__

Removed from v.1.112  
changed lines
  Added in v.1.178


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.