mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
Add box and block functions
This commit is contained in:
parent
784018124d
commit
d53c933e4d
@ -210,6 +210,26 @@ castable! {
|
|||||||
AlignValue: "alignment",
|
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.
|
/// `pad`: Pad content at the sides.
|
||||||
pub fn pad(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
|
pub fn pad(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
|
||||||
let all = args.eat(ctx);
|
let all = args.eat(ctx);
|
||||||
|
@ -41,6 +41,8 @@ pub fn new() -> Scope {
|
|||||||
std.def_func("h", h);
|
std.def_func("h", h);
|
||||||
std.def_func("v", v);
|
std.def_func("v", v);
|
||||||
std.def_func("align", align);
|
std.def_func("align", align);
|
||||||
|
std.def_func("box", boxed);
|
||||||
|
std.def_func("block", block);
|
||||||
std.def_func("pad", pad);
|
std.def_func("pad", pad);
|
||||||
std.def_func("stack", stack);
|
std.def_func("stack", stack);
|
||||||
std.def_func("grid", grid);
|
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 university = [*Technische Universität {city}*]
|
||||||
#let faculty = [*Fakultät II, Institut for Mathematik*]
|
#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
|
// the only argument to a function is a template, the parentheses can be omitted
|
||||||
// (i.e. `f[a]` is the same as `f([a])`).
|
// (i.e. `f[a]` is the same as `f([a])`).
|
||||||
#rect[
|
#box[
|
||||||
// Backslash adds a forced line break.
|
// Backslash adds a forced line break.
|
||||||
#university \
|
#university \
|
||||||
#faculty \
|
#faculty \
|
||||||
@ -21,7 +21,7 @@
|
|||||||
Dr. Max Mustermann \
|
Dr. Max Mustermann \
|
||||||
Ola Nordmann, John Doe
|
Ola Nordmann, John Doe
|
||||||
]
|
]
|
||||||
#align(right, rect[*WiSe 2019/2020* \ Woche 3])
|
#align(right, box[*WiSe 2019/2020* \ Woche 3])
|
||||||
|
|
||||||
// Adds vertical spacing.
|
// Adds vertical spacing.
|
||||||
#v(6mm)
|
#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
|
// Error: 13-23 missing argument: body
|
||||||
Hi #rect(pad(left: 10pt)) there
|
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.
|
// Test that the pad node doesn't consume the whole region.
|
||||||
|
|
||||||
#page(width: 4cm, height: 5cm)
|
#page(height: 6cm)
|
||||||
|
|
||||||
#align(left)[Before]
|
#align(left)[Before]
|
||||||
#pad(10pt, image("../../res/tiger.jpg"))
|
#pad(10pt, image("../../res/tiger.jpg"))
|
||||||
#align(right)[After]
|
#align(right)[After]
|
||||||
|
@ -6,9 +6,9 @@ First of two
|
|||||||
#page(height: 40pt)
|
#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
|
A
|
||||||
#rect[
|
#box[
|
||||||
B
|
B
|
||||||
// Error: 16 cannot modify page from here
|
// Error: 16 cannot modify page from here
|
||||||
#pagebreak()
|
#pagebreak()
|
||||||
|
@ -8,4 +8,4 @@ _Emphasized!_
|
|||||||
Partly em_phas_ized.
|
Partly em_phas_ized.
|
||||||
|
|
||||||
// Scoped to body.
|
// Scoped to body.
|
||||||
#rect[_Scoped] to body.
|
#box[_Scoped] to body.
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
// Parsed as headings if at start of the context.
|
// Parsed as headings if at start of the context.
|
||||||
/**/ # Level 1
|
/**/ # Level 1
|
||||||
{[## Level 2]}
|
{[## Level 2]}
|
||||||
#rect[### Level 3]
|
#box[### Level 3]
|
||||||
|
|
||||||
// Not at the start of the context.
|
// Not at the start of the context.
|
||||||
No # heading
|
No # heading
|
||||||
|
@ -8,4 +8,4 @@
|
|||||||
Partly str*ength*ened.
|
Partly str*ength*ened.
|
||||||
|
|
||||||
// Scoped to body.
|
// 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.
|
// Test that alignment depends on the paragraph's full width.
|
||||||
#rect[
|
#box[
|
||||||
Hello World \
|
Hello World \
|
||||||
#align(right)[World]
|
#align(right)[World]
|
||||||
]
|
]
|
||||||
@ -10,7 +10,7 @@
|
|||||||
---
|
---
|
||||||
// Test that a line with multiple alignments respects the paragraph's full
|
// Test that a line with multiple alignments respects the paragraph's full
|
||||||
// width.
|
// width.
|
||||||
#rect[
|
#box[
|
||||||
Hello #align(center)[World] \
|
Hello #align(center)[World] \
|
||||||
Hello from the 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.size = Size::new(Length::pt(120.0), Length::inf());
|
||||||
state.page.margins = Sides::splat(Some(Length::pt(10.0).into()));
|
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);
|
let mut pass = typst::typeset(loader, cache, Some(src_path), &src, &scope, state);
|
||||||
|
|
||||||
if !compare_ref {
|
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 {
|
pub fn args(_: &mut EvalContext, args: &mut FuncArgs) -> Value {
|
||||||
let repr = typst::pretty::pretty(args);
|
let repr = typst::pretty::pretty(args);
|
||||||
args.items.clear();
|
args.items.clear();
|
||||||
Value::template("args", move |ctx| {
|
Value::template(move |ctx| {
|
||||||
let snapshot = ctx.state.clone();
|
let snapshot = ctx.state.clone();
|
||||||
ctx.set_monospace();
|
ctx.set_monospace();
|
||||||
ctx.push_text(&repr);
|
ctx.push_text(&repr);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user