我正在尝试读取特定部分的计数器值。例如
\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}
,你会得到这样的结果: