How can I customize the outline entries based on the different parts' labels?

For part/chapter/normal headings, you can re-use Part independent section - #6 by Andrew. I don’t understand if the numbering is supposed to be automatic or not exist at all (to confuse readers).

#let chapter-count = counter("chapter counter")
#show heading.where(level: 2): it => chapter-count.step() + it
#set heading(numbering: (..nums) => {
  if nums.pos().len() == 1 {
    numbering("I.", ..nums) // Part
  } else if nums.pos().len() == 2 {
    numbering("1.", chapter-count.get().first() + 1) // Chapter
  } else {
    numbering("1.", ..chapter-count.get(), ..nums.pos().slice(2))
  }
})

#show heading.where(level: 1): it => if it.body == [Contents] { it } else {
  set align(center + horizon)
  set text(36pt)
  pagebreak(weak: true) + it
}

#show heading.where(level: 2): set text(22pt)
#show heading.where(level: 2): set align(center)
#show heading.where(level: 2): it => pagebreak(weak: true) + emph(it)

#outline(target: selector.or(heading.where(level: 1), heading.where(level: 2)))

= Part One
== Chapter One
=== Section
== Chapter Two
= Part Two
== Chapter Three
=== Section
=== Section
==== Subsection
==== Subsection
= Part Three
== Chapter Four
2 Likes