391 lines
8.9 KiB
Typst

// Test the `place` function.
--- place-basic ---
#set page("a8")
#place(bottom + center)[E]
= A
#place(right, rect(width: 1.8cm))
#lines(5)
#stack(
rect(fill: eastern, height: 10pt, width: 100%),
place(right, dy: 1.5pt)[ABC],
rect(fill: conifer, height: 10pt, width: 80%),
rect(fill: forest, height: 10pt, width: 100%),
10pt,
block[
#place(center, dx: -7pt, dy: -5pt)[A]
#place(center, dx: 7pt, dy: 5pt)[B]
C #h(1fr) D
]
)
--- place-block-spacing ---
// Test how the placed element interacts with paragraph spacing around it.
#set page("a8", height: 60pt)
First
#place(bottom + right)[Placed]
Second
--- place-bottom-in-box ---
#box(
fill: aqua,
width: 30pt,
height: 30pt,
place(bottom,
place(line(start: (0pt, 0pt), end: (20pt, 0pt), stroke: red + 3pt))
)
)
--- place-horizon-in-boxes ---
#box(
fill: aqua,
width: 30pt,
height: 30pt,
{
box(fill: yellow, {
[Hello]
place(horizon, line(start: (0pt, 0pt), end: (20pt, 0pt), stroke: red + 2pt))
})
place(horizon, line(start: (0pt, 0pt), end: (20pt, 0pt), stroke: green + 3pt))
}
)
--- place-bottom-right-in-box ---
#box(fill: aqua)[
#place(bottom + right)[Hi]
Hello World \
How are \
you?
]
--- place-top-left-in-box ---
#box(fill: aqua)[
#place(top + left, dx: 50%, dy: 50%)[Hi]
#v(30pt)
#line(length: 50pt)
]
--- place-float-flow-around ---
#set page(height: 80pt)
#set place(float: true)
#place(bottom + center, rect(height: 20pt))
#lines(4)
--- place-float-queued ---
#set page(height: 180pt)
#set figure(placement: auto)
#figure(rect(height: 60pt), caption: [I])
#figure(rect(height: 40pt), caption: [II])
#figure(rect(), caption: [III])
A
#figure(rect(), caption: [IV])
--- place-float-align-auto ---
#set page(height: 140pt)
#set place(auto, float: true, clearance: 5pt)
#place(rect[A])
#place(rect[B])
1 \ 2
#place(rect[C])
#place(rect[D])
--- place-float-delta ---
#place(top + center, float: true, dx: 10pt, rect[I])
A
#place(bottom + center, float: true, dx: -10pt, rect[II])
--- place-float-flow-size ---
#set page(width: auto, height: auto)
#set place(float: true, clearance: 5pt)
#place(bottom, rect(width: 80pt, height: 10pt))
#place(top + center, rect(height: 20pt))
#align(center)[A]
#pagebreak()
#align(center)[B]
#place(bottom, scope: "page", rect(height: 10pt))
--- place-float-flow-size-alone ---
#set page(width: auto, height: auto)
#set place(float: true, clearance: 5pt)
#place(auto)[A]
--- place-float-fr ---
#set page(height: 120pt, columns: 2)
#set place(float: true, clearance: 10pt)
#set rect(width: 70%)
#place(top + center, rect[I])
#place(bottom + center, scope: "page", rect[II])
A
#v(1fr)
B
#colbreak()
C
#align(bottom)[D]
--- place-float-rel-sizing ---
#set page(height: 100pt, columns: 2)
#set place(float: true, clearance: 10pt)
#set rect(width: 70%)
#place(top + center, scope: "page", rect[I])
#place(top + center, rect[II])
// This test result is not ideal: The first column takes 30% of the full page,
// while the second takes 30% of the remaining space since there is no concept
// of `full` for followup pages.
#set align(bottom)
#rect(width: 100%, height: 30%)
#rect(width: 100%, height: 30%)
--- place-float-block-backlog ---
#set page(height: 100pt)
#v(60pt)
#place(top, float: true, rect())
#list(.."ABCDEFGHIJ".clusters())
--- place-float-clearance-empty ---
// Check that we don't require space for clearance if there is no content.
#set page(height: 100pt)
#v(1fr)
#table(
columns: (1fr, 1fr),
lines(2),
[],
lines(8),
place(auto, float: true, block(width: 100%, height: 100%, fill: aqua))
)
--- place-float-column-align-auto ---
#set page(height: 150pt, columns: 2)
#set place(auto, float: true, clearance: 10pt)
#set rect(width: 75%)
#place(rect[I])
#place(rect[II])
#place(rect[III])
#place(rect[IV])
#lines(6)
#place(rect[V])
#place(rect[VI])
--- place-float-column-queued ---
#set page(height: 100pt, columns: 2)
#set place(float: true, clearance: 10pt)
#set rect(width: 75%)
#set text(costs: (widow: 0%, orphan: 0%))
#lines(3)
#place(top, rect[I])
#place(top, rect[II])
#place(bottom, rect[III])
#lines(3)
--- place-float-twocolumn ---
#set page(height: 100pt, columns: 2)
#set place(float: true, clearance: 10pt)
#set rect(width: 70%)
#place(top + center, scope: "page", rect[I])
#place(top + center, rect[II])
#lines(4)
#place(top + center, rect[III])
#block(width: 100%, height: 70pt, fill: conifer)
#place(bottom + center, scope: "page", rect[IV])
#place(bottom + center, rect[V])
#v(1pt, weak: true)
#block(width: 100%, height: 60pt, fill: aqua)
--- place-float-twocolumn-queued ---
#set page(height: 100pt, columns: 2)
#set place(float: true, scope: "page", clearance: 10pt)
#let t(align, fill) = place(top + align, rect(fill: fill, height: 25pt))
#t(left, aqua)
#t(center, forest)
#t(right, conifer)
#lines(7)
--- place-float-twocolumn-align-auto ---
#set page(height: 100pt, columns: 2)
#set place(float: true, clearance: 10pt)
#set rect(width: 70%)
#place(auto, scope: "page", rect[I]) // Should end up `top`
#lines(4)
#place(auto, scope: "page", rect[II]) // Should end up `bottom`
#lines(4)
--- place-float-twocolumn-fits ---
#set page(height: 100pt, columns: 2)
#set place(float: true, clearance: 10pt)
#set rect(width: 70%)
#lines(6)
#place(auto, scope: "page", rect[I])
#lines(12, "1")
--- place-float-twocolumn-fits-not ---
#set page(height: 100pt, columns: 2)
#set place(float: true, clearance: 10pt)
#set rect(width: 70%)
#lines(10)
#place(auto, scope: "page", rect[I])
#lines(10, "1")
--- place-float-threecolumn ---
#set page(height: 100pt, columns: 3)
#set place(float: true, clearance: 10pt)
#set rect(width: 70%)
#place(bottom + center, scope: "page", rect[I])
#lines(21)
#place(top + center, scope: "page", rect[II])
--- place-float-threecolumn-block-backlog ---
#set page(height: 100pt, columns: 3)
#set place(float: true, clearance: 10pt)
#set rect(width: 70%)
// The most important part of this test is that we get the backlog of the
// conifer (green) block right.
#place(top + center, scope: "page", rect[I])
#block(fill: aqua, width: 100%, height: 70pt)
#block(fill: conifer, width: 100%, height: 160pt)
#place(bottom + center, scope: "page", rect[II])
#place(top, rect(height: 40%)[III])
#block(fill: yellow, width: 100%, height: 60pt)
--- place-float-counter ---
#let c = counter("c")
#let cd = context c.display()
#set page(
height: 100pt,
margin: (y: 20pt),
header: [H: #cd],
footer: [F: #cd],
columns: 2,
)
#let t(align, scope: "column", n) = place(
align,
float: true,
scope: scope,
clearance: 10pt,
line(length: 100%) + c.update(n),
)
#t(bottom, 6)
#cd
#t(top, 3)
#colbreak()
#cd
#t(scope: "page", bottom, 11)
#colbreak()
#cd
#t(top, 12)
--- place-float-missing ---
// Error: 2-20 automatic positioning is only available for floating placement
// Hint: 2-20 you can enable floating placement with `place(float: true, ..)`
#place(auto)[Hello]
--- place-float-center-horizon ---
// Error: 2-45 vertical floating placement must be `auto`, `top`, or `bottom`
#place(center + horizon, float: true)[Hello]
--- place-float-horizon ---
// Error: 2-36 vertical floating placement must be `auto`, `top`, or `bottom`
#place(horizon, float: true)[Hello]
--- place-float-default ---
// Error: 2-27 vertical floating placement must be `auto`, `top`, or `bottom`
#place(float: true)[Hello]
--- place-float-right ---
// Error: 2-34 vertical floating placement must be `auto`, `top`, or `bottom`
#place(right, float: true)[Hello]
--- place-flush ---
#set page(height: 120pt)
#let floater(align, height) = place(
align,
float: true,
rect(width: 100%, height: height),
)
#floater(top, 30pt)
A
#floater(bottom, 50pt)
#place.flush()
B // Should be on the second page.
--- place-flush-figure ---
#set page(height: 120pt)
#let floater(align, height, caption) = figure(
placement: align,
caption: caption,
rect(width: 100%, height: height),
)
#floater(top, 30pt)[I]
A
#floater(bottom, 50pt)[II]
#place.flush()
B // Should be on the second page.
--- issue-place-base ---
// Test that placement is relative to container and not itself.
#set page(height: 80pt, margin: 0pt)
#place(right, dx: -70%, dy: 20%, [First])
#place(left, dx: 20%, dy: 60%, [Second])
#place(center + horizon, dx: 25%, dy: 25%, [Third])
--- issue-1368-place-pagebreak ---
// Test placing on an already full page.
// It shouldn't result in a page break.
#set page(height: 40pt)
#block(height: 100%)
#place(bottom + right)[Hello world]
--- issue-2199-place-spacing-bottom ---
// Test that placed elements don't add extra block spacing.
#show figure: set block(spacing: 4em)
Paragraph before float.
#figure(rect(), placement: bottom)
Paragraph after float.
--- issue-2199-place-spacing-default ---
#show place: set block(spacing: 4em)
Paragraph before place.
#place(rect())
Paragraph after place.
--- issue-2595-float-overlap ---
#set page(height: 80pt)
1
#place(auto, float: true, block(height: 100%, width: 100%, fill: aqua))
#place(auto, float: true, block(height: 100%, width: 100%, fill: red))
#lines(7)