You could combine @Andrew 's solution with a custom counter:
Some problem
#[
#let enumcounter = counter("enumcounter")
#enumcounter.update(1)
#show enum.item: it => context {
if it.number != none {
return it
}
enumcounter.step()
enum.item(
enumcounter.get().first(),
it.body
) + v(1fr)
}
+ part (a)
+ part (b)
+ part (c)
]
Yep, but this is overcomplicated a bit. Here you go:
Some problem
#[
#show enum.item: it => {
let enum-counter = counter("enum-counter")
if it.number != none { return it }
enum-counter.step()
context enum.item(..enum-counter.get(), it.body)
v(1fr)
}
+ part (a)
+ part (b)
+ part (c)
]
I actually was thinking at first with the classic processed label hack, but using a built-in field would generally be better, unless it’s actually be used. Then it will break.
#show enum.item: it => {
if it.has("label") and it.label == <processed> { return it }
[#enum.item(...)<processed>]
}
#let vfill-enum(doc) = {
let enum-counter = counter("enum-counter")
enum-counter.update(0)
show enum.item: it => {
if it.number != none { return it }
enum-counter.step()
context enum.item(..enum-counter.get(), it.body)
v(1fr)
}
doc
}
Some problem
#[
#show: vfill-enum
+ part (a)
+ part (b)
+ part (c)
]
Yeah, because there was no mention of 2fr and you can’t even add numbers to \vfill. Which is why I said, “If that’s all you need”. The better the question, the better the answer.
It seems you’re building an exam or a questionnaire, maybe the package tutor – Typst Universe might be of help. I’ve never used it, but I know the person personally who created it.
That one looks nice. The thing is that I am promoting Typst to others. If they ask me how to do a similar thing as the \item,\vfill in Latex, I can only tell them to manually setup a counter or use some package. They will certainly feel disappointed because for a familiar behavior, they have to find some way to crack the nuts. This is why I wonder whether it is a better idea to change the behavior of enum.item.