"); // % sign
+ str = str.replace(/%[^\n]*(?=\n)/g,"");
+ str = str.replace(/%[^\r]*(?=\r)/g,""); //Used by Explorer
+ str = str.replace(/%[^\n]*$/,"") // End of text segment comment
+
+ if(isIE && str.match(/%/g) != null && IEcommentWarning) {
+ alert("Comments may not have parsed properly. Try putting in stuff
+ //and to identify non-display math content (sections, etc).
+
+ str = str.split("");
+ // var ntype = TheBody.nodeType;
+ var newFrag = document.createDocumentFragment();
+
+ for(var i=0;i
+ if(isIE) {
+ str[i] = str[i].replace(/\r/g," "); // replace \r by a space to aid spacing!
+ }
+
+
+ //items and appendix
+ str[i] = str[i].replace(/\\bibitem\s*([^\{]*\{\s*\w*\s*\})/g," \\[bibitem\\]$1\\[ ");
+ str[i] = str[i].replace(/\\bibitem\s*/g," \\[bibitem\\] \\[ ");
+ str[i] = str[i].replace(/\\item\s*\[\s*(\w+)\s*\]/g," \\[alistitem\\]$1\\[ ");
+ str[i] = str[i].replace(/\\item\s*/g," \\[alistitem\\] \\[ ");
+ str[i] = str[i].replace(/\\appendix/g," \\[appendix\\] \\[ ");
+
+
+ // \includegraphics[][]{image} -- no processing of options. This treatment is DANGEROUS. It assumes no html will be
+ // placed within the \begin{figure} ... \end{figure} structure, and the [\s\S] character class could lead to strange matches
+ str[i] = str[i].replace(/\\begin\s*\{\s*figure\s*\}([\s\S]+?)\\end\s*\{\s*figure\s*\}/g," \\[figure\\]$1\\[ ");
+ str[i] = str[i].replace(/\\begin\s*\{\s*table\s*\}([\s\S]+?)\\end\s*\{\s*table\s*\}/g," \\[table\\]$1\\[ ");
+ //str[i] = str[i].replace(/\\begin\s*\{\s*array\s*\}([\s\S]+?)\\end\s*\{\s*array\s*\}/g," \\[array\\]$1\\[ ");
+ //goal is to protect array \\ from being converted into linebreaks
+
+ //This construction allows css classes for divs for these elements, but the CSS will have to be supplied through a
+ //css file or in the header. (It makes sense to me that style files in LaTeX should correspond
+ //to css and/or xslt when translating to mathml, but \ref's are a problem).
+ str[i] = str[i].replace(/\\begin\s*\{\s*theorem\s*\}/g," \\[theorem\\]Theorem \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*theorem\s*\}/g," \\[endtheorem\\] \\[ ");
+
+ str[i] = str[i].replace(/\\begin\s*\{\s*definition\s*\}/g," \\[definition\\]Definition \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*definition\s*\}/g," \\[enddefinition\\] \\[ ");
+
+ str[i] = str[i].replace(/\\begin\s*\{\s*lemma\s*\}/g," \\[lemma\\]Lemma \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*lemma\s*\}/g," \\[endlemma\\] \\[ ");
+
+ str[i] = str[i].replace(/\\begin\s*\{\s*corollary\s*\}/g," \\[corollary\\]Corollary \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*corollary\s*\}/g," \\[endcorollary\\] \\[ ");
+
+ str[i] = str[i].replace(/\\begin\s*\{\s*proposition\s*\}/g," \\[proposition\\]Proposition \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*proposition\s*\}/g," \\[endproposition\\] \\[ ");
+
+ str[i] = str[i].replace(/\\begin\s*\{\s*example\s*\}/g," \\[example\\]Example \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*example\s*\}/g," \\[endexample\\] \\[ ");
+
+ str[i] = str[i].replace(/\\begin\s*\{\s*exercise\s*\}/g," \\[exercise\\]Exercise \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*exercise\s*\}/g," \\[endexercise\\] \\[ ");
+
+ str[i] = str[i].replace(/\\begin\s*\{\s*thebibliography\s*\}\s*\{\s*\w+\s*\}/g," \\[thebibliography\\]References \\[ ");
+ str[i] = str[i].replace(/\\begin\s*\{\s*thebibliography\s*\}/g," \\[thebibliography\\]References \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*thebibliography\s*\}/g," \\[endthebibliography\\]References \\[ ");
+
+
+ str[i] = str[i].replace(/\\begin\s*\{\s*proof\s*\}/g," \\[proof\\]Proof: \\[ ");
+ if(isIE) { //IE is just so weird
+ str[i] = str[i].replace(/\\end\s*\{\s*proof\s*\}/g,"\u220E \\[endproof\\] \\[ ");
+ } else {
+ str[i] = str[i].replace(/\\end\s*\{\s*proof\s*\}/g," \\[endproof\\] \\[ ");
+ }
+
+ //The frontmatter -- all translated to div's to be handled by CSS
+ str[i] = str[i].replace(/\\title\s*\{\s*([^\}]+)\}/g," \\[title\\] \\[$1 \\[endtitle\\] \\[ ");
+ str[i] = str[i].replace(/\\author\s*\{\s*([^\}]+)\}/g," \\[author\\] \\[$1 \\[endauthor\\] \\[ ");
+ str[i] = str[i].replace(/\\address\s*\{\s*([^\}]+)\}/g," \\[address\\] \\[$1 \\[endaddress\\] \\[ ");
+ str[i] = str[i].replace(/\\date\s*\{\s*([^\}]+)\}/g," \\[date\\] \\[$1 \\[enddate\\] \\[ ");
+ str[i] = str[i].replace(/\\begin\s*\{\s*keyword\s*\}/g," \\[keyword\\] \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*keyword\s*\}/g," \\[endkeyword\\] \\[ ");
+ str[i] = str[i].replace(/\\begin\s*\{\s*abstract\s*\}/g," \\[abstract\\] \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*abstract\s*\}/g," \\[endabstract\\] \\[ ");
+
+ //The rest of the environments -- Users can even "make up their own" -- but it avoids the array and tabular environments
+ str[i] = str[i].replace(/\\begin\s*\{\s*(?!array|tabular)(\w+)\s*\}/g," \\[$1\\] \\[ ");
+ str[i] = str[i].replace(/\\end\s*\{\s*(?!array|tabular)(\w+)\s*\}/g," \\[end$1\\] \\[ ");
+
+ //Next, we look at section--subsection stuff. This is nested -- this would be so much better if LaTeX used
+ //some type of \begin{sectionhead}...\end{sectionhead} structure
+ var sectionIndex = str[i].search(/\\section\s*\{\s*[\s\S]+\}/);
+
+ while(sectionIndex >= 0) {
+ str[i] = str[i].replace(/\\section\s*\{/ ," \\[section\\]");
+ var delimcnt = 1;
+ for(var ii=sectionIndex;ii= 0) {
+ str[i] = str[i].replace(/\\subsection\s*\{/ ," \\[subsection\\]");
+ var delimcnt = 1;
+ for(var ii=sectionIndex;ii= 0) {
+ str[i] = str[i].replace(/\\subsubsection\s*\{/ ," \\[subsubsection\\]");
+ var delimcnt = 1;
+ for(var ii=sectionIndex;ii= 0) { // caption may contain other { } structures -- but not displaymath!!
+ var tmp = strtmparray[1];
+ var delimcnt = 0;
+ var capstart = -1;
+ for(var pos=capIndex;pos0) {
+ capend = pos-1;
+ FIGcap = tmp.substring(capstart,pos);
+ break
+ }
+ }
+ }
+
+ var FIGtr2 = document.createElement("tr");
+ var FIGtd2 = document.createElement("td");
+ FIGtd2.className="caption";
+
+
+ var FIGanchor = document.createElement("a");
+ FIGanchor.className = "figure";
+ if(FIGlbl!=null) { FIGanchor.id = FIGlbl[1]; }
+ LaTeXCounter["figure"]++;
+ var fignmbr = makeNumberString(LaTeXCounter["figure"]);
+ var anchorSpan = document.createElement("span");
+ anchorSpan.className = "figure";
+ anchorSpan.style.display = "none";
+ anchorSpan.appendChild(document.createTextNode(fignmbr));
+ FIGanchor.appendChild(anchorSpan);
+ FIGtd2.appendChild(FIGanchor);
+
+ var FIGspan = document.createElement("span");
+ FIGspan.className = "figure"; //For CSS counters, comment this line
+ FIGspan.appendChild(document.createTextNode("Figure "+fignmbr+". " ) );
+ FIGtd2.appendChild(FIGspan);
+ FIGtd2.appendChild(document.createTextNode(""+FIGcap));
+ FIGtr2.appendChild(FIGtd2);
+ FIGtbody.appendChild(FIGtr2);
+ var IsSpecial = false;
+
+ var FIGinfo = strtmparray[1].match(/\\includegraphics\s*\{([^\}]+)\}/);
+ if(FIGinfo==null) { //options not processed, for now
+ FIGinfo = strtmparray[1].match(/\\includegraphics\s*\[[^\]]*\]\s*\{\s*([^\}]+)\s*\}/);
+ }
+ if(FIGinfo==null) {
+ FIGinfo = strtmparray[1].match(/\\special\s*\{\s*([^\}]+)\}/);
+ IsSpecial=true //Hook: Later can include "special" graphics commands
+ };
+
+ if(FIGinfo!=null) { //Caption will be above the image
+ var FIGtr1 = document.createElement("tr");
+ var FIGtd1 = document.createElement("td");
+ FIGtd1.className="image";
+ var FIGimg = document.createElement("img");
+ var FIGsrc = FIGinfo[1]; //options not processed, for now
+ FIGimg.src = FIGsrc;
+ FIGimg.alt = "Figure "+FIGsrc+" did not load";
+ FIGimg.title = "Figure "+fignmbr+". "+FIGcap;
+ FIGimg.id = "figure"+fignmbr;
+ FIGtd1.appendChild(FIGimg);
+ FIGtr1.appendChild(FIGtd1);
+ FIGtbody.appendChild(FIGtr1);
+ }
+ nodeTmp.appendChild(FIGtbody);
+ newFrag.appendChild(nodeTmp);
+ break;
+ case "table":
+ var nodeTmp = document.createElement("table");
+ if(strtmparray[1].search(/\\centering/) >= 0) {
+ nodeTmp.className = 'LaTeXtable centered';
+ nodeTmp.align = "center";
+ } else {
+ nodeTmp.className = 'LaTeXtable';
+ };
+ tableid++;
+ nodeTmp.id = "LaTeXtable"+tableid; //unique id for each table
+
+ var TABlbl = strtmparray[1].match(/\\label\s*\{\s*(\w+)\s*\}/);
+ strtmparray[1]=strtmparray[1].replace(/\\label\s*\{\w+\}/g,"");
+
+ var capIndex = strtmparray[1].search(/\\caption\s*\{[\s\S]+\}/);
+ var TABcap = "";
+
+ if(capIndex >= 0) { // caption may contain other { } structures -- but not displaymath!!
+ var tmp = strtmparray[1];
+ var delimcnt = 0;
+ var capstart = -1;
+ for(var pos=capIndex;pos0) {
+ capend = pos-1;
+ TABcap = tmp.substring(capstart,pos);
+ break
+ }
+ }
+ }
+
+ if(TABcap!="") {
+ var TABtbody = document.createElement("tbody");
+ var TABcaption = document.createElement("caption");
+ TABcaption.className="LaTeXtable centered";
+ var TABanchor = document.createElement("a");
+ TABanchor.className = "LaTeXtable";
+ if(TABlbl!=null) { TABanchor.id = TABlbl[1]; }
+ LaTeXCounter["table"]++;
+ var tabnmbr = makeNumberString(LaTeXCounter["table"]);
+ var anchorSpan = document.createElement("span");
+ anchorSpan.className = "LaTeXtable";
+ anchorSpan.style.display = "none";
+ anchorSpan.appendChild(document.createTextNode(tabnmbr));
+ TABanchor.appendChild(anchorSpan);
+ TABcaption.appendChild(TABanchor);
+
+ var TABspan = document.createElement("span");
+ TABspan.className = "LaTeXtable"; //For CSS counters, comment this line
+ TABspan.appendChild(document.createTextNode("Table "+tabnmbr+". " ) );
+ TABcaption.appendChild(TABspan);
+ TABcaption.appendChild(document.createTextNode(""+TABcap));
+ nodeTmp.appendChild(TABcaption);
+ }
+ var TABinfo = strtmparray[1].match(/\\begin\s*\{\s*tabular\s*\}([\s\S]+)\\end\s*\{\s*tabular\s*\}/);
+ if(TABinfo!=null) {
+ var TABtbody = document.createElement('tbody');
+ var TABrow = null;
+ var TABcell = null;
+ var row=0;
+ var col=0;
+
+ var TABalign = TABinfo[1].match(/^\s*\{([^\}]+)\}/);
+ TABinfo = TABinfo[1].replace(/^\s*\{[^\}]+\}/,"");
+ TABinfo = TABinfo.replace(/\\hline/g,""); //no horizontal bars
+ TABalign[1] = TABalign[1].replace(/\|/g,""); //no vertical bars
+ TABalign[1] = TABalign[1].replace(/\s/g,"");
+ TABinfo = TABinfo.split("\\\\"); // into rows
+ for(row=0;row -- access it with \cite, thus allowing appropriate labels!
+ if(strtmparray[1]!="") {
+ nodeSpan.appendChild(document.createTextNode(strtmparray[1]));
+ } else {
+ nodeSpan.appendChild(document.createTextNode("["+bibcntr+"]"));
+ }
+ nodeTmp.appendChild(nodeSpan);
+ newFrag.appendChild(nodeTmp);
+ break;
+ case "cite":
+ var nodeTmp = document.createElement("a");
+ nodeTmp.className = 'cite';
+ nodeTmp.name = 'cite';
+ nodeTmp.href = "#"+strtmparray[1];
+ newFrag.appendChild(nodeTmp);
+ break;
+ case "ref":
+ var nodeTmp = document.createElement("a");
+ nodeTmp.className = 'ref';
+ nodeTmp.name = 'ref';
+ nodeTmp.href = "#"+strtmparray[1];
+ newFrag.appendChild(nodeTmp);
+ break;
+ default :
+ var nodeTmp = document.createElement("div");
+ nodeTmp.className = strtmparray[0];
+ if( IsCounter.test(strtmparray[0]) ) {
+ LaTeXCounter[strtmparray[0]]++;
+ var nodeAnchor = document.createElement("a");
+ nodeAnchor.className = strtmparray[0];
+ var divnum = makeNumberString(LaTeXCounter[strtmparray[0]]);
+ var anchorSpan = document.createElement("span");
+ anchorSpan.className = strtmparray[0];
+ anchorSpan.appendChild(document.createTextNode(divnum));
+ anchorSpan.style.display="none";
+ nodeAnchor.appendChild(anchorSpan);
+ nodeTmp.appendChild(nodeAnchor);
+
+ var nodeSpan = document.createElement("span");
+ nodeSpan.className = strtmparray[0];
+ nodeSpan.appendChild(document.createTextNode(strtmparray[1]+" "+divnum+". "));
+ nodeTmp.appendChild(nodeSpan);
+ }
+ if(isIE) { //remove if IE supports :before and :after
+ if(strtmparray[0]==("thebibliography"||"abstract"||"keyword"||"proof")) {
+ var nodeSpan = document.createElement("span");
+ nodeSpan.className = strtmparray[0];
+ nodeSpan.appendChild(document.createTextNode(strtmparray[1]));
+ nodeTmp.appendChild(nodeSpan);
+ }
+ } //end of IE :before and :after fixes
+ if(strtmparray[0]=="endenumerate" || strtmparray[0]=="enditemize" || strtmparray[0]=="enddescription") {
+ var endDiv = document.createElement("div");
+ endDiv.className = "endlistitem";
+ newFrag.appendChild(endDiv);
+ }
+ newFrag.appendChild(nodeTmp);
+ if(strtmparray[0]=="enumerate" || strtmparray[0]=="itemize" || strtmparray[0]=="description") {
+ var endDiv = document.createElement("div");
+ endDiv.className = "listitem";
+ newFrag.appendChild(endDiv);
+ }
+ }
+ } else {
+ //even = text, labels, bf, and italics, and linebreaks, and math -- we now remove the math
+ strtmp[j] = strtmp[j].replace(/\\\$/g,"");
+ strtmp[j] = strtmp[j].replace(/\$([^\$]+)\$/g," \\[$1\\[ ");
+ strtmp[j] = strtmp[j].replace(//g,"\\$");
+ strtmp[j] = strtmp[j].replace(/\\begin\s*\{\s*math\s*\}([\s\S]+?)\\end\s*\{\s*math\s*\}/g," \\[$1\\[ ");
+
+ var strtmptmp = strtmp[j].split("\\[");
+
+ for(var jjj=0;jjj-1) {
+ if(/^\\textcolor/.test(strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length))) {
+ strtmptmp[jjj] = strtmptmp[jjj].replace(/\\textcolor\s*\{\s*(\w+)\s*\}\s*/," \\[textcolor\\]$1\\]|");
+ } else {
+ if(/^\\colorbox/.test(strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length))) {
+ strtmptmp[jjj] = strtmptmp[jjj].replace(/\\colorbox\s*\{\s*(\w+)\s*\}\s*/," \\[colorbox\\]$1\\]|");
+ } else {
+ strtmptmp[jjj] = strtmptmp[jjj].substring(0,TagIndex)+strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length).replace(/\\\s*(\w+)\s*/," \\[$1\\]|");
+ }
+ }
+ TagIndex +=strtmptmp[jjj].substring(TagIndex,strtmptmp[jjj].length).search(/\|/);
+ TagIndex++;
+ strtmptmp[jjj] = strtmptmp[jjj].replace(/\\\]\|/,"\\] ");
+ if(strtmptmp[jjj].charAt(TagIndex) == "{") {
+ strtmptmp[jjj] = strtmptmp[jjj].substring(0,TagIndex)+strtmptmp[jjj].substring(TagIndex+1,strtmptmp[jjj].length);
+ var delimcnt = 1;
+ for(var kk = TagIndex;kk=0;i--) {
+ EndDivClass = AllDivs[i].className.match(/end\w+/ );
+ if(EndDivClass!=null) {
+ EndDivClass = EndDivClass[0];
+ var DivClass = EndDivClass.substring(3,EndDivClass.length);
+ var EndDivNode = AllDivs[i];
+ break;
+ }
+ }
+ while(EndDivClass!=null) {
+ // TrackBack to Beginning, appending to newfrag as we go
+ var newFrag = document.createDocumentFragment();
+ var RootNode = EndDivNode.parentNode;
+ var ClassCount = 1; // because of EndDivNode
+ while(EndDivNode.previousSibling!=null && ClassCount>0) {
+ switch(EndDivNode.previousSibling.className) {
+ case EndDivClass:
+ ClassCount++;
+ newFrag.insertBefore(EndDivNode.previousSibling,newFrag.firstChild);
+ break;
+ case DivClass:
+ if(EndDivNode.previousSibling.nodeName=="DIV") {
+ ClassCount-- ;
+ //Must check to see if we need a label here!
+ if(lbl2id !="" ) {
+ EndDivNode.previousSibling.id = lbl2id;
+ lbl2id = ""
+ }
+ if(ClassCount==0) {
+ RootNode = EndDivNode.previousSibling;
+ } else {
+ newFrag.insertBefore(EndDivNode.previousSibling,newFrag.firstChild);
+ }
+ };
+ break;
+ case 'LaTeXMathMLlabel':
+ lbl2id = EndDivNode.previousSibling.id;
+ EndDivNode.parentNode.removeChild(EndDivNode.previousSibling);
+ break;
+ default:
+ newFrag.insertBefore(EndDivNode.previousSibling,newFrag.firstChild);
+ }
+ }
+ RootNode.appendChild(newFrag);
+ EndDivNode.parentNode.removeChild(EndDivNode);
+
+ //Look for more end div items
+ AllDivs = TheBody.getElementsByTagName("DIV");
+ for(i=AllDivs.length-1;i>=0;i--) {
+ EndDivClass = AllDivs[i].className.match(/end\w+/ );
+ if(EndDivClass!=null) {
+ ClassCount = 0;
+ EndDivClass = EndDivClass[0];
+ DivClass = EndDivClass.substring(3,EndDivClass.length);
+ EndDivNode = AllDivs[i];
+ RootNode = EndDivNode.parentNode;
+ break;
+ }
+ }
+ } // end while!
+
+
+
+
+ var AllDivs = TheBody.getElementsByTagName("div"); //Convert itemize and enumerate to html lists:
+ var DIV2LI = null;
+
+ for(var i=0;i0) {
+ for(var m=0;m");
+ document.write("");
+}
+
+// GO1.1 Generic onload by Brothercake
+// http://www.brothercake.com/
+//onload function (replaces the onload="translate()" in the tag)
+function generic()
+{
+ translate();
+};
+//setup onload function
+if(typeof window.addEventListener != 'undefined')
+{
+ //.. gecko, safari, konqueror and standard
+ window.addEventListener('load', generic, false);
+}
+else if(typeof document.addEventListener != 'undefined')
+{
+ //.. opera 7
+ document.addEventListener('load', generic, false);
+}
+else if(typeof window.attachEvent != 'undefined')
+{
+ //.. win/ie
+ window.attachEvent('onload', generic);
+}
+//** remove this condition to degrade older browsers
+else
+{
+ //.. mac/ie5 and anything else that gets this far
+ //if there's an existing onload function
+ if(typeof window.onload == 'function')
+ {
+ //store it
+ var existing = onload;
+ //add new onload handler
+ window.onload = function()
+ {
+ //call existing onload function
+ existing();
+ //call generic onload function
+ generic();
+ };
+ }
+ else
+ {
+ //setup onload function
+ window.onload = generic;
+ }
+}