我尝试以程序方式定义\newtotcounter
s(来自totcount
包),就像另一个计数器在bar\thefoo
哪里foo
一样(详细信息见下面的 MWE)。但是,只有最后一个\newtotcounter
按预期工作,而所有其他的都显示不正确\totvalue
(好像需要额外的编译),甚至多次编译也无法解决这个问题。但是,如果我分别更改\newtotcounter{bar\thefoo}
为\newtotcounter{bar0}
和\newtotcounter{bar1}
,一切都按预期工作。此外,两个计数器的 plain\value
都表现正常,就像 plain 一样\newcounter
。似乎当totcount
试图在辅助文件中保存新的 totcounters 时,它实际上会覆盖以前的值(它bar\thefoo
在两种情况下都看到字符串,而不是bar0
第一个和bar1
第二个?)。我该如何防止这种情况?
MWE(这里显示了 2 个计数器,但只有第二个有效,如果有更多计数器,只有最后一个有效):
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{totcount}
\newcounter{foo}
\newtotcounter{bar\thefoo}
\setcounter{bar0}{5}
\stepcounter{foo}
\newtotcounter{bar\thefoo}
\setcounter{bar1}{6}
\begin{document}
value of bar0: \the\value{bar0}
totvalue of bar0: \the\totvalue{bar0}
value of bar1: \the\value{bar1}
totvalue of bar1: \the\totvalue{bar1}
\end{document}
答案1
foo
通过您的示例,当计数器的所有递增/步进都已完成时,将获取要创建的 totcounter 的名称并在 LaTeX 运行结束时将其写入 .aux 文件。
尝试类似的事情\expanded{\noexpand\newtotcounter{bar\thefoo}}
,以便在处理命令时获得要创建的 totcounter 的\expanded{\noexpand\newtotcounter{bar\number\value{foo}}}
值以及其名称。foo
\newtotcounter
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{totcount}
\newcounter{foo}
\expanded{\noexpand\newtotcounter{bar\number\value{foo}}}
\setcounter{bar0}{5}
\stepcounter{foo}
\expanded{\noexpand\newtotcounter{bar\number\value{foo}}}
\setcounter{bar1}{6}
\begin{document}
value of bar0: \the\value{bar0}
totvalue of bar0: \the\totvalue{bar0}
value of bar1: \the\value{bar1}
totvalue of bar1: \the\totvalue{bar1}
\end{document}
(但是这种扩展技巧不能解决在 多次表示几个不同的辅助文件时 totcount 2011/01/25 v1.2 可能出现的问题。)\newtotcounter/\regtotcounter[auxfile=⟨file⟩]{⟨counter⟩}
答案2
问题在于\newtotcounter
在文档末尾分配“总”版本,因此\thefoo
扩展得太晚了。
实际上,应该真正\arabic{foo}
确保您得到的是一个数字,而不是另一种表示形式。
\newtotcounter
因此您需要在执行时进行扩展。
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{totcount}
\newcommand{\newlinkedtotcounter}[2]{%
% #1 = name for the linked totcounter, #2 = name of the parent counter
% for older TeX systems
%\begingroup\edef\x{\endgroup\noexpand\newtotcounter{#1\arabic{#2}}}}\x
% for newer TeX systems
%\expanded{\noexpand\newtotcounter{#1\arabic{#2}}}%
% for up-to-date TeX systems
\ExpandArgs{e}\newtotcounter{#1\arabic{#2}}%
}
\newcounter{foo}
\newlinkedtotcounter{bar}{foo}
\setcounter{bar0}{5}
\stepcounter{foo}
\newlinkedtotcounter{bar}{foo}
\setcounter{bar1}{6}
\begin{document}
value of bar0: \the\value{bar0}
totvalue of bar0: \the\totvalue{bar0}
value of bar1: \the\value{bar1}
totvalue of bar1: \the\totvalue{bar1}
\end{document}
答案3
这里,我将论点扩展为\newtotcounter
。
\documentclass{article}
\usepackage[utf8]{inputenc}
\def\Bar{bar}
\usepackage{totcount}
\newcounter{foo}
%\newtotcounter{bar\thefoo}
\expandafter\newtotcounter\expandafter{\expanded{bar\thefoo}}
\stepcounter{foo}
%\newtotcounter{bar\thefoo}
\expandafter\newtotcounter\expandafter{\expanded{bar\thefoo}}
\begin{document}
totvalue of bar0: \the\totvalue{bar0}
totvalue of bar1: \the\totvalue{bar1}
\setcounter{bar0}{5}
\setcounter{bar1}{6}
value of bar0: \the\value{bar0}
value of bar1: \the\value{bar1}
\end{document}