From 242a16e77a867dabc538a767fcd46a38b8b23a2e Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 18 Oct 2024 15:10:22 +0200 Subject: [PATCH] Fix optimized linebreaks without justification (#5236) --- crates/typst/src/layout/inline/linebreak.rs | 2 +- ...5235-linebreak-optimized-without-justify.png | Bin 0 -> 5821 bytes tests/suite/layout/inline/linebreak.typ | 16 ++++++++++++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 tests/ref/issue-5235-linebreak-optimized-without-justify.png diff --git a/crates/typst/src/layout/inline/linebreak.rs b/crates/typst/src/layout/inline/linebreak.rs index f5048aaec..aa62d487c 100644 --- a/crates/typst/src/layout/inline/linebreak.rs +++ b/crates/typst/src/layout/inline/linebreak.rs @@ -597,7 +597,7 @@ fn raw_cost( let badness = if ratio < metrics.min_ratio(approx) { // Overfull line always has maximum cost. 1_000_000.0 - } else if justify || ratio < 0.0 { + } else if breakpoint != Breakpoint::Mandatory || justify || ratio < 0.0 { // If the line shall be justified or needs shrinking, it has normal // badness with cost 100|ratio|^3. We limit the ratio to 10 as to not // get to close to our maximum cost. diff --git a/tests/ref/issue-5235-linebreak-optimized-without-justify.png b/tests/ref/issue-5235-linebreak-optimized-without-justify.png new file mode 100644 index 0000000000000000000000000000000000000000..b36dc4062174df89581fd4a10107d674b9be1dc0 GIT binary patch literal 5821 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 Hu0mjf59XQ= literal 0 HcmV?d00001 diff --git a/tests/suite/layout/inline/linebreak.typ b/tests/suite/layout/inline/linebreak.typ index 8371d76e2..e4b04b245 100644 --- a/tests/suite/layout/inline/linebreak.typ +++ b/tests/suite/layout/inline/linebreak.typ @@ -123,3 +123,19 @@ For info see #link("https://myhost.tld"). // - shaping that results in multiple glyphs in the same cluster #set text(font: "Noto Sans Thai") #h(85pt) งบิก + +--- issue-5235-linebreak-optimized-without-justify --- +#set page(width: 207pt, margin: 15pt) +#set text(11pt) + +#set par(linebreaks: "simple") +Some texts feature many longer +words. Those are often exceedingly +challenging to break in a visually +pleasing way. + +#set par(linebreaks: "optimized") +Some texts feature many longer +words. Those are often exceedingly +challenging to break in a visually +pleasing way.