diff --git a/crates/typst/src/math/equation.rs b/crates/typst/src/math/equation.rs index 947f01f25..d6a8d4c78 100644 --- a/crates/typst/src/math/equation.rs +++ b/crates/typst/src/math/equation.rs @@ -466,25 +466,33 @@ fn resize_equation( if matches!(number_align.y, FixedAlignment::Center if is_multiline) { // In this case, the center lines (not baselines) of the number frame // and the equation frame shall be aligned. - let height = equation.height().max(number.height()); return equation.resize( - Size::new(width, height), + Size::new(width, equation.height().max(number.height())), Axes::::new(equation_align, FixedAlignment::Center), ); } let excess_above = Abs::zero().max({ - let (.., baseline) = first; - number.baseline() - baseline + if !is_multiline || matches!(number_align.y, FixedAlignment::Start) { + let (.., baseline) = first; + number.baseline() - baseline + } else { + Abs::zero() + } }); let excess_below = Abs::zero().max({ - let (size, .., baseline) = last; - (number.height() - number.baseline()) - (size.y - baseline) + if !is_multiline || matches!(number_align.y, FixedAlignment::End) { + let (size, .., baseline) = last; + (number.height() - number.baseline()) - (size.y - baseline) + } else { + Abs::zero() + } }); - let height = equation.height() + excess_above + excess_below; + // The vertical expansion is asymmetric on the top and bottom edges, so we + // first align at the top then translate the content downward later. let resizing_offset = equation.resize( - Size::new(width, height), + Size::new(width, equation.height() + excess_above + excess_below), Axes::::new(equation_align, FixedAlignment::Start), ); equation.translate(Point::with_y(excess_above)); diff --git a/tests/ref/math-equation-number-align-multiline-expand.png b/tests/ref/math-equation-number-align-multiline-expand.png index b65464331..f3e67c230 100644 Binary files a/tests/ref/math-equation-number-align-multiline-expand.png and b/tests/ref/math-equation-number-align-multiline-expand.png differ diff --git a/tests/ref/math-equation-number-align-multiline-no-expand.png b/tests/ref/math-equation-number-align-multiline-no-expand.png new file mode 100644 index 000000000..ca451d191 Binary files /dev/null and b/tests/ref/math-equation-number-align-multiline-no-expand.png differ diff --git a/tests/suite/math/equation.typ b/tests/suite/math/equation.typ index d4fba36b2..e7ae677e0 100644 --- a/tests/suite/math/equation.typ +++ b/tests/suite/math/equation.typ @@ -194,22 +194,67 @@ $ q &= sum_k ln A \ // numbering's layout box. Note we use pattern "1" here, not "(1)", since // the parenthesis exceeds the numbering's layout box, due to the default // settings of top-edge and bottom-edge of the TextElem that laid it out. +#let equations = [ + #box($ - - - $, fill: silver) + #box( + $ - - - \ + a = b $, + fill: silver) + #box( + $ a = b \ + - - - $, + fill: silver) +] + #set math.equation(numbering: "1", number-align: top) -#box( -$ - &- - \ - a &= b $, -fill: silver) +#equations #set math.equation(numbering: "1", number-align: horizon) -#box( -$ - - - $, -fill: silver) +#equations #set math.equation(numbering: "1", number-align: bottom) -#box( -$ a &= b \ - - &- - $, -fill: silver) +#equations + +--- math-equation-number-align-multiline-no-expand --- +// Tests that if the numbering's layout box doesn't vertically exceed the +// box of the equation frame's boundary, the latter's frame size remains. +// So, in the grid below, frames in each row should have the same height. +#set math.equation(numbering: "1") +#grid( + columns: 4 * (1fr,), + column-gutter: 3 * (2pt,), + row-gutter: 2pt, + align: horizon, + [ + #set math.equation(number-align: horizon) + #box($ - - \ a \ sum $, fill: silver) + ], + [ + #set math.equation(number-align: bottom) + #box($ - - \ a \ sum $, fill: silver) + ], + [ + #set math.equation(number-align: horizon) + #box($ sum \ a \ - - $, fill: silver) + ], + [ + #set math.equation(number-align: top) + #box($ sum \ a \ - - $, fill: silver) + ], + + [ + #set math.equation(number-align: horizon) + #box($ - - $, fill: silver) + ], + [ + #set math.equation(number-align: top) + #box($ - - $, fill: silver) + ], + [ + #set math.equation(number-align: bottom) + #box($ - - $, fill: silver) + ], +) --- issue-numbering-hint --- // In this bug, the hint and error messages for an equation