[Tex/LaTex] How to sort bibliography entries alphabetically by \cite key

bibtexcustom-bib

I have generated a custom *.bst style file with whom I am generally quite happy with. The references are automatically ordered alphabetically. However, if there is more than one article published by the same author in the same year, the references are somehow no longer ordered alphabetically, but they appear in their citation order instead. The following MWE illustrates my problem:

\documentclass{article}
\usepackage{filecontents}


\begin{filecontents}{references.bib}

@article{Smith:2015a,
  Author = {Smith, First and Another, Name},
  Journal = {Journal},
  Number = {1},
  Pages = {1},
  Volume = {1},
  Year = {2015}}

@article{Smith:2015b,
  Author = {Smith, First and Another, Name},
  Journal = {Journal},
  Number = {2},
  Pages = {2},
  Volume = {2},
  Year = {2015}}

@article{Smith:2015c,
  Author = {Smith, First and Another, Name},
  Journal = {Journal},
  Number = {3},
  Pages = {3},
  Volume = {3},
  Year = {2015}}

@article{Douglas:2010,
  Author = {Douglas, First and Another, Name},
  Journal = {Journal},
  Number = {0},
  Pages = {0},
  Volume = {0},
  Year = {2010}}

\end{filecontents}


\begin{document}

Cite an article \cite{Smith:2015b}. Cite another article \cite{Smith:2015c}. Cite yet another article \cite{Smith:2015a}. Cite an article of another author \cite{Douglas:2010}.

\bibliographystyle{propj12}
\bibliography{references.bib}
\end{document}

This produces the following output:

enter image description here

Naturally, I want to appear the references in the following order:

  • Douglas:2010
  • Smith:2015a
  • Smith:2015b
  • Smith:2015c

For this particular example, I realize that I could just change the cite keys from Smith:2015b to Smith:2015a etc., but in general this is not an option for me because I am dealing with a large *.bib file and it is impossible for me to adjust all the cite keys accordingly. I have also tried to adjust the function
{sort.format.names} in my *.bst file but to no avail.

Any help is greatly appreciated.

EDIT: My custom style file has been produced with makebst and can be obtained by running latex on the following *.dbj file:

%% Driver file to produce propj12.bst from merlin.mbs
%% Generated with makebst, version 4.1 (2003/09/08)
%% Produced on 2015/10/29 at 10:58
%% 
\input docstrip

\preamble
----------------------------------------
*** Custom ***

\endpreamble

\postamble
End of customized bst file
\endpostamble

\keepsilent

