30

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?

3 Answers3

29

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}

enter image description here

cgnieder
  • 66,645
  • 5
    \newcommand\ifcounter[3]{\@ifundefined{c@#1}{#3}{#2}} – egreg Jan 24 '14 at 15:08
  • 3
    @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 – cgnieder Jan 24 '14 at 15:10
  • 1
    @egreg completely agree with clemens, see a good explanation of this issue here. – loved.by.Jesus Oct 11 '15 at 17:23
  • Why are the \expandafters needed? I figured that the conditional would expand to \@firstoftwo (or \@secondoftwo), and we'd be left with \@firstoftwo{exists}{doesn't exist}. – Beelzebielsk Dec 21 '18 at 17:29
  • @Beelzebielsk see https://tex.stackexchange.com/questions/107753/why-the-expandafter-firstoftwo-idiom – cgnieder Dec 23 '18 at 11:57
  • @cgnieder Seems LaTeX was fixed and newer versions don't leave the command as \relax anymore (http://www.texfaq.org/FAQ-isdef). – Daniel Oct 31 '20 at 09:21
13
\documentclass{article}
\usepackage{float}
\usepackage{etoolbox}
\ifdef{\thechapter}{\newfloat{foo}{htb}{bar}[chapter]}{}
\begin{document}%
x
\end{document}
4

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.