% \iffalse meta-comment % % File: tamu-talk.dtx Copyright (C) 2026 Wyatt Smith % % It may be distributed and/or modified under the conditions of the % LaTeX Project Public License (LPPL), either version 1.3c of this % license or (at your option) any later version. The latest version % of this license is in the file % % https://www.latex-project.org/lppl.txt % % This work has the LPPL maintenance status "maintained". % The Current Maintainer of this work is Wyatt Smith (216wsmith@gmail.com). % % This file is part of the "tamu-talk bundle" (The Work in LPPL) % and all files in that bundle must be distributed together. % % ----------------------------------------------------------------------- % % The development version of the bundle can be found at % % https://github.com/wsmith-sch/tamu-talk % % ----------------------------------------------------------------------- % %<*driver> \documentclass{l3doc} \begin{document} \DocInput{\jobname.dtx} \end{document} % % \fi % % \title{The \pkg{tamu-talk} package: code} % \author{Wyatt Smith\thanks{E-mail: \href{mailto:216wsmith@gmail.com}{216wsmith@gmail.com}}} % \date{Released 2026-10-24 (v0.1.0)} % % \maketitle % % \begin{documentation} % % \pkg{tamu-talk} is an independently maintained Texas A\&M theme for the % \pkg{ltx-talk} class. This document is its code. For how to use it, see % the user guide, \texttt{tamu-talk-doc.pdf} (\texttt{texdoc tamu-talk}). % The code is split into smaller packages, which \pkg{tamu-talk} loads in % order. % % \end{documentation} % % \begin{implementation} % % \section{\pkg{tamu-talk}: Main package} % % \begin{macrocode} %<*package> %<@@=tamu_talk> \ProvidesExplPackage {tamu-talk} {2026-10-24} {0.1.0} {A TAMU theme for ltx-talk} \RequirePackage {tamu-talk-compat} \RequirePackage {tamu-talk-colors} \RequirePackage {tamu-talk-boxes} \RequirePackage {tamu-talk-titlepage} \RequirePackage {tamu-talk-header} \RequirePackage {tamu-talk-footer} \RequirePackage {tamu-talk-options} % \end{macrocode} % % Apply options given when the package is loaded. % % \begin{macrocode} \ProcessKeyOptions [tamu-talk] % % \end{macrocode} % % \section{\pkg{tamu-talk-compat}: Class and version checks} % % \begin{macrocode} %<*compat> %<@@=tamu_talk> \ProvidesExplPackage {tamu-talk-compat} {2026-10-24} {0.1.0} {ltx-talk version guard for tamu-talk} % \end{macrocode} % % Stop with a clear error unless the class is \pkg{ltx-talk}, and recent % enough. % % \begin{macrocode} \msg_new:nnnn {tamu-talk} {wrong-class} { The~'tamu-talk'~package~requires~the~'ltx-talk'~class. } { Load~the~class~first:~\iow_char:N\\documentclass{ltx-talk}.~ For~Beamer~presentations,~try~the~'beamerthemetamu'~theme~instead. } \IfClassLoadedTF {ltx-talk} { } { \msg_fatal:nn {tamu-talk} {wrong-class} } \msg_new:nnnn {tamu-talk} {ltx-talk-too-old} { tamu-talk~requires~ltx-talk~2026-09-10~or~later. } { tamu-talk~was~developed~against~ltx-talk~2026-09-10~and~has~not~ been~checked~against~older~releases.~Update~ltx-talk,~e.g.~with~ 'tlmgr~update~ltx-talk'. } \IfClassAtLeastTF {ltx-talk} {2026-09-10} { } { \msg_error:nn {tamu-talk} {ltx-talk-too-old} } % % \end{macrocode} % % \section{\pkg{tamu-talk-colors}: Colors} % % \begin{macrocode} %<*colors> %<@@=tamu_talk> \ProvidesExplPackage {tamu-talk-colors} {2026-10-24} {0.1.0} {TAMU brand colors for tamu-talk} \DeclareColor {TAMUMaroon} [HTML] {500000} \DeclareColor {TAMUNearBlack} [HTML] {202020} \DeclareColor {TAMUDarkGray} [HTML] {3E3E3E} \DeclareColor {TAMUGray} [HTML] {707070} \DeclareColor {TAMULightGray} [HTML] {D1D1D1} \DeclareColor {TAMUTan} [HTML] {D6D3C4} % \end{macrocode} % % Off-brand accent colors, meant to pair with \texttt{TAMUMaroon}. % % \begin{macrocode} \DeclareColor {forest} [HTML] {2F4F3E} \DeclareColor {slate} [HTML] {3B5875} \DeclareColor {structure} {TAMUMaroon} % % \end{macrocode} % % \section{\pkg{tamu-talk-boxes}: Boxes} % % Just a few named \pkg{tcolorbox} environments that look good on slides and % use our color palette. % % \begin{macrocode} %<*boxes> %<@@=tamu_talk> \ProvidesPackage{tamu-talk-boxes}[2026-10-24 v0.1.0 tcolorbox environments for tamu-talk] \RequirePackage{tcolorbox} \tcbuselibrary{skins, breakable} \newtcolorbox{headerbox}[1]{ enhanced, colback = TAMUTan!15, colframe = TAMUMaroon, coltitle = white, colbacktitle = TAMUMaroon, fonttitle = \bfseries, arc = 0pt, boxrule = 1pt, title = {#1}, } \tcbset{ tamu-lasso/maroon/.style = { colframe = TAMUMaroon, coltitle = TAMUMaroon } , tamu-lasso/black/.style = { colframe = TAMUNearBlack, coltitle = TAMUNearBlack } , } \newtcolorbox{lasso}[2][maroon]{ skin = enhanced jigsaw, colback = white, colbacktitle = white, boxrule = 0.5mm, arc = 0mm, tamu-lasso/#1, attach boxed title to top left = {xshift=4mm, yshift=-2.75mm}, boxed title style = {boxrule=0.4pt}, title = {\textbf{#2}}, } % \end{macrocode} % % Color shortcuts for \texttt{sidebar}. % % \begin{macrocode} \tcbset{ forest/.style = { colback = forest!15, borderline west = {3pt}{0pt}{forest} } , slate/.style = { colback = slate!15, borderline west = {3pt}{0pt}{slate} } , } \newtcolorbox{sidebar}[1][]{ enhanced, sharp corners, boxrule = 0pt, frame hidden, colback = TAMUTan!20, borderline west = {3pt}{0pt}{TAMUMaroon}, left = 10pt, right = 8pt, top = 6pt, bottom = 6pt, #1, } \newtcolorbox{elevate}[1][]{ enhanced, colback = white, colframe = TAMUMaroon, arc = 2mm, boxrule = .5pt, drop shadow, IfEmptyTF = {#1} { } { title = {#1}, colbacktitle = TAMUMaroon, coltitle = white, fonttitle = \bfseries, }, } \newtcolorbox{outline}[1][.75pt]{ enhanced, colback = white, colframe = TAMUMaroon, boxrule = #1, arc = 0pt, } % % \end{macrocode} % % \section{\pkg{tamu-talk-titlepage}: Title page} % % \begin{macrocode} %<*titlepage> %<@@=tamu_talk> \ProvidesExplPackage {tamu-talk-titlepage} {2026-10-24} {0.1.0} {Title page styling for tamu-talk} \RequirePackage {graphicx} \RequirePackage {tcolorbox} \bool_new:N \g_tamu_talk_title_bold_bool \cs_new_protected:Npn \__tamu_talk_title_font: { \Large \bool_if:NT \g_tamu_talk_title_bold_bool { \bfseries } } \cs_new_protected:Npn \__tamu_talk_titlepage_set_size:N #1 { \fontsize { \dim_use:N #1 } { \dim_eval:n { 1.2 #1 } } \selectfont } \cs_new_protected:Npn \__tamu_talk_titlepage_title_font: { \__tamu_talk_titlepage_set_size:N \l_tamu_talk_titlepage_title_size_dim \bool_if:NT \g_tamu_talk_title_bold_bool { \bfseries } } \cs_new_protected:Npn \__tamu_talk_titlepage_subtitle_font: { \__tamu_talk_titlepage_set_size:N \l_tamu_talk_titlepage_subtitle_size_dim } \bool_new:N \g_tamu_talk_title_box_bool \str_new:N \g_tamu_talk_title_logo_str \tl_new:N \g_tamu_talk_logo_file_tl \tl_new:N \l__tamu_talk_logo_path_tl \bool_new:N \l__tamu_talk_titlepage_logo_bool \box_new:N \l__tamu_talk_titlepage_logo_box \box_new:N \l__tamu_talk_titlepage_text_box \box_new:N \l__tamu_talk_titlepage_tail_box % \end{macrocode} % % \cs{institute} is optional, so make sure \cs{@institute} exists. % % \begin{macrocode} \tl_if_exist:NF \@institute { \tl_gclear:N \@institute } % \end{macrocode} % % Make sure neither the banner nor the page counter shows up on the % title page. % % \begin{macrocode} \cs_new_nopar:Npn \ps@tamu { \cs_set_nopar:Npn \@oddhead { \hfil } \cs_set_nopar:Npn \@oddfoot { } \cs_set_eq:NN \@evenhead \@oddhead \cs_set_eq:NN \@evenfoot \@oddfoot } % \end{macrocode} % % \subsection{Logo} % % The Texas A\&M logo is trademarked and not distributed with % \pkg{tamu-talk}. Look for the file given by \texttt{logo-file}, as is % or with a common extension, and leave \cs{l__tamu_talk_logo_path_tl} % empty if not found. % % \begin{macrocode} \msg_new:nnn {tamu-talk} {logo-missing} { Logo~file~'#1'~not~found;~see~'texdoc~tamu-talk'. } \cs_new_protected:Npn \__tamu_talk_logo_find: { \tl_clear:N \l__tamu_talk_logo_path_tl \tl_map_inline:nn { {} {.pdf} {.png} {.jpg} } { \file_if_exist:nT { \g_tamu_talk_logo_file_tl ##1 } { \tl_set:Ne \l__tamu_talk_logo_path_tl { \g_tamu_talk_logo_file_tl ##1 } \tl_map_break: } } } \cs_new_protected:Npn \__tamu_talk_logo_include:n #1 { % marking as an artifact seems appropriate here \includegraphics [ artifact, pagebox = artbox, width = \l_tamu_talk_titlepage_logo_width_dim ] {#1} } \cs_generate_variant:Nn \__tamu_talk_logo_include:n { V } % \end{macrocode} % % Placeholder: a light gray box roughly the shape of the logo, with a % note pointing at the docs. % % \begin{macrocode} \cs_new_protected:Npn \__tamu_talk_logo_placeholder_line:n #1 { \hbox_to_wd:nn { \l_tamu_talk_titlepage_logo_width_dim } { \hss #1 \hss } } \cs_new_protected:Npn \__tamu_talk_logo_placeholder: { \hbox_overlap_right:n { \color_select:n { TAMULightGray } \rule { \l_tamu_talk_titlepage_logo_width_dim } { \dim_eval:n { 0.8 \l_tamu_talk_titlepage_logo_width_dim } } } \vbox_to_ht:nn { \dim_eval:n { 0.8 \l_tamu_talk_titlepage_logo_width_dim } } { \vss \color_select:n { TAMUDarkGray } \scriptsize \__tamu_talk_logo_placeholder_line:n { Logo~file~not~found. } \__tamu_talk_logo_placeholder_line:n { See~\texttt{texdoc~tamu-talk}. } \vss } } % \end{macrocode} % % Decide whether to show a logo, and fill the logo box. % % \begin{macrocode} \cs_new_protected:Npn \__tamu_talk_logo_setup: { \__tamu_talk_logo_find: \str_case:VnF \g_tamu_talk_title_logo_str { { auto } { \tl_if_empty:NTF \l__tamu_talk_logo_path_tl { \bool_set_false:N \l__tamu_talk_titlepage_logo_bool } { \bool_set_true:N \l__tamu_talk_titlepage_logo_bool } } { true } { \bool_set_true:N \l__tamu_talk_titlepage_logo_bool \tl_if_empty:NT \l__tamu_talk_logo_path_tl { \msg_warning:nnV {tamu-talk} {logo-missing} \g_tamu_talk_logo_file_tl } } } { \bool_set_false:N \l__tamu_talk_titlepage_logo_bool } \bool_if:NT \l__tamu_talk_titlepage_logo_bool { \hbox_set:Nn \l__tamu_talk_titlepage_logo_box { \tl_if_empty:NTF \l__tamu_talk_logo_path_tl { \__tamu_talk_logo_placeholder: } { \__tamu_talk_logo_include:V \l__tamu_talk_logo_path_tl } } } } % \end{macrocode} % % \subsection{Title block} % % Title (boxed or not), subtitle, author, institute, date. % % \begin{macrocode} \cs_new_protected:Npn \__tamu_talk_titlepage_text: { \centering \begin{center} \bool_if:NTF \g_tamu_talk_title_box_bool { \begin{tcolorbox} [ enhanced , colback = TAMUMaroon , colframe = TAMUMaroon , coltext = white , arc = 3mm , boxsep = 0pt , left = 8pt , right = 8pt , top = 8pt , bottom = 8pt , halign = center , ] \tag_struct_begin:n { tag = Title } {\__tamu_talk_titlepage_title_font: \@title \par} \tag_struct_end: \tl_if_empty:NF \@subtitle { \vskip .25em {\__tamu_talk_titlepage_subtitle_font: \@subtitle \par} } \end{tcolorbox} } { \tag_struct_begin:n { tag = Title } {\color{TAMUMaroon} \__tamu_talk_titlepage_title_font: \@title \par} \tag_struct_end: \tl_if_empty:NF \@subtitle { \vskip .25em {\__tamu_talk_titlepage_subtitle_font: \color{TAMUMaroon!70} \@subtitle \par} } } \end{center} {\@author \par} { \scriptsize \tl_if_empty:NTF \@institute { Texas~A\&M~University,~College~Station~TX } { \@institute } \par } \tl_if_empty:NF \@date { {\scriptsize \@date \par} } } % \end{macrocode} % % \subsection{Layout} % % Distance from the top of the slide to the top of the logo, which is % centered \texttt{logo-height} above the bottom of the page. % % \begin{macrocode} \cs_new:Npn \__tamu_talk_titlepage_logo_top: { \paperheight - \l_tamu_talk_titlepage_logo_height_dim - ( 1in + \voffset + \topmargin + \headheight + \headsep ) - \topskip - \box_ht_plus_dp:N \l__tamu_talk_titlepage_logo_box / 2 } % \end{macrocode} % % FIXME TODO: this code does not seem robust. % % \begin{macrocode} \cs_new_protected:Npn \__tamu_talk_titlepage_body:n #1 { \vfill \group_begin: \__tamu_talk_titlepage_text: \vskip .5em \begin{center} #1 \end{center} \group_end: \vfill } \prg_new_protected_conditional:Npnn \__tamu_talk_titlepage_if_crowded: { TF } { \tag_suspend:n { tamu-talk } \vbox_set:Nn \l__tamu_talk_titlepage_text_box { \__tamu_talk_titlepage_text: } \vbox_set:Nn \l__tamu_talk_titlepage_tail_box { \vskip .5em \begin{center} \phantom { \box_use:N \l__tamu_talk_titlepage_logo_box } \end{center} } \tag_resume:n { tamu-talk } \dim_compare:nNnTF { ( \textheight + \box_ht_plus_dp:N \l__tamu_talk_titlepage_text_box - \box_ht_plus_dp:N \l__tamu_talk_titlepage_tail_box ) / 2 + .5em } > { \__tamu_talk_titlepage_logo_top: } { \prg_return_true: } { \prg_return_false: } } \DeclareTemplateInterface {titlepage} {tamu} {0} { framestyle : tokenlist = tamu , title-size : length = 18pt , subtitle-size : length = 11pt , logo-width : length = .25\textwidth , logo-height : length = 28mm , } \DeclareTemplateCode {titlepage} {tamu} {0} { framestyle = \l_tamu_talk_titlepage_framestyle_tl , title-size = \l_tamu_talk_titlepage_title_size_dim , subtitle-size = \l_tamu_talk_titlepage_subtitle_size_dim , logo-width = \l_tamu_talk_titlepage_logo_width_dim , logo-height = \l_tamu_talk_titlepage_logo_height_dim , } { \tl_if_empty:NF \l_tamu_talk_titlepage_framestyle_tl { \exp_args:NV \thispagestyle \l_tamu_talk_titlepage_framestyle_tl } \__tamu_talk_logo_setup: \bool_if:NTF \l__tamu_talk_titlepage_logo_bool { \__tamu_talk_titlepage_if_crowded:TF { % long title: the logo follows the text instead \__tamu_talk_titlepage_body:n { \mode_leave_vertical: \box_use:N \l__tamu_talk_titlepage_logo_box } } { % logo at its fixed spot; a phantom holds its space under the text \vbox_to_zero:n { \skip_vertical:n { \__tamu_talk_titlepage_logo_top: } \hbox_to_wd:nn { \textwidth } { \hss \box_use:N \l__tamu_talk_titlepage_logo_box \hss } \vss } \__tamu_talk_titlepage_body:n { \phantom { \box_use:N \l__tamu_talk_titlepage_logo_box } } } } { \vfill \group_begin: \__tamu_talk_titlepage_text: \group_end: \vfill } } % \end{macrocode} % % Adapted from \pkg{ltx-talk}'s \cs{maketitle}: outside a frame, make one. % % \begin{macrocode} \ExpandArgs { Nne } \RenewDocumentCommand \maketitle { O {} } { \exp_not:N \bool_if:NTF \exp_not:N \l__talk_frame_bool { \exp_not:N \UseTemplate {titlepage} {tamu} { framestyle = tamu , #1 } } { \exp_not:N \begin {frame} \bool_if:NT \l__talk_frame_title_bool { { } } \exp_not:N \UseTemplate {titlepage} {tamu} { framestyle = tamu , #1 } \exp_not:N \end {frame} } } % % \end{macrocode} % % \section{\pkg{tamu-talk-header}: Header} % % \begin{macrocode} %<*header> %<@@=tamu_talk> \ProvidesExplPackage {tamu-talk-header} {2026-10-24} {0.1.0} {Header styling for tamu-talk} \DeclareTemplateInterface { frametitle } { tamu } { 1 } { after-vspace : skip = \bigskipamount , before-vspace : skip = 0em , color : tokenlist = , font : tokenlist = \Large \bfseries , vshift : length = 0pt , } \DeclareTemplateCode { frametitle } { tamu } { 1 } { after-vspace = \l_tamu_talk_frametitle_after_skip , before-vspace = \l_tamu_talk_frametitle_before_skip , color = \l_tamu_talk_frametitle_color_tl , font = \l_tamu_talk_frametitle_font_tl , vshift = \l_tamu_talk_frametitle_vshift_dim , } { \noindent \group_begin: \tl_if_empty:NF \l_tamu_talk_frametitle_color_tl { \color_select:V \l_tamu_talk_frametitle_color_tl } \l_tamu_talk_frametitle_font_tl \tl_if_blank:nF {#1} { \raise \l_tamu_talk_frametitle_vshift_dim \hbox { \__talk_frame_title:n {#1} } } \par \group_end: } \DeclareInstance { frametitle } { header } { tamu } { } \EditInstance {frametitle} {header} { font = \__tamu_talk_title_font: , vshift = 0pt , } % \end{macrocode} % % Pull the title text to the left. % % \begin{macrocode} \EditInstance {header} {std} { left-hspace = 6mm } % % \end{macrocode} % % \section{\pkg{tamu-talk-footer}: Footer} % % \begin{macrocode} %<*footer> %<@@=tamu_talk> \ProvidesExplPackage {tamu-talk-footer} {2026-10-24} {0.1.0} {Footer styling for tamu-talk} \cs_new:Npn \@spacer { } \DeclareInstance {footer-element} {spacer} {talk} { } \str_new:N \g_tamu_talk_page_numbers_str % \end{macrocode} % % ^^A TODO: letter the appendix sections (Appendix A, Appendix B, ...) % % \begin{macrocode} \cs_new:Npn \@framecount { \str_if_eq:VnTF \g_tamu_talk_page_numbers_str { total } { \theframe \, / \, \@frames } { \int_compare:nNnTF { \c@appendixframe } > 0 { A \theappendixframe } { \theframe } } } \DeclareInstance {footer-element} {framecount} {talk} { } % \end{macrocode} % % Use lining figures for the slide numbers, if the font needs them. % % \begin{macrocode} \cs_new_protected:Npn \__tamu_talk_lining_numbers: { \cs_if_exist:NT \addfontfeature { \addfontfeature { Numbers = Lining } } } \EditInstance {footer-element} {framecount} { font = \__tamu_talk_lining_numbers: } % % \end{macrocode} % % \section{\pkg{tamu-talk-options}: Options} % % \begin{macrocode} %<*options> %<@@=tamu_talk> \ProvidesExplPackage {tamu-talk-options} {2026-10-24} {0.1.0} {Option definitions for tamu-talk} % \end{macrocode} % % Turn the footer counter on and record which format to typeset. % % \begin{macrocode} \cs_new_protected:Npn \__tamu_talk_page_numbers_show:n #1 { \str_gset:Nn \g_tamu_talk_page_numbers_str {#1} \EditInstance {footer} {std} { element-order = {spacer, framecount} , separator = \hfill , right-hspace = 3mm , } } % \end{macrocode} % % The keys. What each one does is described in the user guide, % \texttt{tamu-talk-doc.pdf}. % % \begin{macrocode} \keys_define:nn {tamu-talk} { page-numbers .choice: , page-numbers / none .code:n = { \str_gset:Nn \g_tamu_talk_page_numbers_str { none } \EditInstance {footer} {std} { element-order = {} } } , page-numbers / current .code:n = { \__tamu_talk_page_numbers_show:n { current } } , page-numbers / total .code:n = { \__tamu_talk_page_numbers_show:n { total } } , page-numbers .initial:n = total , title-bold .bool_gset:N = \g_tamu_talk_title_bold_bool , title-bold .default:n = {true} , title-bold .initial:n = {false} , title-box .bool_gset:N = \g_tamu_talk_title_box_bool , title-box .default:n = {true} , title-box .initial:n = {true} , title-logo .choices:nn = { auto , true , false } { \str_gset:Ne \g_tamu_talk_title_logo_str { \l_keys_choice_tl } } , title-logo .default:n = true , title-logo .initial:n = auto , logo-file .tl_gset:N = \g_tamu_talk_logo_file_tl , logo-file .initial:n = tamu-logo , header-style .choice: , header-style / plain .code:n = { \EditInstance {header} {std} { background-color = {} , color = structure , height = \Gm@tmargin + \headsep , } \EditInstance {frametitle} {header} { vshift = 0pt } } , header-style / ribbon .code:n = { \EditInstance {header} {std} { background-color = TAMUMaroon , color = white , height = 6.65mm , } \EditInstance {frametitle} {header} { vshift = 0pt } } , header-style / banner .code:n = { \EditInstance {header} {std} { background-color = TAMUMaroon , color = white , height = \Gm@tmargin + \headsep , } \EditInstance {frametitle} {header} { vshift = 1.735mm } } , header-style .initial:n = banner , } % % \end{macrocode} % % \end{implementation}