49 lines
1.0 KiB
Typst
49 lines
1.0 KiB
Typst
#let syntax(body) = {
|
|
set text(weight: "bold", fill: rgb(100, 50, 0))
|
|
body
|
|
}
|
|
#let blank(r, c) = grid.cell(
|
|
rowspan: r,
|
|
colspan: c
|
|
)[]
|
|
|
|
#let tab = sym.arrow.r.stop
|
|
#let nl = move(dx: -2pt, dy: 2pt, sym.arrow.curve.l)
|
|
#let syntax-preamble = doc => {
|
|
show tab: set text(fill: gray.darken(20%))
|
|
show sym.arrow.curve.l: set text(fill: gray.darken(20%))
|
|
set math.cases(gap: 4pt)
|
|
|
|
show math.equation: set align(left)
|
|
|
|
doc
|
|
}
|
|
|
|
#let syntax-grid(..sections) = {
|
|
let cells = ()
|
|
|
|
for (i, (meta-var, name, elements)) in sections.pos().enumerate() {
|
|
if i != 0 {
|
|
cells.push(grid.cell(colspan: 4)[])
|
|
}
|
|
cells += ($#meta-var$, $::=$, none, [_#{name}_])
|
|
cells.push(blank(elements.len(), 2))
|
|
cells += elements.map(
|
|
e => if e.last() == none {
|
|
grid.cell(colspan: 2, e.first())
|
|
} else {
|
|
e
|
|
}
|
|
).flatten()
|
|
}
|
|
|
|
show: syntax-preamble
|
|
grid(
|
|
columns: (auto, auto, 1fr, auto),
|
|
align: (left, left, left, right).map(a => a + horizon),
|
|
column-gutter: .4em,
|
|
row-gutter: 1.2em,
|
|
..cells,
|
|
)
|
|
}
|