From 3d64f7b659905755322c419c5cd1fdb2078590e8 Mon Sep 17 00:00:00 2001 From: Philipp Niedermayer Date: Mon, 1 Sep 2025 11:20:42 +0200 Subject: [PATCH] Fix auto hanging-indent for centered headings (#6839) --- crates/typst-layout/src/rules.rs | 13 +++++++------ crates/typst-library/src/model/heading.rs | 10 +++++++--- .../heading-hanging-indent-auto-center-align.png | Bin 0 -> 860 bytes tests/suite/model/heading.typ | 5 +++++ 4 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 tests/ref/heading-hanging-indent-auto-center-align.png diff --git a/crates/typst-layout/src/rules.rs b/crates/typst-layout/src/rules.rs index 8bcd6654..52ef7442 100644 --- a/crates/typst-layout/src/rules.rs +++ b/crates/typst-layout/src/rules.rs @@ -10,11 +10,11 @@ use typst_library::foundations::{ }; use typst_library::introspection::{Counter, Locator, LocatorLink}; use typst_library::layout::{ - Abs, AlignElem, Alignment, Axes, BlockBody, BlockElem, ColumnsElem, Em, GridCell, - GridChild, GridElem, GridItem, HAlignment, HElem, HideElem, InlineElem, LayoutElem, - Length, MoveElem, OuterVAlignment, PadElem, PlaceElem, PlacementScope, Region, Rel, - RepeatElem, RotateElem, ScaleElem, Sides, Size, Sizing, SkewElem, Spacing, - StackChild, StackElem, TrackSizings, VElem, + Abs, AlignElem, Alignment, Axes, BlockBody, BlockElem, ColumnsElem, Em, + FixedAlignment, GridCell, GridChild, GridElem, GridItem, HAlignment, HElem, HideElem, + InlineElem, LayoutElem, Length, MoveElem, OuterVAlignment, PadElem, PlaceElem, + PlacementScope, Region, Rel, RepeatElem, RotateElem, ScaleElem, Sides, Size, Sizing, + SkewElem, Spacing, StackChild, StackElem, TrackSizings, VElem, }; use typst_library::math::EquationElem; use typst_library::model::{ @@ -240,8 +240,9 @@ const HEADING_RULE: ShowFn = |elem, engine, styles| { let numbering = Counter::of(HeadingElem::ELEM) .display_at_loc(engine, location, styles, numbering)? .spanned(span); + let align = styles.resolve(AlignElem::alignment); - if hanging_indent.is_auto() { + if hanging_indent.is_auto() && align.x == FixedAlignment::Start { let pod = Region::new(Axes::splat(Abs::inf()), Axes::splat(false)); // We don't have a locator for the numbering here, so we just diff --git a/crates/typst-library/src/model/heading.rs b/crates/typst-library/src/model/heading.rs index d61aa415..3e8677a1 100644 --- a/crates/typst-library/src/model/heading.rs +++ b/crates/typst-library/src/model/heading.rs @@ -177,12 +177,16 @@ pub struct HeadingElem { /// The indent all but the first line of a heading should have. /// - /// The default value of `{auto}` indicates that the subsequent heading - /// lines will be indented based on the width of the numbering. + /// The default value of `{auto}` uses the width of the numbering as indent + /// if the heading is aligned at the [start]($direction.start) of the [text + /// direction]($text.dir), and no indent for center and other alignments. /// /// ```example /// #set heading(numbering: "1.") - /// #heading[A very, very, very, very, very, very long heading] + /// = A very, very, very, very, very, very long heading + /// + /// #show heading: set align(center) + /// == A very long heading\ with center alignment /// ``` #[default(Smart::Auto)] pub hanging_indent: Smart, diff --git a/tests/ref/heading-hanging-indent-auto-center-align.png b/tests/ref/heading-hanging-indent-auto-center-align.png new file mode 100644 index 0000000000000000000000000000000000000000..086f2eea6ec4661793f3a58f71d02863f05a6539 GIT binary patch literal 860 zcmV-i1Ec(jP)ScLya zSXt6BG_dM%eV_DX!JeDj7QH~fYHJe~{^B~G@_OSfdIZ4Vso%PANwTo;>qJW~>q%v! zmm8Ya4}h*305r`|HUe;=O2QaE1`D zC8q&r{fxnhj%tAzPh2CLsv=*M@_N8z4B$-hXf`u_DUZy;0Ztw~-0I4_GC@6lqcLhc zCQrB9?FFcJGA}Gr?&oo-0n9FVV>0nFVkVL46~szeRySxE3YA)^L7TScLDN@bZ>crB zRkwGjR4RpjY5}0D=m6C1YK2ZbBt%$*|4lgYp(lP*rBPlv!ozVqQ?HLr7+^`+dWsPq z#u#&;^hgN?s7v%rSXgJcjWsviy9}46@JxWd854S%?y{h8r-R2-Mx? zKl;b6HchsXSa$%?TV>m8fmi!nX9x-hj>ARzY}|1G`QR#7NAXi&J74;~my_^*RD2!V zAZ2tsgx#^Owc!MX7~yd8g$Gx}aVTKV*|@{uIK#)?W*@*IY7iK%mN{MFd%f^C3#)B1 z)lWDKE2t6x=25x8uG0xUIMR8YA_BG)iE|VoAneEv z&O9sDlR2<_Gp#CgAF*VEtxwB4b9R@n;&p{}7GyFl8)ec72RHKkO5tE_S`#vg@hLw) zw>h^UR~~PD;q+oYRh5^YuQX(6v(q~Pw5Dhp3;y80y3NcR=vo>y