
С помощью biblatex
опции uniquename = true
(и citetracker = 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}