added LaTeXMathML files
authorJim Pryor <profjim@jimpryor.net>
Wed, 1 Jun 2011 07:46:16 +0000 (03:46 -0400)
committerJim Pryor <profjim@jimpryor.net>
Wed, 1 Jun 2011 07:46:16 +0000 (03:46 -0400)
Signed-off-by: Jim Pryor <profjim@jimpryor.net>
LaTeXMathML.js [new file with mode: 0644]
LaTeXMathML.standardarticle.css [new file with mode: 0644]

diff --git a/LaTeXMathML.js b/LaTeXMathML.js
new file mode 100644 (file)
index 0000000..7282569
--- /dev/null
@@ -0,0 +1,2368 @@
+/*\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
diff --git a/LaTeXMathML.standardarticle.css b/LaTeXMathML.standardarticle.css
new file mode 100644 (file)
index 0000000..a3eb5bd
--- /dev/null
@@ -0,0 +1,606 @@
+/* Standard Article Style for use with LaTeXMathML */\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
+/* Modification of a style from Arun Ram */\r
+/* Department of Mathematics */\r
+/* University of Wisconsin, Madison */ \r
+/* Madison, WI 53706 USA */\r
+/* This is the style information from the mathml template at */\r
+/* http://www.math.wisc.edu/~ram/MathGlossary/template.xml */\r
+/*\r
+/* See http://www.math.wisc.edu/~ram/MathGlossary/mathmlguide.xml for details */\r
+/* */\r
+/* Dr. Arun Ram's work was supported in part by the National Science Foundation under Grant No. 0353038. \r
+\r
+/* Internet Explorer does not support before/after tags.  If it ever does, then the original \r
+   LaTeXMathML.js script will have to be modified by removing all "if" structures that begin as \r
+       if(isIE) { //remove if IE supports :before and :after\r
+*/\r
+\r
+/* To transform to CSS counters, do the following: (note: this is for section.item numbering); \r
+    1. Change all span.xxx to display: none \r
+    2. Add style to body to reset section counter: For example: \r
+         body {    counter-reset: section 0  appendixsection 0}\r
+\r
+    3. Add the following style to reset counters after every section change\r
+         a.section { counter-reset: eqn 0 figure 0 subsection 0 subsubsection 0 definition 0 \r
+                                    proposition 0 lemma 0 theorem 0 corollary 0 example 0 exercise 0 ;  \r
+         } \r
+         a.appendixsection { counter-reset: eqn 0 figure 0 subsection 0 subsubsection 0 definition 0 \r
+                                    proposition 0 lemma 0 theorem 0 corollary 0 example 0 exercise 0 ;  \r
+         } \r
+\r
+    4. For all numbered LaTeX items, set the a.xxx:before to content: counter(section) "."  counter(item) \r
+       and also, add    counter-increment: item 1 \r
+       \r
+       For example: (Internet Explorer does nto support :before and :after pseudotags -- or counters!)\r
+       \r
+         a.subsection:before {\r
+             content: counter(section) ". " counter(subsection);\r
+             counter-increment: subsection 1;  \r
+         } \r
+         \r
+    5. For \ref cross-references, add the line (note: no browser currently supports this!)\r
+       \r
+         a.ref:before{ content: target-text(attr(href),before) }\r
+\r
+       For \cite cross-references, add the line (note: no browser currently supports this!)\r
+       \r
+         a.cite:before{ content: target-text(attr(href),before) }\r
+\r
+Note: Alternatively, just uncomment all the commented items below! This will produce \r
+   nice results in Firefox and Other CSS2 compliant browsers, but cross-references will not be related\r
+   to CSS counters until CSS 3 is supported\r
+\r
+*/    \r
+\r
+\r
+/* body {\r
+    counter-reset: section 0 enumerate 0 bibitem 0; \r
+} */\r
+\r
+\r
+LaTeX {/* Marks Containers with LaTeX code to be parsed */  \r
+}\r
+\r
+div.title {\r
+    text-align:center;\r
+    font-style: normal; \r
+    font-weight: bold; \r
+    font-size: 150%;\r
+}\r
+\r
+div.author {\r
+    text-align:center;\r
+    font-style: normal; \r
+    font-size: 130%;     \r
+}\r
+\r
+div.address {\r
+    text-align:center;\r
+    font-style:normal; \r
+}\r
+\r
+div.date {\r
+    text-align:center;\r
+    font-style: normal; \r
+}\r
+\r
+div.abstract {\r
+    font-style: normal;\r
+    margin-left: 5%;\r
+    margin-right: 5%;\r
+    padding-bottom: 10px;\r
+    padding-top: 10px;\r
+}\r
+\r
+div.abstract:before {\r
+    font-style: normal;\r
+    font-weight: bold;\r
+    font-size: 105%; \r
+    content: "Abstract:";     \r
+} \r
+\r
+div.keyword {\r
+    font-style: normal;\r
+    margin-left: 5%;\r
+    margin-right: 5%;\r
+    padding-bottom: 10px;\r
+    padding-top: 10px;\r
+}\r
+\r
+div.keyword:before {\r
+    font-style: normal;\r
+    font-weight: bold;\r
+    font-size: 105%; \r
+    content: "Keywords:";     \r
+} \r
+\r
+.centered {\r
+   text-align:center;\r
+   margin-left:auto; \r
+   margin-right:auto;\r
+}\r
+\r
+h2.section {\r
+   margin-bottom:0.25em;\r
+   margin-top:1em;\r
+}\r
+\r
+h3.subsection {\r
+   margin-bottom:0.25em;\r
+   margin-top:0.75em;\r
+}\r
+\r
+h4.subsubsection {\r
+   margin-bottom:0.25em;\r
+   margin-top:0.5em;\r
+}\r
+\r
+div.enumerate {\r
+}\r
+\r
+div.itemize {\r
+}\r
+\r
+/* vertical spacing */\r
+\r
+p.LaTeXMathML {\r
+       font-size: 0.25em;\r
+}\r
+\r
+p.smallskip {  \r
+   font-size: 1.5em;\r
+}\r
+\r
+p.medskip {\r
+    font-size: 3em;\r
+}\r
+\r
+p.bigskip {\r
+    font-size: 4.5em;\r
+}\r
+\r
+\r
+/* Font-face LaTeX spans */\r
+\r
+span.textbf {\r
+   font-weight:bold;\r
+}\r
+\r
+span.textit {\r
+   font-style:italic;\r
+}\r
+\r
+span.emph {\r
+   font-style:italic;\r
+   font-weight:bolder;\r
+}\r
+\r
+span.textsc {\r
+   font-variant:small-caps\r
+}\r
+\r
+span.textsl {\r
+   font-style:oblique;\r
+}\r
+\r
+span.textsf {\r
+   font-family:sans-serif, Arial, Helvetica;\r
+}\r
+\r
+span.texttt {\r
+       font-family:monospace,"Courier New", Courier;\r
+}\r
+\r
+span.tiny {\r
+       font-size:xx-small;\r
+}\r
+\r
+span.scriptsize{\r
+       font-size:x-small;\r
+}\r
+\r
+span.footnotesize {\r
+       font-size:small;\r
+}\r
+\r
+span.small {\r
+       font-size:small;\r
+}\r
+\r
+span.normalsize {\r
+       font-size:medium;\r
+}\r
+\r
+\r
+span.Large {\r
+       font-size:x-large;\r
+}\r
+\r
+span.LARGE {\r
+       font-size:xx-large;\r
+}\r
+\r
+span.large {\r
+       font-size:large;\r
+}\r
+\r
+span.huge {\r
+       font-size:x-large;\r
+       font-weight:bolder;\r
+}\r
+\r
+span.HUGE {\r
+       font-size:xx-large;\r
+       font-weight:bolder;\r
+}\r
+\r
+\r
+/* sections */\r
+\r
+span.section { font-style: normal; /* display: none */ }\r
+\r
+/* a.section { counter-reset: eqn 0 figure 0 subsection 0 subsubsection 0 definition 0 \r
+                           proposition 0 lemma 0 theorem 0 corollary 0 example 0 exercise 0 ;  \r
+} \r
+\r
+a.appendixsection { counter-reset: eqn 0 figure 0 subsection 0 subsubsection 0 definition 0 \r
+                           proposition 0 lemma 0 theorem 0 corollary 0 example 0 exercise 0 ;\r
+}\r
+*/\r
+\r
+\r
+/* subsections */\r
+\r
+span.subsection { font-style: normal; /* display: none */ }\r
+\r
+/* a.subsection {\r
+    counter-reset: subsubsection 0;\r
+}\r
+\r
+a.subsection:before {\r
+    content: counter(section) ". " counter(subsection);\r
+    counter-increment: subsection;  \r
+} \r
+*/\r
+\r
+/* subsubsections */\r
+span.subsubsection{ font-style: normal; /* display: none */ }\r
+\r
+/* a.subsubsection:before {\r
+    content: counter(section) ". " counter(subsection);\r
+    counter-increment: subsection;  \r
+} \r
+*/\r
+\r
+/* figures */\r
+table.figure {\r
+   width:100%;\r
+}\r
+   \r
+td.caption {\r
+   text-align:center;\r
+}\r
+\r
+/* td.caption:before {\r
+   content: "Figure";\r
+   font-style: normal; \r
+   font-weight: bold \r
+}\r
+*/\r
+\r
+td.image {\r
+   text-align:center;\r
+}\r
+\r
+span.figure {  font-weight: bold; /* display: none */ }\r
+\r
+/*a.figure:before {\r
+   content: counter(section) "." counter(figure);\r
+   counter-increment: figure;  \r
+   font-style: normal; \r
+   font-weight: bold;\r
+}\r
+\r
+a.figure:after { content: "." }\r
+*/\r
+\r
+/* LaTeXtable  configuration */\r
+\r
+table.LaTeXtable {\r
+\r
+}\r
+\r
+table.LaTeXtable tbody {\r
+   text-align:center;\r
+   margin-left:auto; \r
+   margin-right:auto;\r
+}\r
+\r
+\r
+/* table.LaTeXtable td.caption:before {\r
+   content: "Table ";\r
+   font-style: normal; \r
+   font-weight: bold \r
+}\r
+*/\r
+\r
+/*table.LaTeXtable td.tabular table.tabular {\r
+   text-align:center;  \r
+} */\r
+\r
+span.LaTeXtable {  font-weight: bold; /* display: none */ }\r
+\r
+/*a.LaTeXtable:before {\r
+   content: counter(section) "." counter(LaTeXtable);\r
+   counter-increment: LaTeXtable;  \r
+   font-style: normal; \r
+   font-weight: bold;\r
+}\r
+\r
+a.LaTeXtable:after { content: "." }\r
+*/\r
+\r
+/* Inline equation */\r
+\r
+span.inlinemath {\r
+        \r
+}\r
+\r
+/* equation -- numbering in script to accomodate IE */\r
+table.displayequation {\r
+   width:100%;\r
+   }\r
+   \r
+td.eq {\r
+   text-align:center;\r
+}\r
+\r
+td.eqno {\r
+    width: 10px;\r
+    text-align:right;\r
+}\r
+\r
+span.eqno {  font-style: normal; /* display: none */ }\r
+\r
+/* td.eqno:before { content: "(" }\r
+\r
+a.eqno:before {\r
+   content: counter(section) "." counter(equation);\r
+   counter-increment: equation;  \r
+   font-style: normal; \r
+}\r
+\r
+a.eqno:after { content: ")" }\r
+*/\r
+\r
+/* definition style, including number */\r
+span.definition { \r
+   font-weight: bold; \r
+   font-style: normal;\r
+   /* display: none */ \r
+}\r
+\r
+/* div.definition:before { \r
+    content: "Definition"; \r
+    font-style: normal; \r
+    font-weight: bold \r
+}\r
+\r
+a.definition:before {\r
+    content: counter(section) "." counter(definition); \r
+    counter-increment: definition 1;\r
+    font-style: normal; \r
+    font-weight: bold; \r
+}\r
+\r
+a.definition:after { content: "." }\r
+*/\r
+\r
+div.definition{ font-style:italic }\r
+\r
+/* proposition style, including number */\r
+span.proposition {  \r
+   font-weight: bold; \r
+   font-style: normal;\r
+   /* display: none */ \r
+}\r
+\r
+/* div.proposition:before { \r
+    content: "Proposition"; \r
+    font-style: normal; \r
+    font-weight: bold \r
+}\r
+\r
+a.proposition:before {\r
+    content: counter(section) "." counter(proposition); \r
+    counter-increment: proposition 1;\r
+    font-style: normal; \r
+    font-weight: bold; \r
+}\r
+\r
+a.proposition:after { content: "." }\r
+*/\r
+\r
+div.proposition{ font-style:italic }\r
+\r
+/* lemma style, including number */\r
+span.lemma {  \r
+   font-weight: bold; \r
+   font-style: normal;\r
+   /* display: none */ \r
+}\r
+\r
+/* div.lemma:before { \r
+    content: "Lemma"; \r
+    font-style: normal; \r
+    font-weight: bold \r
+}\r
+\r
+a.lemma:before {\r
+    content: counter(section) "." counter(lemma); \r
+    counter-increment: lemma 1;\r
+    font-style: normal; \r
+    font-weight: bold; \r
+}\r
+\r
+a.lemma:after { content: "." }\r
+*/ \r
+\r
+div.lemma{ font-style:italic }\r
+\r
+/* theorem style, including number */\r
+span.theorem { \r
+   font-weight: bold; \r
+   font-style: normal;\r
+   /* display: none */ \r
+}\r
+\r
+/* div.theorem:before { \r
+    content: "Theorem"; \r
+    font-style: normal; \r
+    font-weight: bold \r
+}\r
+\r
+a.theorem:before {\r
+    content: counter(section) "." counter(theorem); \r
+    counter-increment: theorem 1;\r
+    font-style: normal; \r
+    font-weight: bold; \r
+}\r
+\r
+a.theorem:after { content: "." }\r
+*/\r
+\r
+div.theorem{ font-style:italic }\r
+\r
+/* corollary style, including number */\r
+span.corollary { \r
+   font-weight: bold; \r
+   font-style: normal;\r
+   /* display: none */ \r
+}\r
+\r
+/* div.corollary:before { \r
+    content: "Corollary"; \r
+    font-style: normal; \r
+    font-weight: bold \r
+}\r
+\r
+a.corollary:before {\r
+    content: counter(section) "." counter(corollary); \r
+    counter-increment: corollary 1;\r
+    font-style: normal; \r
+    font-weight: bold; \r
+}\r
+\r
+a.corollary:after { content: "." }\r
+*/ \r
+\r
+div.corollary{ font-style:italic }\r
+\r
+/* example style, including number */\r
+span.example { \r
+   font-weight: bold; \r
+   font-style: normal;\r
+   /* display: none */ \r
+}\r
+\r
+/* div.example:before { \r
+    content: "Example"; \r
+    font-style: normal; \r
+    font-weight: bold \r
+}\r
+\r
+a.example:before {\r
+    content: counter(section) "." counter(example); \r
+    counter-increment: example 1;\r
+    font-style: normal; \r
+    font-weight: bold; \r
+}\r
+\r
+a.example:after { content: "." }\r
+*/ \r
+\r
+div.example {\r
+    font-style: normal;\r
+    margin-left: 5%;\r
+    margin-right: 5%;\r
+    padding-bottom: 10px;\r
+    padding-top: 10px;\r
+}\r
+\r
+/* exercise style, including number */\r
+span.exercise {  \r
+   font-weight: bold; \r
+   font-style: normal;\r
+   /* display: none */ \r
+}\r
+\r
+/* div.exercise:before { \r
+    content: "Exercise"; \r
+    font-style: normal; \r
+    font-weight: bold \r
+}\r
+\r
+a.exercise:before {\r
+    content: counter(section) "." counter(exercise); \r
+    counter-increment: exercise 1;\r
+    font-style: normal; \r
+    font-weight: bold; \r
+}\r
+\r
+a.exercise:after { content: "." }\r
+*/ \r
+\r
+/* thebibliography style, including number */\r
+div.thebibliography {\r
+    font-style: normal;\r
+    padding-top: 15px;\r
+}\r
+\r
+div.thebibliography:before { \r
+    content: "References"; \r
+    font-style: normal; \r
+    font-weight: bold \r
+}\r
+\r
+a.bibitem {\r
+    font-style: normal; \r
+    font-weight: bold; \r
+}\r
+\r
+\r
+/* Proof style, including number */\r
+div.proof:before { \r
+    content: "Proof:"; \r
+    font-style: normal; \r
+    font-weight: bold \r
+}\r
+\r
+div.proof:after {\r
+   content: "\220E";\r
+   font-weight: bold \r
+}\r
+\r
+/* cites and refs */\r
+a.cite {\r
+    font-style: normal; \r
+}\r
+\r
+a.ref {\r
+    font-style: normal; \r
+}\r
+\r
+/* a.ref:before{ \r
+    content: target-text(attr(href),before) \r
+}\r
+\r
+      \r
+a.cite:before{ \r
+   content: target-text(attr(href),before) \r
+}\r
+*/
\ No newline at end of file