From bcdf6c829c6761de02484473ebe43fa3760adcaa Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Wed, 12 May 2021 03:01:15 +0000
Subject: CTAN sync 202105120301

---
 .../TeX4ht/source/tex4ht-html-speech-xtpipes.tex   | 2440 ++++++++++++++++++++
 1 file changed, 2440 insertions(+)
 create mode 100644 support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex

(limited to 'support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex')

diff --git a/support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex b/support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex
new file mode 100644
index 0000000000..ec61b80c87
--- /dev/null
+++ b/support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex
@@ -0,0 +1,2440 @@
+% $Id: tex4ht-html-speech-xtpipes.tex 740 2020-06-13 22:35:32Z karl $
+% htlatex tex4ht-html-speech-xtpipes "html,next,3" "" "-d./"
+%
+% Copyright 2009-2020 TeX Users Group
+% Copyright 2006-2009 Eitan M. Gurari
+% Released under LPPL 1.3c+.
+% See tex4ht-cpright.tex for license text.
+\documentclass{article}
+    \Configure{ProTex}{log,<<<>>>,title,list,`,[[]]}
+\begin{document}
+
+\input{common}
+\input{tex4ht-dir}
+\input{tex4ht-cpright}
+
+%%%%%%%%%%%%%%%%%%
+\part{Script for xtpipes}
+%%%%%%%%%%%%%%%%%%
+
+
+%%%%%%%%%%%%%%%%%%
+\section{Outline}
+%%%%%%%%%%%%%%%%%%
+
+
+
+\AtEndDocument{\OutputCodE\<htspk.4xt\>}
+
+
+\Needs{"xmllint --valid --noout htspk.4xt"} 
+
+
+\<htspk.4xt\><<<
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE xtpipes SYSTEM "xtpipes.dtd" >
+<!-- htspk.4xt (`version), generated from `jobname.tex
+     Copyright (C) 2009-2010 TeX Users Group
+     Copyright (C) `CopyYear.2002. Eitan M. Gurari
+`<TeX4ht copyright`> -->
+<xtpipes>
+   <sax content-handler="xtpipes.util.ScriptsManager"
+        lexical-handler="xtpipes.util.ScriptsManagerLH" >
+     `<non short tag br elements`>     
+     `<undo empty scripts`> 
+     `<span frac elements`>
+     `<short cut modifiers`>
+     `<over and under scripts`>
+     `<bold math`>
+     `<capital math letters`>
+     `<remove multline eqnum cell`> 
+     `<inline math`>
+     `<display math`>
+     `<measure tables`>
+     `<remove empty split entries`>
+     `<boundaries on theorems`>
+   </sax>
+</xtpipes>
+>>>
+
+
+
+\<inline math\><<<
+<script element="span::inline-math" >
+  `<compress numeric subscripts`>
+  `<set levels for hyper complex fracs`>
+  `<set levels for sub and sup scripts`>
+  `<set levels for roots`>
+  <set name="inline-math" >
+     `<open xslt script`>
+     `<shared display and inline math 1`>
+     `<eliminate inline math narrative`>
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="inline-math" />
+  <set name="inline-math-2" >
+     `<open xslt script`>
+     `<shared display and inline math 2`>
+     `<eliminate inline math narrative 2`>
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="inline-math-2" />
+  `<set empty elements for the w3 browser`>
+</script> 
+>>>
+
+
+
+
+\<display math\><<<
+<script element="div::display-math" >
+  `<compress numeric subscripts`>
+  `<set levels for hyper complex fracs`>
+  `<set levels for sub and sup scripts`>
+  `<set levels for roots`>
+  <set name="display-math" >
+     `<open xslt script`>
+     `<shared display and inline math 1`>
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="display-math" />
+  <set name="display-math-2" >
+     `<open xslt script`>
+     `<shared display and inline math 2`>
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="display-math-2" />
+  `<set empty elements for the w3 browser`>
+</script> 
+>>>
+
+\<shared display and inline math 1\><<<
+`<get content template`>
+`<eliminate baseline script marks`> 
+`<fraction 'and' prefix`> 
+`<'minus' into 'negative'`> 
+`<compress limit script`>
+`<remove scrip indicators from primes`> 
+>>>
+
+
+\<shared display and inline math 2\><<<
+`<get content template`>
+`<replace nested baseline script marks`>
+`<insert pre mi spaces`>
+`<eliminate begin script marks`> 
+>>>
+
+
+\marginpar{Can dom be prevented from creating an xml declaration in
+  the output? The xslt part is there just to remove the undesirable
+  declaration.}
+
+
+\<remove xml declaration\><<<
+<set name="rmXmlDecl" >
+  `<open xslt script`>
+  `<close xslt script`>
+</set>
+<xslt name="." xml="." xsl="rmXmlDecl" />
+>>>
+
+
+
+
+
+
+
+\AtEndDocument{\OutputCodE\<HtSpk.java\>}
+\ifdojava
+  \Needs{"
+    javac HtSpk.java      -d \XTPIPES . 
+"}
+\fi
+
+\<HtSpk.java\><<<
+package tex4ht;
+/* HtSpk.java (`version), generated from `jobname.tex
+   Copyright (C) 2009-2010 TeX Users Group
+   Copyright (C) `CopyYear.2006. Eitan M. Gurari
+`<TeX4ht copyright`> */
+import org.w3c.dom.*;
+public class HtSpk {
+  `<static void fracLevel(dom)`>
+  `<static void scriptLevel(dom)`>
+  `<static void rootLevel(dom)`>
+}
+>>>
+
+
+%%%%%%%%%%%%%%%%%%
+\section{Line Break Elements}
+%%%%%%%%%%%%%%%%%%
+
+Avoid short versions \verb+<br />+.
+
+\<non short tag br elements\><<<
+<script element="br" >
+  <set name="br" >
+    <![CDATA[ 
+       <xsl:stylesheet version="1.0"
+          xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+       >
+          <xsl:output omit-xml-declaration = "yes" />
+          <xsl:template match="br" >
+            <xsl:copy>
+              <xsl:apply-templates select="@*" />
+              <xsl:comment>`<comment`></xsl:comment>
+            </xsl:copy>
+          </xsl:template> 
+          <xsl:template match="*|@*|text()|comment()" >
+            <xsl:copy>
+              <xsl:apply-templates select="*|@*|text()|comment()" />
+            </xsl:copy>
+          </xsl:template>
+       </xsl:stylesheet> 
+    ]]>
+  </set>
+  <xslt name="." xml="." xsl="br" />
+</script> 
+>>>
+
+%%%%%%%%%%%%%%%%%%
+\section{Capital Letters in Math}
+%%%%%%%%%%%%%%%%%%
+
+\<capital math letters\><<<
+<script element="span::mi" >
+  <set name="math-cap" >
+     `<open xslt script`>
+     `<span.mi cap letters`> 
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="math-cap" />
+</script> 
+>>>
+
+%                     (translate(.,'abcdefghijklmnopqrstuvwxyz',
+%                                  'ABCDEFGHIJKLMNOPQRSTUVWXYZ') = . )
+%                    and
+
+\<span.mi cap letters\><<<
+<xsl:template match="span[ @class = 'mi' ]" >
+  <xsl:copy>
+    <xsl:apply-templates select="@*" />
+      <xsl:if test=" string-length(.) = 1 " >      
+         <xsl:if test="
+                     (translate(.,'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
+                                  '') = '' )
+                  " >      
+            <span class="capital-description" 
+                  title="speech-extra" >
+               <xsl:text> capital </xsl:text>
+            </span>
+         </xsl:if>      
+      </xsl:if>      
+    <xsl:apply-templates select="*|text()|comment()" />
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+%%%%%%%%%%%%%%%%%%
+\section{Superscripts and Subscripts}
+%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%
+\subsection{Insert Sub-Levels Info}
+%%%%%%%%%%%%%
+
+
+
+
+\<set levels for sub and sup scripts\><<<
+<dom name="." xml="." method="scriptLevel" class="tex4ht.HtSpk" />
+`<remove xml declaration`>
+>>>
+
+
+
+\<static void scriptLevel(dom)\><<<
+public static void scriptLevel(Node dom) {
+   setScriptLevel(dom.getFirstChild(), "");
+}
+private static void setScriptLevel(Node node, String prefix) {
+  String clName = null;
+  if (node.hasChildNodes()) {
+    if (node.hasAttributes()) {
+      Node cl = node.getAttributes().getNamedItem("class");
+      if (cl != null) {
+        clName = cl.getNodeValue();
+        if( clName.equals("mrow-sub")
+            ||
+            clName.equals("mrow-super")
+        ){
+          `<append script prefix`>
+        } else if( 
+           clName.equals("msqrt")
+        ){  prefix = ""; }
+    } }
+    `<script invoke children`>
+} }
+>>>
+
+\<script invoke children\><<<
+NodeList children = node.getChildNodes();
+for (int i = 0; i < children.getLength(); i++) {
+   Node child = children.item(i);
+   if (child.getNodeType() == Node.ELEMENT_NODE) {
+      setScriptLevel(child, prefix);
+}  }
+>>>
+
+\<append script prefix\><<<
+if( !prefix.equals("") ){
+  `<use current script prefix`>
+}
+if( clName.equals( "mrow-sub" ) ){ prefix += " sub "; }
+else
+if( clName.equals( "mrow-super" ) ){ prefix += " super "; }
+>>>
+
+
+\<use current script prefix\><<<
+Node child = node.getFirstChild();
+if( (child.getNodeType() == Node.ELEMENT_NODE) 
+    &&
+    child.hasAttributes()
+){
+   Node cls = child.getAttributes().getNamedItem("class");
+   if (cls != null) {
+      String clsName = cls.getNodeValue();
+      if ( clsName.equals("begin-script")
+           ||
+           clsName.equals("mid-script")
+      ) {
+         child = child.getFirstChild();
+         String s = child.getNodeValue();
+         ((org.w3c.dom.Text) child).setData( prefix + s );
+}  }  }
+>>>
+ 
+
+
+%%%%%%%%%%%%%
+\subsection{Eliminate  End Script Marks}
+%%%%%%%%%%%%%
+
+
+The following takes care of end-scripts that semantically can be
+merged into other end markers.
+
+\<eliminate baseline script marks\><<<
+<xsl:template match="span[
+   (@class = 'end-script')
+   and
+   ancestor::* [ following-sibling::* [
+                         not( @class = 'content-less' )
+                      ] 
+               ][1]
+           / following-sibling::* [
+                         not( @class = 'content-less' )
+                     ][1] 
+           / self::*
+    [
+       (@class = 'end-math') 
+       or
+       (@class = 'end-script') 
+       or
+       (@class = 'end-root') 
+       or
+       (@class = 'end-stack') 
+       or
+       (@class = 'mid-stack') 
+       or
+       (@class = 'end-array') 
+       or
+       (@class = 'tr') 
+       or
+       (@title = 'implicit-baseline') 
+    ]
+]"  >
+</xsl:template> 
+>>>
+
+
+
+%%%%%%%%%%%%%
+\subsection{Replace Nested Baseline Script Marks}
+%%%%%%%%%%%%%
+
+
+\<replace nested baseline script marks\><<<
+<xsl:template match="span[
+     (@class = 'end-script')
+   and
+     ancestor::*[ preceding-sibling::* [
+       ((@class = 'begin-script') or (@class = 'mid-script')) ]]
+`%   and
+     ( normalize-space(.) = 'baseline' )     REMOVE `%
+]" >
+  <xsl:copy>
+     <xsl:apply-templates select="*|@*|comment()" />
+     <xsl:value-of select="
+            ancestor::*[ preceding-sibling::* [
+                           ((@class = 'begin-script') or 
+                            (@class = 'mid-script'))     ]]  [1]
+            / preceding-sibling::* [
+                           ((@class = 'begin-script') or 
+                            (@class = 'mid-script'))  ][1]
+      " />
+  </xsl:copy>
+</xsl:template>   
+>>>
+
+
+%%%%%%%%%%%%%
+\subsection{Eliminate  Begin Script Marks}
+%%%%%%%%%%%%%
+
+
+
+\<eliminate begin script marks\><<<
+<xsl:template match="span[
+     (@class = 'begin-script')
+   and
+     following-sibling::* [1] / child::*[  
+       (position() = 1)
+       and 
+       (@class = 'mrow-base')
+       and
+       ( normalize-space(.) = '' )
+     ]
+]"  >
+</xsl:template> 
+>>>
+
+
+
+%%%%%%%%%%%%%
+\subsection{Undo Empty Scripts}
+%%%%%%%%%%%%%
+
+
+
+
+\<undo empty scripts\><<<
+<script element="span::msup" >
+   <set name="m-sub-sup" >
+     `<open xslt script`>
+     `<undo if empty su`> 
+     `<close xslt script`>
+   </set>
+   <xslt name="." xml="." xsl="m-sub-sup" />
+   `<superscript 2 and 3 into verbose`>
+</script> 
+<script element="span::msub" >
+  `<sub sup script`>
+</script> 
+<script element="span::msubsup" >
+  `<subsup prime`>
+  `<sub sup script`>
+  `<sub superscript 2 and 3 into verbose`>
+</script> 
+>>>
+
+\<sub sup script\><<<
+<set name="m-sub-sup" >
+  `<open xslt script`>
+  `<undo if empty su`> 
+  `<close xslt script`>
+</set>
+<xslt name="." xml="." xsl="m-sub-sup" />
+>>>
+
+\<undo if empty su\><<<
+<xsl:template match="span[
+    ((@class = 'msup') or (@class = 'msub')
+                       or (@class = 'msubsup'))
+  and
+    not(
+      child::span[ (@class = 'mrow-sub') ] 
+        / child::span[ (@class != 'begin-script')
+                       and
+                       (@class != 'end-script')
+                       and
+                       (@class != 'mid-script')
+                     ]
+    )
+  and
+    not(
+      child::span[ (@class = 'mrow-super') ] 
+        / child::span[ (@class != 'begin-script')
+                       and
+                       (@class != 'end-script')
+                       and
+                       (@class != 'mid-script')
+                     ]
+    )
+]" >
+   <xsl:apply-templates select="child::span[ 
+                          @class = 'mrow-base' ]/*" />
+</xsl:template> 
+>>>
+
+
+
+\begin{verbatim}
+<span class="msup">
+   <span class="mrow-base">
+     .........
+   </span>
+   <span class="mrow-super">
+     <span class="begin-script"> superscript </span>
+     <span class="end-script"> baseline </span>
+   </span>
+</span>
+\end{verbatim}
+
+
+
+
+%%%%%%%%%%%%%
+\subsection{Squared}
+%%%%%%%%%%%%%
+
+\<superscript 2 and 3 into verbose\><<<
+<set name="m-sup-2-3" >
+  `<open xslt script`>
+  `<superscript into squared abd cube`> 
+  `<close xslt script`>
+</set>
+<xslt name="." xml="." xsl="m-sup-2-3" />
+>>>
+
+\<superscript into squared abd cube\><<<
+<xsl:template match="span[
+    (@class = 'msup') 
+  and
+    (normalize-space(
+      child::span[ (@class = 'mrow-super') ] 
+        / child::span[ (@class != 'begin-script')
+                       and
+                       (@class != 'end-script')
+                     ]
+     ) = '2')
+  and `<su verbose not on op`>
+]" >
+   <xsl:copy>
+      <xsl:apply-templates select="*|@*|text()|comment()" 
+                           mode="squared" />
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+\<su verbose not on op\><<<
+not(
+  child::span[ (@class = 'mrow-base') ] 
+    / child::span[ not( @title = 'speech-extra' ) ]
+                 [ position() = last() ]
+    / self::* [ @class = 'mo-op' ]    
+)
+>>>
+
+
+
+
+\<superscript into squared abd cube\><<<
+<xsl:template match="*|@*|text()|comment()" 
+                           mode="squared" >
+   <xsl:copy>
+     <xsl:choose>
+        <xsl:when test=" @class = 'mrow-super' ">
+           <xsl:apply-templates select="@*" />
+           <span class="mo-op">
+             <xsl:text> squared </xsl:text>
+           </span>
+        </xsl:when>  
+        <xsl:otherwise>
+           <xsl:apply-templates select="*|@*|text()|comment()" />
+        </xsl:otherwise>
+     </xsl:choose>
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+
+
+
+\begin{verbatim}
+<span class="msup">
+  <span class="mrow-base">
+    <span class="mo-op">cos</span>
+  </span>
+  <span class="mrow-super">
+    <span class="begin-script"> superscript </span>
+    <span class="mn">2</span>
+    <span class="end-script"> baseline </span>
+  </span>
+</span>
+\end{verbatim}
+
+
+
+
+\<superscript into squared abd cube\><<<
+<xsl:template match="span[
+    (@class = 'msup') 
+  and
+    (normalize-space(
+      child::span[ (@class = 'mrow-super') ] 
+        / child::span[ (@class != 'begin-script')
+                       and
+                       (@class != 'end-script')
+                     ]
+     ) = '3')
+  and `<su verbose not on op`>
+]" >
+   <xsl:copy>
+      <xsl:apply-templates select="*|@*|text()|comment()" 
+                           mode="cube" />
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+\<superscript into squared abd cube\><<<
+<xsl:template match="*|@*|text()|comment()" 
+                           mode="cube" >
+   <xsl:copy>
+     <xsl:choose>
+        <xsl:when test=" @class = 'mrow-super' ">
+           <xsl:apply-templates select="@*" />
+           <span class="mo-op">
+             <xsl:text> cube </xsl:text>
+           </span>
+        </xsl:when>  
+        <xsl:otherwise>
+           <xsl:apply-templates select="*|@*|text()|comment()" />
+        </xsl:otherwise>
+     </xsl:choose>
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+\<sub superscript 2 and 3 into verbose\><<<
+<set name="m-subsup-2-3" >
+  `<open xslt script`>
+  `<subsup into sub squared and cube`> 
+  `<close xslt script`>
+</set>
+<xslt name="." xml="." xsl="m-subsup-2-3" />
+>>>
+
+
+
+
+
+\<subsup into sub squared and cube\><<<
+<xsl:template match="span[
+    (@class = 'msubsup') 
+  and
+    (normalize-space(
+      child::span[ (@class = 'mrow-super') ] 
+        / child::span[ (@class != 'mid-script')
+                       and
+                       (@class != 'end-script')
+                     ]
+     ) = '2')
+  and `<su verbose not on op`>
+]" >
+   <xsl:copy>
+      <xsl:attribute name="class" >
+         <xsl:text>msub</xsl:text>
+      </xsl:attribute>
+      <xsl:apply-templates select="*|text()|comment()" 
+                           mode="sub-squared" />
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+\<subsup into sub squared and cube\><<<
+<xsl:template match="*|@*|text()|comment()" 
+                           mode="sub-squared" >
+   <xsl:copy>
+     <xsl:choose>
+        <xsl:when test=" @class = 'mrow-sub' ">
+           <xsl:apply-templates select="*[
+                       not( @class = 'end-script' )
+                     ]
+                           |@*|text()|comment()" />
+           <xsl:apply-templates select="
+               following-sibling::*[1] / *[
+                        @class = 'end-script' 
+                  ] " />
+        </xsl:when>  
+        <xsl:when test=" @class = 'mrow-super' ">
+           <xsl:attribute name="class" >
+               <xsl:text>squared-super</xsl:text>
+           </xsl:attribute>
+           <span class="mo-op">
+             <xsl:text> squared </xsl:text>
+           </span>
+        </xsl:when>  
+        <xsl:otherwise>
+           <xsl:apply-templates select="*|@*|text()|comment()" />
+        </xsl:otherwise>
+     </xsl:choose>
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+\<subsup into sub squared and cube\><<<
+<xsl:template match="span[
+    (@class = 'msubsup') 
+  and
+    (normalize-space(
+      child::span[ (@class = 'mrow-super') ] 
+        / child::span[ (@class != 'mid-script')
+                       and
+                       (@class != 'end-script')
+                     ]
+     ) = '3')
+  and `<su verbose not on op`>
+]" >
+   <xsl:copy>
+      <xsl:attribute name="class" >
+         <xsl:text>msub</xsl:text>
+      </xsl:attribute>
+      <xsl:apply-templates select="*|text()|comment()" 
+                           mode="sub-cube" />
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+\<subsup into sub squared and cube\><<<
+<xsl:template match="*|@*|text()|comment()" 
+                           mode="sub-cube" >
+   <xsl:copy>
+     <xsl:choose>
+        <xsl:when test=" @class = 'mrow-sub' ">
+           <xsl:apply-templates select="*[
+                       not( @class = 'end-script' )
+                     ]
+                           |@*|text()|comment()" />
+           <xsl:apply-templates select="
+               following-sibling::*[1] / *[
+                        @class = 'end-script' 
+                  ] " />
+        </xsl:when>  
+        <xsl:when test=" @class = 'mrow-super' ">
+           <xsl:attribute name="class" >
+               <xsl:text>cube-super</xsl:text>
+           </xsl:attribute>
+           <span class="mo-op">
+             <xsl:text> cube </xsl:text>
+           </span>
+        </xsl:when>  
+        <xsl:otherwise>
+           <xsl:apply-templates select="*|@*|text()|comment()" />
+        </xsl:otherwise>
+     </xsl:choose>
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+%%%%%%%%%%%%%
+\subsection{Numeric Subscripts (Rule 77)}
+%%%%%%%%%%%%%
+
+\<compress numeric subscripts\><<<
+  <set name="num-sub" >
+     `<open xslt script`>
+     `<num sub`> 
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="num-sub" />
+>>>
+
+
+
+\<num sub\><<<
+<xsl:template match="span[
+    (@class = 'msub')
+  and
+    (count( child::span[ @class = 'mrow-base' ] 
+           / child::* ) = 1 )
+  and not( ancestor::*[
+      (@class = 'msub')
+    or
+      (@class = 'msup')
+    or
+      (@class = 'msubsup')
+    ] )
+  and
+    not( child::span[ @class = 'mrow-sub' ] 
+           / child::* [
+                not( @title = 'speech-extra' )
+              and
+                not( @class = 'mn' )
+              and
+                not( 
+                  (@class = 'mo-punc')
+                  and
+                  ( . = ',' )
+                  and
+                  preceding-sibling::*[1][ @class = 'mn' ]
+                  and
+                  following-sibling::*[1][ @class = 'mn' ]
+                  and
+                  following-sibling::*[2][ @class = 'mn' ]
+                  and
+                  following-sibling::*[3][ @class = 'mn' ]
+                  and
+                  (  not(following-sibling::*[4])
+                     or
+                     not(following-sibling::*[4][ @class = 'mn' ])
+                  )
+                )
+              and
+                not( 
+                  (@class = 'mo-punc')
+                  and
+                  ( . = '.' )
+                  and
+                  following-sibling::*[1][ @class = 'mn' ]
+                  and
+                  not(
+                    following-sibling::*[ 
+                       (@class = 'mo-punc')
+                     and
+                       (. = '.')
+                    ]
+                  )
+                )
+          ]) 
+]" >
+  <xsl:copy>
+     <xsl:apply-templates select="@*" />     
+     <xsl:apply-templates select="*[1]" />
+     <span class="mrow-sub">
+        <span class="space" title="speech-extra">
+           <xsl:text> </xsl:text> 
+        </span>
+        <xsl:apply-templates
+           select="*[2] / *[ 
+                    not(@title = 'speech-extra')  
+                 and
+                    not(
+                      (@class = 'mo-punc')
+                      and (. = ',')
+                    )  
+          ]" />
+     </span>
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+Emacspeak doesn't read fluently numbers with commas. For instance `10,000' is 
+treated as `ten comma zero zero zero'.
+
+\begin{verbatim}
+<span class="msub">
+  <span class="mrow-base">
+    <span class="mi">x</span>
+  </span>
+  <span class="mrow-sub">
+    <span class="begin-script" title="speech-extra"> subscript </span>
+    <span class="mn">1</span>
+    <span class="end-script" title="speech-extra"> baseline </span>
+  </span>
+</span>
+\end{verbatim}
+
+%%%%%%%%%%%%%
+\subsection{Primes}
+%%%%%%%%%%%%%
+
+\<remove scrip indicators from primes\><<<
+<xsl:template match="span[
+    (@class = 'begin-script')
+  and
+    following-sibling::*[
+         child::span / child::span[ 
+            (@class = 'ch 2032') or (@class = 'ch 2033')
+                                 or (@class = 'ch 2034')
+    ]    ]
+]" >
+</xsl:template> 
+>>>
+
+
+
+\<remove scrip indicators from primes\><<<
+<xsl:template match="span[
+    (@class = 'end-script')
+  and
+    preceding-sibling::*[
+         child::span / child::span[ 
+            (@class = 'ch 2032') or (@class = 'ch 2033') 
+                                 or (@class = 'ch 2034')
+    ]    ]
+]" >
+</xsl:template> 
+>>>
+
+
+
+\begin{verbatim}
+<span class="msup">
+  <span class="mrow-base">
+    <span class="mi">x</span>
+  </span>
+  <span class="mrow-super">
+    <span class="begin-script"> superscript </span>
+    <span class="mo-op">
+      <span class="char">
+        <span class="ch 2033">double prime</span>
+      </span>
+    </span>
+    <span class="end-script"> baseline </span>
+  </span>
+</span>
+\end{verbatim}
+
+\<subsup prime\><<<
+<set name="subsup-prime" >
+   `<open xslt script`>
+   `<compress subsup prime`> 
+   `<close xslt script`>
+</set>
+<xslt name="." xml="." xsl="subsup-prime" />
+>>>
+
+
+\<compress subsup prime\><<<
+<xsl:template match="span[ 
+    (@class = 'msubsup')
+  and
+    (count(
+        child::* [ @class='mrow-super' ]
+       / child::span [ not(@title = 'speech-extra') ] ) = 1)
+  and
+    (count(
+       child::* [ @class='mrow-super' ]
+          / child::span [ not(@title = 'speech-extra') ] 
+          / child::span) = 1)
+  and
+    child::* [ @class='mrow-super' ]
+       / child::span [ not(@title = 'speech-extra') ] 
+       / child::span[ @class='char' ]
+       / child::span[
+            (@class = 'ch 2032') or (@class = 'ch 2033') 
+                                 or (@class = 'ch 2034') 
+         ]  
+]" >  
+  <xsl:copy>
+    <xsl:attribute name="class" >
+       <xsl:text>msub</xsl:text>
+    </xsl:attribute>
+    <span class="mrow-base"> 
+       <xsl:apply-templates select="
+             *[@class = 'mrow-base'] / *
+          " />    
+       <xsl:apply-templates select="
+             *[@class = 'mrow-super']
+             / child::span [ not(@title = 'speech-extra') ] 
+          " />    
+    </span> 
+    <xsl:apply-templates select="*[@class = 'mrow-sub']" />
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+\begin{verbatim}
+<span class="msubsup"> 
+  <span class="mrow-base"> 
+    <span class="mi">x</span> 
+  </span> 
+  <span class="mrow-sub"> 
+    ......
+  </span> 
+  <span class="mrow-super"> 
+    <span class="mid-script" title="speech-extra"> superscript </span> 
+    <span class="mi"> 
+      <span class="char" title="ch-verbose"> 
+        <span class="ch 2032" title="ch-verbose">prime</span> 
+      </span> 
+    </span> 
+  </span> 
+</span> 
+\end{verbatim}
+
+
+%%%%%%%%%%%%%%%%%%
+\section{Over and Under Limit Scripts}
+%%%%%%%%%%%%%%%%%%
+
+
+\<over and under scripts\><<<
+<script element="span::limits-msub-msup" >
+  <set name="smash" >
+     `<open xslt script`>
+     `<smash over and under scripts`>
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="smash" />
+</script> 
+>>>
+
+\<smash over and under scripts\><<<
+<xsl:template match="span[
+       (@class = 'limits-msub-msup')
+     and
+       child::*[ (position() = 1) 
+                 and (@class = 'limits-mrow-base')
+                 and child::*[ (position() = 1) 
+                         and (@class = 'limits-msub-msup')
+       ]             ]
+]" >
+  <xsl:copy>
+     <xsl:apply-templates select="@*" />
+     <xsl:apply-templates select="
+                   *[1]
+                   / *[1] 
+                   / *[ not(@class='limits-mrow-super') ]  " />
+     <xsl:apply-templates select=" *[
+                   preceding-sibling::* 
+                 and
+                   not(@class='limits-mrow-super') ]" />
+     <xsl:apply-templates select="
+                   *[1]
+                   / *[1]
+                   / *[@class='limits-mrow-super' ]  " />
+     <xsl:apply-templates select=" *[
+                   preceding-sibling::* 
+                 and
+                   (@class='limits-mrow-super') ]" />
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+
+\<compress limit script\><<<
+<xsl:template match="span[ @class = 'end-limits-script' ]" >
+  <xsl:if test=" parent::*[ not(following-sibling::*) ] ">
+    <xsl:copy>
+       <xsl:apply-templates select=" @* " />
+       <xsl:choose>
+          <xsl:when test="  
+                parent::*[ preceding-sibling::span[
+                                  @class != 'limits-mrow-base'
+                         ]  ]
+            " >
+            <xsl:text> end scripts </xsl:text>
+          </xsl:when>
+          <xsl:otherwise>
+            <xsl:text> end script </xsl:text>
+          </xsl:otherwise>
+       </xsl:choose>
+    </xsl:copy>
+  </xsl:if>
+</xsl:template> 
+>>>
+
+
+\<compress limit script\><<<
+<xsl:template match="span[ @class = 'begin-limits-script' ]" >
+    <xsl:copy>
+       <xsl:apply-templates select=" @* " />
+       <xsl:choose>
+          <xsl:when test="  
+                parent::*[ @class = 'limits-mrow-super'  ]
+          " >
+              <xsl:apply-templates 
+                  select=" parent::* 
+                           / preceding-sibling::*[1] " 
+                  mode = "extra-over" />
+          </xsl:when>
+          <xsl:when test="  
+                parent::*[ @class = 'limits-mrow-sub'  ]
+          " >
+              <xsl:apply-templates 
+                  select=" parent::* 
+                           / preceding-sibling::*[1] " 
+                  mode = "extra-under" />
+          </xsl:when>
+       </xsl:choose>
+       <xsl:apply-templates select="*|text()|comment()" />
+    </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+\<compress limit script\><<<
+<xsl:template match="*" mode="extra-over" >
+   <xsl:if   test = " self::span[ @class = 'limits-mrow-super' ] " >
+     <xsl:text> over </xsl:text>
+     <xsl:apply-templates select=" preceding-sibling::*[1] " 
+                    mode = "extra-over" />
+   </xsl:if>
+</xsl:template> 
+>>>
+
+
+\<compress limit script\><<<
+<xsl:template match="*" mode="extra-under" >
+   <xsl:if   test = " self::span[ @class = 'limits-mrow-sub' ] " >
+     <xsl:text> under </xsl:text>
+     <xsl:apply-templates select=" preceding-sibling::*[1] " 
+                    mode = "extra-under" />
+   </xsl:if>
+</xsl:template> 
+>>>
+
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%
+\section{Fractions}
+%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%
+\subsection{Outline}
+%%%%%%%%%%%%%
+
+
+
+\<span frac elements\><<<
+<script element="span::mfrac" >
+  <set name="mfrac" >
+     `<open xslt script`>
+     `<frac templates`> 
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="mfrac" />
+</script> 
+>>>
+
+\<frac templates\><<<
+<xsl:template match="span[ @class = 'mfrac' ]" >
+  <xsl:copy>
+    <xsl:choose>
+       `<constant fracs`>
+       `<prepend continuos fractions`>
+       `<tail continuos fractions`>
+       <xsl:otherwise>
+         <xsl:apply-templates select="*|@*|text()|comment()" />
+       </xsl:otherwise>
+    </xsl:choose>
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+%%%%%%%%%%%%%
+\subsection{Continuos Fractions}
+%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%
+\subsubsection{Get Three Bottom Levels}
+%%%%%%%%%%%%%
+
+
+
+\<tail continuos fractions\><<<
+<xsl:when test="          `%check numeral numerator`%
+   (translate(
+      normalize-space(
+      child::span[ @class = 'mrow-numerator' ]),
+                              '0123456789','')= '')
+   and `<check equality of numerators`>
+   and `<check ops before two top fracs`>
+">
+  `<a,b := top 2 pre op values`>
+  <xsl:choose>
+     <xsl:when test="
+         ( translate($a,'0123456789 ','') = '')
+         and (normalize-space($a)=normalize-space($b)) 
+         and starts-with( $c, normalize-space( $a )) 
+         and starts-with(
+               normalize-space(
+                 substring-after( $c, normalize-space( $a )) )
+               , 
+               normalize-space(
+                    child::span[ @class = 'mrow-enumerator' ] /
+                    child::span[ @class = 'mfrac' ] /
+                    preceding-sibling::*[1]                  )
+             )
+     " >
+         <xsl:attribute name="class">
+            <xsl:value-of select=" 'continuous-mfrac' " />
+         </xsl:attribute>         
+         <xsl:apply-templates select="*|text()|comment()" />
+     </xsl:when>
+     <xsl:otherwise>
+         <xsl:apply-templates select="*|@*|text()|comment()" />
+     </xsl:otherwise>
+  </xsl:choose>
+</xsl:when>
+>>>
+
+
+\<check equality of numerators\><<<
+(  normalize-space(
+   child::span[ @class = 'mrow-numerator' ])
+  and
+   normalize-space(
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   child::span[ @class = 'mrow-numerator' ])
+)
+and
+(  normalize-space(
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   child::span[ @class = 'mrow-numerator' ])
+  and
+   normalize-space(
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   child::span[ @class = 'mrow-numerator' ])
+)
+>>>
+
+
+
+\<check ops before two top fracs\><<<
+(  child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   preceding-sibling::*[1][@class = 'mo-bin']
+)
+and  
+(  normalize-space(
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   preceding-sibling::*[1] )
+   =
+   normalize-space(
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   preceding-sibling::*[1] )
+)
+>>>
+
+
+
+\<a,b := top 2 pre op values\><<<
+<xsl:variable name="a">
+   <xsl:apply-templates select="
+         child::span[ @class = 'mrow-enumerator' ] /
+         child::span[ @class = 'mfrac' ] /
+         preceding-sibling::*[2] 
+   "  mode="enum-op" />  
+</xsl:variable>
+<xsl:variable name="b">
+   <xsl:apply-templates select="
+         child::span[ @class = 'mrow-enumerator' ] /
+         child::span[ @class = 'mfrac' ] /
+         child::span[ @class = 'mrow-enumerator' ] /
+         child::span[ @class = 'mfrac' ] /
+         preceding-sibling::*[2] 
+   "  mode="enum-op" />  
+</xsl:variable>
+<xsl:variable name="c">
+   <xsl:value-of select="
+    normalize-space(
+      child::span[ @class = 'mrow-enumerator' ] /
+      child::span[ @class = 'mfrac' ] /
+      child::span[ @class = 'mrow-enumerator' ] /
+      child::span[ @class = 'mfrac' ] /
+      child::span[ @class = 'mrow-enumerator' ] )
+   "  />  
+</xsl:variable>
+>>>
+
+
+\<frac templates\><<<
+<xsl:template match="*" mode="enum-op">
+   <xsl:if test="preceding-sibling::*" >
+      <xsl:apply-templates select=" preceding-sibling::*[1] " />
+   </xsl:if>
+   <xsl:value-of select="." />
+</xsl:template>
+>>>
+
+
+
+
+%%%%%%%%%%%%%
+\subsubsection{Prepend Existing one}
+%%%%%%%%%%%%%
+
+
+
+\<prepend continuos fractions\><<<
+<xsl:when test="
+      (@class = 'mfrac')
+    and
+      child::span[ @class = 'mrow-enumerator' ]
+        / child::span[ @class = 'continuous-mfrac' ]
+    and
+      ( normalize-space(
+          child::span[ @class = 'mrow-numerator' ]
+        )
+        =
+        normalize-space(
+          child::span[ @class = 'mrow-enumerator' ]
+           / child::span[ @class = 'continuous-mfrac' ]
+           / child::span[ @class = 'mrow-numerator' ]  
+        )
+      ) 
+    and `<check equality of op with cont frac`>
+" >
+  `<a,b := cont top 2 pre op values`>
+  <xsl:choose>
+     <xsl:when test="
+         normalize-space($a)=normalize-space($b)
+     " >
+         <xsl:attribute name="class">
+            <xsl:value-of select=" 'continuous-mfrac' " />
+         </xsl:attribute>         
+         <xsl:apply-templates select="*|text()|comment()" />
+     </xsl:when>
+     <xsl:otherwise>
+         <xsl:apply-templates select="*|@*|text()|comment()" />
+     </xsl:otherwise>
+  </xsl:choose>
+</xsl:when> 
+>>>
+
+\<check equality of op with cont frac\><<<
+(
+   normalize-space(
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   preceding-sibling::*[1] )
+   =
+   normalize-space(
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'mfrac' ] /
+   child::span[ @class = 'mrow-enumerator' ] /
+   child::span[ @class = 'continuous-mfrac' ] /
+   preceding-sibling::*[1] )
+)
+>>>
+
+
+\<a,b := cont top 2 pre op values\><<<
+<xsl:variable name="a">
+   <xsl:apply-templates select="
+         child::span[ @class = 'mrow-enumerator' ] /
+         child::span[ @class = 'mcontinuous-mfrac' ] /
+         preceding-sibling::*[2] 
+   "  mode="enum-op" />  
+</xsl:variable>
+<xsl:variable name="b">
+   <xsl:apply-templates select="
+         child::span[ @class = 'mrow-enumerator' ] /
+         child::span[ @class = 'mcontinuous-mfrac' ] /
+         child::span[ @class = 'mrow-enumerator' ] /
+         child::span[ 
+           (@class = 'mfrac') or (@class = 'mcontinuous-mfrac')
+         ] /
+         preceding-sibling::*[2] 
+   "  mode="enum-op" />  
+</xsl:variable>
+>>>
+
+%%%%%%%%%%%%%
+\subsection{Word Fractions}
+%%%%%%%%%%%%%
+
+
+
+\<constant fracs\><<<
+<xsl:when test=" 
+   (string-length(
+      normalize-space(child::span[ @class = 'mrow-numerator' ][1])
+     ) = 1)
+   and
+   (string-length(
+     normalize-space(child::span[ @class = 'mrow-enumerator' ][1])
+     ) = 1)
+">
+   `<a := numerator; b := enumerator`>
+   <xsl:choose>
+      <xsl:when test=" 
+           (translate($a,'123456789','') != '')
+           or
+           (translate($b,'123456789','') != '')
+       " >
+         <xsl:apply-templates select="*|@*|text()|comment()" />
+      </xsl:when>
+      <xsl:when test=" $a &lt; $b ">
+         <xsl:attribute  name="class">
+             <xsl:text>word-frac</xsl:text>
+         </xsl:attribute>
+         `<word numerator`>
+         `<word enumerator`>
+      </xsl:when>
+      <xsl:otherwise>
+         <xsl:apply-templates select="*|@*|text()|comment()" />
+      </xsl:otherwise>
+   </xsl:choose>    
+</xsl:when>
+>>>
+
+
+\<a := numerator; b := enumerator\><<<
+<xsl:variable name="a">
+   <xsl:value-of select="
+      normalize-space(child::span[ @class = 'mrow-numerator' ][1])
+   " />
+</xsl:variable>
+<xsl:variable name="b">
+   <xsl:value-of select="
+      normalize-space(child::span[ @class = 'mrow-enumerator' ][1])
+   " />
+</xsl:variable>
+>>>
+
+
+\<word numerator\><<<
+<xsl:choose>
+   <xsl:when test=" $a = 1 "><xsl:text> one </xsl:text></xsl:when>
+   <xsl:when test=" $a = 2 "><xsl:text> two </xsl:text></xsl:when>
+   <xsl:when test=" $a = 3 "><xsl:text> three </xsl:text></xsl:when>
+   <xsl:when test=" $a = 4 "><xsl:text> four </xsl:text></xsl:when>
+   <xsl:when test=" $a = 5 "><xsl:text> five </xsl:text></xsl:when>
+   <xsl:when test=" $a = 6 "><xsl:text> six </xsl:text></xsl:when>
+   <xsl:when test=" $a = 7 "><xsl:text> seven </xsl:text></xsl:when>
+   <xsl:when test=" $a = 8 "><xsl:text> eight </xsl:text></xsl:when>
+   <xsl:when test=" $a = 9 "><xsl:text> nine </xsl:text></xsl:when>
+</xsl:choose>
+>>>
+
+
+\<word enumerator\><<<
+<xsl:choose>
+   <xsl:when test=" $b = 2 "><xsl:text> half</xsl:text></xsl:when>
+   <xsl:when test=" $b = 3 "><xsl:text> third</xsl:text></xsl:when>
+   <xsl:when test=" $b = 4 "><xsl:text> fourth</xsl:text></xsl:when>
+   <xsl:when test=" $b = 5 "><xsl:text> fifth</xsl:text></xsl:when>
+   <xsl:when test=" $b = 6 "><xsl:text> sixth</xsl:text></xsl:when>
+   <xsl:when test=" $b = 7 "><xsl:text> seventh</xsl:text></xsl:when>
+   <xsl:when test=" $b = 8 "><xsl:text> eighth</xsl:text></xsl:when>
+   <xsl:when test=" $b = 9 "><xsl:text> nineth</xsl:text></xsl:when>
+</xsl:choose>
+<xsl:if test=" $a &gt; 1 "><xsl:text>s</xsl:text></xsl:if>
+<xsl:text> </xsl:text>
+>>>
+
+
+%%%%%%%%%%%%%
+\subsection{Prefix `and' Connectors}
+%%%%%%%%%%%%%
+
+\<fraction 'and' prefix\><<<
+<xsl:template match="span[
+   ((@class = 'mfrac') and 
+                       (translate(
+                          concat(
+                            span[ (@class = 'mrow-numerator')],
+                            span[ (@class = 'mrow-enumerator')] 
+                          )  ,'0123456789','') = '')
+                       and
+                       not(descendant::*/descendant::*/descendant::*)
+    or 
+    (@class = 'word-frac'))
+   and 
+   preceding-sibling::*[1]
+       / self::span[ @class = 'mn']
+ ]" >
+  <xsl:text> and </xsl:text>
+  <xsl:copy>
+    <xsl:apply-templates select="*|@*|text()|comment()" />
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+%%%%%%%%%%%%%
+\subsection{Hyper Complex Fractions}
+%%%%%%%%%%%%%
+
+
+\<set levels for hyper complex fracs\><<<
+<dom name="." xml="." method="fracLevel" class="tex4ht.HtSpk" />
+`<remove xml declaration`>
+>>>
+
+
+
+\<static void fracLevel(dom)\><<<
+public static void fracLevel(Node dom) {
+   setFracLevel(dom.getFirstChild(), 0);
+}
+private static int setFracLevel(Node node, int cont) {
+  int level = 0;
+  String clName = null;
+  if (node.hasChildNodes()) {
+    if (node.hasAttributes()) {
+      Node cl = node.getAttributes().getNamedItem("class");
+      if (cl != null) { clName = cl.getNodeValue(); }
+    }
+    `<count levels inherited from children`>
+    if( clName != null ){
+      `<block on sub and super scripts`>
+      `<deal with continuou fracs`>
+      if (clName.equals("mfrac")) {
+        if( cont > 0 ){
+          `<remove end of nested continuous frac`> 
+        } else if( level > 0 ){
+          `<set extra levels for frac`>
+        }
+        level++;
+  } } }
+  return level;
+}
+>>>
+
+
+\<count levels inherited from children\><<<
+NodeList children = node.getChildNodes();
+int max = 0;
+for (int i = 0; i < children.getLength(); i++) {
+   Node child = children.item(i);
+   if (child.getNodeType() == Node.ELEMENT_NODE) {
+      int d = setFracLevel(child, 
+           (clName != null) &&
+            clName.equals("continuous-mfrac")? 
+            2 : 
+            ((clName != null) &&
+              clName.equals("continuous-mfrac")?
+                (cont-1) : cont)
+        );
+      if (d > max) { max = d; }
+}  }
+level += max;
+>>>
+
+
+
+
+The `cont' parameter is for determining whether the parent and the
+grandparent are frac elements marked as continuous.
+
+
+\<block on sub and super scripts\><<<
+if( clName.equals("msub") || clName.equals("msup") ||
+    clName.equals("msubsup") 
+) {
+   return 0;
+}
+>>>
+
+
+\<deal with continuou fracs\><<<
+if( clName.equals("continuous-mfrac") ) {
+   if( cont > 0 ){   
+     `<remove end of nested continuous frac`>
+   } else { `<set continuous frac`> } `%root of continuous chain`%
+   return 0;
+}
+>>>
+
+
+
+\<set extra levels for frac\><<<
+for (int i = 0; i < children.getLength(); i++) {
+  Node child = children.item(i);
+  if (child.getNodeType() == Node.ELEMENT_NODE) {
+    Node cls = child.getAttributes()
+                    .getNamedItem("class");
+    if (cls != null) {
+      String clsName = cls.getNodeValue();
+      if (clsName.equals("begin-end")) {
+         child = child.getFirstChild();
+         String s = child.getNodeValue();
+         String bg = "", ov = "", en = "";
+         for(int j=0; j<level; j++){ 
+            bg += " begin "; ov += " over "; en += " end ";
+         }
+         s = s.replaceFirst("begin", bg + "begin");
+         s = s.replaceFirst("over", ov + "over");
+         s = s.replaceFirst("end", en + "end");
+         ((org.w3c.dom.Text) child).setData(s);
+} } } }
+>>>
+
+
+\<set continuous frac\><<<
+for (int i = 0; i < children.getLength(); i++) {
+  Node child = children.item(i);
+  if (child.getNodeType() == Node.ELEMENT_NODE) {
+    Node cls = child.getAttributes()
+                   .getNamedItem("class");
+    if (cls != null) {
+       String clsName = cls.getNodeValue();
+       if ( clsName.equals("begin-end")) {
+          child = child.getFirstChild();
+          String s = child.getNodeValue();
+          s = s.replaceFirst("begin", "begin continued");
+          s = s.replaceFirst("end", "end continued");
+          ((org.w3c.dom.Text) child).setData(s);
+} } } }
+>>>
+
+\<remove end of nested continuous frac\><<<
+Node child = node.getLastChild();
+if (child.getNodeType() == Node.ELEMENT_NODE) {
+   Node cls = child.getAttributes() .getNamedItem("class");
+   if (cls != null) {
+      String clsName = cls.getNodeValue();
+      if ( clsName.equals("begin-end")) {
+         node.removeChild( child  );
+}  }  }
+>>>
+
+
+
+
+%%%%%%%%%%%%%
+\subsection{Set Levels on Roots}
+%%%%%%%%%%%%%
+
+\<set levels for roots\><<<
+<dom name="." xml="." method="rootLevel" class="tex4ht.HtSpk" />
+`<remove xml declaration`>
+>>>
+
+\<static void rootLevel(dom)\><<<
+public static void rootLevel(Node dom) {
+   setRootLevel(dom.getFirstChild());
+}
+private static int setRootLevel( Node node ){
+  int level = 0;
+  String clName = null;
+  if (node.hasChildNodes()) {
+    if (node.hasAttributes()) {
+      Node cl = node.getAttributes().getNamedItem("class");
+      if (cl != null) { clName = cl.getNodeValue(); }
+    }
+    `<count root levels inherited from children`>
+    if( clName != null ){
+      `<block for roots`>
+      if( clName.equals("msqrt") || clName.equals("root") ){
+        `<set extra levels for roots`>
+        level++;
+  } } }
+  return level;
+}
+>>>
+
+
+\<count root levels inherited from children\><<<
+NodeList children = node.getChildNodes();
+int max = 0;
+for (int i = 0; i < children.getLength(); i++) {
+  Node child = children.item(i);
+  if (child.getNodeType() == Node.ELEMENT_NODE) {
+    int d = setRootLevel(child);
+    if( d > max ){ max = d; }
+} }
+level += max;
+>>>
+
+
+\<block for roots\><<<
+if( clName.equals("msub") || clName.equals("msup") ||
+    clName.equals("msubsup") 
+) {
+   return 0;
+}
+>>>
+
+
+
+
+\<set extra levels for roots\><<<
+for (int i = 0; i < children.getLength(); i++) {
+  Node child = children.item(i);
+  if (child.getNodeType() == Node.ELEMENT_NODE) {
+    Node cls = child.getAttributes()
+                    .getNamedItem("class");
+    if (cls != null) {
+      String clsName = cls.getNodeValue();
+      if( clsName.equals("begin-root") 
+          || clsName.equals("mid-root") 
+          || clsName.equals("end-root") 
+      ){
+         child = child.getFirstChild();
+         String s = child.getNodeValue();
+         String nested = "";
+         for(int j=0; j<level; j++){ 
+            nested += " nested ";
+         }
+         ((org.w3c.dom.Text) child).setData( nested + s);
+} } } }
+>>>
+
+
+
+%%%%%%%%%%%%%%%%%%
+\section{Odd Ends}
+%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%
+\subsection{Remove Empty Array Cells}
+%%%%%%%%%%%%%
+
+Empty array celles at end of rows can make it more difficult to 
+detect deletable baseline indicators.
+
+
+
+\<remove multline eqnum cell\><<<
+<script element="div::tr" >
+  <set name="bold" >
+     `<open xslt script`>
+     `<remove empty cells from rows`> 
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="bold" />
+</script> 
+>>>
+
+\<remove empty cells from rows\><<<
+<xsl:template match="div[ 
+    parent::div[ @class = 'tr' ]
+    and ( normalize-space(.) = '' )
+    and not( normalize-space(following-sibling::*) != '' )
+]" >
+</xsl:template> 
+>>>
+
+
+
+
+
+%%%%%%%%%%%%%
+\subsection{'minus' into 'negative'}
+%%%%%%%%%%%%%
+
+
+
+\<'minus' into 'negative'\><<<
+<xsl:template match="span[
+    (@class = 'mo-bin')
+  and
+    (   preceding-sibling::*[
+           (position()=1) 
+           and 
+           ( (@title='speech-extra') 
+             or (@class='mo-bin') 
+             or (@class='mo-rel')  )
+        ]
+        and 
+        (
+           following-sibling::*[ (@class='mn') or (@class='mi') ]
+          or
+           (count(following-sibling::*[
+               not(@title = 'speech-extra')
+            ]) = 1)
+        )
+      or
+        not(preceding-sibling::*)
+    )
+  and
+    (normalize-space(.)='minus')
+]" >
+  <xsl:copy>
+    <xsl:attribute name="class">
+       <xsl:text>mo-unary</xsl:text>
+    </xsl:attribute>
+    <xsl:apply-templates select="*|text()|comment()" 
+                         mode="minus-neg" />
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+
+\<'minus' into 'negative'\><<<
+<xsl:template match="*|@*|text()|comment()" mode="minus-neg" >
+  <xsl:copy>
+    <xsl:apply-templates select="*|@*|text()|comment()" 
+                         mode="minus-neg" />
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+\begin{verbatim}
+<span class="begin-script"> subscript </span>
+<span class="mo-bin">
+  <span class="char">
+    <span class="ch 2212">minus</span>
+  </span>
+</Span>
+<span class="mn">2</span>
+\end{verbatim}
+
+
+
+
+\<'minus' into 'negative'\><<<
+<xsl:template match="text()" mode="minus-neg" >
+  <xsl:choose>
+    <xsl:when test=" . = 'minus' " >
+      <xsl:text>negative</xsl:text>
+    </xsl:when>
+    <xsl:otherwise>
+      <xsl:value-of select="." />
+    </xsl:otherwise>
+  </xsl:choose>
+</xsl:template> 
+>>>
+
+%%%%%%%%%%%%%
+\subsection{Short-Cuts for Modifiers}
+%%%%%%%%%%%%%
+
+\<short cut modifiers\><<<
+<script element="span::munder-underline" >
+  <set name="munder" >
+     `<open xslt script`>
+     `<get content template`>
+     `<under modifier templates`> 
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="munder" />
+</script> 
+>>>
+
+
+
+
+\<short cut modifiers\><<<
+<script element="span::mover-overline" >
+  <set name="mover" >
+     `<open xslt script`>
+     `<get content template`>
+     `<over modifier templates`> 
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="mover" />
+</script> 
+>>>
+
+
+
+
+
+
+
+
+
+\<under modifier templates\><<<
+<xsl:template match="span[
+    (@class = 'munder-underline')
+   and
+    child::span[ 
+       (@class = 'mo-0332')
+       and
+       descendant::span[ @class = 'mi' ]
+   ]
+]" >
+  <xsl:copy>
+    <xsl:apply-templates select="@*" />
+    <xsl:variable name="content">
+       <xsl:apply-templates select="*" mode="content" />
+    </xsl:variable>
+    <xsl:choose>
+       <xsl:when test=" 
+          string-length( normalize-space( $content )) = 1
+       " >       
+           <xsl:apply-templates
+              select=" *[ @class != 'begin-end' ] " />
+           <span class="begin-end" title="speech-extra" > 
+              <xsl:text> under bar </xsl:text>
+           </span>
+       </xsl:when>
+       <xsl:otherwise>
+          <xsl:apply-templates select="*|text()|comment()" />
+       </xsl:otherwise>
+    </xsl:choose>
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+
+
+
+
+
+\<over modifier templates\><<<
+<xsl:template match="span[
+    (@class = 'mover-overline')
+   and
+    child::span[ 
+       (@class = 'mo-00AF')
+       and
+       descendant::span[ @class = 'mi' ]
+   ]
+]" >
+  <xsl:copy>
+    <xsl:apply-templates select="@*" />
+    <xsl:variable name="content">
+       <xsl:apply-templates select="*" mode="content" />
+    </xsl:variable>
+    <xsl:choose>
+       <xsl:when test=" 
+          string-length( normalize-space( $content )) = 1
+       " >       
+           <xsl:apply-templates
+              select=" *[ @class != 'begin-end' ] " />
+           <span class="begin-end" title="speech-extra" > 
+              <xsl:text> over bar </xsl:text>
+           </span>
+       </xsl:when>
+       <xsl:otherwise>
+          <xsl:apply-templates select="*|text()|comment()" />
+       </xsl:otherwise>
+    </xsl:choose>
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+\begin{verbatim}
+<span class="mover-overline">
+  <span class="begin-end" title="speech-extra"> modified above </span>
+  <span class="mo-00AF">
+    <span class="mathvariant-bold">
+      <span title="speech-extra" class="begin-end"> bold </span>
+      <span class="mi">
+          <span title="speech-extra" 
+                class="capital-description"> capital </span>
+          Z
+      </span>
+    </span>
+  </span>
+  <span class="begin-end" title="speech-extra"> with bar </span>
+</span>
+\end{verbatim}
+
+
+
+\begin{verbatim}
+<span class="munder-underline">
+  <span class="begin-end" title="speech-extra" > modified under </span>
+  <span class="mo-0332">
+    <span class="mi">x</span>
+  </span>
+  <span class="begin-end" title="speech-extra" > with bar </span>
+</span>
+\end{verbatim}
+
+%%%%%%%%%%%%%
+\subsection{Font Decorations}
+%%%%%%%%%%%%%
+
+
+
+
+
+\<bold math\><<<
+<script element="span::mathvariant-bold" >
+  <set name="bold" >
+     `<open xslt script`>
+     `<get content template`>
+     `<math bold templates`> 
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="bold" />
+</script> 
+>>>
+
+
+
+\<math bold templates\><<<
+<xsl:template match="span[ @class = 'mathvariant-bold' ]" >
+  <xsl:copy>
+    <xsl:apply-templates select="@*" />
+    <xsl:variable name="content">
+       <xsl:apply-templates select="*" mode="content" />
+    </xsl:variable>
+    <xsl:choose>
+       <xsl:when test=" 
+          string-length( normalize-space( $content )) = 1
+       " >
+          <span class="begin-end" title="speech-extra" > 
+             <xsl:text> bold </xsl:text>
+          </span>
+          <xsl:apply-templates select="*|text()|comment()" />
+       </xsl:when>
+       <xsl:otherwise>
+          <span class="begin-end" title="speech-extra" > 
+             <xsl:text> begin bold </xsl:text>
+          </span>
+          <xsl:apply-templates select="*|text()|comment()" />
+          <span class="begin-end" title="speech-extra" > 
+             <xsl:text> end bold </xsl:text>
+          </span>
+       </xsl:otherwise>
+    </xsl:choose>
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+
+%%%%%%%%%%%%%
+\section{Eliminate Inline Math Narrative}
+%%%%%%%%%%%%%
+
+
+%%%%%%%%%%%%%
+\subsection{Simple Sub-Sup (Core Content of Length One)}
+%%%%%%%%%%%%%
+
+
+
+
+\<eliminate inline math narrative\><<<
+<xsl:template match="span[
+    (@class = 'inline-math')
+  and
+    (count( `<math content element`> ) = 1)
+]" >
+  <xsl:copy>
+    <xsl:variable name="content">
+       <xsl:apply-templates
+           select="`<math content element`>"
+             mode="content" />
+    </xsl:variable>
+    <xsl:choose>
+       <xsl:when test=" 
+          string-length( normalize-space( $content )) = 1
+       " >
+          <xsl:attribute name="class">
+             <xsl:text>semi-math</xsl:text>
+          </xsl:attribute>
+          <xsl:apply-templates select="`<math content element`>" />
+       </xsl:when>
+       `<simple sub or sup`>
+       <xsl:otherwise>
+          <xsl:apply-templates select="*|@*|comment()|text()" />
+       </xsl:otherwise>
+    </xsl:choose>
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+
+\<math content element\><<<
+child::*[ not(@title) or (@title != 'speech-extra') ]
+>>>
+
+
+\<simple sub or sup\><<<
+<xsl:when test="  child::*[
+     (position() = 2)
+   and
+     ((@class = 'msub') or (@class = 'msup') or (@class = 'msubsup'))
+]" >
+    <xsl:variable name="content">
+       <xsl:apply-templates select="child::*[2] / child::*[
+                                       @class = 'mrow-base' ]" 
+                            mode="content" />
+    </xsl:variable>
+    <xsl:choose>
+       <xsl:when test=" 
+          string-length( normalize-space( $content )) = 1
+       " >
+          <xsl:attribute name="class">
+             <xsl:text>semi-math</xsl:text>
+          </xsl:attribute>
+          <xsl:apply-templates select="*[2]" />
+`%
+          <span class="end-script" title="speech-extra">
+             <xsl:text> baseline </xsl:text>
+          </span> 
+`%
+      </xsl:when>
+       <xsl:otherwise>
+          <xsl:apply-templates select="*|@*|comment()|text()" />
+       </xsl:otherwise>
+    </xsl:choose>
+</xsl:when>
+>>>
+
+
+\begin{verbatim}
+<span class="inline-math">
+  <span class="msub">
+    <span class="mrow-base">
+      <span class="mi">C</span>
+    </span>
+    <span class="mrow-sub">
+      <span class="mi">i</span>
+    </span>
+  </span>
+</span>
+\end{verbatim}
+
+
+
+
+%%%%%%%%%%%%%
+\subsection{Unary Op on Core Content of Length One}
+%%%%%%%%%%%%%
+
+The `mo-unary' is established in the first pass over inline-math,
+so we need to wait for the second pass with the following.
+
+
+\<eliminate inline math narrative 2\><<<
+<xsl:template match="span[
+    (@class = 'inline-math')
+  and
+    (count( `<math content element`> ) = 2)
+  and
+    child::span[ 
+        (@class = 'mo-unary')
+      and
+        following-sibling::*[1]
+        / descendant::span[ @class = 'mi' ]
+    ]    
+]" >
+  <xsl:copy>
+    <xsl:variable name="content">
+       <xsl:apply-templates
+           select="child::*[ 
+               (not(@title) or (@title != 'speech-extra'))
+               and not( @class = 'mo-unary' )
+             ]"
+             mode="content" />
+    </xsl:variable>
+    <xsl:choose>
+       <xsl:when test=" 
+          string-length( normalize-space( $content )) = 1
+       " >
+          <xsl:attribute name="class">
+             <xsl:text>semi-math</xsl:text>
+          </xsl:attribute>
+          <xsl:apply-templates select="`<math content element`>" />
+       </xsl:when>
+       <xsl:otherwise>
+          <xsl:apply-templates select="*|@*|comment()|text()" />
+       </xsl:otherwise>
+    </xsl:choose>
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+\begin{verbatim}
+<span class="inline-math">
+  <span class="begin-math" title="speech-extra"> begin math </span>
+  <span name="mo-unary">
+    <span class="char" title="ch-verbose">
+      <span class="ch 2212" title="ch-verbose">negative</span>
+    </span>
+  </span>
+  <span class="mathvariant-bold">
+    <span title="speech-extra" class="begin-end"> bold </span>
+    <span title="speech-extra" class="space"><!---->          </span>
+    <span class="mi">
+       <span title="speech-extra" class="capital-description"> 
+         capital
+       </span>
+       A
+    </span>
+  </span>
+  <span class="end-math" title="speech-extra">end math</span>
+</span>
+\end{verbatim}
+
+%%%%%%%%%%%%%%%%%%
+\section{Empty Elements}
+%%%%%%%%%%%%%%%%%%
+
+
+%%%%%%%%%%%%%
+\subsection{Set for W3}
+%%%%%%%%%%%%%
+
+
+
+\<set empty elements for the w3 browser\><<<
+<set name="empty-el" >
+   `<open xslt script`>
+   `<tags for empty templates`> 
+   `<close xslt script`>
+</set>
+<xslt name="." xml="." xsl="empty-el" />
+>>>
+
+\<tags for empty templates\><<<
+<xsl:template match="*[ not(child::*) ]" >
+  <xsl:copy>
+    <xsl:apply-templates select="@*|comment()|text()" />
+    <xsl:if test=" normalize-space(.) = '' " >      
+       <xsl:comment>`<comment`></xsl:comment>
+    </xsl:if>
+  </xsl:copy>
+</xsl:template> 
+>>>
+
+Note: Java 5 complains when comments contain just white spaced.
+
+
+\<comment\><<<
+.>>>
+
+%%%%%%%%%%%%%
+\subsection{Remove Split Arrays}
+%%%%%%%%%%%%%
+
+\<remove empty split entries\><<<
+<script element="div::split-side" >
+  <set name="clean-split" >
+     `<open xslt script`>
+     `<get content template`>
+     `<clean math split`> 
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="clean-split" />
+</script> 
+>>>
+
+
+\<clean math split\><<<
+<xsl:template match=" div[ @class='split-side' ] 
+" >
+    <xsl:variable name="content">
+       <xsl:apply-templates select="*" mode="content" />
+    </xsl:variable>
+    <xsl:if test=" 
+       string-length( normalize-space( $content )) != 0
+    " >       
+       <xsl:copy>
+          <xsl:apply-templates select=" *|@*|text()|comment() " />
+       </xsl:copy>
+    </xsl:if>
+</xsl:template> 
+>>>
+
+
+%%%%%%%%%%%%%%%%%%
+\section{Spaces around Math Identifiers}
+%%%%%%%%%%%%%%%%%%
+
+The following is to cause a pause.  For instance, between the
+variables in \verb+<mi>i</mi><mi>j</mi>+.
+
+
+\<insert pre mi spaces\><<<
+<xsl:template match="span[ @class = 'mi' ]" >
+  <span class="space" title="speech-extra">
+     <xsl:text> </xsl:text> 
+  </span>
+  <xsl:copy>
+     <xsl:apply-templates select="*|@*|text()|comment()" />
+  </xsl:copy>
+</xsl:template>   
+>>>
+
+
+
+%%%%%%%%%%%%%%%%%%
+\section{Prose}
+%%%%%%%%%%%%%%%%%%
+
+%%%%%%%%%%%%%
+\subsection{Tables}
+%%%%%%%%%%%%%
+
+\<measure tablesREMOVE\><<<
+<script element="div::table" >
+  <set name="rows" >
+     `<open xslt script`>
+     `<record number of rows`> 
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="rows" />
+</script> 
+>>>
+
+
+\<record number of rowsREMOVE\><<<
+<xsl:template match=" 
+   div[ (@class='table') 
+        and 
+        ((@title='tabular') or (@title='array'))
+   ] 
+" >
+   <xsl:copy>
+     <xsl:apply-templates select="@*" />
+     <div class="begin-end" title="speech-extra"> 
+        <xsl:value-of select=" 
+           concat( child::*[1] /self::div[
+             (@class = 'begin-end') and (@title = 'speech-extra')
+                   ],
+                   ' with ',
+                   count(child::*) - 2 ,
+                   ' rows '
+           ) " />
+     </div>
+     <xsl:apply-templates select=" *[position() &gt; 1]
+                                  | @* | text() | comment() " />
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+
+
+%%%%%%%%%%%%%
+\subsection{New Theorems}
+%%%%%%%%%%%%%
+
+\<boundaries on theorems\><<<
+<script element="div::newtheorem" >
+  <set name="newtheorem" >
+     `<open xslt script`>
+     `<annotate bounderies of theorems`> 
+     `<tags for empty templates`>
+     `<close xslt script`>
+  </set>
+  <xslt name="." xml="." xsl="newtheorem" />
+</script> 
+>>>
+
+
+\<annotate bounderies of theorems\><<<
+<xsl:template match=" 
+    div[   (@class='newtheorem') 
+         and
+           child::*[1] / child::span[ @class = 'theorem-head' ]
+    ]
+" >
+   <xsl:copy>
+     <xsl:apply-templates select="*|@*|text()|comment()" />
+     <div class="begin-end" title="speech-extra"> 
+        <xsl:value-of select=" 
+           concat( ' end ',
+                   string( child::*[1] / 
+                           child::span[ @class = 'theorem-head' ] )
+           ) " />
+     </div>
+   </xsl:copy>
+</xsl:template> 
+>>>
+
+
+
+
+
+
+
+
+
+%%%%%%%%%%%%%%%%%%
+\section{Shared}
+%%%%%%%%%%%%%%%%%%
+
+
+
+\<open xslt script\><<<
+<![CDATA[ 
+   <xsl:stylesheet version="1.0"
+      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+   >
+      <xsl:output omit-xml-declaration = "yes" />
+>>>
+
+\<close xslt script\><<<
+      <xsl:template match="*|@*|text()|comment()" >
+        <xsl:copy>
+          <xsl:apply-templates select="*|@*|text()|comment()" />
+        </xsl:copy>
+      </xsl:template>
+   </xsl:stylesheet> 
+]]>
+>>>
+
+
+\<get content template\><<<
+<xsl:template match="*" mode="content" >
+  <xsl:choose>
+     <xsl:when test=" @class = 'char' " >   
+       <xsl:text>x</xsl:text>
+     </xsl:when>
+     <xsl:when test=" not( 
+            (@title = 'speech-extra') or (@class = 'accent-char')
+         ) " >
+       <xsl:apply-templates select="*|text()" mode="content" />
+     </xsl:when>
+  </xsl:choose>
+</xsl:template> 
+>>>
+
+
+%%%%%%%%%%%%%%%%%%
+\section{To Do}
+%%%%%%%%%%%%%%%%%%
+
+\begin{itemize}
+\item
+Left subscripts and tensors.
+\end{itemize}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\ifdojava
+\AtEndDocument{\Needs{%
+    "pushd \XTPIPES || exit 1
+     ;  
+     jar cf tex4ht.jar *
+     ;
+     popd
+     ;
+     mkdir -p \TEXMFTEXivBIN || exit 1
+     ;
+     mv \XTPIPES tex4ht.jar \TEXMFTEXivBIN . 
+"}}
+\fi
+
+
+
+\end{document}
+
+
+
+
+
-- 
cgit v1.2.3

