I recently needed to copy this:
Which is semantically a nested enum list, but definitely doesn’t look nested. So I grabbed my par-like implementation mentioned in How to make bullet list item bodies flow like paragraphs? - #3 by Andrew, and massaged it a little and got this:
#set enum(full: true, numbering: (..n) => {
numbering(("1.", "A.").at(n.pos().len() - 1), n.pos().last())
})
#show enum: en => {
set par(spacing: 0.65em)
let start = if en.start == auto {
if en.children.first().has("number") {
if en.reversed { en.children.first().number } else { 1 }
} else {
if en.reversed { en.children.len() } else { 1 }
}
} else {
en.start
}
let number = start
for (i, it) in en.children.enumerate() {
number = if it.has("number") { it.number } else { number }
if en.reversed { number = start - i }
let parents = state("enum-parents", ())
let indent = context h((parents.get().len() + 1) * en.indent)
let num = if en.full {
context numbering(en.numbering, ..parents.get(), number)
} else {
numbering(en.numbering, number)
}
let max-num = if en.full {
context numbering(en.numbering, ..parents.get(), en.children.len())
} else {
numbering(en.numbering, en.children.len())
}
num = context box(width: measure(max-num).width, align(right, text(
overhang: false,
num,
)))
let body = {
parents.update(arr => arr + (number,))
it.body
linebreak()
parents.update(arr => arr.slice(0, -1))
}
if not en.reversed { number += 1 }
context {
num
h(en.body-indent)
body
}
}
}
So then I can write:
+ What is the primary purpose of machine learning according to the text?
+ To replace human decision-making
+ To analyze and extract useful information from large volumes of data
+ To create complex computer networks
+ To develop new storage technologies
But it’s 100% way too much for a simple show enum.where(level: 1): pad.with(left: ...)
.
I was able to strip it from stuff that I don’t use:
#show enum: en => {
set par(spacing: 0.65em)
let parents = state("enum-parents", ())
for (i, it) in en.children.enumerate() {
let number = i + 1
let max-num = context {
numbering(en.numbering, ..parents.get(), en.children.len())
}
let num = context {
let num = numbering(en.numbering, ..parents.get(), number)
num = align(right, text(overhang: false, num))
box(width: measure(max-num).width, num)
}
let body = {
parents.update(arr => arr + (number,))
it.body
linebreak()
parents.update(arr => arr.slice(0, -1))
}
context num + h(en.body-indent) + body
}
}
But it is still a re-implementation of the full show rule, though not even a full implementation.
I wonder if there is a magic one-liner for this, or maybe we really need to add level
to enum.where
or enum.item.where
(for show enum.where(level: 1): pad.with(left: ...)
), though the problem is that shifting only known from max numbering width + body-indent
.
I’ve also noticed that both levels are not aligned, not sure if it will look better if they are aligned. But it’s not critical.