# Check if counter exists

I've written a package that introduces a new environment:

\newfloat{foo}{htb}{bar}[chapter]


The package however can be used for articles, books, ... Since not all of these environments have the concept of chapter, on gets a No counter 'chapter' defined. exception.

How can I check if the chapter counter is defined?

-

If a counter foo exists then a count \c@foo exists as well as a macro \thefoo. The \newcounter command (that most likely is used by \newfloat) actually checks if \c@foo exists and calls \@nocounterr{foo} if it doesn't.

The following also checks for \c@foo using etex's \ifcsname ...\endcsname:

\documentclass{article}

\makeatletter
\newcommand*\ifcounter[1]{%
\ifcsname c@#1\endcsname
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
}
\makeatother

\begin{document}

Counter \texttt{chapter} \ifcounter{chapter}{exists}{doesn't exist}.

Counter \texttt{section} \ifcounter{section}{exists}{doesn't exist}.

\end{document}


-
\newcommand\ifcounter[3]{\@ifundefined{c@#1}{#3}{#2}} – egreg Jan 24 '14 at 15:08
@egreg I know :) I just like \ifcsname a tiny bit better since it doesn't leave the command as \relax if it isn't defined – clemens Jan 24 '14 at 15:10
@egreg completely agree with clemens, see a good explanation of this issue here. – loved.by.Jesus Oct 11 '15 at 17:23
\documentclass{article}
\usepackage{float}
\usepackage{etoolbox}
\ifdef{\thechapter}{\newfloat{foo}{htb}{bar}[chapter]}{}
\begin{document}%
x
\end{document}

-

A TeX version of the conditional. Clemens used the e-TeX \ifcsname conditional. I just translated it into the TeX \ifx. I got inspired in this answer.

\documentclass{article}

\begin{document}

Counter \texttt{chapter}
\makeatletter
\ifx\c@chapter\undefined
doesn't exist
\else
it exists
\fi
\makeatother

Counter \texttt{section}
\makeatletter
\ifx\c@section\undefined
doesn't exist
\else
exists
\fi
\makeatother

\end{document}


The output is exactly the same as the first answer. May be somebody can tell the advantages/disadvantages compared with the others.

-
The \ifcsname approach doesn't rely on \undefined to really be undefined. – egreg Oct 11 '15 at 21:03
Is this a shortcoming to rely on \undefined? – loved.by.Jesus Oct 11 '15 at 21:06
Not really, but one should be trustful of package writers, but especially of users, who are fond of giving strange names to their macros. Thus \@undefined seems a better choice. – egreg Oct 11 '15 at 21:08