+++ /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