From b5ad2468adafca40448035c80fdabab4b5f75a0f Mon Sep 17 00:00:00 2001 From: Pg Biel <9021226+PgBiel@users.noreply.github.com> Date: Thu, 11 May 2023 11:32:46 -0300 Subject: [PATCH] Improve alignment of text inside raw blocks (#1034) --- library/src/text/raw.rs | 23 ++++++++++++++++ src/geom/align.rs | 52 ++++++++++++++++++++++++++++++++++- tests/ref/text/raw-align.png | Bin 0 -> 32879 bytes tests/typ/text/raw-align.typ | 37 +++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 tests/ref/text/raw-align.png create mode 100644 tests/typ/text/raw-align.typ diff --git a/library/src/text/raw.rs b/library/src/text/raw.rs index 4a9a925c0..4cc26fa67 100644 --- a/library/src/text/raw.rs +++ b/library/src/text/raw.rs @@ -102,6 +102,27 @@ pub struct RawElem { /// ``` /// ```` pub lang: Option, + + /// The horizontal alignment that each line in a raw block should have. + /// This option is ignored if this is not a raw block (if specified + /// `block: false` or single backticks were used in markup mode). + /// + /// By default, this is set to `{start}`, meaning that raw text is + /// aligned towards the start of the text direction inside the block + /// by default, regardless of the current context's alignment (allowing + /// you to center the raw block itself without centering the text inside + /// it, for example). + /// + /// ````example + /// #set raw(align: center) + /// + /// ```typc + /// let f(x) = x + /// code = "centered" + /// ``` + /// ```` + #[default(HorizontalAlign(GenAlign::Start))] + pub align: HorizontalAlign, } impl RawElem { @@ -180,6 +201,8 @@ impl Show for RawElem { }; if self.block(styles) { + // Align the text before inserting it into the block. + realized = realized.aligned(Axes::with_x(Some(self.align(styles).into()))); realized = BlockElem::new().with_body(Some(realized)).pack(); } diff --git a/src/geom/align.rs b/src/geom/align.rs index 69f32bee9..a15ec4e60 100644 --- a/src/geom/align.rs +++ b/src/geom/align.rs @@ -106,6 +106,18 @@ impl From for GenAlign { } } +impl From for GenAlign { + fn from(align: HorizontalAlign) -> Self { + align.0 + } +} + +impl From for GenAlign { + fn from(align: VerticalAlign) -> Self { + align.0 + } +} + impl Debug for GenAlign { fn fmt(&self, f: &mut Formatter) -> fmt::Result { match self { @@ -184,7 +196,45 @@ impl Fold for GenAlign { } } -#[derive(Copy, Clone, Eq, PartialEq, Debug)] +/// Utility struct to restrict a passed alignment value to the horizontal axis +/// on cast. +#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] +pub struct HorizontalAlign(pub GenAlign); + +cast_from_value! { + HorizontalAlign, + align: GenAlign => { + if align.axis() != Axis::X { + Err("alignment must be horizontal")?; + } + Self(align) + }, +} + +cast_to_value! { + v: HorizontalAlign => v.0.into() +} + +/// Utility struct to restrict a passed alignment value to the vertical axis on +/// cast. +#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] +pub struct VerticalAlign(pub GenAlign); + +cast_from_value! { + VerticalAlign, + align: GenAlign => { + if align.axis() != Axis::Y { + Err("alignment must be vertical")?; + } + Self(align) + }, +} + +cast_to_value! { + v: VerticalAlign => v.0.into() +} + +#[derive(Debug, Copy, Clone, Eq, PartialEq)] pub enum LeftRightAlternator { Left, Right, diff --git a/tests/ref/text/raw-align.png b/tests/ref/text/raw-align.png new file mode 100644 index 0000000000000000000000000000000000000000..734008e1a7a97c2b2d5ce81801cf0f56badd7128 GIT binary patch literal 32879 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 literal 0 HcmV?d00001 diff --git a/tests/typ/text/raw-align.typ b/tests/typ/text/raw-align.typ new file mode 100644 index 000000000..2e124ea98 --- /dev/null +++ b/tests/typ/text/raw-align.typ @@ -0,0 +1,37 @@ +// Test the alignment of text inside of raw blocks. + +--- +// Text inside raw block should be unaffected by outer alignment by default. +#set align(center) +#set page(width: 180pt) +#set text(6pt) + +#lorem(20) + +```py +def something(x): + return x + +a = 342395823859823958329 +b = 324923 +``` + +#lorem(20) + +--- +// Text inside raw block should follow the specified alignment. +#set page(width: 180pt) +#set text(6pt) + +#lorem(20) +#align(center, raw( + lang: "typ", + block: true, + align: right, + "#let f(x) = x\n#align(center, line(length: 1em))", +)) +#lorem(20) + +--- +// Error: 17-20 alignment must be horizontal +#set raw(align: top)