mirror of
https://github.com/harvard-edge/cs249r_book.git
synced 2026-03-11 17:49:25 -05:00
- Remove Roman numeral frontmatter/mainmatter switching - Set Arabic page numbering in before-body-includes.tex - Simplify chapter command to just reset footnote counter - All pages now use regular numbers (1, 2, 3...) not (i, ii, iii...)
833 lines
33 KiB
TeX
833 lines
33 KiB
TeX
% =============================================================================
|
||
% LATEX HEADER CONFIGURATION FOR HARDWARE KITS PDF
|
||
% =============================================================================
|
||
% This file contains all LaTeX package imports, custom commands, and styling
|
||
% definitions for the PDF output of the Hardware Kits labs.
|
||
%
|
||
% Key Features:
|
||
% - Teal branding throughout (matching kits website)
|
||
% - Custom part/chapter/section styling
|
||
% - Professional table formatting with colored headers
|
||
% - Margin notes with custom styling
|
||
% - TikZ-based part dividers
|
||
% - Page numbering (Roman for frontmatter, Arabic for mainmatter)
|
||
%
|
||
% Note: This file is included via _quarto-pdf.yml and affects PDF output only.
|
||
% HTML/EPUB styling is handled separately via CSS files.
|
||
% =============================================================================
|
||
|
||
% =============================================================================
|
||
% PACKAGE IMPORTS
|
||
% =============================================================================
|
||
|
||
% Layout and positioning
|
||
% \usepackage[outercaption, ragged]{sidecap} % Commented out to make figure captions inline instead of in margin
|
||
\usepackage{adjustbox} % Adjusting box dimensions
|
||
\usepackage{afterpage} % Execute commands after page break
|
||
\usepackage{morefloats} % Increase number of floats
|
||
\usepackage{array} % Enhanced table column formatting
|
||
\usepackage{atbegshi} % Insert content at page beginning
|
||
%\usepackage{changepage} % Change page dimensions mid-document
|
||
\usepackage{emptypage} % Clear headers/footers on empty pages
|
||
|
||
% Language and text
|
||
\usepackage[english]{babel} % English language support
|
||
\usepackage{microtype} % Improved typography and hyphenation
|
||
|
||
% Captions and floats
|
||
\usepackage{caption}
|
||
% Caption styling configuration
|
||
%\captionsetup[table]{belowskip=5pt}
|
||
\captionsetup{format=plain}
|
||
\DeclareCaptionLabelFormat{mylabel}{#1
|
||
#2:\hspace{1.0ex}}
|
||
\DeclareCaptionFont{ninept}{\fontsize{7pt}{8}\selectfont #1}
|
||
|
||
% Figure captions: Small font, bold label, ragged right
|
||
\captionsetup[figure]{labelfont={bf,ninept},labelsep=space,
|
||
belowskip=2pt,aboveskip=6pt,labelformat=mylabel,
|
||
justification=raggedright,singlelinecheck=false,font={ninept}}
|
||
|
||
% Table captions: Small font, bold label, ragged right
|
||
\captionsetup[table]{belowskip=6pt,labelfont={bf,ninept},labelsep=none,
|
||
labelformat=mylabel,justification=raggedright,singlelinecheck=false,font={ninept}}
|
||
|
||
% Typography fine-tuning
|
||
\emergencystretch=5pt % Allow extra stretch to avoid overfull boxes
|
||
|
||
% Utility packages
|
||
\usepackage{etoolbox} % For patching commands and environments
|
||
|
||
% Page layout and headers
|
||
\usepackage{fancyhdr} % Custom headers and footers
|
||
\usepackage{geometry} % Page dimensions and margins
|
||
|
||
% Graphics and figures
|
||
\usepackage{graphicx} % Include graphics
|
||
\usepackage{float} % Improved float placement
|
||
\usepackage[skins,breakable]{tcolorbox} % Coloured and framed text boxes
|
||
\tcbset{before upper=\setlength{\parskip}{3pt}}
|
||
|
||
% Tables
|
||
\usepackage{longtable} % Multi-page tables
|
||
|
||
% Fonts and typography
|
||
\usepackage{fontspec} % Font selection for LuaLaTeX
|
||
\usepackage{mathptmx} % Times-like math fonts
|
||
\usepackage{newpxtext} % Palatino-like font for body text
|
||
|
||
% Colors and visual elements
|
||
\usepackage[dvipsnames]{xcolor} % Extended color support
|
||
\usepackage{tikz} % Programmatic graphics
|
||
\usetikzlibrary{positioning}
|
||
\usetikzlibrary{calc}
|
||
\usepackage{tikzpagenodes} % TikZ positioning relative to page
|
||
|
||
% Code listings
|
||
\usepackage{listings} % Code highlighting
|
||
|
||
% Hyperlinks
|
||
\usepackage{hyperref} % Clickable links in PDF
|
||
|
||
% Conditional logic
|
||
\usepackage{ifthen} % If-then-else commands
|
||
|
||
% Math symbols
|
||
\usepackage{amsmath} % AMS math extensions
|
||
\usepackage{amssymb} % AMS math symbols
|
||
\usepackage{latexsym} % Additional LaTeX symbols
|
||
\usepackage{pifont} % Zapf Dingbats symbols
|
||
\providecommand{\blacklozenge}{\ding{117}} % Black diamond symbol
|
||
|
||
% Lists
|
||
\usepackage{enumitem} % Customizable lists
|
||
|
||
% Margin notes and sidenotes
|
||
\usepackage{marginfix} % Fixes margin note overflow
|
||
\usepackage{marginnote} % Margin notes
|
||
\usepackage{sidenotes} % Academic-style sidenotes
|
||
\renewcommand\raggedrightmarginnote{\sloppy}
|
||
\renewcommand\raggedleftmarginnote{\sloppy}
|
||
|
||
% Typography improvements
|
||
\usepackage{ragged2e} % Better ragged text
|
||
\usepackage[all]{nowidow} % Prevent widows and orphans
|
||
\usepackage{needspace} % Ensure minimum space on page
|
||
|
||
% Section formatting
|
||
\usepackage[explicit]{titlesec} % Custom section titles
|
||
\usepackage{tocloft} % Table of contents formatting
|
||
|
||
% QR codes and icons
|
||
\usepackage{fontawesome5} % Font Awesome icons
|
||
\usepackage{qrcode} % QR code generation
|
||
\qrset{link, height=15mm}
|
||
|
||
% =============================================================================
|
||
% FLOAT CONFIGURATION
|
||
% =============================================================================
|
||
% Allow more floats per page to handle figure-heavy chapters
|
||
\extrafloats{100}
|
||
\setcounter{topnumber}{10} % Max floats at top of page
|
||
\setcounter{bottomnumber}{10} % Max floats at bottom of page
|
||
\setcounter{totalnumber}{20} % Max floats per page
|
||
\renewcommand{\topfraction}{.9} % Max fraction of page for top floats
|
||
\renewcommand{\bottomfraction}{.9}
|
||
\renewcommand{\textfraction}{.1} % Min fraction of page for text
|
||
\renewcommand{\floatpagefraction}{.8} % Min fraction of float page
|
||
|
||
% =============================================================================
|
||
% COLOR DEFINITIONS
|
||
% =============================================================================
|
||
% Teal - primary brand color for Hardware Kits (matching website)
|
||
\definecolor{crimson}{HTML}{0d9488}
|
||
|
||
% Quiz element colors
|
||
\definecolor{quiz-question-color1}{RGB}{225,243,248} % Light blue background
|
||
\definecolor{quiz-question-color2}{RGB}{17,158,199} % Blue border
|
||
\definecolor{quiz-answer-color1}{RGB}{250,234,241} % Light pink background
|
||
\definecolor{quiz-answer-color2}{RGB}{152,14,90} % Magenta border
|
||
|
||
% =============================================================================
|
||
% LIST FORMATTING
|
||
% =============================================================================
|
||
% Tighter list spacing for academic style
|
||
\def\tightlist{}
|
||
\setlist{itemsep=1pt, parsep=1pt, topsep=0pt,after={\vspace{0.3\baselineskip}}}
|
||
\let\tightlist\relax
|
||
|
||
\makeatletter
|
||
\@ifpackageloaded{framed}{}{\usepackage{framed}}
|
||
\@ifpackageloaded{fancyvrb}{}{\usepackage{fancyvrb}}
|
||
\makeatother
|
||
|
||
\makeatletter
|
||
%New float "codelisting" has been updated
|
||
\AtBeginDocument{%
|
||
\floatstyle{ruled}
|
||
\newfloat{codelisting}{!htb}{lop}
|
||
\floatname{codelisting}{Listing}
|
||
\floatplacement{codelisting}{!htb}
|
||
\captionsetup[codelisting]{labelfont={bf,ninept},labelformat=mylabel,
|
||
singlelinecheck=false,width=\linewidth,labelsep=none,font={ninept}}%
|
||
\renewenvironment{snugshade}{%
|
||
\def\OuterFrameSep{3pt}%
|
||
\def\FrameCommand{\fboxsep=5pt\colorbox{shadecolor}}%
|
||
\MakeFramed{\advance\hsize-\width\FrameRestore}%
|
||
\leftskip 0.5em \rightskip 0.5em%
|
||
\small% decrease font size
|
||
}{\endMakeFramed}%
|
||
}
|
||
\makeatother
|
||
|
||
%The space before and after the verbatim environment "Highlighting" has been reduced
|
||
\fvset{listparameters=\setlength{\topsep}{0pt}\setlength{\partopsep}{0pt}}
|
||
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{framesep=0mm,commandchars=\\\{\}}
|
||
|
||
\makeatletter
|
||
\renewcommand\fs@ruled{\def\@fs@cfont{\bfseries}\let\@fs@capt\floatc@ruled
|
||
\def\@fs@pre{\hrule height.8pt depth0pt \kern2pt}%
|
||
\def\@fs@post{\kern2pt\hrule\relax}%
|
||
\def\@fs@mid{\kern2pt\hrule\kern1pt}%space between float and caption
|
||
\let\@fs@iftopcapt\iftrue}
|
||
\makeatother
|
||
|
||
|
||
% =============================================================================
|
||
% HYPHENATION RULES
|
||
% =============================================================================
|
||
% Explicit hyphenation points for technical terms to avoid bad breaks
|
||
\hyphenation{
|
||
light-weight
|
||
light-weight-ed
|
||
de-vel-op-ment
|
||
un-der-stand-ing
|
||
mod-els
|
||
prin-ci-ples
|
||
ex-per-tise
|
||
com-pli-cat-ed
|
||
blue-print
|
||
per‧for‧mance
|
||
com-mu-ni-ca-tion
|
||
par-a-digms
|
||
hy-per-ten-sion
|
||
a-chieved
|
||
}
|
||
|
||
% =============================================================================
|
||
% CODE LISTING CONFIGURATION
|
||
% =============================================================================
|
||
% Settings for code blocks using listings package
|
||
\lstset{
|
||
breaklines=true, % Automatic line wrapping
|
||
breakatwhitespace=true, % Break at whitespace only
|
||
basicstyle=\ttfamily, % Monospace font
|
||
frame=none, % No frame around code
|
||
keepspaces=true, % Preserve spaces
|
||
showspaces=false, % Don't show space characters
|
||
showtabs=false, % Don't show tab characters
|
||
columns=flexible, % Flexible column width
|
||
belowskip=0pt, % Minimal spacing
|
||
aboveskip=0pt
|
||
}
|
||
|
||
% =============================================================================
|
||
% PAGE GEOMETRY
|
||
% =============================================================================
|
||
% Book dimensions optimized for print (7.5" × 9.25")
|
||
% Wide outer margin for sidenotes (1.5")
|
||
\geometry{
|
||
paperwidth=7.5in,
|
||
paperheight=9.25in,
|
||
top=1in,
|
||
bottom=1in,
|
||
inner=1in, % Inner margin (binding side)
|
||
outer=2.25in, % Outer margin (includes 1.5" for sidenotes)
|
||
footskip=30pt,
|
||
marginparwidth=1.5in, % Width for margin notes
|
||
twoside % Different left/right pages
|
||
}
|
||
|
||
% =============================================================================
|
||
% SIDENOTE STYLING
|
||
% =============================================================================
|
||
% Custom sidenote design with crimson vertical bar
|
||
\renewcommand{\thefootnote}{\textcolor{crimson}{\arabic{footnote}}}
|
||
|
||
% Save original sidenote command
|
||
\makeatletter
|
||
\@ifundefined{oldsidenote}{
|
||
\let\oldsidenote\sidenote%
|
||
}{}
|
||
\makeatother
|
||
|
||
% Redefine sidenote with vertical crimson bar
|
||
\renewcommand{\sidenote}[1]{%
|
||
\oldsidenote{%
|
||
\noindent
|
||
\color{crimson!100} % Crimson vertical line
|
||
\raisebox{0em}{%
|
||
\rule{0.5pt}{1.5em} % Thin vertical line
|
||
}
|
||
\hspace{0.3em} % Space after line
|
||
\color{black} % Reset text color
|
||
\footnotesize #1 % Sidenote content
|
||
}%
|
||
}
|
||
|
||
% =============================================================================
|
||
% FIGURE ENVIRONMENT FIX
|
||
% =============================================================================
|
||
% Fix for caption display bug on even pages
|
||
\makeatletter
|
||
\let\oldfigure\figure%
|
||
\let\endoldfigure\endfigure%
|
||
\renewenvironment{figure}[1][htbp]{%
|
||
\oldfigure[#1]%
|
||
}{%
|
||
\endoldfigure%
|
||
}
|
||
\makeatother
|
||
|
||
% =============================================================================
|
||
% PAGE HEADERS AND FOOTERS
|
||
% =============================================================================
|
||
% Ensure chapters use fancy page style (not plain)
|
||
\patchcmd{\chapter}{\thispagestyle{plain}}{\thispagestyle{fancy}}{}{}
|
||
|
||
% Main page style with crimson headers
|
||
\pagestyle{fancy}
|
||
\fancyhf{} % Clear all
|
||
\fancyhead[LE]{\small\color{crimson}\nouppercase{\rightmark}} % Left even: section
|
||
\fancyhead[RO]{\color{crimson}\thepage} % Right odd: page number
|
||
\fancyhead[LO]{\small\color{crimson}\nouppercase{\leftmark}} % Left odd: chapter
|
||
\fancyhead[RE]{\color{crimson}\thepage} % Right even: page number
|
||
\renewcommand{\headrulewidth}{0.4pt} % Thin header line
|
||
\renewcommand{\footrulewidth}{0pt} % No footer line
|
||
|
||
% Plain page style (for chapter openings)
|
||
\fancypagestyle{plain}{
|
||
\fancyhf{}
|
||
\fancyfoot[C]{\color{crimson}\thepage} % Centered page number
|
||
\renewcommand{\headrulewidth}{0pt}
|
||
\renewcommand{\footrulewidth}{0pt}
|
||
}
|
||
|
||
% =============================================================================
|
||
% KOMA-SCRIPT FONT ADJUSTMENTS
|
||
% =============================================================================
|
||
% Apply crimson color to all heading levels
|
||
\addtokomafont{disposition}{\rmfamily\color{crimson}}
|
||
\addtokomafont{chapter}{\color{crimson}}
|
||
\addtokomafont{section}{\color{crimson}}
|
||
\addtokomafont{subsection}{\color{crimson}}
|
||
|
||
% =============================================================================
|
||
% ABSTRACT ENVIRONMENT
|
||
% =============================================================================
|
||
\newenvironment{abstract}{
|
||
\chapter*{\abstractname}
|
||
\addcontentsline{toc}{chapter}{\abstractname}
|
||
\small
|
||
}{
|
||
\clearpage
|
||
}
|
||
|
||
% =============================================================================
|
||
% HYPERLINK CONFIGURATION
|
||
% =============================================================================
|
||
% Crimson-colored links throughout, two-page PDF layout
|
||
\hypersetup{
|
||
linkcolor=crimson,
|
||
citecolor=crimson,
|
||
urlcolor=crimson,
|
||
pdfpagelayout=TwoPageRight, % Two-page spread view
|
||
pdfstartview=Fit % Initial zoom fits page
|
||
}
|
||
|
||
% =============================================================================
|
||
% PART SUMMARY SYSTEM
|
||
% =============================================================================
|
||
% Allows adding descriptive text below part titles
|
||
\newcommand{\partsummary}{} % Empty by default
|
||
\newif\ifhaspartsummary%
|
||
\haspartsummaryfalse%
|
||
|
||
\newcommand{\setpartsummary}[1]{%
|
||
\renewcommand{\partsummary}{#1}%
|
||
\haspartsummarytrue%
|
||
}
|
||
|
||
% Additional colors for part page backgrounds
|
||
\definecolor{BrownLL}{RGB}{233,222,220}
|
||
\definecolor{BlueDD}{RGB}{62,100,125}
|
||
\colorlet{BlueDD}{magenta}
|
||
|
||
% ===============================================================================
|
||
% PART STYLING SYSTEM
|
||
% ===============================================================================
|
||
%
|
||
% This system provides three distinct visual styles for book organization:
|
||
%
|
||
% 1. NUMBERED PARTS (\part{title}) - For main book sections
|
||
% - Roman numerals (I, II, III, etc.) in top right corner
|
||
% - Crimson title with horizontal lines above/below
|
||
% - "Part I" label in sidebar
|
||
% - Used for: foundations, principles, optimization, deployment, etc.
|
||
%
|
||
% 2. UNNUMBERED PARTS (\part*{title}) - For special sections like "Labs"
|
||
% - Division-style geometric background (left side)
|
||
% - No Roman numerals
|
||
% - Used for: labs section
|
||
%
|
||
% 3. DIVISIONS (\division{title}) - For major book divisions
|
||
% - Clean geometric background with centered title
|
||
% - Used for: frontmatter, main_content, backmatter
|
||
%
|
||
% The Lua filter (inject-parts.lua) automatically routes parts by {key:xxx} commands
|
||
% to the appropriate LaTeX command based on the key name.
|
||
% ===============================================================================
|
||
|
||
% NUMBERED PARTS: Roman numeral styling for main book sections
|
||
\titleformat{\part}[display]
|
||
{\thispagestyle{empty}}{}{20pt}{
|
||
\begin{tikzpicture}[remember picture,overlay]
|
||
%%%
|
||
%%
|
||
\node[crimson,align=flush right,
|
||
inner sep=0,outer sep=0mm,draw=none,%
|
||
anchor=east,minimum height=31mm, text width=1.2\textwidth,
|
||
yshift=-30mm,font={%
|
||
\fontsize{98pt}{104}\selectfont\bfseries}] (BG) at (current page text area.north east){\thepart};
|
||
%
|
||
\node[black,inner sep=0mm,draw=none,
|
||
anchor=mid,text width=1.2\textwidth,
|
||
minimum height=35mm, align=right,
|
||
node distance=7mm,below=of BG,
|
||
font={\fontsize{30pt}{34}\selectfont}]
|
||
(BGG) {\hyphenchar\font=-1 \color{black}\MakeUppercase {#1}};
|
||
\draw [crimson,line width=3pt] ([yshift=0mm]BGG.north west) -- ([yshift=0mm]BGG.north east);
|
||
\draw [crimson,line width=2pt] ([yshift=0mm]BGG.south west) -- ([yshift=0mm]BGG.south east);
|
||
%
|
||
\node[fill=crimson,text=white,rotate=90,%
|
||
anchor=south west,minimum height=15mm,
|
||
minimum width=40mm,font={%
|
||
\fontsize{20pt}{20}\selectfont\bfseries}](BP) at
|
||
(current page text area.south east)
|
||
{{\sffamily Part}~\thepart};
|
||
%
|
||
\path[red](BP.north west)-|coordinate(PS)(BGG.south west);
|
||
%
|
||
\ifhaspartsummary
|
||
\node[inner sep=4pt,text width=0.7\textwidth,draw=none,fill=BrownLL!40,
|
||
align=justify,font={\fontsize{9pt}{12}\selectfont},anchor=south west]
|
||
at (PS) {\partsummary};
|
||
\fi
|
||
\end{tikzpicture}
|
||
}[]
|
||
|
||
\renewcommand{\thepart}{\Roman{part}}
|
||
|
||
% UNNUMBERED PARTS: Division-style background for special sections
|
||
\titleformat{name=\part,numberless}[display]
|
||
{\thispagestyle{empty}}{}{20pt}{
|
||
\begin{tikzpicture}[remember picture,overlay]
|
||
%%%
|
||
\coordinate(S1)at([yshift=-200mm]current page.north west);
|
||
\draw[draw=none,fill=BlueDD!7](S1)--++(45:16)coordinate(S2)-
|
||
|(S2|-current page.north west)--(current page.north west)coordinate(S3)--(S1);
|
||
%
|
||
\coordinate(E1)at([yshift=-98mm]current page.north west);
|
||
\draw[draw=none,fill=BlueDD!15](E1)--(current page.north west)coordinate(E2)
|
||
--++(0:98mm)coordinate(E3)--(E1);
|
||
%
|
||
\coordinate(D1)at([yshift=15mm]current page.south west);
|
||
\draw[draw=none,fill=BlueDD!40,opacity=0.5](D1)--++(45:5.5)coordinate(D2)
|
||
-|(D2|-current page.north west)--(current page.north west)coordinate(D3)--(D1);
|
||
%%%%
|
||
\path[red](S2)-|(S2-|current page.east)coordinate(SS2);
|
||
%PART
|
||
\node[crimson,align=flush right,inner sep=0,outer sep=0mm,draw=none,anchor=south,
|
||
font={\fontsize{48pt}{48}\selectfont\bfseries}] (BG) at ($(S2)!0.5!(SS2)$){\hphantom{Part}};
|
||
%%%
|
||
\path[green]([yshift=15mm]D2)-|coordinate(TPD)(BG.south east);
|
||
\node[inner sep=0mm,draw=none,anchor=south east,%text width=0.9\textwidth,
|
||
align=right,font={\fontsize{40pt}{40}\selectfont}]
|
||
(BGG) at (TPD) {\color{crimson}\MakeUppercase {#1}};%\MakeUppercase {}
|
||
\end{tikzpicture}
|
||
}
|
||
|
||
% Define \numberedpart command for numbered parts
|
||
\newcommand{\numberedpart}[1]{%
|
||
\clearpage
|
||
\thispagestyle{empty}
|
||
\stepcounter{part}%
|
||
\begin{tikzpicture}[remember picture,overlay]
|
||
%%%
|
||
%%
|
||
\node[crimson,align=flush right,
|
||
inner sep=0,outer sep=0mm,draw=none,%
|
||
anchor=east,minimum height=31mm, text width=1.2\textwidth,
|
||
yshift=-30mm,font={%
|
||
\fontsize{98pt}{104}\selectfont\bfseries}] (BG) at (current page text area.north east){\thepart};
|
||
%
|
||
\node[black,inner sep=0mm,draw=none,
|
||
anchor=mid,text width=1.2\textwidth,
|
||
minimum height=35mm, align=right,
|
||
node distance=7mm,below=of BG,
|
||
font={\fontsize{30pt}{34}\selectfont}]
|
||
(BGG) {\hyphenchar\font=-1 \color{black}\MakeUppercase {#1}};
|
||
\draw [crimson,line width=3pt] ([yshift=0mm]BGG.north west) -- ([yshift=0mm]BGG.north east);
|
||
\draw [crimson,line width=2pt] ([yshift=0mm]BGG.south west) -- ([yshift=0mm]BGG.south east);
|
||
%
|
||
\node[fill=crimson,text=white,rotate=90,%
|
||
anchor=south west,minimum height=15mm,
|
||
minimum width=40mm,font={%
|
||
\fontsize{20pt}{20}\selectfont\bfseries}](BP) at
|
||
(current page text area.south east)
|
||
{{\sffamily Part}~\thepart};
|
||
%
|
||
\path[red](BP.north west)-|coordinate(PS)(BGG.south west);
|
||
%
|
||
\ifhaspartsummary
|
||
\node[inner sep=4pt,text width=0.7\textwidth,draw=none,fill=BrownLL!40,
|
||
align=justify,font={\fontsize{9pt}{12}\selectfont},anchor=south west]
|
||
at (PS) {\partsummary};
|
||
\fi
|
||
\end{tikzpicture}
|
||
\clearpage
|
||
}
|
||
|
||
|
||
|
||
% DIVISIONS: Clean geometric styling with subtle tech elements
|
||
% Used for frontmatter, main_content, and backmatter divisions
|
||
\newcommand{\division}[1]{%
|
||
\clearpage
|
||
\thispagestyle{empty}
|
||
\begin{tikzpicture}[remember picture,overlay]
|
||
|
||
% Clean geometric background (original design)
|
||
\coordinate(S1)at([yshift=-200mm]current page.north west);
|
||
\draw[draw=none,fill=BlueDD!7](S1)--++(45:16)coordinate(S2)-
|
||
|(S2|-current page.north west)--(current page.north west)coordinate(S3)--(S1);
|
||
|
||
\coordinate(E1)at([yshift=-98mm]current page.north west);
|
||
\draw[draw=none,fill=BlueDD!15](E1)--(current page.north west)coordinate(E2)
|
||
--++(0:98mm)coordinate(E3)--(E1);
|
||
|
||
\coordinate(D1)at([yshift=15mm]current page.south west);
|
||
\draw[draw=none,fill=BlueDD!40,opacity=0.5](D1)--++(45:5.5)coordinate(D2)
|
||
-|(D2|-current page.north west)--(current page.north west)coordinate(D3)--(D1);
|
||
|
||
% Subtle tech elements - positioned in white areas for better visibility
|
||
% Upper right white area - more visible
|
||
\draw[crimson!40, line width=0.8pt] ([xshift=140mm,yshift=-60mm]current page.north west) -- ++(40mm,0);
|
||
\draw[crimson!40, line width=0.8pt] ([xshift=150mm,yshift=-70mm]current page.north west) -- ++(30mm,0);
|
||
\draw[crimson!35, line width=0.7pt] ([xshift=160mm,yshift=-60mm]current page.north west) -- ++(0,-15mm);
|
||
\draw[crimson!35, line width=0.7pt] ([xshift=170mm,yshift=-70mm]current page.north west) -- ++(0,10mm);
|
||
|
||
% Circuit nodes - upper right
|
||
\fill[crimson!50] ([xshift=160mm,yshift=-60mm]current page.north west) circle (1.5mm);
|
||
\fill[white] ([xshift=160mm,yshift=-60mm]current page.north west) circle (0.8mm);
|
||
\fill[crimson!50] ([xshift=170mm,yshift=-70mm]current page.north west) circle (1.3mm);
|
||
\fill[white] ([xshift=170mm,yshift=-70mm]current page.north west) circle (0.6mm);
|
||
|
||
% Lower right white area - enhanced visibility
|
||
\draw[crimson!45, line width=0.9pt] ([xshift=140mm,yshift=-190mm]current page.north west) -- ++(45mm,0);
|
||
\draw[crimson!45, line width=0.9pt] ([xshift=150mm,yshift=-200mm]current page.north west) -- ++(35mm,0);
|
||
\draw[crimson!40, line width=0.8pt] ([xshift=160mm,yshift=-190mm]current page.north west) -- ++(0,-20mm);
|
||
\draw[crimson!40, line width=0.8pt] ([xshift=170mm,yshift=-200mm]current page.north west) -- ++(0,15mm);
|
||
|
||
% Additional connecting lines in lower right
|
||
\draw[crimson!35, line width=0.7pt] ([xshift=130mm,yshift=-180mm]current page.north west) -- ++(25mm,0);
|
||
\draw[crimson!35, line width=0.7pt] ([xshift=145mm,yshift=-180mm]current page.north west) -- ++(0,-25mm);
|
||
|
||
% Circuit nodes - lower right (more prominent)
|
||
\fill[crimson!55] ([xshift=160mm,yshift=-190mm]current page.north west) circle (1.6mm);
|
||
\fill[white] ([xshift=160mm,yshift=-190mm]current page.north west) circle (0.9mm);
|
||
\fill[crimson!55] ([xshift=170mm,yshift=-200mm]current page.north west) circle (1.4mm);
|
||
\fill[white] ([xshift=170mm,yshift=-200mm]current page.north west) circle (0.7mm);
|
||
\fill[crimson!50] ([xshift=145mm,yshift=-180mm]current page.north west) circle (1.2mm);
|
||
\fill[white] ([xshift=145mm,yshift=-180mm]current page.north west) circle (0.6mm);
|
||
|
||
% Title positioned in center - clean and readable
|
||
\node[inner sep=0mm,draw=none,anchor=center,text width=0.8\textwidth,
|
||
align=center,font={\fontsize{40pt}{40}\selectfont}]
|
||
(BGG) at (current page.center) {\color{crimson}\MakeUppercase {#1}};
|
||
|
||
\end{tikzpicture}
|
||
\clearpage
|
||
}
|
||
|
||
% LAB DIVISIONS: Circuit-style neural network design for lab sections
|
||
% Used specifically for lab platform sections (arduino, xiao, grove, etc.)
|
||
\newcommand{\labdivision}[1]{%
|
||
\clearpage
|
||
\thispagestyle{empty}
|
||
\begin{tikzpicture}[remember picture,overlay]
|
||
% Circuit background with subtle gradient
|
||
\coordinate(S1)at([yshift=-200mm]current page.north west);
|
||
\draw[draw=none,fill=BlueDD!5](S1)--++(45:16)coordinate(S2)-
|
||
|(S2|-current page.north west)--(current page.north west)coordinate(S3)--(S1);
|
||
|
||
% TOP AREA: Circuit lines in upper white space
|
||
\draw[crimson!50, line width=1.5pt] ([xshift=30mm,yshift=-40mm]current page.north west) -- ++(60mm,0);
|
||
\draw[crimson!40, line width=1pt] ([xshift=120mm,yshift=-50mm]current page.north west) -- ++(50mm,0);
|
||
\draw[crimson!50, line width=1.5pt] ([xshift=40mm,yshift=-70mm]current page.north west) -- ++(40mm,0);
|
||
|
||
% Connecting lines in top area
|
||
\draw[crimson!30, line width=1pt] ([xshift=60mm,yshift=-40mm]current page.north west) -- ++(0,-20mm);
|
||
\draw[crimson!30, line width=1pt] ([xshift=145mm,yshift=-50mm]current page.north west) -- ++(0,10mm);
|
||
|
||
% Neural nodes in top area
|
||
\fill[crimson!70] ([xshift=60mm,yshift=-40mm]current page.north west) circle (2.5mm);
|
||
\fill[white] ([xshift=60mm,yshift=-40mm]current page.north west) circle (1.5mm);
|
||
\fill[crimson!60] ([xshift=145mm,yshift=-50mm]current page.north west) circle (2mm);
|
||
\fill[white] ([xshift=145mm,yshift=-50mm]current page.north west) circle (1mm);
|
||
\fill[crimson!80] ([xshift=80mm,yshift=-70mm]current page.north west) circle (2mm);
|
||
\fill[white] ([xshift=80mm,yshift=-70mm]current page.north west) circle (1mm);
|
||
|
||
% BOTTOM AREA: Circuit lines in lower white space
|
||
\draw[crimson!50, line width=1.5pt] ([xshift=20mm,yshift=-200mm]current page.north west) -- ++(70mm,0);
|
||
\draw[crimson!40, line width=1pt] ([xshift=110mm,yshift=-210mm]current page.north west) -- ++(60mm,0);
|
||
\draw[crimson!50, line width=1.5pt] ([xshift=35mm,yshift=-230mm]current page.north west) -- ++(45mm,0);
|
||
|
||
% Connecting lines in bottom area
|
||
\draw[crimson!30, line width=1pt] ([xshift=55mm,yshift=-200mm]current page.north west) -- ++(0,-20mm);
|
||
\draw[crimson!30, line width=1pt] ([xshift=140mm,yshift=-210mm]current page.north west) -- ++(0,15mm);
|
||
|
||
% Neural nodes in bottom area
|
||
\fill[crimson!70] ([xshift=55mm,yshift=-200mm]current page.north west) circle (2.5mm);
|
||
\fill[white] ([xshift=55mm,yshift=-200mm]current page.north west) circle (1.5mm);
|
||
\fill[crimson!60] ([xshift=140mm,yshift=-210mm]current page.north west) circle (2mm);
|
||
\fill[white] ([xshift=140mm,yshift=-210mm]current page.north west) circle (1mm);
|
||
\fill[crimson!80] ([xshift=80mm,yshift=-230mm]current page.north west) circle (2mm);
|
||
\fill[white] ([xshift=80mm,yshift=-230mm]current page.north west) circle (1mm);
|
||
|
||
% SIDE AREAS: Subtle circuit elements on left and right edges
|
||
\draw[crimson!30, line width=1pt] ([xshift=15mm,yshift=-120mm]current page.north west) -- ++(20mm,0);
|
||
\draw[crimson!30, line width=1pt] ([xshift=175mm,yshift=-130mm]current page.north west) -- ++(15mm,0);
|
||
\fill[crimson!50] ([xshift=25mm,yshift=-120mm]current page.north west) circle (1.5mm);
|
||
\fill[white] ([xshift=25mm,yshift=-120mm]current page.north west) circle (0.8mm);
|
||
\fill[crimson!50] ([xshift=185mm,yshift=-130mm]current page.north west) circle (1.5mm);
|
||
\fill[white] ([xshift=185mm,yshift=-130mm]current page.north west) circle (0.8mm);
|
||
|
||
% Title positioned in center - CLEAN AREA
|
||
\node[inner sep=0mm,draw=none,anchor=center,text width=0.8\textwidth,
|
||
align=center,font={\fontsize{44pt}{44}\selectfont\bfseries}]
|
||
(BGG) at (current page.center) {\color{crimson}\MakeUppercase {#1}};
|
||
|
||
\end{tikzpicture}
|
||
\clearpage
|
||
}
|
||
|
||
% Define \lab command for lab styling (different visual treatment)
|
||
\newcommand{\lab}[1]{%
|
||
\begin{tikzpicture}[remember picture,overlay]
|
||
%%%
|
||
% Different background pattern for labs
|
||
\coordinate(S1)at([yshift=-200mm]current page.north west);
|
||
\draw[draw=none,fill=BlueDD!15](S1)--++(45:16)coordinate(S2)-
|
||
|(S2|-current page.north west)--(current page.north west)coordinate(S3)--(S1);
|
||
%
|
||
\coordinate(E1)at([yshift=-98mm]current page.north west);
|
||
\draw[draw=none,fill=BlueDD!25](E1)--(current page.north west)coordinate(E2)
|
||
--++(0:98mm)coordinate(E3)--(E1);
|
||
%
|
||
\coordinate(D1)at([yshift=15mm]current page.south west);
|
||
\draw[draw=none,fill=BlueDD!60,opacity=0.7](D1)--++(45:5.5)coordinate(D2)
|
||
-|(D2|-current page.north west)--(current page.north west)coordinate(D3)--(D1);
|
||
%%%%
|
||
\path[red](S2)-|(S2-|current page.east)coordinate(SS2);
|
||
%LAB - Different styling
|
||
\node[crimson,align=flush right,inner sep=0,outer sep=0mm,draw=none,anchor=south,
|
||
font={\fontsize{48pt}{48}\selectfont\bfseries}] (BG) at ($(S2)!0.5!(SS2)$){\hphantom{Workshop}};
|
||
%%%
|
||
\path[green]([yshift=15mm]D2)-|coordinate(TPD)(BG.south east);
|
||
\node[inner sep=0mm,draw=none,anchor=south east,%text width=0.9\textwidth,
|
||
align=right,font={\fontsize{40pt}{40}\selectfont}]
|
||
(BGG) at (TPD) {\color{crimson}\MakeUppercase {#1}};%\MakeUppercase {}
|
||
\end{tikzpicture}
|
||
\thispagestyle{empty}
|
||
\clearpage
|
||
}
|
||
|
||
% =============================================================================
|
||
% SECTION FORMATTING
|
||
% =============================================================================
|
||
% All section levels use crimson color and are ragged right
|
||
|
||
% Section (Large, bold, crimson)
|
||
\titleformat{\section}
|
||
{\normalfont\Large\bfseries\color{crimson}\raggedright}
|
||
{\thesection}
|
||
{0.5em}
|
||
{#1}
|
||
\titlespacing*{\section}{0pc}{14pt plus 4pt minus 4pt}{6pt plus 2pt minus 2pt}[0pc]
|
||
|
||
% Subsection (large, bold, crimson)
|
||
\titleformat{\subsection}
|
||
{\normalfont\large\bfseries\color{crimson}\raggedright}
|
||
{\thesubsection}
|
||
{0.5em}
|
||
{#1}
|
||
\titlespacing*{\subsection}{0pc}{12pt plus 4pt minus 4pt}{5pt plus 1pt minus 2pt}[0pc]
|
||
|
||
% Subsubsection (normal size, bold, crimson)
|
||
\titleformat{\subsubsection}
|
||
{\normalfont\normalsize\bfseries\color{crimson}\raggedright}
|
||
{\thesubsubsection}
|
||
{0.5em}
|
||
{#1}
|
||
\titlespacing*{\subsubsection}{0pc}{12pt plus 4pt minus 4pt}{5pt plus 1pt minus 2pt}[0pc]
|
||
|
||
% Paragraph (run-in, bold, crimson, ends with period)
|
||
\titleformat{\paragraph}[runin]
|
||
{\normalfont\normalsize\bfseries\color{crimson}}
|
||
{\theparagraph}
|
||
{0.5em}
|
||
{#1}
|
||
[\textbf{.}]
|
||
\titlespacing*{\paragraph}{0pc}{6pt plus 2pt minus 2pt}{0.5em}[0pc]
|
||
|
||
% Subparagraph (run-in, italic, crimson, ends with period)
|
||
\titleformat{\subparagraph}[runin]
|
||
{\normalfont\normalsize\itshape\color{crimson}}
|
||
{\thesubparagraph}
|
||
{0.5em}
|
||
{#1}
|
||
[\textbf{.}]
|
||
\titlespacing*{\subparagraph}{0pc}{6pt plus 2pt minus 2pt}{0.5em}[0pc]
|
||
|
||
% =============================================================================
|
||
% CHAPTER FORMATTING
|
||
% =============================================================================
|
||
% Numbered chapters: "Chapter X" prefix, huge crimson title
|
||
\titleformat{\chapter}[display]
|
||
{\normalfont\huge\bfseries\color{crimson}}
|
||
{\chaptername\ \thechapter}
|
||
{20pt}
|
||
{\Huge #1}
|
||
[]
|
||
|
||
% Unnumbered chapters: no prefix, huge crimson title
|
||
\titleformat{name=\chapter,numberless}
|
||
{\normalfont\huge\bfseries\color{crimson}}
|
||
{}
|
||
{0pt}
|
||
{\Huge #1}
|
||
[]
|
||
|
||
\renewcommand{\chaptername}{Chapter}
|
||
% =============================================================================
|
||
% TABLE OF CONTENTS FORMATTING
|
||
% =============================================================================
|
||
\setcounter{tocdepth}{2} % Show chapters, sections, subsections
|
||
|
||
% TOC spacing adjustments for number widths and indentation
|
||
\setlength{\cftchapnumwidth}{2em} % Chapter number width
|
||
\setlength{\cftsecnumwidth}{2.75em} % Section number width
|
||
\setlength{\cftsubsecnumwidth}{3.25em} % Subsection number width
|
||
\setlength{\cftsubsubsecnumwidth}{4em} % Subsubsection number width
|
||
\setlength{\cftsubsecindent}{4.25em} % Subsection indent
|
||
\setlength{\cftsubsubsecindent}{7.5em} % Subsubsection indent
|
||
|
||
% Chapter entries in TOC: bold crimson with "Chapter" prefix
|
||
\renewcommand{\cftchapfont}{\bfseries\color{crimson}}
|
||
\renewcommand{\cftchappresnum}{\color{crimson}Chapter~}
|
||
|
||
% Custom formatting for division entries (styled like parts)
|
||
\newcommand{\divisionchapter}[1]{%
|
||
\addvspace{12pt}%
|
||
\noindent\hfil\bfseries\color{crimson}#1\hfil\par%
|
||
\addvspace{6pt}%
|
||
}
|
||
|
||
% Adjust TOC spacing for "Chapter" prefix
|
||
\newlength{\xtraspace}
|
||
\settowidth{\xtraspace}{\cftchappresnum\cftchapaftersnum}
|
||
\addtolength{\cftchapnumwidth}{\xtraspace}
|
||
|
||
% Unnumbered chapters with TOC entry
|
||
\newcommand{\likechapter}[1]{%
|
||
\chapter*{#1}
|
||
\addcontentsline{toc}{chapter}{\textcolor{crimson}{#1}}
|
||
}
|
||
|
||
% =============================================================================
|
||
% PAGE NUMBERING SYSTEM
|
||
% =============================================================================
|
||
% Hardware Kits uses Arabic numerals (1, 2, 3...) throughout the entire document.
|
||
% No frontmatter/mainmatter split - all content is practical lab material.
|
||
%
|
||
% Note: The \AtBeginDocument in before-body-includes.tex sets \pagenumbering{arabic}
|
||
|
||
% Reset footnote counter at each chapter
|
||
\makeatletter
|
||
\let\old@chapter\chapter%
|
||
\renewcommand{\chapter}{%
|
||
\@ifstar{\unnumbered@chapter}{\numbered@chapter}%
|
||
}
|
||
|
||
\newcommand{\numbered@chapter}[1]{%
|
||
\setcounter{sidenote}{1}
|
||
\old@chapter{#1}%
|
||
}
|
||
|
||
\newcommand{\unnumbered@chapter}[1]{%
|
||
\setcounter{sidenote}{1}
|
||
\old@chapter*{#1}%
|
||
}
|
||
\makeatother
|
||
|
||
% =============================================================================
|
||
% TABLE SIZING AND SPACING
|
||
% =============================================================================
|
||
% Make tables slightly smaller to fit more content
|
||
\AtBeginEnvironment{longtable}{\scriptsize}
|
||
|
||
% Increase vertical spacing in table cells (default is 1.0)
|
||
\renewcommand{\arraystretch}{1.3}
|
||
|
||
% Prefer placing tables at the top of pages
|
||
\makeatletter
|
||
\renewcommand{\fps@table}{t} % Default placement: top of page
|
||
\makeatother
|
||
|
||
% =============================================================================
|
||
% LONGTABLE PAGE BREAKING FIXES (Windows compatibility)
|
||
% =============================================================================
|
||
% Prevent "Infinite glue shrinkage" errors on Windows LaTeX builds
|
||
% by giving longtable more flexibility in page breaking
|
||
|
||
% Allow more flexible page breaking (vs strict \flushbottom)
|
||
\raggedbottom
|
||
|
||
% Process more rows before attempting page break (default is 20)
|
||
\setcounter{LTchunksize}{50}
|
||
|
||
% Add extra stretch for longtable environments specifically
|
||
\AtBeginEnvironment{longtable}{%
|
||
\setlength{\emergencystretch}{3em}%
|
||
\setlength{\parskip}{0pt plus 1pt}%
|
||
}
|
||
|
||
% =============================================================================
|
||
% TABLE STYLING - Clean tables with crimson borders
|
||
% =============================================================================
|
||
% Professional table appearance with:
|
||
% - Clean white background (no colored rows)
|
||
% - Crimson-colored borders
|
||
% - Good spacing for readability
|
||
%
|
||
% Note: Headers are automatically bolded by Quarto when using **text** in source
|
||
\usepackage{booktabs} % Professional table rules (\toprule, \midrule, \bottomrule)
|
||
\usepackage{colortbl} % For colored borders (\arrayrulecolor)
|
||
|
||
% Global table styling - crimson borders
|
||
\setlength{\arrayrulewidth}{0.5pt} % Thinner borders than default
|
||
%\arrayrulecolor{crimson} % Crimson borders matching brand
|
||
|
||
\setcounter{chapter}{0}
|