在文档的开头,我使用 创建了一个计数器\newcounter
。在文档的过程中,该计数器使用 增加\stepcounter
。如何在 最后一次出现之前\stepcounter
(例如在文档的开头)显示计数器的最终值?
答案1
这totcount
软件包确实做了这些事情:
\usepackage{totcount}
\newtotcounter{mycount}
定义\newtotcounter{mycount}
一个新的计数器并注册它;如果计数器已经定义(例如chapter
),那么
\regtotcounter{chapter}
只需将其注册到总计数系统。
您可以通过 打印计数器的最终值(与前一次 LaTeX 运行的值相同)\total{mycount}
。还有 ,\totvalue{mycount}
它是 的模拟\value{mycount}
。需要运行几次 LaTeX 才能实现同步。
答案2
以下是马丁评论的一些代码:
\documentclass{article}
\usepackage{scrlfile}% KOMA-Script package with it's own documentation
\makeatletter
\newcommand*{\demomycounter}{% This is only for demonstration and not part of the suggestion
\@whilenum \value{page}<2\do {%
Usage of mycounter with value \stepcounter{mycounter}\themycounter.\par
}%
}
\newcommand*\storecounteratend[1]{% command to tell LaTeX to save the last value for the next run
\BeforeClosingMainAux{%
\immediate\write\@auxout{%
\string\restorecounteratbegin{#1}{\csname the#1\endcsname}%
}%
}%
}
\newcommand*{\restorecounteratbegin}[2]{% used at the aux file
\expandafter\gdef\csname stored@#1\endcsname{#2}%
}
\newcommand*{\storedcounter}[1]{% user command to ask for the value
\@ifundefined{stored@#1}{???}{\csname stored@#1\endcsname}%
}
\makeatother
\newcounter{mycounter}
\storecounteratend{mycounter}
\begin{document}
Last value of mycounter was \storedcounter{mycounter}.
\demomycounter
\end{document}
而不是使用\BeforeClosingMainAux
来自包脚本文件,你可以使用\AfterLastShipout
包尽头。
另一个解决方案是使用\refstepcounter
而不是\stepcounter
。在这种情况下,您只需在文档末尾写一个标签,然后就可以使用\ref
:
\documentclass{article}
\usepackage{scrlfile}
\newcounter{mycounter}
\BeforeClosingMainAux{\label{mycounter}}
\makeatletter
\newcommand*{\demomycounter}{% This is only for demonstration and not part of the suggestion
\@whilenum \value{page}<2\do {%
Usage of mycounter with value \refstepcounter{mycounter}\themycounter.\par
}%
}
\begin{document}
Last value of mycounter was \ref{mycounter}.
\demomycounter
\end{document}
如果您不需要计数器的引用而是需要值,则可以将第二个建议与包结合起来引用计数。
答案3
在 ConTeXt 中,你不需要任何外部包来显示计数器的最终值:可以使用宏来实现\lastcounter[...]
。例如:
\definecounter[countername][numberconversion=Characters]
\starttext
There are \lastcounter[countername] counters.
\dorecurse{5}
{\convertedcounter[countername] randomtext \incrementcounter[countername] \crlf }
\stoptext
要在 Lua 端访问计数器的最后一个值,请使用
structures.counters.last("countername", 1)
答案4
该包针对新计数器或已经存在的计数器xassoccnt
定义了类似的策略(尽管尚未像totcount
包那样具有全部功能) 。\NewTotalDocumentCounter
\RegisterTotalDocumentCounter
该宏\TotalValue
是可扩展的(参见示例),并且可以用于在第二次编译运行后检索文档主体内任何位置的计数器的值。
\documentclass{article}
\usepackage[nonumberofruns]{xassoccnt}
\usepackage{blindtext}
\NewTotalDocumentCounter{foocntr}
\RegisterTotalDocumentCounter{section}
\begin{document}
The total value of section is \TotalValue{section}, whereas there are \TotalValue{foocntr} foos.
The real name is \TotalCounterInternalNameExp{section}%
\ifnum\TotalValue{section} > 1\relax Hooray \else only one section found\fi
\blinddocument
\setcounter{foocntr}{100}
\blinddocument
\setcounter{foocntr}{8472}
\end{document}