如何读取每个部分的计数器值

如何读取每个部分的计数器值

我正在尝试读取特定部分的计数器值。例如

\documentclass{article}
\usepackage{amsmath}

\newcounter{M}[section]
\numberwithin{M}{section}
\newcommand{\foo}{\refstepcounter{M}(\theM)\\}

\begin{document}

\section{First}
\foo
\foo
\foo
\section{Second}
\foo
\foo

\countervalue{M}{1}
\countervalue{M}{2}

\end{document}

我想\countervalue{M}{1}返回 3 和\countervalue{M}{2}2(或分别为 1.3 和 2.2),可以吗?

答案1

好吧,我找到了一种更简单的方法,使用 etoolbox

\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}

\newcounter{M}[section]
\numberwithin{M}{section}
\newcommand{\foo}{
    \refstepcounter{M}
    \csxdef{M\thesection}{\arabic{M}}
    (\theM)\\}

\begin{document}
    \section{First}
    \foo
    \foo
    \foo
    \section{Second}
    \foo
    \foo
    First section has: \csuse{M1} foos\\
    Second section has: \csuse{M2} foos
\end{document}

在此处输入图片描述

答案2

一个计数器是不够的,因为您需要为每个部分记录不同的值。以下是一种方法:

\documentclass{article}
% \usepackage{xparse} % uncomment for LaTeX kernels older than 2020-10-01
\usepackage{etoolbox}

\makeatletter
\NewDocumentCommand{\arystoDef}{s O{section} m}{%
  \newtoggle{arysto@#3@within}%
  \IfBooleanT{#1}% if the starred version was used
    {\toggletrue{arysto@#3@within}%
     \csdef{arysto@#3@parentctr}{#2}% record name of the parent counter for #3
    }%
}

\newcommand*{\arystoIncr}[1]{%
  \edef\arysto@ctrname{arysto@#1@ctr@\number\value{section}}%
  \@ifundefined{c@\arysto@ctrname}
    {\newcounter{\arysto@ctrname}%
     \iftoggle{arysto@#1@within}{%
         \csedef{the\arysto@ctrname}{%
           \arabic{\csuse{arysto@#1@parentctr}}.%
           \unexpanded\expandafter\expandafter\expandafter{%
             \csname the\arysto@ctrname\endcsname}%
         }%
     }{}%
    }{}%
  \refstepcounter{\arysto@ctrname}%
  (\csuse{the\arysto@ctrname})%
}

\newcommand*{\countervalue}[2]{%
  \csuse{thearysto@#1@ctr@#2}%
}
\makeatother

\arystoDef{foo}
\newcommand*{\foo}{\arystoIncr{foo}}

\begin{document}

\section{First}
\foo
\foo
\foo
\section{Second}
\foo
\foo

\bigskip\noindent
\countervalue{foo}{1}\\
\countervalue{foo}{2}

\end{document}

在此处输入图片描述

如果你使用\arystoDef*{foo}\arystoDef*[section]{foo}代替\arystoDef{foo},你会得到这样的结果:

在此处输入图片描述

相关内容