% BibTeX bibliography style `abuser'
	% abbreviated style with urls and eprints, better handling of series,
	% Dutch last names sorted correctly
	% hacked from standard style `abbrv' version 0.99a
	% by David Eppstein, Univ. of California, Irvine,
	% http://www.ics.uci.edu/~eppstein/, eppstein@ics.uci.edu, 6 Nov 1996

ENTRY
  { address
    author
    booktitle
    chapter
    doi
    edition
    editor
	eprint
    howpublished
    institution
    journal
    key
    month
    note
    number
    organization
    pages
    publisher
    school
    series
    title
    type
    url
    volume
    year
  }
  {}
  { label }
  
FUNCTION {to.appear.in}
{
	note empty$
	{ }
	{
	   note "To appear" =
	  { "To appear in " swap$ * }
	  { }
	  if$
    }
	if$
}
FUNCTION {rest.of.note}
{
	note empty$
	{ note }
	{
	  note "To appear" =
	  { "" }
	  { note }
	  if$
	}
	if$
}

FUNCTION {format.eprint}
{ eprint empty$
    { "" }
    { "\href{http://arxiv.org/abs/" eprint * "}{arXiv:" * eprint * "}" * }
  if$
}

FUNCTION {format.doi}
{ doi empty$
    { "" }
    { ", \href{http://dx.doi.org/" * doi * "}%" * write$
      newline$
      "{doi:" doi * "}" * "" }
  if$
}

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$
  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$
}

INTEGERS { nameptr namesleft numnames }

FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
      nameptr #1 >
	{ namesleft #1 >
	    { ", " * t * }
	    { numnames #2 >
		{ "," * }
		'skip$
	      if$
	      t "others" =
		{ " et~al." * }
		{ " and " * 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 >
	{ ", editors" * }
	{ ", editor" * }
      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
}

% add emptiness check -- DE
FUNCTION {tie.or.space.connect}
{ duplicate$ empty$
    'pop$
    { duplicate$ text.length$ #3 <
	{ "~" }
	{ " " }
      if$
      swap$ * *
    }
  if$
}

FUNCTION {either.or.check}
{ empty$
    'pop$
    { "can't use both " swap$ * " fields in " * cite$ * warning$ }
  if$
}

% change "volume" to "vol." and ignore series -- DE
% 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$
% }
%
% Output volume normally UNLESS it is the volume number in a series
% (as distinguished by a nonempty series and an empty number)
%
FUNCTION {format.bvolume}
{ volume empty$
    { "" }
    { series empty$
      { "vol." volume tie.or.space.connect }
      { number empty$
        { "" }
        { "vol." volume tie.or.space.connect }
        if$
      }
      if$
    }
  if$
}

% Rearrange to be "Series #" instead of "number # in Series", ignore vol. -- DE
% FUNCTION {format.number.series}
% { volume empty$
%     { number empty$
% 	{ series field.or.null }
% 	{ output.state mid.sentence =
% 	    { "number" }
% 	    { "Number" }
% 	  if$
% 	  number tie.or.space.connect
% 	  series empty$
% 	    { "there's a number but no series in " cite$ * warning$ }
% 	    { " in " * series * }
% 	  if$
% 	}
%       if$
%     }
%     { "" }
%   if$
% }
%
% Prefer to use number for series over volume, but use volume if no number
%
FUNCTION {format.number.series}
{ number empty$
  { series empty$
    { "" }
    { volume empty$
      { series field.or.null }
      { series volume tie.or.space.connect }
      if$
      }
    if$
  }
  { series empty$
    { "no." number tie.or.space.connect }
    { series number tie.or.space.connect }
    if$
  }
  if$
}

FUNCTION {format.edition}
{ edition empty$
    { "" }
    { output.state mid.sentence =
	{ edition "l" change.case$ " edition" * }
	{ edition "t" change.case$ " 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
}

% abbreviate pages -- DE
%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.pages}
{ pages empty$
    { "" }
    { pages multi.page.check
	{ "pp.~" pages * }
	{ "p.~" pages * }
      if$
    }
  if$
}

% Handle number but no volume without complaining
% (e.g. Abstract Games Magazine uses this)
% DE 23 Aug 2000
FUNCTION {format.vol.num.pages}
{ volume empty$
  { number empty$ { "" } { "no.~" number * ", " *} if$
    format.pages *
  }
  { volume
		  number empty$ 'skip$ { "(" * number * ")" * } if$
    pages empty$ 'skip$ { ":" * pages n.dashify * } if$
  }
  if$
}

FUNCTION {format.chapter.pages}
{ chapter empty$
    'format.pages
    { type empty$
	{ "chapter" }
	{ type "l" change.case$ }
      if$
      chapter tie.or.space.connect
      pages empty$
	'skip$
	{ ", " * format.pages * }
      if$
    }
  if$
}

% Flush editors and "In" -- DE
%
% FUNCTION {format.in.ed.booktitle}
% { booktitle empty$
%     { "" }
%     { editor empty$
% 	{ "In " booktitle emphasize * }
% 	{ "In " format.editors * ", " * booktitle emphasize * }
%       if$
%     }
%   if$
% }
%
FUNCTION {format.in.ed.booktitle}
{ booktitle empty$
    { "" }
    { booktitle emphasize }
  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$
}

% abbreviate tech. rep. -- DE
FUNCTION {format.tr.number}
{ type empty$
%    { "Technical Report" }
    { "Tech. Rep." }
    'type
  if$
  number empty$
    { "t" change.case$ }
    { number tie.or.space.connect }
  if$
}

% New -- DE
FUNCTION {format.url}
{ url empty$
    { "" }
    { "\url{" url *  "}" * }
 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." * }
	    { " and " * 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
    { key empty$
	{ booktitle empty$
	    { "need editor, key, or booktitle for " cite$ * " to crossref " *
	      crossref * warning$
	      ""
	    }
	    { "In {\em " booktitle * "\/}" * }
	  if$
	}
	{ "In " key * }
      if$
    }
    { "In " format.crossref.editor * }
  if$
  " \cite{" * crossref * "}" *
}

% output volume and pages similar to incollection, but w/o the "vol." -- DE
% 
% FUNCTION {article}
% { output.bibitem
%   format.authors "author" output.check
%   new.block
%   format.title "title" output.check
%   new.block
%   crossref missing$
%     { journal emphasize "journal" output.check
%       format.vol.num.pages output
%       format.date "year" output.check
%     }
%     { format.article.crossref output.nonnull
%       format.pages outpu
%     }
%   if$
%   new.block
%   note output
%   fin.entry
% }
%
FUNCTION {article}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.title "title" output.check
  new.block
  crossref missing$
    { journal emphasize to.appear.in format.vol.num.pages tie.or.space.connect output
      format.date "year" output.check
    }
    { format.article.crossref output.nonnull
      format.pages output
    }
  if$
  format.doi output
  format.eprint output
  format.url output
  new.block
  rest.of.note output
  fin.entry
}

% Add format.chapter.pages -- DE 23 Aug 2000
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.btitle "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
  format.chapter.pages output
  format.doi output
  format.eprint output
  format.url output
  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
  format.doi output
  format.eprint output
  format.url output
  new.block
  note output
  fin.entry
}

% Make same as incollection -- DE
% 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.btitle "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
%   format.url output
%   new.block
%   note output
%   fin.entry
% }

% move format.edition from after address to after title.
% move format.number.series from after bvolume to after publisher.
% allow empty publisher.
% flush address. -- DE
% 
% FUNCTION {incollection}
% { output.bibitem
%   format.authors "author" output.check
%   new.block
%   format.title "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$
%   format.url output
%   new.block
%   note output
%   fin.entry
% }
%
FUNCTION {incollection}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.title "title" output.check
  new.block
  crossref missing$
    { format.in.ed.booktitle to.appear.in "booktitle" output.check
      format.edition output
      format.bvolume output
      format.chapter.pages output
      publisher empty$
	  'skip$
		{ new.sentence
	          publisher "publisher" output.check }
      if$
      format.number.series output
      format.date "year" output.check
    }
    { format.incoll.inproc.crossref output.nonnull
      format.chapter.pages output
    }
  if$
  format.doi output
  format.eprint output
  format.url output
  new.block
  rest.of.note output
  fin.entry
}
FUNCTION {inbook} {incollection}

% make inproceedings same as incollection
% (flush address meaning conf.loc -- I think it should always mean publisher's
% address, which in this abbreviated style should be omitted entirely.) -- DE
%
% FUNCTION {inproceedings}
% { output.bibitem
%   format.authors "author" output.check
%   new.block
%   format.title "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$
%   format.url output
%   new.block
%   note output
%   fin.entry
% }
FUNCTION {inproceedings} {incollection}

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.btitle "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
  format.doi output
  format.eprint output
  format.url 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
  format.doi output
  format.eprint output
  format.url output
  new.block
  note output
  fin.entry
}

FUNCTION {misc}
{ output.bibitem
  format.authors output
  title howpublished new.block.checkb
  format.title output
  howpublished new.block.checka
  howpublished output
  format.date output
  format.doi output
  format.eprint output
  format.url output
  new.block
  note output
  fin.entry
  empty.misc.check
}

