定义有条件地定义/检查计数器的命令

定义有条件地定义/检查计数器的命令

为了完成一个自定义包命令,我需要一个内部宏,我称它为\@test@count{❬argument❭},并且应该完成以下内容:

  1. 内部定义一个新的计数器\❬argument❭并将其设置为1
  2. 检查计数器是否\❬argument❭已定义,因此它必须有条件地依赖于先前计数器的存在:

    2.1. 如果\❬argument❭已经定义,则不会覆盖以前的存储的值\❬argument❭(就像它已经保存了它的声明一样)但它会将其推进1

    2.2. 如果\❬argument❭没有定义,则直接创建它。

如果满足上述所有要求,则 MWE(在这种情况下\@test@count{❬argument❭}用于获取与包命令相同的任务\mycommand):

\documentclass{article}
%
\makeatletter
\def\@test@count#1{%
 %mysterious (La)TeX sorcery should happen here
}
\def\mycommand[#1]#2{%
 \@test@count{#1}%
 This is the value of the counter~"#1":~\expandafter\the\csname #1\endcsname~#2\par%
}
\makeatother
%
\begin{document}
%
\mycommand[myfoo]{lorem}
\mycommand[mybar]{ipsum}
\mycommand[mybaz]{dolor}
\mycommand[myfoo]{sit}
\mycommand[mybar]{amet}
\mycommand[myfoo]{consectetur}
\mycommand[mybaz]{adipisci}
%
\end{document}

应该产生:

在此处输入图片描述

text插入以表明可以不受限制地填充次要参数。

在示例中,\mycommand[myfoo]{...}定义计数器\myfoo并将其设置为,因为之前1没有声明其他计数器;然后定义等等。当再次调用时,将测试是否已定义,在这种情况下,结果为“真”,然后计数器前进。对于任何连续声明和,都会遵循相同的推理。\myfoo\mycommand[mybar]{...}\mybar\mycommand[myfoo]{...}\@test@count{myfoo}\myfoo1mybarmybaz

的规则\@test@count{myfoo}与分配管理器类似,因为当定义一个新的计数器时,它\mycommand[myfoo]{...}会“保存”其先前的值,\myfoo直到\myfoo声明另一个:如果满足此条件,则\myfoo不会被覆盖,而是增加了。

到目前为止,我在定义方面几乎没有取得任何进展\@test@count#1{...},因为这项任务需要这种知识我现在还很难理解。

答案1

可以使用以下方法测试 (LaTeX) 计数器的存在\@ifundefined{c@<argument>}

\newcommand\andrea@test@count[1]{%
  \@ifundefined{c@#1}
    {% the counter doesn't exist
     \newcounter{#1}\setcounter{#1}{1}%
    }
    {% the counter exists
     \stepcounter{#1}%
    }%
}

完整示例

\documentclass{article}
%
\makeatletter
\newcommand\andrea@test@count[1]{%
  \@ifundefined{c@#1}
    {% the counter doesn't exist
     \newcounter{#1}\setcounter{#1}{1}%
    }
    {% the counter exists
     \stepcounter{#1}%
    }%
}

\newcommand\mycommand[2]{%
 \andrea@test@count{#1}%
 This is the value of the counter~"#1":~\the\value{#1}~#2\par%
}
\makeatother
%
\begin{document}
%
\mycommand{myfoo}{lorem}
\mycommand{mybar}{ipsum}
\mycommand{mybaz}{dolor}
\mycommand{myfoo}{sit}
\mycommand{mybar}{amet}
\mycommand{myfoo}{consectetur}
\mycommand{mybaz}{adipisci}
%
\end{document}

在此处输入图片描述

相关内容