如果标签不存在则计数,如果存在则打印

如果标签不存在则计数,如果存在则打印

我试图在可能需要移动的文本中按数字顺序匿名标记受访者。当我引用带有标签的受访者时,如果标签不存在,我想在计数器中迈出新的一步,或者如果标签存在,则打印上一个相关的标签计数。

我已经定义了以下命令。

\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}

在此处输入图片描述

相关内容