Diff for /loncom/xml/londefdef.pm between versions 1.462 and 1.470

version 1.462, 2016/08/13 19:39:40 version 1.470, 2023/03/25 18:38:27
Line 1 Line 1
 # The LearningOnline Network with CAPA  # The LearningOnline Network with CAPA
 # Tags Default Definition Module   # Tags Default Definition Module
 #  #
 # $Id$  # $Id$
 #   #
 #  #
 # Copyright Michigan State University Board of Trustees  # Copyright Michigan State University Board of Trustees
 #  #
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
 # distributed are hereby licensed only for use in the context  # distributed are hereby licensed only for use in the context
 # of a program or computational system for which the Licensee is the   # of a program or computational system for which the Licensee is the
 # primary author or distributor, and which performs substantial   # primary author or distributor, and which performs substantial
 # additional tasks beyond the translation of (La)TeX into HTML.  # additional tasks beyond the translation of (La)TeX into HTML.
 # The C source of the Code may not be distributed by the Licensee  # The C source of the Code may not be distributed by the Licensee
 # to any other parties under any circumstances.  # to any other parties under any circumstances.
 #  #
   
 package Apache::londefdef;   package Apache::londefdef;
   
 use Apache::lonnet;  use Apache::lonnet;
 use strict;  use strict;
Line 98  sub start_m { Line 98  sub start_m {
             # On top of that, MathJax will render math without $, but              # On top of that, MathJax will render math without $, but
             # it will fail with tth. This is worth a warning.              # it will fail with tth. This is worth a warning.
             # (even though some people might just use latex for printing)              # (even though some people might just use latex for printing)
             &Apache::lonxml::warning(&mt("Missing \$ in <m>."));              &Apache::lonxml::warning(&mt('Missing $ in [_1].','<m>'));
           } elsif (($env{'browser.type'} eq 'safari') && ($env{'form.editxmltext'}) &&
                    (($env{'form.problemmode'} eq 'view') || ($env{'form.problemmode'} eq 'discard'))) {
               my $delimiter;
               if ($inside =~ /\$$/) {
                   $delimiter = '$';
               } elsif ($inside =~ /\\([)\]])$/) {
                   $delimiter = $1;
               }
               if ($delimiter) {
                   &Apache::lonxml::warning(&mt('Insert a space between [_1] and [_2].',
                                                $delimiter,'</m>'));
               }
         }          }
  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') {
