0

I would like to use the natbib command \citet with a custom .bst file. But the pdf file contains "(authors?)" instead (see Why do I get (author?) when I use \citet with natbib?).

How can I fix this without using predefined natbib style (like plainnat)?

I remarked that the aux file contains a bibcite command that looks like this : \bibcite{foo2008}{{Foo~2008}{}{{}}{{}}}. If I manually edit this command I can easily obtain a similar result as when using predefined natbib style.

What is responsible for generating the bibcite command? How to include more information? Is it a function from the bst style file?

I would like to edit my bst file only. Here are my files:

%
% Style de bibliographie pour the`se - d'apres alpha.bst
%
% Matthieu Herrb (matthieu@laas.fr) - Juillet 89, Octobre 90
%
%        Les references seront designees tant dans le texte que dans
% la liste recapitulative (ordonnee suivant l'ordre alphabetique du nom
% du premier auteur), par le nom du premier auteur suivi des deux
% derniers chiffres de l'annee de publication, le tout entre crochets.
% Si deux references du meme auteur se rapportent a la meme annee, elles
% seront differenciees par des lettres minuscules (a, b, etc.)
%
 
    % version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09.
    % Copyright (C) 1985, all rights reserved.
    % Copying of this file is authorized only if either
    % (1) you make absolutely no changes to your copy, including name, or
    % (2) if you do make changes, you name it something other than
    % btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
    % This restriction helps ensure that all standard styles are identical.
 
ENTRY
  { address
    author
    booktitle
    chapter
    edition
    editor
    howpublished
    institution
    journal
    key
    month
    note
    number
    organization
    pages
    publisher
    school
    series
    title
    type
    volume
    year
  }
  {}
  { label extra.label sort.label }
 
INTEGERS { output.state before.all mid.sentence after.sentence after.block }
 
FUNCTION {init.state.consts}
{ #0 'before.all :=
  #1 'mid.sentence :=
  #2 'after.sentence :=
  #3 'after.block :=
}
 
STRINGS { s t }
 
FUNCTION {output.nonnull}
{ 's :=
  output.state mid.sentence =
    { ", " * write$ }
    { output.state after.block =
    { add.period$ write$
      newline$
      "\newblock " write$
    }
    { output.state before.all =
        'write$
        { add.period$ " " * write$ }
      if$
    }
      if$
      mid.sentence 'output.state :=
    }
  if$
  s
}
 
FUNCTION {output}
{ duplicate$ empty$
    'pop$
    'output.nonnull
  if$
}
 
FUNCTION {output.check}
{ 't :=
  duplicate$ empty$
    { pop$ "empty " t * " in " * cite$ * warning$ }
    'output.nonnull
  if$
}
 
FUNCTION {output.bibitem}
{ newline$
  "\bibitem[" write$
  label write$
  "]{" write$
  cite$ write$
  "}" write$
  newline$
  ""
  before.all 'output.state :=
}
 
FUNCTION {fin.entry}
{ add.period$
  write$
  newline$
}
 
FUNCTION {new.block}
{ output.state before.all =
    'skip$
    { after.block 'output.state := }
  if$
}
 
FUNCTION {new.sentence}
{ output.state after.block =
    'skip$
    { output.state before.all =
    'skip$
    { after.sentence 'output.state := }
      if$
    }
  if$
}
 
FUNCTION {not}
{   { #0 }
    { #1 }
  if$
}
 
FUNCTION {and}
{   'skip$
    { pop$ #0 }
  if$
}
 
FUNCTION {or}
{   { pop$ #1 }
    'skip$
  if$
}
 
FUNCTION {new.block.checka}
{ empty$
    'skip$
    'new.block
  if$
}
 
FUNCTION {new.block.checkb}
{ empty$
  swap$ empty$
  and
    'skip$
    'new.block
  if$
}
 
FUNCTION {new.sentence.checka}
{ empty$
    'skip$
    'new.sentence
  if$
}
 
FUNCTION {new.sentence.checkb}
{ empty$
  swap$ empty$
  and
    'skip$
    'new.sentence
  if$
}
 
FUNCTION {field.or.null}
{ duplicate$ empty$
    { pop$ "" }
    'skip$
  if$
}
 
FUNCTION {emphasize}
{ duplicate$ empty$
    { pop$ "" }
    { "{\em " swap$ * "}" * }
  if$
}
 
FUNCTION {scapify}
{ duplicate$ empty$
    { pop$ "" }
    { "{\sc " swap$ * "}" * }
  if$
}
 
FUNCTION {underline}
{ duplicate$ empty$
    { pop$ "" }
    { "{\ul " swap$ * "}" * }
  if$
}
 
INTEGERS { nameptr namesleft numnames }
 
FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr "{ff~}{vv~}{ll}{~jj}" format.name$ 't :=
      nameptr #1 >
    { namesleft #1 >
        { ", " * t * }
        { numnames #2 >
        { "" * }
        'skip$
          if$
          t "others" =
        { " et~al." emphasize * }
        { " \iftoggle{ThesisInEnglish}{and}{et} " * t * }
          if$
        }
      if$
    }
    't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}
 
FUNCTION {format.authors}
{ author empty$
    { "" }
    { author format.names }
  if$
}
 
FUNCTION {format.editors}
{ editor empty$
    { "" }
    { editor format.names
      editor num.names$ #1 >
    { ", \iftoggle{ThesisInEnglish}{editors}{editeurs}" * }
    { ", \iftoggle{ThesisInEnglish}{editor}{editeur}" * }
      if$
    }
  if$
}
 
FUNCTION {format.title}
{ title empty$
    { "" }
    { title "t" change.case$ }
  if$
}
 
FUNCTION {n.dashify}
{ 't :=
  ""
    { t empty$ not }
    { t #1 #1 substring$ "-" =
    { t #1 #2 substring$ "--" = not
        { "--" *
          t #2 global.max$ substring$ 't :=
        }
        {   { t #1 #1 substring$ "-" = }
        { "-" *
          t #2 global.max$ substring$ 't :=
        }
          while$
        }
      if$
    }
    { t #1 #1 substring$ *
      t #2 global.max$ substring$ 't :=
    }
      if$
    }
  while$
}
 
FUNCTION {format.date}
{ year empty$
    { month empty$
    { "" }
    { "there's a month but no year in " cite$ * warning$
      month
    }
      if$
    }
    { month empty$
    'year
    { month " " * year * }
      if$
    }
  if$
}
 
FUNCTION {format.btitle}
{ title emphasize
}
 
FUNCTION {format.utitle}
{ title emphasize
}
 
FUNCTION {tie.or.space.connect}
{ duplicate$ text.length$ #3 <
    { "~" }
    { " " }
  if$
  swap$ * *
}
 
FUNCTION {either.or.check}
{ empty$
    'pop$
    { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  if$
}
 
FUNCTION {format.bvolume}
{ volume empty$
    { "" }
    { "volume" volume tie.or.space.connect
      series empty$
    'skip$
    { " of " * series emphasize * }
      if$
      "volume and number" number either.or.check
    }
  if$
}
 
FUNCTION {format.number.series}
{ volume empty$
    { number empty$
    { series field.or.null }
    { output.state mid.sentence =
        { "\iftoggle{ThesisInEnglish}{number}{num\'ero}" }
        { "\iftoggle{ThesisInEnglish}{Number}{Nume\'ero}" }
      if$
      number tie.or.space.connect
      series empty$
        { "there's a number but no series in " cite$ * warning$ }
        { " \iftoggle{ThesisInEnglish}{in}{de} " * series * }
      if$
    }
      if$
    }
    { "" }
  if$
}
 
FUNCTION {format.edition}
{ edition empty$
    { "" }
    { output.state mid.sentence =
    { edition "l" change.case$ " \iftoggle{ThesisInEnglish}{edition}{\'edition}" * }
    { edition "t" change.case$ " \iftoggle{ThesisInEnglish}{edition}{\'edition}" * }
      if$
    }
  if$
}
 
INTEGERS { multiresult }
 
FUNCTION {multi.page.check}
{ 't :=
  #0 'multiresult :=
    { multiresult not
      t empty$ not
      and
    }
    { t #1 #1 substring$
      duplicate$ "-" =
      swap$ duplicate$ "," =
      swap$ "+" =
      or or
    { #1 'multiresult := }
    { t #2 global.max$ substring$ 't := }
      if$
    }
  while$
  multiresult
}
 
FUNCTION {format.pages}
{ pages empty$
    { "" }
    { pages multi.page.check
    { "pages" pages n.dashify tie.or.space.connect }
    { "page" pages tie.or.space.connect }
      if$
    }
  if$
}
 
 
FUNCTION {format.volume}
{ volume empty$
    { "" }
    { "vol.~" volume * }
  if$
}
 
FUNCTION {format.number}
{ number empty$
    { "" }
    { "no.~" number * }
  if$
}
 
FUNCTION {format.chapter.pages}
{ chapter empty$
    'format.pages
    { type empty$
    { "\iftoggle{ThesisInEnglish}{chapter}{chapitre}" }
    { type "l" change.case$ }
      if$
      chapter tie.or.space.connect
      pages empty$
    'skip$
    { ", " * format.pages * }
      if$
    }
  if$
}
 
FUNCTION {format.in.ed.booktitle}
{ booktitle empty$
    { "" }
    { editor empty$
    { "\iftoggle{ThesisInEnglish}{In}{Dans} " booktitle * }
    { "\iftoggle{ThesisInEnglish}{In}{Dans} " format.editors * ", " * booktitle * }
      if$
    }
  if$
}
 
FUNCTION {empty.misc.check}
{ author empty$ title empty$ howpublished empty$
  month empty$ year empty$ note empty$
  and and and and and
  key empty$ not and
    { "all relevant fields are empty in " cite$ * warning$ }
    'skip$
  if$
}
 
FUNCTION {format.thesis.type}
{ type empty$
    'skip$
    { pop$
      type "t" change.case$
    }
  if$
}
 
FUNCTION {format.tr.number}
{ type empty$
    { "\iftoggle{ThesisInEnglish}{Technical Report}{Rapport technique}" }
    'type
  if$
  number empty$
    { "t" change.case$ }
    { number tie.or.space.connect }
  if$
}
 
FUNCTION {format.article.crossref}
{ key empty$
    { journal empty$
    { "need key or journal for " cite$ * " to crossref " * crossref *
      warning$
      ""
    }
    { "In {\em " journal * "\/}" * }
      if$
    }
    { "In " key * }
  if$
  " \cite{" * crossref * "}" *
}
 
FUNCTION {format.crossref.editor}
{ editor #1 "{vv~}{ll}" format.name$
  editor num.names$ duplicate$
  #2 >
    { pop$ " et~al." * }
    { #2 <
    'skip$
    { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
        { " et~al." * }
        { " \& " * editor #2 "{vv~}{ll}" format.name$ * }
      if$
    }
      if$
    }
  if$
}
 
FUNCTION {format.book.crossref}
{ volume empty$
    { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
      "In "
    }
    { "Volume" volume tie.or.space.connect
      " of " *
    }
  if$
  editor empty$
  editor field.or.null author field.or.null =
  or
    { key empty$
    { series empty$
        { "need editor, key, or series for " cite$ * " to crossref " *
          crossref * warning$
          "" *
        }
        { "{\em " * series * "\/}" * }
      if$
    }
    { key * }
      if$
    }
    { format.crossref.editor * }
  if$
  " \cite{" * crossref * "}" *
}
 
FUNCTION {format.incoll.inproc.crossref}
{ editor empty$
  editor field.or.null author field.or.null =
  or
    { booktitle empty$
        { key empty$
        { "need editor, key, or booktitle for " cite$ * " to crossref " *
          crossref * warning$
          ""
        }
        { "\iftoggle{ThesisInEnglish}{In}{Dans} " key * }
      if$
    }
    { "\iftoggle{ThesisInEnglish}{In}{Dans} " booktitle * }
      if$
    }
    { "In " format.crossref.editor * }
  if$
  " \cite{" * crossref * "}" *
}
 
FUNCTION {article}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.utitle "title" output.check
  new.block
  crossref missing$
    { journal "journal" output.check
      format.volume output
      format.number output 
      format.pages output
      format.date "year" output.check
    }
    { format.article.crossref output.nonnull
      format.pages output
    }
  if$
  new.block
  note output
  fin.entry
}
 
FUNCTION {book}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check }
    { format.authors output.nonnull
      crossref missing$
    { "author and editor" editor either.or.check }
    'skip$
      if$
    }
  if$
  new.block
  format.title "title" output.check
  crossref missing$
    { format.bvolume output
      new.block
      format.number.series output
      new.sentence
      publisher "publisher" output.check
      address output
    }
    { new.block
      format.book.crossref output.nonnull
    }
  if$
  format.edition output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}
 
FUNCTION {booklet}
{ output.bibitem
  format.authors output
  new.block
  format.title "title" output.check
  howpublished address new.block.checkb
  howpublished output
  address output
  format.date output
  new.block
  note output
  fin.entry
}
 
FUNCTION {inbook}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check }
    { format.authors output.nonnull
      crossref missing$
    { "author and editor" editor either.or.check }
    'skip$
      if$
    }
  if$
  new.block
  format.title "title" output.check
  crossref missing$
    { format.bvolume output
      format.chapter.pages "chapter and pages" output.check
      new.block
      format.number.series output
      new.sentence
      publisher "publisher" output.check
      address output
    }
    { format.chapter.pages "chapter and pages" output.check
      new.block
      format.book.crossref output.nonnull
    }
  if$
  format.edition output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}
 
FUNCTION {incollection}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.utitle "title" output.check
  new.block
  crossref missing$
    { format.in.ed.booktitle "booktitle" output.check
      format.bvolume output
      format.number.series output
      format.chapter.pages output
      new.sentence
      publisher "publisher" output.check
      address output
      format.edition output
      format.date "year" output.check
    }
    { format.incoll.inproc.crossref output.nonnull
      format.chapter.pages output
    }
  if$
  new.block
  note output
  fin.entry
}
 
FUNCTION {inproceedings}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.utitle "title" output.check
  new.block
  crossref missing$
    { format.in.ed.booktitle "booktitle" output.check
      format.bvolume output
      format.number.series output
      format.pages output
      address empty$
    { organization publisher new.sentence.checkb
      organization output
      publisher output
      format.date "year" output.check
    }
    { address output.nonnull
      format.date "year" output.check
      new.sentence
      organization output
      publisher output
    }
      if$
    }
    { format.incoll.inproc.crossref output.nonnull
      format.pages output
    }
  if$
  new.block
  note output
  fin.entry
}
 
FUNCTION {conference} { inproceedings }
 
FUNCTION {manual}
{ output.bibitem
  author empty$
    { organization empty$
    'skip$
    { organization output.nonnull
      address output
    }
      if$
    }
    { format.authors output.nonnull }
  if$
  new.block
  format.utitle "title" output.check
  author empty$
    { organization empty$
    { address new.block.checka
      address output
    }
    'skip$
      if$
    }
    { organization address new.block.checkb
      organization output
      address output
    }
  if$
  format.edition output
  format.date output
  new.block
  note output
  fin.entry
}
 
FUNCTION {mastersthesis}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.title "title" output.check
  new.block
  "Master's thesis" format.thesis.type output.nonnull
  school "school" output.check
  address output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}
 
FUNCTION {misc}
{ output.bibitem
  format.authors output
  title howpublished new.block.checkb
  format.utitle output
  howpublished new.block.checka
  howpublished output
  format.date output
  new.block
  note output
  fin.entry
  empty.misc.check
}
 
FUNCTION {phdthesis}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.btitle "title" output.check
  new.block
  "PhD thesis" format.thesis.type output.nonnull
  school "school" output.check
  address output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}
 
FUNCTION {proceedings}
{ output.bibitem
  editor empty$
    { organization output }
    { format.editors output.nonnull }
  if$
  new.block
  format.title "title" output.check
  format.bvolume output
  format.number.series output
  address empty$
    { editor empty$
    { publisher new.sentence.checka }
    { organization publisher new.sentence.checkb
      organization output
    }
      if$
      publisher output
      format.date "year" output.check
    }
    { address output.nonnull
      format.date "year" output.check
      new.sentence
      editor empty$
    'skip$
    { organization output }
      if$
      publisher output
    }
  if$
  new.block
  note output
  fin.entry
}
 
FUNCTION {techreport}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.utitle "title" output.check
  new.block
  format.tr.number output.nonnull
  institution "institution" output.check
  address output
  format.date "year" output.check
  new.block
  note output
  fin.entry
}
 
FUNCTION {unpublished}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.title "title" output.check
  new.block
  note "note" output.check
  format.date output
  fin.entry
}
 
FUNCTION {default.type} { misc }
 
MACRO {jan} {"\monthname[1]"}
 
MACRO {feb} {"\monthname[2]"}
 
MACRO {mar} {"\monthname[3]"}
 
MACRO {apr} {"\monthname[4]"}
 
MACRO {may} {"\monthname[5]"}
 
MACRO {jun} {"\monthname[6]"}
 
MACRO {jul} {"\monthname[7]"}
 
MACRO {aug} {"\monthname[8]"}
 
MACRO {sep} {"\monthname[9]"}
 
MACRO {oct} {"\monthname[10]"}
 
MACRO {nov} {"\monthname[11]"}
 
MACRO {dec} {"\monthname[12]"}
 
MACRO {acmcs} {"ACM Computing Surveys"}
 
MACRO {acta} {"Acta Informatica"}
 
MACRO {cacm} {"Communications of the ACM"}
 
MACRO {ibmjrd} {"IBM Journal of Research and Development"}
 
MACRO {ibmsj} {"IBM Systems Journal"}
 
MACRO {ieeese} {"IEEE Transactions on Software Engineering"}
 
MACRO {ieeetc} {"IEEE Transactions on Computers"}
 
MACRO {ieeetcad}
 {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"}
 
MACRO {ipl} {"Information Processing Letters"}
 
MACRO {jacm} {"Journal of the ACM"}
 
MACRO {jcss} {"Journal of Computer and System Sciences"}
 
MACRO {scp} {"Science of Computer Programming"}
 
MACRO {sicomp} {"SIAM Journal on Computing"}
 
MACRO {tocs} {"ACM Transactions on Computer Systems"}
 
MACRO {tods} {"ACM Transactions on Database Systems"}
 
MACRO {tog} {"ACM Transactions on Graphics"}
 
MACRO {toms} {"ACM Transactions on Mathematical Software"}
 
MACRO {toois} {"ACM Transactions on Office Information Systems"}
 
MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"}
 
MACRO {tcs} {"Theoretical Computer Science"}
 
READ
 
FUNCTION {sortify}
{ purify$
  "l" change.case$
}
 
INTEGERS { len }
 
FUNCTION {chop.word}
{ 's :=
  'len :=
  s #1 len substring$ =
    { s len #1 + global.max$ substring$ }
    's
  if$
}
 
INTEGERS { et.al.char.used }
 
FUNCTION {initialize.et.al.char.used}
{ #0 'et.al.char.used :=
}
 
EXECUTE {initialize.et.al.char.used}
 
%
% Cette function produit le label avec le nom du premier auteur
%
FUNCTION {format.lab.names}
{ 's :=
  s #1 "{vv }{ll}" format.name$
}
 
FUNCTION {author.key.label}
{ author empty$
    { key empty$
    { cite$ #1 #3 substring$ }
    { key #3 }
      if$
    }
    { author format.lab.names }
  if$
}
 
FUNCTION {author.editor.key.label}
{ author empty$
    { editor empty$
    { key empty$
        { cite$ #1 #3 substring$ }
        { key }
      if$
    }
    { editor format.lab.names }
      if$
    }
    { author format.lab.names }
  if$
}
 
FUNCTION {author.key.organization.label}
{ author empty$
    { key empty$
    { organization empty$
        { cite$ #1 #3 substring$ }
        { "The " #4 organization chop.word #3 text.prefix$ }
      if$
    }
    { key }
      if$
    }
    { author format.lab.names }
  if$
}
 
FUNCTION {editor.key.organization.label}
{ editor empty$
    { key empty$
    { organization empty$
        { cite$ #1 #3 substring$ }
        { "The " #4 organization chop.word #3 text.prefix$ }
      if$
    }
    { key }
      if$
    }
    { editor format.lab.names }
  if$
}
 
%
% Fonction modifiee pour generer les bons labels
FUNCTION {calc.label}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.label
    { type$ "proceedings" =
    'editor.key.organization.label
    { type$ "manual" =
        'author.key.organization.label
        'author.key.label
      if$
    }
      if$
    }
  if$
  duplicate$
  "~" *
  year #-1 #4 substring$ field.or.null purify$ *
  'label :=
  year #-1 #4 substring$ field.or.null purify$ 
  *
  sortify 'sort.label :=
}
 
FUNCTION {sort.format.names}
{ 's :=
  #1 'nameptr :=
  ""
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { nameptr #1 >
    { "   " * }
    'skip$
      if$
      s nameptr "{vv{ } }{ll{ }}{  ff{ }}{  jj{ }}" format.name$ 't :=
      nameptr numnames = t "others" = and
    { "et al" * }
    { t sortify * }
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}
 
FUNCTION {sort.format.title}
{ 't :=
  "A " #2
    "An " #3
      "The " #4 t chop.word
    chop.word
  chop.word
  sortify
  #1 global.max$ substring$
}
 
FUNCTION {author.sort}
{ author empty$
    { key empty$
    { "to sort, need author or key in " cite$ * warning$
      ""
    }
    { key sortify }
      if$
    }
    { author sort.format.names }
  if$
}
 
FUNCTION {author.editor.sort}
{ author empty$
    { editor empty$
    { key empty$
        { "to sort, need author, editor, or key in " cite$ * warning$
          ""
        }
        { key sortify }
      if$
    }
    { editor sort.format.names }
      if$
    }
    { author sort.format.names }
  if$
}
 
FUNCTION {author.organization.sort}
{ author empty$
    { organization empty$
    { key empty$
        { "to sort, need author, organization, or key in " cite$ * warning$
          ""
        }
        { key sortify }
      if$
    }
    { "The " #4 organization chop.word sortify }
      if$
    }
    { author sort.format.names }
  if$
}
 
FUNCTION {editor.organization.sort}
{ editor empty$
    { organization empty$
    { key empty$
        { "to sort, need editor, organization, or key in " cite$ * warning$
          ""
        }
        { key sortify }
      if$
    }
    { "The " #4 organization chop.word sortify }
      if$
    }
    { editor sort.format.names }
  if$
}
 
FUNCTION {presort}
{ calc.label
  sort.label
  "    "
  *
  type$ "book" =
  type$ "inbook" =
  or
    'author.editor.sort
    { type$ "proceedings" =
    'editor.organization.sort
    { type$ "manual" =
        'author.organization.sort
        'author.sort
      if$
    }
      if$
    }
  if$
  *
  "    "
  *
  year field.or.null sortify
  *
  "    "
  *
  title field.or.null
  sort.format.title
  *
  #1 entry.max$ substring$
  'sort.key$ :=
}
 
ITERATE {presort}
 
SORT
 
STRINGS { longest.label last.sort.label next.extra }
 
INTEGERS { longest.label.width last.extra.num }
 
FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
  #0 int.to.chr$ 'last.sort.label :=
  "" 'next.extra :=
  #0 'longest.label.width :=
  #0 'last.extra.num :=
}
 
FUNCTION {forward.pass}
{ last.sort.label sort.label =
    { last.extra.num #1 + 'last.extra.num :=
      last.extra.num int.to.chr$ 'extra.label :=
    }
    { "a" chr.to.int$ 'last.extra.num :=
      "" 'extra.label :=
      sort.label 'last.sort.label :=
    }
  if$
}
 
FUNCTION {reverse.pass}
{ next.extra "b" =
    { "a" 'extra.label := }
    'skip$
  if$
  label extra.label * 'label :=
  label width$ longest.label.width >
    { label 'longest.label :=
      label width$ 'longest.label.width :=
    }
    'skip$
  if$
  extra.label 'next.extra :=
}
 
EXECUTE {initialize.longest.label}
 
ITERATE {forward.pass}
 
REVERSE {reverse.pass}
 
FUNCTION {begin.bib}
{ et.al.char.used
    { "\newcommand{\etalchar}[1]{$^{#1}$}" write$ newline$ }
    'skip$
  if$
  preamble$ empty$
    'skip$
    { preamble$ write$ newline$ }
  if$
%  "\begin{thebibliography}{"  longest.label  * "}" * write$ newline$
  "\begin{thebibliography}{xxxx}" write$ newline$
}
 
EXECUTE {begin.bib}
 
EXECUTE {init.state.consts}
 
ITERATE {call.type$}
 
FUNCTION {end.bib}
{ newline$
  "\end{thebibliography}" write$ newline$
}
 
EXECUTE {end.bib}
2

If you want to use a .bst file with natbib's author-year citation module, the .bst file needs to pass on the author and year information in a way readable for natbib. That is done via the optional argument to \bibitem. The comments in natbib.sty explain

 % This package reimplements the LaTeX \cite command to be used for various
 % citation styles, both author-year and numerical. It accepts BibTeX
 % output intended for many other packages, and therefore acts as a
 % general, all-purpose citation-style interface.
 %
 % With standard numerical .bst files, only numerical citations are
 % possible. With an author-year .bst file, both numerical and
 % author-year citations are possible.
 %
 % If author-year citations are selected, \bibitem must have one of the
 %   following forms:
 %   \bibitem[Jones et al.(1990)]{key}...
 %   \bibitem[Jones et al.(1990)Jones, Baker, and Williams]{key}...
 %   \bibitem[Jones et al., 1990]{key}...
 %   \bibitem[\protect\citeauthoryear{Jones, Baker, and Williams}{Jones
 %       et al.}{1990}]{key}...
 %   \bibitem[\protect\citeauthoryear{Jones et al.}{1990}]{key}...
 %   \bibitem[\protect\astroncite{Jones et al.}{1990}]{key}...
 %   \bibitem[\protect\citename{Jones et al., }1990]{key}...
 %   \harvarditem[Jones et al.]{Jones, Baker, and Williams}{1990}{key}...
 %
 % This is either to be made up manually, or to be generated by an
 % appropriate .bst file with BibTeX.

Your .bst file wasn't written with this system in mind (in fact it was written before natbib was even a thing), but it isn't too hard to make it cooperate with natbib.

As you noted, your .bst file generates citation labels of the form

\bibitem[<author>~<year>]

and with two small changes we can make it generate the natbib-compatible

\bibitem[<author>(<year>)]

Just change

FUNCTION {calc.label}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.label
    { type$ "proceedings" =
    'editor.key.organization.label
    { type$ "manual" =
        'author.key.organization.label
        'author.key.label
      if$
    }
      if$
    }
  if$
  duplicate$
  "~" *
  year #-1 #4 substring$ field.or.null purify$ *
  'label :=
  year #-1 #4 substring$ field.or.null purify$ 
  *
  sortify 'sort.label :=
}

to

FUNCTION {calc.label}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.label
    { type$ "proceedings" =
    'editor.key.organization.label
    { type$ "manual" =
        'author.key.organization.label
        'author.key.label
      if$
    }
      if$
    }
  if$
  duplicate$
  "(" *
  year #-1 #4 substring$ field.or.null purify$ *
  ")" *
  'label :=
  year #-1 #4 substring$ field.or.null purify$ 
  *
  sortify 'sort.label :=
}

The actual diff between these functions is just

--- oldtdotldot.bst 2020-10-09 16:44:49.017918200 +0200
+++ tdotldot.bst    2020-10-09 16:38:01.070090100 +0200
@@ -1038,8 +1038,9 @@
     }
   if$
   duplicate$
-  "~" *
+  "(" *
   year #-1 #4 substring$ field.or.null purify$ *
+  ")" *
   'label :=
   year #-1 #4 substring$ field.or.null purify$ 
   *

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.