<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">% \iffalse meta-comment
% !TeX spellcheck = en-US
% 
% File:      templatetools.sty
% Version:   2023/03/26 v0.1
% Author:    Matthias Pospiech
% Email:     &lt;matthias@pospiech.eu&gt;
%
% Copyright (C) 2023 by Matthias Pospiech &lt;matthias@pospiech.eu&gt;
% ---------------------------------------------------------------------------
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% 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.3 or later is part of all distributions of LaTeX
% version 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Matthias Pospiech.
%
% This work consists of the files templatetools.dtx and templatetools.ins
% and the derived filebase templatetools.sty.
%
% \fi
%
% \iffalse
%&lt;*driver&gt;
\ProvidesFile{templatetools.dtx}
%&lt;/driver&gt;
%&lt;package&gt;\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%&lt;package&gt;\ProvidesPackage{templatetools}
%&lt;*package&gt;
    [2023/03/26 v0.2 Collection of conditional commands useful inside templates]
%&lt;/package&gt;
%
%&lt;*driver&gt;
\documentclass{ltxdoc}
\usepackage{hypdoc}
\RequirePackage[%
  loadHyperref=true,
  createIndexEntries=false,
  applyLayout=true]
{doctools} % 
%
\usepackage{lmodern}

\usepackage{templatetools}[2023/03/26]

\EnableCrossrefs  % (default) Every new macro name used within a macrocode or
                  % macrocodeâˆ— environment will produce an index entry.
% \DisableCrossrefs % turn off this feature
%
% If an index is created is determined by the use of the following
% declarations in the driver file preamble; if neither is used, no index is 
% produced.
\PageIndex     % all index entries refer to their page number
% \CodelineIndex % index entries produced by \DescribeMacro and \DescribeEnv
               %  refer to page number but those produced by the macro
               %  environment refer to the code lines, 
               % which will be numbered automatically.
% \CodelineNumbered % no index is created, but the code lines are numbered

\RecordChanges


\begin{document}
  \DocInput{templatetools.dtx}
  \PrintChanges
  \PrintIndex
\end{document}
%&lt;/driver&gt;
% \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     \&amp;
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \&lt;
%   Equals        \=     Greater than  \&gt;     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
%
% \changes{v0.1}{2017-10-12}{Converted to DTX file}
% \changes{v0.2}{2023/03/26}{Added checking of bib environments}
%
% \DoNotIndex{\newcommand,\newenvironment}
%
% \providecommand*{\url}{\texttt}
% \GetFileInfo{templatetools.dtx}
% \title{The \textsf{templatetools} package}
% \author{Matthias Pospiech \\ \url{matthias@pospiech.eu}}
% \date{\fileversion~from \filedate}
%
% \maketitle
% \begin{abstract}\noindent
% Collection of tools, which are helpful for the creation of a \LaTeX{}
% template if conditional paths for code execution are required. 
% \end{abstract}
%
% \section{Usage}
%
% \subsection{Commands}
% The following commands check if a command sequence is defined or not. 
%
% \DescribeMacro{\IfDefined} \marg{command}\marg{code defined} \AfterLastParam
% Executes the code if the command is defined. 
%
%
% \DescribeMacro{\IfUndefined} \marg{command}\marg{code undefined}
% \AfterLastParam 
% Executes the code if the command is not defined.
%
% \DescribeMacro{\IfElseDefined} \marg{command}\marg{defined}\marg{undefined}
% \AfterLastParam
% Executes either the code in the \emph{defined} bracket if the command is
% defined or in the \emph{undefined} bracket if the code is undefined.
%
% \DescribeMacro{\IfElseUndefined} \marg{command}\marg{undefined}\marg{defined}
% \AfterLastParam
% As \cs{IfElseDefined}, but with switched brackets for defined and undefined.
%
%
% \subsubsection{Example}
% The \cs{usepackage} code is only executed if the required \cs{upmu} command
% is defined.
% \iffalse
%&lt;*example&gt;
% \fi
\begin{lstlisting}[style=lstDemoStyleLaTeXCode]
% Requires: Command \upmu
\IfDefined{upmu}{\usepackage[upmu]{gensymb}}
\end{lstlisting}
% \iffalse
%&lt;/example&gt;
% \fi
%
%
% \DescribeMacro{\IfMultDefined} 
% \marg{list of commands}\marg{defined}\marg{undefined} \AfterLastParam
% Checks a comma separated list of commands before it executes the defined
% code path if all commands were defined or the undefined code path else.
%
% \subsubsection{Example}
% \iffalse
%&lt;*example&gt;
% \fi
\begin{lstlisting}[style=lstDemoStyleLaTeXCode]
% Requires: Command longtable and rowcolors
\IfMultDefined{longtable,rowcolors}
  {... longtable with rowcolors ...}
  {Error: Neither longtable nor rowcolors are defined}
