summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChen <53432474+werifu@users.noreply.github.com>2023-04-13 16:41:42 +0800
committerGitHub <noreply@github.com>2023-04-13 10:41:42 +0200
commita066a3d2831bc8e643349a54880671e9c7d11e0f (patch)
tree7355c76fa93a624a47f1a553c1d1434f6e568d69
parent8300f75f22cb4dd1b871a7e617397ff7d56ba001 (diff)
More flexible capability to control showing reference (#646)
-rw-r--r--library/src/meta/heading.rs1
-rw-r--r--library/src/meta/reference.rs50
-rw-r--r--tests/ref/meta/ref.pngbin11693 -> 179188 bytes
-rw-r--r--tests/typ/meta/ref.typ101
4 files changed, 152 insertions, 0 deletions
diff --git a/library/src/meta/heading.rs b/library/src/meta/heading.rs
index 56942a24..f3d0e337 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 9598decb..13d7b8ec 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<CiteElem>,
+
+ /// 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 <intro>
+ /// = Summary <sum>
+ /// == Subsection <sub>
+ /// @intro
+ ///
+ /// @sum
+ ///
+ /// @sub
+ /// ```
+ #[synthesized]
+ pub element: Option<Content>,
}
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 13e4db33..dc25a0ab 100644
--- a/tests/ref/meta/ref.png
+++ b/tests/ref/meta/ref.png
Binary files differ
diff --git a/tests/typ/meta/ref.typ b/tests/typ/meta/ref.typ
index 85750712..2bed2125 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",
+) <fig1>
+
+#figure(
+ image("/tiger.jpg", height: 3cm),
+ caption: [A tiger.],
+ supplement: "Figg",
+) <fig2>
+
+#figure(
+ $ A = 1 $,
+ kind: "equation",
+ supplement: "Equa",
+
+) <eq1>
+@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 <intro>
+
+= Summary <sum>
+
+== Subsection <sub>
+
+@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 <txt>
+
+@under
+#underline[
+Some underline text.
+] <under>