diff --git a/unpacked/jax/output/CommonHTML/autoload/mmultiscripts.js b/unpacked/jax/output/CommonHTML/autoload/mmultiscripts.js
new file mode 100644
index 000000000..ebaa2ccb8
--- /dev/null
+++ b/unpacked/jax/output/CommonHTML/autoload/mmultiscripts.js
@@ -0,0 +1,272 @@
+/* -*- Mode: Javascript; indent-tabs-mode:nil; js-indent-level: 2 -*- */
+/* vim: set ts=2 et sw=2 tw=80: */
+
+/*************************************************************
+ *
+ * MathJax/jax/output/CommonHTML/autoload/mmultiscripts.js
+ *
+ * Implements the CommonHTML output for elements.
+ *
+ * ---------------------------------------------------------------------
+ *
+ * Copyright (c) 2015 The MathJax Consortium
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+MathJax.Hub.Register.StartupHook("CommonHTML Jax Ready",function () {
+ var VERSION = "2.5.0";
+ var MML = MathJax.ElementJax.mml,
+ HTML = MathJax.HTML,
+ CHTML = MathJax.OutputJax.CommonHTML;
+
+ MML.mmultiscripts.Augment({
+ toCommonHTML: function (node,stretch) {
+ node = this.CHTMLcreateNode(node);
+ this.CHTMLhandleStyle(node);
+ this.CHTMLhandleScale(node);
+ this.CHTMLgetVariant();
+ CHTML.BBOX.empty(this.CHTML);
+
+ //
+ // Get base node
+ //
+ this.CHTMLaddChild(node,0,{type:"mjx-base", noBBox:true, forceChild:true});
+ var base = node.firstChild, bbox = this.CHTMLbboxFor(0);
+ if (bbox.ic) {
+ bbox.R -= bbox.ic; // remove IC (added by mo and mi)
+ base.style.marginRight = CHTML.Em(-bbox.ic);
+ delta = 1.3*bbox.ic + .05; // make faked IC be closer to expeted results
+ }
+
+ //
+ // Collect scripts into horizontal boxes and add them into the node
+ //
+ var BOX = {}, BBOX = {};
+ this.CHTMLgetScripts(BOX,BBOX,stretch);
+ var sub = BOX.sub, sup = BOX.sup, presub = BOX.presub, presup = BOX.presup;
+ var sbox = BBOX.sub, Sbox = BBOX.sup, pbox = BBOX.presub, Pbox = BBOX.presup;
+ this.CHTMLaddBoxes(node,base,BOX);
+
+ //
+ // Get the initial values for the variables
+ //
+ var values = this.getValues("scriptlevel","scriptsizemultiplier");
+ var sscale = (this.Get("scriptlevel") < 3 ? values.scriptsizemultiplier : 1);
+ var ex = CHTML.TEX.x_height, s = CHTML.TEX.scriptspace;
+ var q = CHTML.TEX.sup_drop * sscale, r = CHTML.TEX.sub_drop * sscale;
+ var u = bbox.h - q, v = bbox.d + r, delta = 0, p;
+ var bmml = this.data[this.base];
+ if (bmml && (bmml.type === "mi" || bmml.type === "mo")) {
+ if (bmml.data.join("").length === 1 && bbox.rscale === 1 && !bbox.sH &&
+ !bmml.Get("largeop")) {u = v = 0}
+ }
+ values = this.getValues("displaystyle","subscriptshift","superscriptshift","texprimestyle");
+ values.subscriptshift = (values.subscriptshift === "" ? 0 : CHTML.length2em(values.subscriptshift));
+ values.superscriptshift = (values.superscriptshift === "" ? 0 : CHTML.length2em(values.superscriptshift));
+
+ var dx = (presub ? s+pbox.w : presup ? s+Pbox.w-delta : 0);
+ this.CHTML.combine(bbox,dx,0); var x = this.CHTML.w;
+
+ //
+ // Place the scripts as needed
+ //
+ if (!sup && !presup) {
+ v = Math.max(v,CHTML.TEX.sub1,values.subscriptshift);
+ if (sub) v = Math.max(v,sbox.h-(4/5)*ex);
+ if (presub) v = Math.max(v,pbox.h-(4/5)*ex);
+ if (sub) this.CHTMLplaceSubOnly(sub,sbox,x,v,s);
+ if (presub) this.CHTMLplacePresubOnly(presub,pbox,v,s);
+ } else {
+ if (!sub && !presub) {
+ p = CHTML.TEX[(values.displaystyle ? "sup1" : (values.texprimestyle ? "sup3" : "sup2"))];
+ u = Math.max(u,p,values.superscriptshift);
+ if (sup) u = Math.max(u,Sbox.d+(1/4)*ex);
+ if (presup) u = Math.max(u,Pbox.d+(1/4)*ex);
+ if (sup) this.CHTMLplaceSupOnly(sup,Sbox,x,delta,u,s);
+ if (presup) this.CHTMLplacePresupOnly(presup,Pbox,delta,u,s);
+ } else {
+ v = Math.max(v,CHTML.TEX.sub2);
+ var t = CHTML.TEX.rule_thickness;
+ var h = (sbox||pbox).h, d = (Sbox||Pbox).d;
+ if (presub) h = Math.max(h,pbox.h);
+ if (presup) d = Math.max(d,Pbox.d);
+ if ((u - d) - (h - v) < 3*t) {
+ v = 3*t - u + d + h; q = (4/5)*ex - (u - d);
+ if (q > 0) {u += q; v -= q}
+ }
+ u = Math.max(u,values.superscriptshift);
+ v = Math.max(v,values.subscriptshift);
+ if (sup) {
+ if (sub) {this.CHTMLplaceSubSup(sub,sbox,sup,Sbox,x,delta,u,v,s)}
+ else {this.CHTMLplaceSupOnly(sup,Sbox,x,delta,u,s)}
+ } else if (sub) {this.CHTMLplaceSubOnly(sub,sbox,x,v,s)}
+ if (presup) {
+ if (presub) {this.CHTMLplacePresubPresup(presub,pbox,presup,Pbox,delta,u,v,s)}
+ else {this.CHTMLplacePresupOnly(presup,Pbox,delta,u,s)}
+ } else if (presub) {this.CHTMLplacePresubOnly(presub,pbox,v,s)}
+ }
+ }
+ this.CHTML.clean();
+ this.CHTMLhandleSpace(node);
+ this.CHTMLhandleBBox(node);
+ this.CHTMLhandleColor(node);
+this.CHTMLdrawBBox(node);
+ return node;
+ },
+ //
+ // Get the subscript, superscript, presubscript, and presuperscript
+ // boxes, with proper spacing, and computer their bounding boxes.
+ //
+ CHTMLgetScripts: function (BOX,BBOX,stretch) {
+ var state = {i:1, w:0, BOX:BOX, BBOX:BBOX}, m = this.data.length;
+ var sub = "sub", sup = "sup";
+ while (state.i < m) {
+ if ((this.data[state.i]||{}).type === "mprescripts") {
+ state.i++; state.w = 0;
+ sub = "presub"; sup = "presup";
+ } else {
+ var sbox = this.CHTMLaddScript(sub,state);
+ var Sbox = this.CHTMLaddScript(sup,state);
+ var w = Math.max((sbox ? sbox.rscale*sbox.w : 0),(Sbox ? Sbox.rscale*Sbox.w : 0));
+ this.CHTMLpadScript(sub,w,sbox,state);
+ this.CHTMLpadScript(sup,w,Sbox,state);
+ state.w += w;
+ }
+ }
+ if (BBOX.sub) BBOX.sub.clean();
+ if (BBOX.sup) BBOX.sup.clean();
+ if (BBOX.presub) BBOX.presub.clean();
+ if (BBOX.presup) BBOX.presup.clean();
+ },
+ //
+ // Add a script to the proper box, creating the box if needed,
+ // and padding the box to account for any elements.
+ // Return the bounding box for the script for later use.
+ //
+ CHTMLaddScript: function (type,state) {
+ var BOX, BBOX, data = this.data[state.i];
+ if (data && data.type !== "none") {
+ BOX = state.BOX[type];
+ if (!BOX) {
+ BOX = state.BOX[type] = HTML.Element("mjx-"+type);
+ BBOX = state.BBOX[type] = CHTML.BBOX.empty();
+ if (state.w) {
+ BOX.style.paddingLeft = CHTML.Em(state.w);
+ BBOX.w = BBOX.r = state.w;
+ }
+ }
+ data.toCommonHTML(BOX);
+ BBOX = data.CHTML;
+ }
+ state.i++;
+ return BBOX;
+ },
+ //
+ // Add padding to the script box to make match the width of the
+ // super- or subscript that is above or below it, and adjust the
+ // bounding box for the script row. If these are pre-scripts,
+ // right-justify the scripts, otherwise, left-justify them.
+ //
+ CHTMLpadScript: function (type,w,bbox,state) {
+ if (!bbox) bbox = {w:0, fake:1};
+ var BBOX = state.BBOX[type], dx = 0, dw = 0;
+ if (BBOX) {
+ if (bbox.rscale*bbox.w < w) {
+ var BOX = state.BOX[type]; dw = w-bbox.rscale*bbox.w;
+ var space = HTML.Element("mjx-spacer",{style:{width:CHTML.Em(dw)}});
+ if (type.substr(0,3) === "pre" && !bbox.fake) {
+ BOX.insertBefore(space,BOX.lastChild);
+ dx = dw; dw = 0;
+ } else {
+ BOX.appendChild(space);
+ }
+ }
+ if (bbox.fake) {BBOX.w += dx} else {BBOX.combine(bbox,BBOX.w+dx,0)}
+ BBOX.w += dw;
+ }
+ },
+ //
+ // Add the boxes into the main node, creating stacks when needed
+ //
+ CHTMLaddBoxes: function (node,base,BOX) {
+ var sub = BOX.sub, sup = BOX.sup, presub = BOX.presub, presup = BOX.presup;
+ if (presub && presup) {
+ var prestack = HTML.Element("mjx-prestack"); node.insertBefore(prestack,base);
+ prestack.appendChild(presup); prestack.appendChild(presub);
+ } else {
+ if (presub) node.insertBefore(presub,base);
+ if (presup) node.insertBefore(presup,base);
+ }
+ if (sub && sup) {
+ var stack = HTML.addElement(node,"mjx-stack");
+ stack.appendChild(sup); stack.appendChild(sub);
+ } else {
+ if (sub) node.appendChild(sub);
+ if (sup) node.appendChild(sup);
+ }
+ },
+ //
+ // Handle positioning the various scripts
+ //
+ CHTMLplaceSubOnly: function (sub,sbox,x,v,s) {
+ sub.style.verticalAlign = CHTML.Em(-v);
+ sub.style.marginRight = CHTML.Em(s); sbox.w += s;
+ this.CHTML.combine(sbox,x,-v);
+ },
+ CHTMLplaceSupOnly: function (sup,Sbox,x,delta,u,s) {
+ sup.style.verticalAlign = CHTML.Em(u);
+ sup.style.paddingLeft = CHTML.Em(delta);
+ sup.style.paddingRight = CHTML.Em(s); Sbox.w += s;
+ this.CHTML.combine(Sbox,x+delta,u);
+ },
+ CHTMLplaceSubSup: function (sub,sbox,sup,Sbox,x,delta,u,v,s) {
+ sub.style.paddingRight = CHTML.Em(s); sbox.w += s;
+ sup.style.paddingBottom = CHTML.Em(u+v-Sbox.d-sbox.h);
+ sup.style.paddingLeft = CHTML.Em(delta);
+ sup.style.paddingRight = CHTML.Em(s); Sbox.w += s;
+ sup.parentNode.style.verticalAlign = CHTML.Em(-v);
+ this.CHTML.combine(sbox,x,-v);
+ this.CHTML.combine(Sbox,x+delta,u);
+ },
+ CHTMLplacePresubOnly: function (presub,pbox,v,s) {
+ presub.style.verticalAlign = CHTML.Em(-v);
+ presub.style.marginLeft = CHTML.Em(s);
+ this.CHTML.combine(pbox,s,-v);
+ },
+ CHTMLplacePresupOnly: function (presup,Pbox,delta,u,s) {
+ presup.style.verticalAlign = CHTML.Em(u);
+ presup.style.paddingLeft = CHTML.Em(s);
+ presup.style.paddingRight = CHTML.Em(-delta);
+ this.CHTML.combine(Pbox,s,u);
+ },
+ CHTMLplacePresubPresup: function (presub,pbox,presup,Pbox,delta,u,v,s) {
+ presub.style.paddingLeft = CHTML.Em(s);
+ presup.style.paddingBottom = CHTML.Em(u+v-Pbox.d-pbox.h);
+ presup.style.paddingLeft = CHTML.Em(delta+s);
+ presup.style.paddingRight = CHTML.Em(-delta);
+ presup.parentNode.style.verticalAlign = CHTML.Em(-v);
+ this.CHTML.combine(pbox,s,-v);
+ this.CHTML.combine(Pbox,s+delta,u);
+ },
+ //
+ // Handle stretchy bases
+ //
+ CHTMLstretchH: MML.mbase.CHTMLstretchH,
+ CHTMLstretchV: MML.mbase.CHTMLstretchV
+ });
+
+ MathJax.Hub.Startup.signal.Post("CommonHTML mmultiscripts Ready");
+ MathJax.Ajax.loadComplete(CHTML.autoloadDir+"/mmultiscripts.js");
+});
+
diff --git a/unpacked/jax/output/CommonHTML/jax.js b/unpacked/jax/output/CommonHTML/jax.js
index cf323d8b7..6a7f8e430 100644
--- a/unpacked/jax/output/CommonHTML/jax.js
+++ b/unpacked/jax/output/CommonHTML/jax.js
@@ -66,6 +66,8 @@
"mjx-stack > mjx-sup": {display:"block"},
"mjx-stack > mjx-sub": {display:"block"},
+ "mjx-prestack > mjx-presup": {display:"block"},
+ "mjx-prestack > mjx-presub": {display:"block"},
"mjx-delim-v > mjx-char": {transform:"scale(1)"}, // for Firefox to get horizontal alignment better
"mjx-delim-h": {display:"block"},
@@ -1707,7 +1709,7 @@
MML.munderover.Augment({
toCommonHTML: function (node,stretch) {
- var values = this.getValues("displaystyle","scriptlevel","accent","accentunder","align");
+ var values = this.getValues("displaystyle","accent","accentunder","align");
if (!values.displaystyle && this.data[this.base] != null &&
this.data[this.base].CoreMO().Get("movablelimits"))
return MML.msubsup.prototype.toCommonHTML.call(this,node,stretch);
@@ -1905,8 +1907,9 @@
MML.msubsup.Augment({
toCommonHTML: function (node,stretch) {
- var values = this.getValues("displaystyle","scriptlevel",
- "subscriptshift","superscriptshift","texprimestyle");
+ var values = this.getValues(
+ "displaystyle","subscriptshift","superscriptshift","texprimestyle"
+ );
//
// Get the nodes for base and limits
//
@@ -2009,7 +2012,7 @@
childNodes:["mjx-numerator","mjx-denominator"],
forceChild:true, noBBox:true, minChildren:2
});
- var values = this.getValues("linethickness","displaystyle","scriptlevel",
+ var values = this.getValues("linethickness","displaystyle",
"numalign","denomalign","bevelled");
var isDisplay = values.displaystyle;
//
@@ -2317,7 +2320,7 @@
MML.mglyph.Augment({toCommonHTML: MML.mbase.CHTMLautoload});
// MML.menclose.Augment({toCommonHTML: MML.mbase.CHTMLautoload});
// MML.maction.Augment({toCommonHTML: MML.mbase.CHTMLautoload});
-// MML.mmultiscripts.Augment({toCommonHTML: MML.mbase.CHTMLautoload});
+ MML.mmultiscripts.Augment({toCommonHTML: MML.mbase.CHTMLautoload});
/********************************************************/