我试图在可能需要移动的文本中按数字顺序匿名标记受访者。当我引用带有标签的受访者时,如果标签不存在,我想在计数器中迈出新的一步,或者如果标签存在,则打印上一个相关的标签计数。
我已经定义了以下命令。
\documentclass{standalone}
\newcounter{mycounter}
\makeatletter
\newcommand{\mycounting}[1]{
\@ifundefined{r@#1}{\refstepcounter{mycounter}\label{#1}X\ref{#1}}{X\ref{#1}}
}
\makeatother
\begin{document}
\mycounting{A} \mycounting{B} \mycounting{A} \mycounting{B}
\end{document}
不幸的是,当\mycounting
命令重复时,如上例所示,输出是“X3 X4 X3 X4”而不是“X1 X2 X1 X2”——因为计数器没有停止步进。
为了澄清起见,期望输出将是“X1 X2 X3 X1 X3”
\mycounting{A} \mycounting{B} \mycounting{C} \mycounting{A} \mycounting{C}
但目前它是“X4 X2 X5 X4 X5”。
答案1
我认为,以下内容可以满足您的要求:
\documentclass{standalone}
\newcounter{mycountcounter}
\newcommand{\mycount}[1]{%
\ifcsname #1@count\endcsname%
X\csname #1@count\endcsname%
\else%
\stepcounter{mycountcounter}%
\expandafter\xdef\csname #1@count\endcsname{\themycountcounter}%
X\themycountcounter%
\fi%
}
\begin{document}
\mycount{A} \mycount{B} \mycount{A} \mycount{B}
\end{document}
答案2
测试失败的原因是,相关标签信息在使用时\@ifundefined{r@#1}
写入文件.aux
,但实际上并未调用,因此下次应用时尚未定义,这意味着测试将始终为负数,即标签再次被重新定义。\newlabel
\label
\newlabel
\r@#1
\mycounting{A}
有一个小技巧可以解决这个问题:说\global\@namedef{r@#1}{}
之后\label{#1}
。文件的读取.aux
将再次定义\r@#1
,像往常一样,至少需要运行两次编译才能使交叉引用正确。
\documentclass{article}
\newcounter{mycounter}
\makeatletter
\newcommand{\mycounting}[1]{%
\@ifundefined{r@#1}{%
\refstepcounter{mycounter}\label{#1}\global\@namedef{r@#1}{}X\ref{#1}%
}{%
X\ref{#1}%
}%
}
\makeatother
\begin{document}
\mycounting{A} \mycounting{B} \mycounting{A} \mycounting{B} \mycounting{C}
\end{document}