#Stateful footer/header in pages

8 messages · Page 1 of 1 (latest)

granite tangle
#

trying to do something fancy here, but the third page lacks header even if it has footoing, help or insight much appreciated science

#

?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
hard urchin
#

The header is rendered before anything on the page, including the state update, so plain-page is still false

granite tangle
#

hey thx kindly @hard urchin typstguy
i ended up solving it with something like:

#let first-page() = {
  if not has-notice {
    2 > counter(page).get().first()
  } else {
    3 > counter(page).get().first()
  }
}
#

and then passing has-notice value to my template as desired

hard urchin
#

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