From cd089b6194c57b2e8dff70efaa7cbd53035f7327 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Fri, 9 Dec 2022 10:21:11 +0100 Subject: [PATCH] Align set rule --- library/src/layout/align.rs | 66 ++++++------------------------- library/src/layout/flow.rs | 14 +------ library/src/layout/mod.rs | 4 +- library/src/layout/par.rs | 6 +-- library/src/layout/place.rs | 8 ++-- library/src/layout/stack.rs | 22 ++++------- library/src/lib.rs | 2 +- library/src/math/mod.rs | 8 ++-- library/src/shared/ext.rs | 2 +- src/geom/corners.rs | 15 +++---- src/geom/sides.rs | 15 +++---- src/model/eval.rs | 6 +-- src/model/library.rs | 6 +-- src/model/styles.rs | 18 ++++++--- src/syntax/ast.rs | 14 +++---- src/syntax/highlight.rs | 2 +- src/syntax/kind.rs | 8 ++-- src/syntax/parsing.rs | 2 +- tests/ref/compiler/construct.png | Bin 6024 -> 6043 bytes tests/ref/layout/stack-1.png | Bin 1522 -> 1524 bytes tests/typ/compiler/construct.typ | 6 +-- tests/typ/layout/par.typ | 10 +---- tests/typ/layout/repeat.typ | 2 +- tests/typ/layout/spacing.typ | 2 +- tests/typ/math/style.typ | 2 +- tests/typ/text/microtype.typ | 2 +- tests/typ/visualize/line.typ | 2 +- 27 files changed, 90 insertions(+), 154 deletions(-) diff --git a/library/src/layout/align.rs b/library/src/layout/align.rs index ae60b4c6a..506ef6846 100644 --- a/library/src/layout/align.rs +++ b/library/src/layout/align.rs @@ -1,62 +1,22 @@ -use super::{HorizontalAlign, ParNode}; use crate::prelude::*; -/// Align content along the layouting axes. +/// Just an empty shell to scope styles. #[derive(Debug, Hash)] -pub struct AlignNode { - /// How to align the content horizontally and vertically. - pub aligns: Axes>, - /// The content to be aligned. - pub body: Content, -} +pub enum AlignNode {} -#[node(Layout)] +#[node] impl AlignNode { + /// The alignment. + #[property(fold, skip)] + pub const ALIGNS: Axes> = + Axes::new(GenAlign::Start, GenAlign::Specific(Align::Top)); + fn construct(_: &Vm, args: &mut Args) -> SourceResult { + args.expect("body") + } + + fn set(...) { let aligns: Axes> = args.find()?.unwrap_or_default(); - let body: Content = args.expect("body")?; - - if let Axes { x: Some(x), y: None } = aligns { - if !body.has::() || body.has::() { - return Ok(body.styled(ParNode::ALIGN, HorizontalAlign(x))); - } - } - - Ok(Self { aligns, body }.pack()) - } -} - -impl Layout for AlignNode { - fn layout( - &self, - vt: &mut Vt, - styles: StyleChain, - regions: Regions, - ) -> SourceResult { - // The child only needs to expand along an axis if there's no alignment. - let mut pod = regions.clone(); - pod.expand &= self.aligns.as_ref().map(Option::is_none); - - // Align paragraphs inside the child. - let mut map = StyleMap::new(); - if let Some(align) = self.aligns.x { - map.set(ParNode::ALIGN, HorizontalAlign(align)); - } - - // Layout the child. - let mut fragment = self.body.layout(vt, styles.chain(&map), pod)?; - for (region, frame) in regions.iter().zip(&mut fragment) { - // Align in the target size. The target size depends on whether we - // should expand. - let target = regions.expand.select(region, frame.size()); - let aligns = self - .aligns - .map(|align| align.resolve(styles)) - .unwrap_or(Axes::new(Align::Left, Align::Top)); - - frame.resize(target, aligns); - } - - Ok(fragment) + styles.set(Self::ALIGNS, aligns); } } diff --git a/library/src/layout/flow.rs b/library/src/layout/flow.rs index 0b6454a07..b78f3932d 100644 --- a/library/src/layout/flow.rs +++ b/library/src/layout/flow.rs @@ -125,7 +125,7 @@ impl<'a> FlowLayouter<'a> { par: &ParNode, styles: StyleChain, ) -> SourceResult<()> { - let aligns = Axes::new(styles.get(ParNode::ALIGN), Align::Top); + let aligns = styles.get(AlignNode::ALIGNS).resolve(styles); let leading = styles.get(ParNode::LEADING); let consecutive = self.last_was_par; let fragment = par.layout( @@ -172,17 +172,7 @@ impl<'a> FlowLayouter<'a> { } // How to align the block. - let aligns = Axes::new( - // For non-expanding paragraphs it is crucial that we align the - // whole paragraph as it is itself aligned. - styles.get(ParNode::ALIGN), - // Vertical align node alignment is respected by the flow. - block - .to::() - .and_then(|aligned| aligned.aligns.y) - .map(|align| align.resolve(styles)) - .unwrap_or(Align::Top), - ); + let aligns = styles.get(AlignNode::ALIGNS).resolve(styles); // Layout the block itself. let sticky = styles.get(BlockNode::STICKY); diff --git a/library/src/layout/mod.rs b/library/src/layout/mod.rs index 00b1f9bec..afa1344fe 100644 --- a/library/src/layout/mod.rs +++ b/library/src/layout/mod.rs @@ -412,7 +412,9 @@ impl<'a, 'v, 't> Builder<'a, 'v, 't> { bail!(span, "not allowed here"); } self.interrupt_page(styles)?; - } else if map.interruption::().is_some() { + } else if map.interruption::().is_some() + || map.interruption::().is_some() + { self.interrupt_par()?; } else if map.interruption::().is_some() || map.interruption::().is_some() diff --git a/library/src/layout/par.rs b/library/src/layout/par.rs index c0e7c6c90..d93bfba73 100644 --- a/library/src/layout/par.rs +++ b/library/src/layout/par.rs @@ -5,6 +5,7 @@ use xi_unicode::LineBreakIterator; use typst::model::Key; use super::{HNode, RepeatNode, Spacing}; +use crate::layout::AlignNode; use crate::prelude::*; use crate::text::{ shape, LinebreakNode, Quoter, Quotes, ShapedText, SmartQuoteNode, SpaceNode, TextNode, @@ -22,9 +23,6 @@ impl ParNode { /// The spacing between lines. #[property(resolve)] pub const LEADING: Length = Em::new(0.65).into(); - /// How to align text and inline objects in their line. - #[property(resolve)] - pub const ALIGN: HorizontalAlign = HorizontalAlign(GenAlign::Start); /// Whether to justify text in its line. pub const JUSTIFY: bool = false; /// How to determine line breaks. @@ -554,7 +552,7 @@ fn prepare<'a>( styles, hyphenate: shared_get(styles, &par.0, TextNode::HYPHENATE), lang: shared_get(styles, &par.0, TextNode::LANG), - align: styles.get(ParNode::ALIGN), + align: styles.get(AlignNode::ALIGNS).x.resolve(styles), justify: styles.get(ParNode::JUSTIFY), }) } diff --git a/library/src/layout/place.rs b/library/src/layout/place.rs index 2e2c81a1d..28d231b73 100644 --- a/library/src/layout/place.rs +++ b/library/src/layout/place.rs @@ -1,9 +1,8 @@ -use super::AlignNode; use crate::prelude::*; /// Place content at an absolute position. #[derive(Debug, Hash)] -pub struct PlaceNode(pub Content); +pub struct PlaceNode(pub Content, bool); #[node(Layout, Behave)] impl PlaceNode { @@ -12,7 +11,8 @@ impl PlaceNode { let dx = args.named("dx")?.unwrap_or_default(); let dy = args.named("dy")?.unwrap_or_default(); let body = args.expect::("body")?; - Ok(Self(body.moved(Axes::new(dx, dy)).aligned(aligns)).pack()) + let out_of_flow = aligns.y.is_some(); + Ok(Self(body.moved(Axes::new(dx, dy)).aligned(aligns), out_of_flow).pack()) } } @@ -49,7 +49,7 @@ impl PlaceNode { /// origin. Instead of relative to the parent's current flow/cursor /// position. pub fn out_of_flow(&self) -> bool { - self.0.to::().map_or(false, |node| node.aligns.y.is_some()) + self.1 } } diff --git a/library/src/layout/stack.rs b/library/src/layout/stack.rs index 6432f4acc..d44dcb482 100644 --- a/library/src/layout/stack.rs +++ b/library/src/layout/stack.rs @@ -1,6 +1,6 @@ use typst::model::StyledNode; -use super::{AlignNode, ParNode, Spacing}; +use super::{AlignNode, Spacing}; use crate::prelude::*; /// Arrange content and spacing along an axis. @@ -180,21 +180,13 @@ impl<'a> StackLayouter<'a> { // Block-axis alignment of the `AlignNode` is respected // by the stack node. - let align = block - .to::() - .and_then(|node| node.aligns.get(self.axis)) - .map(|align| align.resolve(styles)) - .unwrap_or_else(|| { - if let Some(styled) = block.to::() { - let map = &styled.map; - if map.contains(ParNode::ALIGN) { - return StyleChain::new(map).get(ParNode::ALIGN); - } - } - - self.dir.start().into() - }); + let aligns = if let Some(styled) = block.to::() { + styles.chain(&styled.map).get(AlignNode::ALIGNS) + } else { + styles.get(AlignNode::ALIGNS) + }; + let align = aligns.get(self.axis).resolve(styles); let fragment = block.layout(vt, styles, self.regions)?; let len = fragment.len(); for (i, frame) in fragment.into_iter().enumerate() { diff --git a/library/src/lib.rs b/library/src/lib.rs index e41e7c0d9..86bef0b94 100644 --- a/library/src/lib.rs +++ b/library/src/lib.rs @@ -208,6 +208,6 @@ fn items() -> LangItems { math_atom: |atom| math::AtomNode(atom).pack(), math_script: |base, sub, sup| math::ScriptNode { base, sub, sup }.pack(), math_frac: |num, denom| math::FracNode { num, denom }.pack(), - math_align: |count| math::AlignNode(count).pack(), + math_align_point: |count| math::AlignPointNode(count).pack(), } } diff --git a/library/src/math/mod.rs b/library/src/math/mod.rs index 1139296cf..62432b128 100644 --- a/library/src/math/mod.rs +++ b/library/src/math/mod.rs @@ -442,14 +442,14 @@ impl Texify for ScriptNode { } } -/// A math alignment indicator: `&`, `&&`. +/// A math alignment point: `&`, `&&`. #[derive(Debug, Hash)] -pub struct AlignNode(pub usize); +pub struct AlignPointNode(pub usize); #[node(Texify)] -impl AlignNode {} +impl AlignPointNode {} -impl Texify for AlignNode { +impl Texify for AlignPointNode { fn texify(&self, _: &mut Texifier) -> SourceResult<()> { Ok(()) } diff --git a/library/src/shared/ext.rs b/library/src/shared/ext.rs index 811ae7573..23db71f91 100644 --- a/library/src/shared/ext.rs +++ b/library/src/shared/ext.rs @@ -57,7 +57,7 @@ impl ContentExt for Content { } fn aligned(self, aligns: Axes>) -> Self { - crate::layout::AlignNode { aligns, body: self }.pack() + self.styled(crate::layout::AlignNode::ALIGNS, aligns) } fn padded(self, padding: Sides>) -> Self { diff --git a/src/geom/corners.rs b/src/geom/corners.rs index d84160ccd..386acbfb2 100644 --- a/src/geom/corners.rs +++ b/src/geom/corners.rs @@ -45,16 +45,13 @@ impl Corners { } } - /// Zip two instances into an instance. - pub fn zip(self, other: Corners, mut f: F) -> Corners - where - F: FnMut(T, V) -> W, - { + /// Zip two instances into one. + pub fn zip(self, other: Corners) -> Corners<(T, U)> { Corners { - top_left: f(self.top_left, other.top_left), - top_right: f(self.top_right, other.top_right), - bottom_right: f(self.bottom_right, other.bottom_right), - bottom_left: f(self.bottom_left, other.bottom_left), + top_left: (self.top_left, other.top_left), + top_right: (self.top_right, other.top_right), + bottom_right: (self.bottom_right, other.bottom_right), + bottom_left: (self.bottom_left, other.bottom_left), } } diff --git a/src/geom/sides.rs b/src/geom/sides.rs index 9b8d9a6b7..40327a425 100644 --- a/src/geom/sides.rs +++ b/src/geom/sides.rs @@ -45,16 +45,13 @@ impl Sides { } } - /// Zip two instances into an instance. - pub fn zip(self, other: Sides, mut f: F) -> Sides - where - F: FnMut(T, V) -> W, - { + /// Zip two instances into one. + pub fn zip(self, other: Sides) -> Sides<(T, U)> { Sides { - left: f(self.left, other.left), - top: f(self.top, other.top), - right: f(self.right, other.right), - bottom: f(self.bottom, other.bottom), + left: (self.left, other.left), + top: (self.top, other.top), + right: (self.right, other.right), + bottom: (self.bottom, other.bottom), } } diff --git a/src/model/eval.rs b/src/model/eval.rs index 0ae8a0b1d..53a393c33 100644 --- a/src/model/eval.rs +++ b/src/model/eval.rs @@ -429,7 +429,7 @@ impl Eval for ast::MathNode { Self::Symbol(v) => (vm.items.symbol)(v.get().clone() + ":op".into()), Self::Script(v) => v.eval(vm)?, Self::Frac(v) => v.eval(vm)?, - Self::Align(v) => v.eval(vm)?, + Self::AlignPoint(v) => v.eval(vm)?, Self::Group(v) => v.eval(vm)?, Self::Expr(v) => { if let ast::Expr::Ident(ident) = v { @@ -480,11 +480,11 @@ impl Eval for ast::Frac { } } -impl Eval for ast::Align { +impl Eval for ast::AlignPoint { type Output = Content; fn eval(&self, vm: &mut Vm) -> SourceResult { - Ok((vm.items.math_align)(self.count())) + Ok((vm.items.math_align_point)(self.count())) } } diff --git a/src/model/library.rs b/src/model/library.rs index 63bd58399..02eb9179c 100644 --- a/src/model/library.rs +++ b/src/model/library.rs @@ -74,8 +74,8 @@ pub struct LangItems { fn(base: Content, sub: Option, sup: Option) -> Content, /// A fraction in a formula: `x/2`. pub math_frac: fn(num: Content, denom: Content) -> Content, - /// An alignment indicator in a formula: `&`, `&&`. - pub math_align: fn(count: usize) -> Content, + /// An alignment point in a formula: `&`, `&&`. + pub math_align_point: fn(count: usize) -> Content, } impl Debug for LangItems { @@ -107,7 +107,7 @@ impl Hash for LangItems { self.math_atom.hash(state); self.math_script.hash(state); self.math_frac.hash(state); - self.math_align.hash(state); + self.math_align_point.hash(state); } } diff --git a/src/model/styles.rs b/src/model/styles.rs index 37596b8d0..b2c328fa7 100644 --- a/src/model/styles.rs +++ b/src/model/styles.rs @@ -913,6 +913,14 @@ where } } +impl Fold for Axes> { + type Output = Axes; + + fn fold(self, outer: Self::Output) -> Self::Output { + self.zip(outer).map(|(inner, outer)| inner.unwrap_or(outer)) + } +} + impl Fold for Sides where T: Fold, @@ -920,7 +928,7 @@ where type Output = Sides; fn fold(self, outer: Self::Output) -> Self::Output { - self.zip(outer, |inner, outer| inner.fold(outer)) + self.zip(outer).map(|(inner, outer)| inner.fold(outer)) } } @@ -928,7 +936,7 @@ impl Fold for Sides>> { type Output = Sides>; fn fold(self, outer: Self::Output) -> Self::Output { - self.zip(outer, |inner, outer| inner.unwrap_or(outer)) + self.zip(outer).map(|(inner, outer)| inner.unwrap_or(outer)) } } @@ -936,7 +944,7 @@ impl Fold for Sides>>> { type Output = Sides>>; fn fold(self, outer: Self::Output) -> Self::Output { - self.zip(outer, |inner, outer| inner.unwrap_or(outer)) + self.zip(outer).map(|(inner, outer)| inner.unwrap_or(outer)) } } @@ -947,7 +955,7 @@ where type Output = Corners; fn fold(self, outer: Self::Output) -> Self::Output { - self.zip(outer, |inner, outer| inner.fold(outer)) + self.zip(outer).map(|(inner, outer)| inner.fold(outer)) } } @@ -955,7 +963,7 @@ impl Fold for Corners>> { type Output = Corners>; fn fold(self, outer: Self::Output) -> Self::Output { - self.zip(outer, |inner, outer| inner.unwrap_or(outer)) + self.zip(outer).map(|(inner, outer)| inner.unwrap_or(outer)) } } diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs index 3661c156f..4db005930 100644 --- a/src/syntax/ast.rs +++ b/src/syntax/ast.rs @@ -453,8 +453,8 @@ pub enum MathNode { Script(Script), /// A fraction: `x/2`. Frac(Frac), - /// An alignment indicator: `&`, `&&`. - Align(Align), + /// An alignment point: `&`, `&&`. + AlignPoint(AlignPoint), /// Grouped mathematical material. Group(Math), /// An expression. @@ -472,7 +472,7 @@ impl AstNode for MathNode { SyntaxKind::Symbol(_) => node.cast().map(Self::Symbol), SyntaxKind::Script => node.cast().map(Self::Script), SyntaxKind::Frac => node.cast().map(Self::Frac), - SyntaxKind::Align => node.cast().map(Self::Align), + SyntaxKind::AlignPoint => node.cast().map(Self::AlignPoint), SyntaxKind::Math => node.cast().map(Self::Group), _ => node.cast().map(Self::Expr), } @@ -488,7 +488,7 @@ impl AstNode for MathNode { Self::Symbol(v) => v.as_untyped(), Self::Script(v) => v.as_untyped(), Self::Frac(v) => v.as_untyped(), - Self::Align(v) => v.as_untyped(), + Self::AlignPoint(v) => v.as_untyped(), Self::Group(v) => v.as_untyped(), Self::Expr(v) => v.as_untyped(), } @@ -558,11 +558,11 @@ impl Frac { } node! { - /// An alignment indicator in a formula: `&`, `&&`. - Align + /// An alignment point in a formula: `&`, `&&`. + AlignPoint } -impl Align { +impl AlignPoint { /// The number of ampersands. pub fn count(&self) -> usize { self.0.children().filter(|n| n.kind() == &SyntaxKind::Amp).count() diff --git a/src/syntax/highlight.rs b/src/syntax/highlight.rs index 3fed905fb..f9f359442 100644 --- a/src/syntax/highlight.rs +++ b/src/syntax/highlight.rs @@ -302,7 +302,7 @@ impl Category { SyntaxKind::Atom(_) => None, SyntaxKind::Script => None, SyntaxKind::Frac => None, - SyntaxKind::Align => None, + SyntaxKind::AlignPoint => None, SyntaxKind::Ident(_) => match parent.kind() { SyntaxKind::Markup { .. } diff --git a/src/syntax/kind.rs b/src/syntax/kind.rs index a4eb317b6..d5fda7f8a 100644 --- a/src/syntax/kind.rs +++ b/src/syntax/kind.rs @@ -179,8 +179,8 @@ pub enum SyntaxKind { Script, /// A fraction in a formula: `x/2`. Frac, - /// An alignment indicator in a formula: `&`, `&&`. - Align, + /// An alignment point in a formula: `&`, `&&`. + AlignPoint, /// An identifier: `it`. Ident(EcoString), @@ -408,7 +408,7 @@ impl SyntaxKind { Self::Atom(_) => "math atom", Self::Script => "script", Self::Frac => "fraction", - Self::Align => "alignment indicator", + Self::AlignPoint => "alignment point", Self::Ident(_) => "identifier", Self::Bool(_) => "boolean", Self::Int(_) => "integer", @@ -528,7 +528,7 @@ impl Hash for SyntaxKind { Self::Atom(c) => c.hash(state), Self::Script => {} Self::Frac => {} - Self::Align => {} + Self::AlignPoint => {} Self::Ident(v) => v.hash(state), Self::Bool(v) => v.hash(state), Self::Int(v) => v.hash(state), diff --git a/src/syntax/parsing.rs b/src/syntax/parsing.rs index 97570950a..d751b6aab 100644 --- a/src/syntax/parsing.rs +++ b/src/syntax/parsing.rs @@ -499,7 +499,7 @@ fn math_group(p: &mut Parser, group: Group) { } fn math_align(p: &mut Parser) { - p.perform(SyntaxKind::Align, |p| { + p.perform(SyntaxKind::AlignPoint, |p| { p.assert(SyntaxKind::Amp); while p.eat_if(SyntaxKind::Amp) {} }) diff --git a/tests/ref/compiler/construct.png b/tests/ref/compiler/construct.png index 43cf5d79661e35ddf10e56cef6ca1eac5d4a8c24..829b072b51dcdbf77c367116a134002d598b61c3 100644 GIT binary patch literal 6043 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 diff --git a/tests/ref/layout/stack-1.png b/tests/ref/layout/stack-1.png index 167fd84cf591ef1c458782f1abc09c9cd477a48c..54ee1a08bfef3b02503ab3b6ccac639c6b87680c 100644 GIT binary patch delta 936 zcmeyw{e^o&G*f+xr;B4q#jUq@en#^YG93SypSv_vBx=&49H+j3ys4@x?oYg)s;vkhw|C1U!FU?=ejAS>DV?$$O<{r$Rv z-|p6$$m?6wF70#Sx)XVU-&~^iWaV1xEw{w#IK@NLQx8;?=h?q0vzq(vR>j(Fo4B3U z{F6{i?tdG-r>)AXvUo|=%yoNBw6k-|xAEMFdQ{t!d{?{v%IRslbIfMHy__mpa8o(e za-q>NX8$t%VExs5R_U1EP*y!q82hZiaNV-ZEe6+Lmh3uGESns<`;h(m@UV&BdX3W7 zvF6Y9?Nh%z#eDjtYe!$js-0gKc7K9Vc>9u+<=@WDbz6LKhQN}GsU9z)`~4qn;o#x1 zSyK@4vN%1t)2~CR`)GaA&S;56cf(U>>akz5&A4TvzyIwdfwXMDbGshj@5{V)ba$N0 z1m^r-R-POaKPJt2z9r(~qR8-)^yk`^1%ET&b2t9YomJ|;T{5P4>4Dtcdmdc5KFitm zu%K?1|A_|ozjYgzKS^r|yS*^mDJPF}5(B&Cr(X}-J3BkIv!tC&Z{@TG*DqgImVQFw zmAUJ^;}-kWWB2N;Ef2Vpo^n7u|7+imxV`LVUs6_0pSx@M_19l_TRW>B(6r}j;n4e^ z@uJyX^tSq{GS=^R(ZBLP$%H)kI3_#%N>gTe~ HDWM4f%c7z4 delta 934 zcmeyu{fT=+G*f+(r;B4q#jUq@eg+2xN*w#R_=!_gmh0-7ZIL&Vsxwmq!R7 z=*_IBLECPuS}LlkyCPEWreDLu`PXAq)t9}K>-c-C()##PRv5MdIG&wt7{{Ypp{j{2)Qt4}$D&B}^Z}Hf1&mC)1Db<>Z257J(zIrD1srD;pQpYhv#Ge=Hd?WIxg`@4MJ ziQ74NcK{OMoZBJf#CsAl(3W8F);4&9EPzp^pg@25P+o9xNgZ0}`!@(E|!p8L7^ z@_g^SpL+lXU*G$r2?;`4v8E{T(`&WhhtGuQCMhh%aXGjjWsp* z)@RS_T3Q$Q;=i1F+4-ybr(Z;hypI(9uynSq_P*0Entktje?9GY&s3`S*xR{+To1Oa zpWVt~|M%JzZuhrkeOKOcy|+DUP`N48XWgFj{_D-k&WRp+wdM9(`54w;vD~)GRok|E zO+E8!qvh_;TZ})i6ze{^sbtF%ZPUx!W6#{bP0l+XkKFXX}| diff --git a/tests/typ/compiler/construct.typ b/tests/typ/compiler/construct.typ index f535184c2..df5368b7d 100644 --- a/tests/typ/compiler/construct.typ +++ b/tests/typ/compiler/construct.typ @@ -10,9 +10,9 @@ // Ensure that constructor styles win, but not over outer styles. // The outer paragraph should be right-aligned, // but the B should be center-aligned. -#set par(align: center) -#par(align: right)[ - A #rect(width: 2cm, fill: conifer, inset: 4pt)[B] +#set list(label: [>]) +#list(label: [--])[ + #rect(width: 2cm, fill: conifer, inset: 4pt, list[A]) ] --- diff --git a/tests/typ/layout/par.typ b/tests/typ/layout/par.typ index 558059e94..aabe63ef8 100644 --- a/tests/typ/layout/par.typ +++ b/tests/typ/layout/par.typ @@ -2,7 +2,7 @@ --- // Test ragged-left. -#set par(align: right) +#set align(right) To the right! Where the sunlight peeks behind the mountain. --- @@ -35,11 +35,3 @@ fn main() {} - List Paragraph - ---- -// Error: 17-20 must be horizontal -#set par(align: top) - ---- -// Error: 17-33 expected alignment, found 2d alignment -#set par(align: horizon + center) diff --git a/tests/typ/layout/repeat.typ b/tests/typ/layout/repeat.typ index 13e99b519..3b5459c94 100644 --- a/tests/typ/layout/repeat.typ +++ b/tests/typ/layout/repeat.typ @@ -32,7 +32,7 @@ A#repeat(rect(width: 2.5em, height: 1em))B // Test single repeat in both directions. A#repeat(rect(width: 6em, height: 0.7em))B -#set par(align: center) +#set align(center) A#repeat(rect(width: 6em, height: 0.7em))B #set text(dir: rtl) diff --git a/tests/typ/layout/spacing.typ b/tests/typ/layout/spacing.typ index eb0bd39e5..3cb1a20ca 100644 --- a/tests/typ/layout/spacing.typ +++ b/tests/typ/layout/spacing.typ @@ -19,7 +19,7 @@ Add #h(10pt) #h(10pt) up --- // Test spacing collapsing before spacing. -#set par(align: right) +#set align(right) A #h(0pt) B #h(0pt) \ A B \ A #h(-1fr) B diff --git a/tests/typ/math/style.typ b/tests/typ/math/style.typ index c9238a9ae..8df216ef9 100644 --- a/tests/typ/math/style.typ +++ b/tests/typ/math/style.typ @@ -11,5 +11,5 @@ } #set page(width: auto) -#set par(align: center) +#set align(center) #table(columns: 1 + modifiers.len(), ..cells) diff --git a/tests/typ/text/microtype.typ b/tests/typ/text/microtype.typ index 57f9b2f23..c1f0d344e 100644 --- a/tests/typ/text/microtype.typ +++ b/tests/typ/text/microtype.typ @@ -18,6 +18,6 @@ --- // Test that lone punctuation doesn't overhang into the margin. #set page(margin: 0pt) -#set par(align: end) +#set align(end) #set text(dir: rtl) : diff --git a/tests/typ/visualize/line.typ b/tests/typ/visualize/line.typ index 2cb2fc9c8..92490ef80 100644 --- a/tests/typ/visualize/line.typ +++ b/tests/typ/visualize/line.typ @@ -22,7 +22,7 @@ #let star(width, ..args) = box(width: width, height: width)[ #set text(spacing: 0%) #set line(..args) - #set par(align: left) + #set align(left) #line(length: +30%, origin: (09.0%, 02%)) #line(length: +30%, origin: (38.7%, 02%), angle: -72deg) #line(length: +30%, origin: (57.5%, 02%), angle: 252deg)