\end{lstlisting}
% \iffalse
%&lt;/example&gt;
% \fi
%
% \subsection{Draft mode}
%
% The following commands check if draft mode is active or not.
%
% \DescribeMacro{\IfDraft}\marg{draft mode active}
% \AfterLastParam
%
% \DescribeMacro{\IfNotDraft}\marg{draft mode disabled}
% \AfterLastParam
%
% \DescribeMacro{\IfNotDraftElse}\marg{draft mode disabled}\marg{draft mode active}
% \AfterLastParam
%
% \subsubsection{Example}
% The \package{bookmark} is not loaded in draft mode:
% \iffalse
%&lt;*example&gt;
% \fi
\begin{lstlisting}[style=lstDemoStyleLaTeXCode]
\IfNotDraft{\usepackage[]{bookmark}}
\end{lstlisting}
% \iffalse
%&lt;/example&gt;
% \fi
%
%
% \subsection{Packages}
%
% These commands check if a package was loaded or not. 
% This can be achieved in different ways with commands from other packages.
% The key point of these commands here is that they work not only in 
% the preamble and include no @-char. 
% 
% \DescribeMacro{\IfPackageLoaded}\marg{package}\marg{is loaded}
% \AfterLastParam
%
% \DescribeMacro{\IfPackageNotLoaded}\marg{package}\marg{is not loaded}
% \AfterLastParam
%
% \DescribeMacro{\IfPackagesLoaded}\marg{list of packages}\marg{all are loaded}
% \AfterLastParam
%
% \DescribeMacro{\IfPackagesNotLoaded}\marg{list of packages}\marg{none is loaded}
% \AfterLastParam
%
% \subsubsection{Example}
%
% \iffalse
%&lt;*example&gt;
% \fi
\begin{lstlisting}[style=lstDemoStyleLaTeXCode]
% Load epstopdf only if graphicx was loaded
\IfPackageLoaded{graphicx}{%
  \usepackage{epstopdf}
}
% Do not load subcaption if subfig was loaded (incompatible)
\IfPackageNotLoaded{subfig}{
  \usepackage{subcaption}[2011/08/17]
}
\end{lstlisting}
% \iffalse
%&lt;/example&gt;
% \fi
%
%
% \subsection{Package Loading order}
% In \latex{} documents it is quite often essential
% to load packages in the right order to ensure that everything works.
% However this makes it impossible to group similar packages together.
%
% The following commands allow to execute code after or before a 
% specified package and thus also allows to load packages in a specified order
% using \cs{usepackage} commands.
%
% If the reference package was not loaded in the preamble
% the code will nevertheless be executed before \texttt{\cs{begin}\{document\}}
%
% 
% \DescribeMacro{\ExecuteAfterPackage}
% \marg{after this package}\marg{execute this code}\AfterLastParam
%
% \DescribeMacro{\ExecuteBeforePackage}
% \marg{before this package}\marg{execute this code}\AfterLastParam
%
% \subsubsection{Example}
% \package{cleveref} package must be loaded after package \package{hyperref}.
%
% \iffalse
%&lt;*example&gt;
% \fi
\begin{lstlisting}[style=lstDemoStyleLaTeXCode]
% loading: must be loaded after hyperref and after varioref
\ExecuteAfterPackage{hyperref}{
% caption and cleveref incompatible in Versions before 2011/12/24
  \usepackage{cleveref}[2011/12/24]
}
\end{lstlisting}
% \iffalse
%&lt;/example&gt;
% \fi
%
% \subsection{Tikz Library}
% Checks if a tikz library was loaded.
%
% \DescribeMacro{\IfTikzLibraryLoaded}\marg{library}\marg{if loaded}
%
% 
% \subsubsection{Example}
% Executes the code only of the tikz library was loaded.
%
% \iffalse
%&lt;*example&gt;
% \fi
\begin{lstlisting}[style=lstDemoStyleLaTeXCode]
\IfTikzLibraryLoaded{lindenmayersystems}{%
% code origin: pgf/tikz manual
\begin{tikzpicture}
\pgfdeclarelindenmayersystem{Koch curve}{
   \rule{F -&gt; F-F++F-F}
}
\shadedraw [top color=white, bottom color=blue!50, draw=blue!50!black]
           [l-system={Koch curve, step=2pt, angle=60, axiom=F++F++F, order=3}]
           lindenmayer system -- cycle;
\end{tikzpicture}
}%
\end{lstlisting}
% \iffalse
%&lt;/example&gt;
% \fi
%
% \subsection{Column types}
%
% \LaTeX{} provides no tool to check for the existence of a column type. 
% This is provided by the following commands:
%
% \DescribeMacro{\IfColumntypeDefined}\marg{columntype character}\marg{is 
% defined}\marg{is undefined} \AfterLastParam
%
% ^^A which is also available as a command checking a comma separated list for 
% ^^A column type characters
%
% \DescribeMacro{\IfColumntypesDefined}
% \marg{columntype character list}\marg{is defined}\marg{is undefined}
% \AfterLastParam
%
% \subsubsection{Example}
% Executes the code only of the X column type is defined and the tabularx package was 
% loaded by checking that \cs{tabularx} is defined.
%
% \iffalse
%&lt;*example&gt;
% \fi
\begin{lstlisting}[style=lstDemoStyleLaTeXCode]
\IfColumntypeDefined{X}{%
\IfDefined{tabularx}{%
%
\begin{tabularx}{0.9\textwidth}{llXX}
\hline
l &amp; l &amp; X &amp; X \\\hline
%
left column &amp; left column &amp; 
text which is considerably longer than the width of the column &amp; 
text which is considerably longer than the width of the column \\
\hline
\end{tabularx}
%
}}%
\end{lstlisting}
% \iffalse
%&lt;/example&gt;
% \fi

