functastic/src/func.typ

82 lines
1.6 KiB
Typst
Raw Normal View History

2024-06-23 20:59:51 +02:00
#import "@preview/cetz:0.2.2": coordinate
#let val(value, alignment) = {
return (
type: "value",
value: value,
alignment: alignment
)
}
#let disc(eod: false, ..args) = {
let pargs = args.pos()
let left = pargs.at(0, default: (none, none))
let right = pargs.at(1, default: (none, none))
let center = pargs.at(2, default: (none, none))
let kwargs = args.named()
if "left" in kwargs { left = kwargs.left }
if "right" in kwargs { right = kwargs.right }
if "center" in kwargs { center = kwargs.center }
let (value-l, alignment-l) = left
let (value-r, alignment-r) = right
let (value-c, alignment-c) = center
return (
type: "discontinuity",
left: (
value: value-l,
alignment: alignment-l,
),
right: (
value: value-r,
alignment: alignment-r,
),
center: (
value: value-c,
alignment: alignment-c,
),
eod: eod
)
}
#let inter(value, start, end, i: auto) = {
return (
type: "intermediate",
value: value,
start: start,
end: end,
i: i,
)
}
#let get-anchor(
ctx,
line-i,
i,
alignment,
side,
dx: .1,
dy: .1
) = {
let (_, anchor) = coordinate.resolve(ctx, "anchor-" + str(i))
let (_, header-t) = coordinate.resolve(ctx, "header-" + str(line-i) + ".north")
let (_, header-b) = coordinate.resolve(ctx, "header-" + str(line-i) + ".south")
let x = anchor.at(0)
if side == "left" {
x -= dx
} else if side == "right" {
x += dx
}
let yt = header-t.at(1)
let yb = header-b.at(1)
let y = (yt + yb) / 2
if alignment == "top" {
y = yt - dy
} else if alignment == "bottom" {
y = yb + dy
}
return (x, y)
}