为了完成一个自定义包命令,我需要一个内部宏,我称它为\@test@count{❬argument❭}
,并且应该完成以下内容:
- 内部定义一个新的计数器
\❬argument❭
并将其设置为1
。 检查计数器是否
\❬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}
\myfoo
1
mybar
mybaz
的规则\@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}