The bibliography style file apa-good.bst
, by default, indeed does not provide for different ordering of first and last names depending on whether or not the author/editor is listed first. Fortunately, though, adding this functionality isn't too hard to achieve.
Make a copy the file apa-good.bst
and name the copy, say, myapa-good.bst
. Then, in the function format.names
(which starts on line 365 of my system's copy of this file, search for the following block of lines:
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{vv~}{ll}{, ff}{, jj}"
format.name$
bibinfo bibinfo.check
and replace it with
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
duplicate$ #1 >
{ "{ff }{vv~}{ll}{, jj}" }
{ "{vv~}{ll}{, ff}{, jj}" }
if$
format.name$
bibinfo bibinfo.check
In these code snippets, I've already replaced {, f.}
in the original bst file with {, ff}
because you've indicated that you do not wish to abbreviate the authors' first names.
With this patch, you're instructing BibTeX to perform a check to see if the number of names of authors/editors left to be processed is greater than 1. If yes, it uses the formatting string {ff }{vv~}{ll}{, jj}
; if no, i.e., if there's only one name left to be processed (which, because of BibTeX's "Reverse Polish Notation" method of handling the stack, must be the first author/editor), it uses the string {vv~}{ll}{, ff}{, jj}
.
You should next store the new .bst
file in a directory that's searched automatically by your TeX distribution and, if necessary, run texhash
(or whichever command is appropriate for your TeX distribution) to update the distribution's filename database. Finally, be sure to issue the command
\bibliographystyle{myapa-good}
instead of \bibliographystyle{apa-good}
.
Happy BibTeXing!
I believe that you need to set the number of authors before et al.
in the .bst
itself, rather than from the LaTeX.
I think the below does what you want, I have adapted it from a .bst
I created using makebst
. Just replace format.names
in your .bst
.
FUNCTION {format.names}
{ 's :=
"" 't :=
#1 'nameptr :=
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ s nameptr
"{vv~}{ll}{, jj}{, f{.}.}"
format.name$
't :=
nameptr #1 >
{
nameptr #1
#1 + =
numnames #3
> and
{ "others" 't :=
#1 'namesleft := }
'skip$
if$
namesleft #1 >
{ ", " * t * }
{
s nameptr "{ll}" format.name$ duplicate$ "others" =
{ 't := }
{ pop$ }
if$
t "others" =
{
" et~al" *
}
{
" and "
* t *
}
if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
If you want to change the number of authors before the et al.
is used, change #3
from three to the correct number. If you want to change the number of names that appear before et al.
in the list, then change the #1
following nameptr
on the line preceding #1 + =
from one to the correct number.
Best Answer
Quoting from the natbib documentation, p. 7:
Below is a minimal example showing that
\citet*
indeed displays a full author list if you use theplainnat
style, but thatapalike
doesn't support full author lists. Maybe there's a way to embed this feature intoapalike
by hacking the bst-file, but I would use a different style.(The filecontents environment is only used to include some external files directly into the example, so that it compiles. It is not necessary for the solution.)