% \subsection{Color definitions}
%
% Color definitions are saved in \latex{} as names. The following commands
% provide a convenient way to check the existence of these color definitions.
% 
% \DescribeMacro{\IfColorDefined} 
% \marg{color name}\marg{is defined}\marg{is undefined} \AfterLastParam
%
%
% \DescribeMacro{\IfColorsDefined}
% \marg{list of color name}\marg{is defined}\marg{is undefined} \AfterLastParam
%
% \subsection{Math font version}
% \DescribeMacro{\IfMathVersionDefined}
% \marg{font version}\marg{is defined}\marg{is undefined} \AfterLastParam
%
%
% \subsection{Glossaries styles}
% \DescribeMacro{\IfGlossariesStyleDefined} 
% \marg{style name}\marg{is defined} \AfterLastParam
%
% \subsection{Bib environments}
% \DescribeMacro{\IfBibEnvironmentDefined} 
% \marg{environment name}\marg{is defined} \AfterLastParam
%
% \subsection{Template Definitions}
% The following commands in principle define only macros, but in contrast to 
% normal methods these are saved using two keys named \emph{group} 
% and \emph{property}. With a matching command for the execution this
% allows to generate macros in an object like naming structure, which
% can be used to toggle settings. 
%
% \DescribeMacro{\SetTemplateDefinition} \marg{Group}\marg{Property}\marg{Code}
% \AfterLastParam
% Defines a collection of commands (a macro) with a \emph{group} and 
% \emph{property}.
%
% \DescribeMacro{\UseDefinition} \marg{Group}\marg{Property} \AfterLastParam
% Execute macro save with the \emph{group} and \emph{property}.
%
% \subsubsection{Example}
% The following code allows to switch the colors anywhere in the document:
%
% \iffalse
%&lt;*example&gt;
% \fi
\begin{lstlisting}[style=lstDemoStyleLaTeXCode]
\SetTemplateDefinition{Target}{Web}{%
  \definecolor{pdfurlcolor}{rgb}{0,0,0.6}
}%
\SetTemplateDefinition{Target}{Print}{%
  \definecolor{pdfurlcolor}{rgb}{0,0,0}
}%
% Apply colors for web
\UseDefinition{Target}{Web}
\end{lstlisting}
% \iffalse
%&lt;/example&gt;
% \fi
%
% \StopEventually{}
% \clearpage
% \section{Implementation}
%
% \iffalse
%&lt;*templatetools.sty&gt;
% \fi
%
%
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{templatetools}
          [2023/03/26 v0.2 Collection of conditional commands useful inside templates]
