#Stateful footer/header in pages
8 messages · Page 1 of 1 (latest)
?r theme=light pagesize=default
#let plain-page = state("plain-page", false)
#let (header-even, header-odd) = ("Even", "Odd")
#let first-page() = 2 > counter(page).get().first()
#let page-number() = counter(page).display("1")
#let style-page() = not first-page() and not plain-page.at(here())
#set page(header: context {
set text(fill: gray)
if style-page() {
if calc.even(..counter(page).get()) {
set text(weight: "light")
header-even + h(1fr) + page-number()
} else {
set text(weight: "light")
page-number() + h(1fr) + header-odd
}
}
})
#set page(footer: context {
set text(fill: gray)
if style-page() {
set text(weight: "light")
align(center, "Footer")
}
})
Title Page
#plain-page.update(_ => true)
#pagebreak()
Note page // This section is optional, when present it shouldn't have nor footer nor header
#pagebreak()
#plain-page.update(_ => false)
Normal page // Should have footer and header, but only has footer
#pagebreak()
Normal page // Does have footer and header
The header is rendered before anything on the page, including the state update, so plain-page is still false
hey thx kindly @hard urchin 
i ended up solving it with something like:
[0m[35m#let[0m [0m[3m[34mfirst-page[0m() [0m[36m=[0m {
[0m[35mif[0m [0m[35mnot[0m has-notice {
[0m[33m2[0m [0m[36m>[0m [0m[3m[34mcounter[0m(page).[0m[3m[34mget[0m().[0m[3m[34mfirst[0m()
} [0m[35melse[0m {
[0m[33m3[0m [0m[36m>[0m [0m[3m[34mcounter[0m(page).[0m[3m[34mget[0m().[0m[3m[34mfirst[0m()
}
}
and then passing has-notice value to my template as desired
I guess that works. I was going to propose having a second state, that is updated in the header
?r ```
#let plain-page = state("plain-page", false)
#let is-plain-page = state("is-plain-page")
#let (header-even, header-odd) = ("Even", "Odd")
#let first-page() = 2 > counter(page).get().first()
#let page-number() = counter(page).display("1")
#let style-page() = not first-page() and not plain-page.at(here())
#set page(header: context {
set text(fill: gray)
if style-page() {
if calc.even(..counter(page).get()) {
set text(weight: "light")
header-even + h(1fr) + page-number()
} else {
set text(weight: "light")
page-number() + h(1fr) + header-odd
}
is-plain-page.update(false)
} else {
is-plain-page.update(true)
}
})
#set page(footer: context {
set text(fill: gray)
if not is-plain-page.at(here()) {
set text(weight: "light")
align(center, "Footer")
}
})
Title Page
#plain-page.update(_ => true)
#pagebreak()
Note page // This section is optional, when present it shouldn't have nor footer nor header
#plain-page.update(_ => false)
#pagebreak()
Normal page // Has footer and header
#pagebreak()
Normal page // Has footer and header
