Prevent BibTeX from printing the "and" word before final author's name
If you're using the plain
bibliography style, you could proceed as follows to get BibTeX to replace the " and "
connector between the penultimate and ultimate author names with a simple comma:
Make a copy of the file
plain.bst
and name it, say,myplain.bst
. Do not directly edit/modify an existing file that comes with a TeX distribution.Open the file
myplain.bst
in your favorite text editor and search for the functionformat.names
. (It starts on l. 185 in my system's copy ofplain.bst
.) In the code of this function, look for the following lines (likely lines 195-201):{ numnames #2 > { "," * } 'skip$ if$ t "others" = { " et~al." * } { " and " * t * }
Modify the first and last of these lines so that the lines of code look like this:
{ numnames #1 > { "," * } 'skip$ if$ t "others" = { " et~al." * } { " " * t * }
I.e., change
#2
to#1
on the first line, and" and "
to" "
on the last line of this group. It's necessary to make both modifications to get the proper treatment regardless of the number of authors -- as long as the number is greater than 1, of course.Save the file, update your TeX distribution's filename database as needed, and start invoking the new bibliography style with the command
\bibliographystyle{myplain}
.
Happy BibTeXing!
When using jurabib
, it works the following way:
\renewcommand*{\jbbtasep}{, } % bta = between two authors sep
\renewcommand*{\jbbfsasep}{, } % bfsa = between first and second author sep
\renewcommand*{\jbbstasep}{, }% bsta = between
I have yet to find out how it is done with plain
, though.
EDIT:
I just read the plain
styles documentation -- not the whole, obviously -- as to be found on CTAN. In lines 683-714 the function for the name formatting is described (as far as I understood it). It says:
format.names(s) ==
% BEGIN
% nameptr := 1
% numnames := num.names$(s)
% namesleft := numnames
% while namesleft > 0
% do
% % for full names:
% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
% % for abbreviated first names:
% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
% if nameptr > 1 then
% if namesleft > 1 then nameresult := nameresult * ", " * t
% else if numnames > 2
% then nameresult := nameresult * ","
% fi
% if t = "others"
% then nameresult := nameresult * " et~al."
% else nameresult := nameresult * " and " * t
% fi
% fi
% else nameresult := t
% fi
% nameptr := nameptr + 1
% namesleft := namesleft - 1
% od
% return nameresult
% END
It seems like the else nameresult := nameresult * " and " * t
would have to be transformed to else nameresult := nameresult * ", " * t
in order to achieve what you want to achieve.
Therefore, you would probably have to create your own new style based on the plain
style with just this part changed.
This Blogpost by “Dr. K-Lo” might also be helpful.