Add box and block functions

This commit is contained in:
Laurenz 2021-06-26 15:47:37 +02:00
parent 784018124d
commit d53c933e4d
15 changed files with 94 additions and 28 deletions

View File

@ -210,6 +210,26 @@ castable! {
AlignValue: "alignment",
}
/// ´box`: Place content in a rectangular box.
pub fn boxed(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
let width = args.named(ctx, "width");
let height = args.named(ctx, "height");
let body = args.eat(ctx).unwrap_or_default();
Value::template(move |ctx| {
let child = ctx.exec_template_stack(&body).into();
ctx.push_into_par(FixedNode { width, height, child });
})
}
/// block`: Place content in a block.
pub fn block(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
let body = args.eat(ctx).unwrap_or_default();
Value::template(move |ctx| {
let block = ctx.exec_template_stack(&body);
ctx.push_into_stack(block);
})
}
/// `pad`: Pad content at the sides.
pub fn pad(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
let all = args.eat(ctx);

View File

@ -41,6 +41,8 @@ pub fn new() -> Scope {
std.def_func("h", h);
std.def_func("v", v);
std.def_func("align", align);
std.def_func("box", boxed);
std.def_func("block", block);
std.def_func("pad", pad);
std.def_func("stack", stack);
std.def_func("grid", grid);

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 52 KiB

View File

@ -10,10 +10,10 @@
#let university = [*Technische Universität {city}*]
#let faculty = [*Fakultät II, Institut for Mathematik*]
// The `rect` function just places content into a rectangular container. When
// The `box` function just places content into a rectangular container. When
// the only argument to a function is a template, the parentheses can be omitted
// (i.e. `f[a]` is the same as `f([a])`).
#rect[
#box[
// Backslash adds a forced line break.
#university \
#faculty \
@ -21,7 +21,7 @@
Dr. Max Mustermann \
Ola Nordmann, John Doe
]
#align(right, rect[*WiSe 2019/2020* \ Woche 3])
#align(right, box[*WiSe 2019/2020* \ Woche 3])
// Adds vertical spacing.
#v(6mm)

View File

@ -0,0 +1,42 @@
// Test the `box` and `block` containers.
---
// Test box in paragraph.
A #box[B \ C] D.
// Test box with height.
Spaced \
#box(height: 0.5cm) \
Apart
---
// Test block over multiple pages.
#page(height: 60pt)
First!
#block[
But, soft! what light through yonder window breaks? It is the east, and Juliet
is the sun.
]
---
// Test shrink-to-fit vs expand.
// Top-level paragraph fills page
L #align(right)[R]
// Block also fills page.
#block[
L #align(right)[R]
]
// Boxed paragraph respects width.
#box(width: 50pt)[
L #align(right)[R]
]
// Boxed paragraph without width doesn't expand.
#box[
L #align(right)[R]
]

View File

@ -1,14 +0,0 @@
// Test shrink-to-fit vs expand.
---
#let right(body) = align(right, body)
#let pad(body) = pad(left: 10pt, right: 10pt, body)
// Top-level paragraph fills page, boxed paragraph only when the width is set.
L #right[R] \
#rect(width: 50pt)[L #right[R]] \
#rect[L #right[R]]
// Pad inherits expansion behaviour.
#rect(pad[PL #right[PR]])
#pad[PL #right[PR]]

View File

@ -11,13 +11,26 @@
]
]
// Error: 14-24 missing argument: body
Hi #rect(pad(left: 10pt)) there
// Error: 13-23 missing argument: body
Hi #box(pad(left: 10pt)) there
---
#let pad(body) = pad(left: 10pt, right: 10pt, body)
// Pad inherits expansion behaviour from stack ....
#pad[PL #align(right)[PR]]
// ... block ...
#block(pad[PL #align(right)[PR]])
// ... and box.
#box(pad[PL #align(right)[PR]])
---
// Test that the pad node doesn't consume the whole region.
#page(width: 4cm, height: 5cm)
#page(height: 6cm)
#align(left)[Before]
#pad(10pt, image("../../res/tiger.jpg"))
#align(right)[After]

View File

@ -6,9 +6,9 @@ First of two
#page(height: 40pt)
---
// Make sure that you can't do page related stuff in a shape.
// Make sure that you can't do page related stuff in a container.
A
#rect[
#box[
B
// Error: 16 cannot modify page from here
#pagebreak()

View File

@ -8,4 +8,4 @@ _Emphasized!_
Partly em_phas_ized.
// Scoped to body.
#rect[_Scoped] to body.
#box[_Scoped] to body.

View File

@ -18,7 +18,7 @@
// Parsed as headings if at start of the context.
/**/ # Level 1
{[## Level 2]}
#rect[### Level 3]
#box[### Level 3]
// Not at the start of the context.
No # heading

View File

@ -8,4 +8,4 @@
Partly str*ength*ened.
// Scoped to body.
#rect[*Scoped] to body.
#box[*Scoped] to body.

View File

@ -2,7 +2,7 @@
---
// Test that alignment depends on the paragraph's full width.
#rect[
#box[
Hello World \
#align(right)[World]
]
@ -10,7 +10,7 @@
---
// Test that a line with multiple alignments respects the paragraph's full
// width.
#rect[
#box[
Hello #align(center)[World] \
Hello from the World
]

View File

@ -224,6 +224,9 @@ fn test_part(
state.page.size = Size::new(Length::pt(120.0), Length::inf());
state.page.margins = Sides::splat(Some(Length::pt(10.0).into()));
// Clear cache between tests (for now).
cache.layout.clear();
let mut pass = typst::typeset(loader, cache, Some(src_path), &src, &scope, state);
if !compare_ref {
@ -315,7 +318,7 @@ fn register_helpers(scope: &mut Scope, panics: Rc<RefCell<Vec<Panic>>>) {
pub fn args(_: &mut EvalContext, args: &mut FuncArgs) -> Value {
let repr = typst::pretty::pretty(args);
args.items.clear();
Value::template("args", move |ctx| {
Value::template(move |ctx| {
let snapshot = ctx.state.clone();
ctx.set_monospace();
ctx.push_text(&repr);