Line 182  sub start_html { Line 194  sub start_html {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) {      if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) {
  # start_body() takes care of emitting the <html>    # start_body() takes care of emitting the <html>
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
   
  $currentstring .= &latex_header();   $currentstring .= &latex_header();
Line 205  sub start_head { Line 217  sub start_head {
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  &Apache::lonxml::startredirection();   &Apache::lonxml::startredirection();
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 218  sub end_head { Line 230  sub end_head {
  if ($Apache::lonxml::redirection) {   if ($Apache::lonxml::redirection) {
     $Apache::londefdef::head = &Apache::lonxml::endredirection();      $Apache::londefdef::head = &Apache::lonxml::endredirection();
  }   }
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 227  sub start_map { Line 239  sub start_map {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 236  sub end_map { Line 248  sub end_map {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 246  sub start_select { Line 258  sub start_select {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }  elsif ($target eq 'tex') {      }  elsif ($target eq 'tex') {
  $Apache::londefdef::select=0;   $Apache::londefdef::select=0;
     }      }
Line 257  sub end_select { Line 269  sub end_select {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 267  sub start_option { Line 279  sub start_option {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $Apache::londefdef::select++;   $Apache::londefdef::select++;
  if ($Apache::londefdef::select == 1) {   if ($Apache::londefdef::select == 1) {
Line 283  sub end_option { Line 295  sub end_option {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }  elsif ($target eq 'tex') {      }  elsif ($target eq 'tex') {
  $currentstring='}';   $currentstring='}';
     }      }
Line 295  sub start_input { Line 307  sub start_input {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 304  sub end_input { Line 316  sub end_input {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 314  sub start_textarea { Line 326  sub start_textarea {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 323  sub end_textarea { Line 335  sub end_textarea {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 333  sub start_form { Line 345  sub start_form {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 342  sub end_form { Line 354  sub end_form {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 352  sub start_title { Line 364  sub start_title {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $Apache::londefdef::title =    $Apache::londefdef::title =
     &Apache::lonxml::get_all_text('/title',$parser,$style);      &Apache::lonxml::get_all_text('/title',$parser,$style);
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\keephidden{Title of the document:  '    $currentstring .= '\keephidden{Title of the document:  ';
     }      }
     if ($target eq 'meta') {      if ($target eq 'meta') {
  $currentstring='<title>';   $currentstring='<title>';
Line 371  sub end_title { Line 383  sub end_title {
  # start_title takes care of swallowing the title   # start_title takes care of swallowing the title
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '}';   $currentstring .= '}';
     }        }
     if ($target eq 'meta') {      if ($target eq 'meta') {
  &end_output($target);   &end_output($target);
  $currentstring='</title>';   $currentstring='</title>';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 543  sub end_accessrule { Line 555  sub end_accessrule {
  if ($args ne '') {   if ($args ne '') {
     $currentstring = $token->[4];      $currentstring = $token->[4];
  }   }
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 552  sub generate_css_links { Line 564  sub generate_css_links {
     my $css_href = &Apache::lonnet::EXT('resource.0.cssfile');      my $css_href = &Apache::lonnet::EXT('resource.0.cssfile');
     if ($css_href =~ /\S/) {      if ($css_href =~ /\S/) {
  &Apache::lonxml::extlink($css_href);   &Apache::lonxml::extlink($css_href);
  $links .=    $links .=
     '<link rel="stylesheet" type="text/css" href="'.$css_href.'" />';      '<link rel="stylesheet" type="text/css" href="'.$css_href.'" />';
     }      }
     return $links;      return $links;
Line 587  sub start_body { Line 599  sub start_body {
             'text'  => 'HTML Editor',              'text'  => 'HTML Editor',
             'href'  => '',              'href'  => '',
         });          });
         # breadcrumbs (and tools) will be created           # breadcrumbs (and tools) will be created
         # in start_page->bodytag->innerregister          # in start_page->bodytag->innerregister
     } else {      } else {
         # FIXME Where are we?          # FIXME Where are we?
Line 601  sub start_body { Line 613  sub start_body {
                 $args->{'use_absolute'} = $env{'request.use_absolute'};                  $args->{'use_absolute'} = $env{'request.use_absolute'};
             }              }
         }          }
  $currentstring =    $currentstring =
     &Apache::loncommon::start_page($Apache::londefdef::title,      &Apache::loncommon::start_page($Apache::londefdef::title,
    $Apache::londefdef::head     $Apache::londefdef::head
       .$extra_head,$args);        .$extra_head,$args);
Line 700  sub end_body { Line 712  sub end_body {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= &Apache::loncommon::end_page({'discussion' => 1});   $currentstring .= &Apache::loncommon::end_page({'discussion' => 1});
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent \end{document}';     $currentstring .= '\strut\newline\noindent\makebox[\textwidth/$number_of_columns][b]{\hrulefill}\newline\noindent \end{document}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
 # \begin{center} causes a new paragprah spacing that looks odd inside   # \begin{center} causes a new paragprah spacing that looks odd inside
 # of a table cell.  Same at the end of a \center but with a slightly  # of a table cell.  Same at the end of a \center but with a slightly
 # larger space .. hence center_correction and center_end_correction.  # larger space .. hence center_correction and center_end_correction.
 #  #
 sub center_correction { return '\vspace*{-6 mm}'; }   sub center_correction { return '\vspace*{-6 mm}'; }
 sub center_end_correction { return '\vspace*{-7 mm}'; }  sub center_end_correction { return '\vspace*{-7 mm}'; }
   
 #-- <center> tag (end tag required)  #-- <center> tag (end tag required)
Line 717  sub start_center { Line 729  sub start_center {
     my ($target,$token,$tagstack) = @_;      my ($target,$token,$tagstack) = @_;
     my $currentstring = &end_p(); # Close off any prior para.      my $currentstring = &end_p(); # Close off any prior para.
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];        $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  if (&is_inside_of($tagstack, "table")) {   if (&is_inside_of($tagstack, "table")) {
     $currentstring .= &center_correction();      $currentstring .= &center_correction();
  }   }
  $currentstring .= '\begin{center}';     $currentstring .= '\begin{center}';
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 731  sub end_center { Line 743  sub end_center {
     my ($target,$token,$tagstack) = @_;      my ($target,$token,$tagstack) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = '\end{center}';     $currentstring = '\end{center}';
  if (&is_inside_of($tagstack, "table")) {   if (&is_inside_of($tagstack, "table")) {
     $currentstring .= &center_end_correction();      $currentstring .= &center_end_correction();
  }   }
Line 747  sub start_b { Line 759  sub start_b {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &disable_para();   &disable_para();
  $currentstring .= '\textbf{';     $currentstring .= '\textbf{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 759  sub end_b { Line 771  sub end_b {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &enable_para();   &enable_para();
  $currentstring = '}';   $currentstring = '}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 773  sub start_strong { Line 785  sub start_strong {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &disable_para();   &disable_para();
  $currentstring = '\textbf{';     $currentstring = '\textbf{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 785  sub end_strong { Line 797  sub end_strong {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &enable_para();   &enable_para();
  $currentstring = '}';     $currentstring = '}';
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 811  sub start_h1 { Line 823  sub start_h1 {
  }   }
  my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  if (not defined $TeXsize) {$TeXsize="large";}   if (not defined $TeXsize) {$TeXsize="large";}
  $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';    $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
     } elsif ($target eq 'meta') {      } elsif ($target eq 'meta') {
  $currentstring.='<subject>';   $currentstring.='<subject>';
  &start_output($target);   &start_output($target);
Line 826  sub end_h1 { Line 838  sub end_h1 {
  $currentstring .= $token->[2];   $currentstring .= $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $post='\vskip 0 mm ';   my $post='\vskip 0 mm ';
  my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);   my $align=lc(&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1));
  if ($align eq 'center') {   if ($align eq 'center') {
     $post='\end{center}';      $post='\end{center}';
  } elsif ($align eq 'left') {   } elsif ($align eq 'left') {
Line 838  sub end_h1 { Line 850  sub end_h1 {
     } elsif ($target eq 'meta') {      } elsif ($target eq 'meta') {
  &end_output($target);   &end_output($target);
  $currentstring='</subject>';   $currentstring='</subject>';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 860  sub start_h2 { Line 872  sub start_h2 {
  }   }
  my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  if (not defined $TeXsize) {$TeXsize="large";}   if (not defined $TeXsize) {$TeXsize="large";}
  $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';    $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 881  sub end_h2 { Line 893  sub end_h2 {
     $post='}'.'\vskip 0 mm ';      $post='}'.'\vskip 0 mm ';
  }   }
  $currentstring .= '}}'.$post;   $currentstring .= '}}'.$post;
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 903  sub start_h3 { Line 915  sub start_h3 {
  }   }
  my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  if (not defined $TeXsize) {$TeXsize="large";}   if (not defined $TeXsize) {$TeXsize="large";}
  $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';    $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 924  sub end_h3 { Line 936  sub end_h3 {
     $post='}'.'\vskip 0 mm ';      $post='}'.'\vskip 0 mm ';
  }   }
  $currentstring .= '}}'.$post;   $currentstring .= '}}'.$post;
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 946  sub start_h4 { Line 958  sub start_h4 {
  }   }
  my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  if (not defined $TeXsize) {$TeXsize="large";}   if (not defined $TeXsize) {$TeXsize="large";}
  $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';    $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 967  sub end_h4 { Line 979  sub end_h4 {
     $post='}'.'\vskip 0 mm ';      $post='}'.'\vskip 0 mm ';
  }   }
  $currentstring .= '}}'.$post;   $currentstring .= '}}'.$post;
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 989  sub start_h5 { Line 1001  sub start_h5 {
  }   }
  my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  if (not defined $TeXsize) {$TeXsize="large";}   if (not defined $TeXsize) {$TeXsize="large";}
  $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';    $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1010  sub end_h5 { Line 1022  sub end_h5 {
     $post='}'.'\vskip 0 mm ';      $post='}'.'\vskip 0 mm ';
  }   }
  $currentstring .= '}}'.$post;   $currentstring .= '}}'.$post;
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1032  sub start_h6 { Line 1044  sub start_h6 {
  }   }
  my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);   my $TeXsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval,undef,0);
  if (not defined $TeXsize) {$TeXsize="large";}   if (not defined $TeXsize) {$TeXsize="large";}
  $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';    $currentstring .= '\strut\newline '.$pre.'{\\'.$TeXsize.' \textbf{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1053  sub end_h6 { Line 1065  sub end_h6 {
     $post='}'.'\vskip 0 mm ';      $post='}'.'\vskip 0 mm ';
  }   }
  $currentstring .= '}}'.$post;   $currentstring .= '}}'.$post;
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1099  sub end_i { Line 1111  sub end_i {
  $currentstring .= $token->[2];   $currentstring .= $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '}';   $currentstring .= '}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1134  sub start_dfn { Line 1146  sub start_dfn {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\textit{';   $currentstring .= '\textit{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1203  sub start_code { Line 1215  sub start_code {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\texttt{';   $currentstring .= '\texttt{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1214  sub end_code { Line 1226  sub end_code {
  $currentstring .= $token->[2];   $currentstring .= $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '}';   $currentstring .= '}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1237  sub end_em { Line 1249  sub end_em {
  $currentstring .= $token->[2];   $currentstring .= $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '}';   $currentstring .= '}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1260  sub end_q { Line 1272  sub end_q {
  $currentstring .= $token->[2];   $currentstring .= $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '}';   $currentstring .= '}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1276  sub end_q { Line 1288  sub end_q {
     my $closing_string = ''; # String required to close <p>      my $closing_string = ''; # String required to close <p>
   
 #   Some tags are <p> fragile meaning that <p> inside of them  #   Some tags are <p> fragile meaning that <p> inside of them
 #   does not work within TeX mode.  This is managed via the   #   does not work within TeX mode.  This is managed via the
 #   counter below:  #   counter below:
 #  #
   
Line 1305  sub start_p { Line 1317  sub start_p {
   
  $currentstring .= &end_p(); # close off prior para if in progress.   $currentstring .= &end_p(); # close off prior para if in progress.
  my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);   my $align=&Apache::lonxml::get_param('align',$parstack,$safeeval,undef,1);
    if (!defined $align) {
             # check inline CSS
             $align = &get_css_property('text-align',$parstack,$safeeval);
           }
  if ($align eq 'center') {   if ($align eq 'center') {
     $currentstring .='\begin{center}\par ';      $currentstring .='\begin{center}\par ';
     $closing_string = '\end{center}';      $closing_string = '\end{center}';
Line 1312  sub start_p { Line 1328  sub start_p {
  $currentstring = &center_correction().$currentstring;   $currentstring = &center_correction().$currentstring;
     }      }
  } elsif ($align eq 'right') {   } elsif ($align eq 'right') {
     $currentstring.="\n".'{\flushright ';      $currentstring.="\n".'\begin{flushright}';
 #    $currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{';  #    $currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{';
     $closing_string= "}\n";      $closing_string= '\end{flushright}'."\n";
  } elsif ($align eq 'left') {   } elsif ($align eq 'left') {
     $currentstring.= "\n".'{\flushleft ';      $currentstring.= "\n".'\begin{flushleft}';
 #    $currentstring.='\noindent\makebox['.$env{'form.textwidth'}.']{{';  #    $currentstring.='\noindent\makebox['.$env{'form.textwidth'}.']{{';
     $closing_string = "}\n";      $closing_string = '\end{flushleft}'."\n";
  } else {   } else {
             $currentstring.='\par ';              $currentstring.='\par ';
     if (&is_inside_of($tagstack, 'table')) {      if (&is_inside_of($tagstack, 'table')) {
Line 1372  sub start_br { Line 1388  sub start_br {
  if ($signal != 1) {   if ($signal != 1) {
     $currentstring .= '\strut \\\\ \strut ';      $currentstring .= '\strut \\\\ \strut ';
  }   }
       
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 1394  sub start_big { Line 1410  sub start_big {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '{\large ';   $currentstring .= '{\large ';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1437  sub start_basefont { Line 1453  sub start_basefont {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);   my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
  if (defined $basesize) {   if (defined $basesize) {
Line 1451  sub end_basefont { Line 1467  sub end_basefont {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);   my $basesize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
  if (defined $basesize) {   if (defined $basesize) {
Line 1467  sub start_font { Line 1483  sub start_font {
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);   my $face=&Apache::lonxml::get_param('face',$parstack,$safeeval);
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }  elsif ($target eq 'tex') {      }  elsif ($target eq 'tex') {
  my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);   my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
  if (defined $fontsize) {   if (defined $fontsize) {
Line 1481  sub end_font { Line 1497  sub end_font {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval)=@_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }  elsif ($target eq 'tex') {      }  elsif ($target eq 'tex') {
  my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);   my $fontsize=&Apache::lonxml::get_param('TeXsize',$parstack,$safeeval);
  if (defined $fontsize) {   if (defined $fontsize) {
Line 1490  sub end_font { Line 1506  sub end_font {
     }      }
     return $currentstring;      return $currentstring;
 }  }
    
 #-- <strike> tag (end tag required)  #-- <strike> tag (end tag required)
 sub start_strike {  sub start_strike {
     my ($target,$token) = @_;      my ($target,$token) = @_;
Line 1499  sub start_strike { Line 1515  sub start_strike {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &Apache::lonxml::startredirection();   &Apache::lonxml::startredirection();
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1510  sub end_strike { Line 1526  sub end_strike {
  $currentstring .= $token->[2];   $currentstring .= $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring=&Apache::lonxml::endredirection();   $currentstring=&Apache::lonxml::endredirection();
  $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;    $currentstring=~s/(\S)(\s+)(\S)/$1\}$2\\underline\{$3/g;
  $currentstring=~s/^\s*(\S)/\\underline\{$1/;    $currentstring=~s/^\s*(\S)/\\underline\{$1/;
  $currentstring=~s/(\S)\s*$/$1\}/;   $currentstring=~s/(\S)\s*$/$1\}/;
     }      }
     return $currentstring;      return $currentstring;
Line 1525  sub start_s { Line 1541  sub start_s {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &Apache::lonxml::startredirection();   &Apache::lonxml::startredirection();
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1551  sub start_sub { Line 1567  sub start_sub {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\raisebox{-\smallskipamount}{\scriptsize{';   $currentstring .= '\raisebox{-\smallskipamount}{\scriptsize{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1574  sub start_sup { Line 1590  sub start_sup {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\raisebox{\smallskipamount}{\scriptsize{';   $currentstring .= '\raisebox{\smallskipamount}{\scriptsize{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1598  sub start_hr { Line 1614  sub start_hr {
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
   
  # <hr /> can't be inside of <sup><sub> thank you LaTeX.   # <hr /> can't be inside of <sup><sub> thank you LaTeX.
  #    #
  my $restart_sub = 0;   my $restart_sub = 0;
  my $restart_sup = 0;   my $restart_sup = 0;
   
Line 1608  sub start_hr { Line 1624  sub start_hr {
   
  if (&is_inside_of($tagstack, "sub")) {   if (&is_inside_of($tagstack, "sub")) {
     $restart_sub = 1;      $restart_sub = 1;
     $currentstring .= &end_sub($target, $token, $tagstack,       $currentstring .= &end_sub($target, $token, $tagstack,
        $parstack, $parser, $safeeval);         $parstack, $parser, $safeeval);
  }   }
  if (&is_inside_of($tagstack, "sup")) {   if (&is_inside_of($tagstack, "sup")) {
Line 1647  sub start_hr { Line 1663  sub start_hr {
     $currentstring .= &start_sup($target, $token, $tagstack,      $currentstring .= &start_sup($target, $token, $tagstack,
  $parstack, $parser, $safeeval);   $parstack, $parser, $safeeval);
  }   }
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1674  sub start_div { Line 1690  sub start_div {
     my $currentstring = &end_p(); # Close enclosing para.      my $currentstring = &end_p(); # Close enclosing para.
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     }       }
     if ($target eq 'tex') {      if ($target eq 'tex') {
  # 4 possible alignments: left, right, center, and -missing-.   # 4 possible alignments: left, right, center, and -missing-.
         # If inside a table row, we must let the table logic          # If inside a table row, we must let the table logic
  # do the alignment, however.   # do the alignment, however.
  #    #
   
  my $endstring = '';   my $endstring = '';
   
Line 1690  sub start_div { Line 1706  sub start_div {
     $endstring      = '\end{center}';      $endstring      = '\end{center}';
     if (&is_inside_of($tagstack, "table")) {      if (&is_inside_of($tagstack, "table")) {
  $currentstring = &center_correction().$currentstring;   $currentstring = &center_correction().$currentstring;
  $endstring    .= &center_end_correction();    $endstring    .= &center_end_correction();
     }      }
  }   }
  elsif ($align eq 'right') {   elsif ($align eq 'right') {
Line 1800  sub start_li { Line 1816  sub start_li {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);   my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
  my $value=&Apache::lonxml::get_param('value',$parstack,$safeeval,undef,0);   my $value=&Apache::lonxml::get_param('value',$parstack,$safeeval,undef,0);
  #FIXME need to support types i and I    #FIXME need to support types i and I
  if ($type=~/disc/) {   if ($type=~/disc/) {
     $currentstring .= ' \item[$\bullet$] ';      $currentstring .= ' \item[$\bullet$] ';
  } elsif ($type=~/circle/) {   } elsif ($type=~/circle/) {
Line 1821  sub start_li { Line 1837  sub start_li {
     $currentstring .= ' \item['.$value.'] ';      $currentstring .= ' \item['.$value.'] ';
  } else {   } else {
     $currentstring .= ' \item ';      $currentstring .= ' \item ';
  }     }
  $Apache::londefdef::list_index++;   $Apache::londefdef::list_index++;
     }      }
     return $currentstring;      return $currentstring;
Line 1831  sub end_li { Line 1847  sub end_li {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = &end_p(); # In case there's a <p> in the <li>      my $currentstring = &end_p(); # In case there's a <p> in the <li>
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[2];        $currentstring .= $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1844  sub start_u { Line 1860  sub start_u {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &Apache::lonxml::startredirection();   &Apache::lonxml::startredirection();
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1867  sub start_ul { Line 1883  sub start_ul {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = &end_p(); # Close off enclosing list.      my $currentstring = &end_p(); # Close off enclosing list.
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];        $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  my $TeXtype=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);   my $TeXtype=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
  $Apache::londefdef::list_index=0;   $Apache::londefdef::list_index=0;
  if ($TeXtype eq 'disc') {   if ($TeXtype eq 'disc') {
     $currentstring .= '\renewcommand{\labelitemi}{$\bullet$}'.      $currentstring .= '\renewcommand{\labelitemi}{$\bullet$}'.
                               '\renewcommand{\labelitemii}{$\bullet$}'.                                 '\renewcommand{\labelitemii}{$\bullet$}'.
                               '\renewcommand{\labelitemiii}{$\bullet$}'.                                '\renewcommand{\labelitemiii}{$\bullet$}'.
                               '\renewcommand{\labelitemiv}{$\bullet$}';                                '\renewcommand{\labelitemiv}{$\bullet$}';
  } elsif ($TeXtype eq 'circle') {   } elsif ($TeXtype eq 'circle') {
     $currentstring .= '\renewcommand{\labelitemi}{$\circ$}'.      $currentstring .= '\renewcommand{\labelitemi}{$\circ$}'.
                               '\renewcommand{\labelitemii}{$\circ$}'.                                 '\renewcommand{\labelitemii}{$\circ$}'.
                               '\renewcommand{\labelitemiii}{$\circ$}'.                                '\renewcommand{\labelitemiii}{$\circ$}'.
                               '\renewcommand{\labelitemiv}{$\circ$}';                                '\renewcommand{\labelitemiv}{$\circ$}';
  } elsif ($TeXtype eq 'square') {   } elsif ($TeXtype eq 'square') {
     $currentstring .= '\renewcommand{\labelitemi}{$\diamond$}'.      $currentstring .= '\renewcommand{\labelitemi}{$\diamond$}'.
                               '\renewcommand{\labelitemii}{$\diamond$}'.                                 '\renewcommand{\labelitemii}{$\diamond$}'.
                               '\renewcommand{\labelitemiii}{$\diamond$}'.                                '\renewcommand{\labelitemiii}{$\diamond$}'.
                               '\renewcommand{\labelitemiv}{$\diamond$}';                                '\renewcommand{\labelitemiv}{$\diamond$}';
  }   }
  $currentstring .= '\strut \begin{itemize}';     $currentstring .= '\strut \begin{itemize}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1896  sub end_ul { Line 1912  sub end_ul {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = '\end{itemize} \renewcommand{\labelitemi}{$\bullet$}'.   $currentstring = '\end{itemize} \renewcommand{\labelitemi}{$\bullet$}'.
                                '\renewcommand{\labelitemii}{$\bullet$}'.                                  '\renewcommand{\labelitemii}{$\bullet$}'.
                                '\renewcommand{\labelitemiii}{$\bullet$}'.                                 '\renewcommand{\labelitemiii}{$\bullet$}'.
                                '\renewcommand{\labelitemiv}{$\bullet$}\strut ';                                   '\renewcommand{\labelitemiv}{$\bullet$}\strut ';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1911  sub start_menu { Line 1927  sub start_menu {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = " \\begin{itemize} ";     $currentstring = " \\begin{itemize} ";
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1922  sub end_menu { Line 1938  sub end_menu {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = " \\end{itemize}";     $currentstring = " \\end{itemize}";
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1934  sub start_dir { Line 1950  sub start_dir {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = &end_p(); # In case there's a <p> prior to the list.      my $currentstring = &end_p(); # In case there's a <p> prior to the list.
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];        $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= " \\begin{itemize} ";     $currentstring .= " \\begin{itemize} ";
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1945  sub end_dir { Line 1961  sub end_dir {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = " \\end{itemize}";     $currentstring = " \\end{itemize}";
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1957  sub start_ol { Line 1973  sub start_ol {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = &end_p(); # In case there's a <p> prior to the list.      my $currentstring = &end_p(); # In case there's a <p> prior to the list.
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];        $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $Apache::londefdef::list_index=0;   $Apache::londefdef::list_index=0;
  my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);   my $type=&Apache::lonxml::get_param('type',$parstack,$safeeval,undef,0);
  if ($type eq '1') {   if ($type eq '1') {
     $currentstring .= '\renewcommand{\labelenumi}{\arabic{enumi}.}'.      $currentstring .= '\renewcommand{\labelenumi}{\arabic{enumi}.}'.
                               '\renewcommand{\labelenumii}{\arabic{enumii}.}'.                                 '\renewcommand{\labelenumii}{\arabic{enumii}.}'.
                               '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.                                '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.
                               '\renewcommand{\labelenumiv}{\arabic{enumiv}.}';                                '\renewcommand{\labelenumiv}{\arabic{enumiv}.}';
  } elsif ($type eq 'A') {   } elsif ($type eq 'A') {
     $currentstring .= '\renewcommand{\labelenumi}{\Alph{enumi}.}'.      $currentstring .= '\renewcommand{\labelenumi}{\Alph{enumi}.}'.
                               '\renewcommand{\labelenumii}{\Alph{enumii}.}'.                                 '\renewcommand{\labelenumii}{\Alph{enumii}.}'.
                               '\renewcommand{\labelenumiii}{\Alph{enumiii}.}'.                                '\renewcommand{\labelenumiii}{\Alph{enumiii}.}'.
                               '\renewcommand{\labelenumiv}{\Alph{enumiv}.}';                                '\renewcommand{\labelenumiv}{\Alph{enumiv}.}';
  } elsif ($type eq 'a') {   } elsif ($type eq 'a') {
Line 1987  sub start_ol { Line 2003  sub start_ol {
                               '\renewcommand{\labelenumiii}{\Roman{enumiii}.}'.                                '\renewcommand{\labelenumiii}{\Roman{enumiii}.}'.
                               '\renewcommand{\labelenumiv}{\Roman{enumiv}.}';                                '\renewcommand{\labelenumiv}{\Roman{enumiv}.}';
  }   }
  $currentstring .= '\strut \begin{enumerate}';     $currentstring .= '\strut \begin{enumerate}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 1996  sub end_ol { Line 2012  sub end_ol {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = '\end{enumerate}\renewcommand{\labelenumi}{\arabic{enumi}.}'.   $currentstring = '\end{enumerate}\renewcommand{\labelenumi}{\arabic{enumi}.}'.
                                         '\renewcommand{\labelenumii}{\arabic{enumii}.}'.                                          '\renewcommand{\labelenumii}{\arabic{enumii}.}'.
                                         '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.                                          '\renewcommand{\labelenumiii}{\arabic{enumiii}.}'.
                                         '\renewcommand{\labelenumiv}{\arabic{enumiv}.}\strut ';                                            '\renewcommand{\labelenumiv}{\arabic{enumiv}.}\strut ';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 2011  sub start_dl { Line 2027  sub start_dl {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = &end_p(); # In case there's a <p> unclosed prior to the list.      my $currentstring = &end_p(); # In case there's a <p> unclosed prior to the list.
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];        $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\begin{description}';   $currentstring .= '\begin{description}';
  $Apache::londefdef::DL++;   $Apache::londefdef::DL++;
Line 2019  sub start_dl { Line 2035  sub start_dl {
  $Apache::londefdef::DD[$Apache::londefdef::DL]=0;   $Apache::londefdef::DD[$Apache::londefdef::DL]=0;
  $Apache::londefdef::DT[$Apache::londefdef::DL]=0;   $Apache::londefdef::DT[$Apache::londefdef::DL]=0;
  $Apache::londefdef::seenDT[$Apache::londefdef::DL]=0;   $Apache::londefdef::seenDT[$Apache::londefdef::DL]=0;
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 2027  sub end_dl { Line 2043  sub end_dl {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }   if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }
  if ($Apache::londefdef::DD[-1]) { &end_dd(@_); }   if ($Apache::londefdef::DD[-1]) { &end_dd(@_); }
Line 2035  sub end_dl { Line 2051  sub end_dl {
     $currentstring.=' '.$element.' ';      $currentstring.=' '.$element.' ';
  }   }
  pop(@Apache::londefdef::description);   pop(@Apache::londefdef::description);
  $currentstring.='\end{description}';     $currentstring.='\end{description}';
  delete($Apache::londefdef::DD[$Apache::londefdef::DL]);   delete($Apache::londefdef::DD[$Apache::londefdef::DL]);
  delete($Apache::londefdef::DT[$Apache::londefdef::DL]);   delete($Apache::londefdef::DT[$Apache::londefdef::DL]);
  delete($Apache::londefdef::seenDT[$Apache::londefdef::DL]);   delete($Apache::londefdef::seenDT[$Apache::londefdef::DL]);
  $Apache::londefdef::DL--;   $Apache::londefdef::DL--;
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 2049  sub start_dt { Line 2065  sub start_dt {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring='';      my $currentstring='';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }   if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }
  if ($Apache::londefdef::DD[-1]) { &end_dd(@_); }   if ($Apache::londefdef::DD[-1]) { &end_dd(@_); }
  &Apache::lonxml::startredirection();   &Apache::lonxml::startredirection();
  $Apache::londefdef::DT[-1]++;   $Apache::londefdef::DT[-1]++;
  $Apache::londefdef::seenDT[-1]=1;   $Apache::londefdef::seenDT[-1]=1;
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 2064  sub end_dt { Line 2080  sub end_dt {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  if ($Apache::londefdef::DT[-1]) {   if ($Apache::londefdef::DT[-1]) {
     my $data=&item_cleanup();      my $data=&item_cleanup();
     push(@{$Apache::londefdef::description[-1]},'\item['.$data.'] \strut \vskip 0mm');      push(@{$Apache::londefdef::description[-1]},'\item['.$data.'] \strut \vskip 0mm');
     $Apache::londefdef::DT[-1]--;      $Apache::londefdef::DT[-1]--;
  }   }
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 2087  sub start_dd { Line 2103  sub start_dd {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }   if ($Apache::londefdef::DT[-1]) { &end_dt(@_); }
  if ($Apache::londefdef::DD[-1]) { &end_dd(@_);}   if ($Apache::londefdef::DD[-1]) { &end_dd(@_);}
Line 2098  sub start_dd { Line 2114  sub start_dd {
  $Apache::londefdef::description[-1]->[-1].=' \strut ';   $Apache::londefdef::description[-1]->[-1].=' \strut ';
  $Apache::londefdef::DD[-1]++;   $Apache::londefdef::DD[-1]++;
  &Apache::lonxml::startredirection();   &Apache::lonxml::startredirection();
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 2106  sub end_dd { Line 2122  sub end_dd {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }  elsif ($target eq 'tex') {      }  elsif ($target eq 'tex') {
  $Apache::londefdef::description[-1]->[-1].=   $Apache::londefdef::description[-1]->[-1].=
     &Apache::lonxml::endredirection().' \vskip 0mm ';      &Apache::lonxml::endredirection().' \vskip 0mm ';
Line 2118  sub end_dd { Line 2134  sub end_dd {
 #-- <table> tag (end tag required)  #-- <table> tag (end tag required)
 #       <table> also ends any prior <p> that is not closed.  #       <table> also ends any prior <p> that is not closed.
 #               but, unless I allow <p>'s to nest, that's the  #               but, unless I allow <p>'s to nest, that's the
 #               only way I could think of to allow <p> in   #               only way I could think of to allow <p> in
 #               <tr> <th> bodies  #               <tr> <th> bodies
 #  #
 #list of supported attributes: border,width,TeXwidth,TeXtheme  #list of supported attributes: border,width,TeXwidth,TeXtheme
Line 2128  sub start_table { Line 2144  sub start_table {
     my $textwidth = '';      my $textwidth = '';
     my $currentstring = &end_p();      my $currentstring = &end_p();
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];        $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &disable_para(); # Can't have paras in a table.   &disable_para(); # Can't have paras in a table.
   
Line 2196  sub start_table { Line 2212  sub start_table {
     }      }
     return $currentstring;      return $currentstring;
 }  }
    
 sub end_table {  sub end_table {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
   
   
Line 2221  sub start_tr { Line 2237  sub start_tr {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
   
  my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1);   my $align = &Apache::lonxml::get_param('align', $parstack, $safeeval, undef, 1);
Line 2255  sub start_tr { Line 2271  sub start_tr {
  push @ {$Apache::londefdef::table[-1]{'maxlen'}}, [];   push @ {$Apache::londefdef::table[-1]{'maxlen'}}, [];
  push @ {$Apache::londefdef::table[-1]{'content'}}, [];   push @ {$Apache::londefdef::table[-1]{'content'}}, [];
     }      }
     }       }
     return $currentstring;      return $currentstring;
 }  }
           
 sub end_tr {  sub end_tr {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = &end_p(); # Close any pending <p> in the row.      my $currentstring = &end_p(); # Close any pending <p> in the row.
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[2];        $currentstring .= $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
   
  # In case the user is missing a </td> or </th> tag:   # In case the user is missing a </td> or </th> tag:
   
  if ($Apache::londefdef::TD_redirection) {   if ($Apache::londefdef::TD_redirection) {
     &end_td_tex($parstack,$parser,$safeeval);          &end_td_tex($parstack,$parser,$safeeval);
  }   }
  $Apache::londefdef::table[-1]->end_row();   $Apache::londefdef::table[-1]->end_row();
   
Line 2279  sub end_tr { Line 2295  sub end_tr {
   
  if (0) {   if (0) {
  if ($Apache::londefdef::TD_redirection) {   if ($Apache::londefdef::TD_redirection) {
     &end_td_tex($parstack,$parser,$safeeval);          &end_td_tex($parstack,$parser,$safeeval);
  }   }
  # Counter columns must be the maximum number of columns seen   # Counter columns must be the maximum number of columns seen
  # in the table so far so:   # in the table so far so:
Line 2298  sub start_td { Line 2314  sub start_td {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $Apache::londefdef::TD_redirection = 1;   $Apache::londefdef::TD_redirection = 1;
  &tag_check('tr','td',$tagstack,$parstack,$parser,$safeeval);   &tag_check('tr','td',$tagstack,$parstack,$parser,$safeeval);
     }       }
     return $currentstring;      return $currentstring;
 }     }
       
 sub tag_check {  sub tag_check {
     my ($good_tag,$bad_tag,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($good_tag,$bad_tag,$tagstack,$parstack,$parser,$safeeval) = @_;
     my @ar=@$parstack;       my @ar=@$parstack;
     for (my $i=$#ar-1;$i>=0;$i--) {      for (my $i=$#ar-1;$i>=0;$i--) {
  if (lc($$tagstack[$i]) eq $good_tag) {   if (lc($$tagstack[$i]) eq $good_tag) {
     &start_td_tex($parstack,$parser,$safeeval);      &start_td_tex($parstack,$parser,$safeeval);
Line 2330  sub tag_check { Line 2346  sub tag_check {
 sub cell_config_hash {  sub cell_config_hash {
     my ($align, $rowspan, $colspan, $width) = @_;      my ($align, $rowspan, $colspan, $width) = @_;
     if ($rowspan ne '') {      if ($rowspan ne '') {
         $rowspan =~ s/^\s+|\s+$//g;           $rowspan =~ s/^\s+|\s+$//g;
     }      }
     if ($colspan ne '') {      if ($colspan ne '') {
         $colspan =~ s/^\s+|\s+$//g;          $colspan =~ s/^\s+|\s+$//g;
Line 2350  sub cell_config_hash { Line 2366  sub cell_config_hash {
     }      }
     return \%config;      return \%config;
 }  }
    
 sub start_td_tex {  sub start_td_tex {
     my ($parstack,$parser,$safeeval) = @_;      my ($parstack,$parser,$safeeval) = @_;
   
Line 2367  sub start_td_tex { Line 2383  sub start_td_tex {
   
     my $table = $Apache::londefdef::table[-1];      my $table = $Apache::londefdef::table[-1];
     $table->add_cell('', $config);      $table->add_cell('', $config);
       
   
     #------------------------------------------------      #------------------------------------------------
     #  Old table code.      #  Old table code.
Line 2405  sub end_td_tex { Line 2421  sub end_td_tex {
     if (0) {      if (0) {
     my ($parstack,$parser,$safeeval) = @_;      my ($parstack,$parser,$safeeval) = @_;
     my $current_row    = $Apache::londefdef::table[-1]{'row_number'};      my $current_row    = $Apache::londefdef::table[-1]{'row_number'};
     my $current_column = $Apache::londefdef::table[-1]{'counter_columns'};       my $current_column = $Apache::londefdef::table[-1]{'counter_columns'};
     my $data = &Apache::lonxml::endredirection();      my $data = &Apache::lonxml::endredirection();
   
     #  The rowspan array of the table indicates which cells are part of a span.      #  The rowspan array of the table indicates which cells are part of a span.
Line 2415  sub end_td_tex { Line 2431  sub end_td_tex {
     #  If this and subsequent cells are part of a rowspan, we must      #  If this and subsequent cells are part of a rowspan, we must
     #  push along the row until we find one that is not.      #  push along the row until we find one that is not.
   
     while ((defined $Apache::londefdef::table[-1]{'rowspan'}[$current_row] [$current_column])       while ((defined $Apache::londefdef::table[-1]{'rowspan'}[$current_row] [$current_column])
    && ($Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] =~ /[\^\_]/)) {     && ($Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] =~ /[\^\_]/)) {
  # Part of a span.   # Part of a span.
  push @ {$Apache::londefdef::table[-1]{'content'}[-1]}, '';   push @ {$Apache::londefdef::table[-1]{'content'}[-1]}, '';
  $current_column++;   $current_column++;
     }      }
     $Apache::londefdef::table[-1]{'counter_columns'} = $current_column;      $Apache::londefdef::table[-1]{'counter_columns'} = $current_column;
      
   
     # Get the column and row spans.      # Get the column and row spans.
     # Colspan can be done via \multicolumn if I can figure out the data structs.      # Colspan can be done via \multicolumn if I can figure out the data structs.
Line 2498  sub end_td_tex { Line 2514  sub end_td_tex {
  push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';   push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
  push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';   push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
     }      }
     $data=~s/\\\\\s*$//;       $data=~s/\\\\\s*$//;
  } else {     } else {
     $data=~s/^\s+(\S.*)/$1/;       $data=~s/^\s+(\S.*)/$1/;
     $data=~s/(.*\S)\s+$/$1/;      $data=~s/(.*\S)\s+$/$1/;
     $data=~s/(\s)+/$1/;      $data=~s/(\s)+/$1/;
     my ($current_length,$min_length)=(0,0);      my ($current_length,$min_length)=(0,0);
Line 2531  sub end_td_tex { Line 2547  sub end_td_tex {
  push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length;   push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length;
  push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;   push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;
     }      }
  }           }
     }      }
     # Substitute all of the tables nested in this cell in their appropriate places.      # Substitute all of the tables nested in this cell in their appropriate places.
   
   
     my $nested_count = $#{$Apache::londefdef::table[-1]{'include'}}; # This one is constant...      my $nested_count = $#{$Apache::londefdef::table[-1]{'include'}}; # This one is constant...
     for (my $in=0; $in<=$nested_count; $in++) {          for (my $in=0; $in<=$nested_count; $in++) {
  my $nested = shift @{$Apache::londefdef::table[-1]{'include'}};   my $nested = shift @{$Apache::londefdef::table[-1]{'include'}};
  $nested =~ s/\\end\{tabular\}\\strut\\\\/\\end\{tabular\}/;   $nested =~ s/\\end\{tabular\}\\strut\\\\/\\end\{tabular\}/;
  # $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;   # $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
Line 2576  sub end_td { Line 2592  sub end_td {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
         $Apache::londefdef::TD_redirection =0;          $Apache::londefdef::TD_redirection =0;
  &end_td_tex($parstack,$parser,$safeeval);   &end_td_tex($parstack,$parser,$safeeval);
Line 2589  sub start_th { Line 2605  sub start_th {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $Apache::londefdef::TD_redirection = 1;   $Apache::londefdef::TD_redirection = 1;
  &tagg_check('tr','th',$tagstack,$parstack,$parser,$safeeval);   &tagg_check('tr','th',$tagstack,$parstack,$parser,$safeeval);
     }       }
     return $currentstring;      return $currentstring;
 }     }
       
 sub tagg_check {  sub tagg_check {
     my ($good_tag,$bad_tag,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($good_tag,$bad_tag,$tagstack,$parstack,$parser,$safeeval) = @_;
     my @ar=@$parstack;       my @ar=@$parstack;
     for (my $i=$#ar-1;$i>=0;$i--) {      for (my $i=$#ar-1;$i>=0;$i--) {
  if (lc($$tagstack[$i]) eq $good_tag) {   if (lc($$tagstack[$i]) eq $good_tag) {
     &start_th_tex($parstack,$parser,$safeeval);      &start_th_tex($parstack,$parser,$safeeval);
Line 2613  sub tagg_check { Line 2629  sub tagg_check {
     }      }
     return '';      return '';
 }  }
    
 sub start_th_tex {  sub start_th_tex {
     my ($parstack,$parser,$safeeval) = @_;      my ($parstack,$parser,$safeeval) = @_;
   
Line 2692  sub end_th_tex { Line 2708  sub end_th_tex {
     push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;      push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$fwidth;
     push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';      push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
     push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';      push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
  } else {     } else {
     $data=~s/^\s+(\S.*)/$1/;       $data=~s/^\s+(\S.*)/$1/;
     $data=~s/(.*\S)\s+$/$1/;      $data=~s/(.*\S)\s+$/$1/;
     $data=~s/(\s)+/$1/;      $data=~s/(\s)+/$1/;
     my ($current_length,$min_length)=(0,0);      my ($current_length,$min_length)=(0,0);
Line 2722  sub end_th_tex { Line 2738  sub end_th_tex {
     push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';      push @ {$Apache::londefdef::table[-1]{'objectlen'}[$Apache::londefdef::table[-1]{'row_number'}] },'0';
     push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length;      push @ {$Apache::londefdef::table[-1]{'maxlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$current_length;
     push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;      push @ {$Apache::londefdef::table[-1]{'minlen'}[$Apache::londefdef::table[-1]{'row_number'}] },$min_length;
  }           }
     }      }
  for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {            for (my $in=0; $in<=$#{$Apache::londefdef::table[-1]{'include'}};$in++) {
     $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;      $data=~s/\\keephidden\{NEW TABLE ENTRY\}/$Apache::londefdef::table[-1]{'include'}[$in]/;
  }   }
     #make data bold      #make data bold
Line 2738  sub end_th { Line 2754  sub end_th {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = &end_p(); # Close any open <p> in the row.      my $currentstring = &end_p(); # Close any open <p> in the row.
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[2];        $currentstring .= $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
         $Apache::londefdef::TD_redirection =0;          $Apache::londefdef::TD_redirection =0;
  &end_th_tex($parstack,$parser,$safeeval);   &end_th_tex($parstack,$parser,$safeeval);
     }      }
     return $currentstring;      return $currentstring;
 }  }
        
 #-- <img> tag (end tag forbidden)  #-- <img> tag (end tag forbidden)
 #  #
 #  Render the <IMG> tag.  #  Render the <IMG> tag.
 #     <IMG> has the following attributes (in addition to the   #     <IMG> has the following attributes (in addition to the
 #     standard HTML ones:  #     standard HTML ones:
 #      TeXwrap   - Governs how the tex target will try to wrap text around  #      TeXwrap   - Governs how the tex target will try to wrap text around
 #                  horizontally aligned images.  #                  horizontally aligned images.
 #      TeXwidth  - The width of the image when rendered for print (mm).  #      TeXwidth  - The width of the image when rendered for print (mm).
 #      TeXheight - The height of the image when rendered for print (mm)  #      TeXheight - The height of the image when rendered for print (mm)
 #         (Note there seems to also be support for this as a % of page size)  #         (Note there seems to also be support for this as a % of page size)
 #        #
 sub start_img {  sub start_img {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style) = @_;
     my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,      my $src = &Apache::lonxml::get_param('src',$parstack,$safeeval,
  undef,1);   undef,1);
     if (! $src &&       if (! $src &&
  ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex')   ($target eq 'web' || $target eq 'webgrade' || $target eq 'tex')
  ) {    ) {
  my $inside = &Apache::lonxml::get_all_text("/img",$parser,$style);   my $inside = &Apache::lonxml::get_all_text("/img",$parser,$style);
  return '';   return '';
     }      }
Line 2776  sub start_img { Line 2792  sub start_img {
    # Render unto browsers that which are the browser's...     # Render unto browsers that which are the browser's...
   
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
         my $enc = ('yes' eq           my $enc = ('yes' eq
                    lc(&Apache::lonxml::get_param('encrypturl',$parstack,                     lc(&Apache::lonxml::get_param('encrypturl',$parstack,
                       $safeeval)));                        $safeeval)));
         unless ($src =~ m{^data\:image/gif;base64,}) {          unless ($src =~ m{^data\:image/gif;base64,}) {
Line 2792  sub start_img { Line 2808  sub start_img {
  #  simulate the alignments offered by html.   #  simulate the alignments offered by html.
  #   #
  #   #
  my $align = lc(&Apache::lonxml::get_param('align',    my $align = lc(&Apache::lonxml::get_param('align',
   $parstack,    $parstack,
   $safeeval,    $safeeval,
   undef,1));    undef,1));
Line 2802  sub start_img { Line 2818  sub start_img {
  #   #
  &Apache::lonxml::debug("Alignemnt = $align");   &Apache::lonxml::debug("Alignemnt = $align");
  #  LaTeX's image/text wrapping is really bad since it wants to   #  LaTeX's image/text wrapping is really bad since it wants to
  #  make figures float.     #  make figures float.
         #   The user has the optional parameter (applicable only to l/r          #   The user has the optional parameter (applicable only to l/r
  # alignment to use the picins/parpic directive to get wrapped text   # alignment to use the picins/parpic directive to get wrapped text
  # this is also imperfect.. that's why we give them a choice...   # this is also imperfect.. that's why we give them a choice...
Line 2839  sub start_img { Line 2855  sub start_img {
     if ($width_param)  { $size.='width='.$width_param.' mm,'; }      if ($width_param)  { $size.='width='.$width_param.' mm,'; }
     if ($height_param) { $size.='height='.$height_param.' mm]'; }      if ($height_param) { $size.='height='.$height_param.' mm]'; }
     # Default size if not able to extract that (e.g. eps image).      # Default size if not able to extract that (e.g. eps image).
       
     # &Apache::lonnet::logthis("Size = $size");      # &Apache::lonnet::logthis("Size = $size");
       
     $size='['.$size;      $size='['.$size;
     $size=~s/,$/]/;       $size=~s/,$/]/;
     $currentstring .= '\graphicspath{{'.$path.'}}'      $currentstring .= '\graphicspath{{'.$path.'}}'
  .'\includegraphics'.$size.'{'.$file.'} ';   .'\includegraphics'.$size.'{'.$file.'} ';
     my $closure;      my $closure;
     ($currentstring, $closure) = &align_latex_image($align,       ($currentstring, $closure) = &align_latex_image($align,
     $latex_rendering,       $latex_rendering,
     $currentstring,       $currentstring,
     $width_param,       $width_param,
     $height_param);      $height_param);
     $currentstring .= $closure;      $currentstring .= $closure;
   
  } else {   } else {
     &Apache::lonxml::debug("$src does not exist");      &Apache::lonxml::debug("$src does not exist");
     #original image file doesn't exist so check the alt attribute      #original image file doesn't exist so check the alt attribute
     my $alt =       my $alt =
  &Apache::lonxml::get_param('alt',$parstack,$safeeval,undef,1);   &Apache::lonxml::get_param('alt',$parstack,$safeeval,undef,1);
     unless ($alt) {      unless ($alt) {
  $alt=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src);   $alt=&Apache::lonmeta::alttag($Apache::lonxml::pwd[-1],$src);
Line 2885  sub start_img { Line 2901  sub start_img {
    ['', 'none','parbox', 'parpic', 'wrapfigure'], $token, 2);     ['', 'none','parbox', 'parpic', 'wrapfigure'], $token, 2);
         my $alt=    &Apache::lonxml::get_param('alt',$parstack,$safeeval);          my $alt=    &Apache::lonxml::get_param('alt',$parstack,$safeeval);
         my $enc=    &Apache::lonxml::get_param('encrypturl',$parstack,$safeeval);          my $enc=    &Apache::lonxml::get_param('encrypturl',$parstack,$safeeval);
    
  $currentstring .=&Apache::edit::select_arg('Encrypt URL:','encrypturl',   $currentstring .=&Apache::edit::select_arg('Encrypt URL:','encrypturl',
    ['no','yes'], $token, 2);     ['no','yes'], $token, 2);
         if (($alt=~/\S/) && (lc($enc) eq 'yes')) {          if (($alt=~/\S/) && (lc($enc) eq 'yes')) {
Line 2895  sub start_img { Line 2911  sub start_img {
  my $src=    &Apache::lonxml::get_param('src',$parstack,$safeeval);   my $src=    &Apache::lonxml::get_param('src',$parstack,$safeeval);
  my $width=  &Apache::lonxml::get_param('width',$parstack,$safeeval);   my $width=  &Apache::lonxml::get_param('width',$parstack,$safeeval);
  my $height= &Apache::lonxml::get_param('height',$parstack,$safeeval);   my $height= &Apache::lonxml::get_param('height',$parstack,$safeeval);
         my $element = &Apache::edit::get_element('src');           my $element = &Apache::edit::get_element('src');
         my $text;          my $text;
         if ($token->[2]{'src'}=~/\$/) {          if ($token->[2]{'src'}=~/\$/) {
            $text = &mt('Variable image source');             $text = &mt('Variable image source');
Line 2928  sub start_img { Line 2944  sub start_img {
  }   }
  if ($osrc ne $nsrc || (!$nwidth && !$nheight)) {   if ($osrc ne $nsrc || (!$nwidth && !$nheight)) {
     # changed image or no size specified,      # changed image or no size specified,
             # if they didn't explicitly change the               # if they didn't explicitly change the
             # width or height use the ones from the image              # width or height use the ones from the image
     if ($iwidth && $iheight) {      if ($iwidth && $iheight) {
  if ($owidth == $nwidth || (!$nwidth && !$nheight)) {   if ($owidth == $nwidth || (!$nwidth && !$nheight)) {
Line 2967  sub end_img { Line 2983  sub end_img {
 #-- <applet> tag (end tag required)  #-- <applet> tag (end tag required)
 sub start_applet {  sub start_applet {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
       
     my $code=&Apache::lonxml::get_param('code',$parstack,$safeeval,undef,1);      my $code=&Apache::lonxml::get_param('code',$parstack,$safeeval,undef,1);
     &Apache::lonxml::extlink($code);      &Apache::lonxml::extlink($code);
     my $archive=&Apache::lonxml::get_param('archive',$parstack,$safeeval,      my $archive=&Apache::lonxml::get_param('archive',$parstack,$safeeval,
Line 2988  sub start_applet { Line 3004  sub start_applet {
   
  if (&is_inside_of($tagstack, "sub")) {   if (&is_inside_of($tagstack, "sub")) {
     $restart_sub = 1;      $restart_sub = 1;
     $currentstring .= &end_sub($target, $token, $tagstack,       $currentstring .= &end_sub($target, $token, $tagstack,
        $parstack, $parser, $safeeval);         $parstack, $parser, $safeeval);
  }   }
  if (&is_inside_of($tagstack, "sup")) {   if (&is_inside_of($tagstack, "sup")) {
Line 3020  sub start_applet { Line 3036  sub start_applet {
     $currentstring .= &start_sup($target, $token, $tagstack,      $currentstring .= &start_sup($target, $token, $tagstack,
  $parstack, $parser, $safeeval);   $parstack, $parser, $safeeval);
  }   }
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3030  sub end_applet { Line 3046  sub end_applet {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];   $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
 #-- <embed> tag (end tag optional/required)  #-- <embed> tag (end tag optional/required)
 sub start_embed {      sub start_embed {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);      my $src=&Apache::lonxml::get_param('src',$parstack,$safeeval,undef,1);
     &Apache::lonxml::extlink($src);      &Apache::lonxml::extlink($src);
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
     $currentstring=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});       $currentstring=&Apache::lonenc::encrypt_ref($token,{'src'=>$src});
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3108  sub start_param { Line 3124  sub start_param {
  }   }
  $currentstring = &Apache::lonenc::encrypt_ref($token,\%toconvert);   $currentstring = &Apache::lonenc::encrypt_ref($token,\%toconvert);
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3116  sub end_param { Line 3132  sub end_param {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3153  sub end_allow { Line 3169  sub end_allow {
 sub start_frameset {  sub start_frameset {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = ''; # Close any pending para.      my $currentstring = ''; # Close any pending para.
     if ($target eq 'web' || $target eq 'webgrade') {       if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring =    $currentstring =
     &Apache::loncommon::start_page($Apache::londefdef::title,      &Apache::loncommon::start_page($Apache::londefdef::title,
    $Apache::londefdef::head,     $Apache::londefdef::head,
    {'add_entries'    => $token->[2],     {'add_entries'    => $token->[2],
Line 3183  sub start_xmp { Line 3199  sub start_xmp {
  $currentstring .= $token->[4];   $currentstring .= $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\begin{verbatim}';   $currentstring .= '\begin{verbatim}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3207  sub start_pre { Line 3223  sub start_pre {
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring .= '\begin{verbatim}';   $currentstring .= '\begin{verbatim}';
  &Apache::lonxml::disable_LaTeX_substitutions();   &Apache::lonxml::disable_LaTeX_substitutions();
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3263  sub end_externallink { Line 3279  sub end_externallink {
     return $currentstring;      return $currentstring;
 }  }
   
 #-- <blankspace heigth="">  #-- <blankspace height="">
 sub start_blankspace {  sub start_blankspace {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = &end_p(); # closes off any unclosed <p>      my $currentstring = &end_p(); # closes off any unclosed <p>
     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('height',$parstack,$safeeval,undef,1);
  $currentstring .= '\vskip '.$howmuch.' ';   $currentstring .= '\vskip '.$howmuch.' ';
     }      }
     return $currentstring;      return $currentstring;
Line 3288  sub start_abbr { Line 3304  sub start_abbr {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3297  sub end_abbr { Line 3313  sub end_abbr {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3307  sub start_acronym { Line 3323  sub start_acronym {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3316  sub end_acronym { Line 3332  sub end_acronym {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3326  sub start_area { Line 3342  sub start_area {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3335  sub end_area { Line 3351  sub end_area {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3345  sub start_base { Line 3361  sub start_base {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 3354  sub end_base { Line 3370  sub end_base {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3364  sub start_bdo { Line 3380  sub start_bdo {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3373  sub end_bdo { Line 3389  sub end_bdo {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3383  sub start_bgsound { Line 3399  sub start_bgsound {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3392  sub end_bgsound { Line 3408  sub end_bgsound {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3402  sub start_blink { Line 3418  sub start_blink {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3411  sub end_blink { Line 3427  sub end_blink {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3421  sub start_blockquote { Line 3437  sub start_blockquote {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = &end_p(); # Close any unclosed <p>      my $currentstring = &end_p(); # Close any unclosed <p>
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];        $currentstring .= $token->[4];
     }       }
     if ($target eq 'tex') {      if ($target eq 'tex') {
  $currentstring .= '\begin{quote}';   $currentstring .= '\begin{quote}';
     }      }
Line 3433  sub end_blockquote { Line 3449  sub end_blockquote {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     if ($target eq 'tex') {      if ($target eq 'tex') {
  $currentstring = '\end{quote}';   $currentstring = '\end{quote}';
     }      }
Line 3446  sub start_button { Line 3462  sub start_button {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3455  sub end_button { Line 3471  sub end_button {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3465  sub start_caption { Line 3481  sub start_caption {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 3475  sub end_caption { Line 3491  sub end_caption {
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];   $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3484  sub start_col { Line 3500  sub start_col {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3493  sub end_col { Line 3509  sub end_col {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3503  sub start_colgroup { Line 3519  sub start_colgroup {
     my ($target,$token,$tagstack, $parstack, $parser, $safeeval, $style) = @_;      my ($target,$token,$tagstack, $parstack, $parser, $safeeval, $style) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     if ($target eq 'tex') {      if ($target eq 'tex') {
  # TODO: Ensure this tag is in a table:   # TODO: Ensure this tag is in a table:
   
Line 3533  sub end_colgroup { Line 3549  sub end_colgroup {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3544  sub start_del { Line 3560  sub start_del {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &disable_para();   &disable_para();
  $currentstring .= '\st{';     $currentstring .= '\st{';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3556  sub end_del { Line 3572  sub end_del {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];        $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  &enable_para();   &enable_para();
  $currentstring = '}';   $currentstring = '}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3569  sub start_fieldset { Line 3585  sub start_fieldset {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3578  sub end_fieldset { Line 3594  sub end_fieldset {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3588  sub start_frame { Line 3604  sub start_frame {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3597  sub end_frame { Line 3613  sub end_frame {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3632  sub start_iframe { Line 3648  sub start_iframe {
                                 $query.='&amp;inhibitmenu=yes';                                  $query.='&amp;inhibitmenu=yes';
                             } else {                              } else {
                                 $query = 'inhibitmenu=yes';                                  $query = 'inhibitmenu=yes';
                             }                               }
                             $currentstring .= 'src="'.$url.'?'.$query.'" ';                              $currentstring .= 'src="'.$url.'?'.$query.'" ';
                         } else {                          } else {
                             $currentstring .= lc($attrib).'="'.$token->[2]->{$attrib}.'" ';                              $currentstring .= lc($attrib).'="'.$token->[2]->{$attrib}.'" ';
Line 3676  sub end_iframe { Line 3692  sub end_iframe {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3686  sub start_ins { Line 3702  sub start_ins {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3695  sub end_ins { Line 3711  sub end_ins {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3705  sub start_isindex { Line 3721  sub start_isindex {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3714  sub end_isindex { Line 3730  sub end_isindex {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3724  sub start_keygen { Line 3740  sub start_keygen {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3733  sub end_keygen { Line 3749  sub end_keygen {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3743  sub start_label { Line 3759  sub start_label {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3752  sub end_label { Line 3768  sub end_label {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3762  sub start_layer { Line 3778  sub start_layer {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3771  sub end_layer { Line 3787  sub end_layer {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3781  sub start_legend { Line 3797  sub start_legend {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3790  sub end_legend { Line 3806  sub end_legend {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3803  sub start_link { Line 3819  sub start_link {
  my $href=&Apache::lonxml::get_param('href',$parstack,$safeeval,   my $href=&Apache::lonxml::get_param('href',$parstack,$safeeval,
     undef,1);      undef,1);
  &Apache::lonxml::extlink($href);   &Apache::lonxml::extlink($href);
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3812  sub end_link { Line 3828  sub end_link {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3822  sub start_marquee { Line 3838  sub start_marquee {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3831  sub end_marquee { Line 3847  sub end_marquee {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3841  sub start_multicol { Line 3857  sub start_multicol {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = &end_p(); # Close any pending <p>      my $currentstring = &end_p(); # Close any pending <p>
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];        $currentstring .= $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3850  sub end_multicol { Line 3866  sub end_multicol {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3860  sub start_nobr { Line 3876  sub start_nobr {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }  elsif ($target eq 'tex') {      }  elsif ($target eq 'tex') {
  $currentstring='\mbox{';   $currentstring='\mbox{';
     }      }
Line 3871  sub end_nobr { Line 3887  sub end_nobr {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }   elsif ($target eq 'tex') {      }   elsif ($target eq 'tex') {
  $currentstring='}';   $currentstring='}';
     }      }
Line 3883  sub start_noembed { Line 3899  sub start_noembed {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3892  sub end_noembed { Line 3908  sub end_noembed {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3902  sub start_noframes { Line 3918  sub start_noframes {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3911  sub end_noframes { Line 3927  sub end_noframes {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3921  sub start_nolayer { Line 3937  sub start_nolayer {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3930  sub end_nolayer { Line 3946  sub end_nolayer {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3940  sub start_noscript { Line 3956  sub start_noscript {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3949  sub end_noscript { Line 3965  sub end_noscript {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3959  sub start_object { Line 3975  sub start_object {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3968  sub end_object { Line 3984  sub end_object {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3978  sub start_optgroup { Line 3994  sub start_optgroup {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3987  sub end_optgroup { Line 4003  sub end_optgroup {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 3997  sub start_samp { Line 4013  sub start_samp {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring='\texttt{';   $currentstring='\texttt{';
     }      }
Line 4008  sub end_samp { Line 4024  sub end_samp {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring='}';   $currentstring='}';
     }      }
Line 4020  sub start_server { Line 4036  sub start_server {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4029  sub end_server { Line 4045  sub end_server {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4039  sub start_spacer { Line 4055  sub start_spacer {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = &end_p(); # Close off any open <p> tag.      my $currentstring = &end_p(); # Close off any open <p> tag.
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring .= $token->[4];        $currentstring .= $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4048  sub end_spacer { Line 4064  sub end_spacer {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
   my @span_end_stack; # for span tex target
   
 #-- <span> tag (end tag required)  #-- <span> tag (end tag required)
 sub start_span {  sub start_span {
     my ($target,$token) = @_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       } elsif ($target eq 'tex') {
           my $endstring = '';
           my $family = &get_css_property('font-family',$parstack,$safeeval);
           if ($family eq 'monospace') {
               $currentstring .= '\texttt{';
               $endstring .= '}';
           }
           my $weight = &get_css_property('font-weight',$parstack,$safeeval);
           if ($weight eq 'bold') {
               $currentstring .= '\textbf{';
               $endstring .= '}';
           }
           my $style = &get_css_property('font-style',$parstack,$safeeval);
           if ($style eq 'italic') {
               $currentstring .= '\textit{';
               $endstring .= '}';
           }
           push(@span_end_stack, $endstring);
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4067  sub end_span { Line 4103  sub end_span {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       } elsif ($target eq 'tex') {
           my $endstring = pop @span_end_stack;
           $currentstring .= $endstring;
       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4077  sub start_tbody { Line 4116  sub start_tbody {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     if ($target eq 'tex') {      if ($target eq 'tex') {
  # TODO: Ensure this tag is within a table:   # TODO: Ensure this tag is within a table:
   
Line 4092  sub end_tbody { Line 4131  sub end_tbody {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     if($target eq 'tex') {      if($target eq 'tex') {
  # TODO: Ensure this tag is within a table:   # TODO: Ensure this tag is within a table:
   
Line 4108  sub start_tfoot { Line 4147  sub start_tfoot {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     if ($target eq 'tex') {      if ($target eq 'tex') {
         # TODO: ensure this is within a table tag.          # TODO: ensure this is within a table tag.
  my $table = $Apache::londefdef::table[-1];   my $table = $Apache::londefdef::table[-1];
Line 4122  sub end_tfoot { Line 4161  sub end_tfoot {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     if ($target eq 'tex') {      if ($target eq 'tex') {
  #  TODO: Ensure this is in side a table    #  TODO: Ensure this is in side a table
  my $table = $Apache::londefdef::table[-1];   my $table = $Apache::londefdef::table[-1];
  $table->end_foot();   $table->end_foot();
     }      }
Line 4137  sub start_thead { Line 4176  sub start_thead {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     if ($target eq 'tex') {      if ($target eq 'tex') {
  # Assume we're in a table... TODO: Verify that and ignore tag if not.   # Assume we're in a table... TODO: Verify that and ignore tag if not.
  my $table = $Apache::londefdef::table[-1];   my $table = $Apache::londefdef::table[-1];
Line 4151  sub end_thead { Line 4190  sub end_thead {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     if ($target eq 'tex') {      if ($target eq 'tex') {
       # TODO: Verify we are in a table and ignore tag if not.        # TODO: Verify we are in a table and ignore tag if not.
   
Line 4167  sub start_var { Line 4206  sub start_var {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = '\textit{';    $currentstring = '\textit{';
     }      }
     return $currentstring;      return $currentstring;
 }  }
Line 4180  sub end_var { Line 4219  sub end_var {
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];   $currentstring = $token->[2];
     } elsif ($target eq 'tex') {      } elsif ($target eq 'tex') {
  $currentstring = '}';    $currentstring = '}';
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4190  sub start_wbr { Line 4229  sub start_wbr {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[4];        $currentstring = $token->[4];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4199  sub end_wbr { Line 4238  sub end_wbr {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = $token->[2];       $currentstring = $token->[2];
     }       }
     return $currentstring;      return $currentstring;
 }  }
   
Line 4208  sub end_wbr { Line 4247  sub end_wbr {
 sub start_hideweboutput {  sub start_hideweboutput {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  &Apache::lonxml::startredirection();        &Apache::lonxml::startredirection();
     }       }
     return '';      return '';
 }  }
   
Line 4217  sub end_hideweboutput { Line 4256  sub end_hideweboutput {
     my ($target,$token) = @_;      my ($target,$token) = @_;
     my $currentstring = '';      my $currentstring = '';
     if ($target eq 'web' || $target eq 'webgrade') {      if ($target eq 'web' || $target eq 'webgrade') {
  $currentstring = &Apache::lonxml::endredirection();       $currentstring = &Apache::lonxml::endredirection();
     }       }
     return '';      return '';
 }  }
   
Line 4226  sub end_hideweboutput { Line 4265  sub end_hideweboutput {
 sub image_replication {  sub image_replication {
     my $src = shift;      my $src = shift;
     if (not -e $src) { &Apache::lonnet::repcopy($src); }      if (not -e $src) { &Apache::lonnet::repcopy($src); }
     #replicates eps or ps       #replicates eps or ps
     my $epssrc = my $pssrc = $src;      my $epssrc = my $pssrc = $src;
     $epssrc =~ s/\.(gif|jpg|jpeg|png)$/.eps/i;      $epssrc =~ s/\.(gif|jpg|jpeg|png)$/.eps/i;
     $pssrc  =~ s/\.(gif|jpg|jpeg|png)$/.ps/i;      $pssrc  =~ s/\.(gif|jpg|jpeg|png)$/.ps/i;
Line 4249  sub resize_image { Line 4288  sub resize_image {
     $width_param  = $width_param  * $scaling;      $width_param  = $width_param  * $scaling;
   
     #do we have any specified LaTeX size of the picture?      #do we have any specified LaTeX size of the picture?
     my $toget='TeXwidth';       my $toget='TeXwidth';
     if ($cis) {       if ($cis) {
  $toget=lc($toget);    $toget=lc($toget);
     }      }
     my $TeXwidth = &Apache::lonxml::get_param($toget,$parstack,      my $TeXwidth = &Apache::lonxml::get_param($toget,$parstack,
       $safeeval,$depth,$cis);        $safeeval,$depth,$cis);
Line 4261  sub resize_image { Line 4300  sub resize_image {
     #do we have any specified web size of the picture?      #do we have any specified web size of the picture?
     my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval,      my $width = &Apache::lonxml::get_param('width',$parstack,$safeeval,
    $depth,1);     $depth,1);
     if ($TeXwidth) {       if ($TeXwidth) {
  my $old_width_param=$width_param;   my $old_width_param=$width_param;
  if ($TeXwidth=~/(\d+)\s*\%/) {   if ($TeXwidth=~/(\d+)\s*\%/) {
     $width_param = $1*$env{'form.textwidth'}/100;      $width_param = $1*$env{'form.textwidth'}/100;
  } else {    } else {
     $width_param = $TeXwidth;      $width_param = $TeXwidth;
  }   }
  if ($TeXheight) {   if ($TeXheight) {
Line 4299  sub resize_image { Line 4338  sub resize_image {
 sub image_size {  sub image_size {
     my ($src,$scaling,$parstack,$safeeval,$depth,$cis)=@_;      my ($src,$scaling,$parstack,$safeeval,$depth,$cis)=@_;
   
     #size of image from gif/jpg/jpeg/png       #size of image from gif/jpg/jpeg/png
     my $ressrc=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);      my $ressrc=&Apache::lonnet::filelocation($Apache::lonxml::pwd[-1],$src);
     if (-e $ressrc) {      if (-e $ressrc) {
  $src = $ressrc;   $src = $ressrc;
Line 4312  sub image_size { Line 4351  sub image_size {
     undef($image);      undef($image);
   
     ($height_param, $width_param) = &resize_image($height_param, $width_param,      ($height_param, $width_param) = &resize_image($height_param, $width_param,
   $scaling, $parstack, $safeeval,     $scaling, $parstack, $safeeval,
   $depth, $cis);    $depth, $cis);
   
     return ($height_param, $width_param);      return ($height_param, $width_param);
Line 4398  sub get_eps_image { Line 4437  sub get_eps_image {
 }  }
   
 sub eps_generation {  sub eps_generation {
     my ($src,$file,$width_param) = @_;           my ($src,$file,$width_param) = @_;
     my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";      my $filename = "/home/httpd/prtspool/$env{'user.name'}_$env{'user.domain'}_printout.dat";
     if (open(my $tmpfile,">>$filename")) {       if (open(my $tmpfile,">>$filename")) {
         print $tmpfile "$src\n";          print $tmpfile "$src\n";
         close($tmpfile);          close($tmpfile);
     }      }
Line 4421  sub eps_generation { Line 4460  sub eps_generation {
     }      }
 }  }
   
 sub file_path {       sub file_path {
     my $src=shift;      my $src=shift;
     my ($file,$path);       my ($file,$path);
     if ($src =~ m!(.*)/([^/]*)$!) {      if ($src =~ m!(.*)/([^/]*)$!) {
  $file = $2;    $file = $2;
  $path = $1.'/';    $path = $1.'/';
     }       }
     return $file,$path;      return $file,$path;
 }  }
   
Line 4453  sub recalc { Line 4492  sub recalc {
 sub LATEX_length {  sub LATEX_length {
     my $garbage=shift;      my $garbage=shift;
     $garbage=~s/^\s+$//;      $garbage=~s/^\s+$//;
     $garbage=~s/^\s+(\S.*)/$1/;#space before       $garbage=~s/^\s+(\S.*)/$1/;#space before
     $garbage=~s/(.*\S)\s+$/$1/;#space after       $garbage=~s/(.*\S)\s+$/$1/;#space after
     $garbage=~s/(\s)+/$1/;#only one space      $garbage=~s/(\s)+/$1/;#only one space
     $garbage=~s/(\\begin\{([^\}]+)}|\\end\{([^\}]+)})//g;#remove LaTeX \begin{...} and \end{...}      $garbage=~s/(\\begin\{([^\}]+)}|\\end\{([^\}]+)})//g;#remove LaTeX \begin{...} and \end{...}
     $garbage=~s/(\$\_\{|\$\_|\$\^\{|\$\^|\}\$)//g;#remove $_{,$_,$^{,$^,}$      $garbage=~s/(\$\_\{|\$\_|\$\^\{|\$\^|\}\$)//g;#remove $_{,$_,$^{,$^,}$
Line 4468  sub LATEX_length { Line 4507  sub LATEX_length {
     $garbage=~s/(\\aleph|\\hbar|\\imath|\\jmath|\\ell|\\wp|\\Re|\\Im|\\mho|\\prime|\\emptyset|\\nabla|\\surd|\\partial|\\top|\\bot|\\vdash|\\dashv|\\forall|\\exists|\\neg|\\flat|\\natural|\\sharp|\\\||\\angle|\\backslash|\\Box|\\Diamond|\\triangle|\\clubsuit|\\diamondsuit|\\heartsuit|\\spadesuit|\\Join|\\infty)/11/g;      $garbage=~s/(\\aleph|\\hbar|\\imath|\\jmath|\\ell|\\wp|\\Re|\\Im|\\mho|\\prime|\\emptyset|\\nabla|\\surd|\\partial|\\top|\\bot|\\vdash|\\dashv|\\forall|\\exists|\\neg|\\flat|\\natural|\\sharp|\\\||\\angle|\\backslash|\\Box|\\Diamond|\\triangle|\\clubsuit|\\diamondsuit|\\heartsuit|\\spadesuit|\\Join|\\infty)/11/g;
     $garbage=~s/(\\hat\{([^}]+)}|\\check\{([^}]+)}|\\dot\{([^}]+)}|\\breve\{([^}]+)}|\\acute\{([^}]+)}|\\ddot\{([^}]+)}|\\grave\{([^}]+)}|\\tilde\{([^}]+)}|\\mathring\{([^}]+)}|\\bar\{([^}]+)}|\\vec\{([^}]+)})/$1/g;      $garbage=~s/(\\hat\{([^}]+)}|\\check\{([^}]+)}|\\dot\{([^}]+)}|\\breve\{([^}]+)}|\\acute\{([^}]+)}|\\ddot\{([^}]+)}|\\grave\{([^}]+)}|\\tilde\{([^}]+)}|\\mathring\{([^}]+)}|\\bar\{([^}]+)}|\\vec\{([^}]+)})/$1/g;
     #remove some other LaTeX command      #remove some other LaTeX command
     $garbage=~s|\\(\w+)\\|\\|g;        $garbage=~s|\\(\w+)\\|\\|g;
     $garbage=~s|\\(\w+)(\s*)|$2|g;        $garbage=~s|\\(\w+)(\s*)|$2|g;
     $garbage=~s|\+|11|g;      $garbage=~s|\+|11|g;
     my  $value=length($garbage);      my  $value=length($garbage);
     return $value;      return $value;
Line 4489  sub align_latex_image { Line 4528  sub align_latex_image {
     #    If there's an alignment specification we need to honor it here.      #    If there's an alignment specification we need to honor it here.
     #    For the horizontal alignments, we will also honor the      #    For the horizontal alignments, we will also honor the
     #    value of the latex specfication.  The default is parbox,      #    value of the latex specfication.  The default is parbox,
     #    and that's used for illegal values too.        #    and that's used for illegal values too.
     #          #
     #    Even though we set a default alignment value, the user      #    Even though we set a default alignment value, the user
     #    could have given us an illegal value.  In that case we      #    could have given us an illegal value.  In that case we
     #    just use the default alignment of bottom..      #    just use the default alignment of bottom..
Line 4502  sub align_latex_image { Line 4541  sub align_latex_image {
  my $offset = $height/2;   my $offset = $height/2;
  $currentstring .= '\raisebox{-'.$offset.'mm}{'.$image;   $currentstring .= '\raisebox{-'.$offset.'mm}{'.$image;
  $closure       = '}';   $closure       = '}';
     } elsif ($align eq "left")   {       } elsif ($align eq "left")   {
  if ($latex_rendering eq "parpic") {    if ($latex_rendering eq "parpic") {
     $currentstring .= '\parpic[l]{'.$image;      $currentstring .= '\parpic[l]{'.$image;
     $closure       = '}';      $closure       = '}';
  } elsif ($latex_rendering eq "parbox") {   } elsif ($latex_rendering eq "parbox") {
Line 4512  sub align_latex_image { Line 4551  sub align_latex_image {
     $closure = '\end{minipage}';      $closure = '\end{minipage}';
  } elsif ($latex_rendering eq "wrapfigure"   } elsif ($latex_rendering eq "wrapfigure"
  || $latex_rendering ne 'none') {  # wrapfig render   || $latex_rendering ne 'none') {  # wrapfig render
     $currentstring .=       $currentstring .=
  '\begin{wrapfigure}{l}{'.$width.'mm}'   '\begin{wrapfigure}{l}{'.$width.'mm}'
  .'\scalebox{1.0}{'.$image;   .'\scalebox{1.0}{'.$image;
     $closure = '}\end{wrapfigure}';      $closure = '}\end{wrapfigure}';
  }   }
     } elsif ($align eq "right")  {         } elsif ($align eq "right")  {
  if ($latex_rendering eq "parpic") {   if ($latex_rendering eq "parpic") {
     $currentstring .= '\parpic[r]{'.$image;      $currentstring .= '\parpic[r]{'.$image;
     $closure = '}';      $closure = '}';
Line 4527  sub align_latex_image { Line 4566  sub align_latex_image {
     $closure = '\end{minipage}';      $closure = '\end{minipage}';
  } elsif ($latex_rendering eq "wrapfigure"   } elsif ($latex_rendering eq "wrapfigure"
  || $latex_rendering ne 'none') {  # wrapfig render   || $latex_rendering ne 'none') {  # wrapfig render
     $currentstring .=       $currentstring .=
  '\begin{wrapfigure}{r}{'.$width.'mm}'   '\begin{wrapfigure}{r}{'.$width.'mm}'
  .'\scalebox{1.0}{'.$image;   .'\scalebox{1.0}{'.$image;
     $closure = '}\end{wrapfigure}';      $closure = '}\end{wrapfigure}';
Line 4560  sub latex_header { Line 4599  sub latex_header {
     my ($mode) = @_;      my ($mode) = @_;
     my $currentstring = '';      my $currentstring = '';
   
     $currentstring .=       $currentstring .=
  "\n% &Apache::lonxml::londefdef \n" .   "\n% &Apache::lonxml::londefdef \n" .
  '\documentclass[letterpaper,twoside]{article}\raggedbottom';   '\documentclass[letterpaper,twoside]{article}\raggedbottom';
     if (($env{'form.latex_type'}=~'batchmode') ||      if (($env{'form.latex_type'}=~'batchmode') ||
  (!$env{'request.role.adv'}) ||    (!$env{'request.role.adv'}) ||
  ($mode eq 'batchmode')) {$currentstring .='\batchmode';}    ($mode eq 'batchmode')) {$currentstring .='\batchmode';}
     $currentstring .= '\newcommand{\keephidden}[1]{}'.      $currentstring .= '\newcommand{\keephidden}[1]{}'.
  '\renewcommand{\deg}{$^{\circ}$}'.   '\renewcommand{\deg}{$^{\circ}$}'.
  '\usepackage{multirow}'."\n".   '\usepackage{multirow}'."\n".
Line 4600  sub latex_header { Line 4639  sub latex_header {
  $currentstring .= '\usepackage{hyperref}'.   $currentstring .= '\usepackage{hyperref}'.
     '\usepackage{eforms}'.      '\usepackage{eforms}'.
     '\usepackage{tabularx}';      '\usepackage{tabularx}';
     }       }
       
         $currentstring .= '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'.          $currentstring .= '\newenvironment{choicelist}{\begin{list}{}{\setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.05in}\setlength{\itemsep}{0.022in}\setlength{\parsep}{0in}\setlength{\belowdisplayskip}{0.04in}\setlength{\abovedisplayskip}{0.05in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.04in}}}{\end{list}}'.
                           '\renewenvironment{theindex}{\begin{list}{}{{\vskip 1mm \noindent \large\textbf{Index}} \newline \setlength{\rightmargin}{0in}\setlength{\leftmargin}{0.13in}\setlength{\topsep}{0.01in}\setlength{\itemsep}{0.1in}\setlength{\parsep}{-0.02in}\setlength{\belowdisplayskip}{0.01in}\setlength{\abovedisplayskip}{0.01in}\setlength{\abovedisplayshortskip}{-0.04in}\setlength{\belowdisplayshortskip}{0.01in}}}{\end{list}}';                            '\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}}';
     $currentstring .= '\begin{document}';      $currentstring .= '\begin{document}';
       
     return $currentstring;      return $currentstring;
   
 }  }
Line 4634  sub clean_docs_httpref { Line 4673  sub clean_docs_httpref {
                 return $cleanhref;                  return $cleanhref;
             }              }
         } else {          } else {
             if ($href =~ m{/}) {                if ($href =~ m{/}) {
                 (my $path,$fname) = ($href =~ m{^(.*)/([^/]*)$});                  (my $path,$fname) = ($href =~ m{^(.*)/([^/]*)$});
                 $hrefpath = $relpath.$path;                  $hrefpath = $relpath.$path;
                 if ($path eq '') {                  if ($path eq '') {
Line 4666  sub clean_docs_httpref { Line 4705  sub clean_docs_httpref {
     return $cleanhref;      return $cleanhref;
 }  }
   
   # This is retrieving a CSS property from the style attribute of the current element.
   # It is not checking <style> elements or linked stylesheets yet.
   sub get_css_property {
       my ($property,$parstack,$safeeval) = @_;
       my $style=&Apache::lonxml::get_param('style',$parstack,$safeeval,undef,1);
       my @style_components=split(/;/,$style);
       foreach my $css_pair (@style_components) {
           my ($name, $value) = split(/:/, $css_pair);
           $name =~ s/^\s+|\s+$//g;
           $value =~ s/^\s+|\s+$//g;
           if ($name eq $property) {
               return $value;
           }
       }
       return undef;
   }
   
 =pod  =pod
   
 =head1 NAME  =head1 NAME
Line 4696  described at http://www.lon-capa.org. Line 4752  described at http://www.lon-capa.org.
  it's initial ht. and wid.  This allows sizing of   it's initial ht. and wid.  This allows sizing of
  images that are generated on-the-fly (e.g. gnuplot)   images that are generated on-the-fly (e.g. gnuplot)
  as well as serving as a utility for image_size.   as well as serving as a utility for image_size.
    
  Parameter:   Parameter:
         height_param          height_param
         width_param    - Initial picture dimensions.          width_param    - Initial picture dimensions.
         scaling        - A scale factor.          scaling        - A scale factor.
         parstack,      - the current stack of tag attributes           parstack,      - the current stack of tag attributes
                          from the xml parser                           from the xml parser
         safeeval,      - pointer to the safespace          safeeval,      - pointer to the safespace
         depth,         - from what level in the stack to look for attributes          depth,         - from what level in the stack to look for attributes
Line 4726  described at http://www.lon-capa.org. Line 4782  described at http://www.lon-capa.org.
   
 =item recalc()  =item recalc()
   
  Converts a measurement in to mm from any of    Converts a measurement in to mm from any of
  the other valid LaTeX units of measure.   the other valid LaTeX units of measure.
  If the units of measure are missing from the    If the units of measure are missing from the
  parameter, it is assumed to be in and returned   parameter, it is assumed to be in and returned
  with mm units of measure   with mm units of measure
   
Line 4736  described at http://www.lon-capa.org. Line 4792  described at http://www.lon-capa.org.
   
 =item align_latex_image()  =item align_latex_image()
   
   Wrap image 'stuff' inside of the LaTeX required to implement     Wrap image 'stuff' inside of the LaTeX required to implement
     alignment:      alignment:
       align_tex_image(align, latex_rendering, image)        align_tex_image(align, latex_rendering, image)
     Where:      Where:
Line 4751  described at http://www.lon-capa.org. Line 4807  described at http://www.lon-capa.org.
   
   
 =item is_inside_of($tagstack, $tag)  =item is_inside_of($tagstack, $tag)
     This sub returns true if the current state of Xml processing is inside of the tag.         This sub returns true if the current state of Xml processing is inside of the tag.
  Parameters:   Parameters:
     tagstack   - The tagstack from the parser.      tagstack   - The tagstack from the parser.
     tag        - The tag (without the <>'s.).      tag        - The tag (without the <>'s.).
Line 4766  described at http://www.lon-capa.org. Line 4822  described at http://www.lon-capa.org.
         and PosterImageSrc) for which dependency is another file uploaded to the same          and PosterImageSrc) for which dependency is another file uploaded to the same
         course.          course.
   
         Required input:           Required input:
         href - dependency (either a relative URL, or an absolute URL)          href - dependency (either a relative URL, or an absolute URL)
         Optional inputs:          Optional inputs:
         docuri - URL of HTML page containing the dependency          docuri - URL of HTML page containing the dependency

Removed from v.1.462  
changed lines
  Added in v.1.470


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>