检查计数器是否存在

检查计数器是否存在

我编写了一个引入新环境的包:

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

但是,该包可以用于文章、书籍等。由于并非所有这些环境都有的概念chapter,因此会出现No counter 'chapter' defined.例外。

我如何检查章节计数器是否已定义?

答案1

如果计数器foo存在,则计数\c@foo和宏都存在\thefoo\newcounter命令(最有可能由使用\newfloat)实际上检查是否存在,如果不存在则\c@foo调用。\@nocounterr{foo}

下面还检查是否\c@foo使用 etex \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}

在此处输入图片描述

答案2

\documentclass{article}
\usepackage{float}
\usepackage{etoolbox}
\ifdef{\thechapter}{\newfloat{foo}{htb}{bar}[chapter]}{}
\begin{document}%
x
\end{document}

答案3

条件的 TeX 版本。Clemens 使用了 e-TeX\ifcsname条件。我刚刚将其翻译成 TeX \ifx。我受到了启发这个答案

\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}

输出与第一个答案完全相同。也许有人可以说出与其他方法相比的优点/缺点。

相关内容