From ed0c80401782a6c42173f0bb123731b798a2cfe1 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 27 Sep 2021 15:11:56 +0200 Subject: [PATCH] Add spacing capabilities to stack function - Named argument `spacing` controls spacing between any two template arguments - Arbitrary linears in the list can produce arbitrary spacing --- src/library/layout.rs | 102 +++++++++++++++++++++++-------------- src/library/text.rs | 55 ++++++++++---------- tests/ref/layout/stack.png | Bin 318 -> 371 bytes tests/typ/layout/stack.typ | 12 ++++- 4 files changed, 103 insertions(+), 66 deletions(-) diff --git a/src/library/layout.rs b/src/library/layout.rs index e958f3a3c..87cedd994 100644 --- a/src/library/layout.rs +++ b/src/library/layout.rs @@ -188,8 +188,22 @@ pub fn pad(_: &mut EvalContext, args: &mut Args) -> TypResult { /// `stack`: Stack children along an axis. pub fn stack(_: &mut EvalContext, args: &mut Args) -> TypResult { + enum Child { + Spacing(Linear), + Any(Template), + } + + castable! { + Child: "linear or template", + Value::Length(v) => Self::Spacing(v.into()), + Value::Relative(v) => Self::Spacing(v.into()), + Value::Linear(v) => Self::Spacing(v), + Value::Template(v) => Self::Any(v), + } + let dir = args.named("dir")?; - let children: Vec