Fix bad bound in forcibly overflowing optimal paragraph layout (#4975)

This commit is contained in:
Laurenz 2024-09-17 13:56:23 +02:00 committed by GitHub
parent ea145ff33b
commit c145e05f01
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 22 additions and 1 deletions

View File

@ -698,6 +698,12 @@ impl<'a> DerefMut for Items<'a> {
}
}
impl Debug for Items<'_> {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
f.debug_list().entries(&self.0).finish()
}
}
/// A reference to or a boxed item.
pub enum ItemEntry<'a> {
Ref(&'a Item<'a>),

View File

@ -481,9 +481,19 @@ fn linebreak_optimized_approximate(
let Entry { end, breakpoint, unbreakable, .. } = table[idx];
let attempt = line(engine, p, start..end, breakpoint, Some(&pred));
let (_, line_cost) =
let (ratio, line_cost) =
ratio_and_cost(p, metrics, width, &pred, &attempt, breakpoint, unbreakable);
// If approximation produces a valid layout without too much shrinking,
// exact layout is guaranteed to find the same layout. If, however, the
// line is overfull, we do not have this guarantee. Then, our bound
// becomes useless and actively harmful (it could be lower than what
// optimal layout produces). Thus, we immediately bail with an infinite
// bound in this case.
if ratio < metrics.min_ratio(false) {
return Cost::INFINITY;
}
pred = attempt;
start = end;
exact += line_cost;

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

View File

@ -167,3 +167,8 @@ int main() {
// an underfull first line.
#set par(hanging-indent: 2.5cm, justify: true)
#lorem(5)
--- issue-4651-justify-bad-bound ---
// Test that overflow does not lead to bad bounds in paragraph optimization.
#set par(justify: true)
#block(width: 0pt)[A B]