diff --git a/crates/typst-layout/src/inline/linebreak.rs b/crates/typst-layout/src/inline/linebreak.rs index 26621cd7b..236d68921 100644 --- a/crates/typst-layout/src/inline/linebreak.rs +++ b/crates/typst-layout/src/inline/linebreak.rs @@ -543,7 +543,12 @@ fn raw_ratio( ) -> f64 { // Determine how much the line's spaces would need to be stretched // to make it the desired width. - let delta = available_width - line_width; + let mut delta = available_width - line_width; + + // Avoid possible floating point errors in previous calculation. + if delta.approx_eq(Abs::zero()) { + delta = Abs::zero(); + } // Determine how much stretch or shrink is natural. let adjustability = if delta >= Abs::zero() { stretchability } else { shrinkability }; diff --git a/tests/ref/issue-5360-unnecessary-hyphenation.png b/tests/ref/issue-5360-unnecessary-hyphenation.png new file mode 100644 index 000000000..90a8180a5 Binary files /dev/null and b/tests/ref/issue-5360-unnecessary-hyphenation.png differ diff --git a/tests/suite/layout/inline/justify.typ b/tests/suite/layout/inline/justify.typ index 576f8519c..6e0317ac5 100644 --- a/tests/suite/layout/inline/justify.typ +++ b/tests/suite/layout/inline/justify.typ @@ -172,3 +172,8 @@ int main() { // Test that overflow does not lead to bad bounds in paragraph optimization. #set par(justify: true) #block(width: 0pt)[A B] + +--- issue-5360-unnecessary-hyphenation --- +// Test whether `Formal` would be in one line. +#set par(justify: true) +#table(columns: 1, [Formal])