% {{{ tlc-article
%
% Class:
%   tlc-article
%
% Purpose:
%   This LaTeX class provides an article implementation that standardizes
%   a document layout intended for formal documents.
%
% Note:
%   I use 'set foldmethod=marker' in my vimrc to enable folding when viewing or
%   editing this file.
%
% -------------------------------------------------------------------------- }}}
% {{{ Base tlc-article definitions.

\NeedsTeXFormat{LaTeX2e}%
\ProvidesClass{tlc-article}[2026/08/08 v1.2.42 Traap LaTeX Class Article]%

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}%
\ProcessOptions%

\LoadClass{article}%

% -------------------------------------------------------------------------- }}}
% {{{ Page layout

\RequirePackage[a4paper,top=1.0in,bottom=1.0in,left=1.0in,right=1.0in]{geometry}%
\RequirePackage{multicol}%
\RequirePackage{multirow}%

% -------------------------------------------------------------------------- }}}
% {{{ Required parts to use glossaries must come first.

\RequirePackage{lmodern}%
\RequirePackage{textcomp}%
\RequirePackage[utf8]{inputenc}%
\RequirePackage[T1]{fontenc}%
\RequirePackage[colorlinks]{hyperref}%
\RequirePackage{bookmark}%

% -------------------------------------------------------------------------- }}}
% {{{ Define glossaries.

\RequirePackage[acronym,      % Create 'acronym' glossary type.
                nopostdot,    % Do not use post dots
                nonumberlist, % Do not number list.
                style=altlist,% use altlist style.
                toc,          % Add the glossary to the table of contents.
               ]{glossaries}%

% -------------------------------------------------------------------------- }}}
% {{{ Color, Graphics and links.

\RequirePackage{graphicx}%
\RequirePackage[table]{xcolor}%

% -------------------------------------------------------------------------- }}}
% {{{ Listings and verbatim

\RequirePackage{listings}%
\RequirePackage{spverbatim}%

% -------------------------------------------------------------------------- }}}
% {{{ Arrays, list and tables

\RequirePackage{array}%
\RequirePackage[l3]{csvsimple}%
\RequirePackage{enumitem}%
\RequirePackage{longtable}%
\RequirePackage{makecell}%
\RequirePackage{tabularx}%
\setlength{\parindent}{0pt}%

% -------------------------------------------------------------------------- }}}
% {{{ pdf

\RequirePackage{pdfpages}%

% -------------------------------------------------------------------------- }}}
% {{{ Pie Charts

\RequirePackage{pgf-pie}%
\RequirePackage{pdflscape}%

% -------------------------------------------------------------------------- }}}
% {{{ Miscellaneous

\RequirePackage[toc,page]{appendix}%
\setlength{\marginparwidth}{2cm}%
\RequirePackage{todonotes}%
\RequirePackage{ifthen}%

% -------------------------------------------------------------------------- }}}
% {{{ Table of Contents
%
% We want our table of contents to use dots as a leader.

\RequirePackage{tocloft}%
\renewcommand\cftsecleader{\cftdotfill{\cftdotsep}}%

% -------------------------------------------------------------------------- }}}
% {{{ Header and Footers
%
% Create a beautiful document header and document footer using the packages
% listed below.

\RequirePackage{fancyhdr}%  Page layout in \LaTeX
\RequirePackage{titling}%   Control over \maketitle & \thanks
\RequirePackage{lastpage}%  Page n of m
\pagestyle{fancy}%          fancy page style

% -------------------------------------------------------------------------- }}}
% {{{ Control header, footer, and table of contents.
%
% Keep our header and footer consistent with a table of contents that spans
% multiple pages.

\AtBeginDocument{%
  \addtocontents{toc}{\protect\thispagestyle{fancy}}%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Colors: Custom

\definecolor{backcolour}{rgb}{0.95,0.95,0.92}%
\definecolor{codegray}{rgb}{0.5,0.5,0.5}%
\definecolor{codegreen}{rgb}{0,0.6,0}%
\definecolor{codepurple}{rgb}{0.58,0,0.82}%
\definecolor{darkblue}{rgb}{0,0,0.5}%

% -------------------------------------------------------------------------- }}}
% {{{ Colors: Code listings

\lstdefinestyle{tlcStyle}{%
  backgroundcolor=\color{backcolour},%
  commentstyle=\color{codegreen},%
  keywordstyle=\color{magenta},%
  numberstyle=\tiny\color{codegray},%
  stringstyle=\color{codepurple},%
  basicstyle=\footnotesize,%
  breakatwhitespace=false,%
  breaklines=true,%
  captionpos=b,%
  keepspaces=true,%
  numbers=left,%
  numbersep=4pt,%
  showspaces=false,%
  showstringspaces=false,%
  showtabs=false,%
  tabsize=2%
}%
\lstset{style=tlcStyle}%

% -------------------------------------------------------------------------- }}}
% {{{ Colors: Hyper link

\hypersetup{%
  bookmarksopen   = true,%
  citebordercolor = white!100,%
  citecolor       = darkblue,%
  filebordercolor = white!100,%
  filecolor       = darkblue ,%
  linkbordercolor = white!100,%
  linkcolor       = darkblue,%
  linktoc         = all,%
  menubordercolor = white!100,%
  pdfauthor       = {},%
  pdfborder       = {0 0 0 [0 0]},%
  pdfkeywords     = {},%
  pdfstartview    = FitH,%
  pdfsubject      = {},%
  pdftitle        = {},%
  runbordercolor  = white!100,%
  urlbordercolor  = white!100,%
  urlcolor        = darkblue%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Define the optional input files.

\def\tlc@location{data}%
\def\tlc@logoFile{\tlc@location/logo.png}%
\def\tlc@versionFile{\tlc@location/version.csv}%
\def\tlc@additionalLayout{\tlc@location/additional-layout.tex}%
\def\tlc@headerFooter{\tlc@location/header-footer.tex}%

% -------------------------------------------------------------------------- }}}
% {{{ Clear fancy header and footers.

\fancyhead[L,C,R]{}
\fancyfoot[L,C,R]{}

% -------------------------------------------------------------------------- }}}
% {{{ Command: L, C, R
%
% New column types: L, C, and R are Left, Center, and Right, respectively, and
% are designed for use with longtable.  Data is wrapped within a table cell.
% The parameter defines the column width.  As an example, L{2cm} yields a left
% aligned, ragged right, wrapped text within a 2cm wide cell.
%
% Argument:
%   1 - text to left, center, or right align.

\newcolumntype{L}[1]{>{\raggedright\let\newline\\\arraybackslash}p{#1}}%
\newcolumntype{C}[1]{>{\centering\let\newline\\\arraybackslash}p{#1}}%
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash}p{#1}}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: ER
%
% This command is generally applied to the end of a table row.

\newcommand{\ER}{\\ \hline}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: inputIfExists
%
% Macro to include a file if it exists.
%
% Argument:
%   1 = the file path to input

\newcommand{\inputIfExists}[1]{\IfFileExists{#1}{\input{#1}}{}}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: tlcBeginLandscape
%
% tlcBeginLandscape and tlcEndLandscape are two new commands used to simplify
% setting page orientation to landscape and consistently setting margins.

\newcommand{\tlcBeginLandscape}{%
  \begin{landscape}%
  \newgeometry{top=1in, bottom=1in,left=1in,right=1in}%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: tlcDarkblue
%
% This function is used to simplify making textcolor darkblue.
%
% Argument:
%   1 - the text to enclose in dark blue.

\newcommand{\tlcDarkblue}[1]{\textcolor{darkblue}{#1}}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: tlcDebug
%
% We define tlcDebug to aid our users when they are debugging their document.
% tlcDebug should be placed at the end of your document to allow LaTeX to
% fully expand all macros and definitions.

\newcommand{\tlcDebug}{%
  \clearpage%
  \section{tlc-article Debug}%
  \subsection{tlc-article default files}%

  \begin{description}[align=right,labelindent=5cm]%
    \item[tlc@location:]\tlc@location%
    \item[tlc@additionalLayout:]\tlc@additionalLayout%
    \item[tlc@headerFooter:]\tlc@headerFooter%
    \item[tlc@versionFile:]\tlc@versionFile%
    \item[tlc@logoFile:]\tlc@logoFile%
  \end{description}%
  %
  \subsection{tlc-article file hooks}%
  \begin{description}[align=right,labelindent=5cm]%
    \item [tlc@additionalLayout:]\tlcIsDefined{\tlc@additionalLayout}%
    \item [tlc@headerFooter:]\tlcIsDefined{\tlc@headerFooter}%
    \item [tlc@logoFile:]\tlcIsDefined{\tlc@logoFile}%
    \item [tlc@versionFile:]\tlcIsDefined{\tlc@versionFile}%
  \end{description}%
  %
  \subsection{tlc-article header and footer hooks}%
  \begin{description}[align=right,labelindent=5cm]%
    \item[tlc@version:] \tlc@version%
    \item[tlc@date:] \tlc@date%
    \item[tlc@status:] \tlc@status%
    \item[tlc@institution:] \tlc@institution%
    \item[tlc@permission:] \tlc@permission%
  \end{description}%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: tlcEndLandscape
%
% Simplify ending landscape.

\newcommand{\tlcEndLandscape}{%
  \restoregeometry%
  \end{landscape}%
}%
% -------------------------------------------------------------------------- }}}
% {{{ Command: tlcGetEnvironmentVariable
%
% Robust version that actually tests if kpsewhich runs successfully.

\RequirePackage{catchfile}%

\newcommand{\tlcGetEnvironmentVariable}[2][]{%
  % Attempt to capture the value. kpsewhich returns an empty string on failure.
  \CatchFileEdef{\temp}{"|kpsewhich --var-value #2 2>/dev/null"}{\endlinechar=-1}%
  \ifx\temp\empty%
    \PackageWarning{tlc-article}{kpsewhich failed or variable #2 not defined. Using EMPTY value.}%
    \if\relax\detokenize{#1}\relax%
      % no variable target
    \else%
      \def#1{}%
    \fi%
  \else%
    \if\relax\detokenize{#1}\relax%
      \temp%
    \else%
      \let#1\temp%
    \fi%
  \fi%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: tlcIsDefined
%
% Writes DEFINED or NOTDEFINED to your document.
%
% Argument:
%   1 - Check for the existence of the file name provided.

\newcommand{\tlcIsDefined}[1]%
{\IfFileExists{#1}%
  {\textcolor{green}{DEFINED}}%
  {\textcolor{red}{NOT DEFINED}}%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: tlcVersionPart
%
% Extract document status, document date and document version from
% tlc@versionFile.
%
% Argument:
%   1 - the column name to extract from the data file.

\newcommand{\tlcVersionPart}[1]{%
  \csvreader[separator=pipe]%
  {\tlc@versionFile}%
  {1=\version,%
   2=\date,%
   3=\status,%
   4=\institution,%
   5=\permission%
  }%
  {#1}%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: tlcVspace

% Default vertical space

\newcommand{\tlcVspace}{\vspace{3mm}}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: tlcTitlePageAndTableOfContents
%
% Each document uses the same author name, title page and table of contents.
%
% Arguments:
%   1 - the title
%   2 - the author
%   3 - the abstract

\newcommand{\tlcTitlePageAndTableOfContents}[3]{%
    \ifthenelse{\equal{#1}{}}{% title check
      \title{}%
    }{% Else: title
      \title{#1}
    }%
    \ifthenelse{\equal{#2}{}}{% author check
      \author{}%a
    }{% Else: author
      \author{#2}
    }%
    \maketitle%
    \ifthenelse{\equal{#3}{}}{% abstract check
      % noop: nothing
    }{% Else: abstract
      % \vspace{3mm}% Vertical spacing.
      \begin{abstract}#3\end{abstract}%
    }%
    \thispagestyle{empty}%
    \clearpage%
    \tableofcontents%
    \clearpage%
  % \end{titlepage}
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: useDefaultHeaderFooter
%
% Construct a beautiful header and footer.

\newcommand{\useDefaultHeaderFooter}{%
  \useLogoFile%              Typeset Logo in the left side of the header.
  \useTitle%                 Typeset the title in the center of the header.
  \useVersionFile%           Typeset version info in right side of the header.
  \useRuler%                 Typeset header and footer with a ruler.
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: useLogoFile
%
% Typeset the logo in the left side of the document header.  Otherwise no
% operation because tlc@logoFile does not exist.

\newcommand{\useLogoFile}{%
  \IfFileExists{\tlc@logoFile}%
  {%
    \fancyhead[L]{\includegraphics[width=3cm,height=1cm]{\tlc@logoFile}}%
  }%
  {%
   % Else: no operation because tlc@logoFile does not exist.
  }%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: useRuler
%
% Add a ruler to the header and footer.
%
% Steps:
%   1. Add a ruler to the header.
%   2. Eliminate the head height too small warning, which occurs because we are
%      using multiple lines in our header.
%   3. Apply page n of N to the right side footer.
%   4. Add a ruler to the footer.

\newcommand{\useRuler}{%
  \renewcommand{\headrulewidth}{0.1pt}%
  \setlength\headheight{34.0pt}%
  \fancyfoot[R]%
    {\tiny%
      {Page \thepage~of~\pageref{LastPage}}%
    }%
  \renewcommand{\footrulewidth}{0.1pt}%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: useVersionFile
%
% Typeset version information in the right side of the document header.

\newcommand{\useVersionFile}{%
  \IfFileExists{\tlc@versionFile}%
  {%
   %
   % document status, document date and document version.
   %
    \fancyhead[R]{\tiny \tlc@status \\ \tlc@date \\ \tlc@version}%
   %
   % document owner.  This may be a person or company name.
   %
    \fancyfoot[L]{\tiny \tlc@institution}%
   %
   % document license. This may be a license or a word like confidential.
   %
    \fancyfoot[C]{\tiny \tlc@permission}%
  }%
  {%
   % Else: no operation because tlc@versionFile does not exist.
  }%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Command: useTitle
%
% Typeset title in the center of the header.

\newcommand{\useTitle}{%
  \fancyhead[C]{\large{\thetitle}}%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Hook: tlc@additionalLayout
%
% We want to allow the calling document to set up additional layout.

\IfFileExists{\tlc@additionalLayout}%
{\input{\tlc@additionalLayout}}%
{%
  % Else: no operation because tlc@additionalLayout does not exist.
}%

% {{{ Hook: tlc@versionFile
% -------------------------------------------------------------------------- }}}
%
% Extract version parts when tlc@versionFile exists.

\IfFileExists{\tlc@versionFile}%
{%
  \def\tlc@version{\tlcVersionPart{\version}}%
  \def\tlc@date{\tlcVersionPart{\date}}%
  \def\tlc@status{\tlcVersionPart{\status}}%
  \def\tlc@institution{\tlcVersionPart{\institution}}%
  \def\tlc@permission{\tlcVersionPart{\permission}}%
}%
{% Else: no operation because tlc@versionFile does not exist.
  \def\tlc@version{\textcolor{red}{NOT USED}}%
  \def\tlc@date{\textcolor{red}{NOT USED}}%
  \def\tlc@status{\textcolor{red}{NOT USED}}%
  \def\tlc@institution{\textcolor{red}{NOT USED}}%
  \def\tlc@permission{\textcolor{red}{NOT USED}}%
}%

% -------------------------------------------------------------------------- }}}
% {{{ Hook: tlc@headerFooter
%
% Setup Header and Footer.
%
% We want to allow the calling document to override the headers and footers that
% we are defining.

\IfFileExists{\tlc@headerFooter}%
{% use the custom header and footer defined by \tlc@headerfooter
  \input{\tlc@headerFooter}%
}%
{% Else: use default header and footer
  \useDefaultHeaderFooter%
}%

% -------------------------------------------------------------------------- }}}
% {{{ The end

\endinput%

% -------------------------------------------------------------------------- }}}
