Update \unicode to work with SVG, and to better handle fonts and sizes. Also fix HTML-CSS font size when fontfamily is specified

This commit is contained in:
Davide P. Cervone 2012-01-12 17:20:21 -05:00
parent 52755c4c3d
commit af2cd3476f
10 changed files with 75 additions and 37 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -12,5 +12,5 @@
* http://www.apache.org/licenses/LICENSE-2.0 * http://www.apache.org/licenses/LICENSE-2.0
*/ */
MathJax.Extension["TeX/unicode"]={version:"1.1",unicode:{},config:MathJax.Hub.CombineConfig("TeX.unicode",{fonts:"STIXGeneral,'Arial Unicode MS'"})};MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var d=MathJax.InputJax.TeX;var a=MathJax.ElementJax.mml;var c=MathJax.Extension["TeX/unicode"].config.fonts;var b=MathJax.Extension["TeX/unicode"].unicode;d.Definitions.macros.unicode="Unicode";d.Parse.Augment({Unicode:function(f){var j=this.GetBrackets(f),e;if(j){if(j.replace(/ /g,"").match(/^(\d+(\.\d*)?|\.\d+),(\d+(\.\d*)?|\.\d+)$/)){j=j.replace(/ /g,"").split(/,/);e=this.GetBrackets(f)}else{e=j;j=null}}var k=this.trimSpaces(this.GetArgument(f)),i=parseInt(k.match(/^x/)?"0"+k:k);b[i]=[800,200,500,0,500,{isUnknown:true,isUnicode:true,font:c}];if(j){b[i][0]=Math.floor(j[0]*1000);b[i][1]=Math.floor(j[1]*1000)}var g=this.stack.env.font,h={};if(e){h.fontfamily=e.replace(/"/g,"'");if(g){if(g.match(/bold/)){h.fontweight="bold"}if(g.match(/italic/)){h.fontstyle="italic"}}b[i][5].font=e+","+c}else{if(g){h.mathvariant=g}}this.Push(a.mtext(a.entity("#"+k)).With(h))}})});MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var a=MathJax.OutputJax["HTML-CSS"];var c=MathJax.Extension["TeX/unicode"].unicode;var b=a.lookupChar;a.Augment({lookupChar:function(e,f){var d=b.call(this,e,f);if(d[f][5]&&d[f][5].isUnknown&&c[f]){d[f]=c[f]}return d}});MathJax.Hub.Startup.signal.Post("TeX unicode Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/unicode.js"); MathJax.Extension["TeX/unicode"]={version:"1.1",unicode:{},config:MathJax.Hub.CombineConfig("TeX.unicode",{fonts:"STIXGeneral,'Arial Unicode MS'"})};MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var c=MathJax.InputJax.TeX;var a=MathJax.ElementJax.mml;var b=MathJax.Extension["TeX/unicode"].unicode;c.Definitions.macros.unicode="Unicode";c.Parse.Augment({Unicode:function(e){var i=this.GetBrackets(e),d;if(i){if(i.replace(/ /g,"").match(/^(\d+(\.\d*)?|\.\d+),(\d+(\.\d*)?|\.\d+)$/)){i=i.replace(/ /g,"").split(/,/);d=this.GetBrackets(e)}else{d=i;i=null}}var j=this.trimSpaces(this.GetArgument(e)),h=parseInt(j.match(/^x/)?"0"+j:j);if(!b[h]){b[h]=[800,200,d,h]}else{if(!d){d=b[h][2]}}if(i){b[h][0]=Math.floor(i[0]*1000);b[h][1]=Math.floor(i[1]*1000)}var f=this.stack.env.font,g={};if(d){b[h][2]=g.fontfamily=d.replace(/"/g,"'");if(f){if(f.match(/bold/)){g.fontweight="bold"}if(f.match(/italic|-mathit/)){g.fontstyle="italic"}}}else{if(f){g.mathvariant=f}}g.unicode=[].concat(b[h]);this.Push(a.mtext(a.entity("#"+j)).With(g))}});MathJax.Hub.Startup.signal.Post("TeX unicode Ready")});MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function(){var a=MathJax.ElementJax.mml;var c=MathJax.Extension["TeX/unicode"].config.fonts;var b=a.mbase.prototype.HTMLgetVariant;a.mbase.Augment({HTMLgetVariant:function(){var d=b.call(this);if(d.unicode){delete d.unicode;delete d.FONTS}if(!this.unicode){return d}d.unicode=true;if(!d.defaultFont){d=MathJax.Hub.Insert({},d);d.defaultFont={family:c}}var e=this.unicode[2];if(e){e+=","+c}else{e=c}d.defaultFont[this.unicode[3]]=[this.unicode[0],this.unicode[1],500,0,500,{isUnknown:true,isUnicode:true,font:e}];return d}})});MathJax.Hub.Register.StartupHook("SVG Jax Ready",function(){var a=MathJax.ElementJax.mml;var c=MathJax.Extension["TeX/unicode"].config.fonts;var b=a.mbase.prototype.SVGgetVariant;a.mbase.Augment({SVGgetVariant:function(){var d=b.call(this);if(d.unicode){delete d.unicode;delete d.FONTS}if(!this.unicode){return d}d.unicode=true;if(!d.forceFamily){d=MathJax.Hub.Insert({},d)}d.defaultFamily=c;d.noRemap=true;d.h=this.unicode[0];d.d=this.unicode[1];return d}})});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/unicode.js");

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -14,7 +14,7 @@
* \unicode[.55,0.05][Geramond]{x22D6} % same taken from Geramond font * \unicode[.55,0.05][Geramond]{x22D6} % same taken from Geramond font
* \unicode[Garamond]{x22D6} % same, but with default height, depth of .8,.2 * \unicode[Garamond]{x22D6} % same, but with default height, depth of .8,.2
* *
* Once a size and font are provided for a given conde point, they need * Once a size and font are provided for a given code point, they need
* not be specified again in subsequent \unicode calls for that character. * not be specified again in subsequent \unicode calls for that character.
* Note that a font list can be given, but Internet Explorer has a buggy * Note that a font list can be given, but Internet Explorer has a buggy
* implementation of font-family where it only looks in the first * implementation of font-family where it only looks in the first
@ -69,7 +69,6 @@ MathJax.Extension["TeX/unicode"] = {
MathJax.Hub.Register.StartupHook("TeX Jax Ready",function () { MathJax.Hub.Register.StartupHook("TeX Jax Ready",function () {
var TEX = MathJax.InputJax.TeX; var TEX = MathJax.InputJax.TeX;
var MML = MathJax.ElementJax.mml; var MML = MathJax.ElementJax.mml;
var FONTS = MathJax.Extension["TeX/unicode"].config.fonts;
var UNICODE = MathJax.Extension["TeX/unicode"].unicode; var UNICODE = MathJax.Extension["TeX/unicode"].unicode;
// //
@ -89,44 +88,77 @@ MathJax.Hub.Register.StartupHook("TeX Jax Ready",function () {
} }
var n = this.trimSpaces(this.GetArgument(name)), var n = this.trimSpaces(this.GetArgument(name)),
N = parseInt(n.match(/^x/) ? "0"+n : n); N = parseInt(n.match(/^x/) ? "0"+n : n);
UNICODE[N] = [800,200,500,0,500,{isUnknown:true, isUnicode:true, font:FONTS}]; if (!UNICODE[N]) {UNICODE[N] = [800,200,font,N]}
else if (!font) {font = UNICODE[N][2]}
if (HD) { if (HD) {
UNICODE[N][0] = Math.floor(HD[0]*1000); UNICODE[N][0] = Math.floor(HD[0]*1000);
UNICODE[N][1] = Math.floor(HD[1]*1000); UNICODE[N][1] = Math.floor(HD[1]*1000);
} }
var variant = this.stack.env.font, def = {}; var variant = this.stack.env.font, def = {};
if (font) { if (font) {
def.fontfamily = font.replace(/"/g,"'"); UNICODE[N][2] = def.fontfamily = font.replace(/"/g,"'");
if (variant) { if (variant) {
if (variant.match(/bold/)) {def.fontweight = "bold"} if (variant.match(/bold/)) {def.fontweight = "bold"}
if (variant.match(/italic/)) {def.fontstyle = "italic"} if (variant.match(/italic|-mathit/)) {def.fontstyle = "italic"}
} }
UNICODE[N][5].font = font+","+FONTS
} else if (variant) {def.mathvariant = variant} } else if (variant) {def.mathvariant = variant}
def.unicode = [].concat(UNICODE[N]); // make a copy
this.Push(MML.mtext(MML.entity("#"+n)).With(def)); this.Push(MML.mtext(MML.entity("#"+n)).With(def));
} }
}); });
});
MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () {
var HTMLCSS = MathJax.OutputJax["HTML-CSS"];
var UNICODE = MathJax.Extension["TeX/unicode"].unicode;
//
// Override lookupChar to add unicode character to font
//
var save_lookupChar = HTMLCSS.lookupChar;
HTMLCSS.Augment({
lookupChar: function (variant,n) {
var font = save_lookupChar.call(this,variant,n);
if (font[n][5] && font[n][5].isUnknown && UNICODE[n]) {font[n] = UNICODE[n]}
return font;
}
});
MathJax.Hub.Startup.signal.Post("TeX unicode Ready"); MathJax.Hub.Startup.signal.Post("TeX unicode Ready");
}); });
MathJax.Hub.Register.StartupHook("HTML-CSS Jax Ready",function () {
var MML = MathJax.ElementJax.mml;
var FONTS = MathJax.Extension["TeX/unicode"].config.fonts;
//
// Override getVariant to make one that includes the font and size
//
var GETVARIANT = MML.mbase.prototype.HTMLgetVariant;
MML.mbase.Augment({
HTMLgetVariant: function () {
var variant = GETVARIANT.call(this);
if (variant.unicode) {delete variant.unicode; delete variant.FONTS} // clear font cache in case of restart
if (!this.unicode) {return variant}
variant.unicode = true;
if (!variant.defaultFont) {
variant = MathJax.Hub.Insert({},variant); // make a copy
variant.defaultFont = {family:FONTS};
}
var family = this.unicode[2]; if (family) {family += ","+FONTS} else {family = FONTS}
variant.defaultFont[this.unicode[3]] = [
this.unicode[0],this.unicode[1],500,0,500,
{isUnknown:true, isUnicode:true, font:family}
];
return variant;
}
});
});
MathJax.Hub.Register.StartupHook("SVG Jax Ready",function () {
var MML = MathJax.ElementJax.mml;
var FONTS = MathJax.Extension["TeX/unicode"].config.fonts;
//
// Override getVariant to make one that includes the font and size
//
var GETVARIANT = MML.mbase.prototype.SVGgetVariant;
MML.mbase.Augment({
SVGgetVariant: function () {
var variant = GETVARIANT.call(this);
if (variant.unicode) {delete variant.unicode; delete variant.FONTS} // clear font cache in case of restart
if (!this.unicode) {return variant}
variant.unicode = true;
if (!variant.forceFamily) {variant = MathJax.Hub.Insert({},variant)} // make a copy
variant.defaultFamily = FONTS; variant.noRemap = true;
variant.h = this.unicode[0]; variant.d = this.unicode[1];
return variant;
}
});
});
MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/unicode.js"); MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/unicode.js");

