\newtotcounter 带有宏定义

\newtotcounter 带有宏定义

我尝试以程序方式定义\newtotcounters(来自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}

在此处输入图片描述

相关内容