[Tex/LaTex] BibTeX: How to reduce long author lists to “Firstauthor et al.”

author-numberbibtex

I have several entries in my list of references that include of the order of 40 authors.
Is there a way to make bibtex automatically reduce these lists to e.g. the first name + "et al."?

I don't want to edit the BibTeX entries manually and I cannot use biblatex. If at all possible I would also make as little changes as possible to the bibliography style.

There are similar questions, but none of those had a concise answer:

natbib e.g. seems to change only the reference within the text, but not the entry in the bibliography.

EDIT: I am using \bibliographystyle{unsrt} as style definition.

Best Answer

The natbib citation management package manages the creation and appearance of citation call-outs. It does not, per se, determine how (or even whether) lists of numerous authors should be truncated, either in a citation call-out or in the formatted bibliographic reference. Such truncation issues are determined by the bibliography style file (.bst), which is loaded via the command \bibliographystyle{<somestyle>}.

If you can't find an existing .bst file that meets your formatting needs, you can always create one from scratch by running LaTeX on makebst.tex, which is part of the custom-bib package. Running the makebst utility launches an interactive series of multiple-choice questions, with all available answer options nicely explained. Several questions will be related to truncation matters. The output will be the .bst file you want.


Additional write-up, upon receiving information that @fuenfundachtzig uses the unsrt bibliography style. (Since the unsrt bibliography style can create numeric-style citation call-outs only, the answer below addresses how to truncate the list of authors in the formatted bibliography, not in the citation call-outs.)

I suggest you proceed as follows:

  • Find the file unsrt.bst in your TeX distribution. Make a copy of this file and name the copy, say, unsrt85.bst. Do not edit a system file directly.

  • Open the file unsrt85.bst in your favorite text editor.

  • Update September 2020: It has come to my attention that the editing instructions I provided back in August 2011 no longer work. I have no idea when exactly BibTeX's processing of the bst file changed. The following code is valid for an up-to-date TeXLive2020 TeX distribution.

    Find the function format.names (it starts on l. 185 in my copy of the file) and locate the following line inside this function, about 7 lines down from the top:

           nameptr #1 >
    
  • Assuming that you want to print out just the first three authors (followed by "et al.") whenever the entry has more than four (i.e., "at least five") authors, you should replace the next 3 lines in the BibTeX function, viz.,

            { namesleft #1 >
                { ", " * t * }
                { numnames #2 >
    

    with the following 17 lines:

            {
              nameptr #3
              #1 + =
              numnames #4
              > and
                { "others" 't :=
                  #1 'namesleft := }
                'skip$
              if$
              namesleft #1 >
                { ", " * t * }
                {
                  s nameptr "{ll}" format.name$ duplicate$ "others" =
                    { 't := }
                    { pop$ }
                  if$
                  numnames #2 >
    

    Put differently, this setup tells BibTeX to include all authors' names if the entry has at most four authors, and to include just the first three names, followed by "et al", if the entry has more than four authors.

  • Save the file unsrt85.bst either in the directory that contains the main tex file or in a directory that's searched by BibTeX. If you choose the second option, be sure to also update TeX's filename database as needed.

  • In the main tex file, you need to change \bibliographystyle{unsrt} to \bibliographystyle{unsrt85} and perform a full recompile cycle (LaTeX, BibTeX, and LaTeX twice more).


Addendum May 2019: For the ACM-Reference-Format bibliography style, there needs to be one slight modification to the fix proposed above:

  nameptr #1 >
     {
      nameptr #3
      #1 + =
      numnames #5
      > and
        { "\bibinfo{person}{others}" 't :=
          #1 'namesleft := }
        'skip$
      if$
      namesleft #1 >

i.e., the string "others" should be replaced with "\bibinfo{person}{others}". (Verified with version 2.1 of ACM-Reference-Format.bst.)