aboutsummaryrefslogtreecommitdiff
path: root/docs/doc.cls
diff options
context:
space:
mode:
Diffstat (limited to 'docs/doc.cls')
-rw-r--r--docs/doc.cls285
1 files changed, 285 insertions, 0 deletions
diff --git a/docs/doc.cls b/docs/doc.cls
new file mode 100644
index 0000000..1a5ea68
--- /dev/null
+++ b/docs/doc.cls
@@ -0,0 +1,285 @@
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{doc}[2024-10-07 class doc]
+
+% based on article
+\LoadClass{article}
+
+% default word page setup
+\PassOptionsToPackage{margin=1in}{geometry}
+\PassOptionsToPackage{a4paper}{geometry}
+% confusing to acrobat/firefox users
+\PassOptionsToPackage{hidelinks}{hyperref}
+\PassOptionsToPackage{english}{babel}
+\PassOptionsToPackage{noabbrev}{cleveref}
+\PassOptionsToPackage{nosort}{cleveref}
+\PassOptionsToPackage{nameinlink}{cleveref}
+\PassOptionsToPackage{obeyspaces}{url}
+\PassOptionsToPackage{toc=false}{glossaries}
+\PassOptionsToPackage{record}{glossaries-extra}
+\PassOptionsToPackage{backend=biber}{biblatex}
+\PassOptionsToPackage{bibencoding=utf8}{biblatex}
+\PassOptionsToPackage{style=iso-numeric}{biblatex}
+\PassOptionsToPackage{autocite=plain}{biblatex}
+\PassOptionsToPackage{most}{tcolorbox}
+
+% frequently used packages
+\RequirePackage{geometry}
+\RequirePackage{float}
+\RequirePackage{babel}
+\RequirePackage{siunitx}
+\RequirePackage{csquotes}
+\RequirePackage{url}
+\RequirePackage{fancyvrb}
+\RequirePackage{parskip}
+\RequirePackage{fontspec}
+\RequirePackage{tabularx}
+\RequirePackage{booktabs}
+\RequirePackage{needspace}
+\RequirePackage{xr-hyper}
+\RequirePackage{hyperref}
+\RequirePackage{microtype}
+\RequirePackage{xcolor}
+\RequirePackage{etoolbox}
+\RequirePackage{graphicx}
+\RequirePackage{unicode-math}
+\RequirePackage{amsmath}
+\RequirePackage{cleveref}
+\RequirePackage{adjustbox}
+\RequirePackage{xparse}
+\RequirePackage{biblatex}
+\RequirePackage{glossaries}
+\RequirePackage{glossaries-extra}
+\RequirePackage{ifdraft}
+\RequirePackage{enumitem}
+\RequirePackage{subcaption}
+\RequirePackage{multicol}
+\RequirePackage{xstring}
+\RequirePackage{tcolorbox}
+
+% font style
+\setmainfont{TeX Gyre Schola}
+\setmathfont{TeX Gyre Schola Math}
+\setsansfont{Inter}
+\setmonofont[Scale=0.85]{JetBrains Mono}
+
+% fix fonts w/ siunitx
+\sisetup{detect-all = true}
+
+% no indented paragraphs, just skip
+\parindent=0mm
+\bigskipamount=7mm
+\medskipamount=4mm
+
+% number paragraphs by default
+\setcounter{secnumdepth}{4}
+
+% section placement / appearance
+\newlength{\sectionpenalty}
+\newlength{\subsectionpenalty}
+\newlength{\subsubsectionpenalty}
+\setlength{\sectionpenalty}{0.4\textheight}
+\setlength{\subsectionpenalty}{0.1\textheight}
+\setlength{\subsubsectionpenalty}{0pt}
+\def\penaltycheck#1{\ifdimgreater{#1}{0pt}{\needspace{#1}}{}}
+\ifdraft{\def\penaltycheck#1{\relax}}{}
+\makeatletter
+\renewcommand\section{%
+ \@startsection{section}{1}%
+ {0pt}%
+ {1.50em}%
+ {1.50ex}%
+ {\penaltycheck{\sectionpenalty}\normalfont\bfseries\Large}%
+}
+\renewcommand\subsection{%
+ \@startsection{subsection}{2}%
+ {0pt}%
+ {1.25em}%
+ {1.25ex}%
+ {\penaltycheck{\subsectionpenalty}\normalfont\bfseries\large}%
+}
+\renewcommand\subsubsection{%
+ \@startsection{subsubsection}{2}%
+ {0pt}%
+ {1.00em}%
+ {1.00ex}%
+ {\penaltycheck{\subsubsectionpenalty}\normalfont\bfseries\normalsize}%
+}
+\makeatother
+
+% default tight list spacing
+\makeatletter
+\newlength{\style@parsep}
+\newlength{\style@itemsep}
+\newlength{\style@itemizemargin}
+\setlength{\style@parsep}{1mm}
+\setlength{\style@itemsep}{1mm}
+\setlength{\style@itemizemargin}{2mm}
+\setlist{
+ topsep=\dimexpr\style@itemizemargin-\parskip\relax,
+ itemsep=\dimexpr\style@itemsep-\style@parsep\relax,
+ parsep=\style@parsep,
+}
+\def\projdoc@description@before{%
+ \renewcommand\makelabel[1]{%
+ {\bfseries ##1}:%
+ }%
+}
+\newlength\projdoc@description@leftmargin%
+\projdoc@description@leftmargin=3em%
+\newlength\projdoc@description@labelindent%
+\projdoc@description@labelindent=3ex%
+\def\projdoc@setdescriptionstyle{%
+ \setdescription{
+ before={\projdoc@description@before},
+ leftmargin=\projdoc@description@leftmargin,
+ labelindent=\projdoc@description@labelindent,
+ }%
+}
+\projdoc@setdescriptionstyle%
+\makeatother
+
+% create a label using \customlabel[<creftype>]{<refname>}{<reftext>} that displays
+% <reftext> when \ref{<refname>} is used, or <creftype> <reftext> when
+% \cref{<refname>} is used
+\makeatletter
+\NewDocumentCommand{\customlabel}{omm}{%
+ \begingroup
+ \cref@constructprefix{#1}{\cref@result}%
+ \protected@edef\@currentlabel{#3}%
+ \protected@edef\@currentlabelname{#3}%
+ \protected@edef\cref@currentlabel{[#1][][\cref@result]#3}
+ \label[#1]{#2}%
+ \endgroup
+}
+\makeatother
+
+% float here by default
+\usepackage{float}
+\makeatletter
+\def\fps@figure{H}
+\def\fps@table{H}
+\makeatother
+
+% bibliography
+\addbibresource{refs.bib}
+
+% glossary
+\GlsXtrLoadResources[
+ src={./glossary.bib},
+ selection={recorded and deps and see},
+]
+
+% default document header/trailer
+\makeatletter
+\def\projdoc@header{
+ % start with title page
+ \clearpage
+ \begin{titlepage}
+ \maketitle
+ \thispagestyle{empty}
+ \end{titlepage}
+}
+\newbool{projdoc@used@cite}
+\newbool{projdoc@used@gls}
+\apptocmd{\abx@aux@cite}{\global\booltrue{projdoc@used@cite}}{}{}
+\apptocmd{\glsxtr@record}{\global\booltrue{projdoc@used@gls}}{}{}
+\def\projdoc@trailer{
+ % bibliography (if citations used)
+ \ifbool{projdoc@used@cite}{%
+ \hfuzz=50pt% reduce overfull hbox warnings for bibliography (mostly URLs)
+ \printbibliography%
+ }{}%
+ % glossary
+ \ifbool{projdoc@used@gls}{%
+ \projdoc@description@leftmargin=2ex%
+ \projdoc@description@labelindent=0pt%
+ \projdoc@setdescriptionstyle%
+ \section*{Glossary}%
+ \begin{multicols}{2}%
+ \renewcommand{\glossarysection}[2][]{}%
+ \printunsrtglossary%
+ \end{multicols}%
+ }{}%
+}
+\AtBeginDocument{\projdoc@header}
+\AtEndDocument{\projdoc@trailer}
+\makeatother
+
+% store figure/table count in macros
+\makeatletter
+\def\figurecount{0}%
+\def\tablecount{0}%
+\def\pagecount{0}%
+\AtEndDocument{
+ \immediate\write\@mainaux{\string\global\string\def\string\figurecount{\the\value{figure}}}
+ \immediate\write\@mainaux{\string\global\string\def\string\tablecount{\the\value{table}}}
+ \immediate\write\@mainaux{\string\global\string\def\string\pagecount{\thepage}}
+}
+\makeatother
+
+% generate table of contents, figures, tables
+\def\tablestables{%
+ \tableofcontents%
+ \label{sec:toc}%
+ \ifnumgreater{\figurecount}{0}{\listoffigures}{}%
+ \label{sec:lof}%
+ \ifnumgreater{\tablecount}{0}{\listoftables}{}%
+ \label{sec:lot}%
+}
+
+% code
+\DeclareUrlCommand\codeinline{%
+ \urlstyle{tt}%
+ \def\codebreak{\discretionary{\hbox{~\textbackslash{}}}{\hbox{~~}}{}}%
+ \def\UrlSpecials{%
+ \do\/{\hbox{/}\codebreak}%
+ \do\_{\hbox{\_}\codebreak}%
+ \do\ {\hbox{\ }\codebreak}%
+ \do\-{\hbox{-}\codebreak}%
+ }%
+ \def\UrlNoBreaks{%
+ \do\+%
+ \do\.%
+ \do\[%
+ \do\]%
+ }%
+ \def\UrlLeft{\hbox{\,}}%
+ \def\UrlRight{\hbox{\,}}%
+}
+\DefineVerbatimEnvironment{blockcode}{Verbatim}{
+ tabsize=2,
+ obeytabs,
+}
+
+% scale down image if it exceeds page margins
+\newcommand{\fitimg}[1]{%
+ \adjustbox{max width=\linewidth}{#1}%
+}
+
+% adjust scale for puml diagrams
+\newcommand{\includepumldiag}[1]{%
+ \StrSubstitute{#1}{.puml}{.eps}[\filename]%
+ \fitimg{\includegraphics[scale=0.75]{\filename}}%
+}
+
+% prevent page break between two paragraphs
+\makeatletter
+\newcommand\noparbreak{\par\nobreak\@afterheading}
+\makeatother
+
+\newtcbox{\hide}{blank,opacitytext=0}
+\def\pictochat{%
+ \strut%
+ \adjustbox{%
+ foreground={%
+ \hide{PictoChat}%
+ }%
+ }{%
+ \includegraphics[%
+ height=0.73em, % about height of X in TeX Gyre Schola
+ ]{../assets/pictochat-logo.pdf}%
+ }%
+ \strut%
+}
+\ifdraft{\def\pictochat{PictoChat}}{}%
+