我编写了一个引入新环境的包:
\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}
输出与第一个答案完全相同。也许有人可以说出与其他方法相比的优点/缺点。