Yes the maxcitenames
apparently has no effect in biblatex-apa
. I faced this issue where the biblatex-apa
was very close to the style I required but I did not want all the author names for 3-5 authors and I also didn't want the implementation of first cite as described in the APA style.
The solution is to alter the code that causes this, you can find it in the file apa.cbx
and it is usually in ...../tex/latex/biblatex-apa
.
The corresponding piece of code is the following:
\DeclareNameFormat{labelname}{%
\ifthenelse{\value{uniquelist}>1}
{\numdef\cbx@min{\value{uniquelist}}}
{\numdef\cbx@min{\value{minnames}}}%
\ifboolexpr{test {\ifnumcomp{\value{listcount}}{=}{1}}
or test {\ifnumcomp{\value{listtotal}}{=}{2}}}
{\usebibmacro{labelname:doname}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}
{\ifboolexpr{test {\ifnumcomp{\value{listtotal}}{>}{5}}
or test {\ifciteseen}}
{\ifnumcomp{\value{listcount}}{<}{\cbx@min + 1}% normal name
{\usebibmacro{labelname:doname}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}%
{}%
\ifnumcomp{\value{listcount}}{=}{\cbx@min + 1}% first past ul is et al
% but enforce plurality of et al - only truncate here if there is at
% least one more element after the current potential truncation point
% so that "et al" covers at least two elements.
{\ifnumcomp{\value{listcount}}{<}{\value{listtotal}}
{\andothersdelim\bibstring{andothers}}
{\usebibmacro{labelname:doname}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}%
{}%
\ifnumcomp{\value{listcount}}{>}{\cbx@min + 1}% nothing thereafter
{\relax}%
{}}%
{\usebibmacro{labelname:doname}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}}
One of the things this code does is check if the number of authors is > 5 or if the entry has already been cited, if so; then it assigns et al
after the first author. By altering the code, changing the 5
to 2
and getting rid of or test {\ifciteseen}
(watch out for the closing bracket), then any citation with more than 2 authors will have et al
regardless if it has been used or not. Here's the edited part in addition to \makeatletter
and \makeatother
which are required when putting this into the document preamble
\makeatletter
\DeclareNameFormat{labelname}{%
\ifthenelse{\value{uniquelist}>1}
{\numdef\cbx@min{\value{uniquelist}}}
{\numdef\cbx@min{\value{minnames}}}%
\ifboolexpr{test {\ifnumcomp{\value{listcount}}{=}{1}}
or test {\ifnumcomp{\value{listtotal}}{=}{2}}}
{\usebibmacro{labelname:doname}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}
{\ifboolexpr{test {\ifnumcomp{\value{listtotal}}{>}{\value{maxnames}}}}% <- EDIT
{\ifnumcomp{\value{listcount}}{<}{\cbx@min + 1}% normal name
{\usebibmacro{labelname:doname}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}%
{}%
\ifnumcomp{\value{listcount}}{=}{\cbx@min + 1}% first past ul is et al
% but enforce plurality of et al - only truncate here if there is at
% least one more element after the current potential truncation point
% so that "et al" covers at least two elements.
{\ifnumcomp{\value{listcount}}{<}{\value{listtotal}}
{\andothersdelim\bibstring{andothers}}
{\usebibmacro{labelname:doname}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}%
{}%
\ifnumcomp{\value{listcount}}{>}{\cbx@min + 1}% nothing thereafter
{\relax}%
{}}%
{\usebibmacro{labelname:doname}{#1}{#2}{#3}{#4}{#5}{#6}{#7}{#8}}}}
\makeatother
The xpatch
package provides an easy way to apply the same change to the labelname
formatting directive.
\usepackage[style=apa,backend=biber,natbib=true,
maxcitenames=2,uniquelist=false]{biblatex}
\DeclareLanguageMapping{british}{british-apa}
\usepackage{xpatch}
\xpatchnameformat{labelname}
{\ifciteseen}{\ifnumcomp{\value{listtotal}}{>}{\value{maxnames}}}{}{}