touying-typ / touying

Touying is a powerful package for creating presentation slides in Typst.
https://touying-typ.github.io/
MIT License
620 stars 15 forks source link

feat: access subslide and repeat in footer and header #24

Closed OrangeX4 closed 6 months ago

OrangeX4 commented 6 months ago

Implement #21.

we can access subslide and repeat in footer by code like footer: self => self.subslide and footer: self => self.repeat.

ntjess commented 6 months ago

Perhaps the logic can be simplified by checking for auto first? Edit: Oops, handout should still point to last subslide. The patch is fixed in the edit

proposed.patch

Patch ```diff diff --git "a/.\\actual.typ" "b/.\\proposed.typ" index 6463457..becd9a2 100644 --- "a/.\\actual.typ" +++ "b/.\\proposed.typ" @@ -323,6 +323,12 @@ return (result-arr, max-repetitions) } +#let _get-header-footer(self) = { + let header = utils.call-or-display(self, self.page-args.at("header", default: none)) + let footer = utils.call-or-display(self, self.page-args.at("footer", default: none)) + (header, footer) +} + // touying-slide #let touying-slide( self: none, @@ -383,20 +389,6 @@ states._sections-step(repetitions) } } - // page header and footer - // for speed up, do not parse the content if repeat is none - if repeat == none { - self.repeat = repeat - self.subslide = 1 - let header = utils.call-or-display(self, self.page-args.at("header", default: none)) - let footer = utils.call-or-display(self, self.page-args.at("footer", default: none)) - return { - header = _update-states(1) + header - page(..(self.page-args + (header: header, footer: footer)), setting-with-pad( - page-preamble(1) + composer-with-side-by-side(..bodies) - )) - } - } // for single page slide, get the repetitions if repeat == auto { let (_, repetitions) = _parse-content( @@ -407,11 +399,22 @@ ) repeat = repetitions } + self.repeat = repeat + self.subslide = 1 + let (header, footer) = _get-header-footer(self) + // page header and footer + // for speed up, do not parse the content if repeat is none + if repeat == none { + return { + header = _update-states(1) + header + page(..(self.page-args + (header: header, footer: footer)), setting-with-pad( + page-preamble(1) + composer-with-side-by-side(..bodies) + )) + } + } + if self.handout { - self.repeat = repeat self.subslide = repeat - let header = utils.call-or-display(self, self.page-args.at("header", default: none)) - let footer = utils.call-or-display(self, self.page-args.at("footer", default: none)) let (conts, _) = _parse-content(self: self, index: repeat, ..bodies) header = _update-states(1) + header page(..(self.page-args + (header: header, footer: footer)), setting-with-pad( @@ -424,8 +427,7 @@ self.repeat = repeat for i in range(1, repeat + 1) { self.subslide = i - let header = utils.call-or-display(self, self.page-args.at("header", default: none)) - let footer = utils.call-or-display(self, self.page-args.at("footer", default: none)) + let (header, footer) = _get-header-footer(self) let new-header = header let (conts, _) = _parse-content(self: self, index: i, ..bodies) // update the counter in the first subslide ```
OrangeX4 commented 6 months ago

Yes, thanks. I've updated it