View File

@ -1274,6 +1274,7 @@
handleFont: function (span,font,force) { handleFont: function (span,font,force) {
span.style.fontFamily = font.family; span.style.fontFamily = font.family;
if (!font.directory) {span.style.fontSize = Math.floor(100/HTMLCSS.scale+.5) + "%"}
if (!(HTMLCSS.FontFaceBug && font.isWebFont)) { if (!(HTMLCSS.FontFaceBug && font.isWebFont)) {
var style = font.style || "normal", weight = font.weight || "normal"; var style = font.style || "normal", weight = font.weight || "normal";
if (style !== "normal" || force) {span.style.fontStyle = style} if (style !== "normal" || force) {span.style.fontStyle = style}
@ -1340,7 +1341,7 @@
unknownChar: function (variant,n) { unknownChar: function (variant,n) {
var unknown = (variant.defaultFont || {family:HTMLCSS.config.undefinedFamily}); var unknown = (variant.defaultFont || {family:HTMLCSS.config.undefinedFamily});
if (variant.bold) {unknown.weight = "bold"}; if (variant.italic) {unknown.style = "italic"} if (variant.bold) {unknown.weight = "bold"}; if (variant.italic) {unknown.style = "italic"}
unknown[n] = [800,200,500,0,500,{isUnknown:true}]; // [h,d,w,lw,rw,{data}] if (!unknown[n]) {unknown[n] = [800,200,500,0,500,{isUnknown:true}]} // [h,d,w,lw,rw,{data}]
HUB.signal.Post(["HTML-CSS Jax - unknown char",n,variant]); HUB.signal.Post(["HTML-CSS Jax - unknown char",n,variant]);
return unknown; return unknown;
}, },

View File

@ -466,8 +466,9 @@
var n, c, font, VARIANT, i, m, id, M, RANGES; var n, c, font, VARIANT, i, m, id, M, RANGES;
if (!variant) {variant = this.FONTDATA.VARIANT[MML.VARIANT.NORMAL]} if (!variant) {variant = this.FONTDATA.VARIANT[MML.VARIANT.NORMAL]}
if (variant.forceFamily) { if (variant.forceFamily) {
svg.Add(BBOX.TEXT(scale,text,variant.font)); text = BBOX.TEXT(scale,text,variant.font);
text = ""; if (variant.h != null) {text.h = variant.h}; if (variant.d != null) {text.d = variant.d}
svg.Add(text); text = "";
} }
VARIANT = variant; VARIANT = variant;
for (i = 0, m = text.length; i < m; i++) { for (i = 0, m = text.length; i < m; i++) {
@ -514,9 +515,13 @@
} else if (this.FONTDATA.DELIMITERS[n]) { } else if (this.FONTDATA.DELIMITERS[n]) {
svg.Add(this.createDelimiter(n,0,1,font),svg.w,0); svg.Add(this.createDelimiter(n,0,1,font),svg.w,0);
} else { } else {
c = BBOX.G(); text = BBOX.TEXT(scale,String.fromCharCode(n),{
c.Add(BBOX.TEXT(scale,String.fromCharCode(n),{"font-family":SVG.config.MISSINGFONT})); "font-family":variant.defaultFamily||SVG.config.MISSINGFONT,
svg.Add(c,svg.w,0); "font-style":(variant.italic?"italic":""),
"font-weight":(variant.bold?"bold":"")
})
if (variant.h != null) {text.h = variant.h}; if (variant.d != null) {text.d = variant.d}
c = BBOX.G(); c.Add(text); svg.Add(c,svg.w,0); text = "";
HUB.signal.Post(["SVG Jax - unknown char",n,variant]); HUB.signal.Post(["SVG Jax - unknown char",n,variant]);
} }
} }