summaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/typst/src/layout/length.rs34
1 files changed, 33 insertions, 1 deletions
diff --git a/crates/typst/src/layout/length.rs b/crates/typst/src/layout/length.rs
index 587085d3..26b9320b 100644
--- a/crates/typst/src/layout/length.rs
+++ b/crates/typst/src/layout/length.rs
@@ -5,7 +5,7 @@ use std::ops::{Add, Div, Mul, Neg};
use ecow::{eco_format, EcoString};
use crate::diag::{At, Hint, SourceResult};
-use crate::foundations::{func, scope, ty, Repr, Resolve, StyleChain};
+use crate::foundations::{func, scope, ty, Repr, Resolve, StyleChain, Styles};
use crate::layout::{Abs, Em};
use crate::syntax::Span;
use crate::util::Numeric;
@@ -132,6 +132,38 @@ impl Length {
self.ensure_that_em_is_zero(span, "inches")?;
Ok(self.abs.to_inches())
}
+
+ /// Resolve this length to an absolute length.
+ ///
+ /// ```example
+ /// #set text(size: 12pt)
+ /// #style(styles => [
+ /// #(6pt).to-absolute(styles) \
+ /// #(6pt + 10em).to-absolute(styles) \
+ /// #(10em).to-absolute(styles)
+ /// ])
+ ///
+ /// #set text(size: 6pt)
+ /// #style(styles => [
+ /// #(6pt).to-absolute(styles) \
+ /// #(6pt + 10em).to-absolute(styles) \
+ /// #(10em).to-absolute(styles)
+ /// ])
+ /// ```
+ #[func]
+ pub fn to_absolute(
+ &self,
+ /// The styles to resolve the length with.
+ ///
+ /// Since a length can use font-relative em units, resolving it to an
+ /// absolute length requires knowledge of the font size. This size is
+ /// provided through these styles. You can obtain the styles using
+ /// the [`style`]($style) function.
+ styles: Styles,
+ ) -> Length {
+ let styles = StyleChain::new(&styles);
+ self.resolve(styles).into()
+ }
}
impl Debug for Length {