I have the following Typst code:
#block(
fill: aqua,
inset: 8pt,
radius: 4pt,
width: 100%,
[
#lorem(150)
],
)
I would like to automatically add a line number before every line which is generated by #lorem (150) . I also need enough space (around one tab) between the line number and the line.
Thank you.
The only one I know of is par.line .
#block(fill: aqua, inset: 8pt, radius: 4pt, width: 100%)[
#set par.line(numbering: "1.")
#lorem(150)
]
a\u{9}a
Tab character doesn’t have a defined width. If anything, it’s a control character that is unprintable, same goes to all first 32 characters .
Andrew
June 5, 2025, 10:15pm
3
Using my hack I implemented last month for filling N lines of space regardless of text, here it is:
#let color-box(
body,
fill: aqua,
inset: 8pt,
radius: 4pt,
width: 100%,
body-indent: 1.5em,
dx: 0pt,
numbering: "1",
) = {
set par.line(numbering: numbering)
show: block.with(fill: fill, inset: inset, radius: radius, width: width)
body = pad(left: body-indent, body)
let num(n) = if numbering != none { std.numbering(numbering, n) }
layout(size => {
let leading = par.leading.to-absolute()
let one = measure([a], ..size).height + leading
let height = measure(body, ..size).height + leading
let line-count = int(height / one + 0.1)
let line-numbers = range(1, line-count + 1).map(num)
place(dx: dx, grid(align: right, gutter: leading, ..line-numbers))
body + parbreak()
})
}
#set par(justify: true)
#color-box(numbering: "1.", body-indent: 1.5em, dx: -0.3em)[
#lorem(150)
]
So the only tricky part is counting the number of lines, which is always very close to an integer, sometimes is exactly an integer, depending on float division.
Thank you Andrew for your support.