diff --git a/library/src/meta/heading.rs b/library/src/meta/heading.rs index 56942a244..f3d0e3372 100644 --- a/library/src/meta/heading.rs +++ b/library/src/meta/heading.rs @@ -102,6 +102,7 @@ impl Synthesize for HeadingElem { self.push_numbering(self.numbering(styles)); self.push_supplement(self.supplement(styles)); self.push_outlined(self.outlined(styles)); + self.push_supplement(self.supplement(styles)); Ok(()) } } diff --git a/library/src/meta/reference.rs b/library/src/meta/reference.rs index 9598decb8..13d7b8ec1 100644 --- a/library/src/meta/reference.rs +++ b/library/src/meta/reference.rs @@ -85,12 +85,62 @@ pub struct RefElem { /// A synthesized citation. #[synthesized] pub citation: Option, + + /// Content of the element, it should be referable. + /// + /// ```example + /// #set heading(numbering: (..nums) => { + /// nums.pos().map(str).join(".") + /// }, supplement: [Chapt]) + /// + /// #show ref: it => { + /// if it.has("element") and it.element.func() == heading { + /// let element = it.element + /// "[" + /// element.supplement + /// "-" + /// numbering(element.numbering, ..counter(heading).at(element.location())) + /// "]" + /// } else { + /// it + /// } + /// } + /// + /// = Introduction + /// = Summary + /// == Subsection + /// @intro + /// + /// @sum + /// + /// @sub + /// ``` + #[synthesized] + pub element: Option, } impl Synthesize for RefElem { fn synthesize(&mut self, vt: &mut Vt, styles: StyleChain) -> SourceResult<()> { let citation = self.to_citation(vt, styles)?; self.push_citation(Some(citation)); + + if !vt.introspector.init() { + self.push_element(None); + return Ok(()); + } + + // find the element content + let target = self.target(); + let elem = vt.introspector.query_label(&self.target()); + // not in bibliography, but in document, then push the element + if let (false, Ok(elem)) = + (BibliographyElem::has(vt, &target.0), elem.at(self.span())) + { + self.push_element(Some(elem)); + } else { + self.push_element(None); + } + Ok(()) } } diff --git a/tests/ref/meta/ref.png b/tests/ref/meta/ref.png index 13e4db334..dc25a0ab9 100644 Binary files a/tests/ref/meta/ref.png and b/tests/ref/meta/ref.png differ diff --git a/tests/typ/meta/ref.typ b/tests/typ/meta/ref.typ index 85750712d..2bed2125b 100644 --- a/tests/typ/meta/ref.typ +++ b/tests/typ/meta/ref.typ @@ -19,3 +19,104 @@ As seen in @intro, we proceed. // Error: 1-5 label occurs multiple times in the document @foo + +--- + +#show ref: it => { + if it.element != none and it.element.func() == figure { + let element = it.element + "[" + element.supplement + "-" + str(element.counter.at(element.location()).at(0)) + "]" + // it + } else { + it + } +} + +#figure( + image("/cylinder.svg", height: 3cm), + caption: [A sylinder.], + supplement: "Fig", +) + +#figure( + image("/tiger.jpg", height: 3cm), + caption: [A tiger.], + supplement: "Figg", +) + +#figure( + $ A = 1 $, + kind: "equation", + supplement: "Equa", + +) +@fig1 + +@fig2 + +@eq1 + +--- +#set heading(numbering: (..nums) => { + nums.pos().map(str).join(".") + }, supplement: [Chapt]) + +#show ref: it => { + if it.element != none and it.element.func() == heading { + let element = it.element + "[" + emph(element.supplement) + "-" + numbering(element.numbering, ..counter(heading).at(element.location())) + "]" + } else { + it + } +} + += Introduction + += Summary + +== Subsection + +@intro + +@sum + +@sub + +--- + +#show ref: it => { + if it.element != none { + if it.element.func() == text { + let element = it.element + "[" + element + "]" + } else if it.element.func() == underline { + let element = it.element + "{" + element + "}" + } else { + it + } + } else { + it + } +} + +@txt + +Ref something unreferable + +@under +#underline[ +Some underline text. +]