--- /dev/null
+/*\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