summaryrefslogtreecommitdiff
path: root/crates/typst-layout/src/math
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2025-07-08 10:52:43 +0200
committerGitHub <noreply@github.com>2025-07-08 08:52:43 +0000
commit0a3c6939dd274f40672484695d909c2cc0d0d755 (patch)
tree465c10338230b895fdd06c8b3491f1734e8a2932 /crates/typst-layout/src/math
parent36ecbb2c8dccc1a31c43fee1466f1425844d8607 (diff)
Rewrite foundations of native elements (#6547)
Diffstat (limited to 'crates/typst-layout/src/math')
-rw-r--r--crates/typst-layout/src/math/accent.rs4
-rw-r--r--crates/typst-layout/src/math/attach.rs19
-rw-r--r--crates/typst-layout/src/math/cancel.rs16
-rw-r--r--crates/typst-layout/src/math/frac.rs2
-rw-r--r--crates/typst-layout/src/math/fragment.rs25
-rw-r--r--crates/typst-layout/src/math/lr.rs4
-rw-r--r--crates/typst-layout/src/math/mat.rs27
-rw-r--r--crates/typst-layout/src/math/mod.rs35
-rw-r--r--crates/typst-layout/src/math/root.rs6
-rw-r--r--crates/typst-layout/src/math/run.rs6
-rw-r--r--crates/typst-layout/src/math/shared.rs53
-rw-r--r--crates/typst-layout/src/math/stretch.rs9
-rw-r--r--crates/typst-layout/src/math/text.rs12
-rw-r--r--crates/typst-layout/src/math/underover.rs18
14 files changed, 130 insertions, 106 deletions
diff --git a/crates/typst-layout/src/math/accent.rs b/crates/typst-layout/src/math/accent.rs
index 159703b8..e7f051ac 100644
--- a/crates/typst-layout/src/math/accent.rs
+++ b/crates/typst-layout/src/math/accent.rs
@@ -24,7 +24,7 @@ pub fn layout_accent(
// Try to replace the base glyph with its dotless variant.
let dtls = style_dtls();
let base_styles =
- if top_accent && elem.dotless(styles) { styles.chain(&dtls) } else { styles };
+ if top_accent && elem.dotless.get(styles) { styles.chain(&dtls) } else { styles };
let cramped = style_cramped();
let base = ctx.layout_into_fragment(&elem.base, base_styles.chain(&cramped))?;
@@ -47,7 +47,7 @@ pub fn layout_accent(
// Forcing the accent to be at least as large as the base makes it too wide
// in many cases.
- let width = elem.size(styles).relative_to(base.width());
+ let width = elem.size.resolve(styles).relative_to(base.width());
let short_fall = ACCENT_SHORT_FALL.at(glyph.item.size);
glyph.stretch_horizontal(ctx, width - short_fall);
let accent_attach = glyph.accent_attach.0;
diff --git a/crates/typst-layout/src/math/attach.rs b/crates/typst-layout/src/math/attach.rs
index a7f3cad5..78b6f551 100644
--- a/crates/typst-layout/src/math/attach.rs
+++ b/crates/typst-layout/src/math/attach.rs
@@ -31,16 +31,16 @@ pub fn layout_attach(
let mut base = ctx.layout_into_fragment(&elem.base, styles)?;
let sup_style = style_for_superscript(styles);
let sup_style_chain = styles.chain(&sup_style);
- let tl = elem.tl(sup_style_chain);
- let tr = elem.tr(sup_style_chain);
+ let tl = elem.tl.get_cloned(sup_style_chain);
+ let tr = elem.tr.get_cloned(sup_style_chain);
let primed = tr.as_ref().is_some_and(|content| content.is::<PrimesElem>());
- let t = elem.t(sup_style_chain);
+ let t = elem.t.get_cloned(sup_style_chain);
let sub_style = style_for_subscript(styles);
let sub_style_chain = styles.chain(&sub_style);
- let bl = elem.bl(sub_style_chain);
- let br = elem.br(sub_style_chain);
- let b = elem.b(sub_style_chain);
+ let bl = elem.bl.get_cloned(sub_style_chain);
+ let br = elem.br.get_cloned(sub_style_chain);
+ let b = elem.b.get_cloned(sub_style_chain);
let limits = base.limits().active(styles);
let (t, tr) = match (t, tr) {
@@ -146,7 +146,7 @@ pub fn layout_limits(
ctx: &mut MathContext,
styles: StyleChain,
) -> SourceResult<()> {
- let limits = if elem.inline(styles) { Limits::Always } else { Limits::Display };
+ let limits = if elem.inline.get(styles) { Limits::Always } else { Limits::Display };
let mut fragment = ctx.layout_into_fragment(&elem.body, styles)?;
fragment.set_limits(limits);
ctx.push(fragment);
@@ -161,7 +161,8 @@ fn stretch_size(styles: StyleChain, elem: &Packed<AttachElem>) -> Option<Rel<Abs
base = &equation.body;
}
- base.to_packed::<StretchElem>().map(|stretch| stretch.size(styles))
+ base.to_packed::<StretchElem>()
+ .map(|stretch| stretch.size.resolve(styles))
}
/// Lay out the attachments.
@@ -397,7 +398,7 @@ fn compute_script_shifts(
base: &MathFragment,
[tl, tr, bl, br]: [&Option<MathFragment>; 4],
) -> (Abs, Abs) {
- let sup_shift_up = if EquationElem::cramped_in(styles) {
+ let sup_shift_up = if styles.get(EquationElem::cramped) {
scaled!(ctx, styles, superscript_shift_up_cramped)
} else {
scaled!(ctx, styles, superscript_shift_up)
diff --git a/crates/typst-layout/src/math/cancel.rs b/crates/typst-layout/src/math/cancel.rs
index 9826397f..57a32ca2 100644
--- a/crates/typst-layout/src/math/cancel.rs
+++ b/crates/typst-layout/src/math/cancel.rs
@@ -27,16 +27,16 @@ pub fn layout_cancel(
let mut body = body.into_frame();
let body_size = body.size();
let span = elem.span();
- let length = elem.length(styles);
+ let length = elem.length.resolve(styles);
- let stroke = elem.stroke(styles).unwrap_or(FixedStroke {
- paint: TextElem::fill_in(styles).as_decoration(),
+ let stroke = elem.stroke.resolve(styles).unwrap_or(FixedStroke {
+ paint: styles.get_ref(TextElem::fill).as_decoration(),
..Default::default()
});
- let invert = elem.inverted(styles);
- let cross = elem.cross(styles);
- let angle = elem.angle(styles);
+ let invert = elem.inverted.get(styles);
+ let cross = elem.cross.get(styles);
+ let angle = elem.angle.get_ref(styles);
let invert_first_line = !cross && invert;
let first_line = draw_cancel_line(
@@ -44,7 +44,7 @@ pub fn layout_cancel(
length,
stroke.clone(),
invert_first_line,
- &angle,
+ angle,
body_size,
styles,
span,
@@ -57,7 +57,7 @@ pub fn layout_cancel(
if cross {
// Draw the second line.
let second_line =
- draw_cancel_line(ctx, length, stroke, true, &angle, body_size, styles, span)?;
+ draw_cancel_line(ctx, length, stroke, true, angle, body_size, styles, span)?;
body.push_frame(center, second_line);
}
diff --git a/crates/typst-layout/src/math/frac.rs b/crates/typst-layout/src/math/frac.rs
index 091f328f..12a2c6fd 100644
--- a/crates/typst-layout/src/math/frac.rs
+++ b/crates/typst-layout/src/math/frac.rs
@@ -124,7 +124,7 @@ fn layout_frac_like(
FrameItem::Shape(
Geometry::Line(Point::with_x(line_width)).stroked(
FixedStroke::from_pair(
- TextElem::fill_in(styles).as_decoration(),
+ styles.get_ref(TextElem::fill).as_decoration(),
thickness,
),
),
diff --git a/crates/typst-layout/src/math/fragment.rs b/crates/typst-layout/src/math/fragment.rs
index c5891f7d..758dd401 100644
--- a/crates/typst-layout/src/math/fragment.rs
+++ b/crates/typst-layout/src/math/fragment.rs
@@ -315,7 +315,8 @@ impl GlyphFragment {
let cluster = info.cluster as usize;
let c = text[cluster..].chars().next().unwrap();
let limits = Limits::for_char(c);
- let class = EquationElem::class_in(styles)
+ let class = styles
+ .get(EquationElem::class)
.or_else(|| default_math_class(c))
.unwrap_or(MathClass::Normal);
@@ -331,11 +332,11 @@ impl GlyphFragment {
let item = TextItem {
font: font.clone(),
- size: TextElem::size_in(styles),
- fill: TextElem::fill_in(styles).as_decoration(),
- stroke: TextElem::stroke_in(styles).map(|s| s.unwrap_or_default()),
- lang: TextElem::lang_in(styles),
- region: TextElem::region_in(styles),
+ size: styles.resolve(TextElem::size),
+ fill: styles.get_ref(TextElem::fill).as_decoration(),
+ stroke: styles.resolve(TextElem::stroke).map(|s| s.unwrap_or_default()),
+ lang: styles.get(TextElem::lang),
+ region: styles.get(TextElem::region),
text: text.into(),
glyphs: vec![glyph.clone()],
};
@@ -344,7 +345,7 @@ impl GlyphFragment {
item,
base_glyph: glyph,
// Math
- math_size: EquationElem::size_in(styles),
+ math_size: styles.get(EquationElem::size),
class,
limits,
mid_stretched: None,
@@ -356,7 +357,7 @@ impl GlyphFragment {
baseline: None,
// Misc
align: Abs::zero(),
- shift: TextElem::baseline_in(styles),
+ shift: styles.resolve(TextElem::baseline),
modifiers: FrameModifiers::get_in(styles),
};
fragment.update_glyph();
@@ -541,9 +542,9 @@ impl FrameFragment {
let accent_attach = frame.width() / 2.0;
Self {
frame: frame.modified(&FrameModifiers::get_in(styles)),
- font_size: TextElem::size_in(styles),
- class: EquationElem::class_in(styles).unwrap_or(MathClass::Normal),
- math_size: EquationElem::size_in(styles),
+ font_size: styles.resolve(TextElem::size),
+ class: styles.get(EquationElem::class).unwrap_or(MathClass::Normal),
+ math_size: styles.get(EquationElem::size),
limits: Limits::Never,
spaced: false,
base_ascent,
@@ -864,7 +865,7 @@ impl Limits {
pub fn active(&self, styles: StyleChain) -> bool {
match self {
Self::Always => true,
- Self::Display => EquationElem::size_in(styles) == MathSize::Display,
+ Self::Display => styles.get(EquationElem::size) == MathSize::Display,
Self::Never => false,
}
}
diff --git a/crates/typst-layout/src/math/lr.rs b/crates/typst-layout/src/math/lr.rs
index a3b5cb05..2348025e 100644
--- a/crates/typst-layout/src/math/lr.rs
+++ b/crates/typst-layout/src/math/lr.rs
@@ -22,7 +22,7 @@ pub fn layout_lr(
// Extract implicit LrElem.
if let Some(lr) = body.to_packed::<LrElem>() {
- if lr.size(styles).is_one() {
+ if lr.size.get(styles).is_one() {
body = &lr.body;
}
}
@@ -41,7 +41,7 @@ pub fn layout_lr(
.unwrap_or_default();
let relative_to = 2.0 * max_extent;
- let height = elem.size(styles);
+ let height = elem.size.resolve(styles);
// Scale up fragments at both ends.
match inner_fragments {
diff --git a/crates/typst-layout/src/math/mat.rs b/crates/typst-layout/src/math/mat.rs
index 278b1343..4a897a03 100644
--- a/crates/typst-layout/src/math/mat.rs
+++ b/crates/typst-layout/src/math/mat.rs
@@ -30,15 +30,15 @@ pub fn layout_vec(
ctx,
styles,
&[column],
- elem.align(styles),
+ elem.align.resolve(styles),
LeftRightAlternator::Right,
None,
- Axes::with_y(elem.gap(styles)),
+ Axes::with_y(elem.gap.resolve(styles)),
span,
"elements",
)?;
- let delim = elem.delim(styles);
+ let delim = elem.delim.get(styles);
layout_delimiters(ctx, styles, frame, delim.open(), delim.close(), span)
}
@@ -59,14 +59,17 @@ pub fn layout_cases(
FixedAlignment::Start,
LeftRightAlternator::None,
None,
- Axes::with_y(elem.gap(styles)),
+ Axes::with_y(elem.gap.resolve(styles)),
span,
"branches",
)?;
- let delim = elem.delim(styles);
- let (open, close) =
- if elem.reverse(styles) { (None, delim.close()) } else { (delim.open(), None) };
+ let delim = elem.delim.get(styles);
+ let (open, close) = if elem.reverse.get(styles) {
+ (None, delim.close())
+ } else {
+ (delim.open(), None)
+ };
layout_delimiters(ctx, styles, frame, open, close, span)
}
@@ -81,7 +84,7 @@ pub fn layout_mat(
let rows = &elem.rows;
let ncols = rows.first().map_or(0, |row| row.len());
- let augment = elem.augment(styles);
+ let augment = elem.augment.resolve(styles);
if let Some(aug) = &augment {
for &offset in &aug.hline.0 {
if offset == 0 || offset.unsigned_abs() >= rows.len() {
@@ -116,15 +119,15 @@ pub fn layout_mat(
ctx,
styles,
&columns,
- elem.align(styles),
+ elem.align.resolve(styles),
LeftRightAlternator::Right,
augment,
- Axes::new(elem.column_gap(styles), elem.row_gap(styles)),
+ Axes::new(elem.column_gap.resolve(styles), elem.row_gap.resolve(styles)),
span,
"cells",
)?;
- let delim = elem.delim(styles);
+ let delim = elem.delim.get(styles);
layout_delimiters(ctx, styles, frame, delim.open(), delim.close(), span)
}
@@ -157,7 +160,7 @@ fn layout_body(
let default_stroke_thickness = DEFAULT_STROKE_THICKNESS.resolve(styles);
let default_stroke = FixedStroke {
thickness: default_stroke_thickness,
- paint: TextElem::fill_in(styles).as_decoration(),
+ paint: styles.get_ref(TextElem::fill).as_decoration(),
cap: LineCap::Square,
..Default::default()
};
diff --git a/crates/typst-layout/src/math/mod.rs b/crates/typst-layout/src/math/mod.rs
index 5fd22e57..39083506 100644
--- a/crates/typst-layout/src/math/mod.rs
+++ b/crates/typst-layout/src/math/mod.rs
@@ -51,7 +51,7 @@ pub fn layout_equation_inline(
styles: StyleChain,
region: Size,
) -> SourceResult<Vec<InlineItem>> {
- assert!(!elem.block(styles));
+ assert!(!elem.block.get(styles));
let font = find_math_font(engine, styles, elem.span())?;
@@ -78,12 +78,12 @@ pub fn layout_equation_inline(
for item in &mut items {
let InlineItem::Frame(frame) = item else { continue };
- let slack = ParElem::leading_in(styles) * 0.7;
+ let slack = styles.resolve(ParElem::leading) * 0.7;
let (t, b) = font.edges(
- TextElem::top_edge_in(styles),
- TextElem::bottom_edge_in(styles),
- TextElem::size_in(styles),
+ styles.get(TextElem::top_edge),
+ styles.get(TextElem::bottom_edge),
+ styles.resolve(TextElem::size),
TextEdgeBounds::Frame(frame),
);
@@ -105,7 +105,7 @@ pub fn layout_equation_block(
styles: StyleChain,
regions: Regions,
) -> SourceResult<Fragment> {
- assert!(elem.block(styles));
+ assert!(elem.block.get(styles));
let span = elem.span();
let font = find_math_font(engine, styles, span)?;
@@ -121,7 +121,7 @@ pub fn layout_equation_block(
.multiline_frame_builder(styles);
let width = full_equation_builder.size.x;
- let equation_builders = if BlockElem::breakable_in(styles) {
+ let equation_builders = if styles.get(BlockElem::breakable) {
let mut rows = full_equation_builder.frames.into_iter().peekable();
let mut equation_builders = vec![];
let mut last_first_pos = Point::zero();
@@ -188,7 +188,7 @@ pub fn layout_equation_block(
vec![full_equation_builder]
};
- let Some(numbering) = (**elem).numbering(styles) else {
+ let Some(numbering) = elem.numbering.get_ref(styles) else {
let frames = equation_builders
.into_iter()
.map(MathRunFrameBuilder::build)
@@ -197,7 +197,7 @@ pub fn layout_equation_block(
};
let pod = Region::new(regions.base(), Axes::splat(false));
- let counter = Counter::of(EquationElem::elem())
+ let counter = Counter::of(EquationElem::ELEM)
.display_at_loc(engine, elem.location().unwrap(), styles, numbering)?
.spanned(span);
let number = crate::layout_frame(engine, &counter, locator.next(&()), styles, pod)?;
@@ -205,7 +205,7 @@ pub fn layout_equation_block(
static NUMBER_GUTTER: Em = Em::new(0.5);
let full_number_width = number.width() + NUMBER_GUTTER.resolve(styles);
- let number_align = match elem.number_align(styles) {
+ let number_align = match elem.number_align.get(styles) {
SpecificAlignment::H(h) => SpecificAlignment::Both(h, VAlignment::Horizon),
SpecificAlignment::V(v) => SpecificAlignment::Both(OuterHAlignment::End, v),
SpecificAlignment::Both(h, v) => SpecificAlignment::Both(h, v),
@@ -224,7 +224,7 @@ pub fn layout_equation_block(
builder,
number.clone(),
number_align.resolve(styles),
- AlignElem::alignment_in(styles).resolve(styles).x,
+ styles.get(AlignElem::alignment).resolve(styles).x,
regions.size.x,
full_number_width,
)
@@ -472,7 +472,9 @@ impl<'a, 'v, 'e> MathContext<'a, 'v, 'e> {
let outer = styles;
for (elem, styles) in pairs {
// Hack because the font is fixed in math.
- if styles != outer && TextElem::font_in(styles) != TextElem::font_in(outer) {
+ if styles != outer
+ && styles.get_ref(TextElem::font) != outer.get_ref(TextElem::font)
+ {
let frame = layout_external(elem, self, styles)?;
self.push(FrameFragment::new(styles, frame).with_spaced(true));
continue;
@@ -603,7 +605,10 @@ fn layout_h(
) -> SourceResult<()> {
if let Spacing::Rel(rel) = elem.amount {
if rel.rel.is_zero() {
- ctx.push(MathFragment::Spacing(rel.abs.resolve(styles), elem.weak(styles)));
+ ctx.push(MathFragment::Spacing(
+ rel.abs.resolve(styles),
+ elem.weak.get(styles),
+ ));
}
}
Ok(())
@@ -616,7 +621,7 @@ fn layout_class(
ctx: &mut MathContext,
styles: StyleChain,
) -> SourceResult<()> {
- let style = EquationElem::set_class(Some(elem.class)).wrap();
+ let style = EquationElem::class.set(Some(elem.class)).wrap();
let mut fragment = ctx.layout_into_fragment(&elem.body, styles.chain(&style))?;
fragment.set_class(elem.class);
fragment.set_limits(Limits::for_class(elem.class));
@@ -642,7 +647,7 @@ fn layout_op(
.with_italics_correction(italics)
.with_accent_attach(accent_attach)
.with_text_like(text_like)
- .with_limits(if elem.limits(styles) {
+ .with_limits(if elem.limits.get(styles) {
Limits::Display
} else {
Limits::Never
diff --git a/crates/typst-layout/src/math/root.rs b/crates/typst-layout/src/math/root.rs
index 91b9b16a..30948e08 100644
--- a/crates/typst-layout/src/math/root.rs
+++ b/crates/typst-layout/src/math/root.rs
@@ -17,7 +17,7 @@ pub fn layout_root(
ctx: &mut MathContext,
styles: StyleChain,
) -> SourceResult<()> {
- let index = elem.index(styles);
+ let index = elem.index.get_ref(styles);
let span = elem.span();
let gap = scaled!(
@@ -54,7 +54,7 @@ pub fn layout_root(
let sqrt = sqrt.into_frame();
// Layout the index.
- let sscript = EquationElem::set_size(MathSize::ScriptScript).wrap();
+ let sscript = EquationElem::size.set(MathSize::ScriptScript).wrap();
let index = index
.as_ref()
.map(|elem| ctx.layout_into_frame(elem, styles.chain(&sscript)))
@@ -112,7 +112,7 @@ pub fn layout_root(
FrameItem::Shape(
Geometry::Line(Point::with_x(radicand.width())).stroked(
FixedStroke::from_pair(
- TextElem::fill_in(styles).as_decoration(),
+ styles.get_ref(TextElem::fill).as_decoration(),
thickness,
),
),
diff --git a/crates/typst-layout/src/math/run.rs b/crates/typst-layout/src/math/run.rs
index 4ec76c25..161fa106 100644
--- a/crates/typst-layout/src/math/run.rs
+++ b/crates/typst-layout/src/math/run.rs
@@ -194,13 +194,13 @@ impl MathRun {
let row_count = rows.len();
let alignments = alignments(&rows);
- let leading = if EquationElem::size_in(styles) >= MathSize::Text {
- ParElem::leading_in(styles)
+ let leading = if styles.get(EquationElem::size) >= MathSize::Text {
+ styles.resolve(ParElem::leading)
} else {
TIGHT_LEADING.resolve(styles)
};
- let align = AlignElem::alignment_in(styles).resolve(styles).x;
+ let align = styles.resolve(AlignElem::alignment).x;
let mut frames: Vec<(Frame, Point)> = vec![];
let mut size = Size::zero();
for (i, row) in rows.into_iter().enumerate() {
diff --git a/crates/typst-layout/src/math/shared.rs b/crates/typst-layout/src/math/shared.rs
index 1f88d2dd..c9d20aa6 100644
--- a/crates/typst-layout/src/math/shared.rs
+++ b/crates/typst-layout/src/math/shared.rs
@@ -10,7 +10,7 @@ use super::{LeftRightAlternator, MathContext, MathFragment, MathRun};
macro_rules! scaled {
($ctx:expr, $styles:expr, text: $text:ident, display: $display:ident $(,)?) => {
- match typst_library::math::EquationElem::size_in($styles) {
+ match $styles.get(typst_library::math::EquationElem::size) {
typst_library::math::MathSize::Display => scaled!($ctx, $styles, $display),
_ => scaled!($ctx, $styles, $text),
}
@@ -19,7 +19,7 @@ macro_rules! scaled {
$crate::math::Scaled::scaled(
$ctx.constants.$name(),
$ctx,
- typst_library::text::TextElem::size_in($styles),
+ $styles.resolve(typst_library::text::TextElem::size),
)
};
}
@@ -58,55 +58,62 @@ impl Scaled for MathValue<'_> {
/// Styles something as cramped.
pub fn style_cramped() -> LazyHash<Style> {
- EquationElem::set_cramped(true).wrap()
+ EquationElem::cramped.set(true).wrap()
}
/// Sets flac OpenType feature.
pub fn style_flac() -> LazyHash<Style> {
- TextElem::set_features(FontFeatures(vec![(Tag::from_bytes(b"flac"), 1)])).wrap()
+ TextElem::features
+ .set(FontFeatures(vec![(Tag::from_bytes(b"flac"), 1)]))
+ .wrap()
}
/// Sets dtls OpenType feature.
pub fn style_dtls() -> LazyHash<Style> {
- TextElem::set_features(FontFeatures(vec![(Tag::from_bytes(b"dtls"), 1)])).wrap()
+ TextElem::features
+ .set(FontFeatures(vec![(Tag::from_bytes(b"dtls"), 1)]))
+ .wrap()
}
/// The style for subscripts in the current style.
pub fn style_for_subscript(styles: StyleChain) -> [LazyHash<Style>; 2] {
- [style_for_superscript(styles), EquationElem::set_cramped(true).wrap()]
+ [style_for_superscript(styles), EquationElem::cramped.set(true).wrap()]
}
/// The style for superscripts in the current style.
pub fn style_for_superscript(styles: StyleChain) -> LazyHash<Style> {
- EquationElem::set_size(match EquationElem::size_in(styles) {
- MathSize::Display | MathSize::Text => MathSize::Script,
- MathSize::Script | MathSize::ScriptScript => MathSize::ScriptScript,
- })
- .wrap()
+ EquationElem::size
+ .set(match styles.get(EquationElem::size) {
+ MathSize::Display | MathSize::Text => MathSize::Script,
+ MathSize::Script | MathSize::ScriptScript => MathSize::ScriptScript,
+ })
+ .wrap()
}
/// The style for numerators in the current style.
pub fn style_for_numerator(styles: StyleChain) -> LazyHash<Style> {
- EquationElem::set_size(match EquationElem::size_in(styles) {
- MathSize::Display => MathSize::Text,
- MathSize::Text => MathSize::Script,
- MathSize::Script | MathSize::ScriptScript => MathSize::ScriptScript,
- })
- .wrap()
+ EquationElem::size
+ .set(match styles.get(EquationElem::size) {
+ MathSize::Display => MathSize::Text,
+ MathSize::Text => MathSize::Script,
+ MathSize::Script | MathSize::ScriptScript => MathSize::ScriptScript,
+ })
+ .wrap()
}
/// The style for denominators in the current style.
pub fn style_for_denominator(styles: StyleChain) -> [LazyHash<Style>; 2] {
- [style_for_numerator(styles), EquationElem::set_cramped(true).wrap()]
+ [style_for_numerator(styles), EquationElem::cramped.set(true).wrap()]
}
/// Styles to add font constants to the style chain.
pub fn style_for_script_scale(ctx: &MathContext) -> LazyHash<Style> {
- EquationElem::set_script_scale((
- ctx.constants.script_percent_scale_down(),
- ctx.constants.script_script_percent_scale_down(),
- ))
- .wrap()
+ EquationElem::script_scale
+ .set((
+ ctx.constants.script_percent_scale_down(),
+ ctx.constants.script_script_percent_scale_down(),
+ ))
+ .wrap()
}
/// Stack rows on top of each other.
diff --git a/crates/typst-layout/src/math/stretch.rs b/crates/typst-layout/src/math/stretch.rs
index d4370e7b..f1a22a81 100644
--- a/crates/typst-layout/src/math/stretch.rs
+++ b/crates/typst-layout/src/math/stretch.rs
@@ -14,7 +14,14 @@ pub fn layout_stretch(
styles: StyleChain,
) -> SourceResult<()> {
let mut fragment = ctx.layout_into_fragment(&elem.body, styles)?;
- stretch_fragment(ctx, &mut fragment, None, None, elem.size(styles), Abs::zero());
+ stretch_fragment(
+ ctx,
+ &mut fragment,
+ None,
+ None,
+ elem.size.resolve(styles),
+ Abs::zero(),
+ );
ctx.push(fragment);
Ok(())
}
diff --git a/crates/typst-layout/src/math/text.rs b/crates/typst-layout/src/math/text.rs
index 67dc0a2c..53f88f2b 100644
--- a/crates/typst-layout/src/math/text.rs
+++ b/crates/typst-layout/src/math/text.rs
@@ -77,8 +77,8 @@ fn layout_inline_text(
Ok(FrameFragment::new(styles, frame).with_text_like(true))
} else {
let local = [
- TextElem::set_top_edge(TopEdge::Metric(TopEdgeMetric::Bounds)),
- TextElem::set_bottom_edge(BottomEdge::Metric(BottomEdgeMetric::Bounds)),
+ TextElem::top_edge.set(TopEdge::Metric(TopEdgeMetric::Bounds)),
+ TextElem::bottom_edge.set(BottomEdge::Metric(BottomEdgeMetric::Bounds)),
]
.map(|p| p.wrap());
@@ -150,7 +150,7 @@ fn adjust_glyph_layout(
styles: StyleChain,
) {
if glyph.class == MathClass::Large {
- if EquationElem::size_in(styles) == MathSize::Display {
+ if styles.get(EquationElem::size) == MathSize::Display {
let height = scaled!(ctx, styles, display_operator_min_height)
.max(SQRT_2 * glyph.size.y);
glyph.stretch_vertical(ctx, height);
@@ -169,9 +169,9 @@ fn adjust_glyph_layout(
fn styled_char(styles: StyleChain, c: char, auto_italic: bool) -> char {
use MathVariant::*;
- let variant = EquationElem::variant_in(styles);
- let bold = EquationElem::bold_in(styles);
- let italic = EquationElem::italic_in(styles).unwrap_or(
+ let variant = styles.get(EquationElem::variant);
+ let bold = styles.get(EquationElem::bold);
+ let italic = styles.get(EquationElem::italic).unwrap_or(
auto_italic
&& matches!(
c,
diff --git a/crates/typst-layout/src/math/underover.rs b/crates/typst-layout/src/math/underover.rs
index c29d9947..1e1aeb41 100644
--- a/crates/typst-layout/src/math/underover.rs
+++ b/crates/typst-layout/src/math/underover.rs
@@ -56,7 +56,7 @@ pub fn layout_underbrace(
ctx,
styles,
&elem.body,
- &elem.annotation(styles),
+ elem.annotation.get_ref(styles),
'⏟',
BRACE_GAP,
Position::Under,
@@ -75,7 +75,7 @@ pub fn layout_overbrace(
ctx,
styles,
&elem.body,
- &elem.annotation(styles),
+ elem.annotation.get_ref(styles),
'⏞',
BRACE_GAP,
Position::Over,
@@ -94,7 +94,7 @@ pub fn layout_underbracket(
ctx,
styles,
&elem.body,
- &elem.annotation(styles),
+ elem.annotation.get_ref(styles),
'⎵',
BRACKET_GAP,
Position::Under,
@@ -113,7 +113,7 @@ pub fn layout_overbracket(
ctx,
styles,
&elem.body,
- &elem.annotation(styles),
+ elem.annotation.get_ref(styles),
'⎴',
BRACKET_GAP,
Position::Over,
@@ -132,7 +132,7 @@ pub fn layout_underparen(
ctx,
styles,
&elem.body,
- &elem.annotation(styles),
+ elem.annotation.get_ref(styles),
'⏝',
PAREN_GAP,
Position::Under,
@@ -151,7 +151,7 @@ pub fn layout_overparen(
ctx,
styles,
&elem.body,
- &elem.annotation(styles),
+ elem.annotation.get_ref(styles),
'⏜',
PAREN_GAP,
Position::Over,
@@ -170,7 +170,7 @@ pub fn layout_undershell(
ctx,
styles,
&elem.body,
- &elem.annotation(styles),
+ elem.annotation.get_ref(styles),
'⏡',
SHELL_GAP,
Position::Under,
@@ -189,7 +189,7 @@ pub fn layout_overshell(
ctx,
styles,
&elem.body,
- &elem.annotation(styles),
+ elem.annotation.get_ref(styles),
'⏠',
SHELL_GAP,
Position::Over,
@@ -251,7 +251,7 @@ fn layout_underoverline(
line_pos,
FrameItem::Shape(
Geometry::Line(Point::with_x(line_width)).stroked(FixedStroke {
- paint: TextElem::fill_in(styles).as_decoration(),
+ paint: styles.get_ref(TextElem::fill).as_decoration(),
thickness: bar_height,
..FixedStroke::default()
}),