move mathml support files outside document root
[lambda.git] / LaTeXMathML.js
diff --git a/LaTeXMathML.js b/LaTeXMathML.js
deleted file mode 100644 (file)
index 7282569..0000000
+++ /dev/null
@@ -1,2368 +0,0 @@
-/*\r
-LaTeXMathML.js\r
-==============\r
-\r
-This file, in this form, is due to Douglas Woodall, June 2006.\r
-It contains JavaScript functions to convert (most simple) LaTeX\r
-math notation to Presentation MathML.  It was obtained by\r
-downloading the file ASCIIMathML.js from\r
-       http://www1.chapman.edu/~jipsen/mathml/asciimathdownload/\r
-and modifying it so that it carries out ONLY those conversions\r
-that would be carried out in LaTeX.  A description of the original\r
-file, with examples, can be found at\r
-       www1.chapman.edu/~jipsen/mathml/asciimath.html\r
-       ASCIIMathML: Math on the web for everyone\r
-\r
-Here is the header notice from the original file:\r
-\r
-ASCIIMathML.js\r
-==============\r
-This file contains JavaScript functions to convert ASCII math notation\r
-to Presentation MathML. The conversion is done while the (X)HTML page\r
-loads, and should work with Firefox/Mozilla/Netscape 7+ and Internet\r
-Explorer 6+MathPlayer (http://www.dessci.com/en/products/mathplayer/).\r
-Just add the next line to your (X)HTML page with this file in the same folder:\r
-<script type="text/javascript" src="ASCIIMathML.js"></script>\r
-This is a convenient and inexpensive solution for authoring MathML.\r
-\r
-Version 1.4.7 Dec 15, 2005, (c) Peter Jipsen http://www.chapman.edu/~jipsen\r
-Latest version at http://www.chapman.edu/~jipsen/mathml/ASCIIMathML.js\r
-For changes see http://www.chapman.edu/~jipsen/mathml/asciimathchanges.txt\r
-If you use it on a webpage, please send the URL to jipsen@chapman.edu\r
-\r
-This program is free software; you can redistribute it and/or modify\r
-it under the terms of the GNU General Public License as published by\r
-the Free Software Foundation; either version 2 of the License, or (at\r
-your option) any later version.\r
-\r
-This program is distributed in the hope that it will be useful,\r
-but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
-General Public License (at http://www.gnu.org/copyleft/gpl.html)\r
-for more details.\r
-\r
-LaTeXMathML.js (ctd)\r
-==============\r
-\r
-The instructions for use are the same as for the original\r
-ASCIIMathML.js, except that of course the line you add to your\r
-file should be\r
-<script type="text/javascript" src="LaTeXMathML.js"></script>\r
-Or use absolute path names if the file is not in the same folder\r
-as your (X)HTML page.\r
-*/\r
-\r
-var checkForMathML = true;   // check if browser can display MathML\r
-var notifyIfNoMathML = true; // display note if no MathML capability\r
-var alertIfNoMathML = false;  // show alert box if no MathML capability\r
-// was "red":\r
-var mathcolor = "";         // change it to "" (to inherit) or any other color\r
-// was "serif":\r
-var mathfontfamily = "";      // change to "" to inherit (works in IE)\r
-                              // or another family (e.g. "arial")\r
-var showasciiformulaonhover = true; // helps students learn ASCIIMath\r
-/*\r
-// Commented out by DRW -- not now used -- see DELIMITERS (twice) near the end\r
-var displaystyle = false;     // puts limits above and below large operators\r
-var decimalsign = ".";        // change to "," if you like, beware of `(1,2)`!\r
-var AMdelimiter1 = "`", AMescape1 = "\\\\`"; // can use other characters\r
-var AMdelimiter2 = "$", AMescape2 = "\\\\\\$", AMdelimiter2regexp = "\\$";\r
-var doubleblankmathdelimiter = false; // if true,  x+1  is equal to `x+1`\r
-                                      // for IE this works only in <!--   -->\r
-//var separatetokens;// has been removed (email me if this is a problem)\r
-*/\r
-var isIE = document.createElementNS==null;\r
-\r
-if (document.getElementById==null)\r
-  alert("This webpage requires a recent browser such as \nMozilla/Netscape 7+ or Internet Explorer 6+MathPlayer")\r
-\r
-// all further global variables start with "AM"\r
-\r
-function AMcreateElementXHTML(t) {\r
-  if (isIE) return document.createElement(t);\r
-  else return document.createElementNS("http://www.w3.org/1999/xhtml",t);\r
-}\r
-\r
-function AMnoMathMLNote() {\r
-  var nd = AMcreateElementXHTML("h3");\r
-  nd.setAttribute("align","center")\r
-  nd.appendChild(AMcreateElementXHTML("p"));\r
-  nd.appendChild(document.createTextNode("To view the "));\r
-  var an = AMcreateElementXHTML("a");\r
-  an.appendChild(document.createTextNode("LaTeXMathML"));\r
-  an.setAttribute("href","http://www.maths.nott.ac.uk/personal/drw/lm.html");\r
-  nd.appendChild(an);\r
-  nd.appendChild(document.createTextNode(" notation use Internet Explorer 6+")); \r
-  an = AMcreateElementXHTML("a");\r
-  an.appendChild(document.createTextNode("MathPlayer"));\r
-  an.setAttribute("href","http://www.dessci.com/en/products/mathplayer/download.htm");\r
-  nd.appendChild(an);\r
-  nd.appendChild(document.createTextNode(" or Netscape/Mozilla/Firefox"));\r
-  nd.appendChild(AMcreateElementXHTML("p"));\r
-  return nd;\r
-}\r
-\r
-function AMisMathMLavailable() {\r
-  if (navigator.appName.slice(0,8)=="Netscape")\r
-    if (navigator.appVersion.slice(0,1)>="5") return null;\r
-    else return AMnoMathMLNote();\r
-  else if (navigator.appName.slice(0,9)=="Microsoft")\r
-    try {\r
-        var ActiveX = new ActiveXObject("MathPlayer.Factory.1");\r
-        return null;\r
-    } catch (e) {\r
-        return AMnoMathMLNote();\r
-    }\r
-  else return AMnoMathMLNote();\r
-}\r
-\r
-// character lists for Mozilla/Netscape fonts\r
-var AMcal = ["\uD835\uDC9C", "\uD835\uDC9D", "\uD835\uDC9E", "\uD835\uDC9F", "\uD835\uDCA0", "\uD835\uDCA1", "\uD835\uDCA2", "\uD835\uDCA3", "\uD835\uDCA4", "\uD835\uDCA5", "\uD835\uDCA6", "\uD835\uDCA7", "\uD835\uDCA8", "\uD835\uDCA9", "\uD835\uDCAA", "\uD835\uDCAB", "\uD835\uDCAC", "\uD835\uDCAD", "\uD835\uDCAE", "\uD835\uDCAF", "\uD835\uDCB0", "\uD835\uDCB1", "\uD835\uDCB2", "\uD835\uDCB3", "\uD835\uDCB4", "\uD835\uDCB5"];\r
-var AMfrk = ["\uD835\uDD04", "\uD835\uDD05", "\uD835\uDD06", "\uD835\uDD07", "\uD835\uDD08", "\uD835\uDD09", "\uD835\uDD0A", "\uD835\uDD0B", "\uD835\uDD0C", "\uD835\uDD0D", "\uD835\uDD0E", "\uD835\uDD0F", "\uD835\uDD10", "\uD835\uDD11", "\uD835\uDD12", "\uD835\uDD13", "\uD835\uDD14", "\uD835\uDD15", "\uD835\uDD16", "\uD835\uDD17", "\uD835\uDD18", "\uD835\uDD19", "\uD835\uDD1A", "\uD835\uDD1B", "\uD835\uDD1C", "\uD835\uDD1D"];\r
-var AMbbb = ["\uD835\uDD38", "\uD835\uDD39", "\uD835\uDD3A", "\uD835\uDD3B", "\uD835\uDD3C", "\uD835\uDD3D", "\uD835\uDD3E", "\uD835\uDD3F", "\uD835\uDD40", "\uD835\uDD41", "\uD835\uDD42", "\uD835\uDD43", "\uD835\uDD44", "\uD835\uDD45", "\uD835\uDD46", "\uD835\uDD47", "\uD835\uDD48", "\uD835\uDD49", "\uD835\uDD4A", "\uD835\uDD4B", "\uD835\uDD4C", "\uD835\uDD4D", "\uD835\uDD4E", "\uD835\uDD4F", "\uD835\uDD50", "\uD835\uDD51"];\r
-\r
-var CONST = 0, UNARY = 1, BINARY = 2, INFIX = 3, LEFTBRACKET = 4,\r
-    RIGHTBRACKET = 5, SPACE = 6, UNDEROVER = 7, DEFINITION = 8,\r
-    TEXT = 9, BIG = 10, LONG = 11, STRETCHY = 12, MATRIX = 13; // token types\r
-\r
-var AMsqrt = {input:"\\sqrt",  tag:"msqrt", output:"sqrt",     ttype:UNARY},\r
-  AMnot = {input:"\\not",      tag:"mnot", output:"not",       ttype:UNARY},\r
-  AMroot = {input:"\\root",    tag:"mroot", output:"root",     ttype:BINARY},\r
-  AMfrac = {input:"\\frac",    tag:"mfrac", output:"/",        ttype:BINARY},\r
-  AMover = {input:"\\stackrel", tag:"mover", output:"stackrel", ttype:BINARY},\r
-  AMatop = {input:"\\atop",    tag:"mfrac", output:"",         ttype:INFIX},\r
-  AMchoose = {input:"\\choose", tag:"mfrac", output:"",                ttype:INFIX},\r
-  AMsub  = {input:"_",         tag:"msub",  output:"_",        ttype:INFIX},\r
-  AMsup  = {input:"^",         tag:"msup",  output:"^",        ttype:INFIX},\r
-  AMtext = {input:"\\mathrm",  tag:"mtext", output:"text",     ttype:TEXT},\r
-  AMmbox = {input:"\\mbox",    tag:"mtext", output:"mbox",     ttype:TEXT};\r
-\r
-// Commented out by DRW to prevent 1/2 turning into a 2-line fraction\r
-// AMdiv   = {input:"/",        tag:"mfrac", output:"/",    ttype:INFIX},\r
-// Commented out by DRW so that " prints literally in equations\r
-// AMquote = {input:"\"",       tag:"mtext", output:"mbox", ttype:TEXT};\r
-\r
-// List of negations obtained from http://frodo.elon.edu/tutorial/tutorial.pdf\r
-var AMRelationNegations = {\r
-  "\u003C":"\u226E", "\u003E":"\u226F", "\u2264":"\u2270", "\u2265":"\u2271",\r
-  "\u003D":"\u2260", "\u2261":"\u2262", "\u227A":"\u2280", "\u227B":"\u2281",\r
-  "\u227C":"\u22E0", "\u227D":"\u22E1", "\u223C":"\u2241", "\u2243":"\u2244",\r
-  "\u2282":"\u2284", "\u2283":"\u2285", "\u2286":"\u2288", "\u2287":"\u2289",\r
-  "\u2248":"\u2249", "\u2245":"\u2247", "\u2291":"\u22E2", "\u2292":"\u22E3",\r
-  "\u224D":"\u226D"\r
-}\r
-\r
-var AMsymbols = [\r
-//Greek letters\r
-{input:"\\alpha",      tag:"mi", output:"\u03B1", ttype:CONST},\r
-{input:"\\beta",       tag:"mi", output:"\u03B2", ttype:CONST},\r
-{input:"\\gamma",      tag:"mi", output:"\u03B3", ttype:CONST},\r
-{input:"\\delta",      tag:"mi", output:"\u03B4", ttype:CONST},\r
-{input:"\\epsilon",    tag:"mi", output:"\u03B5", ttype:CONST},\r
-{input:"\\varepsilon",  tag:"mi", output:"\u025B", ttype:CONST},\r
-{input:"\\zeta",       tag:"mi", output:"\u03B6", ttype:CONST},\r
-{input:"\\eta",                tag:"mi", output:"\u03B7", ttype:CONST},\r
-{input:"\\theta",      tag:"mi", output:"\u03B8", ttype:CONST},\r
-{input:"\\vartheta",   tag:"mi", output:"\u03D1", ttype:CONST},\r
-{input:"\\iota",       tag:"mi", output:"\u03B9", ttype:CONST},\r
-{input:"\\kappa",      tag:"mi", output:"\u03BA", ttype:CONST},\r
-{input:"\\lambda",     tag:"mi", output:"\u03BB", ttype:CONST},\r
-{input:"\\mu",         tag:"mi", output:"\u03BC", ttype:CONST},\r
-{input:"\\nu",         tag:"mi", output:"\u03BD", ttype:CONST},\r
-{input:"\\xi",         tag:"mi", output:"\u03BE", ttype:CONST},\r
-{input:"\\pi",         tag:"mi", output:"\u03C0", ttype:CONST},\r
-{input:"\\varpi",      tag:"mi", output:"\u03D6", ttype:CONST},\r
-{input:"\\rho",                tag:"mi", output:"\u03C1", ttype:CONST},\r
-{input:"\\varrho",     tag:"mi", output:"\u03F1", ttype:CONST},\r
-{input:"\\varsigma",   tag:"mi", output:"\u03C2", ttype:CONST},\r
-{input:"\\sigma",      tag:"mi", output:"\u03C3", ttype:CONST},\r
-{input:"\\tau",                tag:"mi", output:"\u03C4", ttype:CONST},\r
-{input:"\\upsilon",    tag:"mi", output:"\u03C5", ttype:CONST},\r
-{input:"\\phi",                tag:"mi", output:"\u03C6", ttype:CONST},\r
-{input:"\\varphi",     tag:"mi", output:"\u03D5", ttype:CONST},\r
-{input:"\\chi",                tag:"mi", output:"\u03C7", ttype:CONST},\r
-{input:"\\psi",                tag:"mi", output:"\u03C8", ttype:CONST},\r
-{input:"\\omega",      tag:"mi", output:"\u03C9", ttype:CONST},\r
-{input:"\\Gamma",      tag:"mo", output:"\u0393", ttype:CONST},\r
-{input:"\\Delta",      tag:"mo", output:"\u0394", ttype:CONST},\r
-{input:"\\Theta",      tag:"mo", output:"\u0398", ttype:CONST},\r
-{input:"\\Lambda",     tag:"mo", output:"\u039B", ttype:CONST},\r
-{input:"\\Xi",         tag:"mo", output:"\u039E", ttype:CONST},\r
-{input:"\\Pi",         tag:"mo", output:"\u03A0", ttype:CONST},\r
-{input:"\\Sigma",      tag:"mo", output:"\u03A3", ttype:CONST},\r
-{input:"\\Upsilon",    tag:"mo", output:"\u03A5", ttype:CONST},\r
-{input:"\\Phi",                tag:"mo", output:"\u03A6", ttype:CONST},\r
-{input:"\\Psi",                tag:"mo", output:"\u03A8", ttype:CONST},\r
-{input:"\\Omega",      tag:"mo", output:"\u03A9", ttype:CONST},\r
-\r
-//fractions\r
-{input:"\\frac12",     tag:"mo", output:"\u00BD", ttype:CONST},\r
-{input:"\\frac14",     tag:"mo", output:"\u00BC", ttype:CONST},\r
-{input:"\\frac34",     tag:"mo", output:"\u00BE", ttype:CONST},\r
-{input:"\\frac13",     tag:"mo", output:"\u2153", ttype:CONST},\r
-{input:"\\frac23",     tag:"mo", output:"\u2154", ttype:CONST},\r
-{input:"\\frac15",     tag:"mo", output:"\u2155", ttype:CONST},\r
-{input:"\\frac25",     tag:"mo", output:"\u2156", ttype:CONST},\r
-{input:"\\frac35",     tag:"mo", output:"\u2157", ttype:CONST},\r
-{input:"\\frac45",     tag:"mo", output:"\u2158", ttype:CONST},\r
-{input:"\\frac16",     tag:"mo", output:"\u2159", ttype:CONST},\r
-{input:"\\frac56",     tag:"mo", output:"\u215A", ttype:CONST},\r
-{input:"\\frac18",     tag:"mo", output:"\u215B", ttype:CONST},\r
-{input:"\\frac38",     tag:"mo", output:"\u215C", ttype:CONST},\r
-{input:"\\frac58",     tag:"mo", output:"\u215D", ttype:CONST},\r
-{input:"\\frac78",     tag:"mo", output:"\u215E", ttype:CONST},\r
-\r
-//binary operation symbols\r
-{input:"\\pm",         tag:"mo", output:"\u00B1", ttype:CONST},\r
-{input:"\\mp",         tag:"mo", output:"\u2213", ttype:CONST},\r
-{input:"\\triangleleft",tag:"mo", output:"\u22B2", ttype:CONST},\r
-{input:"\\triangleright",tag:"mo",output:"\u22B3", ttype:CONST},\r
-{input:"\\cdot",       tag:"mo", output:"\u22C5", ttype:CONST},\r
-{input:"\\star",       tag:"mo", output:"\u22C6", ttype:CONST},\r
-{input:"\\ast",                tag:"mo", output:"\u002A", ttype:CONST},\r
-{input:"\\times",      tag:"mo", output:"\u00D7", ttype:CONST},\r
-{input:"\\div",                tag:"mo", output:"\u00F7", ttype:CONST},\r
-{input:"\\circ",       tag:"mo", output:"\u2218", ttype:CONST},\r
-//{input:"\\bullet",     tag:"mo", output:"\u2219", ttype:CONST},\r
-{input:"\\bullet",     tag:"mo", output:"\u2022", ttype:CONST},\r
-{input:"\\oplus",      tag:"mo", output:"\u2295", ttype:CONST},\r
-{input:"\\ominus",     tag:"mo", output:"\u2296", ttype:CONST},\r
-{input:"\\otimes",     tag:"mo", output:"\u2297", ttype:CONST},\r
-{input:"\\bigcirc",    tag:"mo", output:"\u25CB", ttype:CONST},\r
-{input:"\\oslash",     tag:"mo", output:"\u2298", ttype:CONST},\r
-{input:"\\odot",       tag:"mo", output:"\u2299", ttype:CONST},\r
-{input:"\\land",       tag:"mo", output:"\u2227", ttype:CONST},\r
-{input:"\\wedge",      tag:"mo", output:"\u2227", ttype:CONST},\r
-{input:"\\lor",                tag:"mo", output:"\u2228", ttype:CONST},\r
-{input:"\\vee",                tag:"mo", output:"\u2228", ttype:CONST},\r
-{input:"\\cap",                tag:"mo", output:"\u2229", ttype:CONST},\r
-{input:"\\cup",                tag:"mo", output:"\u222A", ttype:CONST},\r
-{input:"\\sqcap",      tag:"mo", output:"\u2293", ttype:CONST},\r
-{input:"\\sqcup",      tag:"mo", output:"\u2294", ttype:CONST},\r
-{input:"\\uplus",      tag:"mo", output:"\u228E", ttype:CONST},\r
-{input:"\\amalg",      tag:"mo", output:"\u2210", ttype:CONST},\r
-{input:"\\bigtriangleup",tag:"mo",output:"\u25B3", ttype:CONST},\r
-{input:"\\bigtriangledown",tag:"mo",output:"\u25BD", ttype:CONST},\r
-{input:"\\dag",                tag:"mo", output:"\u2020", ttype:CONST},\r
-{input:"\\dagger",     tag:"mo", output:"\u2020", ttype:CONST},\r
-{input:"\\ddag",       tag:"mo", output:"\u2021", ttype:CONST},\r
-{input:"\\ddagger",    tag:"mo", output:"\u2021", ttype:CONST},\r
-{input:"\\lhd",                tag:"mo", output:"\u22B2", ttype:CONST},\r
-{input:"\\rhd",                tag:"mo", output:"\u22B3", ttype:CONST},\r
-{input:"\\unlhd",      tag:"mo", output:"\u22B4", ttype:CONST},\r
-{input:"\\unrhd",      tag:"mo", output:"\u22B5", ttype:CONST},\r
-\r
-\r
-//BIG Operators\r
-{input:"\\sum",                tag:"mo", output:"\u2211", ttype:UNDEROVER},\r
-{input:"\\prod",       tag:"mo", output:"\u220F", ttype:UNDEROVER},\r
-{input:"\\bigcap",     tag:"mo", output:"\u22C2", ttype:UNDEROVER},\r
-{input:"\\bigcup",     tag:"mo", output:"\u22C3", ttype:UNDEROVER},\r
-{input:"\\bigwedge",   tag:"mo", output:"\u22C0", ttype:UNDEROVER},\r
-{input:"\\bigvee",     tag:"mo", output:"\u22C1", ttype:UNDEROVER},\r
-{input:"\\bigsqcap",   tag:"mo", output:"\u2A05", ttype:UNDEROVER},\r
-{input:"\\bigsqcup",   tag:"mo", output:"\u2A06", ttype:UNDEROVER},\r
-{input:"\\coprod",     tag:"mo", output:"\u2210", ttype:UNDEROVER},\r
-{input:"\\bigoplus",   tag:"mo", output:"\u2A01", ttype:UNDEROVER},\r
-{input:"\\bigotimes",  tag:"mo", output:"\u2A02", ttype:UNDEROVER},\r
-{input:"\\bigodot",    tag:"mo", output:"\u2A00", ttype:UNDEROVER},\r
-{input:"\\biguplus",   tag:"mo", output:"\u2A04", ttype:UNDEROVER},\r
-{input:"\\int",                tag:"mo", output:"\u222B", ttype:CONST},\r
-{input:"\\oint",       tag:"mo", output:"\u222E", ttype:CONST},\r
-\r
-//binary relation symbols\r
-{input:":=",           tag:"mo", output:":=",     ttype:CONST},\r
-{input:"\\lt",         tag:"mo", output:"<",      ttype:CONST},\r
-{input:"\\gt",         tag:"mo", output:">",      ttype:CONST},\r
-{input:"\\ne",         tag:"mo", output:"\u2260", ttype:CONST},\r
-{input:"\\neq",                tag:"mo", output:"\u2260", ttype:CONST},\r
-{input:"\\le",         tag:"mo", output:"\u2264", ttype:CONST},\r
-{input:"\\leq",                tag:"mo", output:"\u2264", ttype:CONST},\r
-{input:"\\leqslant",   tag:"mo", output:"\u2264", ttype:CONST},\r
-{input:"\\ge",         tag:"mo", output:"\u2265", ttype:CONST},\r
-{input:"\\geq",                tag:"mo", output:"\u2265", ttype:CONST},\r
-{input:"\\geqslant",   tag:"mo", output:"\u2265", ttype:CONST},\r
-{input:"\\equiv",      tag:"mo", output:"\u2261", ttype:CONST},\r
-{input:"\\ll",         tag:"mo", output:"\u226A", ttype:CONST},\r
-{input:"\\gg",         tag:"mo", output:"\u226B", ttype:CONST},\r
-{input:"\\doteq",      tag:"mo", output:"\u2250", ttype:CONST},\r
-{input:"\\prec",       tag:"mo", output:"\u227A", ttype:CONST},\r
-{input:"\\succ",       tag:"mo", output:"\u227B", ttype:CONST},\r
-{input:"\\preceq",     tag:"mo", output:"\u227C", ttype:CONST},\r
-{input:"\\succeq",     tag:"mo", output:"\u227D", ttype:CONST},\r
-{input:"\\subset",     tag:"mo", output:"\u2282", ttype:CONST},\r
-{input:"\\supset",     tag:"mo", output:"\u2283", ttype:CONST},\r
-{input:"\\subseteq",   tag:"mo", output:"\u2286", ttype:CONST},\r
-{input:"\\supseteq",   tag:"mo", output:"\u2287", ttype:CONST},\r
-{input:"\\subsetneq",  tag:"mo", output:"\u228A", ttype:CONST},\r
-{input:"\\supsetneq",  tag:"mo", output:"\u228B", ttype:CONST},\r
-{input:"\\sqsubset",   tag:"mo", output:"\u228F", ttype:CONST},\r
-{input:"\\sqsupset",   tag:"mo", output:"\u2290", ttype:CONST},\r
-{input:"\\sqsubseteq",  tag:"mo", output:"\u2291", ttype:CONST},\r
-{input:"\\sqsupseteq",  tag:"mo", output:"\u2292", ttype:CONST},\r
-{input:"\\sim",                tag:"mo", output:"\u223C", ttype:CONST},\r
-{input:"\\simeq",      tag:"mo", output:"\u2243", ttype:CONST},\r
-{input:"\\approx",     tag:"mo", output:"\u2248", ttype:CONST},\r
-{input:"\\cong",       tag:"mo", output:"\u2245", ttype:CONST},\r
-{input:"\\Join",       tag:"mo", output:"\u22C8", ttype:CONST},\r
-{input:"\\bowtie",     tag:"mo", output:"\u22C8", ttype:CONST},\r
-{input:"\\in",         tag:"mo", output:"\u2208", ttype:CONST},\r
-{input:"\\ni",         tag:"mo", output:"\u220B", ttype:CONST},\r
-{input:"\\owns",       tag:"mo", output:"\u220B", ttype:CONST},\r
-{input:"\\propto",     tag:"mo", output:"\u221D", ttype:CONST},\r
-{input:"\\vdash",      tag:"mo", output:"\u22A2", ttype:CONST},\r
-{input:"\\dashv",      tag:"mo", output:"\u22A3", ttype:CONST},\r
-{input:"\\models",     tag:"mo", output:"\u22A8", ttype:CONST},\r
-{input:"\\perp",       tag:"mo", output:"\u22A5", ttype:CONST},\r
-{input:"\\smile",      tag:"mo", output:"\u2323", ttype:CONST},\r
-{input:"\\frown",      tag:"mo", output:"\u2322", ttype:CONST},\r
-{input:"\\asymp",      tag:"mo", output:"\u224D", ttype:CONST},\r
-{input:"\\notin",      tag:"mo", output:"\u2209", ttype:CONST},\r
-\r
-//matrices\r
-{input:"\\begin{eqnarray}",    output:"X",     ttype:MATRIX, invisible:true},\r
-{input:"\\begin{array}",       output:"X",     ttype:MATRIX, invisible:true},\r
-{input:"\\\\",                 output:"}&{",   ttype:DEFINITION},\r
-{input:"\\end{eqnarray}",      output:"}}",    ttype:DEFINITION},\r
-{input:"\\end{array}",         output:"}}",    ttype:DEFINITION},\r
-\r
-//grouping and literal brackets -- ieval is for IE\r
-{input:"\\big",           tag:"mo", output:"X", atval:"1.2", ieval:"2.2", ttype:BIG},\r
-{input:"\\Big",           tag:"mo", output:"X", atval:"1.6", ieval:"2.6", ttype:BIG},\r
-{input:"\\bigg",   tag:"mo", output:"X", atval:"2.2", ieval:"3.2", ttype:BIG},\r
-{input:"\\Bigg",   tag:"mo", output:"X", atval:"2.9", ieval:"3.9", ttype:BIG},\r
-{input:"\\left",   tag:"mo", output:"X", ttype:LEFTBRACKET},\r
-{input:"\\right",  tag:"mo", output:"X", ttype:RIGHTBRACKET},\r
-{input:"{",       output:"{", ttype:LEFTBRACKET,  invisible:true},\r
-{input:"}",       output:"}", ttype:RIGHTBRACKET, invisible:true},\r
-\r
-{input:"(",       tag:"mo", output:"(",      atval:"1", ttype:STRETCHY},\r
-{input:"[",       tag:"mo", output:"[",      atval:"1", ttype:STRETCHY},\r
-{input:"\\lbrack", tag:"mo", output:"[",      atval:"1", ttype:STRETCHY},\r
-{input:"\\{",     tag:"mo", output:"{",      atval:"1", ttype:STRETCHY},\r
-{input:"\\lbrace", tag:"mo", output:"{",      atval:"1", ttype:STRETCHY},\r
-{input:"\\langle", tag:"mo", output:"\u2329", atval:"1", ttype:STRETCHY},\r
-{input:"\\lfloor", tag:"mo", output:"\u230A", atval:"1", ttype:STRETCHY},\r
-{input:"\\lceil",  tag:"mo", output:"\u2308", atval:"1", ttype:STRETCHY},\r
-\r
-// rtag:"mi" causes space to be inserted before a following sin, cos, etc.\r
-// (see function AMparseExpr() )\r
-{input:")",      tag:"mo",output:")",      rtag:"mi",atval:"1",ttype:STRETCHY},\r
-{input:"]",      tag:"mo",output:"]",      rtag:"mi",atval:"1",ttype:STRETCHY},\r
-{input:"\\rbrack",tag:"mo",output:"]",     rtag:"mi",atval:"1",ttype:STRETCHY},\r
-{input:"\\}",    tag:"mo",output:"}",      rtag:"mi",atval:"1",ttype:STRETCHY},\r
-{input:"\\rbrace",tag:"mo",output:"}",     rtag:"mi",atval:"1",ttype:STRETCHY},\r
-{input:"\\rangle",tag:"mo",output:"\u232A", rtag:"mi",atval:"1",ttype:STRETCHY},\r
-{input:"\\rfloor",tag:"mo",output:"\u230B", rtag:"mi",atval:"1",ttype:STRETCHY},\r
-{input:"\\rceil", tag:"mo",output:"\u2309", rtag:"mi",atval:"1",ttype:STRETCHY},\r
-\r
-// "|", "\\|", "\\vert" and "\\Vert" modified later: lspace = rspace = 0em\r
-{input:"|",            tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},\r
-{input:"\\|",          tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},\r
-{input:"\\vert",       tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},\r
-{input:"\\Vert",       tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},\r
-{input:"\\mid",                tag:"mo", output:"\u2223", atval:"1", ttype:STRETCHY},\r
-{input:"\\parallel",   tag:"mo", output:"\u2225", atval:"1", ttype:STRETCHY},\r
-{input:"/",            tag:"mo", output:"/",   atval:"1.01", ttype:STRETCHY},\r
-{input:"\\backslash",  tag:"mo", output:"\u2216", atval:"1", ttype:STRETCHY},\r
-{input:"\\setminus",   tag:"mo", output:"\\",     ttype:CONST},\r
-\r
-//miscellaneous symbols\r
-{input:"\\!",    tag:"mspace", atname:"width", atval:"-0.167em", ttype:SPACE},\r
-{input:"\\,",    tag:"mspace", atname:"width", atval:"0.167em", ttype:SPACE},\r
-{input:"\\>",    tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},\r
-{input:"\\:",    tag:"mspace", atname:"width", atval:"0.222em", ttype:SPACE},\r
-{input:"\\;",    tag:"mspace", atname:"width", atval:"0.278em", ttype:SPACE},\r
-{input:"~",      tag:"mspace", atname:"width", atval:"0.333em", ttype:SPACE},\r
-{input:"\\quad",  tag:"mspace", atname:"width", atval:"1em", ttype:SPACE},\r
-{input:"\\qquad", tag:"mspace", atname:"width", atval:"2em", ttype:SPACE},\r
-//{input:"{}",           tag:"mo", output:"\u200B", ttype:CONST}, // zero-width\r
-{input:"\\prime",      tag:"mo", output:"\u2032", ttype:CONST},\r
-{input:"'",            tag:"mo", output:"\u02B9", ttype:CONST},\r
-{input:"''",           tag:"mo", output:"\u02BA", ttype:CONST},\r
-{input:"'''",          tag:"mo", output:"\u2034", ttype:CONST},\r
-{input:"''''",         tag:"mo", output:"\u2057", ttype:CONST},\r
-{input:"\\ldots",      tag:"mo", output:"\u2026", ttype:CONST},\r
-{input:"\\cdots",      tag:"mo", output:"\u22EF", ttype:CONST},\r
-{input:"\\vdots",      tag:"mo", output:"\u22EE", ttype:CONST},\r
-{input:"\\ddots",      tag:"mo", output:"\u22F1", ttype:CONST},\r
-{input:"\\forall",     tag:"mo", output:"\u2200", ttype:CONST},\r
-{input:"\\exists",     tag:"mo", output:"\u2203", ttype:CONST},\r
-{input:"\\Re",         tag:"mo", output:"\u211C", ttype:CONST},\r
-{input:"\\Im",         tag:"mo", output:"\u2111", ttype:CONST},\r
-{input:"\\aleph",      tag:"mo", output:"\u2135", ttype:CONST},\r
-{input:"\\hbar",       tag:"mo", output:"\u210F", ttype:CONST},\r
-{input:"\\ell",                tag:"mo", output:"\u2113", ttype:CONST},\r
-{input:"\\wp",         tag:"mo", output:"\u2118", ttype:CONST},\r
-{input:"\\emptyset",   tag:"mo", output:"\u2205", ttype:CONST},\r
-{input:"\\infty",      tag:"mo", output:"\u221E", ttype:CONST},\r
-{input:"\\surd",       tag:"mo", output:"\\sqrt{}", ttype:DEFINITION},\r
-{input:"\\partial",    tag:"mo", output:"\u2202", ttype:CONST},\r
-{input:"\\nabla",      tag:"mo", output:"\u2207", ttype:CONST},\r
-{input:"\\triangle",   tag:"mo", output:"\u25B3", ttype:CONST},\r
-{input:"\\therefore",  tag:"mo", output:"\u2234", ttype:CONST},\r
-{input:"\\angle",      tag:"mo", output:"\u2220", ttype:CONST},\r
-//{input:"\\\\ ",        tag:"mo", output:"\u00A0", ttype:CONST},\r
-{input:"\\diamond",    tag:"mo", output:"\u22C4", ttype:CONST},\r
-//{input:"\\Diamond",    tag:"mo", output:"\u25CA", ttype:CONST},\r
-{input:"\\Diamond",    tag:"mo", output:"\u25C7", ttype:CONST},\r
-{input:"\\neg",                tag:"mo", output:"\u00AC", ttype:CONST},\r
-{input:"\\lnot",       tag:"mo", output:"\u00AC", ttype:CONST},\r
-{input:"\\bot",                tag:"mo", output:"\u22A5", ttype:CONST},\r
-{input:"\\top",                tag:"mo", output:"\u22A4", ttype:CONST},\r
-{input:"\\square",     tag:"mo", output:"\u25AB", ttype:CONST},\r
-{input:"\\Box",                tag:"mo", output:"\u25A1", ttype:CONST},\r
-{input:"\\wr",         tag:"mo", output:"\u2240", ttype:CONST},\r
-\r
-//standard functions\r
-//Note UNDEROVER *must* have tag:"mo" to work properly\r
-{input:"\\arccos", tag:"mi", output:"arccos", ttype:UNARY, func:true},\r
-{input:"\\arcsin", tag:"mi", output:"arcsin", ttype:UNARY, func:true},\r
-{input:"\\arctan", tag:"mi", output:"arctan", ttype:UNARY, func:true},\r
-{input:"\\arg",           tag:"mi", output:"arg",    ttype:UNARY, func:true},\r
-{input:"\\cos",           tag:"mi", output:"cos",    ttype:UNARY, func:true},\r
-{input:"\\cosh",   tag:"mi", output:"cosh",   ttype:UNARY, func:true},\r
-{input:"\\cot",           tag:"mi", output:"cot",    ttype:UNARY, func:true},\r
-{input:"\\coth",   tag:"mi", output:"coth",   ttype:UNARY, func:true},\r
-{input:"\\csc",           tag:"mi", output:"csc",    ttype:UNARY, func:true},\r
-{input:"\\deg",           tag:"mi", output:"deg",    ttype:UNARY, func:true},\r
-{input:"\\det",           tag:"mi", output:"det",    ttype:UNARY, func:true},\r
-{input:"\\dim",           tag:"mi", output:"dim",    ttype:UNARY, func:true}, //CONST?\r
-{input:"\\exp",           tag:"mi", output:"exp",    ttype:UNARY, func:true},\r
-{input:"\\gcd",           tag:"mi", output:"gcd",    ttype:UNARY, func:true}, //CONST?\r
-{input:"\\hom",           tag:"mi", output:"hom",    ttype:UNARY, func:true},\r
-{input:"\\inf",              tag:"mo", output:"inf",    ttype:UNDEROVER},\r
-{input:"\\ker",           tag:"mi", output:"ker",    ttype:UNARY, func:true},\r
-{input:"\\lg",    tag:"mi", output:"lg",     ttype:UNARY, func:true},\r
-{input:"\\lim",              tag:"mo", output:"lim",    ttype:UNDEROVER},\r
-{input:"\\liminf",    tag:"mo", output:"liminf", ttype:UNDEROVER},\r
-{input:"\\limsup",    tag:"mo", output:"limsup", ttype:UNDEROVER},\r
-{input:"\\ln",    tag:"mi", output:"ln",     ttype:UNARY, func:true},\r
-{input:"\\log",           tag:"mi", output:"log",    ttype:UNARY, func:true},\r
-{input:"\\max",              tag:"mo", output:"max",    ttype:UNDEROVER},\r
-{input:"\\min",              tag:"mo", output:"min",    ttype:UNDEROVER},\r
-{input:"\\Pr",    tag:"mi", output:"Pr",     ttype:UNARY, func:true},\r
-{input:"\\sec",           tag:"mi", output:"sec",    ttype:UNARY, func:true},\r
-{input:"\\sin",           tag:"mi", output:"sin",    ttype:UNARY, func:true},\r
-{input:"\\sinh",   tag:"mi", output:"sinh",   ttype:UNARY, func:true},\r
-{input:"\\sup",              tag:"mo", output:"sup",    ttype:UNDEROVER},\r
-{input:"\\tan",           tag:"mi", output:"tan",    ttype:UNARY, func:true},\r
-{input:"\\tanh",   tag:"mi", output:"tanh",   ttype:UNARY, func:true},\r
-\r
-//arrows\r
-{input:"\\gets",               tag:"mo", output:"\u2190", ttype:CONST},\r
-{input:"\\leftarrow",          tag:"mo", output:"\u2190", ttype:CONST},\r
-{input:"\\to",                 tag:"mo", output:"\u2192", ttype:CONST},\r
-{input:"\\rightarrow",         tag:"mo", output:"\u2192", ttype:CONST},\r
-{input:"\\leftrightarrow",     tag:"mo", output:"\u2194", ttype:CONST},\r
-{input:"\\uparrow",            tag:"mo", output:"\u2191", ttype:CONST},\r
-{input:"\\downarrow",          tag:"mo", output:"\u2193", ttype:CONST},\r
-{input:"\\updownarrow",                tag:"mo", output:"\u2195", ttype:CONST},\r
-{input:"\\Leftarrow",          tag:"mo", output:"\u21D0", ttype:CONST},\r
-{input:"\\Rightarrow",         tag:"mo", output:"\u21D2", ttype:CONST},\r
-{input:"\\Leftrightarrow",     tag:"mo", output:"\u21D4", ttype:CONST},\r
-{input:"\\iff", tag:"mo", output:"~\\Longleftrightarrow~", ttype:DEFINITION},\r
-{input:"\\Uparrow",            tag:"mo", output:"\u21D1", ttype:CONST},\r
-{input:"\\Downarrow",          tag:"mo", output:"\u21D3", ttype:CONST},\r
-{input:"\\Updownarrow",                tag:"mo", output:"\u21D5", ttype:CONST},\r
-{input:"\\mapsto",             tag:"mo", output:"\u21A6", ttype:CONST},\r
-{input:"\\longleftarrow",      tag:"mo", output:"\u2190", ttype:LONG},\r
-{input:"\\longrightarrow",     tag:"mo", output:"\u2192", ttype:LONG},\r
-{input:"\\longleftrightarrow", tag:"mo", output:"\u2194", ttype:LONG},\r
-{input:"\\Longleftarrow",      tag:"mo", output:"\u21D0", ttype:LONG},\r
-{input:"\\Longrightarrow",     tag:"mo", output:"\u21D2", ttype:LONG},\r
-{input:"\\Longleftrightarrow",  tag:"mo", output:"\u21D4", ttype:LONG},\r
-{input:"\\longmapsto",         tag:"mo", output:"\u21A6", ttype:CONST},\r
-                                                       // disaster if LONG\r
-\r
-//commands with argument\r
-AMsqrt, AMnot, AMroot, AMfrac, AMover, AMsub, AMsup, AMtext, AMmbox, AMatop, AMchoose,\r
-\r
-//AMdiv, AMquote,\r
-\r
-//diacritical marks\r
-{input:"\\acute",      tag:"mover",  output:"\u00B4", ttype:UNARY, acc:true},\r
-//{input:"\\acute",      tag:"mover",  output:"\u0317", ttype:UNARY, acc:true},\r
-//{input:"\\acute",      tag:"mover",  output:"\u0301", ttype:UNARY, acc:true},\r
-//{input:"\\grave",      tag:"mover",  output:"\u0300", ttype:UNARY, acc:true},\r
-//{input:"\\grave",      tag:"mover",  output:"\u0316", ttype:UNARY, acc:true},\r
-{input:"\\grave",      tag:"mover",  output:"\u0060", ttype:UNARY, acc:true},\r
-{input:"\\breve",      tag:"mover",  output:"\u02D8", ttype:UNARY, acc:true},\r
-{input:"\\check",      tag:"mover",  output:"\u02C7", ttype:UNARY, acc:true},\r
-{input:"\\dot",                tag:"mover",  output:".",      ttype:UNARY, acc:true},\r
-{input:"\\ddot",       tag:"mover",  output:"..",     ttype:UNARY, acc:true},\r
-//{input:"\\ddot",       tag:"mover",  output:"\u00A8", ttype:UNARY, acc:true},\r
-{input:"\\mathring",   tag:"mover",  output:"\u00B0", ttype:UNARY, acc:true},\r
-{input:"\\vec",                tag:"mover",  output:"\u20D7", ttype:UNARY, acc:true},\r
-{input:"\\overrightarrow",tag:"mover",output:"\u20D7", ttype:UNARY, acc:true},\r
-{input:"\\overleftarrow",tag:"mover", output:"\u20D6", ttype:UNARY, acc:true},\r
-{input:"\\hat",                tag:"mover",  output:"\u005E", ttype:UNARY, acc:true},\r
-{input:"\\widehat",    tag:"mover",  output:"\u0302", ttype:UNARY, acc:true},\r
-{input:"\\tilde",      tag:"mover",  output:"~",      ttype:UNARY, acc:true},\r
-//{input:"\\tilde",      tag:"mover",  output:"\u0303", ttype:UNARY, acc:true},\r
-{input:"\\widetilde",  tag:"mover",  output:"\u02DC", ttype:UNARY, acc:true},\r
-{input:"\\bar",                tag:"mover",  output:"\u203E", ttype:UNARY, acc:true},\r
-{input:"\\overbrace",  tag:"mover",  output:"\uFE37", ttype:UNARY, acc:true}, //Changed unicode overbrace\r
-{input:"\\overbracket", tag:"mover",  output:"\u23B4", ttype:UNARY, acc:true}, //old overbrace = overbracket\r
-{input:"\\overline",   tag:"mover",  output:"\u00AF", ttype:UNARY, acc:true},\r
-{input:"\\underbrace",  tag:"munder", output:"\uFE38", ttype:UNARY, acc:true}, //Changed unicode underbrace\r
-{input:"\\underbracket",tag:"munder", output:"\u23B5", ttype:UNARY, acc:true}, //old underbrace = underbracket\r
-{input:"\\underline",  tag:"munder", output:"\u00AF", ttype:UNARY, acc:true},\r
-//{input:"underline",  tag:"munder", output:"\u0332", ttype:UNARY, acc:true},\r
-\r
-//typestyles and fonts\r
-{input:"\\displaystyle",tag:"mstyle",atname:"displaystyle",atval:"true", ttype:UNARY},\r
-{input:"\\textstyle",tag:"mstyle",atname:"displaystyle",atval:"false", ttype:UNARY},\r
-{input:"\\scriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"1", ttype:UNARY},\r
-{input:"\\scriptscriptstyle",tag:"mstyle",atname:"scriptlevel",atval:"2", ttype:UNARY},\r
-{input:"\\textrm", tag:"mstyle", output:"\\mathrm", ttype: DEFINITION},\r
-{input:"\\mathbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},\r
-{input:"\\textbf", tag:"mstyle", atname:"mathvariant", atval:"bold", ttype:UNARY},\r
-{input:"\\mathit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},\r
-{input:"\\textit", tag:"mstyle", atname:"mathvariant", atval:"italic", ttype:UNARY},\r
-{input:"\\mathtt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},\r
-{input:"\\texttt", tag:"mstyle", atname:"mathvariant", atval:"monospace", ttype:UNARY},\r
-{input:"\\mathsf", tag:"mstyle", atname:"mathvariant", atval:"sans-serif", ttype:UNARY},\r
-{input:"\\mathbb", tag:"mstyle", atname:"mathvariant", atval:"double-struck", ttype:UNARY, codes:AMbbb},\r
-{input:"\\mathcal",tag:"mstyle", atname:"mathvariant", atval:"script", ttype:UNARY, codes:AMcal},\r
-{input:"\\mathfrak",tag:"mstyle",atname:"mathvariant", atval:"fraktur",ttype:UNARY, codes:AMfrk},\r
-{input:"\\textcolor",tag:"mstyle",atname:"mathvariant", atval:"mathcolor", ttype:BINARY},\r
-{input:"\\colorbox",tag:"mstyle",atname:"mathvariant", atval:"background", ttype:BINARY}\r
-]; \r
-\r
-function compareNames(s1,s2) {\r
-  if (s1.input > s2.input) return 1\r
-  else return -1;\r
-}\r
-\r
-var AMnames = []; //list of input symbols\r
-\r
-function AMinitSymbols() {\r
-  AMsymbols.sort(compareNames);\r
-  for (i=0; i<AMsymbols.length; i++) AMnames[i] = AMsymbols[i].input;\r
-}\r
-\r
-var AMmathml = "http://www.w3.org/1998/Math/MathML";\r
-\r
-function AMcreateElementMathML(t) {\r
-  if (isIE) return document.createElement("m:"+t);\r
-  else return document.createElementNS(AMmathml,t);\r
-}\r
-\r
-function AMcreateMmlNode(t,frag) {\r
-//  var node = AMcreateElementMathML(name);\r
-  if (isIE) var node = document.createElement("m:"+t);\r
-  else var node = document.createElementNS(AMmathml,t);\r
-  node.appendChild(frag);\r
-  return node;\r
-}\r
-\r
-function newcommand(oldstr,newstr) {\r
-  AMsymbols = AMsymbols.concat([{input:oldstr, tag:"mo", output:newstr,\r
-                                 ttype:DEFINITION}]);\r
-}\r
-\r
-function AMremoveCharsAndBlanks(str,n) {\r
-//remove n characters and any following blanks\r
-  var st;\r
-  st = str.slice(n);\r
-  for (var i=0; i<st.length && st.charCodeAt(i)<=32; i=i+1);\r
-  return st.slice(i);\r
-}\r
-\r
-function AMposition(arr, str, n) {\r
-// return position >=n where str appears or would be inserted\r
-// assumes arr is sorted\r
-  if (n==0) {\r
-    var h,m;\r
-    n = -1;\r
-    h = arr.length;\r
-    while (n+1<h) {\r
-      m = (n+h) >> 1;\r
-      if (arr[m]<str) n = m; else h = m;\r
-    }\r
-    return h;\r
-  } else\r
-    for (var i=n; i<arr.length && arr[i]<str; i++);\r
-  return i; // i=arr.length || arr[i]>=str\r
-}\r
-\r
-function AMgetSymbol(str) {\r
-//return maximal initial substring of str that appears in names\r
-//return null if there is none\r
-  var k = 0; //new pos\r
-  var j = 0; //old pos\r
-  var mk; //match pos\r
-  var st;\r
-  var tagst;\r
-  var match = "";\r
-  var more = true;\r
-  for (var i=1; i<=str.length && more; i++) {\r
-    st = str.slice(0,i); //initial substring of length i\r
-    j = k;\r
-    k = AMposition(AMnames, st, j);\r
-    if (k<AMnames.length && str.slice(0,AMnames[k].length)==AMnames[k]){\r
-      match = AMnames[k];\r
-      mk = k;\r
-      i = match.length;\r
-    }\r
-    more = k<AMnames.length && str.slice(0,AMnames[k].length)>=AMnames[k];\r
-  }\r
-  AMpreviousSymbol=AMcurrentSymbol;\r
-  if (match!=""){\r
-    AMcurrentSymbol=AMsymbols[mk].ttype;\r
-    return AMsymbols[mk];\r
-  }\r
-  AMcurrentSymbol=CONST;\r
-  k = 1;\r
-  st = str.slice(0,1); //take 1 character\r
-  if ("0"<=st && st<="9") tagst = "mn";\r
-  else tagst = (("A">st || st>"Z") && ("a">st || st>"z")?"mo":"mi");\r
-/*\r
-// Commented out by DRW (not fully understood, but probably to do with\r
-// use of "/" as an INFIX version of "\\frac", which we don't want):\r
-//}\r
-//if (st=="-" && AMpreviousSymbol==INFIX) {\r
-//  AMcurrentSymbol = INFIX;  //trick "/" into recognizing "-" on second parse\r
-//  return {input:st, tag:tagst, output:st, ttype:UNARY, func:true};\r
-//}\r
-*/\r
-  return {input:st, tag:tagst, output:st, ttype:CONST};\r
-}\r
-\r
-\r
-/*Parsing ASCII math expressions with the following grammar\r
-v ::= [A-Za-z] | greek letters | numbers | other constant symbols\r
-u ::= sqrt | text | bb | other unary symbols for font commands\r
-b ::= frac | root | stackrel   binary symbols\r
-l ::= { | \left                        left brackets\r
-r ::= } | \right               right brackets\r
-S ::= v | lEr | uS | bSS       Simple expression\r
-I ::= S_S | S^S | S_S^S | S    Intermediate expression\r
-E ::= IE | I/I                 Expression\r
-Each terminal symbol is translated into a corresponding mathml node.*/\r
-\r
-var AMpreviousSymbol,AMcurrentSymbol;\r
-\r
-function AMparseSexpr(str) { //parses str and returns [node,tailstr,(node)tag]\r
-  var symbol, node, result, result2, i, st,// rightvert = false,\r
-    newFrag = document.createDocumentFragment();\r
-  str = AMremoveCharsAndBlanks(str,0);\r
-  symbol = AMgetSymbol(str);             //either a token or a bracket or empty\r
-  if (symbol == null || symbol.ttype == RIGHTBRACKET)\r
-    return [null,str,null];\r
-  if (symbol.ttype == DEFINITION) {\r
-    str = symbol.output+AMremoveCharsAndBlanks(str,symbol.input.length);\r
-    symbol = AMgetSymbol(str);\r
-    if (symbol == null || symbol.ttype == RIGHTBRACKET)\r
-      return [null,str,null];\r
-  }\r
-  str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
-  switch (symbol.ttype) {\r
-  case SPACE:\r
-    node = AMcreateElementMathML(symbol.tag);\r
-    node.setAttribute(symbol.atname,symbol.atval);\r
-    return [node,str,symbol.tag];\r
-  case UNDEROVER:\r
-    if (isIE) {\r
-      if (symbol.input.substr(0,4) == "\\big") {   // botch for missing symbols\r
-       str = "\\"+symbol.input.substr(4)+str;     // make \bigcup = \cup etc.\r
-       symbol = AMgetSymbol(str);\r
-       symbol.ttype = UNDEROVER;\r
-       str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
-      }\r
-    }\r
-    return [AMcreateMmlNode(symbol.tag,\r
-                       document.createTextNode(symbol.output)),str,symbol.tag];\r
-  case CONST:\r
-    var output = symbol.output;\r
-    if (isIE) {\r
-      if (symbol.input == "'")\r
-       output = "\u2032";\r
-      else if (symbol.input == "''")\r
-       output = "\u2033";\r
-      else if (symbol.input == "'''")\r
-       output = "\u2033\u2032";\r
-      else if (symbol.input == "''''")\r
-       output = "\u2033\u2033";\r
-      else if (symbol.input == "\\square")\r
-       output = "\u25A1";      // same as \Box\r
-      else if (symbol.input.substr(0,5) == "\\frac") {\r
-                                               // botch for missing fractions\r
-       var denom = symbol.input.substr(6,1);\r
-       if (denom == "5" || denom == "6") {\r
-         str = symbol.input.replace(/\\frac/,"\\frac ")+str;\r
-         return [node,str,symbol.tag];\r
-       }\r
-      }\r
-    }\r
-    node = AMcreateMmlNode(symbol.tag,document.createTextNode(output));\r
-    return [node,str,symbol.tag];\r
-  case LONG:  // added by DRW\r
-    node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));\r
-    node.setAttribute("minsize","1.5");\r
-    node.setAttribute("maxsize","1.5");\r
-    node = AMcreateMmlNode("mover",node);\r
-    node.appendChild(AMcreateElementMathML("mspace"));\r
-    return [node,str,symbol.tag];\r
-  case STRETCHY:  // added by DRW\r
-    if (isIE && symbol.input == "\\backslash")\r
-       symbol.output = "\\";   // doesn't expand, but then nor does "\u2216"\r
-    node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));\r
-    if (symbol.input == "|" || symbol.input == "\\vert" ||\r
-       symbol.input == "\\|" || symbol.input == "\\Vert") {\r
-         node.setAttribute("lspace","0em");\r
-         node.setAttribute("rspace","0em");\r
-    }\r
-    node.setAttribute("maxsize",symbol.atval);  // don't allow to stretch here\r
-    if (symbol.rtag != null)\r
-      return [node,str,symbol.rtag];\r
-    else\r
-      return [node,str,symbol.tag];\r
-  case BIG:  // added by DRW\r
-    var atval = symbol.atval;\r
-    if (isIE)\r
-      atval = symbol.ieval;\r
-    symbol = AMgetSymbol(str);\r
-    if (symbol == null)\r
-       return [null,str,null];\r
-    str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
-    node = AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output));\r
-    if (isIE) {                // to get brackets to expand\r
-      var space = AMcreateElementMathML("mspace");\r
-      space.setAttribute("height",atval+"ex");\r
-      node = AMcreateMmlNode("mrow",node);\r
-      node.appendChild(space);\r
-    } else {           // ignored in IE\r
-      node.setAttribute("minsize",atval);\r
-      node.setAttribute("maxsize",atval);\r
-    }\r
-    return [node,str,symbol.tag];\r
-  case LEFTBRACKET:   //read (expr+)\r
-    if (symbol.input == "\\left") { // left what?\r
-      symbol = AMgetSymbol(str);\r
-      if (symbol != null) {\r
-       if (symbol.input == ".")\r
-         symbol.invisible = true;\r
-       str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
-      }\r
-    }\r
-    result = AMparseExpr(str,true,false);\r
-    if (symbol==null ||\r
-       (typeof symbol.invisible == "boolean" && symbol.invisible))\r
-      node = AMcreateMmlNode("mrow",result[0]);\r
-    else {\r
-      node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));\r
-      node = AMcreateMmlNode("mrow",node);\r
-      node.appendChild(result[0]);\r
-    }\r
-    return [node,result[1],result[2]];\r
-  case MATRIX:  //read (expr+)\r
-    if (symbol.input == "\\begin{array}") {\r
-      var mask = "";\r
-      symbol = AMgetSymbol(str);\r
-      str = AMremoveCharsAndBlanks(str,0);\r
-      if (symbol == null)\r
-       mask = "l";\r
-      else {\r
-       str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
-       if (symbol.input != "{")\r
-         mask = "l";\r
-       else do {\r
-         symbol = AMgetSymbol(str);\r
-         if (symbol != null) {\r
-           str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
-           if (symbol.input != "}")\r
-             mask = mask+symbol.input;\r
-         }\r
-       } while (symbol != null && symbol.input != "" && symbol.input != "}");\r
-      }\r
-      result = AMparseExpr("{"+str,true,true);\r
-//    if (result[0]==null) return [AMcreateMmlNode("mo",\r
-//                        document.createTextNode(symbol.input)),str];\r
-      node = AMcreateMmlNode("mtable",result[0]);\r
-      mask = mask.replace(/l/g,"left ");\r
-      mask = mask.replace(/r/g,"right ");\r
-      mask = mask.replace(/c/g,"center ");\r
-      node.setAttribute("columnalign",mask);\r
-      node.setAttribute("displaystyle","false");\r
-      if (isIE)\r
-       return [node,result[1],null];\r
-// trying to get a *little* bit of space around the array\r
-// (IE already includes it)\r
-      var lspace = AMcreateElementMathML("mspace");\r
-      lspace.setAttribute("width","0.167em");\r
-      var rspace = AMcreateElementMathML("mspace");\r
-      rspace.setAttribute("width","0.167em");\r
-      var node1 = AMcreateMmlNode("mrow",lspace);\r
-      node1.appendChild(node);\r
-      node1.appendChild(rspace);\r
-      return [node1,result[1],null];\r
-    } else {   // eqnarray\r
-      result = AMparseExpr("{"+str,true,true);\r
-      node = AMcreateMmlNode("mtable",result[0]);\r
-      if (isIE)\r
-       node.setAttribute("columnspacing","0.25em"); // best in practice?\r
-      else\r
-       node.setAttribute("columnspacing","0.167em"); // correct (but ignored?)\r
-      node.setAttribute("columnalign","right center left");\r
-      node.setAttribute("displaystyle","true");\r
-      node = AMcreateMmlNode("mrow",node);\r
-      return [node,result[1],null];\r
-    }\r
-  case TEXT:\r
-      if (str.charAt(0)=="{") i=str.indexOf("}");\r
-      else i = 0;\r
-      if (i==-1)\r
-                i = str.length;\r
-      st = str.slice(1,i);\r
-      if (st.charAt(0) == " ") {\r
-       node = AMcreateElementMathML("mspace");\r
-       node.setAttribute("width","0.33em");    // was 1ex\r
-       newFrag.appendChild(node);\r
-      }\r
-      newFrag.appendChild(\r
-        AMcreateMmlNode(symbol.tag,document.createTextNode(st)));\r
-      if (st.charAt(st.length-1) == " ") {\r
-       node = AMcreateElementMathML("mspace");\r
-       node.setAttribute("width","0.33em");    // was 1ex\r
-       newFrag.appendChild(node);\r
-      }\r
-      str = AMremoveCharsAndBlanks(str,i+1);\r
-      return [AMcreateMmlNode("mrow",newFrag),str,null];\r
-  case UNARY:\r
-      result = AMparseSexpr(str);\r
-      if (result[0]==null) return [AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)),str];\r
-      if (typeof symbol.func == "boolean" && symbol.func) { // functions hack\r
-               st = str.charAt(0);\r
-//             if (st=="^" || st=="_" || st=="/" || st=="|" || st==",") {\r
-               if (st=="^" || st=="_" || st==",") {\r
-                 return [AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)),str,symbol.tag];\r
-        } else {\r
-                 node = AMcreateMmlNode("mrow",AMcreateMmlNode(symbol.tag,document.createTextNode(symbol.output)));\r
-                 if (isIE) {\r
-               var space = AMcreateElementMathML("mspace");\r
-               space.setAttribute("width","0.167em");\r
-               node.appendChild(space);\r
-                 }\r
-                 node.appendChild(result[0]);\r
-                 return [node,result[1],symbol.tag];\r
-        }\r
-      }\r
-      if (symbol.input == "\\sqrt") {          // sqrt\r
-            if (isIE) {        // set minsize, for \surd\r
-               var space = AMcreateElementMathML("mspace");\r
-               space.setAttribute("height","1.2ex");\r
-               space.setAttribute("width","0em");      // probably no effect\r
-               node = AMcreateMmlNode(symbol.tag,result[0])\r
-//             node.setAttribute("minsize","1");       // ignored\r
-//             node = AMcreateMmlNode("mrow",node);  // hopefully unnecessary\r
-                       node.appendChild(space);\r
-                       return [node,result[1],symbol.tag];\r
-               } else\r
-                 return [AMcreateMmlNode(symbol.tag,result[0]),result[1],symbol.tag];\r
-      } else if (typeof symbol.acc == "boolean" && symbol.acc) {   // accent\r
-             node = AMcreateMmlNode(symbol.tag,result[0]);\r
-             var output = symbol.output;\r
-                 if (isIE) {\r
-                       if (symbol.input == "\\hat")\r
-                               output = "\u0302";\r
-                       else if (symbol.input == "\\widehat")\r
-                               output = "\u005E";\r
-                       else if (symbol.input == "\\bar")\r
-                               output = "\u00AF";\r
-                       else if (symbol.input == "\\grave")\r
-                               output = "\u0300";\r
-                       else if (symbol.input == "\\tilde")\r
-                               output = "\u0303";\r
-               }\r
-               var node1 = AMcreateMmlNode("mo",document.createTextNode(output));\r
-               if (symbol.input == "\\vec" || symbol.input == "\\check")\r
-                                               // don't allow to stretch\r
-                   node1.setAttribute("maxsize","1.2");\r
-                // why doesn't "1" work?  \vec nearly disappears in firefox\r
-               if (isIE && symbol.input == "\\bar")\r
-           node1.setAttribute("maxsize","0.5");\r
-               if (symbol.input == "\\underbrace" || symbol.input == "\\underline")\r
-                 node1.setAttribute("accentunder","true");\r
-               else\r
-                 node1.setAttribute("accent","true");\r
-               node.appendChild(node1);\r
-               if (symbol.input == "\\overbrace" || symbol.input == "\\underbrace")\r
-                 node.ttype = UNDEROVER;\r
-               return [node,result[1],symbol.tag];\r
-          } else if (symbol.input == "\\not") {                // not\r
-        // added by infinity0 on 2009-12-15 to implement \not command\r
-        text = result[0].childNodes[0].nodeValue;\r
-        if (typeof text == "string" && text.length == 1 && text in AMRelationNegations) {\r
-          result[0].childNodes[0].nodeValue = AMRelationNegations[text];\r
-          return [AMcreateMmlNode(symbol.tag,result[0]),result[1],symbol.tag];\r
-        }\r
-        return [AMcreateMmlNode("mo",document.createTextNode("\\")),"not " + str,symbol.tag];\r
-      } else {                       // font change or displaystyle command\r
-        if (!isIE && typeof symbol.codes != "undefined") {\r
-          for (i=0; i<result[0].childNodes.length; i++)\r
-            if (result[0].childNodes[i].nodeName=="mi" || result[0].nodeName=="mi") {\r
-              st = (result[0].nodeName=="mi"?result[0].firstChild.nodeValue:\r
-                              result[0].childNodes[i].firstChild.nodeValue);\r
-              var newst = [];\r
-              for (var j=0; j<st.length; j++)\r
-                if (st.charCodeAt(j)>64 && st.charCodeAt(j)<91) \r
-                               {  newst = newst + symbol.codes[st.charCodeAt(j)-65] }\r
-                   // String.fromCharCode(symbol.codes[st.charCodeAt(j)-65]); alert(newst); }\r
-                else newst = newst + st.charAt(j);\r
-              if (result[0].nodeName=="mi")\r
-                result[0]=AMcreateElementMathML("mo").\r
-                          appendChild(document.createTextNode(newst));\r
-              else result[0].replaceChild(AMcreateElementMathML("mo").\r
-          appendChild(document.createTextNode(newst)),result[0].childNodes[i]);\r
-            }\r
-        }\r
-        node = AMcreateMmlNode(symbol.tag,result[0]);\r
-        node.setAttribute(symbol.atname,symbol.atval);\r
-       if (symbol.input == "\\scriptstyle" ||\r
-           symbol.input == "\\scriptscriptstyle")\r
-               node.setAttribute("displaystyle","false");\r
-       return [node,result[1],symbol.tag];\r
-      }\r
-  case BINARY:\r
-    result = AMparseSexpr(str);\r
-    if (result[0]==null) return [AMcreateMmlNode("mo",document.createTextNode(symbol.input)),str,null];\r
-    result2 = AMparseSexpr(result[1]);\r
-    if (result2[0]==null) return [AMcreateMmlNode("mo",document.createTextNode(symbol.input)),str,null];\r
-    //added by J. Knisley to allow \textcolor and \colorbox within equations\r
-    if (symbol.input=="\\textcolor" || symbol.input=="\\colorbox") { \r
-      var tclr = str.match(/\{\s*([#\w]+)\s*\}/); //get's color from beginning of str\r
-      str = str.replace(/\{\s*[#\w]+\s*\}/,""); \r
-      if(tclr!=null) {\r
-         if(IsColorName.test(tclr[1].toLowerCase())) {\r
-              tclr=LaTeXColor[tclr[1].toLowerCase()];\r
-         } else {\r
-           tclr=tclr[1]; // no checking for valid color!!\r
-         } \r
-         node = AMcreateElementMathML("mstyle");\r
-         node.setAttribute(symbol.atval,tclr);\r
-         node.appendChild(result2[0]); \r
-         return [node,result2[1],symbol.tag];  \r
-      } \r
-    }  \r
-    if (symbol.input=="\\root" || symbol.input=="\\stackrel") newFrag.appendChild(result2[0]);\r
-    newFrag.appendChild(result[0]);\r
-    if (symbol.input=="\\frac") newFrag.appendChild(result2[0]);\r
-    return [AMcreateMmlNode(symbol.tag,newFrag),result2[1],symbol.tag];\r
-  case INFIX:\r
-    str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
-    return [AMcreateMmlNode("mo",document.createTextNode(symbol.output)),\r
-       str,symbol.tag];\r
-  default:\r
-    return [AMcreateMmlNode(symbol.tag,        //its a constant\r
-       document.createTextNode(symbol.output)),str,symbol.tag];\r
-  }\r
-}\r
-\r
-function AMparseIexpr(str) {\r
-  var symbol, sym1, sym2, node, result, tag, underover;\r
-  str = AMremoveCharsAndBlanks(str,0);\r
-  sym1 = AMgetSymbol(str);\r
-  result = AMparseSexpr(str);\r
-  node = result[0];\r
-  str = result[1];\r
-  tag = result[2];\r
-  symbol = AMgetSymbol(str);\r
-  if (symbol.ttype == INFIX) {\r
-    str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
-    result = AMparseSexpr(str);\r
-    if (result[0] == null) // show box in place of missing argument\r
-      result[0] = AMcreateMmlNode("mo",document.createTextNode("\u25A1"));\r
-    str = result[1];\r
-    tag = result[2];\r
-    if (symbol.input == "_" || symbol.input == "^") {\r
-      sym2 = AMgetSymbol(str);\r
-      tag = null;      // no space between x^2 and a following sin, cos, etc.\r
-// This is for \underbrace and \overbrace\r
-      underover = ((sym1.ttype == UNDEROVER) || (node.ttype == UNDEROVER));\r
-//    underover = (sym1.ttype == UNDEROVER);\r
-      if (symbol.input == "_" && sym2.input == "^") {\r
-        str = AMremoveCharsAndBlanks(str,sym2.input.length);\r
-        var res2 = AMparseSexpr(str);\r
-       str = res2[1];\r
-       tag = res2[2];  // leave space between x_1^2 and a following sin etc.\r
-        node = AMcreateMmlNode((underover?"munderover":"msubsup"),node);\r
-        node.appendChild(result[0]);\r
-        node.appendChild(res2[0]);\r
-      } else if (symbol.input == "_") {\r
-       node = AMcreateMmlNode((underover?"munder":"msub"),node);\r
-        node.appendChild(result[0]);\r
-      } else {\r
-       node = AMcreateMmlNode((underover?"mover":"msup"),node);\r
-        node.appendChild(result[0]);\r
-      }\r
-      node = AMcreateMmlNode("mrow",node); // so sum does not stretch\r
-    } else {\r
-      node = AMcreateMmlNode(symbol.tag,node);\r
-      if (symbol.input == "\\atop" || symbol.input == "\\choose")\r
-       node.setAttribute("linethickness","0ex");\r
-      node.appendChild(result[0]);\r
-      if (symbol.input == "\\choose")\r
-       node = AMcreateMmlNode("mfenced",node);\r
-    }\r
-  }\r
-  return [node,str,tag];\r
-}\r
-\r
-function AMparseExpr(str,rightbracket,matrix) {\r
-  var symbol, node, result, i, tag,\r
-  newFrag = document.createDocumentFragment();\r
-  do {\r
-    str = AMremoveCharsAndBlanks(str,0);\r
-    result = AMparseIexpr(str);\r
-    node = result[0];\r
-    str = result[1];\r
-    tag = result[2];\r
-    symbol = AMgetSymbol(str);\r
-    if (node!=undefined) {\r
-      if ((tag == "mn" || tag == "mi") && symbol!=null &&\r
-       typeof symbol.func == "boolean" && symbol.func) {\r
-                       // Add space before \sin in 2\sin x or x\sin x\r
-         var space = AMcreateElementMathML("mspace");\r
-         space.setAttribute("width","0.167em");\r
-         node = AMcreateMmlNode("mrow",node);\r
-         node.appendChild(space);\r
-      }\r
-      newFrag.appendChild(node);\r
-    }\r
-  } while ((symbol.ttype != RIGHTBRACKET)\r
-        && symbol!=null && symbol.output!="");\r
-  tag = null;\r
-  if (symbol.ttype == RIGHTBRACKET) {\r
-    if (symbol.input == "\\right") { // right what?\r
-      str = AMremoveCharsAndBlanks(str,symbol.input.length);\r
-      symbol = AMgetSymbol(str);\r
-      if (symbol != null && symbol.input == ".")\r
-       symbol.invisible = true;\r
-      if (symbol != null)\r
-       tag = symbol.rtag;\r
-    }\r
-    if (symbol!=null)\r
-      str = AMremoveCharsAndBlanks(str,symbol.input.length); // ready to return\r
-    var len = newFrag.childNodes.length;\r
-    if (matrix &&\r
-      len>0 && newFrag.childNodes[len-1].nodeName == "mrow" && len>1 &&\r
-      newFrag.childNodes[len-2].nodeName == "mo" &&\r
-      newFrag.childNodes[len-2].firstChild.nodeValue == "&") { //matrix\r
-       var pos = []; // positions of ampersands\r
-        var m = newFrag.childNodes.length;\r
-        for (i=0; matrix && i<m; i=i+2) {\r
-          pos[i] = [];\r
-          node = newFrag.childNodes[i];\r
-         for (var j=0; j<node.childNodes.length; j++)\r
-           if (node.childNodes[j].firstChild.nodeValue=="&")\r
-             pos[i][pos[i].length]=j;\r
-        }\r
-       var row, frag, n, k, table = document.createDocumentFragment();\r
-       for (i=0; i<m; i=i+2) {\r
-         row = document.createDocumentFragment();\r
-         frag = document.createDocumentFragment();\r
-         node = newFrag.firstChild; // <mrow> -&-&...&-&- </mrow>\r
-         n = node.childNodes.length;\r
-         k = 0;\r
-         for (j=0; j<n; j++) {\r
-           if (typeof pos[i][k] != "undefined" && j==pos[i][k]){\r
-             node.removeChild(node.firstChild); //remove &\r
-             row.appendChild(AMcreateMmlNode("mtd",frag));\r
-             k++;\r
-           } else frag.appendChild(node.firstChild);\r
-         }\r
-         row.appendChild(AMcreateMmlNode("mtd",frag));\r
-         if (newFrag.childNodes.length>2) {\r
-           newFrag.removeChild(newFrag.firstChild); //remove <mrow> </mrow>\r
-           newFrag.removeChild(newFrag.firstChild); //remove <mo>&</mo>\r
-         }\r
-         table.appendChild(AMcreateMmlNode("mtr",row));\r
-       }\r
-       return [table,str];\r
-    }\r
-    if (typeof symbol.invisible != "boolean" || !symbol.invisible) {\r
-      node = AMcreateMmlNode("mo",document.createTextNode(symbol.output));\r
-      newFrag.appendChild(node);\r
-    }\r
-  }\r
-  return [newFrag,str,tag];\r
-}\r
-\r
-function AMparseMath(str) {\r
-  var result, node = AMcreateElementMathML("mstyle");\r
-  //added by J. Knisley to allow limited implementation of \color \r
-  var cclr = str.match(/\\color\s*\{\s*([#\w]+)\s*\}/);\r
-  str = str.replace(/\\color\s*\{\s*[#\w]+\s*\}/g,"");\r
-  if(cclr!=null) {\r
-     if(IsColorName.test(cclr[1].toLowerCase())) {\r
-           cclr=LaTeXColor[cclr[1].toLowerCase()];\r
-     } else {\r
-        cclr=cclr[1]; // no checking for valid color!!\r
-     }\r
-     node.setAttribute("mathcolor",cclr);\r
-  } else { \r
-    if (mathcolor != "") node.setAttribute("mathcolor",mathcolor);\r
-  };\r
-  if (mathfontfamily != "") node.setAttribute("fontfamily",mathfontfamily);\r
-  node.appendChild(AMparseExpr(str.replace(/^\s+/g,""),false,false)[0]);\r
-  node = AMcreateMmlNode("math",node);\r
-  if (showasciiformulaonhover)                      //fixed by djhsu so newline\r
-    node.setAttribute("title",str.replace(/\s+/g," "));//does not show in Gecko\r
-  if (false ) { //&& mathfontfamily != "" && (isIE || mathfontfamily != "serif")) {\r
-    var fnode = AMcreateElementXHTML("font");\r
-    fnode.setAttribute("face",mathfontfamily);\r
-    fnode.appendChild(node);\r
-    return fnode;\r
-  }\r
-  return node;\r
-}\r
-\r
-function AMstrarr2docFrag(arr, linebreaks) {\r
-  var newFrag=document.createDocumentFragment();\r
-  var expr = false;\r
-  for (var i=0; i<arr.length; i++) {\r
-    if (expr) newFrag.appendChild(AMparseMath(arr[i]));\r
-    else {\r
-      var arri = (linebreaks ? arr[i].split("\n\n") : [arr[i]]);\r
-      newFrag.appendChild(AMcreateElementXHTML("span").\r
-      appendChild(document.createTextNode(arri[0])));\r
-      for (var j=1; j<arri.length; j++) {\r
-        newFrag.appendChild(AMcreateElementXHTML("p"));\r
-        newFrag.appendChild(AMcreateElementXHTML("span").\r
-        appendChild(document.createTextNode(arri[j])));\r
-      }\r
-    }\r
-    expr = !expr;\r
-  }\r
-  return newFrag;\r
-}\r
-\r
-function AMprocessNodeR(n, linebreaks) {\r
-  var mtch, str, arr, frg, i;\r
-  if (n.childNodes.length == 0) {\r
-   if ((n.nodeType!=8 || linebreaks) &&\r
-    n.parentNode.nodeName!="form" && n.parentNode.nodeName!="FORM" &&\r
-    n.parentNode.nodeName!="textarea" && n.parentNode.nodeName!="TEXTAREA" &&\r
-    n.parentNode.nodeName!="pre" && n.parentNode.nodeName!="PRE") {\r
-    str = n.nodeValue;\r
-    if (!(str == null)) {\r
-      str = str.replace(/\r\n\r\n/g,"\n\n");\r
-      str = str.replace(/\x20+/g," ");\r
-      str = str.replace(/\s*\r\n/g," ");\r
-// DELIMITERS:\r
-      mtch = (str.indexOf("\$")==-1 ? false : true);\r
-      str = str.replace(/([^\\])\$/g,"$1 \$");\r
-      str = str.replace(/^\$/," \$");  // in case \$ at start of string\r
-      arr = str.split(" \$");\r
-      for (i=0; i<arr.length; i++)\r
-         arr[i]=arr[i].replace(/\\\$/g,"\$");\r
-         if (arr.length>1 || mtch) {\r
-           if (checkForMathML) {\r
-             checkForMathML = false;\r
-             var nd = AMisMathMLavailable();\r
-             AMnoMathML = nd != null;\r
-                if (AMnoMathML && notifyIfNoMathML)\r
-                   if (alertIfNoMathML)\r
-                       alert("To view the ASCIIMathML notation use Internet Explorer 6 +\nMathPlayer (free from www.dessci.com)\n\\r
-                              or Firefox/Mozilla/Netscape");\r
-            else AMbody.insertBefore(nd,AMbody.childNodes[0]);\r
-        }\r
-        if (!AMnoMathML) {\r
-          frg = AMstrarr2docFrag(arr,n.nodeType==8);\r
-          var len = frg.childNodes.length;\r
-          n.parentNode.replaceChild(frg,n);\r
-          return len-1;\r
-        } else return 0;\r
-      }\r
-    }\r
-   } else return 0;\r
-  } else if (n.nodeName!="math") {\r
-    for (i=0; i<n.childNodes.length; i++)\r
-      i += AMprocessNodeR(n.childNodes[i], linebreaks);\r
-  }\r
-  return 0;\r
-}\r
-\r
-function AMprocessNode(n, linebreaks, spanclassAM) {\r
-  var frag,st;\r
-  if (spanclassAM!=null) {\r
-    frag = document.getElementsByTagName("span")\r
-    for (var i=0;i<frag.length;i++)\r
-      if (frag[i].className == "AM")\r
-        AMprocessNodeR(frag[i],linebreaks);\r
-  } else {\r
-    try {\r
-      st = n.innerHTML;\r
-    } catch(err) {}\r
-// DELIMITERS:\r
-    if (st==null || st.indexOf("\$")!=-1)\r
-      AMprocessNodeR(n,linebreaks);\r
-  }\r
-  if (isIE) { //needed to match size and font of formula to surrounding text\r
-    frag = document.getElementsByTagName('math');\r
-    for (var i=0;i<frag.length;i++) frag[i].update()\r
-  }\r
-}\r
-\r
-/* Below is LaTeX pre-processing to produce CSS supported */\r
-/* standard latex structures*/\r
-/* Jeff Knisley (knisleyj@etsu.edu)\r
-/* Supported in part by the Howard Hughes Medical Institute */\r
-/* as part of the Symbiosis Project: HHMI #52005872 */\r
-\r
-var inAppendix = false;\r
-var sectionCntr = 0;\r
-var IEcommentWarning = true;\r
-var biblist = [];\r
-var bibcntr = 0;\r
-\r
-var LaTeXCounter = [];\r
-LaTeXCounter["definition"] = 0;\r
-LaTeXCounter["proposition"] = 0;\r
-LaTeXCounter["lemma"] = 0;\r
-LaTeXCounter["theorem"] = 0;\r
-LaTeXCounter["corollary"] = 0;\r
-LaTeXCounter["example"] = 0;\r
-LaTeXCounter["exercise"] = 0;\r
-LaTeXCounter["subsection"] = 0;\r
-LaTeXCounter["subsubsection"] = 0;\r
-LaTeXCounter["figure"] = 0;\r
-LaTeXCounter["equation"] = 0;\r
-LaTeXCounter["table"] = 0;\r
-LaTeXCounter["label"] = 0;\r
-\r
-var LaTeXColor = [];\r
-LaTeXColor["greenyellow"]    = "#D9FF4F";\r
-LaTeXColor["yellow"]         = "#FFFF00";\r
-LaTeXColor["goldenrod"]      = "#FFE529";\r
-LaTeXColor["dandelion"]      = "#FFB529";\r
-LaTeXColor["apricot"]        = "#FFAD7A";\r
-LaTeXColor["peach"]          = "#FF804D";\r
-LaTeXColor["melon"]          = "#FF8A80";\r
-LaTeXColor["yelloworange"]   = "#FF9400";\r
-LaTeXColor["orange"]         = "#FF6321";\r
-LaTeXColor["burntorange"]    = "#FF7D00";\r
-LaTeXColor["bittersweet"]    = "#C20300";\r
-LaTeXColor["redorange"]      = "#FF3B21";\r
-LaTeXColor["mahogany"]       = "#A60000";\r
-LaTeXColor["maroon"]         = "#AD0000";\r
-LaTeXColor["brickred"]       = "#B80000";\r
-LaTeXColor["red"]            = "#FF0000";\r
-LaTeXColor["orangered"]      = "#FF0080";\r
-LaTeXColor["rubinered"]      = "#FF00DE";\r
-LaTeXColor["wildstrawberry"] = "#FF0A9C";\r
-LaTeXColor["salmon"]         = "#FF789E";\r
-LaTeXColor["carnationpink"]  = "#FF5EFF";\r
-LaTeXColor["magenta"]        = "#FF00FF";\r
-LaTeXColor["violetred"]      = "#FF30FF";\r
-LaTeXColor["rhodamine"]      = "#FF2EFF";\r
-LaTeXColor["mulberry"]       = "#A314FA";\r
-LaTeXColor["redviolet"]      = "#9600A8";\r
-LaTeXColor["fuchsia"]        = "#7303EB";\r
-LaTeXColor["lavender"]       = "#FF85FF";\r
-LaTeXColor["thistle"]        = "#E069FF";\r
-LaTeXColor["orchid"]         = "#AD5CFF";\r
-LaTeXColor["darkorchid"]     = "#9933CC";\r
-LaTeXColor["purple"]         = "#8C24FF";\r
-LaTeXColor["plum"]           = "#8000FF";\r
-LaTeXColor["violet"]         = "#361FFF";\r
-LaTeXColor["royalpurple"]    = "#401AFF";\r
-LaTeXColor["blueviolet"]     = "#1A0DF5";\r
-LaTeXColor["periwinkle"]     = "#6E73FF";\r
-LaTeXColor["cadetblue"]      = "#616EC4";\r
-LaTeXColor["cornflowerblue"] = "#59DEFF";\r
-LaTeXColor["midnightblue"]   = "#007091";\r
-LaTeXColor["navyblue"]       = "#0F75FF";\r
-LaTeXColor["royalblue"]      = "#0080FF";\r
-LaTeXColor["blue"]           = "#0000FF";\r
-LaTeXColor["cerulean"]       = "#0FE3FF";\r
-LaTeXColor["cyan"]           = "#00FFFF";\r
-LaTeXColor["processblue"]    = "#0AFFFF";\r
-LaTeXColor["skyblue"]        = "#61FFE0";\r
-LaTeXColor["turquoise"]      = "#26FFCC";\r
-LaTeXColor["tealblue"]       = "#1FFAA3";\r
-LaTeXColor["aquamarine"]     = "#2EFFB2";\r
-LaTeXColor["bluegreen"]      = "#26FFAB";\r
-LaTeXColor["emerald"]        = "#00FF80";\r
-LaTeXColor["junglegreen"]    = "#03FF7A";\r
-LaTeXColor["seagreen"]       = "#4FFF80";\r
-LaTeXColor["green"]          = "#00FF00";\r
-LaTeXColor["forestgreen"]    = "#00E000";\r
-LaTeXColor["pinegreen"]      = "#00BF29";\r
-LaTeXColor["limegreen"]      = "#80FF00";\r
-LaTeXColor["yellowgreen"]    = "#8FFF42";\r
-LaTeXColor["springgreen"]    = "#BDFF3D";\r
-LaTeXColor["olivegreen"]     = "#009900";\r
-LaTeXColor["rawsienna"]      = "#8C0000";\r
-LaTeXColor["sepia"]          = "#4D0000";\r
-LaTeXColor["brown"]          = "#660000";\r
-LaTeXColor["tan"]            = "#DB9470";\r
-LaTeXColor["gray"]           = "#808080";\r
-LaTeXColor["grey"]           = "#808080";\r
-LaTeXColor["black"]          = "#000000";\r
-LaTeXColor["white"]          = "#FFFFFF";\r
-\r
-var IsColorName = /^(?:greenyellow|yellow|goldenrod|dandelion|apricot|peach|melon|yelloworange|orange|burntorange|bittersweet|redorange|mahogany|maroon|brickred|red|orangered|rubinered|wildstrawberry|salmon|carnationpink|magenta|violetred|rhodamine|mulberry|redviolet|fuchsia|lavender|thistle|orchid|darkorchid|purple|plum|violet|royalpurple|blueviolet|periwinkle|cadetblue|cornflowerblue|midnightblue|navyblue|royalblue|blue|cerulean|cyan|processblue|skyblue|turquoise|tealblue|aquamarine|bluegreen|emerald|junglegreen|seagreen|green|forestgreen|pinegreen|limegreen|yellowgreen|springgreen|olivegreen|rawsienna|sepia|brown|tan|gray|grey|black|white)$/;\r
-var IsCounter =  /^(?:definition|proposition|lemma|theorem|corollary|example|exercise|subsection|subsubsection|figure|equation|table)$/ ;\r
-var IsLaTeXElement = /^(?:displayequation|title|author|address|date|abstract|keyword|section|subsection|subsubsection|ref|cite|thebibliography|definition|proposition|lemma|theorem|corollary|example|exercise|itemize|enumerate|enddefinition|endproposition|endlemma|endtheorem|endcorollary|endexample|endexercise|enditemize|endenumerate|LaTeXMathMLlabel|LaTeXMathML|smallskip|medskip|bigskip|quote|quotation|endquote|endquotation|center|endcenter|description|enddescription|inlinemath)$/; \r
-var IsTextOnlyArea = /^(?:form|textarea|pre)$/i;\r
-var tableid = 0;\r
-\r
-function makeNumberString(cntr) {\r
-  if(sectionCntr > 0) {\r
-     if(inAppendix) {\r
-        return "A"+sectionCntr+"."+cntr;\r
-     } else {\r
-       return sectionCntr+"."+cntr;   \r
-     }\r
-  } else {\r
-     return ""+cntr;        \r
-  }\r
-};\r
-\r
-\r
-function LaTeXpreProcess(thebody) {\r
-   var TheBody = thebody;\r
-   if(TheBody.hasChildNodes()) {\r
-      if(!(IsLaTeXElement.test(TheBody.className))) \r
-      {\r
-         for(var i=0; i<TheBody.childNodes.length; i++) { \r
-            LaTeXpreProcess(TheBody.childNodes[i])  }\r
-      }             \r
-   } \r
-   else { \r
-      if(  TheBody.nodeType==3 &&  \r
-         !(IsTextOnlyArea.test(TheBody.parentNode.nodeName) ) ) \r
-      {\r
-         var str = TheBody.nodeValue;\r
-         if( !(str==null)) { \r
-            \r
-               str = str.replace(/\\%/g, "<per>"); // % sign\r
-               str = str.replace(/%[^\n]*(?=\n)/g,"");\r
-               str = str.replace(/%[^\r]*(?=\r)/g,""); //Used by Explorer\r
-               str = str.replace(/%[^\n]*$/,"") // End of text segment comment \r
-\r
-               if(isIE && str.match(/%/g) != null && IEcommentWarning) {\r
-                  alert("Comments may not have parsed properly.  Try putting in <pre class='LaTeX><div>..</div></pre> structure.");\r
-                  IEcommentWarning = false;\r
-               }\r
-               str = str.replace(/<per>/g,"%");\r
-               \r
-               //if(str.match(/XXX[\s\S]*/)!=null) {\r
-               //  var tmp = str.match(/XXX[\s\S]*/)[0];\r
-               //  var tmpstr = tmp.charCodeAt(7)+"::"+tmp.charCodeAt(8)+"::"+tmp.charCodeAt(9)+"::"+tmp.charCodeAt(10)+"::"+tmp.charCodeAt(11)+"::"+tmp.charCodeAt(12)+"::"+tmp.charCodeAt(13);\r
-               //  alert(tmpstr);\r
-               //}\r
-\r
-            //spacing that in LaTeXMathML may cause problems because of our approach. We use purely unicode\r
-           //  First we remove singleton / symbols\r
-            str = str.replace(/([^\\])\\(\s)/g,"$1\u00A0$2"); // must be a space after \ for it to make an nbsp        \r
\r
-            str = str.replace(/\\quad/g,"\u2001");\r
-            str = str.replace(/\\qquad/g,"\u2001\u2001");\r
-            str = str.replace(/\\enspace/g,"\u2002");\r
-            str = str.replace(/\\;/g,"\u2004");\r
-            str = str.replace(/\\:/g,"\u2005");\r
-            str = str.replace(/\\,/g,"\u2006");\r
-            str = str.replace(/\\thinspace/g,"\u200A");\r
-            str = str.replace(/([^\\])~/g,"$1\u00A0");\r
-            str = str.replace(/\\~/g,"~");\r
-                \r
-            //Added \[ ... \] and $$..$$ functionality.  \r
-            str = str.replace(/\\\[/g," <DEQ> $\\displaystyle{");\r
-            str = str.replace(/\\\]/g,"}$ <DEQ> ");\r
-            str = str.replace(/\$\$/g,"${$<DEQ>$}$");\r
-            \r
-            // Separate replacements for begin .. end to (eventually) allow LaTeX equations with html codes mixed in \r
-            // (as is the case for theorem, etc.\r
-            // all variations of spaces with \begin{array} .. \end{array} -- not displayed, however\r
-            str = str.replace(/\\begin\s*\{\s*array\s*\}/g,"\\begin{array}");\r
-            str = str.replace(/\\end\s*\{\s*array\s*\}/g,"\\end{array}");\r
-           \r
-            // all variations of spaces with \begin{eqnarray} .. \end{eqnarray}\r
-            str = str.replace(/\\begin\s*\{\s*eqnarray\s*\}/g,"  <DEQ>eqno$\\begin{eqnarray}");\r
-            str = str.replace(/\\end\s*\{\s*eqnarray\s*\}/g,"\\end{eqnarray}$<DEQ>  ");\r
-\r
-           // all variations of spaces with \begin{eqnarray*} .. \end{eqnarray*}\r
-            str = str.replace(/\\begin\s*\{\s*eqnarray\*\s*\}/g,"  <DEQ>$\\begin{eqnarray}");\r
-            str = str.replace(/\\end\s*\{\s*eqnarray\*\s*\}/g,"\\end{eqnarray}$<DEQ>  ");\r
-\r
-            // all variations of spaces with \begin{displaymath} .. \end{displaymath}\r
-            str = str.replace(/\\begin\s*\{\s*displaymath\s*\}/g," <DEQ> $\\displaystyle{");\r
-            str = str.replace(/\\end\s*\{\s*displaymath\s*\}/g,"}$ <DEQ> ");\r
-            \r
-            // all variations of spaces with \begin{equation*} .. \end{equation*}\r
-            str = str.replace(/\\begin\s*\{\s*equation\s*\*\s*\}/g," <DEQ> $\\displaystyle{");\r
-            str = str.replace(/\\end\s*\{\s*equation\s*\*\s*\}/g,"}$ <DEQ> ");\r
-  \r
-             // all variations of spaces with \begin{equation} .. \end{equation}\r
-            str = str.replace(/\\begin\s*\{\s*equation\s*\}/g," <DEQ>eqno$\\displaystyle{");\r
-            str = str.replace(/\\end\s*\{\s*equation\s*\}/g,"}$ <DEQ> ");\r
-           \r
-\r
-           \r
-            //now parse to translate <DEQ> structures to <table class = 'dispeq'> stuff\r
-            //and to identify non-display math content (sections, etc).  \r
-             \r
-            str = str.split("<DEQ>");\r
-            // var ntype = TheBody.nodeType;\r
-            var newFrag = document.createDocumentFragment();\r
-            \r
-            for(var i=0;i<str.length;i++) {\r
-               if(i % 2) { \r
-                  //odd = table of type displayequation\r
-                  var DEQtable = document.createElement("table");\r
-                  DEQtable.className='displayequation';\r
-                  var DEQtbody = document.createElement("tbody");\r
-                   \r
-                  var DEQtr = document.createElement("tr");\r
-                  var DEQtdeq = document.createElement("td");\r
-                      DEQtdeq.className='eq';\r
-                   \r
-                  // AfterFix to repair for $$...$$   \r
-                  str[i] = str[i].replace(/\$\}\$/g,"$\\displaystyle{");\r
-                  str[i] = str[i].replace(/\$\{\$/g,"}");\r
-                                                    \r
-                  //check for equation number via either label or eqno at beginning -- \nonumber is removed\r
-                  var lbl = str[i].match(/\\label\s*\{\s*(\w+)\s*\}/);\r
-                  var ISeqno = str[i].match(/^eqno/);\r
-                   \r
-                  // append nodes into row                 \r
-                  str[i] = str[i].replace(/^eqno/," ");\r
-                  str[i] = str[i].replace(/\\label\s*\{\s*\w+\s*\}/," ");\r
-                  DEQtdeq.appendChild(document.createTextNode( str[i] ) );\r
-                  DEQtr.appendChild(DEQtdeq);\r
-\r
-                  str[i] = str[i].replace(/\\nonumber/g,"");\r
-                  \r
-                  if(ISeqno!=null || lbl !=null) {\r
-                     var DEQtdno = document.createElement("td");\r
-                         DEQtdno.className='eqno';\r
-                     LaTeXCounter["equation"]++;\r
-                            var eqnoString = makeNumberString(LaTeXCounter["equation"]);\r
-                     \r
-                            var DEQanchor = document.createElement("a");\r
-                            if(lbl!=null) { DEQanchor.id = lbl[1] };\r
-                            DEQanchor.className = "eqno";\r
-                            var anchorSpan = document.createElement("span");\r
-                            anchorSpan.className = "eqno";\r
-                            anchorSpan.style.display = "none";\r
-                            anchorSpan.appendChild(document.createTextNode(eqnoString));\r
-                            DEQanchor.appendChild(anchorSpan);\r
-                     DEQtdno.appendChild(DEQanchor);\r
-                            var DEQspan = document.createElement("span"); \r
-                            DEQspan.className = "eqno"; \r
-                            DEQspan.appendChild(document.createTextNode("("+eqnoString+")" )); \r
-                     DEQtdno.appendChild(DEQspan); \r
-                     DEQtr.appendChild(DEQtdno);\r
-                  }\r
-                  DEQtbody.appendChild(DEQtr);\r
-                         DEQtable.appendChild(DEQtbody);\r
-                  newFrag.appendChild(DEQtable);\r
-               } \r
-               else { \r
-                  //even = this is text, where we may have sections, labels, subsections, and so on \r
\r
-                  // AfterFix to repair for $$...$$   \r
-                  str[i] = str[i].replace(/\$\}\$/g,"");\r
-                  str[i] = str[i].replace(/\$\{\$/g,"");\r
-                         \r
-                         //Some stuff we just want to remove\r
-                  str[i] = str[i].replace(/\\maketitle/g,"");\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*document\s*\}/g,"");\r
-                         str[i] = str[i].replace(/\\end\s*\{\s*document\s*\}/g,"");\r
-                         str[i] = str[i].replace(/\\documentclass[^\}]*?\}/g,"");\r
-                         str[i] = str[i].replace(/\\usepackage[^\}]*?\}/g,""); //ignores packages and their options\r
-                         str[i] = str[i].replace(/\\noindent/g,"");\r
-                         str[i] = str[i].replace(/\\notag/g,"");\r
-                                        \r
-                  //Next: labels, ref's, hrefs, urls, and cites\r
-                  str[i] = str[i].replace(/\\ref\s*\{\s*(\w+)\}/g," \\[ref\\]$1\\[ ");\r
-                         str[i] = str[i].replace (/\\url\s*\{\s*([^\}\n]+)\}/g," \\[url\\]$1\\[ ");\r
-                  str[i] = str[i].replace(/\\href\s*\{\s*([^\}]+)\}\s*\{\s*([^\}]+)\}/g," \\[href\\]$1\\]$2\\[ ");\r
-                  str[i] = str[i].replace(/\\cite\s*\{\s*(\w+)\}/g," \\[cite\\]$1\\[ ");\r
-                 \r
-                         //Miscellaneous stuff!!\r
-                         str[i] = str[i].replace(/\\qed/g,"\u220E");\r
-                         str[i] = str[i].replace(/\\endproof/g,"\u220E");\r
-                         str[i] = str[i].replace(/\\proof/g,"\\textbf{Proof: }");\r
-\r
-                         //breaks and skips\r
-                     str[i] = str[i].replace(/\\n(?=\s)/g, " \\[br\\] \\[ ");\r
-                         str[i] = str[i].replace(/\\newline/g," \\[br\\] \\[ ");\r
-                         str[i] = str[i].replace(/\\linebreak/g," \\[br\\] \\[ ");\r
-                         str[i] = str[i].replace(/\\smallskip/g," \\[logicalbreak\\]smallskip\\[ "); \r
-                     str[i] = str[i].replace(/\\medskip/g," \\[logicalbreak\\]medskip\\[ ");\r
-                     str[i] = str[i].replace(/\\bigskip/g," \\[logicalbreak\\]bigskip\\[ ");\r
-                         str[i] = str[i].replace(/[\n\r]+[ \f\n\r\t\v\u2028\u2029]*[\n\r]+/g," \\[logicalbreak\\]LaTeXMathML\\[ ");  // extra return replaced by <p>\r
-                         if(isIE) {\r
-                            str[i] = str[i].replace(/\r/g," ");  // replace \r by a space to aid spacing!\r
-                         }\r
-\r
-                 \r
-                         //items and appendix\r
-                         str[i] = str[i].replace(/\\bibitem\s*([^\{]*\{\s*\w*\s*\})/g," \\[bibitem\\]$1\\[ ");\r
-                  str[i] = str[i].replace(/\\bibitem\s*/g," \\[bibitem\\] \\[ ");\r
-                         str[i] = str[i].replace(/\\item\s*\[\s*(\w+)\s*\]/g," \\[alistitem\\]$1\\[ ");\r
-                         str[i] = str[i].replace(/\\item\s*/g," \\[alistitem\\] \\[ ");\r
-                         str[i] = str[i].replace(/\\appendix/g," \\[appendix\\] \\[ ");\r
-\r
-\r
-                  // \includegraphics[][]{image} -- no processing of options.  This treatment is DANGEROUS.  It assumes no html will be\r
-                         // placed within the \begin{figure} ... \end{figure} structure, and the [\s\S] character class could lead to strange matches\r
-                     str[i] = str[i].replace(/\\begin\s*\{\s*figure\s*\}([\s\S]+?)\\end\s*\{\s*figure\s*\}/g," \\[figure\\]$1\\[ ");\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*table\s*\}([\s\S]+?)\\end\s*\{\s*table\s*\}/g," \\[table\\]$1\\[ ");\r
-                         //str[i] = str[i].replace(/\\begin\s*\{\s*array\s*\}([\s\S]+?)\\end\s*\{\s*array\s*\}/g," \\[array\\]$1\\[ ");\r
-                  //goal is to protect array \\ from being converted into linebreaks\r
-                  \r
-                  //This construction allows css classes for divs for these elements, but the CSS will have to be supplied through a \r
-                  //css file or <script> .. </script> in the header.  (It makes sense to me that style files in LaTeX should correspond\r
-                  //to css and/or xslt when translating to mathml, but \ref's are a problem).\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*theorem\s*\}/g," \\[theorem\\]Theorem \\[ "); \r
-                  str[i] = str[i].replace(/\\end\s*\{\s*theorem\s*\}/g," \\[endtheorem\\] \\[ ");\r
-\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*definition\s*\}/g," \\[definition\\]Definition \\[ "); \r
-                  str[i] = str[i].replace(/\\end\s*\{\s*definition\s*\}/g," \\[enddefinition\\] \\[ ");\r
-           \r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*lemma\s*\}/g," \\[lemma\\]Lemma \\[ "); \r
-                  str[i] = str[i].replace(/\\end\s*\{\s*lemma\s*\}/g," \\[endlemma\\] \\[ ");\r
-\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*corollary\s*\}/g," \\[corollary\\]Corollary \\[ "); \r
-                  str[i] = str[i].replace(/\\end\s*\{\s*corollary\s*\}/g," \\[endcorollary\\] \\[ ");\r
-          \r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*proposition\s*\}/g," \\[proposition\\]Proposition \\[ "); \r
-                  str[i] = str[i].replace(/\\end\s*\{\s*proposition\s*\}/g," \\[endproposition\\] \\[ ");\r
-\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*example\s*\}/g," \\[example\\]Example \\[ "); \r
-                  str[i] = str[i].replace(/\\end\s*\{\s*example\s*\}/g," \\[endexample\\] \\[ ");\r
-                  \r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*exercise\s*\}/g," \\[exercise\\]Exercise \\[ "); \r
-                  str[i] = str[i].replace(/\\end\s*\{\s*exercise\s*\}/g," \\[endexercise\\] \\[ ");\r
-\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*thebibliography\s*\}\s*\{\s*\w+\s*\}/g," \\[thebibliography\\]References \\[ "); \r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*thebibliography\s*\}/g," \\[thebibliography\\]References \\[ "); \r
-                  str[i] = str[i].replace(/\\end\s*\{\s*thebibliography\s*\}/g," \\[endthebibliography\\]References \\[ ");\r
-                 \r
-\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*proof\s*\}/g," \\[proof\\]Proof: \\[ "); \r
-                  if(isIE) {  //IE is just so weird\r
-                     str[i] = str[i].replace(/\\end\s*\{\s*proof\s*\}/g,"\u220E \\[endproof\\] \\[ ");\r
-                  } else { \r
-                     str[i] = str[i].replace(/\\end\s*\{\s*proof\s*\}/g," \\[endproof\\] \\[ ");\r
-                  }\r
-                 \r
-                  //The frontmatter -- all translated to div's to be handled by CSS\r
-                  str[i] = str[i].replace(/\\title\s*\{\s*([^\}]+)\}/g," \\[title\\] \\[$1 \\[endtitle\\] \\[ ");\r
-                  str[i] = str[i].replace(/\\author\s*\{\s*([^\}]+)\}/g," \\[author\\] \\[$1 \\[endauthor\\] \\[ ");\r
-                  str[i] = str[i].replace(/\\address\s*\{\s*([^\}]+)\}/g," \\[address\\] \\[$1 \\[endaddress\\] \\[ ");\r
-                  str[i] = str[i].replace(/\\date\s*\{\s*([^\}]+)\}/g," \\[date\\] \\[$1 \\[enddate\\] \\[ ");\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*keyword\s*\}/g," \\[keyword\\] \\[ "); \r
-                  str[i] = str[i].replace(/\\end\s*\{\s*keyword\s*\}/g," \\[endkeyword\\] \\[ ");\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*abstract\s*\}/g," \\[abstract\\] \\[ "); \r
-                     str[i] = str[i].replace(/\\end\s*\{\s*abstract\s*\}/g," \\[endabstract\\] \\[ ");\r
-                 \r
-                  //The rest of the environments -- Users can even "make up their own" -- but it avoids the array and tabular environments\r
-                  str[i] = str[i].replace(/\\begin\s*\{\s*(?!array|tabular)(\w+)\s*\}/g," \\[$1\\] \\[ ");\r
-                  str[i] = str[i].replace(/\\end\s*\{\s*(?!array|tabular)(\w+)\s*\}/g," \\[end$1\\] \\[ ");\r
-\r
-                  //Next, we look at section--subsection stuff.  This is nested -- this would be so much better if LaTeX used \r
-                  //some type of \begin{sectionhead}...\end{sectionhead} structure\r
-                  var sectionIndex = str[i].search(/\\section\s*\{\s*[\s\S]+\}/); \r
-                 \r
-                  while(sectionIndex >= 0) { \r
-                     str[i] = str[i].replace(/\\section\s*\{/ ," \\[section\\]");\r
-                     var delimcnt = 1;\r
-                     for(var ii=sectionIndex;ii<str[i].length;ii++) { \r
-                        if(str[i].charAt(ii) == "{") { delimcnt++ };\r
-                        if(str[i].charAt(ii) == "}") { delimcnt-- };\r
-                        if(delimcnt == 0) { \r
-                           str[i] = str[i].substring(0,ii)+"\\[ "+str[i].substring(ii+1,str[i].length) ;\r
-                           break;\r
-                        }\r
-                     };\r
-                     sectionIndex = str[i].search(/\\section\s*\{\s*[\s\S]+\}/); //look for next\r
-                  }\r
-                 \r
-                     sectionIndex = str[i].search(/\\subsection\s*\{\s*[\s\S]+\}/); \r
-                 \r
-                  while(sectionIndex >= 0) { \r
-                     str[i] = str[i].replace(/\\subsection\s*\{/ ," \\[subsection\\]");\r
-                     var delimcnt = 1;\r
-                     for(var ii=sectionIndex;ii<str[i].length;ii++) { \r
-                        if(str[i].charAt(ii) == "{") { delimcnt++ };\r
-                        if(str[i].charAt(ii) == "}") { delimcnt-- };\r
-                        if(delimcnt == 0) { \r
-                           str[i] = str[i].substring(0,ii)+"\\[ "+str[i].substring(ii+1,str[i].length) ;\r
-                           break;\r
-                        }\r
-                     };\r
-                     sectionIndex = str[i].search(/\\subsection\s*\{\s*[\s\S]+\}/); //look for next\r
-                  }\r
-       \r
-                  sectionIndex = str[i].search(/\\subsubsection\s*\{\s*[\s\S]+\}/); \r
-                 \r
-                  while(sectionIndex >= 0) { \r
-                     str[i] = str[i].replace(/\\subsubsection\s*\{/ ," \\[subsubsection\\]");\r
-                     var delimcnt = 1;\r
-                     for(var ii=sectionIndex;ii<str[i].length;ii++) { \r
-                        if(str[i].charAt(ii) == "{") { delimcnt++ };\r
-                        if(str[i].charAt(ii) == "}") { delimcnt-- };\r
-                        if(delimcnt == 0) { \r
-                           str[i] = str[i].substring(0,ii)+"\\[ "+str[i].substring(ii+1,str[i].length) ;\r
-                           break;\r
-                        }\r
-                     };\r
-                     sectionIndex = str[i].search(/\\subsubsection\s*\{\s*[\s\S]+\}/); //look for next\r
-                   }             \r
-\r
-                  var CatToNextEven = "";                                       \r
-                  //split into alternating text elements and "marked" elements                   \r
-                  var strtmp = str[i].split("\\[");\r
-                  //document.write(strtmp[0]);\r
-                                \r
-                  for(var j=0;j<strtmp.length;j++) {\r
-                     if(j % 2) { \r
-                        //odd = split on \\]\r
-                        var strtmparray = strtmp[j].split("\\]");\r
-                        switch (strtmparray[0]) {\r
-                           case "section":\r
-                              var nodeTmp = document.createElement("H2");\r
-                              nodeTmp.className = 'section'; \r
-                              //reset counters  \r
-                                sectionCntr++;\r
-                                for (var div in LaTeXCounter) { LaTeXCounter[div] = 0 };\r
-                              //Create Title of section\r
-                              var nodeAnchor = document.createElement("a");\r
-                              if(inAppendix) {\r
-                                 nodeAnchor.className='appendixsection';\r
-                              } else {\r
-                                 nodeAnchor.className='section';\r
-                              }\r
-                              var nodeNumString = makeNumberString("");\r
-                              var anchorSpan = document.createElement("span");\r
-                              anchorSpan.className = "section";\r
-                              anchorSpan.style.display = "none";\r
-                              anchorSpan.appendChild(document.createTextNode(nodeNumString));\r
-                              nodeAnchor.appendChild(anchorSpan);\r
-                              nodeTmp.appendChild(nodeAnchor);\r
-                             \r
-                              var nodeSpan = document.createElement("span");\r
-                              nodeSpan.className = 'section';\r
-                              nodeSpan.appendChild(document.createTextNode(nodeNumString+" "));\r
-                              nodeTmp.appendChild(nodeSpan);\r
-                              nodeTmp.appendChild(document.createTextNode( strtmparray[1] ) );\r
-                              newFrag.appendChild(nodeTmp);  \r
-                           break;\r
-                           case "subsection":\r
-                              var nodeTmp = document.createElement("H3");\r
-                              nodeTmp.className = 'subsection'; \r
-                              //counters  \r
-                                LaTeXCounter["subsection"]++;\r
-                                LaTeXCounter["subsubsection"]=0;\r
-                             //Create Title of section\r
-                              var nodeAnchor = document.createElement("a");\r
-                              nodeAnchor.className = 'subsection';\r
-                              var nodeNumString = makeNumberString(LaTeXCounter["subsection"]);\r
-                              var anchorSpan = document.createElement("span");\r
-                              anchorSpan.className = "subsection";\r
-                              anchorSpan.style.display = "none";\r
-                              anchorSpan.appendChild(document.createTextNode(nodeNumString));\r
-                              nodeAnchor.appendChild(anchorSpan);\r
-                              nodeTmp.appendChild(nodeAnchor);                       \r
-                              var nodeSpan = document.createElement("span");\r
-                              nodeSpan.className = 'subsection';\r
-                              nodeSpan.appendChild(document.createTextNode(nodeNumString+". "));\r
-                              nodeTmp.appendChild(nodeSpan);                         \r
-                              nodeTmp.appendChild(document.createTextNode( strtmparray[1] ) );\r
-                              newFrag.appendChild(nodeTmp);  \r
-                           break;\r
-                           case "subsubsection":\r
-                              var nodeTmp = document.createElement("H4");\r
-                              nodeTmp.className = 'subsubsection'; \r
-                               //counters  \r
-                                LaTeXCounter["subsubsection"]++;\r
-                              //Create Title of section\r
-                              var nodeAnchor = document.createElement("a");\r
-                              nodeAnchor.className = 'subsubsection';\r
-                              var nodeNumString = makeNumberString(LaTeXCounter["subsection"]+"."+LaTeXCounter["subsubsection"]);\r
-                              var anchorSpan = document.createElement("span");\r
-                              anchorSpan.className = "subsubsection";\r
-                              anchorSpan.style.display = "none";\r
-                              anchorSpan.appendChild(document.createTextNode(nodeNumString));\r
-                              nodeAnchor.appendChild(anchorSpan);\r
-                              nodeTmp.appendChild(nodeAnchor);                       \r
-                              var nodeSpan = document.createElement("span");\r
-                              nodeSpan.className = 'subsubsection';\r
-                              nodeSpan.appendChild(document.createTextNode(nodeNumString+". "));\r
-                              nodeTmp.appendChild(nodeSpan);                         \r
-                              nodeTmp.appendChild(document.createTextNode( strtmparray[1] ) );\r
-                              newFrag.appendChild(nodeTmp);  \r
-                           break;\r
-                           case "href":\r
-                              var nodeTmp = document.createElement("a");\r
-                              nodeTmp.className = 'LaTeXMathML'; \r
-                              nodeTmp.href = strtmparray[1];\r
-                              nodeTmp.appendChild(document.createTextNode( strtmparray[2]));\r
-                              newFrag.appendChild(nodeTmp);                                                                                                                \r
-                           break;\r
-                           case "url":\r
-                              var nodeTmp = document.createElement("a");\r
-                              nodeTmp.className = 'LaTeXMathML'; \r
-                              nodeTmp.href = strtmparray[1];\r
-                              nodeTmp.appendChild(document.createTextNode( strtmparray[1]));\r
-                              newFrag.appendChild(nodeTmp);                             \r
-                           break;\r
-                           case "figure":\r
-                              var nodeTmp = document.createElement("table");\r
-                              nodeTmp.className = 'figure'; \r
-                              var FIGtbody = document.createElement("tbody");\r
\r
-                              var FIGlbl = strtmparray[1].match(/\\label\s*\{\s*(\w+)\s*\}/);\r
-                              strtmparray[1]=strtmparray[1].replace(/\\label\s*\{\w+\}/g,"");  \r
-                             \r
-                              var capIndex = strtmparray[1].search(/\\caption\s*\{[\s\S]+\}/);  \r
-                              var FIGcap = "";\r
-                             \r
-                              if(capIndex >= 0) { // caption may contain other {  } structures -- but not displaymath!!\r
-                                 var tmp = strtmparray[1];\r
-                                 var delimcnt = 0;\r
-                                var capstart = -1;\r
-                                 for(var pos=capIndex;pos<tmp.length;pos++) { \r
-                                    if(tmp.charAt(pos) == "{") { delimcnt++ };\r
-                                    if(tmp.charAt(pos) == "}") { delimcnt-- };\r
-                                    if(delimcnt == 1 && capstart<0) { capstart = pos+1 };\r
-                                    if(delimcnt == 0 && capstart>0) { \r
-                                       capend = pos-1; \r
-                                       FIGcap = tmp.substring(capstart,pos);\r
-                                       break \r
-                                    }\r
-                                 }\r
-                              }\r
-                                                   \r
-                              var FIGtr2 = document.createElement("tr");\r
-                              var FIGtd2  = document.createElement("td");\r
-                              FIGtd2.className="caption";\r
-                  \r
-                               \r
-                              var FIGanchor = document.createElement("a");\r
-                              FIGanchor.className = "figure";\r
-                              if(FIGlbl!=null) {  FIGanchor.id = FIGlbl[1]; }\r
-                              LaTeXCounter["figure"]++;\r
-                              var fignmbr = makeNumberString(LaTeXCounter["figure"]);\r
-                              var anchorSpan = document.createElement("span");\r
-                              anchorSpan.className = "figure";\r
-                              anchorSpan.style.display = "none";\r
-                              anchorSpan.appendChild(document.createTextNode(fignmbr));  \r
-                              FIGanchor.appendChild(anchorSpan);                            \r
-                              FIGtd2.appendChild(FIGanchor);\r
-                             \r
-                              var FIGspan = document.createElement("span");\r
-                              FIGspan.className = "figure"; //For CSS counters, comment this line\r
-                              FIGspan.appendChild(document.createTextNode("Figure "+fignmbr+". " ) );\r
-                              FIGtd2.appendChild(FIGspan);\r
-                              FIGtd2.appendChild(document.createTextNode(""+FIGcap));\r
-                              FIGtr2.appendChild(FIGtd2);\r
-                              FIGtbody.appendChild(FIGtr2);\r
-                              var IsSpecial = false;\r
-                             \r
-                              var FIGinfo = strtmparray[1].match(/\\includegraphics\s*\{([^\}]+)\}/);\r
-                              if(FIGinfo==null) { //options not processed, for now\r
-                                 FIGinfo = strtmparray[1].match(/\\includegraphics\s*\[[^\]]*\]\s*\{\s*([^\}]+)\s*\}/);\r
-                              }\r
-                              if(FIGinfo==null) {\r
-                                 FIGinfo = strtmparray[1].match(/\\special\s*\{\s*([^\}]+)\}/);\r
-                                 IsSpecial=true //Hook: Later can include "special" graphics commands\r
-                              };\r
-                         \r
-                              if(FIGinfo!=null) { //Caption will be above the image\r
-                                 var FIGtr1 = document.createElement("tr");\r
-                                 var FIGtd1  = document.createElement("td");\r
-                                 FIGtd1.className="image";\r
-                                 var FIGimg = document.createElement("img");\r
-                                 var FIGsrc = FIGinfo[1]; //options not processed, for now\r
-                                 FIGimg.src = FIGsrc;\r
-                                 FIGimg.alt = "Figure "+FIGsrc+" did not load";\r
-                                 FIGimg.title = "Figure "+fignmbr+". "+FIGcap;\r
-                                 FIGimg.id = "figure"+fignmbr;\r
-                                 FIGtd1.appendChild(FIGimg);\r
-                                 FIGtr1.appendChild(FIGtd1);\r
-                                 FIGtbody.appendChild(FIGtr1);\r
-                              }\r
-                              nodeTmp.appendChild(FIGtbody);\r
-                              newFrag.appendChild(nodeTmp);                  \r
-                           break;\r
-                           case "table": \r
-                              var nodeTmp = document.createElement("table");\r
-                              if(strtmparray[1].search(/\\centering/) >= 0) {\r
-                                 nodeTmp.className = 'LaTeXtable centered';\r
-                                 nodeTmp.align = "center";\r
-                              } else {\r
-                                 nodeTmp.className = 'LaTeXtable'; \r
-                              };\r
-                              tableid++;\r
-                              nodeTmp.id = "LaTeXtable"+tableid; //unique id for each table\r
-                              \r
-                              var TABlbl = strtmparray[1].match(/\\label\s*\{\s*(\w+)\s*\}/);\r
-                              strtmparray[1]=strtmparray[1].replace(/\\label\s*\{\w+\}/g,"");  \r
-                             \r
-                              var capIndex = strtmparray[1].search(/\\caption\s*\{[\s\S]+\}/);  \r
-                              var TABcap = "";\r
-                             \r
-                              if(capIndex >= 0) { // caption may contain other {  } structures -- but not displaymath!!\r
-                                 var tmp = strtmparray[1]; \r
-                                 var delimcnt = 0;\r
-                                 var capstart = -1;\r
-                                 for(var pos=capIndex;pos<tmp.length;pos++) { \r
-                                    if(tmp.charAt(pos) == "{") { delimcnt++ };\r
-                                    if(tmp.charAt(pos) == "}") { delimcnt-- };\r
-                                    if(delimcnt == 1 && capstart<0) { capstart = pos+1 };\r
-                                    if(delimcnt == 0 && capstart>0) { \r
-                                          capend = pos-1; \r
-                                              TABcap = tmp.substring(capstart,pos);\r
-                                                                      break \r
-                                                                   }\r
-                                                                }\r
-                                                         }\r
-                                                   \r
-                              if(TABcap!="") {\r
-                                 var TABtbody = document.createElement("tbody");\r
-                                 var TABcaption = document.createElement("caption");\r
-                                 TABcaption.className="LaTeXtable centered";\r
-                                 var TABanchor = document.createElement("a");\r
-                                                        TABanchor.className = "LaTeXtable";\r
-                                 if(TABlbl!=null) {  TABanchor.id = TABlbl[1]; }\r
-                                 LaTeXCounter["table"]++;\r
-                                                        var tabnmbr = makeNumberString(LaTeXCounter["table"]);\r
-                                                        var anchorSpan = document.createElement("span");\r
-                                                        anchorSpan.className = "LaTeXtable";\r
-                                                        anchorSpan.style.display = "none";\r
-                                                        anchorSpan.appendChild(document.createTextNode(tabnmbr));  \r
-                                 TABanchor.appendChild(anchorSpan);                         \r
-                                                        TABcaption.appendChild(TABanchor);\r
-                             \r
-                                                        var TABspan = document.createElement("span");\r
-                                 TABspan.className = "LaTeXtable"; //For CSS counters, comment this line\r
-                                 TABspan.appendChild(document.createTextNode("Table "+tabnmbr+". " ) );\r
-                                                        TABcaption.appendChild(TABspan);\r
-                                                        TABcaption.appendChild(document.createTextNode(""+TABcap));\r
-                                 nodeTmp.appendChild(TABcaption);\r
-                                                     }\r
-                              var TABinfo = strtmparray[1].match(/\\begin\s*\{\s*tabular\s*\}([\s\S]+)\\end\s*\{\s*tabular\s*\}/);\r
-                                                     if(TABinfo!=null) { \r
-                                                                var TABtbody = document.createElement('tbody');\r
-                                                                var TABrow = null;\r
-                                                                var TABcell = null;\r
-                                                                var row=0;\r
-                                                                var col=0;\r
-                                \r
-                                                                var TABalign = TABinfo[1].match(/^\s*\{([^\}]+)\}/);\r
-                                                                TABinfo = TABinfo[1].replace(/^\s*\{[^\}]+\}/,"");\r
-                                                                TABinfo = TABinfo.replace(/\\hline/g,""); //no horizontal bars\r
-                                                                TABalign[1] = TABalign[1].replace(/\|/g,""); //no vertical bars\r
-                                                                TABalign[1] = TABalign[1].replace(/\s/g,""); \r
-                                                                TABinfo = TABinfo.split("\\\\"); // into rows\r
-                                                                for(row=0;row<TABinfo.length;row++) {\r
-                                                           TABrow = document.createElement("tr");\r
-                                                                   TABinfo[row] = TABinfo[row].split("&");\r
-                                                                   for(col=0;col<TABinfo[row].length;col++) {\r
-                                                                      TABcell = document.createElement("td");\r
-                                                                      switch (TABalign[1].charAt(col)) {\r
-                                                                 case "l":\r
-                                                                                    TABcell.style.textAlign = "left";\r
-                                                                         break;\r
-                                                                 case "c":\r
-                                                                                    TABcell.style.textAlign = "center";\r
-                                                                         break;\r
-                                                                 case "r":\r
-                                                                                    TABcell.style.textAlign = "right";\r
-                                                                         break;\r
-                                                                 default :\r
-                                                                                    TABcell.style.textAlign = "left";\r
-                                                                      };\r
-                                                                      TABcell.appendChild(document.createTextNode(TABinfo[row][col]));\r
-                                                                      TABrow.appendChild(TABcell);\r
-                                                                   }\r
-                                                                   TABtbody.appendChild(TABrow);\r
-                                                        }\r
-                                                        nodeTmp.appendChild(TABtbody);\r
-                                                     }\r
-                              newFrag.appendChild(nodeTmp);                                                                                                                  \r
-                           break;\r
-                                                  case "logicalbreak":\r
-                              var nodeTmp = document.createElement("p");\r
-                              nodeTmp.className = strtmparray[1]; \r
-                                                     nodeTmp.appendChild(document.createTextNode("\u00A0"));\r
-                                                     newFrag.appendChild(nodeTmp);                                                                                                                  \r
-                           break;\r
-                                                  case "appendix":\r
-                              inAppendix=true;\r
-                              sectionCntr=0;\r
-                                                  break;\r
-                                                  case "alistitem":\r
-                              var EndDiv = document.createElement("div");\r
-                                                     EndDiv.className = "endlistitem";\r
-                              newFrag.appendChild(EndDiv);\r
-                                                     var BegDiv = document.createElement("div");\r
-                              BegDiv.className = "listitem"; \r
-                                                     if(strtmparray[1]!=" ") {\r
-                                 var BegSpan = document.createElement("span");\r
-                                 BegSpan.className="listitemmarker";\r
-                                                                var boldBegSpan = document.createElement("b");\r
-                                                                boldBegSpan.appendChild(document.createTextNode(strtmparray[1]+" "));\r
-                                                                BegSpan.appendChild(boldBegSpan);\r
-                                                                BegDiv.appendChild(BegSpan);\r
-                              }\r
-                                                     newFrag.appendChild(BegDiv);                                                                                                                  \r
-                           break;\r
-                           case "br":\r
-                              newFrag.appendChild(document.createElement("br"));                                                                                                                  \r
-                           break;\r
-                           case "bibitem":\r
-                                                     newFrag.appendChild(document.createElement("br"));\r
-                                                     var nodeTmp = document.createElement("a");\r
-                                                     nodeTmp.className = 'bibitem'; \r
-                                             var nodeSpan = document.createElement("span");\r
-                                                     nodeSpan.className = 'bibitem'; \r
-\r
-                                                     bibcntr++;\r
-                             \r
-                                                     var lbl = strtmparray[1].match(/\{\s*(\w+)\s*\}/); \r
-                                                     strtmparray[1] = strtmparray[1].replace(/\s*\{\s*\w+\s*\}/g,"");                       \r
-                                                     strtmparray[1] = strtmparray[1].replace(/^\s*\[/,"");\r
-                                                     strtmparray[1] = strtmparray[1].replace(/\s*\]$/,""); \r
-                                             strtmparray[1] = strtmparray[1].replace(/^\s+|\s+$/g,"");\r
-                                                     //We create a list of id's for the bibitems -- it seemed important at one time??\r
-                                                     if(lbl==null) {\r
-                                                                biblist[bibcntr] = "bibitem"+bibcntr\r
-                                                     } else {\r
-                                                        biblist[bibcntr] = lbl[1];\r
-                                                     }; \r
-                                                     nodeTmp.name = biblist[bibcntr];\r
-                                                     nodeTmp.id = biblist[bibcntr];\r
-                                                     // We place content into <a> -- access it with \cite, thus allowing appropriate labels!\r
-                                                     if(strtmparray[1]!="") {\r
-                                                                nodeSpan.appendChild(document.createTextNode(strtmparray[1]));\r
-                              } else { \r
-                                 nodeSpan.appendChild(document.createTextNode("["+bibcntr+"]"));\r
-                              }\r
-                                                     nodeTmp.appendChild(nodeSpan);\r
-                                                     newFrag.appendChild(nodeTmp);\r
-                           break;\r
-                           case "cite":\r
-                              var nodeTmp = document.createElement("a");\r
-                              nodeTmp.className = 'cite'; \r
-                              nodeTmp.name = 'cite';\r
-                              nodeTmp.href = "#"+strtmparray[1];\r
-                              newFrag.appendChild(nodeTmp);                                                                                                                  \r
-                           break;\r
-                           case "ref":\r
-                              var nodeTmp = document.createElement("a"); \r
-                              nodeTmp.className = 'ref'; \r
-                              nodeTmp.name = 'ref';\r
-                              nodeTmp.href = "#"+strtmparray[1];\r
-                              newFrag.appendChild(nodeTmp);                                                                                      \r
-                           break;\r
-                           default : \r
-                              var nodeTmp = document.createElement("div");\r
-                              nodeTmp.className = strtmparray[0]; \r
-                              if( IsCounter.test(strtmparray[0]) ) { \r
-                                                                LaTeXCounter[strtmparray[0]]++;\r
-                                 var nodeAnchor = document.createElement("a");\r
-                                 nodeAnchor.className = strtmparray[0];\r
-                                                                var divnum = makeNumberString(LaTeXCounter[strtmparray[0]]);\r
-                                                                var anchorSpan = document.createElement("span");\r
-                                                                anchorSpan.className = strtmparray[0];\r
-                                                                anchorSpan.appendChild(document.createTextNode(divnum));\r
-                                                                anchorSpan.style.display="none";\r
-                                                                nodeAnchor.appendChild(anchorSpan);\r
-                                                                nodeTmp.appendChild(nodeAnchor);\r
-                                \r
-                                                                var nodeSpan = document.createElement("span");\r
-                                 nodeSpan.className = strtmparray[0];\r
-                                                                nodeSpan.appendChild(document.createTextNode(strtmparray[1]+" "+divnum+". "));\r
-                                 nodeTmp.appendChild(nodeSpan);\r
-                              }\r
-                                                     if(isIE) { //remove if IE supports :before and :after\r
-                                                                if(strtmparray[0]==("thebibliography"||"abstract"||"keyword"||"proof")) {\r
-                                    var nodeSpan = document.createElement("span");\r
-                                    nodeSpan.className = strtmparray[0];\r
-                                                                   nodeSpan.appendChild(document.createTextNode(strtmparray[1]));\r
-                                    nodeTmp.appendChild(nodeSpan);\r
-                                 }\r
-                              } //end of IE :before and :after fixes\r
-                                                 if(strtmparray[0]=="endenumerate" || strtmparray[0]=="enditemize" || strtmparray[0]=="enddescription") {\r
-                                 var endDiv = document.createElement("div");\r
-                                 endDiv.className = "endlistitem";\r
-                                                                newFrag.appendChild(endDiv);\r
-                              }\r
-                              newFrag.appendChild(nodeTmp);\r
-                                                 if(strtmparray[0]=="enumerate" || strtmparray[0]=="itemize" || strtmparray[0]=="description") {\r
-                                 var endDiv = document.createElement("div");\r
-                                 endDiv.className = "listitem";\r
-                                                                newFrag.appendChild(endDiv);\r
-                              }\r
-                         }\r
-                      } else { \r
-                        //even = text, labels, bf, and italics, and linebreaks, and math -- we now remove the math\r
-                         strtmp[j] = strtmp[j].replace(/\\\$/g,"<per>");\r
-                         strtmp[j] = strtmp[j].replace(/\$([^\$]+)\$/g," \\[$1\\[ ");\r
-                         strtmp[j] = strtmp[j].replace(/<per>/g,"\\$");\r
-                         strtmp[j] = strtmp[j].replace(/\\begin\s*\{\s*math\s*\}([\s\S]+?)\\end\s*\{\s*math\s*\}/g," \\[$1\\[ ");\r
-\r
-                                                var strtmptmp = strtmp[j].split("\\[");\r
-                         \r
-                         for(var jjj=0;jjj<strtmptmp.length;jjj++) {\r
-                            if(jjj % 2) { //odd = math\r
-                              var nodeTmp = document.createElement("span");\r
-                              nodeTmp.className = 'inlinemath';\r
-                              nodeTmp.appendChild(document.createTextNode("$"+strtmptmp[jjj]+"$"));\r
-                              newFrag.appendChild(nodeTmp);\r
-                            } else {\r
-                                                 //all other tags will be mapped to span's (most should be font-face tags) with class-names matching the tag name. \r
-                              //Exceptions will be textcolor, colorbox, textbf, textit, and emph.  These cannot include any html tags.  \r
-                                                   var TagIndex = strtmptmp[jjj].search(/\\\w+/);\r
-                                                   var tmpIndex = TagIndex; \r
-                                                   while(tmpIndex>-1) {\r
-                                                      if(/^\\textcolor/.test(strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length))) { \r
-                                                         strtmptmp[jjj] = strtmptmp[jjj].replace(/\\textcolor\s*\{\s*(\w+)\s*\}\s*/," \\[textcolor\\]$1\\]|");\r
-                                                      } else { \r
-                                                         if(/^\\colorbox/.test(strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length))) { \r
-                                                            strtmptmp[jjj] = strtmptmp[jjj].replace(/\\colorbox\s*\{\s*(\w+)\s*\}\s*/," \\[colorbox\\]$1\\]|");\r
-                                                         } else {\r
-                                                            strtmptmp[jjj] = strtmptmp[jjj].substring(0,TagIndex)+strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length).replace(/\\\s*(\w+)\s*/," \\[$1\\]|");\r
-                                                         }\r
-                                                      }\r
-                                                      TagIndex +=strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length).search(/\|/);\r
-                                                      TagIndex++;\r
-                                                      strtmptmp[jjj] = strtmptmp[jjj].replace(/\\\]\|/,"\\] ");\r
-                                                      if(strtmptmp[jjj].charAt(TagIndex) == "{") {\r
-                                                         strtmptmp[jjj] = strtmptmp[jjj].substring(0,TagIndex)+strtmptmp[jjj].substring(TagIndex+1,strtmptmp[jjj].length); \r
-                                                         var delimcnt = 1;\r
-                                                         for(var kk = TagIndex;kk<strtmptmp[jjj].length;kk++) {\r
-                                                            if(strtmptmp[jjj].charAt(kk) == "{") { delimcnt++ };\r
-                                                            if(strtmptmp[jjj].charAt(kk) == "}") { delimcnt-- };\r
-                                                            if(delimcnt==0) { break; }\r
-                                                         }\r
-                                                            strtmptmp[jjj] = strtmptmp[jjj].substring(0,kk)+"\\[ "+strtmptmp[jjj].substring(kk+1,strtmptmp[jjj].length);\r
-                                                            TagIndex = kk+3;\r
-                                                      } else { \r
-                                                         strtmptmp[jjj] = strtmptmp[jjj].substring(0,TagIndex)+"\\[ "+strtmptmp[jjj].substring(TagIndex+1,strtmptmp[jjj].length);\r
-                                      TagIndex = TagIndex + 3;\r
-                                   }\r
-                                   if(TagIndex<strtmptmp[jjj].length) {\r
-                                      tmpIndex = strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length).search(/\\\w+/);\r
-                                   }\r
-                                                      else { \r
-                                                         tmpIndex = -1 };\r
-                                                      TagIndex += tmpIndex;\r
-                                                   }\r
-\r
-                                \r
-                                strtmptmp[jjj] = strtmptmp[jjj].replace(/\\\\\s*\\\\/g,"\\\\");\r
-                                                       strtmptmp[jjj] = strtmptmp[jjj].replace(/\\\\/g," \\[br\\] \\[ ");\r
-                                                               strtmptmp[jjj] = strtmptmp[jjj].replace(/\\label\s*\{\s*(\w+)\s*\}/g," \\[label\\]$1\\[ ");                      \r
-                                                               var strlbls = strtmptmp[jjj].split("\\[");\r
-                                \r
-                                       for(var jj=0;jj<strlbls.length;jj++) {\r
-                                          if(jj % 2) { //odd = labels, boldface, and breaks\r
-                                                                    var strtmparray = strlbls[jj].split("\\]");\r
-                                                             switch(strtmparray[0]) {\r
-                                                                       case "textcolor":\r
-                                                   var nodeTmp = document.createElement("span"); \r
-                                                   nodeTmp.className = 'LaTeXColor';\r
-                                                                                   if(IsColorName.test(strtmparray[1].toLowerCase())) {\r
-                                                                                      nodeTmp.style.color=LaTeXColor[strtmparray[1].toLowerCase()];\r
-                                                                                   } else { \r
-                                                                                      nodeTmp.style.color=strtmparray[1];\r
-                                                   };\r
-                                                   nodeTmp.appendChild(document.createTextNode(strtmparray[2]));\r
-                                                   newFrag.appendChild(nodeTmp);                                                                                      \r
-                                                break;\r
-                                                case "colorbox":\r
-                                                   var nodeTmp = document.createElement("span"); \r
-                                                   nodeTmp.className = 'LaTeXColor';\r
-                                                                                   if(IsColorName.test(strtmparray[1].toLowerCase())) {\r
-                                                                                      nodeTmp.style.background=LaTeXColor[strtmparray[1].toLowerCase()];\r
-                                                                                   } else { \r
-                                                                                      nodeTmp.style.background=strtmparray[1];\r
-                                                   };\r
-                                                   nodeTmp.appendChild(document.createTextNode(strtmparray[2]));\r
-                                                   newFrag.appendChild(nodeTmp);                                                                                      \r
-                                                break;\r
-                                                case "br":\r
-                                                                           newFrag.appendChild(document.createElement("br"));                                                                                                                  \r
-                                                                        break;\r
-                                                                    case "label" :\r
-                                                                          var nodeTmp = document.createElement("a");\r
-                                                                           nodeTmp.className = 'LaTeXMathMLlabel';\r
-                                                                           var lblid = strtmparray[1].match(/\s*(\w+)\s*/); \r
-                                                                           if(lblid != null) { nodeTmp.id = lblid[1] };\r
-                                                                           nodeTmp.style.display = "none";\r
-                                                                           \r
-                                            LaTeXCounter['label']++;\r
-                                            var lblnum = makeNumberString(LaTeXCounter['label']);\r
-                                                                           \r
-                                                                           var anchorSpan = document.createElement("span");\r
-                                                                           anchorSpan.className = 'LaTeXMathMLlabel';\r
-                                                                           anchorSpan.appendChild(document.createTextNode(lblnum));\r
-                                                                           anchorSpan.style.display="none";\r
-                                                                           nodeTmp.appendChild(anchorSpan);\r
-                                                                           newFrag.appendChild(nodeTmp);                                                   \r
-                                                                        break;\r
-                                                default :\r
-                                                   var nodeTmp = document.createElement("span"); \r
-                                                   nodeTmp.className = strtmparray[0];\r
-                                                   nodeTmp.appendChild(document.createTextNode(strtmparray[1]))\r
-                                                   newFrag.appendChild(nodeTmp);                                                                                      \r
-                                                                      }\r
-                                                                } else {\r
-                                                        newFrag.appendChild(document.createTextNode(strlbls[jj]));\r
-                                                                  }\r
-                                                               }\r
-                                                  }\r
-                                               }\r
-                               } // end else for even splits of strtmp\r
-                                }\r
-                  } \r
-            }; //else sections and labels\r
-            TheBody.parentNode.replaceChild(newFrag,TheBody); \r
-         } //str nodevalue is not empty\r
-      }\r
-   } // split off recursion\r
-   return TheBody;\r
-}\r
-\r
-function LaTeXDivsAndRefs(thebody) {\r
-   var TheBody = thebody;\r
-\r
-   var EndDivClass = null; \r
-   var AllDivs = TheBody.getElementsByTagName("div");\r
-   var lbl2id = "";\r
-   var lblnode = null;\r
-   for(var i=AllDivs.length-1;i>=0;i--) {\r
-      EndDivClass = AllDivs[i].className.match(/end\w+/ ); \r
-      if(EndDivClass!=null) {\r
-         EndDivClass = EndDivClass[0]; \r
-        var DivClass = EndDivClass.substring(3,EndDivClass.length);\r
-         var EndDivNode = AllDivs[i];\r
-         break; \r
-      } \r
-   }  \r
-   while(EndDivClass!=null) {\r
-      // TrackBack to Beginning, appending to newfrag as we go\r
-      var newFrag = document.createDocumentFragment();\r
-      var RootNode = EndDivNode.parentNode;\r
-      var ClassCount = 1; // because of EndDivNode\r
-      while(EndDivNode.previousSibling!=null && ClassCount>0) {\r
-        switch(EndDivNode.previousSibling.className) {\r
-           case EndDivClass:    \r
-              ClassCount++;\r
-              newFrag.insertBefore(EndDivNode.previousSibling,newFrag.firstChild);\r
-              break;\r
-           case DivClass: \r
-              if(EndDivNode.previousSibling.nodeName=="DIV") { \r
-                 ClassCount-- ;\r
-                 //Must check to see if we need a label here!\r
-                if(lbl2id !="" ) { \r
-                   EndDivNode.previousSibling.id = lbl2id;\r
-                   lbl2id = "" \r
-                }\r
-                if(ClassCount==0) { \r
-                    RootNode = EndDivNode.previousSibling; \r
-                 } else {\r
-                    newFrag.insertBefore(EndDivNode.previousSibling,newFrag.firstChild);\r
-                 }\r
-              };\r
-              break;\r
-           case 'LaTeXMathMLlabel':\r
-               lbl2id = EndDivNode.previousSibling.id; \r
-                 EndDivNode.parentNode.removeChild(EndDivNode.previousSibling);\r
-              break;\r
-           default:\r
-              newFrag.insertBefore(EndDivNode.previousSibling,newFrag.firstChild);\r
-            }\r
-      }\r
-      RootNode.appendChild(newFrag);\r
-      EndDivNode.parentNode.removeChild(EndDivNode);\r
-      \r
-      //Look for more end div items\r
-      AllDivs = TheBody.getElementsByTagName("DIV");\r
-      for(i=AllDivs.length-1;i>=0;i--) {\r
-         EndDivClass = AllDivs[i].className.match(/end\w+/ );\r
-         if(EndDivClass!=null) {\r
-           ClassCount = 0;\r
-            EndDivClass = EndDivClass[0]; \r
-           DivClass = EndDivClass.substring(3,EndDivClass.length);\r
-            EndDivNode = AllDivs[i];\r
-           RootNode = EndDivNode.parentNode;\r
-            break; \r
-         } \r
-       }     \r
-   } // end while!\r
-   \r
-   \r
-\r
-   \r
-   var AllDivs = TheBody.getElementsByTagName("div"); //Convert itemize and enumerate to html lists:\r
-   var DIV2LI = null;\r
-   \r
-   for(var i=0;i<AllDivs.length;i++) {\r
-      if( AllDivs[i].className=="itemize" || AllDivs[i].className=="enumerate" || AllDivs[i].className=="description")  { \r
-           if(AllDivs[i].className=="itemize") { \r
-               RootNode = document.createElement("UL");\r
-            } else { \r
-               RootNode = document.createElement("OL");\r
-            }\r
-           RootNode.className = 'LaTeXMathML';\r
-           if(AllDivs[i].hasChildNodes()) { AllDivs[i].removeChild(AllDivs[i].firstChild) };\r
-           while(AllDivs[i].hasChildNodes()) {\r
-              if(AllDivs[i].firstChild.hasChildNodes()) { \r
-                     DIV2LI = document.createElement("LI");\r
-                  while(AllDivs[i].firstChild.hasChildNodes()) {\r
-                     DIV2LI.appendChild(AllDivs[i].firstChild.firstChild);\r
-                 }\r
-                 if(DIV2LI.firstChild.className=="listitemmarker") {\r
-                    DIV2LI.style.listStyleType = "none"; \r
-                 }\r
-                 RootNode.appendChild(DIV2LI)\r
-              }\r
-              AllDivs[i].removeChild(AllDivs[i].firstChild);\r
-            }\r
-           AllDivs[i].appendChild(RootNode);\r
-      }\r
-   }\r
-       \r
-   // From here to 'end for AllAnchors is necessary only because CSS3 is not implemented yet.\r
-   // Once CSS3 target-text is available, this can be done using CSS\r
-   var AllAnchors = TheBody.getElementsByTagName("a");\r
-   for(var i=0;i<AllAnchors.length;i++) {\r
-      if(AllAnchors[i].className == "ref" || AllAnchors[i].className == "cite" ) {\r
-         var label = AllAnchors[i].href.match(/\#(\w+)/); \r
-         if(label!=null) { \r
-            var labelNode = document.getElementById(label[1]);\r
-            if(labelNode!=null) {\r
-               var TheSpans = labelNode.getElementsByTagName("SPAN");\r
-              if(TheSpans!=null) { \r
-                 var refNode = TheSpans[0].cloneNode(true);\r
-                 refNode.style.display="inline"\r
-                 refNode.className = AllAnchors[i].className;\r
-                 AllAnchors[i].appendChild(refNode);\r
-                 //break;\r
-              }       \r
-            }\r
-         }\r
-      }\r
-   } // end for AllAnchors\r
-\r
-   // Eventually: Collapsible Sections\r
-   \r
-   return TheBody;\r
-}\r
-\r
-var AMbody;\r
-var AMnoMathML = false, AMtranslated = false;\r
-\r
-function translate(spanclassAM) {\r
-  if (!AMtranslated) { // run this only once\r
-     AMtranslated = true;\r
-     AMinitSymbols();\r
-     var LaTeXContainers = [];\r
-     var AllContainers = document.getElementsByTagName('*');\r
-     var ExtendName = "";\r
-    \r
-     for (var k = 0,l=0; k < AllContainers.length; k++) {\r
-        ExtendName = " "+AllContainers[k].className+" ";        \r
-        if(ExtendName.match(/\sLaTeX\s/)!=null) { \r
-           LaTeXContainers[l] = AllContainers[k];\r
-           l++;\r
-        }\r
-     }; \r
-     if(LaTeXContainers.length>0) { \r
-        for(var m=0;m<LaTeXContainers.length;m++) {\r
-           AMbody = LaTeXContainers[m];\r
-           try {\r
-              AMbody = LaTeXDivsAndRefs(LaTeXpreProcess(AMbody)); //\r
-           } catch(err) { \r
-               alert("Unknown Error: Defaulting to Original LaTeXMathML");\r
-           }\r
-           if(AMbody.tagName=="PRE") {\r
-              var PreChilds = document.createDocumentFragment();\r
-              var DivChilds = document.createElement("DIV"); \r
-              while(AMbody.hasChildNodes()) {\r
-                 DivChilds.appendChild(AMbody.firstChild);\r
-              }\r
-              PreChilds.appendChild(DivChilds);\r
-              AMbody.parentNode.replaceChild(PreChilds,AMbody);\r
-              AMbody = DivChilds; //Leaves empty pre -- may be useful??\r
-              \r
-           }\r
-           AMprocessNode(AMbody, false, spanclassAM);\r
-        }\r
-     } else { //Default to entire page  \r
-        AMbody = document.getElementsByTagName("body")[0];\r
-        try {\r
-           AMbody = LaTeXDivsAndRefs(LaTeXpreProcess(AMbody)); //\r
-        } catch(err) { \r
-           alert("Unknown Error: Defaulting to Original LaTeXMathML");\r
-        }\r
-           AMprocessNode(AMbody, false, spanclassAM);\r
-     }\r
-  }\r
-}\r
-  \r
-if (isIE) { \r
-  // avoid adding MathPlayer info explicitly to each webpage\r
-  document.write("<object id=\"mathplayer\"\\r
-  classid=\"clsid:32F66A20-7614-11D4-BD11-00104BD3F987\"></object>");\r
-  document.write("<?import namespace=\"m\" implementation=\"#mathplayer\"?>");\r
-}\r
-\r
-// GO1.1 Generic onload by Brothercake\r
-// http://www.brothercake.com/\r
-//onload function (replaces the onload="translate()" in the <body> tag)\r
-function generic()\r
-{\r
-  translate();\r
-};\r
-//setup onload function\r
-if(typeof window.addEventListener != 'undefined')\r
-{\r
-  //.. gecko, safari, konqueror and standard\r
-  window.addEventListener('load', generic, false);\r
-}\r
-else if(typeof document.addEventListener != 'undefined')\r
-{\r
-  //.. opera 7\r
-  document.addEventListener('load', generic, false);\r
-}\r
-else if(typeof window.attachEvent != 'undefined')\r
-{\r
-  //.. win/ie\r
-  window.attachEvent('onload', generic);\r
-}\r
-//** remove this condition to degrade older browsers\r
-else\r
-{\r
-  //.. mac/ie5 and anything else that gets this far\r
-  //if there's an existing onload function\r
-  if(typeof window.onload == 'function')\r
-  {\r
-    //store it\r
-    var existing = onload;\r
-    //add new onload handler\r
-    window.onload = function()\r
-    {\r
-      //call existing onload function\r
-      existing();\r
-      //call generic onload function\r
-      generic();\r
-    };\r
-  }\r
-  else\r
-  {\r
-    //setup onload function\r
-    window.onload = generic;\r
-  }\r
-}\r