From dc9e4a760ee6dd393efcee9093fb51223213f29c Mon Sep 17 00:00:00 2001 From: "Davide P. Cervone" Date: Thu, 30 Aug 2012 13:54:32 -0400 Subject: [PATCH] Allow line breaks at delimiters and separators in mfenced elements, and fix up some issues with lines going over the maximum width (due to forgetting to add width of first element after a split). Resolves issue #255. --- jax/output/HTML-CSS/autoload/multiline.js | 2 +- jax/output/SVG/autoload/multiline.js | 2 +- .../jax/output/HTML-CSS/autoload/multiline.js | 62 ++++++++++--------- unpacked/jax/output/SVG/autoload/multiline.js | 61 +++++++++--------- 4 files changed, 66 insertions(+), 61 deletions(-) diff --git a/jax/output/HTML-CSS/autoload/multiline.js b/jax/output/HTML-CSS/autoload/multiline.js index 8d1f6be7c..d13954488 100644 --- a/jax/output/HTML-CSS/autoload/multiline.js +++ b/jax/output/HTML-CSS/autoload/multiline.js @@ -12,5 +12,5 @@ * http://www.apache.org/licenses/LICENSE-2.0 */ -MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var d="2.0.3";var a=MathJax.ElementJax.mml,b=MathJax.OutputJax["HTML-CSS"];var e={newline:0,nobreak:1000000,goodbreak:[-200],badbreak:[+200],auto:[0],toobig:500,nestfactor:400,spacefactor:-100,spaceoffset:2,spacelimit:1,fence:500,close:500};var c={linebreakstyle:"after"};a.mbase.Augment({HTMLlinebreakPenalty:e,HTMLmultiline:function(n){var o=this;while(o.inferred||(o.parent&&o.parent.type==="mrow"&&o.parent.data.length===1)){o=o.parent}var l=((o.type==="math"&&o.Get("display")==="block")||o.type==="mtd");o.isMultiline=true;var p=this.getValues("linebreak","linebreakstyle","lineleading","linebreakmultchar","indentalign","indentshift","indentalignfirst","indentshiftfirst","indentalignlast","indentshiftlast");if(p.linebreakstyle===a.LINEBREAKSTYLE.INFIXLINEBREAKSTYLE){p.linebreakstyle=this.Get("infixlinebreakstyle")}p.lineleading=b.length2em(p.lineleading,1,0.5);this.HTMLremoveColor(n);var m=b.createStack(n);var f={n:0,Y:0,scale:this.HTMLgetScale(),isTop:l,values:{},VALUES:p},k=this.HTMLgetAlign(f,{}),h=this.HTMLgetShift(f,{},k),g=[],i={index:[],penalty:e.nobreak,w:0,W:h,shift:h,scanW:h,nest:0},j=false;while(this.HTMLbetterBreak(i,f)&&(i.scanW>=b.linebreakWidth||i.penalty==e.newline)){this.HTMLaddLine(m,g,i.index,f,i.values,j);g=i.index.slice(0);j=true;k=this.HTMLgetAlign(f,i.values);h=this.HTMLgetShift(f,i.values,k);if(k===a.INDENTALIGN.CENTER){h=0}i.W=i.shift=i.scanW=h;i.penalty=e.nobreak}f.isLast=true;this.HTMLaddLine(m,g,[],f,c,j);if(l){m.style.width="100%";if(o.type==="math"){n.bbox.width="100%"}}this.HTMLhandleSpace(n);this.HTMLhandleColor(n);n.bbox.isMultiline=true;return n},HTMLbetterBreak:function(o,n){if(this.isToken){return false}if(this.isEmbellished()){o.embellished=this;return this.CoreMO().HTMLbetterBreak(o,n)}if(this.linebreakContainer){return false}var h=o.index.slice(0),j=o.index.shift(),g=this.data.length,f,l=(o.index.length>0),k=false;o.scanW=o.W;if(j==null){j=-1}if(!l){j++;o.W+=o.w}o.w=0;o.nest++;while(j0){var k=b.FONTDATA.baselineskip*f.scale;var i=(f.values.lineleading==null?f.VALUES:f.values).lineleading;f.Y-=Math.max(k,f.d+line.bbox.h+i)}b.alignBox(line,m,f.Y);f.d=line.bbox.d;f.values=o;f.n++},HTMLgetAlign:function(i,f){var j=f,g=i.values,h=i.VALUES,k;if(i.n===0){k=j.indentalignfirst||g.indentalignfirst||h.indentalignfirst}else{if(i.isLast){k=g.indentalignlast||h.indentalignlast}else{k=g.indentalign||h.indentalign}}if(k===a.INDENTALIGN.INDENTALIGN){k=g.indentalign||h.indentalign}if(k===a.INDENTALIGN.AUTO){k=(i.isTop?this.displayAlign:a.INDENTALIGN.LEFT)}return k},HTMLgetShift:function(j,g,l){if(l===a.INDENTALIGN.CENTER){return 0}var k=g,h=j.values,i=j.VALUES,f;if(j.n===0){f=k.indentshiftfirst||h.indentshiftfirst||i.indentshiftfirst}else{if(j.isLast){f=h.indentshiftlast||i.indentshiftlast}else{f=h.indentshift||i.indentshift}}if(f===a.INDENTSHIFT.INDENTSHIFT){f=h.indentshift||i.indentshift}if(f==="auto"||f===""){f=(j.isTSop?this.displayIndent:"0")}return b.length2em(f,0)},HTMLmoveLine:function(o,f,l,n,g){var k=o[0],h=f[0];if(k==null){k=-1}if(h==null){h=this.data.length-1}if(k===h&&o.length>1){this.data[k].HTMLmoveSlice(o.slice(1),f.slice(1),l,n,g,"paddingLeft")}else{var m=n.last;n.last=false;while(k0),k=false;o.scanW=o.W;if(j==null){j=-1}if(!l){j++;o.W+=o.w}o.w=0;o.nest++;if(!l&&this.data.open){this.HTMLaddWidth("open",o)}while(j1){this.data[k].HTMLmoveSlice(o.slice(1),f.slice(1),l,n,g,"paddingLeft");if(k===this.data.length-1&&this.data.close){this.data.close.HTMLmoveSpan(l,n,g)}}else{var m=n.last;n.last=false;if(k<0&&this.data.open){this.data.open.HTMLmoveSpan(l,n,g)}while(k=0){m=q*h.nest}}else{m=Math.max(1,m+q[0]*h.nest)}if(m>=h.penalty){return false}h.penalty=m;h.values=p;h.W=i;h.w=o;p.lineleading=b.length2em(p.lineleading,f.VALUES.lineleading);return true}});a.mspace.Augment({HTMLbetterBreak:function(g,f){var m=this.getValues("linebreak");var h=g.scanW,k=this.HTMLspanElement(),l=k.bbox.w;if(k.style.paddingLeft){l+=b.unEm(k.style.paddingLeft)}if(m.linebreakstyle===a.LINEBREAKSTYLE.AFTER){h+=l;l=0}if(h-g.shift===0){return false}var i=b.linebreakWidth-h;var j=Math.floor(i/b.linebreakWidth*1000);if(j<0){j=e.toobig-3*j}j+=g.nest*e.nestfactor;var n=e[m.linebreak||a.LINEBREAK.AUTO];if(m.linebreak===a.LINEBREAK.AUTO&&l>=e.spacelimit){n=[(l+e.spaceoffset)*e.spacefactor]}if(!(n instanceof Array)){if(i>=0){j=n*g.nest}}else{j=Math.max(1,j+n[0]*g.nest)}if(j>=g.penalty){return false}g.penalty=j;g.values=m;g.W=h;g.w=l;m.lineleading=f.VALUES.lineleading;m.linebreakstyle="before";return true}});MathJax.Hub.Register.StartupHook("TeX mathchoice Ready",function(){a.TeXmathchoice.Augment({HTMLbetterBreak:function(g,f){return this.Core().HTMLbetterBreak(g,f)},HTMLmoveLine:function(j,f,h,i,g){return this.Core().HTMLmoveSlice(j,f,h,i,g)}})});a.maction.Augment({HTMLbetterBreak:function(g,f){return this.Core().HTMLbetterBreak(g,f)},HTMLmoveLine:function(j,f,h,i,g){return this.Core().HTMLmoveSlice(j,f,h,i,g)},HTMLmoveSlice:function(g,i,l,f,m,j){var o=document.getElementById("MathJax-HitBox-"+this.spanID+b.idPostfix);if(o){o.parentNode.removeChild(o)}var k=this.SUPER(arguments).HTMLmoveSlice.apply(this,arguments);if(i.length===0){l=this.HTMLspanElement();var h=0;while(l){o=this.HTMLhandleHitBox(l,"-Continue-"+h);l=l.nextMathJaxSpan;h++}}return k}});a.semantics.Augment({HTMLbetterBreak:function(g,f){return(this.data[0]?this.data[0].HTMLbetterBreak(g,f):false)},HTMLmoveLine:function(j,f,h,i,g){return(this.data[0]?this.data[0].HTMLmoveSlice(j,f,h,i,g):null)}});MathJax.Hub.Startup.signal.Post("HTML-CSS multiline Ready");MathJax.Ajax.loadComplete(b.autoloadDir+"/multiline.js")}); +MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var d="2.0.3";var a=MathJax.ElementJax.mml,b=MathJax.OutputJax["HTML-CSS"];var e={newline:0,nobreak:1000000,goodbreak:[-200],badbreak:[+200],auto:[0],toobig:500,nestfactor:400,spacefactor:-100,spaceoffset:2,spacelimit:1,fence:500,close:500};var c={linebreakstyle:"after"};a.mbase.Augment({HTMLlinebreakPenalty:e,HTMLmultiline:function(n){var o=this;while(o.inferred||(o.parent&&o.parent.type==="mrow"&&o.parent.data.length===1)){o=o.parent}var l=((o.type==="math"&&o.Get("display")==="block")||o.type==="mtd");o.isMultiline=true;var p=this.getValues("linebreak","linebreakstyle","lineleading","linebreakmultchar","indentalign","indentshift","indentalignfirst","indentshiftfirst","indentalignlast","indentshiftlast");if(p.linebreakstyle===a.LINEBREAKSTYLE.INFIXLINEBREAKSTYLE){p.linebreakstyle=this.Get("infixlinebreakstyle")}p.lineleading=b.length2em(p.lineleading,1,0.5);this.HTMLremoveColor(n);var m=b.createStack(n);var f={n:0,Y:0,scale:this.HTMLgetScale(),isTop:l,values:{},VALUES:p},k=this.HTMLgetAlign(f,{}),h=this.HTMLgetShift(f,{},k),g=[],i={index:[],penalty:e.nobreak,w:0,W:h,shift:h,scanW:h,nest:0},j=false;while(this.HTMLbetterBreak(i,f)&&(i.scanW>=b.linebreakWidth||i.penalty==e.newline)){this.HTMLaddLine(m,g,i.index,f,i.values,j);g=i.index.slice(0);j=true;k=this.HTMLgetAlign(f,i.values);h=this.HTMLgetShift(f,i.values,k);if(k===a.INDENTALIGN.CENTER){h=0}i.W=i.shift=i.scanW=h;i.penalty=e.nobreak}f.isLast=true;this.HTMLaddLine(m,g,[],f,c,j);if(l){m.style.width="100%";if(o.type==="math"){n.bbox.width="100%"}}this.HTMLhandleSpace(n);this.HTMLhandleColor(n);n.bbox.isMultiline=true;return n},HTMLbetterBreak:function(o,n){if(this.isToken){return false}if(this.isEmbellished()){o.embellished=this;return this.CoreMO().HTMLbetterBreak(o,n)}if(this.linebreakContainer){return false}var h=o.index.slice(0),j=o.index.shift(),g=this.data.length,f,l=(o.index.length>0),k=false;if(j==null){j=-1}if(!l){j++;o.W+=o.w;o.w=0}o.scanW=o.W;o.nest++;while(j0){var k=b.FONTDATA.baselineskip*f.scale;var i=(f.values.lineleading==null?f.VALUES:f.values).lineleading;f.Y-=Math.max(k,f.d+line.bbox.h+i)}b.alignBox(line,m,f.Y);f.d=line.bbox.d;f.values=o;f.n++},HTMLgetAlign:function(i,f){var j=f,g=i.values,h=i.VALUES,k;if(i.n===0){k=j.indentalignfirst||g.indentalignfirst||h.indentalignfirst}else{if(i.isLast){k=g.indentalignlast||h.indentalignlast}else{k=g.indentalign||h.indentalign}}if(k===a.INDENTALIGN.INDENTALIGN){k=g.indentalign||h.indentalign}if(k===a.INDENTALIGN.AUTO){k=(i.isTop?this.displayAlign:a.INDENTALIGN.LEFT)}return k},HTMLgetShift:function(j,g,l){if(l===a.INDENTALIGN.CENTER){return 0}var k=g,h=j.values,i=j.VALUES,f;if(j.n===0){f=k.indentshiftfirst||h.indentshiftfirst||i.indentshiftfirst}else{if(j.isLast){f=h.indentshiftlast||i.indentshiftlast}else{f=h.indentshift||i.indentshift}}if(f===a.INDENTSHIFT.INDENTSHIFT){f=h.indentshift||i.indentshift}if(f==="auto"||f===""){f=(j.isTSop?this.displayIndent:"0")}return b.length2em(f,0)},HTMLmoveLine:function(o,f,l,n,g){var k=o[0],h=f[0];if(k==null){k=-1}if(h==null){h=this.data.length-1}if(k===h&&o.length>1){this.data[k].HTMLmoveSlice(o.slice(1),f.slice(1),l,n,g,"paddingLeft")}else{var m=n.last;n.last=false;while(k0),g=false;if(q==null){q=-1}if(!r){q++;h.W+=h.w;h.w=0}h.scanW=h.W;h.nest++;if(!this.dataI){this.dataI=[];if(this.data.open){this.dataI.push("open")}if(n){this.dataI.push(0)}for(var p=1;p1){this.data[this.dataI[n]].HTMLmoveSlice(g.slice(1),l.slice(1),o,f,q,"paddingLeft")}else{var p=f.last;f.last=false;var h=this.dataI[n];while(n=0){m=q*h.nest}}else{m=Math.max(1,m+q[0]*h.nest)}if(m>=h.penalty){return false}h.penalty=m;h.values=p;h.W=i;h.w=o;p.lineleading=b.length2em(p.lineleading,f.VALUES.lineleading);return true}});a.mspace.Augment({HTMLbetterBreak:function(g,f){var m=this.getValues("linebreak");var h=g.scanW,k=this.HTMLspanElement(),l=k.bbox.w;if(k.style.paddingLeft){l+=b.unEm(k.style.paddingLeft)}if(h-g.shift===0){return false}var i=b.linebreakWidth-h;var j=Math.floor(i/b.linebreakWidth*1000);if(j<0){j=e.toobig-3*j}j+=g.nest*e.nestfactor;var n=e[m.linebreak||a.LINEBREAK.AUTO];if(m.linebreak===a.LINEBREAK.AUTO&&l>=e.spacelimit){n=[(l+e.spaceoffset)*e.spacefactor]}if(!(n instanceof Array)){if(i>=0){j=n*g.nest}}else{j=Math.max(1,j+n[0]*g.nest)}if(j>=g.penalty){return false}g.penalty=j;g.values=m;g.W=h;g.w=l;m.lineleading=f.VALUES.lineleading;m.linebreakstyle="before";return true}});MathJax.Hub.Register.StartupHook("TeX mathchoice Ready",function(){a.TeXmathchoice.Augment({HTMLbetterBreak:function(g,f){return this.Core().HTMLbetterBreak(g,f)},HTMLmoveLine:function(j,f,h,i,g){return this.Core().HTMLmoveSlice(j,f,h,i,g)}})});a.maction.Augment({HTMLbetterBreak:function(g,f){return this.Core().HTMLbetterBreak(g,f)},HTMLmoveLine:function(j,f,h,i,g){return this.Core().HTMLmoveSlice(j,f,h,i,g)},HTMLmoveSlice:function(g,i,l,f,m,j){var o=document.getElementById("MathJax-HitBox-"+this.spanID+b.idPostfix);if(o){o.parentNode.removeChild(o)}var k=this.SUPER(arguments).HTMLmoveSlice.apply(this,arguments);if(i.length===0){l=this.HTMLspanElement();var h=0;while(l){o=this.HTMLhandleHitBox(l,"-Continue-"+h);l=l.nextMathJaxSpan;h++}}return k}});a.semantics.Augment({HTMLbetterBreak:function(g,f){return(this.data[0]?this.data[0].HTMLbetterBreak(g,f):false)},HTMLmoveLine:function(j,f,h,i,g){return(this.data[0]?this.data[0].HTMLmoveSlice(j,f,h,i,g):null)}});MathJax.Hub.Startup.signal.Post("HTML-CSS multiline Ready");MathJax.Ajax.loadComplete(b.autoloadDir+"/multiline.js")}); diff --git a/jax/output/SVG/autoload/multiline.js b/jax/output/SVG/autoload/multiline.js index 4b7f6762d..12013f84e 100644 --- a/jax/output/SVG/autoload/multiline.js +++ b/jax/output/SVG/autoload/multiline.js @@ -12,5 +12,5 @@ * http://www.apache.org/licenses/LICENSE-2.0 */ -MathJax.Hub.Register.StartupHook("SVG Jax Ready",function(){var d="2.0.2";var a=MathJax.ElementJax.mml,f=MathJax.OutputJax.SVG,b=f.BBOX;var e={newline:0,nobreak:1000000,goodbreak:[-200],badbreak:[+200],auto:[0],toobig:500,nestfactor:400,spacefactor:-100,spaceoffset:2,spacelimit:1,fence:500,close:500};var c={linebreakstyle:"after"};a.mrow.Augment({SVGmultiline:function(k){var o=this;while(o.inferred||(o.parent&&o.parent.type==="mrow"&&o.parent.data.length===1)){o=o.parent}var n=((o.type==="math"&&o.Get("display")==="block")||o.type==="mtd");o.isMultiline=true;var p=this.getValues("linebreak","linebreakstyle","lineleading","linebreakmultchar","indentalign","indentshift","indentalignfirst","indentshiftfirst","indentalignlast","indentshiftlast");if(p.linebreakstyle===a.LINEBREAKSTYLE.INFIXLINEBREAKSTYLE){p.linebreakstyle=this.Get("infixlinebreakstyle")}p.lineleading=f.length2em(p.lineleading,1,0.5);k=this.SVG();if(f.linebreakWidth=f.linebreakWidth||j.penalty==e.newline)){this.SVGaddLine(k,h,j.index,g,j.values,l);h=j.index.slice(0);l=true;m=this.SVGgetAlign(g,j.values);i=this.SVGgetShift(g,j.values,m);if(m===a.INDENTALIGN.CENTER){i=0}j.W=j.shift=j.scanW=i;j.penalty=e.nobreak}g.isLast=true;this.SVGaddLine(k,h,[],g,c,l);this.SVGhandleSpace(k);this.SVGhandleColor(k);k.isMultiline=true;this.SVGsaveData(k);return k}});a.mbase.Augment({SVGlinebreakPenalty:e,SVGbetterBreak:function(p,o){if(this.isToken){return false}if(this.isEmbellished()){p.embellished=this;return this.CoreMO().SVGbetterBreak(p,o)}if(this.linebreakContainer){return false}var j=p.index.slice(0),k=p.index.shift(),h=this.data.length,g,n=(p.index.length>0),l=false;p.scanW=p.W;if(k==null){k=-1}if(!n){k++;p.W+=p.w}p.w=0;p.nest++;while(k0){var m=f.FONTDATA.baselineskip*g.scale;var j=(g.values.lineleading==null?g.VALUES:g.values).lineleading;g.Y-=Math.max(m,g.d+line.h+j)}l.Align(line,o,0,g.Y);g.d=line.d;g.values=p;g.n++},SVGgetAlign:function(j,g){var k=g,h=j.values,i=j.VALUES,l;if(j.n===0){l=k.indentalignfirst||h.indentalignfirst||i.indentalignfirst}else{if(j.isLast){l=h.indentalignlast||i.indentalignlast}else{l=h.indentalign||i.indentalign}}if(l===a.INDENTALIGN.INDENTALIGN){l=h.indentalign||i.indentalign}if(l===a.INDENTALIGN.AUTO){l=(j.isTop?this.displayAlign:a.INDENTALIGN.LEFT)}return l},SVGgetShift:function(k,h,m){if(m===a.INDENTALIGN.CENTER){return 0}var l=h,i=k.values,j=k.VALUES,g;if(k.n===0){g=l.indentshiftfirst||i.indentshiftfirst||j.indentshiftfirst}else{if(k.isLast){g=i.indentshiftlast||j.indentshiftlast}else{g=i.indentshift||j.indentshift}}if(g===a.INDENTSHIFT.INDENTSHIFT){g=i.indentshift||j.indentshift}if(g==="auto"||g===""){g=(k.isTSop?this.displayIndent:"0")}return f.length2em(g,0)},SVGmoveLine:function(p,g,k,o,h){var m=p[0],l=g[0];if(m==null){m=-1}if(l==null){l=this.data.length-1}if(m===l&&p.length>1){this.data[m].SVGmoveSlice(p.slice(1),g.slice(1),k,o,h,"paddingLeft")}else{var n=o.last;o.last=false;while(m0),l=false;p.scanW=p.W;if(k==null){k=-1}if(!n){k++;p.W+=p.w}p.w=0;p.nest++;if(!n&&this.data.open){this.SVGaddWidth("open",p)}while(k1){this.data[m].SVGmoveSlice(p.slice(1),g.slice(1),k,o,h,"paddingLeft");if(m===this.data.length-1&&this.data.close){this.data.close.SVGmove(k,o,h)}}else{var n=o.last;o.last=false;if(m<0&&this.data.open){this.data.open.SVGmove(k,o,h)}while(m=0){o=r*i.nest}}else{o=Math.max(1,o+r[0]*i.nest)}if(o>=i.penalty){return false}i.penalty=o;i.values=q;i.W=j;i.w=p;q.lineleading=f.length2em(q.lineleading,g.VALUES.lineleading);return true}});a.mspace.Augment({SVGbetterBreak:function(h,g){var n=this.getValues("linebreak");var i=h.scanW,k=this.SVGdata,m=k.w+k.x;if(n.linebreakstyle===a.LINEBREAKSTYLE.AFTER){i+=m;m=0}if(i-h.shift===0){return false}var j=f.linebreakWidth-i;var l=Math.floor(j/f.linebreakWidth*1000);if(l<0){l=e.toobig-3*l}l+=h.nest*e.nestfactor;var o=e[n.linebreak||a.LINEBREAK.AUTO];if(n.linebreak===a.LINEBREAK.AUTO&&m>=e.spacelimit*1000){o=[(m+e.spaceoffset)*e.spacefactor]}if(!(o instanceof Array)){if(j>=0){l=o*h.nest}}else{l=Math.max(1,l+o[0]*h.nest)}if(l>=h.penalty){return false}h.penalty=l;h.values=n;h.W=i;h.w=m;n.lineleading=g.VALUES.lineleading;n.linebreakstyle="before";return true}});MathJax.Hub.Register.StartupHook("TeX mathchoice Ready",function(){a.TeXmathchoice.Augment({SVGbetterBreak:function(h,g){return this.Core().SVGbetterBreak(h,g)},SVGmoveLine:function(k,g,i,j,h){return this.Core().SVGmoveSlice(k,g,i,j,h)}})});a.maction.Augment({SVGbetterBreak:function(h,g){return this.Core().SVGbetterBreak(h,g)},SVGmoveLine:function(k,g,i,j,h){return this.Core().SVGmoveSlice(k,g,i,j,h)},});a.semantics.Augment({SVGbetterBreak:function(h,g){return(this.data[0]?this.data[0].SVGbetterBreak(h,g):false)},SVGmoveLine:function(k,g,i,j,h){return(this.data[0]?this.data[0].SVGmoveSlice(k,g,i,j,h):null)}});MathJax.Hub.Startup.signal.Post("SVG multiline Ready");MathJax.Ajax.loadComplete(f.autoloadDir+"/multiline.js")}); +MathJax.Hub.Register.StartupHook("SVG Jax Ready",function(){var d="2.0.2";var a=MathJax.ElementJax.mml,f=MathJax.OutputJax.SVG,b=f.BBOX;var e={newline:0,nobreak:1000000,goodbreak:[-200],badbreak:[+200],auto:[0],toobig:500,nestfactor:400,spacefactor:-100,spaceoffset:2,spacelimit:1,fence:500,close:500};var c={linebreakstyle:"after"};a.mrow.Augment({SVGmultiline:function(k){var o=this;while(o.inferred||(o.parent&&o.parent.type==="mrow"&&o.parent.data.length===1)){o=o.parent}var n=((o.type==="math"&&o.Get("display")==="block")||o.type==="mtd");o.isMultiline=true;var p=this.getValues("linebreak","linebreakstyle","lineleading","linebreakmultchar","indentalign","indentshift","indentalignfirst","indentshiftfirst","indentalignlast","indentshiftlast");if(p.linebreakstyle===a.LINEBREAKSTYLE.INFIXLINEBREAKSTYLE){p.linebreakstyle=this.Get("infixlinebreakstyle")}p.lineleading=f.length2em(p.lineleading,1,0.5);k=this.SVG();if(f.linebreakWidth=f.linebreakWidth||j.penalty==e.newline)){this.SVGaddLine(k,h,j.index,g,j.values,l);h=j.index.slice(0);l=true;m=this.SVGgetAlign(g,j.values);i=this.SVGgetShift(g,j.values,m);if(m===a.INDENTALIGN.CENTER){i=0}j.W=j.shift=j.scanW=i;j.penalty=e.nobreak}g.isLast=true;this.SVGaddLine(k,h,[],g,c,l);this.SVGhandleSpace(k);this.SVGhandleColor(k);k.isMultiline=true;this.SVGsaveData(k);return k}});a.mbase.Augment({SVGlinebreakPenalty:e,SVGbetterBreak:function(p,o){if(this.isToken){return false}if(this.isEmbellished()){p.embellished=this;return this.CoreMO().SVGbetterBreak(p,o)}if(this.linebreakContainer){return false}var j=p.index.slice(0),k=p.index.shift(),h=this.data.length,g,n=(p.index.length>0),l=false;if(k==null){k=-1}if(!n){k++;p.W+=p.w;p.w=0}p.scanW=p.W;p.nest++;while(k0){var m=f.FONTDATA.baselineskip*g.scale;var j=(g.values.lineleading==null?g.VALUES:g.values).lineleading;g.Y-=Math.max(m,g.d+line.h+j)}l.Align(line,o,0,g.Y);g.d=line.d;g.values=p;g.n++},SVGgetAlign:function(j,g){var k=g,h=j.values,i=j.VALUES,l;if(j.n===0){l=k.indentalignfirst||h.indentalignfirst||i.indentalignfirst}else{if(j.isLast){l=h.indentalignlast||i.indentalignlast}else{l=h.indentalign||i.indentalign}}if(l===a.INDENTALIGN.INDENTALIGN){l=h.indentalign||i.indentalign}if(l===a.INDENTALIGN.AUTO){l=(j.isTop?this.displayAlign:a.INDENTALIGN.LEFT)}return l},SVGgetShift:function(k,h,m){if(m===a.INDENTALIGN.CENTER){return 0}var l=h,i=k.values,j=k.VALUES,g;if(k.n===0){g=l.indentshiftfirst||i.indentshiftfirst||j.indentshiftfirst}else{if(k.isLast){g=i.indentshiftlast||j.indentshiftlast}else{g=i.indentshift||j.indentshift}}if(g===a.INDENTSHIFT.INDENTSHIFT){g=i.indentshift||j.indentshift}if(g==="auto"||g===""){g=(k.isTSop?this.displayIndent:"0")}return f.length2em(g,0)},SVGmoveLine:function(p,g,k,o,h){var m=p[0],l=g[0];if(m==null){m=-1}if(l==null){l=this.data.length-1}if(m===l&&p.length>1){this.data[m].SVGmoveSlice(p.slice(1),g.slice(1),k,o,h,"paddingLeft")}else{var n=o.last;o.last=false;while(m0),h=false;if(r==null){r=-1}if(!s){r++;l.W+=l.w;l.w=0}l.scanW=l.W;l.nest++;if(!this.dataI){this.dataI=[];if(this.data.open){this.dataI.push("open")}if(o){this.dataI.push(0)}for(var q=1;q1){this.data[this.dataI[o]].SVGmoveSlice(h.slice(1),m.slice(1),p,g,r,"paddingLeft")}else{var q=g.last;g.last=false;var l=this.dataI[o];while(o=0){o=r*i.nest}}else{o=Math.max(1,o+r[0]*i.nest)}if(o>=i.penalty){return false}i.penalty=o;i.values=q;i.W=j;i.w=p;q.lineleading=f.length2em(q.lineleading,g.VALUES.lineleading);return true}});a.mspace.Augment({SVGbetterBreak:function(h,g){var n=this.getValues("linebreak");var i=h.scanW,k=this.SVGdata,m=k.w+k.x;if(i-h.shift===0){return false}var j=f.linebreakWidth-i;var l=Math.floor(j/f.linebreakWidth*1000);if(l<0){l=e.toobig-3*l}l+=h.nest*e.nestfactor;var o=e[n.linebreak||a.LINEBREAK.AUTO];if(n.linebreak===a.LINEBREAK.AUTO&&m>=e.spacelimit*1000){o=[(m+e.spaceoffset)*e.spacefactor]}if(!(o instanceof Array)){if(j>=0){l=o*h.nest}}else{l=Math.max(1,l+o[0]*h.nest)}if(l>=h.penalty){return false}h.penalty=l;h.values=n;h.W=i;h.w=m;n.lineleading=g.VALUES.lineleading;n.linebreakstyle="before";return true}});MathJax.Hub.Register.StartupHook("TeX mathchoice Ready",function(){a.TeXmathchoice.Augment({SVGbetterBreak:function(h,g){return this.Core().SVGbetterBreak(h,g)},SVGmoveLine:function(k,g,i,j,h){return this.Core().SVGmoveSlice(k,g,i,j,h)}})});a.maction.Augment({SVGbetterBreak:function(h,g){return this.Core().SVGbetterBreak(h,g)},SVGmoveLine:function(k,g,i,j,h){return this.Core().SVGmoveSlice(k,g,i,j,h)},});a.semantics.Augment({SVGbetterBreak:function(h,g){return(this.data[0]?this.data[0].SVGbetterBreak(h,g):false)},SVGmoveLine:function(k,g,i,j,h){return(this.data[0]?this.data[0].SVGmoveSlice(k,g,i,j,h):null)}});MathJax.Hub.Startup.signal.Post("SVG multiline Ready");MathJax.Ajax.loadComplete(f.autoloadDir+"/multiline.js")}); diff --git a/unpacked/jax/output/HTML-CSS/autoload/multiline.js b/unpacked/jax/output/HTML-CSS/autoload/multiline.js index 89d264468..3298d0852 100644 --- a/unpacked/jax/output/HTML-CSS/autoload/multiline.js +++ b/unpacked/jax/output/HTML-CSS/autoload/multiline.js @@ -147,9 +147,8 @@ MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () { // var index = info.index.slice(0), i = info.index.shift(), m = this.data.length, W, broken = (info.index.length > 0), better = false; - info.scanW = info.W; - if (i == null) {i = -1}; if (!broken) {i++; info.W += info.w}; - info.w = 0; info.nest++; + if (i == null) {i = -1}; if (!broken) {i++; info.W += info.w; info.w = 0;} + info.scanW = info.W; info.nest++; // // Look through the line for breakpoints, // (as long as we are not too far past the breaking width) @@ -377,27 +376,37 @@ MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () { // var index = info.index.slice(0), i = info.index.shift(), m = this.data.length, W, broken = (info.index.length > 0), better = false; - info.scanW = info.W; - if (i == null) {i = -1}; if (!broken) {i++; info.W += info.w}; - info.w = 0; info.nest++; + if (i == null) {i = -1}; if (!broken) {i++; info.W += info.w; info.w = 0;} + info.scanW = info.W; info.nest++; + // + // Create indices that include the delimiters and separators + // + if (!this.dataI) { + this.dataI = []; + if (this.data.open) {this.dataI.push("open")} + if (m) {this.dataI.push(0)} + for (var j = 1; j < m; j++) { + if (this.data["sep"+j]) {this.dataI.push("sep"+j)} + this.dataI.push(j); + } + if (this.data.close) {this.dataI.push("close")} + } + m = this.dataI.length; // // Look through the line for breakpoints, including the open, close, and separators // (as long as we are not too far past the breaking width) // - if (!broken && this.data.open) {this.HTMLaddWidth("open",info)} while (i < m && info.scanW < 1.33*HTMLCSS.linebreakWidth) { - if (this.data[i]) { - if (this.data[i].HTMLbetterBreak(info,state)) { + var k = this.dataI[i]; + if (this.data[k]) { + if (this.data[k].HTMLbetterBreak(info,state)) { better = true; index = [i].concat(info.index); W = info.W; if (info.penalty === PENALTY.newline) {info.index = index; info.nest--; return true} } - if (!broken) {this.HTMLaddWidth(i,info)} + if (!broken) {this.HTMLaddWidth(k,info)} } info.index = []; i++; broken = false; - // FIXME: should be able to break at the following (but don't have index for it) - if (this.data["sep"+i]) {this.HTMLaddWidth("sep"+i,info)} } - if (this.data.close) {this.HTMLaddWidth("close",info)} info.nest--; info.index = index; if (better) {info.W = W} return better; @@ -405,40 +414,34 @@ MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () { HTMLmoveLine: function (start,end,span,state,values) { var i = start[0], j = end[0]; - if (i == null) {i = -1}; if (j == null) {j = this.data.length-1} + if (i == null) {i = -1}; if (j == null) {j = this.dataI.length-1} if (i === j && start.length > 1) { // // If starting and ending in the same element move the subpiece to the new line // Add the closing fence, if present // - this.data[i].HTMLmoveSlice(start.slice(1),end.slice(1),span,state,values,"paddingLeft"); - if (i === this.data.length-1 && this.data.close) - {this.data.close.HTMLmoveSpan(span,state,values)} + this.data[this.dataI[i]].HTMLmoveSlice(start.slice(1),end.slice(1),span,state,values,"paddingLeft"); } else { // // Otherwise, move the remainder of the initial item // and any others (including open and separators) up to the last one // - var last = state.last; state.last = false; - if (i < 0 && this.data.open) {this.data.open.HTMLmoveSpan(span,state,values)} + var last = state.last; state.last = false; var k = this.dataI[i]; while (i < j) { - if (this.data[i]) { - if (start.length <= 1) {this.data[i].HTMLmoveSpan(span,state,values)} - else {this.data[i].HTMLmoveSlice(start.slice(1),[],span,state,values,"paddingLeft")} + if (this.data[k]) { + if (start.length <= 1) {this.data[k].HTMLmoveSpan(span,state,values)} + else {this.data[k].HTMLmoveSlice(start.slice(1),[],span,state,values,"paddingLeft")} } - i++; state.first = false; start = []; - if (this.data["sep"+i]) {this.data["sep"+i].HTMLmoveSpan(span,state,values)} + i++; k = this.dataI[i]; state.first = false; start = []; } // // If the last item is complete, move it and the closing fence, // otherwise move the first part of it up to the split // state.last = last; - if (this.data[i]) { - if (end.length <= 1) { - this.data[i].HTMLmoveSpan(span,state,values); - if (this.data.close) {this.data.close.HTMLmoveSpan(span,state,values)} - } else {this.data[i].HTMLmoveSlice([],end.slice(1),span,state,values,"paddingRight")} + if (this.data[k]) { + if (end.length <= 1) {this.data[k].HTMLmoveSpan(span,state,values)} + else {this.data[k].HTMLmoveSlice([],end.slice(1),span,state,values,"paddingRight")} } } } @@ -524,7 +527,6 @@ MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () { // var W = info.scanW, span = this.HTMLspanElement(), w = span.bbox.w; if (span.style.paddingLeft) {w += HTMLCSS.unEm(span.style.paddingLeft)} - if (values.linebreakstyle === MML.LINEBREAKSTYLE.AFTER) {W += w; w = 0} if (W - info.shift === 0) {return false} // don't break at zero width (FIXME?) var offset = HTMLCSS.linebreakWidth - W; // diff --git a/unpacked/jax/output/SVG/autoload/multiline.js b/unpacked/jax/output/SVG/autoload/multiline.js index 8e5fe7b03..b02eb3f7a 100644 --- a/unpacked/jax/output/SVG/autoload/multiline.js +++ b/unpacked/jax/output/SVG/autoload/multiline.js @@ -150,9 +150,8 @@ MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () { // var index = info.index.slice(0), i = info.index.shift(), m = this.data.length, W, broken = (info.index.length > 0), better = false; - info.scanW = info.W; - if (i == null) {i = -1}; if (!broken) {i++; info.W += info.w}; - info.w = 0; info.nest++; + if (i == null) {i = -1}; if (!broken) {i++; info.W += info.w; info.w = 0} + info.scanW = info.W; info.nest++; // // Look through the line for breakpoints, // (as long as we are not too far past the breaking width) @@ -335,27 +334,37 @@ MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () { // var index = info.index.slice(0), i = info.index.shift(), m = this.data.length, W, broken = (info.index.length > 0), better = false; - info.scanW = info.W; - if (i == null) {i = -1}; if (!broken) {i++; info.W += info.w}; - info.w = 0; info.nest++; + if (i == null) {i = -1}; if (!broken) {i++; info.W += info.w; info.w = 0} + info.scanW = info.W; info.nest++; + // + // Create indices that include the delimiters and separators + // + if (!this.dataI) { + this.dataI = []; + if (this.data.open) {this.dataI.push("open")} + if (m) {this.dataI.push(0)} + for (var j = 1; j < m; j++) { + if (this.data["sep"+j]) {this.dataI.push("sep"+j)} + this.dataI.push(j); + } + if (this.data.close) {this.dataI.push("close")} + } + m = this.dataI.length; // // Look through the line for breakpoints, including the open, close, and separators // (as long as we are not too far past the breaking width) // - if (!broken && this.data.open) {this.SVGaddWidth("open",info)} while (i < m && info.scanW < 1.33*SVG.linebreakWidth) { - if (this.data[i]) { - if (this.data[i].SVGbetterBreak(info,state)) { + var k = this.dataI[i]; + if (this.data[k]) { + if (this.data[k].SVGbetterBreak(info,state)) { better = true; index = [i].concat(info.index); W = info.W; if (info.penalty === PENALTY.newline) {info.index = index; info.nest--; return true} } - if (!broken) {this.SVGaddWidth(i,info)} + if (!broken) {this.SVGaddWidth(k,info)} } info.index = []; i++; broken = false; - // FIXME: should be able to break at the following (but don't have index for it) - if (this.data["sep"+i]) {this.SVGaddWidth("sep"+i,info)} } - if (this.data.close) {this.SVGaddWidth("close",info)} info.nest--; info.index = index; if (better) {info.W = W} return better; @@ -363,39 +372,34 @@ MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () { SVGmoveLine: function (start,end,svg,state,values) { var i = start[0], j = end[0]; - if (i == null) {i = -1}; if (j == null) {j = this.data.length-1} + if (i == null) {i = -1}; if (j == null) {j = this.dataI.length-1} if (i === j && start.length > 1) { // // If starting and ending in the same element move the subpiece to the new line // Add the closing fence, if present // - this.data[i].SVGmoveSlice(start.slice(1),end.slice(1),svg,state,values,"paddingLeft"); - if (i === this.data.length-1 && this.data.close) {this.data.close.SVGmove(svg,state,values)} + this.data[this.dataI[i]].SVGmoveSlice(start.slice(1),end.slice(1),svg,state,values,"paddingLeft"); } else { // // Otherwise, move the remainder of the initial item // and any others (including open and separators) up to the last one // - var last = state.last; state.last = false; - if (i < 0 && this.data.open) {this.data.open.SVGmove(svg,state,values)} + var last = state.last; state.last = false; var k = this.dataI[i]; while (i < j) { - if (this.data[i]) { - if (start.length <= 1) {this.data[i].SVGmove(svg,state,values)} - else {this.data[i].SVGmoveSlice(start.slice(1),[],svg,state,values,"paddingLeft")} + if (this.data[k]) { + if (start.length <= 1) {this.data[k].SVGmove(svg,state,values)} + else {this.data[k].SVGmoveSlice(start.slice(1),[],svg,state,values,"paddingLeft")} } - i++; state.first = false; start = []; - if (this.data["sep"+i]) {this.data["sep"+i].SVGmove(svg,state,values)} + i++; k = this.dataI[i]; state.first = false; start = []; } // // If the last item is complete, move it and the closing fence, // otherwise move the first part of it up to the split // state.last = last; - if (this.data[i]) { - if (end.length <= 1) { - this.data[i].SVGmove(svg,state,values); - if (this.data.close) {this.data.close.SVGmove(svg,state,values)} - } else {this.data[i].SVGmoveSlice([],end.slice(1),svg,state,values,"paddingRight")} + if (this.data[k]) { + if (end.length <= 1) {this.data[k].SVGmove(svg,state,values)} + else {this.data[k].SVGmoveSlice([],end.slice(1),svg,state,values,"paddingRight")} } } } @@ -479,7 +483,6 @@ MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () { // Get the default penalty for this location // var W = info.scanW, svg = this.SVGdata, w = svg.w + svg.x; - if (values.linebreakstyle === MML.LINEBREAKSTYLE.AFTER) {W += w; w = 0} if (W - info.shift === 0) {return false} // don't break at zero width (FIXME?) var offset = SVG.linebreakWidth - W; //