diff options
author | Norbert Preining <norbert@preining.info> | 2021-05-12 03:01:15 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2021-05-12 03:01:15 +0000 |
commit | bcdf6c829c6761de02484473ebe43fa3760adcaa (patch) | |
tree | de384ae80a1a9e34f900739a9478f92a0660a9ef /support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex | |
parent | 4a8a25f4c6acac624cf323115db94d934b19d6b1 (diff) |
CTAN sync 202105120301
Diffstat (limited to 'support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex')
-rw-r--r-- | support/TeX4ht/source/tex4ht-html-speech-xtpipes.tex | 2440 |
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 < $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 > 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() > 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} + + + + + |