查找出现次数

查找出现次数

是否可以根据调用命令的次数来更改命令的结果?我想要一个有 3 个可能结果的命令。

  1. 情况 1:如果在文档中仅出现一次,则为结果 A。
  2. 情况 2:当该事件在文档中第一次出现并且该事件出现多次时,结果为 B;当该事件在该文档中后续出现时,结果为 C。

我不想使用任何参数,只使用命令的名称。

我知道如何使用嵌套的 来制作第二种情况\newcommand。但是有人知道如何区分情况 1 和情况 2 吗?换句话说,如何创建一个命令/函数,根据调用次数的不同,它有 3 种不同的结果?

答案1

您在评论中表示,您希望将其用于引用。这让答案变得简单:使用biblatex

biblatex拥有处理这种情况所需的所有测试:

\documentclass{article}
\usepackage[citecounter=true, style=authoryear, citetracker=true]{biblatex}
\usepackage{filecontents}

\begin{filecontents*}{\jobname.bib}
@article{duck,
  author    = {Duck, Donald},
  usera      = {Ducky},
  title     = {Bla},
  journal   = {Blub},
  year      = 2017
}

@article{mouse,
  author    = {Mouse, Minnie},
  usera      = {Mousy},
  title     = {Bla},
  journal   = {Blub},
  year      = 2017
}

\end{filecontents*}

\DeclareCiteCommand{\cite}
  {\usebibmacro{prenote}}%
  {\usebibmacro{citeindex}%
    \ifnum\thecitecounter=1
        \usebibmacro{cite}%
    \else%
         \ifciteseen{%
            \printfield{usera}%
         }{%
            \usebibmacro{cite}, in the following abbreviated as \printfield{usera}%
         }%
    \fi%
  }
  {\multicitedelim}
  {\usebibmacro{postnote}}

\addbibresource{\jobname.bib}

\begin{document}

    First citation: \cite{duck}

    Unique citation: \cite{mouse}

  Cite again: \cite{duck}

  \printbibliography
\end{document}

在此处输入图片描述

答案2

\foo这将应用一个总文档计数器并将其与一个正常计数器关联起来,该计数器计算具有 特征的命令出现的次数xassoccnt

总出现次数保存在文档末尾,可在第二次运行中使用。

为了更加方便,我为命令的输出定义了\fooonce\foofirst和宏。\foomorethanoncebutnotfirst\foo

\documentclass{article}

\usepackage{xcolor}
\usepackage{xassoccnt}


\newcounter{occur}
\DeclareTotalAssociatedCounters{occur}{numofoccur}

\newcommand{\foosingle}{%
  \textcolor{red}{This is foo and it occurs only once!}%

}
\newcommand{\foofirst}{%
  \textcolor{blue}{This is foo, it appears more than once but this is the first time!}%

}

\newcommand{\foomorethanoncebutnotfirst}{%
  \textcolor{green}{This is foo and it appears multiple time, for example here, but it is not the first one!}

}

\newcommand{\foo}{%
  \refstepcounter{occur}%
  % Test for the total numbers first
  \ifnum\TotalValue{numofoccur}=1
  \foosingle%
  \else
  % Check for the current number of appearances...
  \ifnum\value{occur}=1 
  \foofirst%
  \else
  \foomorethanoncebutnotfirst%
  \fi
  \fi
}

\begin{document}

\foo

And 

\foo 

again.

\end{document}

如果第二个\foo被注释掉,则输出为

在此处输入图片描述

如果第二个\foo保持在内部,则输出为

在此处输入图片描述

答案3

您可以借助该.aux文件来完成此操作:

\documentclass{article}

\makeatletter
\newcommand{\definename}[3]{%
  % #1 = macro name
  % #2 = name
  % #3 = abbreviation
  \newcommand#1{%
    \if\@usedonce{#1}#2\else#2~(#3)\fi
    \write\@auxout{\string\@isusedonce{\string#1}}%
    \gdef#1{%
      #3\write\@auxout{\string\@isusedtwice{\string#1}}%
      \gdef#1{#3}%
    }%
  }%
  \expandafter\newif\csname ifonce\string#1\endcsname
}
\def\@usedonce#1{TT\fi\csname ifonce\string#1\endcsname}
\def\@isusedonce#1{\global\csname once\string#1true\endcsname}
\def\@isusedtwice#1{\global\csname once\string#1false\endcsname}
\makeatother

\definename{\dickens}{Charles Dickens}{CD}
\definename{\adams}{Douglas Adams}{DA}

\begin{document}

Here I mention Dickens the first time: \dickens

Here I mention Dickens the second time: \dickens

Adams is mentioned just once: \adams

\end{document}

请注意,您必须编译两次才能使宏对齐。

在此处输入图片描述

第一次\dickens出现时,它会在文件中写入已使用过一次.aux,然后重新定义自身以仅发出缩写,并在.aux文件中写入已发出至少两次,然后再次重新定义自身以仅打印缩写。

\definename宏还为每个名称设置了一个条件;如果文件中的注释.aux表明该宏至少使用过一次,则此条件设置为 true;如果该宏至少使用过两次,则此条件设置为 false。当“once”条件返回 true 时,第一次(也是唯一的)只打印名称;否则打印名称和缩写。接下来是宏的重新定义。

相关内容