diff --git a/slides_template/trantor.sty b/slides_template/trantor.sty index bee92c0..6aba083 100644 --- a/slides_template/trantor.sty +++ b/slides_template/trantor.sty @@ -48,6 +48,14 @@ % itemize/enumerate labels in the body colour rather than the class default \AddToHook{begindocument}{\colorlet{structure}{TrantorDark}} +% \alert in the accent colour rather than the class's red, as metropolis +% coloured alerted text from the theme palette +\AddToHook{begindocument}{\colorlet{alert}{TrantorAccent}} + +% beamer set quotations in italic; ported decks expect it +\AddToHook{env/quote/begin}{\itshape} +\AddToHook{env/quotation/begin}{\itshape} + % -- Header bar carrying the frame title (hidden on plain pages). % headsep is what pads under the title; the height key alone only pads above. \geometry{headsep=10pt} @@ -64,6 +72,41 @@ \EditInstance{frametitle}{header}{after-vspace = 6mm minus 3mm}% } +% -- A frame with no \frametitle gets no header band. ltx-talk draws it +% unconditionally, which leaves an empty dark slab across the top of every +% full-bleed image slide. metropolis omitted the bar on untitled frames and +% decks are written expecting that. \trantorEmptyHeadertrue restores the bar. +% +% The band is drawn from \@oddhead, so this replaces \ps@talk; \pagestyle has +% to be re-issued for the new definition to take. +\newif\iftrantorEmptyHeader +\trantorEmptyHeaderfalse + +\ExplSyntaxOn +\cs_new_protected:Npn \trantor@header + { + \iftrantorEmptyHeader + \UseInstance { header } { std } + \else + % Guard the class internal: a class change should not make this an error. + \cs_if_exist:NTF \g__talk_frame_title_tl + { + \tl_if_empty:NF \g__talk_frame_title_tl + { \UseInstance { header } { std } } + } + { \UseInstance { header } { std } } + \fi + } +\cs_set_nopar:Npn \ps@talk + { + \cs_set_nopar:Npn \@oddhead { \trantor@header \hfil } + \cs_set_nopar:Npn \@oddfoot { \UseInstance { footer } { std } } + \cs_set_eq:NN \@evenhead \@oddhead + \cs_set_eq:NN \@evenfoot \@oddfoot + } +\ExplSyntaxOff +\pagestyle{talk} + % Like \frametitle, but forces a gap below the title on packed slides where the % header's own spacing collapses. The \par gets us into vertical mode first. \NewDocumentCommand\stitle{m}{\frametitle{#1}\par\addvspace{4mm}} @@ -99,6 +142,8 @@ % -- \appendix: frames after it are numbered among themselves and left out of % the total. The count travels through the aux file, so it settles on the % second run. +% ltx-talk gained its own \appendix upstream after 0.3.12; once a release +% ships it, revisit this in favour of the class's version. \newif\iftrantorAppendix \trantorAppendixfalse \newcommand\trantorMainFrames{\@totalframes} @@ -107,6 +152,30 @@ \global\trantorAppendixtrue \protected@write\@auxout{}{% \string\gdef\string\trantorMainFrames{\the\value{frame}}}% + \protected@write\@auxout{}{% + \string\gdef\string\trantorMainPanels{\the\value{trantorpanels}}}% +} + +% -- Panels (standout pages) stay out of the frame numbering, as under +% metropolis, which set noframenumbering on standout frames. The class's frame +% counter cannot be touched -- notes and property records key on it -- so the +% panels are counted separately and subtracted for display. The totals travel +% through the aux file like \trantorMainFrames does. +\newcounter{trantorpanels} +\newcounter{trantorpanellast} +\newcommand\trantorTotalPanels{0} +\newcommand\trantorMainPanels{\trantorTotalPanels} +% \immediate: a deferred write would wait for a shipout that never comes. +\AtEndDocument{% + \immediate\write\@auxout{% + \string\gdef\string\trantorTotalPanels{\the\value{trantorpanels}}}% +} +% Count each panel frame once, though the body may run once per slide. +\newcommand\trantor@countpanel{% + \ifnum\value{trantorpanellast}=\value{frame}\else + \stepcounter{trantorpanels}% \stepcounter and \setcounter act globally + \setcounter{trantorpanellast}{\value{frame}}% + \fi } % Count registers, not macros: pgfmath expands while parsing, and a macro @@ -116,11 +185,13 @@ \newcommand\trantor@setcounts{% \iftrantorAppendix - \trantor@n=\numexpr\value{frame}-\trantorMainFrames\relax - \trantor@d=\numexpr\@totalframes-\trantorMainFrames\relax + \trantor@n=\numexpr\value{frame}-\trantorMainFrames + -\value{trantorpanels}+\trantorMainPanels\relax + \trantor@d=\numexpr\@totalframes-\trantorMainFrames + -\trantorTotalPanels+\trantorMainPanels\relax \else - \trantor@n=\value{frame}\relax - \trantor@d=\numexpr\trantorMainFrames\relax + \trantor@n=\numexpr\value{frame}-\value{trantorpanels}\relax + \trantor@d=\numexpr\trantorMainFrames-\trantorMainPanels\relax \fi } @@ -210,6 +281,27 @@ \ExplSyntaxOff +% Run #1 inside the current frame if there is one, else inside a fresh frame. +% Mirrors the class's \maketitle, so a document can wrap any of these in its +% own frame and add content alongside -- a \note, or \footline for a revision +% stamp -- following the beamer idiom. +\ExplSyntaxOn +\cs_new_protected:Npn \trantor@inframe #1 + { + \bool_if:NTF \l__talk_frame_bool + {#1} + { \begin { frame } #1 \end { frame } } + } +\ExplSyntaxOff + +% \plainpage: suppress the footer progress bar and frame number on the current +% frame's pages, as the title, standout, and divider pages do. Use it at the +% top of a frame, e.g. one holding a full-bleed image. +\NewDocumentCommand\plainpage{}{% + \global\trantorPlainPagetrue + \thispagestyle{plain}% +} + % -- Title page. Drop a logo.png next to your slides, or redefine \titlelogo. \newcommand{\titlelogo}{% \IfFileExists{logo.png} @@ -217,9 +309,8 @@ } \renewcommand{\maketitle}{% - \global\trantorPlainPagetrue - \begin{frame}{}% - \thispagestyle{plain}% + \trantor@inframe{% + \plainpage \vfill \hspace*{0.04\paperwidth}% \begin{minipage}{0.82\paperwidth} @@ -251,18 +342,23 @@ \end{minipage}% \end{minipage}% \hspace*{0.04\paperwidth}% - \vspace{0.12\paperheight}% - \end{frame}% + % shrinkable, so a long author block compresses this space instead of + % overfilling the fixed frame height + \vspace{0.12\paperheight minus 0.08\paperheight}% + }% } % -- A full-bleed dark panel with the given body centred in a minipage of the % given width. \NewDocumentCommand \trantor@panel { m +m } {% - \global\trantorPlainPagetrue - \begin{frame}{}% - \thispagestyle{plain}% + \trantor@inframe{% + \plainpage + \trantor@countpanel \noindent - \begin{tikzpicture} + % overlay=false explicitly: the panel is positioned from its bounding box, + % so it breaks if the document sets \tikzstyle{every picture}+=[overlay], + % which decks ported from beamer commonly do. + \begin{tikzpicture}[overlay=false, remember picture=false] \useasboundingbox (0,0) rectangle (\linewidth,-\textheight); \fill[TrantorDark] (-\Gm@lmargin, \paperheight) @@ -276,26 +372,29 @@ \end{minipage}% }; \end{tikzpicture}% - \end{frame}% + }% } % -- Divider pages: the section title over a progress bar, set on the ordinary % light background. Not plain pages: the footer bar and frame number stay. +% Like the class's \maketitle, the dividers work inside a frame the document +% opened itself, so beamer's \begin{frame}\sectionpage\note{...}\end{frame} +% idiom carries over. Called between frames, they open their own. \NewDocumentCommand \trantor@divider { +m } {% - \begin{frame}{}% + \trantor@inframe{% \thispagestyle{plain}% \vfill \centering \begin{minipage}{0.52\linewidth}% \raggedright - {\headerfont\Large\bfseries\trantorSectionTitle\par}% + {\color{TrantorDark}\headerfont\Large\bfseries\trantorSectionTitle\par}% \vspace{0.4em}% \trantorProgressBar{\linewidth}% #1% \end{minipage}% \par \vfill - \end{frame}% + }% } \NewDocumentCommand \sectionpage { } { \trantor@divider{} } @@ -304,7 +403,7 @@ \NewDocumentCommand \subsectionpage { } {% \trantor@divider{% \par\vspace{0.8em}% - {\headerfont\large\bfseries\trantorSubsectionTitle\par}% + {\color{TrantorDark}\headerfont\large\bfseries\trantorSubsectionTitle\par}% }% }