diff --git a/unpacked/jax/output/HTML-CSS/autoload/mmultiscripts.js b/unpacked/jax/output/HTML-CSS/autoload/mmultiscripts.js
index 0e213be85..0a000001f 100644
--- a/unpacked/jax/output/HTML-CSS/autoload/mmultiscripts.js
+++ b/unpacked/jax/output/HTML-CSS/autoload/mmultiscripts.js
@@ -108,6 +108,9 @@ MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () {
}
this.HTMLhandleSpace(span);
this.HTMLhandleColor(span);
+ var bbox = span.bbox;
+ bbox.dx = dx; bbox.s = s; bbox.u = u; bbox.v = v; bbox.delta = delta;
+ bbox.px = dx+base.bbox.w;
return span;
},
HTMLgetScripts: function (stack,s) {
@@ -143,6 +146,7 @@ MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () {
if (BOX[j]) {
BOX[j].bbox.w += s;
BOX[j].bbox.rw = Math.max(BOX[j].bbox.w,BOX[j].bbox.rw);
+ BOX[j].bbox.name = (["sub","sup","presub","presup"])[j];
this.HTMLcleanBBox(BOX[j].bbox);
}
}
diff --git a/unpacked/jax/output/HTML-CSS/autoload/multiline.js b/unpacked/jax/output/HTML-CSS/autoload/multiline.js
index 60916f630..d51af702c 100644
--- a/unpacked/jax/output/HTML-CSS/autoload/multiline.js
+++ b/unpacked/jax/output/HTML-CSS/autoload/multiline.js
@@ -531,6 +531,101 @@ MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () {
/**************************************************************************/
+ MML.mmultiscripts.Augment({
+ HTMLbetterBreak: function (info,state) {
+ if (!this.data[this.base]) {return false}
+ //
+ // Get the current breakpoint position and other data
+ //
+ var index = info.index.slice(0), i = info.index.shift(),
+ W, w, scanW, broken = (info.index.length > 0), better = false;
+ if (!broken) {info.W += info.w; info.w = 0}
+ info.scanW = info.W;
+ //
+ // Get the bounding boxes and the width of the scripts
+ //
+ var bbox = this.HTMLspanElement().bbox,
+ base = this.data[this.base].HTMLspanElement().bbox;
+ var dw = bbox.w - base.w;
+ //
+ // Add in the prescripts
+ //
+ info.scanW += bbox.dx; scanW = info.scanW;
+ //
+ // Check if the base can be broken
+ //
+ if (this.data[this.base].HTMLbetterBreak(info,state)) {
+ better = true; index = [this.base].concat(info.index); W = info.W; w = info.w;
+ if (info.penalty === PENALTY.newline) {better = broken = true}
+ }
+ //
+ // Add in the base if it is unbroken, and add the scripts
+ //
+ if (!broken) {this.HTMLaddWidth(this.base,info,scanW)}
+ info.scanW += dw; info.W = info.scanW;
+ info.index = []; if (better) {info.W = W; info.w = w; info.index = index}
+ return better;
+ },
+
+ HTMLmoveLine: function (start,end,span,state,values) {
+ var SPAN = this.HTMLspanElement(), data = SPAN.bbox, base = data,
+ stack = SPAN.firstChild, box = stack.firstChild, dx, BOX = {};
+ //
+ // Get the boxes for the scripts (if any)
+ //
+ while (box) {
+ if (box.bbox && box.bbox.name) {BOX[box.bbox.name] = box}
+ box = box.nextSibling;
+ }
+ //
+ // If this is the start, move the prescripts, if any.
+ //
+ if (start.length < 1) {
+ if (BOX.presub || BOX.presup) {
+ var STACK = HTMLCSS.createStack(span);
+ if (BOX.presup) {
+ HTMLCSS.addBox(STACK,BOX.presup);
+ HTMLCSS.placeBox(BOX.presup,data.dx-BOX.presup.bbox.w,data.u);
+ }
+ if (BOX.presub) {
+ HTMLCSS.addBox(STACK,BOX.presub);
+ HTMLCSS.placeBox(BOX.presub,data.dx+data.delta-BOX.presub.bbox.w,-data.v);
+ }
+ this.HTMLcombineBBoxes(STACK,span.bbox);
+ span.appendChild(STACK);
+ STACK.style.width = HTMLCSS.Em(data.dx);
+ }
+ }
+ //
+ // Move the proper part of the base
+ //
+ if (this.data[this.base]) {
+ if (start.length > 1) {
+ this.data[this.base].HTMLmoveSlice(start.slice(1),end.slice(1),span,state,values,"paddingLeft");
+ } else {
+ if (end.length <= 1) {this.data[this.base].HTMLmoveSpan(span,state,values)}
+ else {this.data[this.base].HTMLmoveSlice([],end.slice(1),span,state,values,"paddingRight")}
+ }
+ }
+ //
+ // If this is the end, check for super and subscripts, and move those
+ // by moving the stack that contains them, and shifting by the amount of the
+ // base that has been removed. Remove the empty base box from the stack.
+ //
+ if (end.length === 0) {
+ if (this.data[this.base]) {stack.removeChild(stack.firstChild)}
+ for (box = stack.firstChild; box; box = box.nextSibling)
+ {box.style.left = HTMLCSS.Em(HTMLCSS.unEm(box.style.left)-data.px)}
+ stack.bbox.w -= data.px; stack.style.width = HTMLCSS.Em(stack.bbox.w);
+ this.HTMLcombineBBoxes(stack,span.bbox);
+ span.appendChild(stack);
+ }
+ }
+
+ });
+
+ /**************************************************************************/
+
MML.mo.Augment({
//
// Override the method for checking line breaks to properly handle
@@ -628,7 +723,8 @@ MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () {
// use it to modify the default penalty
//
var linebreak = PENALTY[linebreakValue];
- if (linebreakValue === MML.LINEBREAK.AUTO && w >= PENALTY.spacelimit)
+ if (linebreakValue === MML.LINEBREAK.AUTO && w >= PENALTY.spacelimit &&
+ !this.mathbackground && !this.background)
{linebreak = [(w+PENALTY.spaceoffset)*PENALTY.spacefactor]}
if (!(linebreak instanceof Array)) {
// for breaks past the width, don't modify penalty
diff --git a/unpacked/jax/output/SVG/autoload/mmultiscripts.js b/unpacked/jax/output/SVG/autoload/mmultiscripts.js
index f7914ffd3..abe18801c 100644
--- a/unpacked/jax/output/SVG/autoload/mmultiscripts.js
+++ b/unpacked/jax/output/SVG/autoload/mmultiscripts.js
@@ -93,6 +93,8 @@ MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () {
svg.Clean();
this.SVGhandleColor(svg);
this.SVGsaveData(svg);
+ var data = this.SVGdata;
+ data.dx = dx; data.s = s; data.u = u, data.v = v; data.delta = delta;
return svg;
},
SVGgetScripts: function (s) {
diff --git a/unpacked/jax/output/SVG/autoload/multiline.js b/unpacked/jax/output/SVG/autoload/multiline.js
index 7fb753e19..415f13c5e 100644
--- a/unpacked/jax/output/SVG/autoload/multiline.js
+++ b/unpacked/jax/output/SVG/autoload/multiline.js
@@ -469,7 +469,7 @@ MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () {
}
//
// If this is the end, check for super and subscripts, and move those
- // by moving the stack tht contains them, and shifting by the amount of the
+ // by moving the stack that contains them, and shifting by the amount of the
// base that has been removed. Remove the empty base box from the stack.
//
if (end.length === 0) {
@@ -483,6 +483,77 @@ MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () {
/**************************************************************************/
+ MML.mmultiscripts.Augment({
+ SVGbetterBreak: function (info,state) {
+ if (!this.data[this.base]) {return false}
+ //
+ // Get the current breakpoint position and other data
+ //
+ var index = info.index.slice(0), i = info.index.shift(),
+ W, w, scanW, broken = (info.index.length > 0), better = false;
+ if (!broken) {info.W += info.w; info.w = 0}
+ info.scanW = info.W;
+ //
+ // The width of the postscripts
+ //
+ var dw = this.SVGdata.w - this.data[this.base].SVGdata.w - this.SVGdata.dx;
+ //
+ // Add in the prescripts
+ //
+ info.scanW += this.SVGdata.dx; scanW = info.scanW;
+ //
+ // Check if the base can be broken (but don't break between prescripts and base)
+ //
+ if (this.data[this.base].SVGbetterBreak(info,state)) {
+ better = true; index = [this.base].concat(info.index); W = info.W; w = info.w;
+ if (info.penalty === PENALTY.newline) {better = broken = true}
+ }
+ //
+ // Add in the base if it is unbroken, and add the postscripts
+ //
+ if (!broken) {this.SVGaddWidth(this.base,info,scanW)}
+ info.scanW += dw; info.W = info.scanW;
+ info.index = []; if (better) {info.W = W; info.w = w; info.index = index}
+ return better;
+ },
+
+ SVGmoveLine: function (start,end,svg,state,values) {
+ var dx, data = this.SVGdata;
+ //
+ // If this is the start, move the prescripts, if any.
+ //
+ if (start.length < 1) {
+ this.scriptBox = this.SVGgetScripts(this.SVGdata.s);
+ var presub = this.scriptBox[2], presup = this.scriptBox[3]; dx = svg.w + data.dx;
+ if (presup) {svg.Add(presup,dx+data.delta-presup.w,data.u)}
+ if (presub) {svg.Add(presub,dx-presub.w,-data.v)}
+ }
+ //
+ // Move the proper part of the base
+ //
+ if (this.data[this.base]) {
+ if (start.length > 1) {
+ this.data[this.base].SVGmoveSlice(start.slice(1),end.slice(1),svg,state,values,"paddingLeft");
+ } else {
+ if (end.length <= 1) {this.data[this.base].SVGmove(svg,state,values)}
+ else {this.data[this.base].SVGmoveSlice([],end.slice(1),svg,state,values,"paddingRight")}
+ }
+ }
+ //
+ // If this is the end, move the postscripts, if any.
+ //
+ if (end.length === 0) {
+ var sub = this.scriptBox[0], sup = this.scriptBox[1]; dx = svg.w + data.s;
+ if (sup) {svg.Add(sup,dx,data.u)}
+ if (sub) {svg.Add(sub,dx-data.delta,-data.v)}
+ delete this.scriptBox;
+ }
+ }
+
+ });
+
+ /**************************************************************************/
+
MML.mo.Augment({
//
// Override the method for checking line breaks to properly handle
@@ -579,8 +650,9 @@ MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () {
// use it to modify the default penalty
//
var linebreak = PENALTY[linebreakValue];
- if (linebreakValue === MML.LINEBREAK.AUTO && w >= PENALTY.spacelimit*1000)
- {linebreak = [(w+PENALTY.spaceoffset)*PENALTY.spacefactor]}
+ if (linebreakValue === MML.LINEBREAK.AUTO && w >= PENALTY.spacelimit*1000 &&
+ !this.mathbackground && !this.backrgound)
+ {linebreak = [(w/1000+PENALTY.spaceoffset)*PENALTY.spacefactor]}
if (!(linebreak instanceof Array)) {
// for breaks past the width, don't modify penalty
if (offset >= 0) {penalty = linebreak * info.nest}