From a6f9e65af3c6aa4db2da09720cf397774c4153da Mon Sep 17 00:00:00 2001 From: "Davide P. Cervone" Date: Tue, 10 Mar 2015 19:08:32 -0400 Subject: [PATCH] Simplify mfrac layout. (Don't try to force the division line to be on the baseline so that it is always raised to the correct place by a vertical align of .25em; instead, just shift the whole stack appropriately. This may cause misalignment if we can't measure the parts exactly, however, but should speed things up a bit.) --- unpacked/jax/output/CommonHTML/jax.js | 50 +++++++++++---------------- 1 file changed, 20 insertions(+), 30 deletions(-) diff --git a/unpacked/jax/output/CommonHTML/jax.js b/unpacked/jax/output/CommonHTML/jax.js index 31a098fbc..dface4c11 100644 --- a/unpacked/jax/output/CommonHTML/jax.js +++ b/unpacked/jax/output/CommonHTML/jax.js @@ -34,7 +34,8 @@ var EVENT, TOUCH, HOVER; // filled in later var SCRIPTFACTOR = Math.sqrt(1/2), - AXISHEIGHT = .25; + AXISHEIGHT = .25, + HFUZZ = .05, DFUZZ = 0; // adjustments to bounding box of character boxes var STYLES = { ".MathJax_CHTML_Display": { @@ -52,11 +53,8 @@ }, "mjx-math *": {display:"inline-block", "text-align":"left"}, - "mjx-mfrac": {"vertical-align":".25em"}, - "mjx-fbox": {width:"100%"}, - "mjx-ftable": {display:"table", width:"100%"}, - "mjx-numerator": {display:"table-cell", "text-align":"center"}, - "mjx-denominator": {display:"table-cell", "text-align":"center"}, + "mjx-numerator": {display:"block", "text-align":"center"}, + "mjx-denominator": {display:"block", "text-align":"center"}, ".MJXc-fpad": {"padding-left":".1em", "padding-right":".1em"}, "mjx-stack": {display:"inline-block"}, @@ -555,8 +553,9 @@ } this.addCharList(node.firstChild,list,bbox); this.cleanBBox(bbox); - node.firstChild.style.paddingTop = this.Em(bbox.h); - node.firstChild.style.paddingBottom = this.Em(bbox.d); + bbox.h += HFUZZ; bbox.d += DFUZZ; bbox.t += HFUZZ; bbox.b += DFUZZ; + node.firstChild.style[bbox.h < 0 ? "marginTop" : "paddingTop"] = this.Em(bbox.h); + node.firstChild.style[bbox.d < 0 ? "marginBottom": "paddingBottom"] = this.Em(bbox.d); return bbox; }, @@ -911,7 +910,7 @@ if (this.inferred) return node; if (!this.CHTMLnodeID) {this.CHTMLnodeID = CHTML.GetID()}; var id = (this.id || "MJXc-Node-"+this.CHTMLnodeID); - return HTML.addElement(node,"mjx-"+this.type,{className:"MJXc-"+this.type, id:id}); + return HTML.addElement(node,"mjx-"+this.type,{id:id}); }, CHTMLnodeElement: function () { if (!this.CHTMLnodeID) {return null} @@ -1580,7 +1579,7 @@ toCommonHTML: function (node) { node = this.CHTMLdefaultNode(node,{ childNodes:["mjx-numerator","mjx-denominator"], - forceChild:true, noBBox:true + forceChild:true, noBBox:true, childCount:2 }); var values = this.getValues("linethickness","displaystyle","scriptlevel", "numalign","denomalign","bevelled"); @@ -1597,15 +1596,11 @@ // // Create the table for the fraction and set the alignment // - var frac = HTML.addElement(node,"mjx-itable",{},[ - ["mjx-row",{},[["mjx-fbox",{},[["mjx-ftable",{},[["mjx-row"]]]]]]], - ["mjx-row"] - ]); - var num = frac.firstChild.firstChild.firstChild.firstChild, denom = frac.lastChild; - num.appendChild(node.firstChild); - denom.appendChild(node.firstChild); - if (values.numalign !== "center") num.firstChild.style.textAlign = values.numalign; - if (values.denomalign !== "center") denom.firstChild.style.textAlign = values.denomalign; + var num = node.firstChild, denom = node.lastChild; + var frac = HTML.addElement(node,"mjx-box"); + frac.appendChild(num); frac.appendChild(denom); node.appendChild(frac); + if (values.numalign !== "center") num.style.textAlign = values.numalign; + if (values.denomalign !== "center") denom.style.textAlign = values.denomalign; // // Get the bounding boxes for the parts, and determine the placement // of the numerator and denominator @@ -1625,15 +1620,10 @@ t = Math.max(t,mt); q = (u - nbox.d*sscale) - (a + t/2); if (q < p) u += (p - q); q = (a - t/2) - (dbox.h*sscale - v); if (q < p) v += (p - q); - node.style.verticalAlign = CHTML.Em(a-t/2); - // - // Add the rule to the table - // - var rule = HTML.Element("mjx-row",{},[["mjx-cell",{},[["mjx-line"]]]]); - num.parentNode.appendChild(rule); rule = rule.firstChild.firstChild; - rule.style.borderTop = CHTML.Em(t)+" solid"; - num.firstChild.className += " MJXc-fpad"; nbox.L = nbox.R = .1; - denom.firstChild.className += " MJXc-fpad"; dbox.L = dbox.R = .1; + frac.style.verticalAlign = CHTML.Em(t/2-v); + num.style.borderBottom = CHTML.Em(t)+" solid"; + num.className += " MJXc-fpad"; nbox.L = nbox.R = .1; + denom.className += " MJXc-fpad"; dbox.L = dbox.R = .1; } // // Determine the new bounding box and place the parts @@ -1643,8 +1633,8 @@ CHTML.combineBBoxes(this.CHTML,dbox,0,-v,sscale); CHTML.cleanBBox(this.CHTML); u -= sscale*nbox.d + a + t/2; v -= sscale*dbox.h - a + t/2; - if (u > 0) num.firstChild.style.paddingBottom = CHTML.Em(u); - if (v > 0) denom.firstChild.style.paddingTop = CHTML.Em(v); + if (u > 0) num.style.paddingBottom = CHTML.Em(u); + if (v > 0) denom.style.paddingTop = CHTML.Em(v); // // Add nulldelimiterspace around the fraction // (TeXBook pg 150 and Appendix G rule 15e)