我想在文本中使用计数器,但只能在稍后设置。如下所示:
\newcounter{howmany}
There are \thehowmany items in this list:
\begin{enumerate}
\item one
\item two
\item three
\setcounter{howmany}{\theenumi}
\end{enumerate}
它应该显示“此列表中有 3 个项目”。但那不起作用。好吧,当然。我需要使用\refstepcounter
来获得保存功能。但\refstepcounter
只能将其增加一,而且似乎没有\refsetcounter
;) 有什么建议吗?枚举结束后循环\refstepcounters
?重新定义\item
为包含\refstepcounter
?一定有更简单的方法,不是吗?
谢谢!
答案1
欢迎来到 TeX.SE。这是该包的工作totcount
。您需要编译两次,因为totcount
它使用该.aux
文件来存储文档中分配给计数器的最后一个值。
请注意,在调用中我使用了\value{enumi}
而不是 ,以防万一它没有扩展为整数表示(可能会使用或格式化等)。\thenumi
\setcounter
\thenumi
\thenumi
\roman
\alph
\documentclass{article}
\usepackage{totcount}
\begin{document}
\newtotcounter{howmany}
There are \total{howmany}~items in this list:
\begin{enumerate}
\item one
\item two
\item three
\setcounter{howmany}{\value{enumi}}
\end{enumerate}
\end{document}
如果已存在\newcounter
针对所讨论的计数器的命令并且您不想或无法将此命令更改为调用,则可以使用包\newtotcounter
注册该计数器(如果计数器由包定义,这将很有用)。totcount
\regtotcounter{countername}
这也适用于非十进制标签
如果您使用非十进制标签格式,此技术同样有效:
\documentclass{article}
\usepackage{totcount}
\renewcommand{\theenumi}{\alph{enumi}}
\begin{document}
\newtotcounter{howmany}
There are \total{howmany}~items in this list; their labels are
\ref{first-item}, \ref{second-item}, and \ref{third-item}.
\begin{enumerate}
\item \label{first-item}one
\item \label{second-item}two
\item \label{third-item}three
\setcounter{howmany}{\value{enumi}}
\end{enumerate}
\end{document}
答案2
您可以将列表包装在环境中进行计数:
\documentclass{article}
\makeatletter
\newenvironment{countitems}[1]
{% #1 is the label for referring to the count
\def\countitems@label{#1}%
}
{%
\edef\@currentlabel{\arabic{enum\romannumeral\numexpr\@enumdepth+1}}%
\label{\countitems@label}%
\ignorespacesafterend
}
\makeatother
\begin{document}
The following list has \ref{firstlist} items
\begin{countitems}{firstlist}
\begin{enumerate}
\item one
\item two
\item three
\begin{countitems}{innerlist}
\begin{enumerate}
\item A
\item B
\end{enumerate}
\end{countitems}
\end{enumerate}
\end{countitems}
The inner list has \ref{innerlist} items.
\end{document}
或者,您可以在相关命令后使用\end{enumerate}
\documentclass{article}
\makeatletter
\newcommand{\countitems}[1]{%
\edef\@currentlabel{\arabic{enum\romannumeral\numexpr\@enumdepth+1}}%
\label{#1}%
\ignorespaces
}
\makeatother
\begin{document}
The following list has \ref{firstlist} items
\begin{enumerate}
\item one
\item two
\item three
\begin{enumerate}
\item A
\item B
\end{enumerate}\countitems{innerlist}
\end{enumerate}\countitems{firstlist}
The inner list has \ref{innerlist} items.
\end{document}
答案3
只是复制上面评论中给出的@cgnieder 的答案,以供参考。请参阅上面评论中的讨论以了解优缺点,但这肯定是一种简单的可能性:
There are \ref{countforme} items in this list:
\begin{enumerate}
\item one
\item two
\item \label{countforme} three
\end{enumerate}