% \iffalse meta-comment
%
% Copyright (C) 2024 by Agni Datta <agnidatta.org@gmail.com>
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3c of this license
% or (at your option) any later version. The latest version of this
% license is in:
%
%    http://www.latex-project.org/lppl.txt
%
% and version 1.3c or later is part of all distributions of LaTeX
% version 2008/05/04 or later.
%
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Agni Datta.
%
% This work consists of the files csthm.dtx and csthm.ins
% and the derived file csthm.sty.
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{csthm.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{csthm}
%<*package>
    [2024/08/31 v1.2 Theorem Environments for Computer Science]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{csthm}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
\DocInput{csthm.dtx}
\PrintChanges
\PrintIndex
\end{document}
%</driver>
% \fi
%
% \CheckSum{0}
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
% \changes{v1.0}{2024/08/31}{Initial version}
% \changes{v1.1}{2024/08/31}{Added cleveref support}
% \changes{v1.2}{2024/08/31}{Improved documentation and code structure}
%
% \DoNotIndex{\newcommand,\newenvironment}
%
% \providecommand*{\url}{\texttt}
% \GetFileInfo{csthm.dtx}
% \title{The \textsf{csthm} package}
% \author{Agni Datta \\ \url{agnidatta.org@gmail.com}}
% \date{\filedate}
%
% \maketitle
%
% \section{Introduction}
%
% This package provides customized theorem-like environments specifically designed for computer science documents. It offers a set of pre-defined theorem styles and environments to streamline the creation of theorems, definitions, remarks, and other common structures in computer science papers and documents.
%
% \section{Usage}
%
% Load the package with:
% \begin{verbatim}
% \usepackage{csthm}
% \end{verbatim}
%
% To use the package with cleveref support:
% \begin{verbatim}
% \usepackage[cleveref]{csthm}
% \end{verbatim}
%
% \section{Implementation}
%
%    \begin{macrocode}
%<*package>
% Package options
\newif\if@csthm@loadcleveref
\DeclareOption{cleveref}{\@csthm@loadclevereftrue}
\ProcessOptions\relax

% Required packages
\RequirePackage{amsmath}
\RequirePackage{amssymb}
\RequirePackage{amsthm}
\RequirePackage{enumitem}
\RequirePackage{thmtools}

% Conditionally load cleveref if the option is set and hyperref is loaded
\if@csthm@loadcleveref
\AtBeginDocument{%
	\@ifpackageloaded{hyperref}{%
		\RequirePackage{cleveref}
		}{%
		\PackageWarning{csthm}{The 'cleveref' option was set, but 'hyperref' is not loaded. Skipping 'cleveref' loading.}
	}%
}
\fi

% Define theorem styles
\declaretheoremstyle[
	spaceabove=\topsep,
	spacebelow=\topsep,
	headfont=\scshape,
	notefont=\scshape,
	bodyfont=\normalfont,
	postheadspace=5pt,
	numberwithin=section,
	qed=$\scriptstyle\star$,
	headpunct={.}
]{thmstyle}

\declaretheoremstyle[
	spaceabove=\topsep,
	spacebelow=\topsep,
	headfont=\bfseries,
	notefont=\bfseries,
	bodyfont=\normalfont,
	postheadspace=5pt,
	numberwithin=section,
	qed=$\scriptstyle\maltese$,
	headpunct={.}
]{defstyle}

\declaretheoremstyle[
	spaceabove=\topsep,
	spacebelow=\topsep,
	headfont=\itshape,
	notefont=\itshape,
	bodyfont=\normalfont,
	postheadspace=5pt,
	numberwithin=section,
	qed=$\scriptstyle\maltese$,
	headpunct={.}
]{remarkstyle}

\declaretheoremstyle[
	spaceabove=\topsep,
	spacebelow=\topsep,
	headfont=\sffamily\scshape,
	notefont=\sffamily\scshape,
	bodyfont=\normalfont\sffamily,
	postheadspace=5pt,
	numberwithin=section,
	qed=$\scriptstyle\maltese$,
	headpunct={.}
]{hltstyle}

% Define theorem environments
\declaretheorem[style=thmstyle,name=Theorem]{theorem}
\declaretheorem[style=defstyle,sibling=theorem]{fact}
\declaretheorem[style=thmstyle,sibling=theorem]{assumption}
\declaretheorem[style=thmstyle,sibling=theorem]{claim}
\declaretheorem[style=thmstyle,sibling=theorem]{conjecture}
\declaretheorem[style=thmstyle,sibling=theorem]{corollary}
\declaretheorem[style=thmstyle,sibling=theorem]{lemma}
\declaretheorem[style=thmstyle,sibling=theorem]{property}
\declaretheorem[style=thmstyle,sibling=theorem]{proposition}

% Define definition environments
\declaretheorem[style=defstyle,sibling=theorem]{definition}
\declaretheorem[style=defstyle,sibling=theorem]{example}
\declaretheorem[style=defstyle,sibling=theorem]{exercise}
\declaretheorem[style=defstyle,sibling=theorem]{problem}
\declaretheorem[style=defstyle,sibling=theorem]{question}

% Define remark environments
\declaretheorem[style=remarkstyle,sibling=theorem]{note}
\declaretheorem[style=remarkstyle,sibling=theorem]{remark}
\declaretheorem[style=remarkstyle,sibling=theorem]{solution}

% Define highlight environments
\declaretheorem[style=hltstyle,name=Important]{important}
\declaretheorem[style=hltstyle]{highlight}
\declaretheorem[style=hltstyle]{keypoint}

% Define case environment
\newlist{caseList}{enumerate}{1}
\setlist[caseList]{label=\textbf{Case~\arabic*:},leftmargin=*}

\NewDocumentEnvironment{case}{O{}}{%
	\begin{caseList}[#1]%
		}{%
	\end{caseList}%
}

% Define axiom environment
\newlist{axiomList}{enumerate}{1}
\setlist[axiomList]{label=\textbf{Axiom~\Alph*:}, leftmargin=*}

\NewDocumentEnvironment{axiom}{O{}}{%
	\begin{axiomList}[#1]%
		}{%
	\end{axiomList}%
}

% Custom QED symbol
\renewcommand\qedsymbol{$\scriptstyle\blacksquare$}

% Define accent color (customizable by the user)
\providecommand{\accentcolor}{black}

% Package documentation commands
\providecommand{\csthmpkg}{\textsf{csthm}}
\providecommand{\email}[1]{\href{mailto:#1}{\texttt{#1}}}

% User-level commands for customization
\newcommand{\setaccentcolor}[1]{\renewcommand{\accentcolor}{#1}}
%</package>
%    \end{macrocode}
%
% \Finale
\endinput