%    \end{macrocode}
%    \begin{macrocode}
%%% --- Necessary Packages
%%% ------------------------------------------------------------------
\RequirePackage{iftex}
\RequirePackage{etoolbox}
\RequirePackage{ltxcmds}
\RequirePackage{array} % for column types
\RequirePackage{ifdraft} % check draft
\RequirePackage{scrlfile}
%    \end{macrocode}
%
% \subsection{Command sequences}
%
% \iffalse
%%% --- Check if command is defined
%%% ------------------------------------------------------------------
% \fi
%
%
% \begin{macro}{\IfDefined}
% Wrapper to \cs{ifcsdef} with only true path.
%    \begin{macrocode}
\newcommand{\IfDefined}[2]{\ifcsdef{#1}{#2}{}}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfUndefined}
% Wrapper to \cs{ifcsdef} with only false path.
%    \begin{macrocode}
\newcommand{\IfUndefined}[2]{\ifcsdef{#1}{}{#2}}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfElseDefined}
% Wrapper to \cs{ifcsdef} with true and false path.
%    \begin{macrocode}
\newcommand{\IfElseDefined}[3]{\ifcsdef{#1}{#2}{#3}}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfElseUndefined}
% Wrapper to \cs{ifcsdef} with true and false path in reverse order.
%    \begin{macrocode}
\newcommand{\IfElseUndefined}[3]{\ifcsdef{#1}{#3}{#2}}%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfMultDefined}
% Checks if more than one command is defined
%    \begin{macrocode}
\newcommand{\IfMultDefined}[1]{%
  \@tempswatrue
  \def\do##1{%
%% define \@tempa with trimmed index element.
    \edef\@tempa{\zap@space##1 \@empty}%
%% check if package of current index is loaded
    \ifcsdef{\@tempa}{}{\@tempswafalse}%
  }%
%% Process csv list with command \do (etoolbox)
  \docsvlist{#1}%
%% makes sure that the conditional works with one or two (if, else) parameters.
  \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi%
}
%    \end{macrocode}
% \end{macro}
% 
% Thanks to \person{egreg,Andrey Vihrov, Martin Scharrer} on 
%\href{http://tex.stackexchange.com/questions/35282/how-to-implement-a-command-that-checks-for-loaded-packages}{tex.stackexchange.com}
% for the help to implement a command that checks a comma separated list. 
%
% \subsection{Draft mode}
%
% \iffalse
% ------------------------------------------------------------------
% Check for 'draft' mode - commands.
% ------------------------------------------------------------------
% \fi
%
%
% \begin{macro}{\IfDraft}
% Tests if \cs{@draft} is undefined and executed false path in case draft string 
% is defined.
%    \begin{macrocode}
\newcommand{\IfDraft}[1]{\ifx\@draft\@undefined \else #1 \fi}
%    \end{macrocode}
% \end{macro}

%
% \begin{macro}{\IfNotDraft}
% Similar to \cs{IfDraft} but executes only path for draft mode undefined.
%    \begin{macrocode}
\newcommand{\IfNotDraft}[1]{\ifx\@draft\@undefined #1 \fi}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfNotDraftElse}
% Similar to \cs{IfDraft} but executes true and fals path.
%    \begin{macrocode}
\newcommand{\IfNotDraftElse}[2]{\ifx\@draft\@undefined #1 \else #2 \fi}
%    \end{macrocode}
% \end{macro}
%
%
%
% \subsection{Packages}
%
% \iffalse
% ------------------------------------------------------------------
% Check load status of packages
% ------------------------------------------------------------------
% \fi
%
% If a package is loaded can be checked in many ways, but here the 
% \cs{ltx@ifpackageloaded} is used because it can be executed anywhere
% in the document. 
%
% \begin{macro}{\IfPackageLoaded}
% Wrapper to \cs{ltx@ifpackageloaded} with only true path.
%    \begin{macrocode}
\newcommand{\IfPackageLoaded}[2]{\ltx@ifpackageloaded{#1}{#2}{}}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfPackageNotLoaded}
% Wrapper to \cs{ltx@ifpackageloaded} with only false path.
%    \begin{macrocode}
\newcommand{\IfPackageNotLoaded}[2]{\ltx@ifpackageloaded{#1}{}{#2}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\IfElsePackageLoaded}
% Wrapper to \cs{ltx@ifpackageloaded}
%    \begin{macrocode}
\let\IfElsePackageLoaded\ltx@ifpackageloaded
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\IfPackagesLoaded}
% Checks a list of packages
%    \begin{macrocode}
\newcommand{\IfPackagesLoaded}[1]{%
  \@tempswatrue
  \def\do##1{%
    \edef\@tempa{\zap@space##1 \@empty}%
    \ltx@ifpackageloaded{\@tempa}{}{\@tempswafalse}%
  }%
  \docsvlist{#1}%
  \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfPackagesNotLoaded}
% Invers check if all packages in a list are not loaded
%    \begin{macrocode}
\newcommand{\IfPackagesNotLoaded}[1]{%
  \@tempswatrue
  \def\do##1{%
    \edef\@tempa{\zap@space##1 \@empty}%
    \ltx@ifpackageloaded{\@tempa}{\@tempswafalse}{}%
  }%
  \docsvlist{#1}%
  \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ExecuteAfterPackage}
% Executes the code after the reference package has been loaded (using
% \cs{AfterAtEndOfPackage}) or finally at the end of the preamble
% if the reference package was not loaded until then.
%
%    \begin{macrocode}
\newcommand{\ExecuteAfterPackage}[2]{%
%% #1: after this package
%% #2: code to execute
  \AfterAtEndOfPackage{#1}{
    #2%
  }
  \AtEndPreamble{%
    \IfPackageNotLoaded{#1}{%
     #2%
    }
  }
} 
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\ExecuteBeforePackage}
% Executes the code directly before the reference package is loaded (using
% \cs{BeforePackage}) or finally at the end of the preamble
% if the reference package was not loaded until then.
%
%    \begin{macrocode}
\newcommand{\ExecuteBeforePackage}[2]{%
%% #1: before this package
%% #2: code to execute
  \BeforePackage{#1}{
    #2%
  }
  \AtEndPreamble{%
    \IfPackageNotLoaded{#1}{%
     #2%
    }
  }
} 
%    \end{macrocode}
% \end{macro}
%
% \subsection{Tikz library}
%
% \iffalse
% ------------------------------------------------------------------
% The command sequence that is created for each tikz library when it is loaded is 
% used to check if it is loaded.
% \fi
%
%
% \begin{macro}{\IfTikzLibraryLoaded}
% Checks if the tikz library is loaded
%    \begin{macrocode}
\def\IfTikzLibraryLoaded#1{%
  \ifcsname tikz@library@#1@loaded\endcsname
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
%    \end{macrocode}
% \end{macro}
%
% Thanks to \person{egreg} and \person{Marco Daniel} on \href{http://tex.stackexchange.com/questions/48453/how-to-test-if-tikz-library-is-loaded}{tex.stackexchange.com} for their help with this command.
%
% \subsection{Column types in tables}
%
% \iffalse
% ------------------------------------------------------------------
% table columns
% ------------------------------------------------------------------
% \fi
%
% The code in this section was inspired by the discussion with \person{egreg} on \href{http://tex.stackexchange.com/questions/35527/how-to-check-if-a-column-type-is-defined}{tex.stackexchange.com} on the detection of column definitions.
%
% Creates a list of predefined columntypes
%    \begin{macrocode}
\expandafter\let\csname columntype@l\endcsname\@empty
\expandafter\let\csname columntype@c\endcsname\@empty
\expandafter\let\csname columntype@r\endcsname\@empty
\expandafter\let\csname columntype@p\endcsname\@empty
\expandafter\let\csname columntype@m\endcsname\@empty
\expandafter\let\csname columntype@b\endcsname\@empty
\expandafter\let\csname columntype@@\endcsname\@empty
\expandafter\let\csname columntype@!\endcsname\@empty
\expandafter\let\csname columntype@|\endcsname\@empty
\expandafter\let\csname columntype@&lt;\endcsname\@empty
\expandafter\let\csname columntype@&gt;\endcsname\@empty
\expandafter\let\csname columntype@=\endcsname\@empty
%    \end{macrocode}
%
% \begin{macro}{\CheckIfColumntypeDefined}
% Creates a bool variable that saves the status of the column type.
%    \begin{macrocode}
\newcommand\CheckIfColumntypeDefined[1]{%
%% create the bool variable for column type
  \providebool{tpl@coltype@#1}
%% check if new column type of this name was created
  \ifcsdef{NC@find@\string#1}%
    {\setbool{tpl@coltype@#1}{true}}%
%% if not check if it is a predefined column type
    {\ifcsdef{columntype@\string#1}
      {\setbool{tpl@coltype@#1}{true}}%
      {\setbool{tpl@coltype@#1}{false}}%
    }%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\isColumntypeDefined}
% Returns the bool variable which can be interpreted by \cs{ifboolexpr}.
% This should only be used internally and fails for nonexistent bool variables.
%    \begin{macrocode}
\newcommand\isColumntypeDefined[1]{tpl@coltype@#1}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfColumntypeDefined}
% Executes \cs{CheckIfColumntypeDefined} and uses the resulting bool
% variable with \cs{isColumntypeDefined} in a conditional sequence with 
% \cs{ifboolexpr}.
%    \begin{macrocode}
\newcommand\IfColumntypeDefined[3]{%
%% Execute check which create bool variable
  \CheckIfColumntypeDefined{#1}
%% use bool variable for if sequence
  \ifboolexpr{ bool{\isColumntypeDefined{#1}} }{#2}{#3}%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfColumntypesDefined}
% Checks a comma separated list instead of a single string.
%    \begin{macrocode}
\newcommand{\IfColumntypesDefined}[1]{%
  \@tempswatrue
  \def\do##1{%
    \edef\@tempa{\zap@space##1 \@empty}%
%% check if column is defined.
%%   Here with \expandafter because of the \string definition 
%%   in \CheckIfColumntypeDefined. 
    \expandafter\IfColumntypeDefined
        \expandafter{\@tempa}{}{\@tempswafalse}
  }%
  \docsvlist{#1}%
  \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \subsection{Color definitions}
%
% \iffalse
% ------------------------------------------------------------------
% test color definitions
% ------------------------------------------------------------------
% \fi
%
%
% \begin{macro}{\IfColorDefined}
% Tests if a color is defined
%    \begin{macrocode}
\newcommand{\IfColorDefined}[3]{%
  \ifcsdef{\string\color @#1}
    {#2} % color string is defined
    {#3}} % color string is not defined
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\IfColorsDefined}
% Does the same for a list (comma separated) of color names.
%    \begin{macrocode}
\newcommand{\IfColorsDefined}[1]{%
  \@tempswatrue
  \def\do##1{%
    \edef\@tempa{\zap@space##1 \@empty}%
    \expandafter\IfColorDefined
        \expandafter{\@tempa}{}{\@tempswafalse}
  }%
  \docsvlist{#1}%
  \if@tempswa\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi%
}
%    \end{macrocode}
% \end{macro}
%
% \subsection{Math font version}
%
% \iffalse
% ------------------------------------------------------------------
% test math versions
% ------------------------------------------------------------------
% \fi
%
% \begin{macro}{\IfMathVersionDefined}
% Checks if a mathversion font is defined.  
%    \begin{macrocode}
\newcommand{\IfMathVersionDefined}[3]{\ifcsdef{mv@#1}{#2}{#3}}
%    \end{macrocode}
% \end{macro}
%
% Thanks to \person{Werner} and \person{Ulrike Fischer} for pointing me to this
% name definition on 
% \href{http://tex.stackexchange.com/questions/40903/check-if-mathversion-font-is-defined}{tex.stackexchange.com}.
%
%
% \subsection{Glossaries styles}
%
% \iffalse
% ------------------------------------------------------------------
% tests the existens of glossaries styles
% ------------------------------------------------------------------
% \fi
%
% \begin{macro}{\IfGlossariesStyleDefined}
% Checks if a glossaries style is defined.  
%    \begin{macrocode}
\newcommand{\IfGlossariesStyleDefined}[2]{\ifcsdef{@glsstyle@#1}{#2}{}}
%    \end{macrocode}
% \end{macro}
%
% Thanks to \person{cgnieder} on 
%\href{http://tex.stackexchange.com/questions/95639/test-if-a-listings-or-glossaries-style-is-valid}{tex.stackexchange.com}
% for the help to implement the command.
%
% \subsection{BibLaTeX Enivronemnts}
%
% \iffalse
% ------------------------------------------------------------------
% tests the existens of a bib environment
% ------------------------------------------------------------------
% \fi
%
% \begin{macro}{\IfBibEnvironmentDefined}
% Checks if a bib environment is defined.  
%    \begin{macrocode}
\newcommand{\IfBibEnvironmentDefined}[1]{\ifcsdef{blx@env@#1}}
%    \end{macrocode}
% \end{macro}
%
% Thanks to \person{egreg} on \href{https://tex.stackexchange.com/questions/451911/check-if-a-bib-environment-is-defined}{tex.stackexchange.com} for the help to implement the command.
%
% \subsection{Template definitions}
%
% \iffalse
% ------------------------------------------------------------------
% template definitions
% ------------------------------------------------------------------
% \fi
%
%
% \begin{macro}{\SetTemplateDefinition}
% Defines a macro with the \emph{group} and \emph{property} parameter names.
%    \begin{macrocode}
\newcommand\SetTemplateDefinition[3]{% 1: group, 2: property, 3: code
  \csdef{tpl@definition@#1@#2}{#3}
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\UseDefinition}
% Executes the macro using \cs{csuse} if it is defined. Otherwise a warning is 
% thrown.
%    \begin{macrocode}
\newcommand\UseDefinition[2]{%
  \ifcsdef{tpl@definition@#1@#2}
    {\csuse{tpl@definition@#1@#2}}
    {\PackageWarning{templatetools}%
      {Definition #1-&gt;#2 is unknown\MessageBreak}{}}%
}%
%    \end{macrocode}
% \end{macro}
%
%
% \iffalse
%&lt;/templatetools.sty&gt;
% \fi
%
% \Finale
\endinput

</pre></body></html>