from pyexlatex.models.references.bibtex.style.style import Style


JOF_STYLE = r"""
%%%% jof.bst
%%%%
%%%% This file was patched by Ivo Welch on May 29, 1999 in order to
%%%% handle Journal of Finance style conventions for articles, books,
%%%% and incollections.

%%%% Ivo Welch is *NOT* familiar with this language, so most modifications
%%%% were intelligent guesswork.  If you improve it, please notify
%%%% ivo.welch@agsm.ucla.edu and send your better version for public
%%%% distribution.

%%%% Note: JF has no systematic format for a working paper.
%%%% Note: JF has article titles plain and book titles italic.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%% Econometrica bibliography style
%%% For use with harvard.sty and LaTeX2e (NFSS) or LaTeX 2.09
%%% Also requires em-cite.sty to patch harvard.sty
%%% 24-aug-94
%%% Revised 11-aug-95
%%%
%%% Based on makebst, but with modifications by
%%% kcb@hss.caltech.edu (KC Border)
%%% Please report any problems to me.
%%%
%%% The main changes from the output of makebst are:
%%% 1. Addition of a function to replace repeated authors with a 3 em dash.
%%% 	(Search for compare.names, this function is portable.)
%%% 2. Modification of output.nonnull to allow commas inside quotation marks
%%%		and no comma after year.
%%% 3.Eliminated feature (bug?) of the harvard style of citation.
%%%		It creates a short label for subsequent citations.  This alleged
%%%		feature shortens both Aliprantis, Border, and Luxemburg (1991) and 
%%%		Aliprantis, Brown, and Burkinshaw (1991) to Aliprantis et~al. (1991).
%%%		This creates the need to label these as
%%%		Aliprantis, Border, and Luxemburg (1991a) and
%%%		Aliprantis, Brown, and Burkinshaw (1991b), despite the fact
%%%		that these entries have different authors.  I used my own format 
%%%		for creating the labels, and used the same label for 
%%%		both the short and long forms.  I know that the 
%%%		_Chicago_Manual_of_Style recommends using Aliprantis et~al,
%%		but Econometrica regularly writes out three authors,
%%		and it is rare to cite an article with more than four authors in
%%%		Econometrica. (I couldn't find an example of even four being cited,
%%%		but I didn't spend a lot of time looking.)
%%% 4. Addition of macros to handle editions. (My own idiosycracy.)
%%% 5. A new entry type called issue for special issues of a journal.
%%%		(Another idiosyncracy.)
%%% 6. Many details to conform to Econometrica's quirks.
%%% 	(Search for KCB )
%%% 7. I wrote this for use with LaTeX2e and the NFSS2.  However, I did
%%%		add some macros so it will work with LaTeX 2.09.
%%%		(Search for \ifx\undefined\emph )
%%% 8. 11-august-1995:
%%% 	Stefan Hochguertel  <S.Hochguertel@kub.nl> reported a number of 
%%%	differences from Econometrica.
%%%	Search for KCB(8-11-95) to find the corrections.
%%%	Wrote em-cite.sty to get multiple citations correct.
%%%
%%% The remainder of this file was generated by makebst, except for
%%% modifications marked with KCB.
%% 
%% This is file `em.bst', generated 
%% on <1994/8/17> with the docstrip utility (2.2h).
%% 
%% The original source files were:
%% 
%% genbst.mbs  (with options: `ay,har,nm-rev1,nmft-sc,dt-beg,yr-par,tit-qq,atit-u,thtit-a,volp-com,edby,blk-com,pp,ed,abr,and-com,nfss')
%% ---------------------------------------- 
%% *** Econometrica style *** 
%% 
%% (Here are the specifications of the source file)
%% \def\filename{genbst.mbs}
%% \def\filedate{1994 July 1}
%% \def\fileversion{1.3}
%%   For use with BibTeX version 0.99a or later, LaTeX version 2.09
%%-------------------------------------------------------------------
%% NOTICE:
%% This file may be used for non-profit purposes.
%% It may not be distributed in exchange for money,
%%   other than distribution costs.
%%
%% The author provides it `as is' and does not guarantee it in any way.
%%
%% Copyright (C) 1994 Patrick W. Daly
%% Max-Planck-Institut f\"ur Aeronomie
%% Postfach 20
%% D-37189 Katlenburg-Lindau
%% Germany
%%
%% E-mail:
%% SPAN--     nsp::linmpi::daly    (note nsp also known as ecd1)
%% Internet-- daly@linmpi.dnet.gwdg.de
%%-----------------------------------------------------------
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%%---------------------------------------------------------------------
 % This is an author-year citation style bibliography. As such, it is
 % non-standard LaTeX, and requires a style option to function properly.
 % The appropriate style file is:   harvard.sty
 % The form of the bibitem entries is
 %   \harvarditem[Jones et al.]{Jones, Baker, and Smith}{1990}{key}...
 % There are style changes that may be specified in the text with
 % the command \citationstyle.
 %   \citeasnoun{key} ==>>    Jones et al. (1990)
 %   \cite{key} ==>>          (Jones et al. 1990)
 %   \cite[chap. 2]{key} ==>> (Jones et al. 1990, chap. 2)
 % On the first citation of any work, the full author list is used.
%%---------------------------------------------------------------------

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 }	%%%KCB: removed  long.label

INTEGERS { output.state before.all mid.sentence after.sentence after.block }

%%%KCB: new output state, no.comma
INTEGERS { no.comma}

FUNCTION {init.state.consts}
{ #0 'before.all :=
  #1 'mid.sentence :=
  #2 'after.sentence :=
  #3 'after.block :=
  #4 'no.comma :=	%%%KCB
}

STRINGS { s t }


%%%KCB: revise to use new output state
FUNCTION {output.nonnull}
{ 's :=
 output.state no.comma = %%%KCB: if in this state, write a space
 {  " " * write$ before.all 'output.state := }	%%%KCB
 {  output.state mid.sentence =		%%%KCB: add brace at beginning
% Ivo Welch: this has been changed from original    { ", " * write$ }
    { " " * write$ }
    { output.state after.block =
        { add.period$ write$
          newline$
          "\newblock " write$
        }
        { output.state before.all =
            'write$
            { add.period$ " " * write$ }
          if$
        }
      if$
  }
 if$
 mid.sentence 'output.state :=
 }	%%%KCB: matching brace
 if$	%%%KCB: test for no.comma state
  s
}

%%%KCB(8-11-95): version to output colon, not comma
FUNCTION {output.nonnull.colon}
{ 's :=
 output.state no.comma = %%%KCB: if in this state, write a space
 {  " " * write$ before.all 'output.state := }	
 {  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$
  }
 if$
 mid.sentence 'output.state :=
 }	%%%KCB: matching brace
 if$	%%%KCB: test for no.comma state
  s
}



FUNCTION {output}
{ duplicate$ empty$
    'pop$
    'output.nonnull
  if$
}

FUNCTION {output.check}
{ 't :=
  duplicate$ empty$
    { pop$ "empty " t * " in " * cite$ * warning$ }
    'output.nonnull
  if$
}

%%% KCB(8-11-95)
FUNCTION {output.check.colon}
{ 't :=
  duplicate$ empty$
    { pop$ "empty " t * " in " * cite$ * warning$ }
    'output.nonnull.colon
  if$
}

FUNCTION {output.bibitem}
{ newline$
  "\harvarditem[" write$
  label write$
  "]{" label * "}{" * write$	%%%KCB: replaced long.label with label
  year duplicate$ empty$
    { pop$ "????" }
    'skip$
  if$
  extra.label * "}{" * 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.checkb}
{ empty$
  swap$ empty$
  and
    'skip$
    'new.block
  if$
}

FUNCTION {field.or.null}
{ duplicate$ empty$
    { pop$ "" }
    'skip$
  if$
}

FUNCTION {emphasize}
{ duplicate$ empty$
    { pop$ "" }
    { "\emph{" swap$ * "}" * }
  if$
}

INTEGERS { nameptr namesleft numnames }

%%%KCB:  Here is a portable set of routines to check for repeated authors
%%% and replace them with a 3 em dash
%%% According to _Chicago_Manual_of_Style_, a dash is used to 
%%% replace an author's name only if the entire list is the same, so:
%%% Compare names. See if prev.name is identical to CurrList.
%%% If not, then just output CurrList. 
%%% If so, replace with \BySame
%%% I use a conservative matching scheme, 
%%% and check to see if full names are identical, 
%%% even though we only use initials.  
%%% This may mean that you have to correct your .bib database 
%%% to ensure consistency.
%%%
%%% sample usage:
%%% search for {format.author}

INTEGERS {currNum prevNum}

STRINGS {PrevList CurrList prev.name PrevTemp CurrTemp}

%%%KCB: Initialize prev.name ot some nonsense string:

FUNCTION {init.prev.name}
{
"My puppy Harley" 'prev.name :=
}

%%%KCB: Must EXECUTE {init.prev.name} after READ

%%%KCB: <CurrList> compare.names <modified name list>
FUNCTION {compare.names}
{	prev.name 'PrevList :=
	duplicate$ 'prev.name :=	% make current list the new previous list
	'CurrList :=
    PrevList num.names$ 'prevNum :=
    CurrList num.names$ 'currNum :=
%
   prevNum currNum =	%% If prevNum = currNum
  {	"" 'PrevTemp :=		%% Then take this branch
	"" 'CurrTemp :=
    #1 'nameptr :=	%%% start with first name in each list
	{ nameptr prevNum > not }%% while nameptr <= prevNum
%% Format both lists the same way.
%% Use full names: bib file might need to be corrected
	{
	PrevList nameptr "{ff }{vv~}{ll}{ jj}" format.name$ PrevTemp * 'PrevTemp := 
	CurrList nameptr "{ff }{vv~}{ll}{ jj}" format.name$ CurrTemp * 'CurrTemp :=
	nameptr #1 + 'nameptr := }
    while$ 
%% Now compare :
	PrevTemp CurrTemp =	%% If PrevTemp = CurrTemp
%Ivo Welch: Replaced	{ "\BySame{}" }  with { CurrList }.  JF does not like ---- for author repeats
	{ CurrList }
	{ CurrList }
	if$	
	}
	{ CurrList }	%% If not prevNum = currNum
  if$			%% If prevNum = currNum
}

%%%
%%%
%%%KCB:  End of new routine.


FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { nameptr #1 >
%ivo welch changed. original was
%        { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := }
%        { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := }
        { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := }
        { s nameptr "{vv~}{ll}{, jj}{, ff}" format.name$ 't := }
      if$
      nameptr #1 >
        {
          namesleft #1 >
            { ", " * t * }
            {
              ", " *
              t "others" =
                { " et~al." * }
                { " \textmd{and} " * t * }	%%%KCB(8-11-95): added \sc
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}


FUNCTION {format.names.ed}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr
%ivo welch changed. original was
%      "{f.~}{vv~}{ll}{, jj}"
      "{ff~}{vv~}{ll}{, jj}"
      format.name$ 't :=
      nameptr #1 >
        {
          namesleft #1 >
            { ", " * t * }
            {
              ", " *
              t "others" =
                { " et~al." * }
                { " {\small and} " * t * }	%%%KCB: added \small
              if$
            }
          if$
        }
        't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

FUNCTION {format.key}
{ empty$
    { key field.or.null }
    { "" }
  if$
}

FUNCTION {format.authors}
{ author empty$
    { "" }
    { "\textmd{" author compare.names format.names * "}" * }
  if$
}

FUNCTION {format.editors}
{ editor empty$
    { "" }
    { "\textmd{" editor compare.names format.names * " }" *
      editor num.names$ #1 >
        { " (eds.)" * }
        { " (ed.)" * }
      if$
    }
  if$
}

FUNCTION {format.in.editors}
{ editor empty$
    { "" }
    { editor format.names.ed
    }
  if$
}

FUNCTION {format.title}
{ title empty$
    { "" }
    { title
% changed by Ivo Welch: Original was     "``" swap$ * ",'' " *
      "" swap$ * ", " *
    }
no.comma 'output.state :=   %%%KCB:
  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 {word.in}
{ "in " }

FUNCTION {format.date}
{ year duplicate$ empty$
    { "empty year in " cite$ * "; set to ????" * warning$
       pop$ "????" }
    'skip$
  if$
  ", " swap$ * extra.label * ", " *	%%%KCB: added : 
   before.all 'output.state :=		%%%KCB:
}

FUNCTION {format.btitle}
{
  title  emphasize
  no.comma 'output.state :=		%%%KCB: 
}

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$
    { "" }
    { "vol." 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 =
            { "no." }
            { "No." }
          if$
          number tie.or.space.connect
          series empty$
            { "there's a number but no series in " cite$ * warning$ }
            { " in " * series * }
          if$
        }
      if$
    }
    { "" }
  if$
}

FUNCTION {format.edition}
{ edition empty$
    { "" }
    { output.state mid.sentence =
        { edition "l" change.case$ " edn." * }
        { edition "t" change.case$ " edn." * }
      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
        { "pp." pages n.dashify tie.or.space.connect }
        { "p." pages tie.or.space.connect }
      if$
    }
  if$
}

FUNCTION {format.vol.num.pages}
{ volume field.or.null
% ivo welch: numbers are not used in articles for the JF
%  number empty$
%    'skip$
%    { "(" number * ")" * *
%      volume empty$
%        { "there's a number but no volume in " cite$ * warning$ }
%        'skip$
%      if$
%    }
%  if$
  pages empty$
    'skip$
    { duplicate$ empty$
        { pop$ format.pages }
        { ", " * pages n.dashify * }
      if$
    }
  if$
}

FUNCTION {format.chapter.pages}
{ chapter empty$
    'format.pages
    { type empty$
        { "chap." }
        { 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$
        { word.in booktitle emphasize * }
        { word.in booktitle emphasize * ", ed. by " *	%%%KCB: abbrv ed.
          format.in.editors * }
      if$
    }
  if$
}

FUNCTION {format.in.ed.editor}
{ editor empty$
   { word.in booktitle emphasize * }
% Ivo: changed ed: to eds.:  (note: there is no check for the number of editors!)
   { "in " * format.in.editors * ", eds.: " * booktitle emphasize 	%%%KCB: abbrv ed.
          }
   if$
}

FUNCTION {format.thesis.type}
{ type empty$
    'skip$
    { pop$
      type "t" change.case$
    }
  if$
}

FUNCTION {format.tr.number}
{ type empty$
    { "Working paper, " }	%%%KCB: changed default
    'type
  if$
  number empty$
    { "t" change.case$ }
    { number tie.or.space.connect }
  if$
}

FUNCTION {format.article.crossref}
{
  word.in
  "\cite{" * crossref * "}" *
}

FUNCTION {format.book.crossref}
{ volume empty$
    { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
      word.in
    }
    { "vol." volume tie.or.space.connect
      " of " *
    }
  if$
  "\cite{" * crossref * "}" *
}

FUNCTION {format.incoll.inproc.crossref}
{
  word.in
  "\cite{" * crossref * "}" *
}

FUNCTION {article}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  format.date "year" output.check
  format.title "title" output.check
 crossref missing$
    { journal emphasize "journal" output.check
      format.vol.num.pages output
    }
    { format.article.crossref output.nonnull
      format.pages output
    }
  if$
  note output
  fin.entry
}

FUNCTION {book}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check
      editor format.key output
    }
    { format.authors output.nonnull
      crossref missing$
        { "author and editor" editor either.or.check }
        'skip$
      if$
    }
  if$
  format.date "year" output.check
  format.btitle "title" output.check 
	mid.sentence 'output.state :=	%%%KCB:
  crossref missing$
    { format.bvolume output
%%%      format.number.series output
      new.sentence
      publisher "publisher" output.check.colon	% KCB(811-95) follow by colon
% ivo welch: added following line for parentheses 
       "(" swap$  * 
      address "address" output.check		% KCB(8-11-95)  city first
% ivo welch: added following line for parentheses 
       ")" * 
    }
    {
      format.book.crossref output.nonnull
    }
  if$
  format.edition output
  note output
  fin.entry
}

FUNCTION {booklet}
{ output.bibitem
  format.authors output
  author format.key output
  format.date "year" output.check
  format.title "title" output.check
  howpublished output
  address output
  note output
  fin.entry
}

FUNCTION {inbook}
{ output.bibitem
  author empty$
    { format.editors "author and editor" output.check
      editor format.key output
    }
    { format.authors output.nonnull
      crossref missing$
        { "author and editor" editor either.or.check }
        'skip$
      if$
    }
  if$
  format.date "year" output.check
  format.btitle "title" output.check
  crossref missing$
    { publisher "publisher" output.check.colon	% KCB(811-95) follow by colon
      address "address" output.check		% KCB(8-11-95)  city first
      format.bvolume output	% KCB(811-95): Yes, Econometrica does this!
      format.chapter.pages "chapter and pages" output.check
%%%      format.number.series output
    }
    { format.book.crossref output.nonnull
      format.chapter.pages "chapter and pages" output.check
    }
  if$
  format.edition output
  note output
  fin.entry
}

FUNCTION {incollection}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  format.date "year" output.check
  format.title "title" output.check
  crossref missing$
    { format.in.ed.editor "booktitle" output.check
%      new.sentence
      publisher "publisher" output.check % output.check.colon	% KCB(811-95) follow by colon
% ivo welch: added parenthesis before incollection address 
	"(" swap$ * ", " *
      address "address" output.check		% KCB(8-11-95)  city first
% ivo welch: added parenthesis after address; has a bad space in it, but so what.
	")" output
% ivo welch: deleted all the rest
%      format.edition output	% KCB(811-95): Yes, Econometrica does this!
%      format.bvolume output
%      format.number.series output
%      format.chapter.pages output
     }
    { format.chapter.pages output
      format.incoll.inproc.crossref output.nonnull
    }
  if$
  note output
  fin.entry
}

FUNCTION {inproceedings}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  format.date "year" output.check
  format.title "title" output.check
  crossref missing$
    { format.in.ed.booktitle "booktitle" output.check
      format.bvolume output
      format.number.series output
      format.pages output
      address output
      new.sentence
      organization output
      publisher output
    }
    { format.incoll.inproc.crossref output.nonnull
      format.pages output
    }
  if$
  note output
  fin.entry
}

FUNCTION {conference} { inproceedings }

%%%KCB: special issue of a journal with a special editor

FUNCTION {issue}
{ output.bibitem
  format.editors output
  editor format.key output
  format.date "year" output.check
  format.btitle "title" output.check
  crossref missing$
    { journal emphasize "journal" output.check
      format.vol.num.pages output
    }
    { format.article.crossref output.nonnull
      format.pages output
    }
  if$
  note output
  fin.entry
}

FUNCTION {manual}
{ output.bibitem
  format.authors output
  author format.key output
  format.date "year" output.check
  format.btitle "title" output.check
  organization output
  address output
  format.edition output
  note output
  fin.entry
}

FUNCTION {mastersthesis}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  format.date "year" output.check
  format.title "title" output.check
  "Master's thesis" format.thesis.type output.nonnull
  school "school" output.check
  address output
  note output
  fin.entry
}

FUNCTION {misc}
{ output.bibitem
  format.authors output
  author format.key output
  format.date "year" output.check
  format.title output
  howpublished output
  note output
  fin.entry
}

FUNCTION {phdthesis}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  format.date "year" output.check
  format.title "title" output.check
  "Ph.D. thesis" format.thesis.type output.nonnull
  school "school" output.check
  address output
  note output
  fin.entry
}

FUNCTION {proceedings}
{ output.bibitem
  format.editors output
  editor format.key output
  format.date "year" output.check
  format.btitle "title" output.check
  format.bvolume output
  format.number.series output
  address output
  new.sentence
  organization output
  publisher output
  note output
  fin.entry
}

FUNCTION {techreport}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  format.date "year" output.check
  format.title "title" output.check
  format.tr.number output.nonnull
  institution "institution" output.check
  address output
  note output
  fin.entry
}

FUNCTION {unpublished}
{ output.bibitem
  format.authors "author" output.check
  author format.key output
  format.date "year" output.check
  format.title "title" output.check
  note "note" output.check
  fin.entry
}

FUNCTION {default.type} { misc }

MACRO {jan} {"January"}

MACRO {feb} {"February"}

MACRO {mar} {"March"}

MACRO {apr} {"April"}

MACRO {may} {"May"}

MACRO {jun} {"June"}

MACRO {jul} {"July"}

MACRO {aug} {"August"}

MACRO {sep} {"September"}

MACRO {oct} {"October"}

MACRO {nov} {"November"}

MACRO {dec} {"December"}

%%%KCB: removed computer science journal macros
%%%KCB: added following macros for editions
MACRO {first} {"1st "}
MACRO {second} {"2d "}
MACRO {third} {"3d "}
MACRO {fourth} {"4th "}
MACRO {fifth} {"5th "}
MACRO {sixth} {"6th"}
MACRO {seventh} {"7th "}
MACRO {eighth} {"8th "}
MACRO {ninth} {"9th "}
MACRO {tenth} {"10th "}

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


%%%KCB:  Change format of labels:
FUNCTION {format.lab.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }
    { s nameptr "{vv~}{ll}" 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$
}

%%%KCB: removed FUNCTION {format.long.lab.names} 

FUNCTION {author.key.label}
{ author empty$
    { key empty$
        { cite$ #1 #3 substring$ }
        'key
      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 {editor.key.label}
{ editor empty$
    { key empty$
        { cite$ #1 #3 substring$ }
        'key
      if$
    }
    { editor format.lab.names }
  if$
}

%%%KCB: use entire year field as label

FUNCTION {calc.label}
{ type$ "book" =
  type$ "inbook" =
  or
  type$ "issue" =	%%%KCB: need for new entry type
  or				%%%KCB
    'author.editor.key.label
    { type$ "proceedings" =
	'editor.key.label
	'author.key.label
      if$
    }
  if$
  ", "
  *			
  year field.or.null
  *	
  'label :=
}

FUNCTION {calc.short.label}
{ type$ "book" =
  type$ "inbook" =
  or
    'author.editor.key.label
    { type$ "proceedings" =
        'editor.key.label
        'author.key.label
      if$
    }
  if$
  'label :=
}

%%%KCB: removed FUNCTION {calc.long.label}

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 :=
      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 {editor.sort}
{ editor empty$
    { key empty$
        { "to sort, need editor or key in " cite$ * warning$
          ""
        }
        { key sortify }
      if$
    }
    { editor sort.format.names }
  if$
}

FUNCTION {presort}
{ calc.label
  label sortify
  "    "
  *
  type$ "book" =
  type$ "inbook" =
  or
  type$ "issue" =	%%%KCB: need for new entry type
  or				%%%KCB
    'author.editor.sort
    { type$ "proceedings" =
        'editor.sort
        'author.sort
      if$
    }
  if$
  #1 entry.max$ substring$ 
  'sort.label :=
  sort.label
  *
  "    "
  *
  title field.or.null
  sort.format.title
  *
  #1 entry.max$ substring$
  'sort.key$ :=
}

ITERATE {presort}

SORT

STRINGS { last.label next.extra }

INTEGERS { last.extra.num }

FUNCTION {initialize.extra.label.stuff}
{ #0 int.to.chr$ 'last.label :=
  "" 'next.extra :=
  #0 'last.extra.num :=
}

FUNCTION {forward.pass}
{ last.label 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 :=
      label 'last.label :=
    }
  if$
}

FUNCTION {reverse.pass}
{ next.extra "b" =
    { "a" 'extra.label := }
    'skip$
  if$
  extra.label 'next.extra :=
}

EXECUTE {initialize.extra.label.stuff}

EXECUTE {init.prev.name}	%%%KCB:  needed for replacing repeated authors

ITERATE {forward.pass}

REVERSE {reverse.pass}

FUNCTION {bib.sort.order}
{ sort.label
  "    "
  *
  year field.or.null sortify
  *
  "    "
  *
  title field.or.null
  sort.format.title
  *
  #1 entry.max$ substring$
  'sort.key$ :=
  calc.short.label
%%%KCB: removed   calc.long.label
}

ITERATE {bib.sort.order}

SORT

FUNCTION {begin.bib}
{ preamble$ empty$
    'skip$
    { preamble$ write$ newline$ }
  if$
%%%KCB: add defn of \BySame, can be overridden in document
"\ifx\undefined\BySame" write$ newline$
  "\newcommand{\BySame}{\leavevmode\rule[.5ex]{3em}{.5pt}\ }"
       write$ newline$
  "\fi" write$ newline$
%%% KCB: For those who still cling to LaTeX 2.09
"\ifx\undefined\textmd" write$ newline$
  "\newcommand{\textmd}[1]{{\sc #1}}"
       write$ newline$
  "\fi" write$ newline$
"\ifx\undefined\emph" write$ newline$
  "\newcommand{\emph}[1]{{\em #1\/}}"
       write$ newline$
  "\fi" write$ newline$
%%%
  "\begin{thebibliography}{}" write$ newline$
}

EXECUTE {begin.bib}

EXECUTE {init.state.consts}

ITERATE {call.type$}

FUNCTION {end.bib}
{ newline$
  "\end{thebibliography}" write$ newline$
"Done." top$	%%%KCB: Signal end for NeXTeX's TexView
}

EXECUTE {end.bib}
%% End of customized bst file 
"""

jof_style = Style('jof', JOF_STYLE)