[Tex/LaTex] biblatex: is there a command analogous to \ifciteseen but within one page

biblatexconditionals

Biblatex is loaded as

\usepackage[style=numeric-comp,hyperref=true]{biblatex}
\ExecuteBibliographyOptions{citetracker=true,sorting=none,firstinits=true}

I am looking for an if-command, which would do the same job as \ifciteseen does, but only for the current page.

The idea is to test if some source has been cited already on the current page and, depending on the result, change the citation. For instance, if I want to produce a footnote only upon the first citation on the current page, I could do

\ifciteseenONTHISPAGE
{% yes, do nothing
 }
{% no, do smth
 \noexpand\footnote[\thefield{labelnumber}]{%
 \fullcite{\thefield{entrykey}}\addperiod}}}}

I am aware of \iffirstonpage and \ifsamepage but cannot figure out if they can be of any help here and how.

Best Answer

The counter instcount uniquely identifies a citation or item in the bibliography/list of shorthands. The test \ifsamepage{<inst1>}{<inst2>}{<true>}{<false>} expands <true> if the two citations/items identified by the instcount values <inst1> and <inst2> are found on the same page.

In your test we need to compare the current value (\value{instcount}) with the value of instcount the last time the current entry was cited. In general this is not the value of instcount in the last citation (i.e. \value{instcount}-1). AFAIK you'll have to track the last instcount value for each entry with some additional code.

The example below demonstrates how this can be done using a citation format considered in a previous post. It relies on some commands from etoolbox and requires additional passes to get the tests right.

\documentclass{report}
\usepackage[american]{babel}
\usepackage{csquotes}
\usepackage[colorlinks]{hyperref}
\usepackage[style=numeric-comp,citetracker=true,pagetracker=true,sorting=none]{biblatex}

\makeatletter
%---------------------------------------------------------------
% Essentially verbatim from Joseph Wright (except for refinements to \ifciteseen test)
% http://www.texdev.net/2010/03/08/biblatex-numbered-citations-as-footnotes/

\DeclareCiteCommand{\superfootcite}[\cbx@superscript]
  {\usebibmacro{cite:init}%
   \let\multicitedelim=\supercitedelim
   \iffieldundef{prenote}
     {}
     {\BibliographyWarning{Ignoring prenote argument}}%
   \iffieldundef{postnote}
     {}
     {\BibliographyWarning{Ignoring postnote argument}}}
  {\usebibmacro{citeindex}%
   \usebibmacro{cite:superfoot}%
   \usebibmacro{cite:comp}}
  {}
  {\usebibmacro{cite:dump}}

\newbibmacro*{cite:superfoot}{%
  \xdef\cbx@citekey{\thefield{entrykey}}%
  \ifciteseen
    {}
    {\csnumgdef{cbx@instcount\cbx@citekey}{-100}}%
  \ifsamepage{\value{instcount}}{\number\csuse{cbx@instcount\cbx@citekey}}
    {}
    {\xappto\cbx@citehook{%
       \noexpand\footnotetext[\thefield{labelnumber}]{%
         \fullcite{\thefield{entrykey}}\addperiod}}}%
  \csnumgdef{cbx@instcount\cbx@citekey}{\value{instcount}}}

\newrobustcmd{\cbx@superscript}[1]{%
  \mkbibsuperscript{#1}%
  \cbx@citehook
  \global\let\cbx@citehook=\empty}
\let\cbx@citehook=\empty

%---------------------------------------------------------------
\makeatother

\addbibresource{biblatex-examples.bib}

\begin{document}
\chapter{Title}
\null\vfill\noindent
First citation.\superfootcite{bertram}
First citation.\superfootcite{companion}
Some recurrent citations on same page.\superfootcite{bertram,companion,augustine}
\chapter{Title}
\null\vfill\noindent
Recurrent citation on different page.\superfootcite{companion}
Recurrent on different page and first citations.\superfootcite{augustine,cicero}
Recurrent citation on same page.\superfootcite{companion}
\printbibliography
\end{document}

Here are the citations from the first page:

enter image description here

And from the second:

enter image description here