From dc79b91dbf0906e4986b4d6ff0f7dbd71faff40c Mon Sep 17 00:00:00 2001 From: Eddie Kohler Date: Sun, 27 Nov 2016 10:53:53 -0500 Subject: [PATCH] Mark delimiters with the proper class (mopen or mclose). This fixes some atom spacing issues. Update the BinCancellation screenshotter test. --- src/buildHTML.js | 31 ++++++------ src/delimiter.js | 45 ++++++++++-------- .../images/BinCancellation-chrome.png | Bin 7526 -> 10141 bytes .../images/BinCancellation-firefox.png | Bin 6912 -> 9161 bytes test/screenshotter/ss_data.yaml | 4 +- 5 files changed, 42 insertions(+), 38 deletions(-) diff --git a/src/buildHTML.js b/src/buildHTML.js index 0fc6d4f..15859ea 100644 --- a/src/buildHTML.js +++ b/src/buildHTML.js @@ -235,12 +235,11 @@ var isCharacterBox = function(group) { baseElem.type === "punct"; }; -var makeNullDelimiter = function(options) { - return makeSpan([ +var makeNullDelimiter = function(options, classes) { + return makeSpan(classes.concat([ "sizing", "reset-" + options.size, "size5", options.style.reset(), Style.TEXT.cls(), - "nulldelimiter", - ]); + "nulldelimiter"])); }; /** @@ -562,18 +561,18 @@ groupTypes.genfrac = function(group, options) { var leftDelim; var rightDelim; if (group.value.leftDelim == null) { - leftDelim = makeNullDelimiter(options); + leftDelim = makeNullDelimiter(options, ["mopen"]); } else { leftDelim = delimiter.customSizedDelim( group.value.leftDelim, delimSize, true, - options.withStyle(style), group.mode); + options.withStyle(style), group.mode, ["mopen"]); } if (group.value.rightDelim == null) { - rightDelim = makeNullDelimiter(options); + rightDelim = makeNullDelimiter(options, ["mclose"]); } else { rightDelim = delimiter.customSizedDelim( group.value.rightDelim, delimSize, true, - options.withStyle(style), group.mode); + options.withStyle(style), group.mode, ["mclose"]); } return makeSpan( @@ -1205,11 +1204,9 @@ groupTypes.delimsizing = function(group, options) { } // Use delimiter.sizedDelim to generate the delimiter. - return makeSpan( - [groupToType[group.value.delimType]], - [delimiter.sizedDelim( - delim, group.value.size, options, group.mode)], - options); + return delimiter.sizedDelim( + delim, group.value.size, options, group.mode, + [groupToType[group.value.delimType]]); }; groupTypes.leftright = function(group, options) { @@ -1236,13 +1233,13 @@ groupTypes.leftright = function(group, options) { var leftDelim; if (group.value.left === ".") { // Empty delimiters in \left and \right make null delimiter spaces. - leftDelim = makeNullDelimiter(options); + leftDelim = makeNullDelimiter(options, ["mopen"]); } else { // Otherwise, use leftRightDelim to generate the correct sized // delimiter. leftDelim = delimiter.leftRightDelim( group.value.left, innerHeight, innerDepth, options, - group.mode); + group.mode, ["mopen"]); } // Add it to the beginning of the expression inner.unshift(leftDelim); @@ -1250,11 +1247,11 @@ groupTypes.leftright = function(group, options) { var rightDelim; // Same for the right delimiter if (group.value.right === ".") { - rightDelim = makeNullDelimiter(options); + rightDelim = makeNullDelimiter(options, ["mclose"]); } else { rightDelim = delimiter.leftRightDelim( group.value.right, innerHeight, innerDepth, options, - group.mode); + group.mode, ["mclose"]); } // Add it to the end of the expression. inner.push(rightDelim); diff --git a/src/delimiter.js b/src/delimiter.js index 3b62621..0dbc8c5 100644 --- a/src/delimiter.js +++ b/src/delimiter.js @@ -56,9 +56,11 @@ var mathrmSize = function(value, size, mode, options) { * Puts a delimiter span in a given style, and adds appropriate height, depth, * and maxFontSizes. */ -var styleWrap = function(delim, toStyle, options) { +var styleWrap = function(delim, toStyle, options, classes) { + classes = classes || []; var span = makeSpan( - ["style-wrap", options.style.reset(), toStyle.cls()], [delim], options); + classes.concat(["style-wrap", options.style.reset(), toStyle.cls()]), + [delim], options); var multiplier = toStyle.sizeMultiplier / options.style.sizeMultiplier; @@ -74,10 +76,10 @@ var styleWrap = function(delim, toStyle, options) { * font, but is restyled to either be in textstyle, scriptstyle, or * scriptscriptstyle. */ -var makeSmallDelim = function(delim, style, center, options, mode) { +var makeSmallDelim = function(delim, style, center, options, mode, classes) { var text = buildCommon.makeSymbol(delim, "Main-Regular", mode, options); - var span = styleWrap(text, style, options); + var span = styleWrap(text, style, options, classes); if (center) { var shift = @@ -96,13 +98,12 @@ var makeSmallDelim = function(delim, style, center, options, mode) { * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2, * Size3, or Size4 fonts. It is always rendered in textstyle. */ -var makeLargeDelim = function(delim, size, center, options, mode) { +var makeLargeDelim = function(delim, size, center, options, mode, classes) { var inner = mathrmSize(delim, size, mode, options); var span = styleWrap( - makeSpan(["delimsizing", "size" + size], - [inner], options), - Style.TEXT, options); + makeSpan(["delimsizing", "size" + size], [inner], options), + Style.TEXT, options, classes); if (center) { var shift = (1 - options.style.sizeMultiplier) * @@ -142,7 +143,8 @@ var makeInner = function(symbol, font, mode) { * Make a stacked delimiter out of a given delimiter, with the total height at * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook. */ -var makeStackedDelim = function(delim, heightTotal, center, options, mode) { +var makeStackedDelim = function(delim, heightTotal, center, options, mode, + classes) { // There are four parts, the top, an optional middle, a repeated part, and a // bottom. var top; @@ -320,7 +322,7 @@ var makeStackedDelim = function(delim, heightTotal, center, options, mode) { return styleWrap( makeSpan(["delimsizing", "mult"], [inner], options), - Style.TEXT, options); + Style.TEXT, options, classes); }; // There are three kinds of delimiters, delimiters that stack when they become @@ -354,7 +356,7 @@ var sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0]; /** * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4. */ -var makeSizedDelim = function(delim, size, options, mode) { +var makeSizedDelim = function(delim, size, options, mode, classes) { // < and > turn into \langle and \rangle in delimiters if (delim === "<" || delim === "\\lt") { delim = "\\langle"; @@ -365,10 +367,10 @@ var makeSizedDelim = function(delim, size, options, mode) { // Sized delimiters are never centered. if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) { - return makeLargeDelim(delim, size, false, options, mode); + return makeLargeDelim(delim, size, false, options, mode, classes); } else if (utils.contains(stackAlwaysDelimiters, delim)) { return makeStackedDelim( - delim, sizeToMaxHeight[size], false, options, mode); + delim, sizeToMaxHeight[size], false, options, mode, classes); } else { throw new ParseError("Illegal delimiter: '" + delim + "'"); } @@ -471,7 +473,8 @@ var traverseSequence = function(delim, height, sequence, options) { * Make a delimiter of a given height+depth, with optional centering. Here, we * traverse the sequences, and create a delimiter that the sequence tells us to. */ -var makeCustomSizedDelim = function(delim, height, center, options, mode) { +var makeCustomSizedDelim = function(delim, height, center, options, mode, + classes) { if (delim === "<" || delim === "\\lt") { delim = "\\langle"; } else if (delim === ">" || delim === "\\gt") { @@ -494,11 +497,13 @@ var makeCustomSizedDelim = function(delim, height, center, options, mode) { // Depending on the sequence element we decided on, call the appropriate // function. if (delimType.type === "small") { - return makeSmallDelim(delim, delimType.style, center, options, mode); + return makeSmallDelim(delim, delimType.style, center, options, mode, + classes); } else if (delimType.type === "large") { - return makeLargeDelim(delim, delimType.size, center, options, mode); + return makeLargeDelim(delim, delimType.size, center, options, mode, + classes); } else if (delimType.type === "stack") { - return makeStackedDelim(delim, height, center, options, mode); + return makeStackedDelim(delim, height, center, options, mode, classes); } }; @@ -506,7 +511,8 @@ var makeCustomSizedDelim = function(delim, height, center, options, mode) { * Make a delimiter for use with `\left` and `\right`, given a height and depth * of an expression that the delimiters surround. */ -var makeLeftRightDelim = function(delim, height, depth, options, mode) { +var makeLeftRightDelim = function(delim, height, depth, options, mode, + classes) { // We always center \left/\right delimiters, so the axis is always shifted var axisHeight = options.style.metrics.axisHeight * options.style.sizeMultiplier; @@ -533,7 +539,8 @@ var makeLeftRightDelim = function(delim, height, depth, options, mode) { // Finally, we defer to `makeCustomSizedDelim` with our calculated total // height - return makeCustomSizedDelim(delim, totalHeight, true, options, mode); + return makeCustomSizedDelim(delim, totalHeight, true, options, mode, + classes); }; module.exports = { diff --git a/test/screenshotter/images/BinCancellation-chrome.png b/test/screenshotter/images/BinCancellation-chrome.png index 7f50bed53a0f425238bdd0f64174b545e7b5d6fb..749e2bd13bb4d4c1e33f3adfc1db58c46608f686 100644 GIT binary patch literal 10141 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 KD!l&a`F{a^?g4H9 literal 7526 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 U9fb0`F+e*m>KW;lYTMuYAEzH2=Kufz diff --git a/test/screenshotter/images/BinCancellation-firefox.png b/test/screenshotter/images/BinCancellation-firefox.png index 7376557d295f726ef65fe44500f6b040309675a6..021274ecf423d4dcc1fcce8faf831391723fec43 100644 GIT binary patch literal 9161 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