commit dc79b91dbf0906e4986b4d6ff0f7dbd71faff40c
parent 1a99e7a2e90517238948d7b25d4cd420bad41e84
Author: Eddie Kohler <ekohler@gmail.com>
Date: Sun, 27 Nov 2016 10:53:53 -0500
Mark delimiters with the proper class (mopen or mclose).
This fixes some atom spacing issues. Update the BinCancellation
screenshotter test.
Diffstat:
5 files changed, 42 insertions(+), 38 deletions(-)
diff --git 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
@@ -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
Binary files differ.
diff --git a/test/screenshotter/images/BinCancellation-firefox.png b/test/screenshotter/images/BinCancellation-firefox.png
Binary files differ.
diff --git a/test/screenshotter/ss_data.yaml b/test/screenshotter/ss_data.yaml
@@ -28,8 +28,8 @@ Baseline: a+b-c\cdot d/e
BasicTest: a
BinCancellation: |
\begin{array}{ccc}
- +1 & 1+ & 1+1 \\
- 1++1 & 3\times) & 1+,
+ +1 & 1+ & 1+1 & (,) \\
+ 1++1 & 3\times) & 1+, & \left(,\right)
\end{array}
BinomTest: \dbinom{a}{b}\tbinom{a}{b}^{\binom{a}{b}+17}
BoldSpacing: \mathbf{A}^2+\mathbf{B}_3*\mathscr{C}'