
Mit der biblatex
Option uniquename = true
(und citetracker = true, maxcitenames = 1
) kann ich durch Hinzufügen des Codes \AtEveryCitekey{\ifciteseen{}{\defcounter{maxnames}{99}}}
jedes Werk mit mehreren Autoren Author et al.
nach seinem ersten vollständigen Zitat auf abkürzen, vgl. das MWE unten:
\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}
Beim Wechsel uniquename = true
zu uniquename = false
funktioniert dies jedoch nicht:
Frage: Wie kann ich die Funktionalität \AtEveryCitekey{\ifciteseen{}{\defcounter{maxnames}{99}}}
auch mit der biblatex
Option beibehalten uniquename = false
?
BEARBEITEN
CarlosAntwort untenfunktioniert, aber jetzt frage ich mich, wie man das einschränken kann, sodass die Author 1, Author 2, and Author 3
Abkürzung Author 1 et al.
nur dann greift, wenn es drei oder mehr Autoren eines Werks gibt. Im MWE unten Lennon and McCartney 1963
sollte in der zweiten Zitierung so bleiben, während in der zweiten Zitierung Lennon, McCartney, Harrison, and Starkey 1970
auf abgekürzt werden sollte 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}
BEARBEITEN zu BEARBEITEN
Carlos Antwort unten funktioniert perfekt. Ich habe den Code jedoch etwas vereinfacht und ein wenig optimiert, damit ich ihn zumindest verstehe, wenn ich ihn mir später ansehe :)
:
\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
}
Antwort1
"Ändern Sie die Logik". maxcitenames = 99
in den biblatex
Optionen und \defcounter{maxnames}{1}
im True
von ifciteseen
.
MWE
\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}
BEARBEITEN Antwort auf die Bearbeitungsfrage.##
Ich habe zwei Möglichkeiten gefunden und werde beide posten.
Der erste
Dies ist nicht die beste Form, ich habe zunächst keine andere gefunden. Auf diese Weise wird es nicht verwendet \AtEveryCitekey
. Es wird verwendet listtotal
, dass es sich um einen Zähler für die Gesamtzahl in der Liste handelt ( author
, editors
... oder labelname
). Der Zähler listtotal
ist nur zulässig inListenformatierungsanweisungen und haben keinen sinnvollen Wert, wenn sie anderswo verwendet werden.
Wenn \patchlabelnameformat
der Wert von listtotal
größer als zwei ist und es sich um die erste Zitierung handelt, legen Sie liststop
(maximale Anzahl der zu druckenden Artikellisten) in fest \value{listtotal}
. Wenn es sich nicht um die erste Zitierung handelt, listtop
wird auf 1 gesetzt. Wenn der Wert von andererseits listtotal
kleiner als zwei ist, listtop
wird auf gesetzt \value{listtotal}
.
MWE:
\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}
Der Zweite
Die beste Form. Es wird verwendet \AtEveryCitekey
. Die Logik ist die gleiche wie bei der ersten Methode, aber sie kann nicht verwendet werden listtotal
, listtop
da \AtEveryCitekey
es sich nicht um eine Listenformatierungsrichtlinie handelt. Auf diese Weise wird dann der Zähler verwendet labelname
und der festgelegt . Es muss in den Optionen maxnames
verwendet werden .uniquelist=false
biblatex
MWE:
\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}