Use heading's own location for numbering (#3322)

This commit is contained in:
Laurenz 2024-02-02 11:53:39 +01:00 committed by GitHub
parent 154747590e
commit f1ba218e8f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 23 additions and 17 deletions

View File

@ -649,9 +649,9 @@ impl Show for Packed<DisplayElem> {
if func == HeadingElem::elem() { if func == HeadingElem::elem() {
HeadingElem::numbering_in(styles).clone() HeadingElem::numbering_in(styles).clone()
} else if func == FigureElem::elem() { } else if func == FigureElem::elem() {
FigureElem::numbering_in(styles) FigureElem::numbering_in(styles).clone()
} else if func == EquationElem::elem() { } else if func == EquationElem::elem() {
EquationElem::numbering_in(styles) EquationElem::numbering_in(styles).clone()
} else { } else {
None None
} }

View File

@ -73,6 +73,7 @@ pub struct EquationElem {
/// With @ratio, we get: /// With @ratio, we get:
/// $ F_n = floor(1 / sqrt(5) phi.alt^n) $ /// $ F_n = floor(1 / sqrt(5) phi.alt^n) $
/// ``` /// ```
#[borrowed]
pub numbering: Option<Numbering>, pub numbering: Option<Numbering>,
/// A supplement for the equation. /// A supplement for the equation.
@ -243,7 +244,9 @@ impl LayoutSingle for Packed<EquationElem> {
if let Some(numbering) = (**self).numbering(styles) { if let Some(numbering) = (**self).numbering(styles) {
let pod = Regions::one(regions.base(), Axes::splat(false)); let pod = Regions::one(regions.base(), Axes::splat(false));
let counter = Counter::of(EquationElem::elem()) let counter = Counter::of(EquationElem::elem())
.display(self.span(), Some(numbering), false) .at(engine, self.location().unwrap())?
.display(engine, numbering)?
.spanned(self.span())
.layout(engine, styles, pod)? .layout(engine, styles, pod)?
.into_frame(); .into_frame();
@ -338,8 +341,8 @@ impl Refable for Packed<EquationElem> {
Counter::of(EquationElem::elem()) Counter::of(EquationElem::elem())
} }
fn numbering(&self) -> Option<Numbering> { fn numbering(&self) -> Option<&Numbering> {
(**self).numbering(StyleChain::default()) (**self).numbering(StyleChain::default()).as_ref()
} }
} }
@ -365,7 +368,7 @@ impl Outlinable for Packed<EquationElem> {
let numbers = self let numbers = self
.counter() .counter()
.at(engine, self.location().unwrap())? .at(engine, self.location().unwrap())?
.display(engine, &numbering)?; .display(engine, numbering)?;
Ok(Some(supplement + numbers)) Ok(Some(supplement + numbers))
} }

View File

@ -192,6 +192,7 @@ pub struct FigureElem {
/// How to number the figure. Accepts a /// How to number the figure. Accepts a
/// [numbering pattern or function]($numbering). /// [numbering pattern or function]($numbering).
#[default(Some(NumberingPattern::from_str("1").unwrap().into()))] #[default(Some(NumberingPattern::from_str("1").unwrap().into()))]
#[borrowed]
pub numbering: Option<Numbering>, pub numbering: Option<Numbering>,
/// The vertical gap between the body and caption. /// The vertical gap between the body and caption.
@ -371,8 +372,8 @@ impl Refable for Packed<FigureElem> {
.unwrap_or_else(|| Counter::of(FigureElem::elem())) .unwrap_or_else(|| Counter::of(FigureElem::elem()))
} }
fn numbering(&self) -> Option<Numbering> { fn numbering(&self) -> Option<&Numbering> {
(**self).numbering(StyleChain::default()) (**self).numbering(StyleChain::default()).as_ref()
} }
} }
@ -396,8 +397,9 @@ impl Outlinable for Packed<FigureElem> {
(**self).counter(), (**self).counter(),
self.numbering(), self.numbering(),
) { ) {
let location = self.location().unwrap(); let numbers = counter
let numbers = counter.at(engine, location)?.display(engine, &numbering)?; .at(engine, self.location().unwrap())?
.display(engine, numbering)?;
if !supplement.is_empty() { if !supplement.is_empty() {
supplement += TextElem::packed('\u{a0}'); supplement += TextElem::packed('\u{a0}');

View File

@ -147,11 +147,12 @@ impl Synthesize for Packed<HeadingElem> {
impl Show for Packed<HeadingElem> { impl Show for Packed<HeadingElem> {
#[typst_macros::time(name = "heading", span = self.span())] #[typst_macros::time(name = "heading", span = self.span())]
fn show(&self, _: &mut Engine, styles: StyleChain) -> SourceResult<Content> { fn show(&self, engine: &mut Engine, styles: StyleChain) -> SourceResult<Content> {
let mut realized = self.body().clone(); let mut realized = self.body().clone();
if let Some(numbering) = (**self).numbering(styles).as_ref() { if let Some(numbering) = (**self).numbering(styles).as_ref() {
realized = Counter::of(HeadingElem::elem()) realized = Counter::of(HeadingElem::elem())
.display(self.span(), Some(numbering.clone()), false) .at(engine, self.location().unwrap())?
.display(engine, numbering)?
.spanned(self.span()) .spanned(self.span())
+ HElem::new(Em::new(0.3).into()).with_weak(true).pack() + HElem::new(Em::new(0.3).into()).with_weak(true).pack()
+ realized; + realized;
@ -205,8 +206,8 @@ impl Refable for Packed<HeadingElem> {
Counter::of(HeadingElem::elem()) Counter::of(HeadingElem::elem())
} }
fn numbering(&self) -> Option<Numbering> { fn numbering(&self) -> Option<&Numbering> {
(**self).numbering(StyleChain::default()).clone() (**self).numbering(StyleChain::default()).as_ref()
} }
} }

View File

@ -341,7 +341,7 @@ impl OutlineIndent {
let numbers = ancestor_outlinable let numbers = ancestor_outlinable
.counter() .counter()
.at(engine, ancestor.location().unwrap())? .at(engine, ancestor.location().unwrap())?
.display(engine, &numbering)?; .display(engine, numbering)?;
hidden += numbers + SpaceElem::new().pack(); hidden += numbers + SpaceElem::new().pack();
}; };

View File

@ -220,7 +220,7 @@ impl Show for Packed<RefElem> {
let numbers = refable let numbers = refable
.counter() .counter()
.at(engine, loc)? .at(engine, loc)?
.display(engine, &numbering.trimmed())?; .display(engine, &numbering.clone().trimmed())?;
let supplement = match self.supplement(styles).as_ref() { let supplement = match self.supplement(styles).as_ref() {
Smart::Auto => refable.supplement(), Smart::Auto => refable.supplement(),
@ -301,5 +301,5 @@ pub trait Refable {
fn counter(&self) -> Counter; fn counter(&self) -> Counter;
/// Returns the numbering of this element. /// Returns the numbering of this element.
fn numbering(&self) -> Option<Numbering>; fn numbering(&self) -> Option<&Numbering>;
} }