typst/tests/suite/layout/transform.typ
2024-09-02 12:56:08 +00:00

168 lines
3.9 KiB
Typst

// Test transformations.
--- transform-tex-logo ---
// Test creating the TeX and XeTeX logos.
#let size = 11pt
#let tex = {
[T]
h(-0.14 * size)
box(move(dy: 0.22 * size)[E])
h(-0.12 * size)
[X]
}
#let xetex = {
[X]
h(-0.14 * size)
box(scale(x: -100%, move(dy: 0.26 * size)[E]))
h(-0.14 * size)
[T]
h(-0.14 * size)
box(move(dy: 0.26 * size)[E])
h(-0.12 * size)
[X]
}
#set text(font: "New Computer Modern", size)
Neither #tex, \
nor #xetex!
--- transform-rotate-and-scale ---
// Test combination of scaling and rotation.
#set page(height: 80pt)
#align(center + horizon,
rotate(20deg, scale(70%, image("/assets/images/tiger.jpg")))
)
--- transform-rotate-origin ---
// Test setting rotation origin.
#rotate(10deg, origin: top + left,
image("/assets/images/tiger.jpg", width: 50%)
)
--- transform-scale-origin ---
// Test setting scaling origin.
#let r = rect(width: 100pt, height: 10pt, fill: forest)
#set page(height: 65pt)
#box(scale(r, x: 50%, y: 200%, origin: left + top))
#box(scale(r, x: 50%, origin: center))
#box(scale(r, x: 50%, y: 200%, origin: right + bottom))
--- transform-rotate ---
// Test that rotation impact layout.
#set page(width: 200pt)
#set rotate(reflow: true)
#let one(angle) = box(fill: aqua, rotate(angle)[Test Text])
#for angle in range(0, 360, step: 15) {
one(angle * 1deg)
}
--- transform-rotate-relative-sizing ---
// Test relative sizing in rotated boxes.
#set page(width: 200pt, height: 200pt)
#set text(size: 32pt)
#let rotated(body) = box(rotate(
90deg,
box(stroke: 0.5pt, height: 20%, clip: true, body)
))
#set rotate(reflow: false)
Hello #rotated[World]!\
#set rotate(reflow: true)
Hello #rotated[World]!
--- transform-scale ---
// Test that scaling impacts layout.
#set page(width: 200pt)
#set text(size: 32pt)
#let scaled(body) = box(scale(
x: 20%,
y: 40%,
body
))
#set scale(reflow: false)
Hello #scaled[World]!
#set scale(reflow: true)
Hello #scaled[World]!
--- transform-scale-relative-sizing ---
// Test relative sizing in scaled boxes.
#set page(width: 200pt, height: 200pt)
#set text(size: 32pt)
#let scaled(body) = box(scale(
x: 60%,
y: 40%,
box(stroke: 0.5pt, width: 30%, clip: true, body)
))
#set scale(reflow: false)
Hello #scaled[World]!\
#set scale(reflow: true)
Hello #scaled[World]!
--- transform-scale-abs-and-auto ---
// Test scaling by absolute lengths and auto.
#set page(width: 200pt, height: 200pt)
#let cylinder = image("/assets/images/cylinder.svg")
#cylinder
#scale(x: 100pt, y: 50pt, reflow: true, cylinder)
#scale(x: auto, y: 50pt, reflow: true, cylinder)
#scale(x: 100pt, y: auto, reflow: true, cylinder)
#scale(x: 150%, y: auto, reflow: true, cylinder)
--- transform-skew ---
// Test skewing along one axis.
#set page(width: 100pt, height: 60pt)
#set text(size: 12pt)
#let skewed(body) = box(skew(ax: -30deg, body))
#set skew(reflow: false)
Hello #skewed[World]!
#set skew(reflow: true)
Hello #skewed[World]!
--- transform-skew-both-axes ---
// Test skewing along both axes.
#set page(width: 100pt, height: 250pt)
#set text(size: 12pt)
#let skewed(angle) = box(skew(ax: 30deg, ay: angle)[Some Text])
#set skew(reflow: true)
#for angle in range(-30, 31, step: 10) {
skewed(angle * 1deg)
}
--- transform-skew-origin ---
// Test setting skewing origin.
#set page(width: 100pt, height:40pt)
#set text(spacing: 20pt)
#let square = square.with(width: 8pt)
#let skew-square(origin) = box(place(square(stroke: gray))
+ place(skew(ax: -30deg, ay: -30deg, origin: origin, square())))
#skew-square(center+horizon)
#skew-square(bottom+left)
#skew-square(top+right)
#skew-square(horizon+right)
--- transform-skew-relative-sizing ---
// Test relative sizing in skewed boxes.
#set page(width: 100pt, height: 60pt)
#set text(size: 12pt)
#let skewed(body) = box(skew(
ax: 30deg,
box(stroke: 0.5pt, width: 30%, clip: true, body)
))
#set skew(reflow: false)
Hello #skewed[World]!\
#set skew(reflow: true)
Hello #skewed[World]!