\askforoverwritefalse
\def\MBopts{\from{merlin.mbs}{%
%EXTERNAL FILES:
%Name of language file: \cfile=.
%No included files.
%INTERNAL LANGUAGE SUPPORT (if no external language file)
    %: (def) English
% babel,%: Babel
%--------------------
%STYLE OF CITATIONS:
%   %: (def) Numerical
% ay,%: Author-year
% alph,%: Alpha style, Jon90 or JWB90
% alph,alf-1,%: Alpha style, Jon90
% alph,alf-f,%: Alpha style, Jones90
  cite,%: Cite key
%--------------------
%HTML OUTPUT (if non author-year citations)
    %: (def) Normal LaTeX
% html,%: Hypertext
% html,htlist,%: Hypertext list
% html,htdes,%: Hypertext with keys
%--------------------
%AUTHOR--YEAR SUPPORT SYSTEM (if author-year citations)
% nat,%: Natbib
%   %: (def) Older Natbib
% alk,%: Apalike
% har,%: Harvard
% ast,%: Astronomy
% cay,%: Chicago
% nmd,%: Named
  cn,%: Author-date
%--------------------
%HARVARD EXTENSIONS INCLUDED (if Harvard support selected)
% harnm,%: With Harvard extensions
%   %: (def) Older Harvard
%--------------------
%LANGUAGE FIELD
    %: (def) No language field
% lang,%: Add language field
%--------------------
%ANNOTATIONS:
    %: (def) No annotations
% annote,%: Annotations
%--------------------
%PRESENTATIONS:
    %: (def) Do not add presentation type
% pres,%: Add presentation, speaker not highlighted
% pres,pres-bf,%: Presentation, speaker bold face
% pres,pres-it,%: Presentaion, speaker italic
% pres,pres-sc,%: Presentaion, speaker in small caps
%--------------------
%ORDERING OF REFERENCES (if non-author/year and non-alph)
    %: (def) Alphabetical
% seq-no,%: Citation order
% seq-yr,%: Year ordered
% seq-yrr,%: Reverse year ordered
%--------------------
%ORDERING OF REFERENCES (if author-year citations)
%   %: (def) Alphabetical
% seq-lab,%: By label
% seq-labc,%: By label and cite order
  seq-key,%: By label and cite key
% seq-yr,%: Year ordered
% seq-yrr,%: Reverse year ordered
% seq-no,%: Citation order
%--------------------
%ORDER ON VON PART (if not citation order)
    %: (def) Sort on von part
% vonx,%: Sort without von part
%--------------------
%IGNORE FIRST NAMES (if author-year citations)
%   %: (def) Respect first names
  xintls,%: Sort on surname only
%--------------------
%AUTHOR NAMES:
% ed-au,%: Full, surname last
% nm-revf,%: Full, surname first
  nm-init,ed-au,%: Initials + surname
% nm-rev,%: Surname + initials
% nm-rv,%: Surname + dotless initials
% nm-rvvc,%: Surname + comma + spaceless initials
% nm-rvx,%: Surname + pure initials
% nm-rvcx,%: Surname + comma + pure initials
% nm-rvv,%: Surname + spaceless initials
% nm-rev1,%: Only first name reversed, initials
% nm-revv1,%: First name reversed, with full names
%--------------------
%EDITOR NAMES IN COLLECTIONS (if author names reversed)
% ed-rev,%: Editor names reversed
%--------------------
%POSITION OF JUNIOR (if author names reversed)
% jnrlst,%: Junior comes last
%   %: (def) Junior between
%--------------------
%JUNIOR PART IN THE CITATION (if author-year citations)
%   %: (def) No `junior' part in the citations
% jnrlab,%: `Junior' in citations
%--------------------
%PUNCTUATION BETWEEN AUTHOR NAMES:
    %: (def) Author names separated by commas
% aunm-semi,%: Names separated by semi-colon
% aunm-sl,%: Names separated by slash
%--------------------
%ADJACENT REFERENCES WITH REPEATED NAMES:
    %: (def) Author/editor names always present
% nmdash,%: Repeated author/editor names replaced by dash
% nmdash,nmd-2,%: Repeated author/editor names replaced by 2 dashes
% nmdash,nmd-3,%: Repeated author/editor names replaced by 3 dashes
%--------------------
%NUMBER OF AUTHORS IN BIBLIOGRAPHY:
    %: (def) All authors
% nmlm,%: Limited authors
%--------------------
%AUTHORS IN CITATIONS:
%   %: (def) One author et al
  mcite,%: Some other truncation scheme
%--------------------
%MAX AUTHORS BEFORE ET AL: (if regular cite not selected)
  mct-1,%: One et al
% mct-2,%: One, Two et al
% mct-3,%: One, Two, Three et al
% mct-4,%: One, Two, Three, Four et al
% mct-5,%: One, Two, Three, Four, Five et al
% mct-6,%: One, Two, Three, Four, Five, Six et al
%--------------------
%MAX AUTHORS WITHOUT ET AL: (if regular cite not selected)
  mct-x2,%: Two authors without truncating
% mct-x3,%: Three authors
% mct-x4,%: Four authors
% mct-x5,%: Five authors
% mct-x6,%: Six authors
%--------------------
%TYPEFACE FOR AUTHORS IN LIST OF REFERENCES:
    %: (def) Normal font for author names
% nmft,nmft-sc,%: Small caps authors
% nmft,nmft-it,%: Italic authors
% nmft,nmft-bf,%: Bold authors
% nmft,nmft-def,%: User defined author font
%--------------------
%FONT FOR FIRST NAMES (if non-default font for authors)
%   %: (def) First names same font as surnames
% fnm-rm,%: First names in normal font
% fnm-def,%: First names in user defined font
%--------------------
%EDITOR NAMES IN INCOLLECTION ETC:
%   %: (def) Editors incollection normal font
% nmfted,%: Editors incollection like authors
%--------------------
%FONT FOR `AND' IN LIST:
%   %: (def) `And' in author font
% nmand-rm,%: `And' in normal font
%--------------------
%FONT OF CITATION LABELS IN TEXT (if author-year citations)
%   %: (def) Cited authors plain
% lab,lab-it,%: Cited authors italic
% lab,lab-sc,%: Cited authors small caps
% lab,lab-bf,%: Cited authors bold
% lab,lab-def,%: User defined citation font
%--------------------
%FONT FOR `AND' IN CITATIONS (if non-default font for citation lables)
%   %: (def) Cited `and' in author font
% and-rm,%: Cited `and' in normal font
%--------------------
%FONT OF EXTRA LABEL (The extra letter on the year)
%   %: (def) Extra label plain
% xlab-it,%: Extra label italic
%--------------------
%LABEL WHEN AUTHORS MISSING (if author-year citations)
% keyxyr,%: Year blank when KEY replaces missing author
%   %: (def) Year included when KEY replaces missing author
%--------------------
%MISSING DATE (if author-year citations)
%   %: (def) Missing date set to ????
% blkyear,%: Missing date left blank
%--------------------
%DATE POSITION:
    %: (def) Date at end
% dt-beg,%: Date after authors
% dt-jnl,%: Date part of journal spec.
% dt-end,%: Date at very end
%--------------------
%DATE FORMAT (if non author-year citations)
%   %: (def) Plain month and year
  yr-par,%: Date in parentheses
% yr-brk,%: Date in brackets
% yr-col,%: Date preceded by colon
% yr-per,%: Date preceded by period
% yr-com,%: Date preceded by comma
% yr-blk,%: Date preceded by space
%--------------------
%SUPPRESS MONTH:
%   %: (def) Date is month and year
  xmth,%: Date is year only
%--------------------
%REVERSED DATE (if including month)
%   %: (def) Date as month year
% dtrev,%: Date as year month
%--------------------
%DATE FORMAT (if author-year citations)
%   %: (def) Year plain
% yr-par,%: Year in parentheses
% yr-brk,%: Year in brackets
% yr-col,%: Year preceded by colon
% yr-per,%: Year preceded by period
% yr-com,%: Date preceded by comma
% yr-blk,%: Year preceded by space
%--------------------
%INCLUDE MONTHS:
%   %: (def) Date is year only
% aymth,%: Include month in date
%--------------------
%REVERSED DATE (if including month)
%   %: (def) Date as month year
% dtrev,%: Date as year month
%--------------------
%DATE PUNCTUATION (if date not at end)
%   %: (def) Date with standard block punctuation
% yrp-col,%: Colon after date
% yrp-semi,%: Semi-colon after date
% yrp-per,%: Period after date
% yrp-x,%: No punct. after date
%--------------------
%BLANK AFTER DATE:
%   %: (def) Space after date
% yrpp-xsp,%: No space after date
%--------------------
%DATE FONT:
    %: (def) Date in normal font
% dtbf,%: Date in bold face
%--------------------
%TRUNCATE YEAR (if author-year citations)
% note-yr,%: Year text full
%   %: (def) Year truncated
%--------------------
%TITLE OF ARTICLE:
%   %: (def) Title plain
  tit-it,%: Title italic
% tit-qq,qt-s,%: Title and punctuation in single quotes
% tit-qq,%: Title and punctuation in double quotes
% tit-qq,qt-g,%: Title and punctuation in guillemets
% tit-qq,qt-s,qx,%: Title in single quotes
% tit-qq,qx,%: Title in double quotes
% tit-qq,qt-g,qx,%: Title in guillemets
%--------------------
%COLLECTION/PROCEEDINGS TITLES (if quoted title)
% bt-qq,%: Quote collection and proceedings titles
%   %: (def) Collection and proceedings titles not in quotes
%--------------------
%CAPITALIZATION OF ARTICLE TITLE:
    %: (def) Sentence style
% atit-u,%: Title style
%--------------------
%ARTICLE TITLE PRESENT:
%   %: (def) Article title present
  jtit-x,%: No article title
%--------------------
%JOURNAL NAMES:
    %: (def) Periods in journal names
% jxper,%: Dotless journal names
%--------------------
%JOURNAL NAME FONT:
%   %: (def) Journal name italics
  jttl-rm,%: Journal name normal
%--------------------
%THESIS TITLE:
    %: (def) Thesis titles like books
% thtit-a,%: Thesis title like article
% thtit-x,%: No thesis title
%--------------------
%TECHNICAL REPORT TITLE:
    %: (def) Tech. report title like articles
% trtit-b,%: Tech. report title like books
%--------------------
%TECHNICAL REPORT NUMBER:
    %: (def) Tech. report and number plain
% trnum-it,%: Tech. report and number italic
%--------------------
%JOURNAL VOLUME:
%   %: (def) Volume plain
% vol-it,%: Volume italic
% vol-bf,%: Volume bold
  vol-2bf,%: Volume and number bold
%--------------------
%JOURNAL VOL AND NUMBER:
%   %: (def) Journal vol(num)
  vnum-sp,%: Journal vol (num)
% vnum-cm,%: Journal vol, num
% vnum-nr,%: Journal vol, no. num
% vnum-h,%: Journal vol, \# number
% vnum-b,%: Journal vol number
% vnum-x,%: Journal vol, without number
%--------------------
%VOLUME PUNCTUATION:
%   %: (def) Volume with colon
% volp-sp,%: Volume with colon and space
% volp-semi,%: Volume with semi-colon
  volp-com,%: Volume with comma
% volp-blk,%: Volume with blank
%--------------------
%YEAR IN JOURNAL SPECIFICATION:
%   %: (def) Journal year like others
% jdt-v,%: Journal vol(year)
  jdt-vs,%: Journal vol (year)
% jdt-p,%: Year with pages
% jdt-pc,%: Year, comma, pages
%--------------------
%PAGE NUMBERS:
%   %: (def) Start and stop page numbers
  jpg-1,%: Only start page number
%--------------------
%LARGE PAGE NUMBERS:
    %: (def) No separators for large page numbers
% pgsep-c,%: Comma inserted over 9999
% pgsep-s,%: Thin space inserted over 9999
% pgsep-p,%: Period inserted over 9999
%--------------------
%WORD `PAGE' IN ARTICLES:
    %: (def) Article pages numbers only
% jwdpg,%: Include `page' in articles
%--------------------
%POSITION OF PAGES:
    %: (def) Pages given mid text
% pp-last,%: Pages at end
%--------------------
%WORD `VOLUME' IN ARTICLES:
    %: (def) Article volume as number only
% jwdvol,%: Include `volume' in articles
%--------------------
%NUMBER AND SERIES FOR COLLECTIONS:
  num-xser,%: Allows number without series
%   %: (def) Standard BibTeX
%--------------------
%POSITION OF NUMBER AND SERIES:
    %: (def) After chapter and pages
% numser,%: Just before publisher
%--------------------
%VOLUME AND SERIES FOR BOOKS/COLLECTIONS:
    %: (def) Vol. 23 of Series
% ser-vol,%: Series, vol. 23
%--------------------
%POSITION OF VOLUME AND SERIES FOR INCOLLECTIONS:
    %: (def) Series and volume after the editors
% ser-ed,%: Series and volume after booktitle
%--------------------
%JOURNAL NAME PUNCTUATION:
    %: (def) Comma after journal
% jnm-x,%: Space after journal
%--------------------
%BOOK TITLE:
    %: (def) Book title italic
% btit-rm,bt-rm,%: Book title plain
%--------------------
%PAGES IN BOOKS:
    %: (def) Pages in book plain
% bkpg-par,%: Pages in book in parentheses
% bkpg-x,%: Pages in book bare
%--------------------
%TOTAL PAGES OF A BOOK:
    %: (def) Total book pages not printed
% pg-bk,%: For book: 345 pages
% pg-bk,pg-pre,%: Total book pages before publisher
%--------------------
%PUBLISHER ADDRESS:
    %: (def) Publisher, address
% add-pub,%: Address: Publisher
%--------------------
%PUBLISHER IN PARENTHESES:
    %: (def) Publisher as normal block
% pub-par,%: Publisher in parentheses
% pub-date,%: Publisher and date in parentheses
% pub-date,pub-xc,%: Publisher and date in parentheses, no comma
% pub-date,pub-xpar,%: Publisher and date without parentheses
% pub-date,pub-xpar,pub-xc,%: Publisher and date, no parentheses, no comma
%--------------------
%PUBLISHER POSITION:
    %: (def) Publisher after chapter, pages
% pre-pub,%: Publisher before chapter, pages
% pre-edn,%: Publisher after edition
%--------------------
%ISBN NUMBER:
% isbn,%: Include ISBN
    %: (def) No ISBN
%--------------------
%ISSN NUMBER:
% issn,%: Include ISSN
    %: (def) No ISSN
%--------------------
%DOI NUMBER:
% doi,%: Include DOI
% url-doi,%: Format DOI as URL //dx.doi.org/doi
% agu-doi,doi,%: Insert DOI AGU style
    %: (def) No DOI
%--------------------
%`EDITOR' AFTER NAMES (EDITED BOOKS WITHOUT AUTHORS):
    %: (def) Word `editor' after name
% edpar,%: `Name (editor),'
% edpar,bkedcap,%: `Name (Editor),'
% edparc,%: `Name, (editor)'
% edparc,bkedcap,%: `Name, (Editor)'
% edparxc,%: `Name (editor)'
% edparxc,bkedcap,%: `Name (Editor)'
%--------------------
%EDITOR IN COLLECTIONS:
    %: (def) Same as for edited book
% edby,%: In booktitle, edited by .. 
% edby-par,%: In booktitle (edited by ..)
% edby-parc,%: In booktitle, (edited by ..)
% edby,edbyx,%: In booktitle, editor ..
% edby,edbyw,%: In booktitle, (editor) ..
% edby-par,edbyx,%: In booktitle (editor..)
% edby-parc,edbyx,%: In booktitle, (editor..)
% edby,edbyy,%: In booktitle, .., editor
% edby-par,edbyy,%: In booktitle (.., editor)
%--------------------
%CAPITALIZE `EDITOR' OR `EDITED BY' (if editor capitalizable)
%   %: (def) `(editor,..)' or `(edited by..)'
% edcap,%: `(Editor,..)' or `(Edited by..)'
%--------------------
%PUNCTUATION BETWEEN SECTIONS (BLOCKS):
    %: (def) \newblock after blocks
% blk-com,%: Comma between blocks
% blk-com,com-semi,%: Semi-colon between blocks
% blk-com,com-blank,%: Blanks between blocks
% blk-tit,%: Period after titles of articles, books, etc
% blk-tit,tit-col,%: Colon after titles of articles, books, etc
% blk-tita,%: Period after titles of articles
% blk-tita,tit-col,%: Colon after titles of articles
%--------------------
%PUNCTUATION BEFORE NOTES (if not using \newblock)
%   %: (def) Notes have regular punctuation
% blknt,%: Notes preceded by period
%--------------------
%PUNCTUATION AFTER AUTHORS:
    %: (def) Author block normal
% au-col,%: Author block with colon
%--------------------
%PUNCTUATION AFTER `IN':
    %: (def) Space after `in'
% in-col,%: Colon after `in'
% in-it,%: Italic `in'
% in-col,in-it,%: Italic `in' and colon
% in-x,%: No word `in'
%--------------------
%`IN' WITH JOURNAL NAMES (if using 'in' with collections)
    %: (def) No `in' before journal name
% injnl,%: Add `in' before journal name
%--------------------
%FINAL PUNCTUATION:
    %: (def) Period at very end
% fin-bare,%: No period at end
%--------------------
%ABBREVIATE WORD `PAGES' (if not using external language file)
    %: (def) `Page(s)'
% pp,%: `Page' abbreviated
% ppx,%: `Page' omitted
%--------------------
%ABBREVIATE WORD `EDITORS':
    %: (def) `Editor(s)'
% ed,%: `Editor' abbreviated
%--------------------
%OTHER ABBREVIATIONS:
%   %: (def) No abbreviations
  abr,%: Abbreviations
%--------------------
%ABBREVIATION FOR `EDITION' (if abbreviating words)
    %: (def) `Edition' abbreviated as `edn'
% ednx,%: `Edition' abbreviated as `ed'
%--------------------
%MONTHS WITH DOTS:
    %: (def) Months with dots
% mth-bare,%: Months without dots
%--------------------
%EDITION NUMBERS:
  xedn,%: Editions as in database
%   %: (def) Write out editions
% ord,%: Numerical editions
%--------------------
%Reading external language file \cfile=
%STORED JOURNAL NAMES:
    %: (def) Full journal names
% jabr,%: Abbreviated journal names
% jabr,jaa,%: Abbreviated with astronomy shorthands
%--------------------
%AMPERSAND:
    %: (def) Use word `and'
% amper,%: Use ampersand
% varand,%: Use \BIBand
%--------------------
%COMMA BEFORE `AND':
%   %: (def) Comma before `and'
  and-xcom,%: No comma before `and'
% and-com,%: Comma even with 2 authors
%--------------------
%COMMA BEFORE `AND' EVEN FOR COLLECTION EDITORS (if using comma before `and' with authors)
% and-com-ed,%: Comma with 2 editors
%   %: (def) Two editors without comma
%--------------------
%NO `AND' IN REFERENCE LIST:
    %: (def) With `and'
% xand,%: No `and'
%--------------------
%COMMA BEFORE `ET AL':
    %: (def) Comma before `et al'
% etal-xc,%: No comma before `et al'
%--------------------
%FONT OF `ET AL':
%   %: (def) Plain et al
  etal-it,%: Italic et al
% etal-rm,%: Roman et al
%--------------------
%ADDITIONAL REVTeX DATA FIELDS:
    %: (def) No additional fields
% revdata,eprint,url,url-blk,%: Include REVTeX data fields
%--------------------
%E-PRINT DATA FIELD: (without REVTeX fields)
%   %: (def) Do not include eprint field
  eprint,%: Include eprint and archive fields
%--------------------
%URL ADDRESS: (without REVTeX fields)
    %: (def) No URL
% url,url-blk,%: Include URL
% url,url-nt,%: URL as note
% url,url-nl,%: URL on new line
%--------------------
%REFERENCE COMPONENT TAGS:
    %: (def) No reference component tags
% bibinfo,%: Reference component tags
%--------------------
%EMPHASIS: (affects all so-called italics)
    %: (def) Use emphasis
% em-it,%: Use true italics
% em-x,%: No italics
% em-ul,%: Underlining
%--------------------
%COMPATIBILITY WITH PLAIN TEX:
  nfss,%: Use LaTeX commands
% plntx,%: Use only Plain TeX
%--------------------
  }}
\generate{\file{propj12.bst}{\MBopts}}
\endbatchfile

A standard bibliography style like alpha does the correct sorting, so I know that it can be done, but I do not understand the code in the alpha.bst file and how I can apply it to my custom style file.

Best Answer

You need to do two things:

  • Insert the line

    @preamble{ "\newcommand{\noopsort}[1]{}" }
    

    at the top of the bib file.

  • Change the year fields of the entries with keys Smith:2015a, Smith:2015b, and Smith:2015c from the current value of 2015 to 2015\noopsort{a}, 2015\noopsort{b}, and 2015\noopsort{c}, respectively.

The \noopsort{..} command does nothing when it's processed by LaTeX; more precisely, the command's argument is discarded and vanishes. When BibTeX is processing the bibliography, though, the command's argument does not vanish and therefore influences the sorting -- just what you need.