% Put periods in "Ph.D." -- DE
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
  "Ph.D. thesis" format.thesis.type output.nonnull
  school "school" output.check
  address output
  format.date "year" output.check
  format.doi output
  format.eprint output
  format.url output
  new.block
  note output
  fin.entry
}

FUNCTION {proceedings}
{ output.bibitem
  editor empty$
    { organization output }
    { format.editors output.nonnull }
  if$
  new.block
  format.btitle "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$
  format.doi output
  format.eprint output
  format.url output
  new.block
  note output
  fin.entry
}

% Flush institution address (and add url) -- DE
%
% FUNCTION {techreport}
% { output.bibitem
%   format.authors "author" output.check
%   new.block
%   format.title "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 {techreport}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.title "title" output.check
  new.block
  format.tr.number output.nonnull
  institution "institution" output.check
  format.date "year" output.check
  format.doi output
  format.eprint output
  format.url output
  new.block
  note output
  fin.entry
}

FUNCTION {unpublished}
{ output.bibitem
  format.authors "author" output.check
  new.block
  format.title "title" output.check
  format.doi output
  format.eprint output
  format.url output
  new.block
  note "note" output.check
  format.date output
  fin.entry
}

FUNCTION {default.type} { misc }

MACRO {jan} {"Jan."}

MACRO {feb} {"Feb."}

MACRO {mar} {"Mar."}

MACRO {apr} {"Apr."}

MACRO {may} {"May"}

MACRO {jun} {"June"}

MACRO {jul} {"July"}

MACRO {aug} {"Aug."}

MACRO {sep} {"Sept."}

MACRO {oct} {"Oct."}

MACRO {nov} {"Nov."}

MACRO {dec} {"Dec."}

MACRO {acmcs} {"ACM Comput. Surv."}

MACRO {acta} {"Acta Inf."}

MACRO {cacm} {"Commun. ACM"}

MACRO {ibmjrd} {"IBM J. Res. Dev."}

MACRO {ibmsj} {"IBM Syst.~J."}

MACRO {ieeese} {"IEEE Trans. Softw. Eng."}

MACRO {ieeetc} {"IEEE Trans. Comput."}

MACRO {ieeetcad}
 {"IEEE Trans. Comput.-Aided Design Integrated Circuits"}

MACRO {ipl} {"Inf. Process. Lett."}

MACRO {jacm} {"J.~ACM"}

MACRO {jcss} {"J.~Comput. Syst. Sci."}

MACRO {scp} {"Sci. Comput. Programming"}

MACRO {sicomp} {"SIAM J. Comput."}

MACRO {tocs} {"ACM Trans. Comput. Syst."}

MACRO {tods} {"ACM Trans. Database Syst."}

MACRO {tog} {"ACM Trans. Gr."}

MACRO {toms} {"ACM Trans. Math. Softw."}

MACRO {toois} {"ACM Trans. Office Inf. Syst."}

MACRO {toplas} {"ACM Trans. Prog. Lang. Syst."}

MACRO {tcs} {"Theoretical Comput. Sci."}

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$
}

% sort Dutch names correctly - DE
FUNCTION {sort.format.names}
{ 's :=
  #1 'nameptr :=
  ""
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { nameptr #1 >
	{ "   " * }
	'skip$
      if$
%     s nameptr "{vv{ } }{ll{ }}{  f{ }}{  jj{ }}" format.name$ 't :=
      s nameptr "{ll{ }}{vv{ } }{  f{ }}{  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}
{ 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 }

INTEGERS { number.label longest.label.width }

FUNCTION {initialize.longest.label}
{ "" 'longest.label :=
  #1 'number.label :=
  #0 'longest.label.width :=
}

FUNCTION {longest.label.pass}
{ number.label int.to.str$ 'label :=
  number.label #1 + 'number.label :=
  label width$ longest.label.width >
    { label 'longest.label :=
      label width$ 'longest.label.width :=
    }
    'skip$
  if$
}

EXECUTE {initialize.longest.label}

ITERATE {longest.label.pass}

FUNCTION {begin.bib}
{ preamble$ empty$
    'skip$
    { preamble$ write$ newline$ }
  if$
  "\begin{thebibliography}{"  longest.label  * "}" * write$ newline$
}

EXECUTE {begin.bib}

EXECUTE {init.state.consts}

ITERATE {call.type$}

FUNCTION {end.bib}
{ newline$
  "\end{thebibliography}" write$ newline$
}

EXECUTE {end.bib}
