biblatex: "et al." также когда uniquename = false

biblatex: "et al." также когда uniquename = false

С помощью biblatexопции uniquename = truecitetracker = true, maxcitenames = 1) я могу, добавив код, \AtEveryCitekey{\ifciteseen{}{\defcounter{maxnames}{99}}}сократить любую работу, написанную несколькими авторами, до аббревиатуры Author et al.после ее первой полной цитаты, см. MWE ниже:

\documentclass{article}
\usepackage[style = authoryear-comp, citetracker = true, maxcitenames = 1, uniquename = true]{biblatex}
\AtEveryCitekey{\ifciteseen{}{\defcounter{maxnames}{99}}} % cite all authors of multi-authored works only once
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{lennon1963,
    AUTHOR = "John Lennon and Paul McCartney",
    TITLE = "She loves you",
    YEAR = "1963"}
@BOOK{lennon2004,
    AUTHOR = "Sean Lennon",
    TITLE = "My father was John Lennon",
    YEAR = "2004"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\noindent\cite{lennon1963}\\
\cite{lennon1963}\\
\cite{lennon2004}
\end{document}

введите описание изображения здесь

Но при изменении uniquename = trueна uniquename = falseэто не работает:

введите описание изображения здесь

Вопрос: Как я могу сохранить функциональность \AtEveryCitekey{\ifciteseen{}{\defcounter{maxnames}{99}}}также и с biblatexопцией uniquename = false?


РЕДАКТИРОВАТЬ Карлоответ нижеработает, но теперь мне интересно, как можно ограничить это так, чтобы Author 1, Author 2, and Author 3сокращение to Author 1 et al.срабатывало только тогда, когда у произведения три или более авторов. В MWE ниже, Lennon and McCartney 1963должно оставаться таковым во второй цитате, тогда как Lennon, McCartney, Harrison, and Starkey 1970должно сокращаться до Lennon et al. 1970во второй цитате.

\documentclass{article}
\usepackage[style = authoryear-comp, citetracker = true, maxcitenames = 99, mincitenames = 2, uniquename = false]{biblatex}
\AtEveryCitekey{\ifciteseen{\defcounter{maxnames}{1}}{}} % cite all authors of multi-authored works only once
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{lennon1963,
    AUTHOR = "John Lennon and Paul McCartney",
    TITLE = "She loves you",
    YEAR = "1963"}
@BOOK{lennon1970,
    AUTHOR = "John Lennon and Paul McCartney and George Harrison and Richard Starkey",
    TITLE = "We're breaking up now",
    YEAR = "1970"}
@BOOK{lennon2004,
    AUTHOR = "Sean Lennon",
    TITLE = "My father was John Lennon",
    YEAR = "2004"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\noindent\cite{lennon1963}\\
\cite{lennon1963}\\
\cite{lennon1970}\\
\cite{lennon1970}\\
\cite{lennon2004}
\end{document}

введите описание изображения здесь


ИЗМЕНИТЬ ИЗМЕНИТЬ

Ответ Карло ниже работает идеально. Я немного упростил код, хотя и немного подправил его, чтобы, по крайней мере, я понял его, когда буду смотреть на него позже :):

\AtEveryCitekey% for every citation
    {%
        \ifnumgreater{\value{labelname}}{2}% if there are >2 authors
            {%
                \ifciteseen% and if citation has been seen before
                    {\setcounter{maxnames}{1}}% then cite only one author
                    {\setcounter{maxnames}{\value{labelname}}}% otherwise cite all authors
            }
            {\setcounter{maxnames}{\value{labelname}}}% otherwise cite ≤2 authors
    }

решение1

«Изменить логику». в maxcitenames = 99опциях biblatexи \defcounter{maxnames}{1}в True.ifciteseen

МВЭ

\documentclass{article}
\usepackage[style = authoryear-comp, citetracker = true, maxcitenames = 99, uniquename = false]{biblatex}
\AtEveryCitekey{%
    \ifciteseen
    {\defcounter{maxnames}{1}}
    {}} % cite all authors of multi-authored works only once
\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{lennon1963,
    AUTHOR = "John Lennon and Paul McCartney",
    TITLE = "She loves you",
    YEAR = "1963"}
@BOOK{lennon2004,
    AUTHOR = "Sean Lennon",
    TITLE = "My father was John Lennon",
    YEAR = "2004"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\noindent\cite{lennon1963}\\
\cite{lennon1963}\\
\cite{lennon2004}
\end{document}

введите описание изображения здесь

EDIT Ответ на вопрос редактирования.##

Я нашел два способа и собираюсь опубликовать оба.

Первый

Это не лучшая форма, изначально я не нашел другой. Таким образом, она не используется \AtEveryCitekey. Используется listtotalто, что является счетчиком общего числа в списке ( author, editors... или labelname). Счетчик listtotalразрешен только вперечисляет директивы форматирования и не имеет осмысленного значения при использовании где-либо еще.

В , \patchlabelnameformatесли значение listtotalбольше двух и это первая ссылка, установите liststop(максимальное количество элементов списка для печати) в \value{listtotal}. Если это не первая ссылка, то устанавливается listtopравным 1. С другой стороны, если значение listtotalменьше двух, то listtopустанавливается равным \value{listtotal}.

МВЭ:

\documentclass{article}
\usepackage[style = authoryear-comp, citetracker = true,maxnames=2, minnames=2,uniquename=false]{biblatex}

\def\fgt{\setcounter{liststop}{\value{listtotal}}} %first and greater than two
\def\nfgt{\setcounter{liststop}{1}} %non first and greater than two

\def\flt{\setcounter{liststop}{\value{listtotal}}} %first and lower than two

\def\patchlabelnameformat{%
 \ifnumgreater{\value{listtotal}}{2}
    {\ifciteseen
       {\nfgt}
       {\fgt}}
    {\flt}}

\DeclareNameFormat{labelname}{%
 \patchlabelnameformat
 \ifcase\value{uniquename}%
    \usebibmacro{name:last}{#1}{#3}{#5}{#7}%
  \or
    \ifuseprefix
      {\usebibmacro{name:first-last}{#1}{#4}{#5}{#8}}
      {\usebibmacro{name:first-last}{#1}{#4}{#6}{#8}}%
  \or
    \usebibmacro{name:first-last}{#1}{#3}{#5}{#7}%
  \fi
  \usebibmacro{name:andothers}}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{lennon1963,
    AUTHOR = "John Lennon and Paul McCartney",
    TITLE = "She loves you",
    YEAR = "1963"}
@BOOK{lennon1970,
    AUTHOR = "John Lennon and Paul McCartney and George Harrison and Richard Starkey",
    TITLE = "We're breaking up now",
    YEAR = "1970"}
@BOOK{lennon2004,
    AUTHOR = "Sean Lennon",
    TITLE = "My father was John Lennon",
    YEAR = "2004"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\noindent\cite{lennon1963}\\
\cite{lennon1963}\\
\cite{lennon1970}\\
\cite{lennon1970}\\
\cite{lennon2004}
\end{document}

Второй

Лучшая форма. Используется \AtEveryCitekey. Логика та же, что и в первом способе, но использовать его невозможно listtotal, listtopтак как \AtEveryCitekeyэто не директива форматирования списка. Затем, таким образом используется счетчик labelnameи устанавливается maxnames. Необходимо использовать uniquelist=falseв biblatexпараметрах.

МВЭ:

\documentclass{article}
\usepackage[style = authoryear-comp, citetracker = true,uniquename=false,uniquelist=false]{biblatex}

\AtEveryCitekey{\maxminformat} % cite all authors of

\def\fgt{\setcounter{maxnames}{\value{labelname}}} %first and greater than two
\def\nfgt{\setcounter{minnames}{1}\setcounter{maxnames}{1}} %non first and greater than two

\def\flt{\setcounter{maxnames}{\value{labelname}}} %first and lower than two

\def\maxminformat{%
 \ifnumgreater{\value{labelname}}{2}
    {\ifciteseen
       {\nfgt}
       {\fgt}}
    {\flt}}

\usepackage{filecontents}
\begin{filecontents}{\jobname.bib}
@BOOK{lennon1963,
    AUTHOR = "John Lennon and Paul McCartney",
    TITLE = "She loves you",
    YEAR = "1963"}
@BOOK{lennon1970,
    AUTHOR = "John Lennon and Paul McCartney and George Harrison and Richard Starkey",
    TITLE = "We're breaking up now",
    YEAR = "1970"}
@BOOK{lennon2004,
    AUTHOR = "Sean Lennon",
    TITLE = "My father was John Lennon",
    YEAR = "2004"}
\end{filecontents}
\addbibresource{\jobname.bib}
\begin{document}
\noindent\cite{lennon1963}\\
\cite{lennon1963}\\
\cite{lennon1970}\\
\cite{lennon1970}\\
\cite{lennon2004}
\end{document}

введите описание изображения здесь

Связанный контент