mirror of
https://github.com/typst/typst
synced 2025-05-14 04:56:26 +08:00
Add box and block functions
This commit is contained in:
parent
784018124d
commit
d53c933e4d
@ -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);
|
||||
|
@ -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);
|
||||
|
BIN
tests/ref/layout/containers.png
Normal file
BIN
tests/ref/layout/containers.png
Normal file
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 |
@ -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)
|
||||
|
42
tests/typ/layout/containers.typ
Normal file
42
tests/typ/layout/containers.typ
Normal 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]
|
||||
]
|
@ -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]]
|
@ -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]
|
||||
|
@ -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()
|
||||
|
@ -8,4 +8,4 @@ _Emphasized!_
|
||||
Partly em_phas_ized.
|
||||
|
||||
// Scoped to body.
|
||||
#rect[_Scoped] to body.
|
||||
#box[_Scoped] to body.
|
||||
|
@ -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
|
||||
|
@ -8,4 +8,4 @@
|
||||
Partly str*ength*ened.
|
||||
|
||||
// Scoped to body.
|
||||
#rect[*Scoped] to body.
|
||||
#box[*Scoped] to body.
|
||||
|
@ -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
|
||||
]
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user