summaryrefslogtreecommitdiff
path: root/support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex
diff options
context:
space:
mode:
Diffstat (limited to 'support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex')
-rw-r--r--support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex2440
1 files changed, 2440 insertions, 0 deletions
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}
+
+
+
+
+