是否可以根据调用命令的次数来更改命令的结果?我想要一个有 3 个可能结果的命令。
- 情况 1:如果在文档中仅出现一次,则为结果 A。
- 情况 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 时,第一次(也是唯一的)只打印名称;否则打印名称和缩写。接下来是宏的重新定义。