TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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?

share|improve this question
up vote 18 down vote accepted

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

share|improve this answer
3  
\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 – clemens 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
\documentclass{article}
\usepackage{float}
\usepackage{etoolbox}
\ifdef{\thechapter}{\newfloat{foo}{htb}{bar}[chapter]}{}
\begin{document}%
x
\end{document}
share|improve this answer

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.

share|improve this answer
    
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

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.