summaryrefslogtreecommitdiff
path: root/obsolete/biblio
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /obsolete/biblio
Initial commit
Diffstat (limited to 'obsolete/biblio')
-rw-r--r--obsolete/biblio/bibtex/contrib/acm.bst1134
-rw-r--r--obsolete/biblio/bibtex/contrib/cea.bst1124
-rw-r--r--obsolete/biblio/bibtex/contrib/economic/econometrica-fr.bst1241
-rw-r--r--obsolete/biblio/bibtex/contrib/economic/econometrica.bst1292
-rw-r--r--obsolete/biblio/bibtex/contrib/geralpha/galphac.bst1340
-rw-r--r--obsolete/biblio/bibtex/contrib/geralpha/geralpha.bst1340
-rw-r--r--obsolete/biblio/bibtex/contrib/geralpha/geralpha.tex67
-rw-r--r--obsolete/biblio/bibtex/contrib/harvard/agsm.bst1226
-rw-r--r--obsolete/biblio/bibtex/contrib/harvard/dcu.bst1240
-rw-r--r--obsolete/biblio/bibtex/contrib/harvard/harvard.bib21
-rw-r--r--obsolete/biblio/bibtex/contrib/harvard/harvard.description44
-rw-r--r--obsolete/biblio/bibtex/contrib/harvard/harvard.sty79
-rw-r--r--obsolete/biblio/bibtex/contrib/harvard/harvard.tex136
-rw-r--r--obsolete/biblio/bibtex/contrib/harvard/kluwer.bst1227
-rw-r--r--obsolete/biblio/bibtex/contrib/makefile/makefile630
-rw-r--r--obsolete/biblio/bibtex/contrib/makefile/makefile.tops2054
-rw-r--r--obsolete/biblio/bibtex/contrib/makefile/makefile.tops20-new56
-rw-r--r--obsolete/biblio/bibtex/contrib/makefile/makefile.vms55
-rw-r--r--obsolete/biblio/bibtex/contrib/misc/cell.bst1442
-rw-r--r--obsolete/biblio/bibtex/contrib/misc/jas99.bst1336
-rw-r--r--obsolete/biblio/bibtex/contrib/misc/jas99_m.bst1365
-rw-r--r--obsolete/biblio/bibtex/contrib/misc/numalg.bst1370
-rw-r--r--obsolete/biblio/bibtex/contrib/nature.bst1012
-rw-r--r--obsolete/biblio/bibtex/contrib/nature.sty241
-rw-r--r--obsolete/biblio/bibtex/contrib/phaip.bst1885
-rw-r--r--obsolete/biblio/bibtex/contrib/phapalik.bst1943
-rw-r--r--obsolete/biblio/bibtex/contrib/phcpc.bst1885
-rw-r--r--obsolete/biblio/bibtex/contrib/phiaea.bst1889
-rw-r--r--obsolete/biblio/bibtex/contrib/phnf.bst1890
-rw-r--r--obsolete/biblio/bibtex/contrib/phnflet.bst1883
-rw-r--r--obsolete/biblio/bibtex/contrib/phpf.bst1877
-rw-r--r--obsolete/biblio/bibtex/contrib/phppcf.bst2009
-rw-r--r--obsolete/biblio/bibtex/contrib/phreport.bst1885
-rw-r--r--obsolete/biblio/bibtex/contrib/phrmp.bst2150
-rw-r--r--obsolete/biblio/bibtex/contrib/physics.bst3520
-rw-r--r--obsolete/biblio/bibtex/utils/misc/rfc2bib.awk117
36 files changed, 42005 insertions, 0 deletions
diff --git a/obsolete/biblio/bibtex/contrib/acm.bst b/obsolete/biblio/bibtex/contrib/acm.bst
new file mode 100644
index 0000000000..1750daa7a1
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/acm.bst
@@ -0,0 +1,1134 @@
+% ACM Transactions bibliography style (24-Jan-88 version)
+% A lot like abbrv.bst, but names come out "Last, initials", and in \sc.
+% Some dates are parenthesized.
+%
+% History
+% 2/ 6/86 (HWT) Original version, by Howard Trickey.
+% 3/ 5/86 (HWT) Put in pp. everywhere but articles, as per ACM style.
+% 1/24/88 (OP&HWT) Updated for BibTeX version 0.99a, Oren Patashnik;
+% corrected the abbreviations to "Mar." and "Sept.";
+% THIS `acm' VERSION DOES NOT WORK WITH BIBTEX 0.98i.
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ }
+ {}
+ { 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$
+ 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 {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+
+FUNCTION {emphasizeic}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "\/}" * }
+ if$
+}
+
+FUNCTION {scapify}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\sc " swap$ * "}" * }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { t "others" =
+ { ", et~al." * }
+ { ", and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+% For names inside entries (e.g., editors of an "In ...");
+% this is exactly ABBRV.BST's `format.names' function.
+FUNCTION {format.innames}
+{ '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 scapify }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names scapify
+ editor num.names$ #1 >
+ { ", Eds." * }
+ { ", Ed." * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.ineditors}
+{ editor empty$
+ { "" }
+ { editor format.innames
+ editor num.names$ #1 >
+ { ", Eds." * }
+ { ", Ed." * }
+ 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 {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 *
+ 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 *
+ 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$ "~ed." * }
+ { edition "t" change.case$ "~ed." * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages n.dashify }
+ 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.pp.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { "pp.~" pages n.dashify * }
+ { "p.~" pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.journal.vol.num.date}
+{ journal empty$
+ { "empty journal in " cite$ * warning$
+ ""
+ }
+ { journal
+ volume empty$
+ 'skip$
+ { " " * volume * }
+ if$
+ number empty$
+ 'emphasizeic
+ { emphasize ", " * number * }
+ if$
+ year empty$
+ { "empty year in " cite$ * warning$ }
+ { " (" * format.date * ")" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ 'format.pp.pages
+ { type empty$
+ { "ch.~" chapter * }
+ { type "l" change.case$ chapter tie.or.space.connect }
+ if$
+ pages empty$
+ 'skip$
+ { ", " * format.pp.pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { "In " booktitle emphasize *
+ editor empty$
+ 'skip$
+ { ", " * format.ineditors * }
+ if$
+ }
+ if$
+}
+
+% The proceedings title (it's on the stack) gets an (address, date) appended
+FUNCTION {format.proc.date}
+{ duplicate$ empty$
+ { pop$ "" }
+ { year empty$
+ { "empty year in " cite$ * warning$
+ address empty$
+ 'emphasize
+ { emphasizeic
+ " (" * address * ")" *
+ }
+ if$
+ }
+ { emphasizeic
+ " (" *
+ address empty$
+ 'skip$
+ { address * ", " * }
+ if$
+ format.date *
+ ")" *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.in.proc.date}
+{ booktitle empty$
+ { "" }
+ { "In " booktitle format.proc.date * }
+ 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$
+ { "Tech. Rep." }
+ '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." * }
+ { " 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 "
+ }
+ { "Vol.~" volume *
+ " 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 * "}" *
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.journal.vol.num.date output
+ format.pages output
+ }
+ { format.article.crossref output.nonnull
+ format.pp.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.btitle "title" output.check
+ format.edition output
+ 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.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.btitle "title" output.check
+ format.edition output
+ 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.date "year" output.check
+ format.chapter.pages "chapter and pages" output.check
+ 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 "booktitle" output.check
+ format.edition output
+ format.bvolume output
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ format.date "year" output.check
+ }
+ { format.incoll.inproc.crossref output.nonnull }
+ if$
+ format.chapter.pages output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.proc.date "booktitle" output.check
+ format.ineditors output
+ format.bvolume output
+ format.number.series output
+ organization output
+ publisher output
+ }
+ { format.incoll.inproc.crossref output.nonnull }
+ if$
+ format.pp.pages output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ author empty$
+ { organization scapify output }
+ { format.authors output.nonnull }
+ if$
+ new.block
+ format.btitle "title" output.check
+ format.edition output
+ author empty$
+ { address new.block.checka }
+ { organization address new.block.checkb
+ organization output
+ }
+ if$
+ address 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.title 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 scapify output }
+ { format.editors output.nonnull }
+ if$
+ new.block
+ title format.proc.date "title" output.check
+ format.bvolume output
+ format.number.series output
+ editor empty$
+ 'skip$
+ { organization output }
+ if$
+ publisher output
+ 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
+ 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} {"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. Program. 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$
+}
+
+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 {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}
diff --git a/obsolete/biblio/bibtex/contrib/cea.bst b/obsolete/biblio/bibtex/contrib/cea.bst
new file mode 100644
index 0000000000..af72438f51
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/cea.bst
@@ -0,0 +1,1124 @@
+%% Save file as: CEA.BST Source: FILESERV@SHSU.BITNET
+% Name: cea.bst
+% Description: BibTeX style for Computers and Electronics in Agriculture
+% Keywords: BibTeX, bibliography style
+% Author: James Darrell McCauley <jdm5548@diamond.tamu.edu>
+% Latest Version: Version 0.1 <13 Mar 1992>
+% Archives: niord.shsu.edu or FILESERV@SHSU.BITNET
+% Note: This is a hack of apalike.bst and not official by Elsevier Sci Pub
+% (See CHANGE LOG below)
+% See also: cea.sty
+%
+% CHANGE LOG
+% Date Ver Changes
+% <13 Mar 1992> 0.9 Modified from apalike.bst <jdm5548@diamond.tamu.edu>
+% BibTeX `apalike' bibliography style (24-Jan-88 version)
+%
+% BibTeX `cea' bibliography style <13 Mar 1992>
+% Adapted from the `apalike' bibliography style (24-Jan-88 version)
+% Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a.
+% Copyright (C) 1988, all rights reserved.
+% Copying of this file is allowed, provided that if you make any changes at all
+% you name it something other than `apalike.bst'.
+% This restriction helps ensure that all copies are identical.
+% Differences between this style and `alpha' are generally heralded by a `%'.
+% The file btxbst.doc has the documentation for alpha.bst.
+%
+% This style should be used with the `cea' LaTeX style (cea.sty).
+% \cite's come out like "(Jones, 1986)" in the text but there are no labels
+% in the bibliography, and something like "1986" comes out immediately
+% after the author. Author (and editor) names appear as last name, comma,
+% initials. A `year' field is required for every entry, and so is either
+% an author (or in some cases, an editor) field or a key field.
+%
+% Editorial note:
+% Many journals, such as Computers and Electronics in Agriculture,
+% require a style like `apalike', but I strongly, strongly, strongly
+% recommend that you not use it if you have a choice---use something
+% like `plain' instead. Mary-Claire van Leunen (A Handbook for
+% Scholars, Knopf, 1979) argues convincingly that a style like `plain'
+% encourages better writing than one like `apalike'. Furthermore the
+% strongest arguments for using an author-date style like
+% `apalike'---that it's "the most practical" (The Chicago Manual of
+% Style, University of Chicago Press, thirteenth edition, 1982, pages
+% 400--401)---fall flat on their face with the new computer-typesetting
+% technology. For instance page 401 anachronistically states "The chief
+% disadvantage of [a style like `plain'] is that additions or deletions
+% cannot be made after the manuscript is typed without changing numbers
+% in both text references and list." LaTeX sidesteps the disadvantage.
+%
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+% month not used in apalike
+ 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$
+}
+
+% apalike needs this function because
+% the year has special punctuation;
+% apalike ignores the month
+FUNCTION {output.year.check}
+{ year empty$
+ { "empty year in " cite$ * warning$ }
+ { write$
+ " " year * extra.label * "" *
+ mid.sentence 'output.state :=
+ }
+ 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 {unpub.note}
+{ add.period$
+ write$
+ " (unpubl.)"
+ 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$ "" }
+ { "{\rm " swap$ * "}" * } % changed from \em to \rm
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+ 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.key} % this function is just for apalike
+{ empty$
+ { key field.or.null }
+ { "" }
+ 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.btitle}
+{ 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 =
+ { "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$
+}
+
+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
+}
+
+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.vol.num.pages}
+{ volume field.or.null
+ 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$
+ { "chapter" }
+ { 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$
+ { "In: " booktitle emphasize * }
+ { "In: " format.editors * ", " * booktitle emphasize * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{ "In:" % this is for apalike
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In: "
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+ "\cite{" * crossref * "}" * % this is for apalike
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{ "In:" % this is for apalike
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { journal emphasize "journal" output.check
+ format.vol.num.pages output
+ }
+ { 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
+ editor format.key output
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ output.year.check % special for apalike
+ 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
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ howpublished output
+ address output
+ new.block
+ 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$
+ output.year.check % special for apalike
+ 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
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ 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.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
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ address output % for apalike
+ new.sentence % there's no year
+ organization output % here so things
+ publisher output % are simpler
+% format.bvolume output
+% format.number.series output
+% format.pages output
+ format.vol.num.pages output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ organization address new.block.checkb
+ organization output
+ address output
+ format.edition output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title output
+ new.block
+ howpublished output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ format.editors output
+ editor format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ address output % for apalike
+ new.sentence % we always output
+ organization output % a nonempty organization
+ publisher output % here
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ note "note" output.check
+ unpub.note
+% 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"}
+
+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$
+}
+
+% There are three apalike cases: one person (Jones),
+% two (Jones and de~Bruijn), and more (Jones et~al.).
+% This function is much like format.crossref.editors.
+%
+FUNCTION {format.lab.names}
+{ 's :=
+ s #1 "{vv~}{ll}" format.name$
+ s num.names$ duplicate$
+ #2 >
+ { pop$ " et~al." * }
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al." * }
+ { " and " * s #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key % apalike uses the whole key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key % apalike uses the whole 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 % apalike uses the whole key, no organization
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION {calc.label}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label % apalike ignores organization
+ 'author.key.label % for labeling and sorting
+ if$
+ }
+ if$
+ ", " % these three lines are
+ * % for apalike, which
+ year field.or.null purify$ #-1 #4 substring$ % uses all four digits
+ *
+ 'label :=
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$ % apalike uses initials
+ s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here
+ 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$
+}
+
+% apalike uses two sorting passes; the first one sets the
+% labels so that the `a's, `b's, etc. can be computed;
+% the second pass puts the references in "correct" order.
+% The presort function is for the first pass. It computes
+% label, sort.label, and title, and then concatenates.
+FUNCTION {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$ % for
+ 'sort.label := % apalike
+ sort.label % style
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+
+SORT % by label, sort.label, title---for final label calculation
+
+STRINGS { last.label next.extra } % apalike labels are only for the text;
+
+INTEGERS { last.extra.num } % there are none in the bibliography
+
+FUNCTION {initialize.extra.label.stuff} % and hence there is no `longest.label'
+{ #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$
+ label extra.label * 'label :=
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.extra.label.stuff}
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+% Now that the label is right we sort for real,
+% on sort.label then year then title. This is
+% for the second sorting 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$ :=
+}
+
+ITERATE {bib.sort.order}
+
+SORT % by sort.label, year, title---giving final bibliography order
+
+FUNCTION {begin.bib}
+{ preamble$ empty$ % no \etalchar in apalike
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{}" write$ newline$ % no labels in apalike
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
+ \ No newline at end of file
diff --git a/obsolete/biblio/bibtex/contrib/economic/econometrica-fr.bst b/obsolete/biblio/bibtex/contrib/economic/econometrica-fr.bst
new file mode 100644
index 0000000000..285107d20b
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/economic/econometrica-fr.bst
@@ -0,0 +1,1241 @@
+%%% Econometrica-fr bibliography style
+%%% For use with harvard.sty and LaTeX2e (NFSS) or LaTeX 2.09
+%%% 24-aug-94
+%%%
+%%% Based on econometrica.bst, but with modifications by
+%%% horny@cournot.u-strasbg.fr
+%%% Please report any problems to me.
+%%%
+%% 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.
+%%
+%%-----------------------------------------------------------
+%% \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{fr.and}{ %% le "et" entre les deux derniers auteurs
+" et "
+}
+
+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
+ { ", " * 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$
+}
+
+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
+ { "\BySame{}" }
+ { 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 >
+ { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := }
+ if$
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ ", " *
+ t "others" =
+ { " et~al." * }
+ { fr.and * t * }
+ 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
+ "{f.~}{vv~}{ll}{, jj}"
+ format.name$ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ ", " *
+ t "others" =
+ { " et~al." * }
+ { fr.and * t * }
+ 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$
+ { "" }
+ { "\textsc{" author compare.names format.names * "} " * }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { "\textsc{" 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
+ "``" 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}
+{ "dans " }
+
+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
+ 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. " * %%%KCB: abbrv ed.
+ format.in.editors * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Document de \uppercase{t}ravail" } %%%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
+ address output
+ }
+ {
+ 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$
+ { format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ format.book.crossref output.nonnull
+ }
+ 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.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.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ 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
+ "Mémoire de DEA" 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
+ "Thèse de \uppercase{d}octorat" 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} {"Janvier"}
+
+MACRO {feb} {"Février"}
+
+MACRO {mar} {"Mars"}
+
+MACRO {apr} {"Avril"}
+
+MACRO {may} {"Mai"}
+
+MACRO {jun} {"Juin"}
+
+MACRO {jul} {"Juillet"}
+
+MACRO {aug} {"Août"}
+
+MACRO {sep} {"Septembre"}
+
+MACRO {oct} {"Octobre"}
+
+MACRO {nov} {"Novembre"}
+
+MACRO {dec} {"Decembre"}
+
+%%%KCB: removed computer science journal macros
+%%%KCB: added following macros for editions
+MACRO {first} {"1er "}
+MACRO {second} {"2d "}
+MACRO {third} {"3ème "}
+MACRO {fourth} {"4ème "}
+MACRO {fifth} {"5ème "}
+MACRO {sixth} {"6ème "}
+MACRO {seventh} {"7ème "}
+MACRO {eighth} {"8ème "}
+MACRO {ninth} {"9ème "}
+MACRO {tenth} {"10ème "}
+
+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." * }
+ { fr.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\textsc" write$ newline$
+ "\newcommand{\textsc}[1]{{\sc #1}}"
+ write$ newline$
+ "\newcommand{\emph}[1]{{\em #1\/}}"
+ write$ newline$
+"\let\tmpsmall\small" write$ newline$
+"\renewcommand{\small}{\tmpsmall\sc}" 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
diff --git a/obsolete/biblio/bibtex/contrib/economic/econometrica.bst b/obsolete/biblio/bibtex/contrib/economic/econometrica.bst
new file mode 100644
index 0000000000..1ebf5065be
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/economic/econometrica.bst
@@ -0,0 +1,1292 @@
+%%% Econometrica bibliography style
+%%% For use with harvard.sty and LaTeX2e (NFSS) or LaTeX 2.09
+%%% 24-aug-94
+%%%
+%%% Based on makebst, but with modifications by
+%%% kcb@hss.caltech.edu (KC Border)
+%%% Please report any problems to me.
+%%%
+%%% The main changes from the ouput 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 )
+%%% 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
+ { ", " * 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$
+}
+
+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
+ { "\BySame{}" }
+ { 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 >
+ { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := }
+ if$
+ 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.names.ed}
+{ '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 * }
+ {
+ ", " *
+ 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$
+ { "" }
+ { "\textsc{" author compare.names format.names * "} " * }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { "\textsc{" 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
+ "``" 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
+ 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.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Discussion 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
+ address output
+ }
+ {
+ 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$
+ { format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ format.book.crossref output.nonnull
+ }
+ 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.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.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ 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\textsc" write$ newline$
+ "\newcommand{\textsc}[1]{{\sc #1}}"
+ write$ newline$
+ "\newcommand{\emph}[1]{{\em #1\/}}"
+ write$ newline$
+"\let\tmpsmall\small" write$ newline$
+"\renewcommand{\small}{\tmpsmall\sc}" 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
diff --git a/obsolete/biblio/bibtex/contrib/geralpha/galphac.bst b/obsolete/biblio/bibtex/contrib/geralpha/galphac.bst
new file mode 100644
index 0000000000..18d9d88a5b
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/geralpha/galphac.bst
@@ -0,0 +1,1340 @@
+% Adapted bibliography style `galphac' that changes several english-language
+% ``constants'' in the style.
+%
+%% Umlaut-Problem geloest (M\"arz) 7.2.1992
+%% Andreas Schilling, WSI/GRIS, 7400 T\"ubingen
+%% andreas@gris.informatik.uni-tuebingen.de
+%
+% titles of non-"books" (e.g., articles) not converted to lower-case
+% (they appear as in the database)
+%
+% Copyright of the changes (C) 1990 by
+% Robert Tolksdorf
+% K\"ortestr. 30
+% D-1000 Berlin 61
+% West Germany
+%
+% NO WARRANTY!
+%
+% Version 0 as of 28.05.90
+% 0.1 31.07.90
+% 1.0 21.09.90
+% HOW TO FIND THE CHANGES:
+% Since there were no comments in my original ``alpha''-style all comment-
+% lines denote my changes.
+% PROBLEMS:
+% I had problems to change the month-name ``March'' into ``M\"arz''. Somehow
+% the umlaut is not accepted. Experimenting with "a from the
+% ``german''-option did not work as well. If you have a hint how to include
+% umlauts in a bst, please report.
+% OUTLOOK:
+% This file could be used as a guide to change the other
+% standard-styles. Since I am using only ``alpha'' as I prefer to have
+% those impressing looking abbreviations in my bibliographies, I am too
+% lazy to publish a complete set of bibliography-styles. If you adapt
+% another style, please send a copy (5 1/4" or 3 1/2", 360 KB or 720 KB,
+% no HD-disks!).
+% BUGS:
+% There may still be some entries or fields that are not adapted. I am
+% developping this style for about one year, but surely do not have used
+% all entry-types or entry-field-combinations. Please report any
+% anormalities!
+%
+
+% BibTeX standard bibliography style `alpha'
+ % 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.
+ % The file btxbst.doc has the documentation for this style.
+
+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$
+}
+
+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 * }
+%
+% Now here we have discovered a bug. The bibliography of the LaTeX-book shows
+% the fault: If there are three or more authors, then the final ``and'' before
+% the last author's name is preceeded by a comma. This looks ugly and is
+% wrong.
+% The original and faulty line in format.names reads
+% { numnames #2 >
+% Actually the generation of the comma is dependent on the number of names
+% left. Therefore:
+%
+ { namesleft #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " et~al." * }
+% ``and'' is ``und'' in German
+ { " und " * 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 >
+% Let's call them ``Herausgeber''
+% { ", editors" * }
+% { ", editor" * }
+ { ", Hrsg." * }
+ { ", Hrsg." * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+% I want the title as typed in the database here RT
+% { title "t" change.case$ }
+ 'title
+ 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 {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'' is ``Jahrgang'' in German. The abbrv. is ``Jgg.'' (DUDEN)
+% { "volume" volume tie.or.space.connect
+ { "Jgg." 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 =
+ { "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$
+}
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+% `edition' is `Auflage' in german
+% { edition "l" change.case$ " edition" * }
+% { edition "t" change.case$ " edition" * }
+ { edition "l" change.case$ ".~Auflage" * }
+ { edition "t" change.case$ ".~Auflage" * }
+ 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
+% Let's call ``page'' ``Seite''
+% { "pages" pages n.dashify tie.or.space.connect }
+% { "page" pages tie.or.space.connect }
+ { "Seiten" pages n.dashify tie.or.space.connect }
+ { "Seite" pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ 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$
+% ``chapter'' is ``Kapitel'' in German
+% { "chapter" }
+ { "Kapitel" }
+ { 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$
+ { "In " booktitle emphasize * }
+ { "In " format.editors * ", " * booktitle emphasize * }
+ 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$
+ { "Technical Report" }
+ '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." * }
+% ``and'' is ``und'' in German
+ { " und " * 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'' is ``Jahrgang'' in German. See above
+% { "volume" volume tie.or.space.connect
+ { "Jgg." 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 * "}" *
+}
+
+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 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.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
+ 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.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
+ 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 "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.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$
+ 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.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
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+% A Master's thesis thesis is called ``Diplomarbeit'' in German
+% "Master's thesis" format.thesis.type output.nonnull
+ "Diplomarbeit" 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.title 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
+% A PhD thesis is called ``Dissertation'' in German
+% "PhD thesis" format.thesis.type output.nonnull
+ "Dissertation" 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.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$
+ 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
+ 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 }
+
+% Changed the names of the months
+
+MACRO {jan} {"Januar"}
+
+MACRO {feb} {"Februar"}
+
+% problems with the umlaut ! Geloest 7.2.92 A.Schilling
+MACRO {mar} {"\Marz"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"Mai"}
+
+MACRO {jun} {"Juni"}
+
+MACRO {jul} {"Juli"}
+
+MACRO {aug} {"August"}
+
+MACRO {sep} {"September"}
+
+MACRO {oct} {"Oktober"}
+
+MACRO {nov} {"November"}
+
+MACRO {dec} {"Dezember"}
+
+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}
+
+FUNCTION {format.lab.names}
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 >
+ { numnames #4 >
+ { #3 'namesleft := }
+ { numnames 'namesleft := }
+ if$
+ #1 'nameptr :=
+ ""
+ { namesleft #0 > }
+ { nameptr numnames =
+ { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { "{\etalchar{+}}" *
+ #1 'et.al.char.used :=
+ }
+ { s nameptr "{v{}}{l{}}" format.name$ * }
+ if$
+ }
+ { s nameptr "{v{}}{l{}}" format.name$ * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ numnames #4 >
+ { "{\etalchar{+}}" *
+ #1 'et.al.char.used :=
+ }
+ 'skip$
+ if$
+ }
+ { s #1 "{v{}}{l{}}" format.name$
+ duplicate$ text.length$ #2 <
+ { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ }
+ 'skip$
+ if$
+ }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key #3 text.prefix$ }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key #3 text.prefix$ }
+ 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 #3 text.prefix$ }
+ 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 #3 text.prefix$ }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+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 field.or.null purify$ #-1 #2 substring$
+ *
+ 'label :=
+ year field.or.null purify$ #-1 #4 substring$
+ *
+ 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}
+{ "\newcommand{\Marz}{M\" #34 int.to.chr$ * "arz }" * write$ newline$
+%Andreas Schilling 7.2.92
+ 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$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
+
+
diff --git a/obsolete/biblio/bibtex/contrib/geralpha/geralpha.bst b/obsolete/biblio/bibtex/contrib/geralpha/geralpha.bst
new file mode 100644
index 0000000000..79aca9e5f6
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/geralpha/geralpha.bst
@@ -0,0 +1,1340 @@
+Received: From DHDURZ1(MAILER) by DS0RUS54 with Jnet id 2694
+ for ZRFN0370@DS0RUS54; Mon, 15 Oct 90 14:27 A
+Received: from DHDURZ1 (DANTE) by DHDURZ1 (Mailer R2.03B) with BSMTP id 2687;
+ Mon, 15 Oct 90 14:25:48 CET
+Date: Mon, 15 Oct 90 14:24:52 CET
+From: "DANTE e.V." <DANTE@DHDURZ1>
+Subject: geralpha.bst
+To: Barbara Burr <ZRFN0370@DS0RUS54>
+
+
+%
+% Adapted bibliography style `geralpha' that changes several english-language
+% ``constants'' in the style.
+%
+% Copyright of the changes (C) 1990 by
+% Robert Tolksdorf
+% K\"ortestr. 30
+% D-1000 Berlin 61
+% West Germany
+%
+% NO WARRANTY!
+%
+% Version 0 as of 28.05.90
+% 0.1 31.07.90
+% 1.0 21.09.90
+% HOW TO FIND THE CHANGES:
+% Since there were no comments in my original ``alpha''-style all comment-
+% lines denote my changes.
+% PROBLEMS:
+% I had problems to change the month-name ``March'' into ``M\"arz''. Somehow
+% the umlaut is not accepted. Experimenting with "a from the
+% ``german''-option did not work as well. If you have a hint how to include
+% umlauts in a bst, please report.
+% OUTLOOK:
+% This file could be used as a guide to change the other
+% standard-styles. Since I am using only ``alpha'' as I prefer to have
+% those impressing looking abbreviations in my bibliographies, I am too
+% lazy to publish a complete set of bibliography-styles. If you adapt
+% another style, please send a copy (5 1/4" or 3 1/2", 360 KB or 720 KB,
+% no HD-disks!).
+% BUGS:
+% There may still be some entries or fields that are not adapted. I am
+% developping this style for about one year, but surely do not have used
+% all entry-types or entry-field-combinations. Please report any
+% anormalities!
+%
+
+% BibTeX standard bibliography style `alpha'
+ % 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.
+ % The file btxbst.doc has the documentation for this style.
+
+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$
+}
+
+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 * }
+%
+% Now here we have discovered a bug. The bibliography of the LaTeX-book shows
+% the fault: If there are three or more authors, then the final ``and'' before
+% the last author's name is preceeded by a comma. This looks ugly and is
+% wrong.
+% The original and faulty line in format.names reads
+% { numnames #2 >
+% Actually the generation of the comma is dependent on the number of names
+% left. Therefore:
+%
+ { namesleft #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " et~al." * }
+% ``and'' is ``und'' in German
+ { " und " * 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 >
+% Let's call them ``Herausgeber''
+% { ", editors" * }
+% { ", editor" * }
+ { ", Hrsg." * }
+ { ", Hrsg." * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+% I want the title as typed in the database here RT
+% { title "t" change.case$ }
+ 'title
+ 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 {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'' is ``Jahrgang'' in German. The abbrv. is ``Jgg.'' (DUDEN)
+% { "volume" volume tie.or.space.connect
+ { "Jgg." 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 =
+ { "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$
+}
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+% `edition' is `Auflage' in german
+% { edition "l" change.case$ " edition" * }
+% { edition "t" change.case$ " edition" * }
+ { edition "l" change.case$ ".~Auflage" * }
+ { edition "t" change.case$ ".~Auflage" * }
+ 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
+% Let's call ``page'' ``Seite''
+% { "pages" pages n.dashify tie.or.space.connect }
+% { "page" pages tie.or.space.connect }
+ { "Seiten" pages n.dashify tie.or.space.connect }
+ { "Seite" pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ 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$
+% ``chapter'' is ``Kapitel'' in German
+% { "chapter" }
+ { "Kapitel" }
+ { 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$
+ { "In " booktitle emphasize * }
+ { "In " format.editors * ", " * booktitle emphasize * }
+ 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$
+ { "Technical Report" }
+ '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." * }
+% ``and'' is ``und'' in German
+ { " und " * 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'' is ``Jahrgang'' in German. See above
+% { "volume" volume tie.or.space.connect
+ { "Jgg." 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 * "}" *
+}
+
+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 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.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
+ 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.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
+ 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 "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.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$
+ 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.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
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+% A Master's thesis thesis is called ``Diplomarbeit'' in German
+% "Master's thesis" format.thesis.type output.nonnull
+ "Diplomarbeit" 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.title 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
+% A PhD thesis is called ``Dissertation'' in German
+% "PhD thesis" format.thesis.type output.nonnull
+ "Dissertation" 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.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$
+ 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
+ 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 }
+
+% Changed the names of the months
+
+MACRO {jan} {"Januar"}
+
+MACRO {feb} {"Februar"}
+
+% problems with the umlaut !
+MACRO {mar} {"Marz"}
+
+MACRO {apr} {"April"}
+
+MACRO {may} {"Mai"}
+
+MACRO {jun} {"Juni"}
+
+MACRO {jul} {"Juli"}
+
+MACRO {aug} {"August"}
+
+MACRO {sep} {"September"}
+
+MACRO {oct} {"Oktober"}
+
+MACRO {nov} {"November"}
+
+MACRO {dec} {"Dezember"}
+
+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}
+
+FUNCTION {format.lab.names}
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 >
+ { numnames #4 >
+ { #3 'namesleft := }
+ { numnames 'namesleft := }
+ if$
+ #1 'nameptr :=
+ ""
+ { namesleft #0 > }
+ { nameptr numnames =
+ { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { "{\etalchar{+}}" *
+ #1 'et.al.char.used :=
+ }
+ { s nameptr "{v{}}{l{}}" format.name$ * }
+ if$
+ }
+ { s nameptr "{v{}}{l{}}" format.name$ * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ numnames #4 >
+ { "{\etalchar{+}}" *
+ #1 'et.al.char.used :=
+ }
+ 'skip$
+ if$
+ }
+ { s #1 "{v{}}{l{}}" format.name$
+ duplicate$ text.length$ #2 <
+ { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ }
+ 'skip$
+ if$
+ }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key #3 text.prefix$ }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key #3 text.prefix$ }
+ 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 #3 text.prefix$ }
+ 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 #3 text.prefix$ }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+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 field.or.null purify$ #-1 #2 substring$
+ *
+ 'label :=
+ year field.or.null purify$ #-1 #4 substring$
+ *
+ 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$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/geralpha/geralpha.tex b/obsolete/biblio/bibtex/contrib/geralpha/geralpha.tex
new file mode 100644
index 0000000000..aa7b9634bc
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/geralpha/geralpha.tex
@@ -0,0 +1,67 @@
+%\documentstyle[german,dina4]{article}
+%\catcode`\@=11
+% from Frank Mittelbach's doc-option:
+%\@ifundefined{BibTeX}
+% {\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em%
+% T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}}{}
+%\catcode`\@=8
+
+\author{Robert Tolksdorf}
+%\\K"ortestr.~30\\D-1000 Berlin 61}
+\title{Deutschsprachige Version des \BibTeX-{\tt alpha}-Stils}
+\titlemark{Deutschsprachige Version des \BibTeX-{\tt alpha}-Stils}
+\author{Robert Tolksdorf}
+\maketitle
+
+
+Die anglophil zentrierte \TeX-Welt l"a"st uns deutschsprachige Anwender
+immer wieder neue Aufgaben finden. F"ur meine Papiere an der
+Universit"at hat sich mit der Verf"ugbarkeit eines \BibTeX's der Umfang
+meiner Literaturlisten erheblich vergr"o"sert. Allerdings haben alle
+vordefinierten {\it bibliography-styles\/} den Nachteil, da"s sie auf
+englischsprachige Verh"altnisse hin geschrieben wurden. Und in einem
+deutschsprachigen Dokument sollte der "`Editor"' eben "`Herausgeber"'
+hei"sen.
+
+Ansatzpunkt f"ur eine Anpassung sind die {\tt .BST}-Dateien, in denen
+der Stil in der schlecht lesbaren \BibTeX-Sprache definiert wird. Da
+ich {\tt alpha} bevorzuge, liegt nun ein {\tt geralpha.bst} vor. Er
+enth"alt "Anderungen an den verschiedensten englischsprachigen
+Konstanten, so wird ein "`and"' zu "`und"' und nat"urlich auch die
+"`edition"' zur "`Auflage"'. Die Anpassung entspricht allerdings nicht
+den strengen Regeln f"ur Literaturverweise, wie sie beispielsweise in
+\cite{duden:satz}\ festgelegt sind.
+
+Ein Problem dabei ist die Aufnahme von Umlauten, was bei der
+Umdefinition des Monatsnamen "`march"' in "`M"arz"' n"otig ist.
+Versuche mit \verb!\"a! und -- in Verbindung mit {\tt german.sty} --
+\verb!"a! scheiterten.
+
+Die Anpassung von {\tt alpha} an deutschsprachige Verh"altnisse
+entspringt meinem pers"onlichen Be"-d"urfnis. Eine Anpassung der
+anderen Stile sollte einfach sein -- ich w"urde mich "uber eine
+gemeinsam erstellte, komplette deutschsprachige \BibTeX-Anpassung
+freuen.
+
+Im Rahmen der Anpassung wurde zugleich ein Bug entdeckt, der sich schon
+in \cite{lamp:latex}\ in der Literaturliste zeigt. Bei mehreren Autoren
+sollten die letzten beiden durch "`and"' bzw.\ "`und"' getrennt sein.
+{\tt alpha} f"ugt in der Version 0.99a nach dem vorletzten Namen aber
+zus"atzlich ein "uberfl"ussiges Komma ein. {\tt geralpha} behebt diesen
+Fehler durch eine Modifikation in der Funktion {\tt format.name}.
+
+\begin{thebibliography}{Lam86}
+\bibitem[DD80]{duden:satz}
+Dudenredaktion und Dudensetzerei, Hrsg.
+\newblock {\em Satz- und Korrekturanweisungen -- Richtlinien f"ur die
+ Texterfassung}.
+\newblock Duden Taschenb"ucher 5. Bibliographisches Institut, 4.~Auflage, 1980.
+
+\bibitem[Lam86]{lamp:latex}
+Leslie Lamport.
+\newblock {\em \LaTeX -- A Document Preparation System}.
+\newblock Addison Wesley, Reading, Massachusetts, 1986.
+
+\end{thebibliography}
+
+
diff --git a/obsolete/biblio/bibtex/contrib/harvard/agsm.bst b/obsolete/biblio/bibtex/contrib/harvard/agsm.bst
new file mode 100644
index 0000000000..8ec0494c7c
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/harvard/agsm.bst
@@ -0,0 +1,1226 @@
+% BibTeX standard bibliography style `agsm' (one of the harvard family)
+ % version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09.
+ % Copyright (C) 1991, 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, abbrv.bst, agsm.bst,
+ % dcu.bst or kluwer.bst.
+ % This restriction helps ensure that all standard styles are identical.
+ % The file harvard.tex has the documentation for this style.
+
+% ACKNOWLEDGEMENT:
+% This document is a modified version of alpha.bst to which it owes much of
+% its functionality.
+
+% AUTHOR
+% Peter Williams, Key Centre for Design Quality, Sydney University
+% e-mail: peterw@archsci.arch.su.oz.au
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ }
+ { field.used }
+ { extra.label sort.label list.year }
+
+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 f }
+
+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 {item.check}
+{ 't :=
+ empty$
+ { "empty " t * " in " * cite$ * warning$ }
+ { skip$ }
+ if$
+}
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+
+FUNCTION {quote}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "`" swap$ * "'" * }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ 'f :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr f format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { t "others" =
+ { " et~al." * }
+ { " \& " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { "{vv~}{ll}{, jj}{, f.}" author format.names }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { "{vv~}{ll}{, jj}{, f.}" editor format.names
+ editor num.names$ #1 >
+ { ", eds" * }
+ { ", ed." * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.editors.reverse}
+{ editor empty$
+ { "" }
+ { "{f.~}{vv~}{ll}{, jj}" editor format.names
+ editor num.names$ #1 >
+ { ", eds" * }
+ { ", ed." * }
+ 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.btitle}
+{ 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$
+ { "" }
+ { "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 =
+ { "number" }
+ { "Number" }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { " {\em in} " * series quote * }
+ 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 * }
+ { "p.~" pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume embolden field.or.null
+ 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$
+ { "chapter" }
+ { 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$
+ { "{\em in} " booktitle quote * }
+ { "{\em in} " format.editors.reverse * ", " * booktitle quote * }
+ 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$
+ { "Technical Report" }
+ '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 * "\/} \cite{" * crossref * "}" *}
+ if$
+ }
+ { "{\em in} \citeasnoun{" crossref * "}" * }
+ if$
+
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "in "
+ }
+ { "Vol." 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 * "\/} \cite{" * crossref * "}" *}
+ if$
+ }
+ { " \citeasnoun{" * crossref * "}" * }
+ if$
+ }
+ { " \citeasnoun{" * crossref * "}" * }
+ if$
+}
+
+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 * "\/}" * " \cite{" * crossref * "}" *}
+ if$
+ }
+ { "{\em in} \citeasnoun{" crossref * "}" * }
+ if$
+ }
+ { "{\em in} \citeasnoun{" crossref * "}" * }
+ if$
+
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+FUNCTION {format.lab.names.abbr}
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 >
+ { numnames #2 >
+ { s #1 "{vv~}{ll}" format.name$ " et al." * }
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { s #1 "{vv~}{ll}" format.name$ " et al." * }
+ { s #1 "{vv~}{ll}" format.name$ " \& " *
+ s #2 "{vv~}{ll}" format.name$ *
+ }
+ if$
+ }
+ if$
+ }
+ { s #1 "{vv~}{ll}" format.name$ }
+ if$
+}
+
+FUNCTION {format.lab.names.full}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}" format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { t "others" =
+ { " et~al." * }
+ { " \& " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+INTEGERS { author.field editor.field organization.field title.field key.field }
+
+FUNCTION {init.field.constants}
+{ #0 'author.field :=
+ #1 'editor.field :=
+ #2 'organization.field :=
+ #3 'title.field :=
+ #4 'key.field :=
+}
+
+FUNCTION {make.list.label}
+{ author.field field.used =
+ { format.authors }
+ { editor.field field.used =
+ { format.editors }
+ { organization.field field.used =
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ { title.field field.used =
+ { format.btitle }
+ { key.field field.used =
+ { key #3 text.prefix$ }
+ { "Internal error :001 on " cite$ * " label" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {make.full.label}
+{ author.field field.used =
+ { author format.lab.names.full }
+ { editor.field field.used =
+ { editor format.lab.names.full }
+ { organization.field field.used =
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ { title.field field.used =
+ { format.btitle }
+ { key.field field.used =
+ { key #3 text.prefix$ }
+ { "Internal error :001 on " cite$ * " label" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {make.abbr.label}
+{ author.field field.used =
+ { author format.lab.names.abbr }
+ { editor.field field.used =
+ { editor format.lab.names.abbr }
+ { organization.field field.used =
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ { title.field field.used =
+ { format.btitle }
+ { key.field field.used =
+ { key #3 text.prefix$ }
+ { "Internal error :001 on " cite$ * " label" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ "\harvarditem[" write$
+ make.abbr.label write$
+ "]{" write$
+ make.full.label write$
+ "}{" write$
+ list.year write$
+ "}{" write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {list.label.output}
+{ make.list.label " " * write$
+}
+
+FUNCTION {article}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title quote "title" output.check }
+ if$
+ crossref missing$
+ { journal emphasize "journal" duplicate$ item.check
+ pages empty$
+ {
+ output
+ }
+ {
+ " " *
+ format.vol.num.pages * output
+ }
+ if$
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ author empty$
+ { editor "author and editor" item.check }
+ { crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ crossref missing$
+ { format.bvolume output
+ format.number.series output
+ format.edition output
+ publisher "publisher" output.check
+ address output
+ }
+ { format.book.crossref output.nonnull
+ format.edition output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.title quote "title" output.check }
+ if$
+ howpublished output
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ author empty$
+ { editor "author and editor" item.check }
+ { crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ crossref missing$
+ { format.bvolume output
+ format.number.series output
+ format.edition output
+ publisher "publisher" output.check
+ address output
+ }
+ { format.book.crossref output.nonnull
+ format.edition output
+ }
+ if$
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ author "author" item.check
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.edition output
+ format.bvolume output
+ format.number.series output
+ publisher "publisher" output.check
+ address output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ }
+ if$
+ format.chapter.pages output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ author "author" item.check
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { organization output
+ publisher output
+ }
+ { organization output
+ publisher output
+ address output.nonnull
+ }
+ if$
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ }
+ if$
+ format.pages output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ format.edition output
+ author empty$
+ { organization empty$
+ { address output }
+ 'skip$
+ if$
+ }
+ { organization output
+ address output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.title quote output }
+ if$
+ howpublished output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { title "title" output.check }
+ if$
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { editor empty$
+ { skip$ }
+ { organization output
+ }
+ if$
+ publisher output
+ }
+ { editor empty$
+ 'skip$
+ { organization output }
+ if$
+ publisher output
+ address output.nonnull
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ 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"}
+
+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
+
+EXECUTE {init.field.constants}
+
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { title.field 'field.used := }
+ { key.field 'field.used := }
+ if$
+ }
+ { author.field 'field.used := }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { title.field 'field.used := }
+ { key.field 'field.used := }
+ if$
+ }
+ { editor.field 'field.used := }
+ if$
+ }
+ { author.field 'field.used := }
+ if$
+}
+
+FUNCTION {author.key.organization.label}
+{ author empty$
+ { key empty$
+ { organization empty$
+ { title.field 'field.used := }
+ { organization.field 'field.used := }
+ if$
+ }
+ { key.field 'field.used := }
+ if$
+ }
+ { author.field 'field.used := }
+ if$
+}
+
+FUNCTION {editor.key.organization.label}
+{ editor empty$
+ { key empty$
+ { organization empty$
+ { title.field 'field.used := }
+ { organization.field 'field.used := }
+ if$
+ }
+ { key.field 'field.used := }
+ if$
+ }
+ { editor.field 'field.used := }
+ if$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+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$
+ make.abbr.label
+ title.field field.used =
+ { sort.format.title }
+ { sortify }
+ if$
+ year field.or.null purify$ #-1 #4 substring$ sortify
+ *
+ 'sort.label :=
+}
+
+FUNCTION {first.presort}
+{ calc.label
+ sort.label
+ title.field field.used =
+ { skip$ }
+ { " "
+ *
+ make.list.label sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ }
+ if$
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {first.presort}
+
+SORT
+
+STRINGS { last.sort.label next.extra }
+
+INTEGERS { last.extra.num }
+
+FUNCTION {initialize.last.extra.num}
+{ #0 int.to.chr$ 'last.sort.label :=
+ "" 'next.extra :=
+ #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$
+ year empty$
+ { "n.d." extra.label emphasize * 'list.year := }
+ { year extra.label emphasize * 'list.year := }
+ if$
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.last.extra.num}
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+FUNCTION {second.presort}
+{ make.list.label
+ title.field field.used =
+ { sort.format.title }
+ { sortify }
+ if$
+ " "
+ *
+ list.year field.or.null sortify
+ *
+ " "
+ *
+ title.field field.used =
+ { skip$ }
+ { title field.or.null
+ sort.format.title
+ *
+ }
+ if$
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {second.presort}
+
+SORT
+
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{xx}" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/harvard/dcu.bst b/obsolete/biblio/bibtex/contrib/harvard/dcu.bst
new file mode 100644
index 0000000000..10f3ced486
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/harvard/dcu.bst
@@ -0,0 +1,1240 @@
+% BibTeX standard bibliography style `dcu' (one of the harvard family)
+ % version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09.
+ % Copyright (C) 1991, 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, abbrv.bst, agsm.bst,
+ % dcu.bst or kluwer.bst.
+ % This restriction helps ensure that all standard styles are identical.
+ % The file harvard.tex has the documentation for this style.
+
+% ACKNOWLEDGEMENT:
+% This document is a modified version of alpha.bst to which it owes much of
+% its functionality.
+
+% AUTHOR
+% Peter Williams, Key Centre for Design Quality, Sydney University
+% e-mail: peterw@archsci.arch.su.oz.au
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ }
+ { field.used }
+ { extra.label sort.label list.year }
+
+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 f }
+
+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 {item.check}
+{ 't :=
+ empty$
+ { "empty " t * " in " * cite$ * warning$ }
+ { skip$ }
+ if$
+}
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+
+FUNCTION {quote}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "`" swap$ * "'" * }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ 'f :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr f format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { "{vv~}{ll}{, jj}{, f.}" author format.names }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { "{vv~}{ll}{, jj}{, f.}" editor format.names
+ editor num.names$ #1 >
+ { " (eds)" * }
+ { " (ed.)" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.editors.reverse}
+{ editor empty$
+ { "" }
+ { "{f.~}{vv~}{ll}{, jj}" editor format.names
+ editor num.names$ #1 >
+ { " (eds)" * }
+ { " (ed.)" * }
+ 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.btitle}
+{ 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$
+ { "" }
+ { "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 =
+ { "number" }
+ { "Number" }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { " in " * series emphasize * }
+ 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 * }
+ { "p.~" pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume embolden field.or.null
+ 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$
+ { "chapter" }
+ { 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$
+ { booktitle emphasize }
+ { "{\em in} " format.editors.reverse * ", " * booktitle emphasize * }
+ 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$
+ { "Technical Report" }
+ '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 * "\/}" * " \cite{" * crossref * "}" *
+ }
+ if$
+ }
+ { " {\em in} \citeasnoun{" crossref * "}" * }
+ if$
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "in "
+ }
+ { "Vol." 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 * "\/}" * " \cite{" * crossref * "}" *}
+ if$
+ }
+ { " \citeasnoun{" * crossref * "}" * }
+ if$
+ }
+ { " \citeasnoun{" * crossref * "}" * }
+ if$
+}
+
+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 * "\/}" * " \cite{" * crossref * "}" *}
+ if$
+ }
+ { " {\em in} \citeasnoun{" crossref * "}" * }
+ if$
+ }
+ { " {\em in} \citeasnoun{" crossref * "}" * }
+ if$
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+FUNCTION {format.lab.names.abbr}
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 >
+ { numnames #2 >
+ { s #1 "{vv~}{ll}" format.name$ " et al." * }
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { s #1 "{vv~}{ll}" format.name$ " et al." * }
+ { s #1 "{vv~}{ll}" format.name$ " and " *
+ s #2 "{vv~}{ll}" format.name$ *
+ }
+ if$
+ }
+ if$
+ }
+ { s #1 "{vv~}{ll}" format.name$ }
+ if$
+}
+
+FUNCTION {format.lab.names.full}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}" format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+INTEGERS { author.field editor.field organization.field title.field key.field }
+
+FUNCTION {init.field.constants}
+{ #0 'author.field :=
+ #1 'editor.field :=
+ #2 'organization.field :=
+ #3 'title.field :=
+ #4 'key.field :=
+}
+
+FUNCTION {make.list.label}
+{ author.field field.used =
+ { format.authors }
+ { editor.field field.used =
+ { format.editors }
+ { organization.field field.used =
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ { title.field field.used =
+ { format.btitle }
+ { key.field field.used =
+ { key #3 text.prefix$ }
+ { "Internal error :001 on " cite$ * " label" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {make.full.label}
+{ author.field field.used =
+ { author format.lab.names.full }
+ { editor.field field.used =
+ { editor format.lab.names.full }
+ { organization.field field.used =
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ { title.field field.used =
+ { format.btitle }
+ { key.field field.used =
+ { key #3 text.prefix$ }
+ { "Internal error :001 on " cite$ * " label" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {make.abbr.label}
+{ author.field field.used =
+ { author format.lab.names.abbr }
+ { editor.field field.used =
+ { editor format.lab.names.abbr }
+ { organization.field field.used =
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ { title.field field.used =
+ { format.btitle }
+ { key.field field.used =
+ { key #3 text.prefix$ }
+ { "Internal error :001 on " cite$ * " label" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ "\harvarditem[" write$
+ make.abbr.label write$
+ "]{" write$
+ make.full.label write$
+ "}{" write$
+ list.year write$
+ "}{" write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {list.label.output}
+{ make.list.label " " * write$
+}
+
+FUNCTION {article}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ crossref missing$
+ { journal emphasize "journal" duplicate$ item.check
+ pages empty$
+ {
+ output
+ }
+ {
+ " " *
+ format.vol.num.pages * output
+ }
+ if$
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ author empty$
+ { editor "author and editor" item.check }
+ { crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ crossref missing$
+ { format.bvolume output
+ format.number.series output
+ format.edition output
+ publisher "publisher" output.check
+ address output
+ }
+ { format.book.crossref output.nonnull
+ format.edition output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ howpublished output
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ author empty$
+ { editor "author and editor" item.check }
+ { crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ crossref missing$
+ { format.bvolume output
+ format.number.series output
+ format.edition output
+ publisher "publisher" output.check
+ address output
+ }
+ { format.book.crossref output.nonnull
+ format.edition output
+ }
+ if$
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ author "author" item.check
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.edition output
+ format.bvolume output
+ format.number.series output
+ publisher "publisher" output.check
+ address output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ }
+ if$
+ format.chapter.pages output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ author "author" item.check
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { organization output
+ publisher output
+ }
+ { organization output
+ publisher output
+ address output.nonnull
+ }
+ if$
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ }
+ if$
+ format.pages output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ format.edition output
+ author empty$
+ { organization empty$
+ { address output
+ }
+ 'skip$
+ if$
+ }
+ { organization output
+ address output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title emphasize "title" output.check }
+ if$
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ title.field field.used =
+ { skip$ }
+ { format.title output }
+ if$
+ howpublished output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { editor empty$
+ { skip$ }
+ { organization output
+ }
+ if$
+ publisher output
+ }
+ { editor empty$
+ 'skip$
+ { organization output }
+ if$
+ publisher output
+ address output.nonnull
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ format.tr.number emphasize output.nonnull
+ institution "institution" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ list.label.output
+ " (" list.year * ")" * output.nonnull
+ new.block
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ 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"}
+
+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
+
+EXECUTE {init.field.constants}
+
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { title.field 'field.used := }
+ { key.field 'field.used := }
+ if$
+ }
+ { author.field 'field.used := }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { title.field 'field.used := }
+ { key.field 'field.used := }
+ if$
+ }
+ { editor.field 'field.used := }
+ if$
+ }
+ { author.field 'field.used := }
+ if$
+}
+
+FUNCTION {author.key.organization.label}
+{ author empty$
+ { key empty$
+ { organization empty$
+ { title.field 'field.used := }
+ { organization.field 'field.used := }
+ if$
+ }
+ { key.field 'field.used := }
+ if$
+ }
+ { author.field 'field.used := }
+ if$
+}
+
+FUNCTION {editor.key.organization.label}
+{ editor empty$
+ { key empty$
+ { organization empty$
+ { title.field 'field.used := }
+ { organization.field 'field.used := }
+ if$
+ }
+ { key.field 'field.used := }
+ if$
+ }
+ { editor.field 'field.used := }
+ if$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+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$
+ make.abbr.label
+ title.field field.used =
+ { sort.format.title }
+ { sortify }
+ if$
+ year field.or.null purify$ #-1 #4 substring$ sortify
+ *
+ 'sort.label :=
+}
+
+FUNCTION {first.presort}
+{ calc.label
+ sort.label
+ title.field field.used =
+ { skip$ }
+ { " "
+ *
+ make.list.label sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ }
+ if$
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {first.presort}
+
+SORT
+
+STRINGS { last.sort.label next.extra }
+
+INTEGERS { last.extra.num }
+
+FUNCTION {initialize.last.extra.num}
+{ #0 int.to.chr$ 'last.sort.label :=
+ "" 'next.extra :=
+ #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$
+ year empty$
+ { "n.d." extra.label * 'list.year := }
+ { year extra.label * 'list.year := }
+ if$
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.last.extra.num}
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+FUNCTION {second.presort}
+{ make.list.label
+ title.field field.used =
+ { sort.format.title }
+ { sortify }
+ if$
+ " "
+ *
+ list.year field.or.null sortify
+ *
+ " "
+ *
+ title.field field.used =
+ { skip$ }
+ { title field.or.null
+ sort.format.title
+ *
+ }
+ if$
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {second.presort}
+
+SORT
+
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{xx}" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/harvard/harvard.bib b/obsolete/biblio/bibtex/contrib/harvard/harvard.bib
new file mode 100644
index 0000000000..ea4d27e3e0
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/harvard/harvard.bib
@@ -0,0 +1,21 @@
+@BOOK{latex,
+ author = "Leslie Lamport",
+ title = "{\LaTeX \rm:} {A} Document Preparation System",
+ publisher = "Addison-Wesley",
+ year = 1986 }
+
+@UNPUBLISHED{btxdoc,
+ author = "Oren Patashnik",
+ title = "{{\BibTeX ing}}",
+ note = "Documentation for general {\BibTeX} users",
+ month = jan,
+ year = 1988 }
+
+@BOOK{agsm,
+ title = "Style Manual for authors editors and printers of {A}ustralian
+government publications",
+ author = "John Pitson",
+ publisher = "Australian Government Publishing Service",
+ address = "Canberra",
+ edition = "3rd",
+ year = 1978 }
diff --git a/obsolete/biblio/bibtex/contrib/harvard/harvard.description b/obsolete/biblio/bibtex/contrib/harvard/harvard.description
new file mode 100644
index 0000000000..66c6569b4a
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/harvard/harvard.description
@@ -0,0 +1,44 @@
+ HARVARD
+ -------
+The HARVARD package includes the 6 files of Peter Williams'
+<peterw@archsci.arch.su.OZ.AU> Harvard family of bibliographic styles.
+There are two primary forms of citation in the Harvard style, dependent
+upon whether the reference is used as a noun or parenthetically. To
+facilitate using a citation as a noun a new command \citeasnoun has been
+created which has the same syntax as the \cite command except that multiple
+citations are not permitted. Additionally, where there are more than two
+authors, all authors are listed in the first citation and in subsequent
+citations just the first author's name followed by `et al.' is used. Where
+appropriate, citations are abbreviated automatically after the first
+reference when bibliographies are produced by BibTeX. Provision is also
+made for this feature to be accessed during manual coding.
+
+There are three bibliography styles currently available within the Harvard
+family, AGSM (which is based on "Style Manual for authors editors and
+printers of Australian government publications"), DCU (which is based upon
+the conventions in use in the Design Computing Unit, Department of
+Architectural and Design Science, University of Sydney), and KLUWER (which
+aspires to conform to the requirements of Kluwer Academic Publishers).
+They are invoked by the \bibliographystyle within LaTeX and effect the
+layout of the entries in the bibliography.
+
+You may retrive the entire package of six files by including the command:
+ SENDME HARVARD
+in the body of a mail message to FILESERV@SHSU.BITNET (FILESERV@SHSU.edu).
+If, for some reason, you should only need one file, say, HARVARD.DCU_STY,
+include the command:
+ SENDME HARVARD.DCU_STY
+in your request to FILESERV. These files are available for anonymous ftp
+retrieval from Niord.SHSU.edu (192.92.115.8) in the directory [.HARVARD].
+
+Files in this package: (1 Block = 512 bytes)
+File Blocks Save file as:
+-------------------------------------------------------------------------------
+HARVARD.AGSM_BST 46 AGSM.BST
+HARVARD.DCU_BST 46 DCU.BST
+HARVARD.HARVARD_BIB 2 HARVARD.BIB
+HARVARD.HARVARD_STY 6 HARVARD.STY
+HARVARD.HARVARD_TEX 13 HARVARD.TEX
+HARVARD.KLUWER_BST 46 KLUWER.BST
+
+Approximate total blocks in full HARVARD package = 159
diff --git a/obsolete/biblio/bibtex/contrib/harvard/harvard.sty b/obsolete/biblio/bibtex/contrib/harvard/harvard.sty
new file mode 100644
index 0000000000..3fa08b3710
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/harvard/harvard.sty
@@ -0,0 +1,79 @@
+%% This is a file from Peter Williams' <peterw@archsci.arch.su.OZ.AU>
+%% Harvard family of bibliographic styles
+\message{harvard bibliography,}
+
+\def\@hiteml[#1]#2#3#4{\item[]\if@filesw%
+ { \def\protect##1{\string ##1\space}\immediate%
+\write\@auxout{\string\harvardcite{#4}{#2}{#1}{#3}}}\fi%
+\protect\hspace*{-\labelwidth}\protect\hspace*{-\labelsep}\ignorespaces}
+
+\def\@hitem#1#2#3{\item[]\if@filesw%
+ { \def\protect##1{\string ##1\space}\immediate%
+\write\@auxout{\string\harvardcite{#3}{#1}{#1}{#2}}}\fi%
+\protect\hspace*{-\labelwidth}\protect\hspace*{-\labelsep}\ignorespaces}
+
+\def\harvarditem{\@ifnextchar [{\@hiteml}{\@hitem}}
+
+\def\harvardcite#1#2#3#4{
+ \global\@namedef{bhf@#1}{#2}
+ \global\@namedef{bha@#1}{#3}
+ \global\@namedef{bhy@#1}{#4}\global\@namedef{b@#1}{\csname bhf@#1\endcsname}
+}
+
+\def\cite{\@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
+\def\citeasnoun{\@ifnextchar [{\@tempswatrue\@citexasnoun}
+ {\@tempswafalse\@citexasnoun[]}
+}
+
+\def\@enamedef#1{\expandafter\edef\csname #1\endcsname}
+
+\def\@citex[#1]#2{\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi
+ \def\@citea{}\@cite{\@for\@citeb:=#2\do
+ {\@citea\def\@citea{\@hisep\penalty\@m\ }\@ifundefined
+ {b@\@citeb}{{\bf ?}\@warning
+ {Citation `\@citeb' on page \thepage \space undefined}}%
+{{\csname b@\@citeb\endcsname\@hysep\csname bhy@\@citeb\endcsname}%
+\global\@enamedef{b@\@citeb}{\csname bha@\@citeb\endcsname}}%
+}}{#1}}
+
+\def\@citexasnoun[#1]#2{%
+\if@filesw\immediate\write\@auxout{\string\citation{#2}}\fi%
+\@citeasnoun{{\@ifundefined%
+{b@#2}%
+{{\bf ?}\@warning{Citation `#2' on page \thepage \space undefined}}%
+{{\csname b@#2\endcsname\ (\csname bhy@#2\endcsname}%
+\global\@namedef{b@#2}{\csname bha@#2\endcsname}}%
+}}{#1}}
+
+\gdef\hysep@agsm{\ }\gdef\hisep@agsm{,}%
+\gdef\hysep@dcu{, }\gdef\hisep@dcu{;}%
+\let\@hysep\hysep@agsm \let\@hisep\hisep@agsm
+\def\citationstyle#1{%
+\global\@namedef{@hysep}{\csname hysep@#1\endcsname}%
+\global\@namedef{@hisep}{\csname hisep@#1\endcsname}}
+
+%DEFAULT DEFINITIONS
+\def\@cite#1#2{({#1\if@tempswa , #2\fi})}
+\def\@citeasnoun#1#2{{#1\if@tempswa , #2\fi)}}
+
+% CHANGE \end{document} - to handle double definitions
+\def\enddocument{\@checkend{document}\clearpage\begingroup
+\if@filesw \immediate\closeout\@mainaux
+\def\global\@namedef##1##2{}\def\newlabel{\@testdef r}%
+\def\bibcite{\@testdef b}%
+\def\harvardcite{\@testbibh}\@tempswafalse \makeatletter\input \jobname.aux
+\if@tempswa \@warning{Label(s) may have changed. Rerun to get
+cross-references right}\fi\fi\endgroup\deadcycles\z@\@@end}
+
+\def\@testbibh #1#2#3{
+ \def\@tempa{#2}\expandafter
+ \ifx \csname bhf@#1\endcsname \@tempa
+ \def\@tempa{#3}\expandafter
+ \ifx \csname bha@#1\endcsname \@tempa
+ \else \@tempswatrue
+ \fi
+ \else
+ \@tempswatrue
+ \fi
+}
+
diff --git a/obsolete/biblio/bibtex/contrib/harvard/harvard.tex b/obsolete/biblio/bibtex/contrib/harvard/harvard.tex
new file mode 100644
index 0000000000..d7303a3393
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/harvard/harvard.tex
@@ -0,0 +1,136 @@
+%% This is a file from Peter Williams' <peterw@archsci.arch.su.OZ.AU>
+%% Harvard family of bibliographic styles
+\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em
+ T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}
+
+\documentstyle[A4,harvard]{article}
+\title{The {\em Harvard} Family of Bibliography Styles}
+\author{Peter Williams}
+\begin{document}
+\bibliographystyle{agsm}
+%\citationstyle{agsm}
+\maketitle
+\section{Introduction}
+This document describes the {\em harvard} family of bibliographic styles
+which are provided in addition to those described in \citeasnoun{latex} and
+\citeasnoun{btxdoc}. This style is primarily intended for use with the
+\BibTeX\ bibliographic database management system. However, provision is
+also made for hand coding of bibliographies.
+\section{Citations}
+There are two primary forms of citation in the {\em harvard} style
+dependent upon whether the reference is used as a noun or parenthetically.
+Additionally, where there are more than two authors, all authors are listed
+in the first citation and in subsequent citations just the first author's
+name followed by `et al.' is used. The following example from
+\citeasnoun{agsm}\ illustrates these points.
+\begin{quote}
+The major improvement concerns the structure of the interview
+(Ulrich~\& Trumbo~1965, p.~112) \ldots .
+Later reports (Carlson, Thayer, Mayfield~\& Peterson 1971) record greatly
+increased interviewer reliability for structured interviews. Wright (1969,
+p.~408) comments that `undoubtedly interviewer skill is directly related to
+the validity, quantity and quality of the interview output', and this would
+suggest some sort of interviewer training is called for. Rowe (1960), for
+example, found that trained interviewers are better able to evaluate
+applicants with some measure of reliability. In addition Wexley, Sanders~\&
+Yukl (1973) showed that by extensive interviewer training all significant
+contrast effects could be eliminated. The results of the 1971 study
+(Carlson et al. 1971) are still relevant, but efforts to~\ldots.
+\end{quote}
+
+To facilitate using a citation as a noun a new command {\bf
+$\backslash$citeasnoun} has been created which has the same syntax as the
+{\bf $\backslash$cite} command except that multiple citations are {\em not}
+permitted. The effect of this command is that
+\begin{verbatim}
+As \citeasnoun{btxdoc} and \citeasnoun[Annex~B]{latex} describe \ldots
+\end{verbatim}
+produces
+\begin{quote}
+As \citeasnoun{btxdoc} and \citeasnoun[Annex~B]{latex} describe \ldots
+\end{quote}
+whereas
+\begin{verbatim}
+The \BibTeX\ \cite{btxdoc} and \LaTeX\ \cite[Annex~B]{latex} manuals \ldots
+\end{verbatim}
+produces
+\begin{quote}
+The \BibTeX\ \cite{btxdoc} and \LaTeX\ \cite[Annex~B]{latex} manuals \ldots
+\end{quote}
+
+Where appropriate, citations are abbreviated automatically after the first
+reference when bibliographies are produced by \BibTeX. Provision is also
+made for this feature to be accessed during manual coding.
+
+\section{Styles}
+\subsection{Bibliography Styles}
+There are three bibliography styles currently available within the {\em
+harvard} family, {\bf agsm} (used in this document) which is based on
+\citeasnoun[pp.~95--98]{agsm}, {\bf dcu} which is based upon the
+conventions in use in the Design Computing Unit, Department of
+Architectural and Design Science, University of Sydney and {\bf kluwer}
+which aspires to conform to the requirements of Kluwer Academic Publishers.
+They are invoked by the {\bf $\backslash$bibliographystyle} as described in
+\citeasnoun[p.~74]{latex} and effect the layout of the entries in the
+bibliography.
+
+\subsection{Citation Styles}
+There are two citation styles currently available within the {\em harvard}
+family, {\bf agsm} (used in this document) and {\bf dcu} which for the
+previous example would produce:
+\begin{quote}\citationstyle{dcu}
+The \BibTeX\ \cite{btxdoc} and \LaTeX\ \cite[Annex~B]{latex} manuals \ldots
+\end{quote}
+and for multiple citations such as
+\begin{verbatim}
+ The original documentation \cite{btxdoc,latex} say \ldots
+\end{verbatim}
+the {\bf agsm} citation style produces
+\begin{quote}\citationstyle{agsm}
+The original documentation \cite{btxdoc,latex} say \ldots
+\end{quote}
+and the {\bf dcu} citation style produces
+\begin{quote}\citationstyle{dcu}
+The original documentation \cite{btxdoc,latex} say \ldots
+\end{quote}
+The default citation style is {\bf agsm} and both styles have no effect on
+the appearance of the {\bf $\backslash$citeasnoun} citation format.
+
+These styles are invoked by the {\bf $\backslash$citationstyle} command,
+for example:
+\begin{verbatim}
+ \citationstyle{agsm}.
+\end{verbatim}
+Because these styles affect the format of parenthetical citations, this
+command should appear before any {\bf $\backslash$cite} commands.
+
+\section{Doing It By Hand}
+Hand coding is accomplished much the same as described in
+\citeasnoun[p.~73]{latex} except that the new command {\bf
+$\backslash$harvarditem} is used in place of {\bf $\backslash$bibitem}.
+The syntax of this command is
+\begin{quote}
+{\bf $\backslash$harvarditem} [{\em abbr-citation}]\{{\em
+full-citation}\}\{{\em citation-year}\}\{{\em cite-key}\}
+\end{quote}
+where
+\begin{description}
+\item[{\em abbr-citation}] is the (optional) abbreviated citation
+(minus the year) to be used in the text
+subsequent to the first mention of a particular reference,
+\item[{\em full-citation}] is the full citation (minus the year)
+to be used in the text
+on the first mention of a particular reference,
+\item[{\em citation-year}] the year portion of the citation including any
+suffices required to disambiguate citations, and
+\item[{\em cite-key}] is the key used in the {\bf $\backslash$cite} and
+{\bf $\backslash$citeasnoun} commands.
+\end{description}
+
+\section{Acknowledgement}
+The motivation for this style came from Fay Sudweeks of the Design Computing
+Unit who also originated the formats for the {\bf dcu} style and proofread
+their implementation.
+
+\bibliography{harvard}
+\end{document}
diff --git a/obsolete/biblio/bibtex/contrib/harvard/kluwer.bst b/obsolete/biblio/bibtex/contrib/harvard/kluwer.bst
new file mode 100644
index 0000000000..bdb303082d
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/harvard/kluwer.bst
@@ -0,0 +1,1227 @@
+% BibTeX standard bibliography style `kluwer' (one of the harvard family)
+ % version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09.
+ % Copyright (C) 1991, 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, abbrv.bst, agsm.bst,
+ % dcu.bst or kluwer.bst.
+ % This restriction helps ensure that all standard styles are identical.
+ % The file harvard.tex has the documentation for this style.
+
+% ACKNOWLEDGEMENT:
+% This document is a modified version of alpha.bst to which it owes much of
+% its functionality.
+
+% AUTHOR
+% Peter Williams, Key Centre for Design Quality, Sydney University
+% e-mail: peterw@archsci.arch.su.oz.au
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ }
+ { field.used }
+ { extra.label sort.label list.year }
+
+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 f }
+
+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 {item.check}
+{ 't :=
+ empty$
+ { "empty " t * " in " * cite$ * warning$ }
+ { skip$ }
+ if$
+}
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+
+FUNCTION {quote}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "`" swap$ * "'" * }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ 'f :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr f format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { "{vv~}{ll}{, jj}{, f.}" author format.names }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { "{vv~}{ll}{, jj}{, f.}" editor format.names
+ editor num.names$ #1 >
+ { " (eds)" * }
+ { " (ed.)" * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.editors.reverse}
+{ editor empty$
+ { "" }
+ { "{f.~}{vv~}{ll}{, jj}" editor format.names
+ editor num.names$ #1 >
+ { " (eds)" * }
+ { " (ed.)" * }
+ 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.btitle}
+{ 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$
+ { "" }
+ { "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 =
+ { "number" }
+ { "Number" }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { " in " * series emphasize * }
+ 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 * }
+ { "p.~" pages * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume embolden field.or.null
+ 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$
+ { "chapter" }
+ { 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$
+ { booktitle emphasize }
+ { "{\em in} " format.editors.reverse * ", " * booktitle emphasize * }
+ 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$
+ { "Technical Report" }
+ '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 * "\/}" * " \cite{" * crossref * "}" *
+ }
+ if$
+ }
+ { " {\em in} \citeasnoun{" crossref * "}" * }
+ if$
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "in "
+ }
+ { "Vol." 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 * "\/}" * " \cite{" * crossref * "}" *}
+ if$
+ }
+ { " \citeasnoun{" * crossref * "}" * }
+ if$
+ }
+ { " \citeasnoun{" * crossref * "}" * }
+ if$
+}
+
+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 * "\/}" * " \cite{" * crossref * "}" *}
+ if$
+ }
+ { " {\em in} \citeasnoun{" crossref * "}" * }
+ if$
+ }
+ { " {\em in} \citeasnoun{" crossref * "}" * }
+ if$
+}
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+FUNCTION {format.lab.names.abbr}
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 >
+ { numnames #2 >
+ { s #1 "{vv~}{ll}" format.name$ " et al." * }
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { s #1 "{vv~}{ll}" format.name$ " et al." * }
+ { s #1 "{vv~}{ll}" format.name$ " and " *
+ s #2 "{vv~}{ll}" format.name$ *
+ }
+ if$
+ }
+ if$
+ }
+ { s #1 "{vv~}{ll}" format.name$ }
+ if$
+}
+
+FUNCTION {format.lab.names.full}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}" format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+INTEGERS { author.field editor.field organization.field title.field key.field }
+
+FUNCTION {init.field.constants}
+{ #0 'author.field :=
+ #1 'editor.field :=
+ #2 'organization.field :=
+ #3 'title.field :=
+ #4 'key.field :=
+}
+
+FUNCTION {make.list.label}
+{ author.field field.used =
+ { format.authors }
+ { editor.field field.used =
+ { format.editors }
+ { organization.field field.used =
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ { title.field field.used =
+ { format.btitle }
+ { key.field field.used =
+ { key #3 text.prefix$ }
+ { "Internal error :001 on " cite$ * " label" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {make.full.label}
+{ author.field field.used =
+ { author format.lab.names.full }
+ { editor.field field.used =
+ { editor format.lab.names.full }
+ { organization.field field.used =
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ { title.field field.used =
+ { format.btitle }
+ { key.field field.used =
+ { key #3 text.prefix$ }
+ { "Internal error :001 on " cite$ * " label" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {make.abbr.label}
+{ author.field field.used =
+ { author format.lab.names.abbr }
+ { editor.field field.used =
+ { editor format.lab.names.abbr }
+ { organization.field field.used =
+ { "The " #4 organization chop.word #3 text.prefix$ }
+ { title.field field.used =
+ { format.btitle }
+ { key.field field.used =
+ { key #3 text.prefix$ }
+ { "Internal error :001 on " cite$ * " label" * warning$ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ "\harvarditem[" write$
+ make.abbr.label write$
+ "]{" write$
+ make.full.label write$
+ "}{" write$
+ list.year write$
+ "}{" write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {list.label.output}
+{ make.list.label write$
+}
+
+FUNCTION {article}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ crossref missing$
+ { journal emphasize "journal" duplicate$ item.check
+ pages empty$
+ {
+ output
+ }
+ {
+ " " *
+ format.vol.num.pages * output
+ }
+ if$
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ author empty$
+ { editor "author and editor" item.check }
+ { crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ crossref missing$
+ { format.bvolume output
+ format.number.series output
+ format.edition output
+ publisher "publisher" output.check
+ address output
+ }
+ { format.book.crossref output.nonnull
+ format.edition output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ howpublished output
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inbook}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ author empty$
+ { editor "author and editor" item.check }
+ { crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ crossref missing$
+ { format.bvolume output
+ format.number.series output
+ format.edition output
+ publisher "publisher" output.check
+ address output
+ }
+ { format.book.crossref output.nonnull
+ format.edition output
+ }
+ if$
+ format.chapter.pages "chapter and pages" output.check
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ author "author" item.check
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.edition output
+ format.bvolume output
+ format.number.series output
+ publisher "publisher" output.check
+ address output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ }
+ if$
+ format.chapter.pages output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ author "author" item.check
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { organization output
+ publisher output
+ }
+ { organization output
+ publisher output
+ address output.nonnull
+ }
+ if$
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ }
+ if$
+ format.pages output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ format.edition output
+ author empty$
+ { organization empty$
+ { address output
+ }
+ 'skip$
+ if$
+ }
+ { organization output
+ address output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title emphasize "title" output.check }
+ if$
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.title output }
+ if$
+ howpublished output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ title.field field.used =
+ { skip$ }
+ { format.btitle "title" output.check }
+ if$
+ format.bvolume output
+ format.number.series output
+ address empty$
+ { editor empty$
+ { skip$ }
+ { organization output
+ }
+ if$
+ publisher output
+ }
+ { editor empty$
+ 'skip$
+ { organization output }
+ if$
+ publisher output
+ address output.nonnull
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ format.tr.number emphasize output.nonnull
+ institution "institution" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ list.label.output
+ ": " list.year * output.nonnull
+ author "author" item.check
+ title.field field.used =
+ { skip$ }
+ { format.title "title" output.check }
+ if$
+ 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"}
+
+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
+
+EXECUTE {init.field.constants}
+
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { title.field 'field.used := }
+ { key.field 'field.used := }
+ if$
+ }
+ { author.field 'field.used := }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { title.field 'field.used := }
+ { key.field 'field.used := }
+ if$
+ }
+ { editor.field 'field.used := }
+ if$
+ }
+ { author.field 'field.used := }
+ if$
+}
+
+FUNCTION {author.key.organization.label}
+{ author empty$
+ { key empty$
+ { organization empty$
+ { title.field 'field.used := }
+ { organization.field 'field.used := }
+ if$
+ }
+ { key.field 'field.used := }
+ if$
+ }
+ { author.field 'field.used := }
+ if$
+}
+
+FUNCTION {editor.key.organization.label}
+{ editor empty$
+ { key empty$
+ { organization empty$
+ { title.field 'field.used := }
+ { organization.field 'field.used := }
+ if$
+ }
+ { key.field 'field.used := }
+ if$
+ }
+ { editor.field 'field.used := }
+ if$
+}
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+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$
+ make.abbr.label
+ title.field field.used =
+ { sort.format.title }
+ { sortify }
+ if$
+ year field.or.null purify$ #-1 #4 substring$ sortify
+ *
+ 'sort.label :=
+}
+
+FUNCTION {first.presort}
+{ calc.label
+ sort.label
+ title.field field.used =
+ { skip$ }
+ { " "
+ *
+ make.list.label sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ }
+ if$
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {first.presort}
+
+SORT
+
+STRINGS { last.sort.label next.extra }
+
+INTEGERS { last.extra.num }
+
+FUNCTION {initialize.last.extra.num}
+{ #0 int.to.chr$ 'last.sort.label :=
+ "" 'next.extra :=
+ #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$
+ year empty$
+ { "n.d." extra.label * 'list.year := }
+ { year extra.label * 'list.year := }
+ if$
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.last.extra.num}
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+FUNCTION {second.presort}
+{ make.list.label
+ title.field field.used =
+ { sort.format.title }
+ { sortify }
+ if$
+ " "
+ *
+ list.year field.or.null sortify
+ *
+ " "
+ *
+ title.field field.used =
+ { skip$ }
+ { title field.or.null
+ sort.format.title
+ *
+ }
+ if$
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {second.presort}
+
+SORT
+
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{xx}" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/makefile/makefile b/obsolete/biblio/bibtex/contrib/makefile/makefile
new file mode 100644
index 0000000000..2c2a7fae0c
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/makefile/makefile
@@ -0,0 +1,630 @@
+# /usr/local/lib/tex/bibtex/Makefile, Mon Jul 6 12:22:08 1992
+# Edit by Nelson H. F. Beebe <beebe@plot79.math.utah.edu>
+#=======================================================================
+# UNIX Makefile for BibTeX 0.99 styles.
+#
+# Major targets:
+#
+# all prepare .dvi files for every style in the collection
+# using test.bib and xampl.bib to illustrate the
+# formatting of various BibTeX entries.
+#
+# ARCHIVE-FILES prepare .tar.z, .zip, and .zoo archive files
+#
+# DVIFILES-TEST prepare test-*.dvi files
+#
+# DVIFILES-XAMPL prepare xampl-*.dvi files
+#
+# PHYSICS-STYLES make ph*.bst files
+#
+# clean remove all files that can be regenerated by "make all",
+# except for the test-*.ltx and xampl-*.ltx test files.
+#
+# clobber remove all files that can be regenerated by "make all"
+#
+# There are many other targets for individual files; see the Makefile
+# body below.
+#
+# [06-Jul-1992]
+#=======================================================================
+
+BIBTEX = bibtex
+
+CHECKSUM = cat >/tmp/bst.2 ; \
+ $(HEADER) >/tmp/bst.1 ; \
+ cat /tmp/bst.1 /tmp/bst.2 | checksum
+
+CLEANUP = /bin/rm /tmp/bst.1 /tmp/bst.2
+
+CPP = /lib/cpp -P
+
+COMPRESS = compress
+
+# DIST-FILES intentionally excludes the btxhak.*, btxdoc.*, and
+# bibtex.* files to keep the size of the distribution archive files
+# down. It is intended that these archive files contain just that
+# material need to use and test the various styles files.
+
+DELETE-BLANK-LINES = grep -v '^[ ]*$$'
+
+# sed command to delete lines beginning with one percent sign
+DELETE-ONE-PERCENT = /bin/sed -e '/^%$$/d' -e '/^%[^%].*$$/d'
+
+DIST-FILES = Makefile index *.bib *.bst *.btx *.doc *.ltx *.sty *.readme
+
+HEADER = (echo "%% =====================================================================" ;\
+ echo "%% WARNING: Do NOT edit this file. It was produced automatically by" ;\
+ echo "%% $(PERSONALNAME) <$(USER)@`hostname`>" ;\
+ echo "%% from `pwd`/xbtxbst.doc " ;\
+ echo "%% on `date`" ;\
+ echo "%% =====================================================================")
+
+LATEX = latex
+
+MV = /bin/mv
+
+PERSONALNAME = "`ypcat passwd | grep '^'$(USER)':' | awk -F: '{print $$5}'`"
+
+RM = /bin/rm -f
+
+SED = /bin/sed
+
+SHELL = /bin/sh
+
+STYLE = plain
+
+STYLES = aaai-named abbrv abstract acm agsm alpha amsalpha \
+ amsplain annotate annotation apa apalike apalike2 \
+ astron authordate1 authordate2 authordate3 authordate4 \
+ bbs cbe cell dcu humanbio humannat ieeetr is-abbrv \
+ is-alpha is-plain is-unsrt jbact jmb jtb kluwer named \
+ namunsrt nar nature newapa phaip phapalik phcpc phiaea \
+ phjcp phnf phnflet phpf phppcf phreport phrmp plain \
+ plainyr siam unsrt
+
+TAR = tar
+
+UNZIP = unzip
+
+ZIP = zip
+
+ZOO = zoo
+
+#=======================================================================
+
+.SUFFIXES:
+
+.SUFFIXES: .dvi .ltx
+
+.ltx.dvi:
+ $(LATEX) $<
+ $(BIBTEX) $*
+ $(LATEX) $<
+ $(LATEX) $<
+
+#=======================================================================
+
+all: AUTHORDATE DVIFILES-TEST DVIFILES-XAMPL
+
+ARCHIVE-FILES: bstfiles.tar.z bstfiles.tar-lst bstfiles.zip-lst bstfiles.zoo-lst
+ $(RM) bstfiles.tar
+
+AUTHORDATE: authordate1.dvi authordate2.dvi authordate3.dvi authordate4.dvi
+
+authordate1.dvi: authordate1.ltx test.bib testadb.ltx
+
+authordate2.dvi: authordate2.ltx test.bib testadb.ltx
+
+authordate3.dvi: authordate3.ltx test.bib testadb.ltx
+
+authordate4.dvi: authordate4.ltx test.bib testadb.ltx
+
+bstfiles.tar: $(DIST-FILES)
+ $(RM) $@
+ $(TAR) cf $@ $(DIST-FILES)
+
+bstfiles.tar-lst: bstfiles.tar
+ $(TAR) tvf bstfiles.tar >$@
+
+bstfiles.tar.z: bstfiles.tar
+ $(COMPRESS) <bstfiles.tar >bstfiles.tar.z
+
+bstfiles.zip: $(DIST-FILES)
+ $(RM) $@
+ $(ZIP) $@ $(DIST-FILES)
+
+bstfiles.zip-lst: bstfiles.zip
+ $(UNZIP) -v bstfiles.zip >$@
+
+bstfiles.zoo: $(DIST-FILES)
+ $(RM) $@
+ $(ZOO) a $@ $(DIST-FILES)
+
+bstfiles.zoo-lst: bstfiles.zoo
+ $(ZOO) v bstfiles.zoo >$@
+
+clean:
+ -$(RM) *.aux
+ -$(RM) *.blg
+ -$(RM) *.dvi
+ -$(RM) *.log
+ -$(RM) *~
+ -$(RM) \#*
+ -$(RM) a.out
+ -$(RM) core
+ -$(RM) authordate*.bbl
+ -$(RM) test-*.bbl
+ -$(RM) xampl-*.bbl
+ -$(RM) bstfiles.tar* bstfiles.zip* bstfiles.zoo*
+
+clobber: clean
+ -$(RM) test-*.ltx
+ -$(RM) xampl-*.ltx
+
+DVIFILES-TEST:
+ for f in $(STYLES) ; \
+ do \
+ make STYLE=$$f test-$$f.dvi ;\
+ done
+
+DVIFILES-XAMPL:
+ for f in $(STYLES) ; \
+ do \
+ make STYLE=$$f xampl-$$f.dvi ;\
+ done
+
+is-abbrv.bst: xbtxbst.doc
+ $(CPP) -DABBRV xbtxbst.doc | \
+ $(DELETE-ONE-PERCENT) -e 's/"xbtxbst.doc"/"is-abbrv.bst"/' | \
+ $(CHECKSUM) >is-abbrv.bst
+ $(CLEANUP)
+
+is-alpha.bst: xbtxbst.doc
+ $(CPP) -DALPHA xbtxbst.doc | \
+ $(DELETE-ONE-PERCENT) -e 's/"xbtxbst.doc"/"is-alpha.bst"/' | \
+ $(CHECKSUM) >is-alpha.bst
+ $(CLEANUP)
+
+is-plain.bst: xbtxbst.doc
+ $(CPP) -DPLAIN xbtxbst.doc | \
+ $(DELETE-ONE-PERCENT) -e 's/"xbtxbst.doc"/"is-plain.bst"/' | \
+ $(CHECKSUM) >is-plain.bst
+ $(CLEANUP)
+
+is-unsrt.bst: xbtxbst.doc
+ $(CPP) -DUNSRT xbtxbst.doc | \
+ $(DELETE-ONE-PERCENT) -e 's/"xbtxbst.doc"/"is-unsrt.bst"/' | \
+ $(CHECKSUM) >is-unsrt.bst
+ $(CLEANUP)
+
+phaip.bst: phyjfull.btx physics.btx
+ $(CPP) -DAIP <physics.btx | $(DELETE-BLANK-LINES) >phaip.bst
+
+phapalik.bst: phyjfull.btx physics.btx
+ $(CPP) -DAPALIKE <physics.btx | $(DELETE-BLANK-LINES) >phapalik.bst
+
+phcpc.bst: phyjfull.btx physics.btx
+ $(CPP) -DCPC <physics.btx | $(DELETE-BLANK-LINES) >phcpc.bst
+
+phiaea.bst: phyjfull.btx physics.btx
+ $(CPP) -DIAEA <physics.btx | $(DELETE-BLANK-LINES) >phiaea.bst
+
+phjcp.bst: phyjfull.btx physics.btx
+ $(CPP) -DJCP <physics.btx | $(DELETE-BLANK-LINES) >phjcp.bst
+
+phnf.bst: phyjfull.btx physics.btx
+ $(CPP) -DNF <physics.btx | $(DELETE-BLANK-LINES) >phnf.bst
+
+phnflet.bst: phyjfull.btx physics.btx
+ $(CPP) -DNFLET <physics.btx | $(DELETE-BLANK-LINES) >phnflet.bst
+
+phpf.bst: phyjfull.btx physics.btx
+ $(CPP) -DPF <physics.btx | $(DELETE-BLANK-LINES) >phpf.bst
+
+phppcf.bst: phyjfull.btx physics.btx
+ $(CPP) -DPPCF <physics.btx | $(DELETE-BLANK-LINES) >phppcf.bst
+
+phreport.bst: phyjfull.btx physics.btx
+ $(CPP) -DREPORT <physics.btx | $(DELETE-BLANK-LINES) >phreport.bst
+
+phrmp.bst: phyjfull.btx physics.btx
+ $(CPP) -DRMP <physics.btx | $(DELETE-BLANK-LINES) >phrmp.bst
+
+PHYSICS-STYLES: phaip.bst phapalik.bst phcpc.bst phiaea.bst phjcp.bst \
+ phnf.bst phnflet.bst phpf.bst phppcf.bst phreport.bst \
+ phrmp.bst
+
+test-$(STYLE).ltx: test.ltx $(STYLE).bst
+ $(SED) -e 's/{plain}/{'$(STYLE)'}/g' <test.ltx >test-$(STYLE).ltx
+
+# Special rules for styles that require an additional LaTeX style option:
+
+test-aaai-named.dvi: aaai-named.bst test.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'aaai-named'}/g' \
+ <test.ltx >/tmp/test-aaai-named.ltx
+ $(MV) /tmp/test-aaai-named.ltx .
+ $(LATEX) test-aaai-named.ltx
+ $(BIBTEX) test-aaai-named
+ $(LATEX) test-aaai-named.ltx
+ $(LATEX) test-aaai-named.ltx
+
+test-agsm.dvi: agsm.bst test.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[harvard]/g' \
+ -e 's/{plain}/{'agsm'}/g' \
+ <test.ltx >/tmp/test-agsm.ltx
+ $(MV) /tmp/test-agsm.ltx .
+ $(LATEX) test-agsm.ltx
+ $(BIBTEX) test-agsm
+ $(LATEX) test-agsm.ltx
+ $(LATEX) test-agsm.ltx
+
+test-apa.dvi: apa.bst test.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'apa'}/g' \
+ <test.ltx >/tmp/test-apa.ltx
+ $(MV) /tmp/test-apa.ltx .
+ $(LATEX) test-apa.ltx
+ $(BIBTEX) test-apa
+ $(LATEX) test-apa.ltx
+ $(LATEX) test-apa.ltx
+
+test-astron.dvi: astron.bst test.ltx astron/astron.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'astron'}/g' \
+ <test.ltx >/tmp/test-astron.ltx
+ $(MV) /tmp/test-astron.ltx .
+ $(LATEX) test-astron.ltx
+ $(BIBTEX) test-astron
+ $(LATEX) test-astron.ltx
+ $(LATEX) test-astron.ltx
+
+test-authordate1.dvi: authordate1.bst test.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'authordate1'}/g' \
+ <test.ltx >/tmp/test-authordate1.ltx
+ $(MV) /tmp/test-authordate1.ltx .
+ $(LATEX) test-authordate1.ltx
+ $(BIBTEX) test-authordate1
+ $(LATEX) test-authordate1.ltx
+ $(LATEX) test-authordate1.ltx
+
+test-authordate2.dvi: authordate2.bst test.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'authordate2'}/g' \
+ <test.ltx >/tmp/test-authordate2.ltx
+ $(MV) /tmp/test-authordate2.ltx .
+ $(LATEX) test-authordate2.ltx
+ $(BIBTEX) test-authordate2
+ $(LATEX) test-authordate2.ltx
+ $(LATEX) test-authordate2.ltx
+
+test-authordate3.dvi: authordate3.bst test.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'authordate3'}/g' \
+ <test.ltx >/tmp/test-authordate3.ltx
+ $(MV) /tmp/test-authordate3.ltx .
+ $(LATEX) test-authordate3.ltx
+ $(BIBTEX) test-authordate3
+ $(LATEX) test-authordate3.ltx
+ $(LATEX) test-authordate3.ltx
+
+test-authordate4.dvi: authordate4.bst test.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'authordate4'}/g' \
+ <test.ltx >/tmp/test-authordate4.ltx
+ $(MV) /tmp/test-authordate4.ltx .
+ $(LATEX) test-authordate4.ltx
+ $(BIBTEX) test-authordate4
+ $(LATEX) test-authordate4.ltx
+ $(LATEX) test-authordate4.ltx
+
+test-bbs.dvi: bbs.bst test.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'bbs'}/g' \
+ <test.ltx >/tmp/test-bbs.ltx
+ $(MV) /tmp/test-bbs.ltx .
+ $(LATEX) test-bbs.ltx
+ $(BIBTEX) test-bbs
+ $(LATEX) test-bbs.ltx
+ $(LATEX) test-bbs.ltx
+
+test-cbe.dvi: cbe.bst test.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'cbe'}/g' \
+ <test.ltx >/tmp/test-cbe.ltx
+ $(MV) /tmp/test-cbe.ltx .
+ $(LATEX) test-cbe.ltx
+ $(BIBTEX) test-cbe
+ $(LATEX) test-cbe.ltx
+ $(LATEX) test-cbe.ltx
+
+test-dcu.dvi: dcu.bst test.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[harvard]/g' \
+ -e 's/{plain}/{'dcu'}/g' \
+ <test.ltx >/tmp/test-dcu.ltx
+ $(MV) /tmp/test-dcu.ltx .
+ $(LATEX) test-dcu.ltx
+ $(BIBTEX) test-dcu
+ $(LATEX) test-dcu.ltx
+ $(LATEX) test-dcu.ltx
+
+test-humanbio.dvi: humanbio.bst test.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'humanbio'}/g' \
+ <test.ltx >/tmp/test-humanbio.ltx
+ $(MV) /tmp/test-humanbio.ltx .
+ $(LATEX) test-humanbio.ltx
+ $(BIBTEX) test-humanbio
+ $(LATEX) test-humanbio.ltx
+ $(LATEX) test-humanbio.ltx
+
+test-humannat.dvi: humannat.bst test.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'humannat'}/g' \
+ <test.ltx >/tmp/test-humannat.ltx
+ $(MV) /tmp/test-humannat.ltx .
+ $(LATEX) test-humannat.ltx
+ $(BIBTEX) test-humannat
+ $(LATEX) test-humannat.ltx
+ $(LATEX) test-humannat.ltx
+
+test-jmb.dvi: jmb.bst test.ltx jmb.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[jmb]/g' \
+ -e 's/{plain}/{'jmb'}/g' \
+ <test.ltx >/tmp/test-jmb.ltx
+ $(MV) /tmp/test-jmb.ltx .
+ $(LATEX) test-jmb.ltx
+ $(BIBTEX) test-jmb
+ $(LATEX) test-jmb.ltx
+ $(LATEX) test-jmb.ltx
+
+test-jtb.dvi: jtb.bst test.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'jtb'}/g' \
+ <test.ltx >/tmp/test-jtb.ltx
+ $(MV) /tmp/test-jtb.ltx .
+ $(LATEX) test-jtb.ltx
+ $(BIBTEX) test-jtb
+ $(LATEX) test-jtb.ltx
+ $(LATEX) test-jtb.ltx
+
+test-kluwer.dvi: kluwer.bst test.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[harvard]/g' \
+ -e 's/{plain}/{'kluwer'}/g' \
+ <test.ltx >/tmp/test-kluwer.ltx
+ $(MV) /tmp/test-kluwer.ltx .
+ $(LATEX) test-kluwer.ltx
+ $(BIBTEX) test-kluwer
+ $(LATEX) test-kluwer.ltx
+ $(LATEX) test-kluwer.ltx
+
+test-named.dvi: named.bst named.sty test.ltx
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[named]/g' \
+ -e 's/{plain}/{'named'}/g' \
+ <test.ltx >/tmp/test-named.ltx
+ $(MV) /tmp/test-named.ltx .
+ $(LATEX) test-named.ltx
+ $(BIBTEX) test-named
+ $(LATEX) test-named.ltx
+ $(LATEX) test-named.ltx
+
+test-nar.dvi: nar.bst test.ltx nar.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[nar]/g' \
+ -e 's/{plain}/{'nar'}/g' \
+ <test.ltx >/tmp/test-nar.ltx
+ $(MV) /tmp/test-nar.ltx .
+ $(LATEX) test-nar.ltx
+ $(BIBTEX) test-nar
+ $(LATEX) test-nar.ltx
+ $(LATEX) test-nar.ltx
+
+test-newapa.dvi: newapa.bst newapa.sty test.ltx apalike.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[apalike,newapa]/g' \
+ -e 's/{plain}/{'newapa'}/g' \
+ <test.ltx >/tmp/test-newapa.ltx
+ $(MV) /tmp/test-newapa.ltx .
+ @echo ============================================================
+ @echo Expect BibTeX and LaTeX errors here: newapa.bst does not
+ @echo correctly handle some of the entries in test.bib. A solution
+ @echo has yet to be identified.
+ @echo ============================================================
+ $(LATEX) test-newapa.ltx
+ $(BIBTEX) test-newapa
+ $(LATEX) test-newapa.ltx
+ $(LATEX) test-newapa.ltx
+
+xampl-$(STYLE).ltx: xampl.ltx $(STYLE).bst
+ $(SED) -e 's/{plain}/{'$(STYLE)'}/g' <xampl.ltx >xampl-$(STYLE).ltx
+
+# Special rules for styles that require an additional LaTeX style option:
+
+xampl-aaai-named.dvi: aaai-named.bst xampl.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'aaai-named'}/g' \
+ <xampl.ltx >/tmp/xampl-aaai-named.ltx
+ $(MV) /tmp/xampl-aaai-named.ltx .
+ $(LATEX) xampl-aaai-named.ltx
+ $(BIBTEX) xampl-aaai-named
+ $(LATEX) xampl-aaai-named.ltx
+ $(LATEX) xampl-aaai-named.ltx
+
+xampl-agsm.dvi: agsm.bst xampl.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[harvard]/g' \
+ -e 's/{plain}/{'agsm'}/g' \
+ <xampl.ltx >/tmp/xampl-agsm.ltx
+ $(MV) /tmp/xampl-agsm.ltx .
+ $(LATEX) xampl-agsm.ltx
+ $(BIBTEX) xampl-agsm
+ $(LATEX) xampl-agsm.ltx
+ $(LATEX) xampl-agsm.ltx
+
+xampl-apa.dvi: apa.bst xampl.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'apa'}/g' \
+ <xampl.ltx >/tmp/xampl-apa.ltx
+ $(MV) /tmp/xampl-apa.ltx .
+ $(LATEX) xampl-apa.ltx
+ $(BIBTEX) xampl-apa
+ $(LATEX) xampl-apa.ltx
+ $(LATEX) xampl-apa.ltx
+
+xampl-astron.dvi: astron.bst xampl.ltx astron/astron.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'astron'}/g' \
+ <xampl.ltx >/tmp/xampl-astron.ltx
+ $(MV) /tmp/xampl-astron.ltx .
+ $(LATEX) xampl-astron.ltx
+ $(BIBTEX) xampl-astron
+ $(LATEX) xampl-astron.ltx
+ $(LATEX) xampl-astron.ltx
+
+xampl-authordate1.dvi: authordate1.bst xampl.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'authordate1'}/g' \
+ <xampl.ltx >/tmp/xampl-authordate1.ltx
+ $(MV) /tmp/xampl-authordate1.ltx .
+ $(LATEX) xampl-authordate1.ltx
+ $(BIBTEX) xampl-authordate1
+ $(LATEX) xampl-authordate1.ltx
+ $(LATEX) xampl-authordate1.ltx
+
+xampl-authordate2.dvi: authordate2.bst xampl.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'authordate2'}/g' \
+ <xampl.ltx >/tmp/xampl-authordate2.ltx
+ $(MV) /tmp/xampl-authordate2.ltx .
+ $(LATEX) xampl-authordate2.ltx
+ $(BIBTEX) xampl-authordate2
+ $(LATEX) xampl-authordate2.ltx
+ $(LATEX) xampl-authordate2.ltx
+
+xampl-authordate3.dvi: authordate3.bst xampl.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'authordate3'}/g' \
+ <xampl.ltx >/tmp/xampl-authordate3.ltx
+ $(MV) /tmp/xampl-authordate3.ltx .
+ $(LATEX) xampl-authordate3.ltx
+ $(BIBTEX) xampl-authordate3
+ $(LATEX) xampl-authordate3.ltx
+ $(LATEX) xampl-authordate3.ltx
+
+xampl-authordate4.dvi: authordate4.bst xampl.ltx authordate1-4.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[authordate1-4]/g' \
+ -e 's/{plain}/{'authordate4'}/g' \
+ <xampl.ltx >/tmp/xampl-authordate4.ltx
+ $(MV) /tmp/xampl-authordate4.ltx .
+ $(LATEX) xampl-authordate4.ltx
+ $(BIBTEX) xampl-authordate4
+ $(LATEX) xampl-authordate4.ltx
+ $(LATEX) xampl-authordate4.ltx
+
+xampl-bbs.dvi: bbs.bst xampl.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'bbs'}/g' \
+ <xampl.ltx >/tmp/xampl-bbs.ltx
+ $(MV) /tmp/xampl-bbs.ltx .
+ $(LATEX) xampl-bbs.ltx
+ $(BIBTEX) xampl-bbs
+ $(LATEX) xampl-bbs.ltx
+ $(LATEX) xampl-bbs.ltx
+
+xampl-cbe.dvi: cbe.bst xampl.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'cbe'}/g' \
+ <xampl.ltx >/tmp/xampl-cbe.ltx
+ $(MV) /tmp/xampl-cbe.ltx .
+ $(LATEX) xampl-cbe.ltx
+ $(BIBTEX) xampl-cbe
+ $(LATEX) xampl-cbe.ltx
+ $(LATEX) xampl-cbe.ltx
+
+xampl-dcu.dvi: dcu.bst xampl.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[harvard]/g' \
+ -e 's/{plain}/{'dcu'}/g' \
+ <xampl.ltx >/tmp/xampl-dcu.ltx
+ $(MV) /tmp/xampl-dcu.ltx .
+ $(LATEX) xampl-dcu.ltx
+ $(BIBTEX) xampl-dcu
+ $(LATEX) xampl-dcu.ltx
+ $(LATEX) xampl-dcu.ltx
+
+xampl-humanbio.dvi: humanbio.bst xampl.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'humanbio'}/g' \
+ <xampl.ltx >/tmp/xampl-humanbio.ltx
+ $(MV) /tmp/xampl-humanbio.ltx .
+ $(LATEX) xampl-humanbio.ltx
+ $(BIBTEX) xampl-humanbio
+ $(LATEX) xampl-humanbio.ltx
+ $(LATEX) xampl-humanbio.ltx
+
+xampl-humannat.dvi: humannat.bst xampl.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'humannat'}/g' \
+ <xampl.ltx >/tmp/xampl-humannat.ltx
+ $(MV) /tmp/xampl-humannat.ltx .
+ $(LATEX) xampl-humannat.ltx
+ $(BIBTEX) xampl-humannat
+ $(LATEX) xampl-humannat.ltx
+ $(LATEX) xampl-humannat.ltx
+
+xampl-jmb.dvi: jmb.bst xampl.ltx jmb.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[jmb]/g' \
+ -e 's/{plain}/{'jmb'}/g' \
+ <xampl.ltx >/tmp/xampl-jmb.ltx
+ $(MV) /tmp/xampl-jmb.ltx .
+ $(LATEX) xampl-jmb.ltx
+ $(BIBTEX) xampl-jmb
+ $(LATEX) xampl-jmb.ltx
+ $(LATEX) xampl-jmb.ltx
+
+xampl-jtb.dvi: jtb.bst xampl.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[astron]/g' \
+ -e 's/{plain}/{'jtb'}/g' \
+ <xampl.ltx >/tmp/xampl-jtb.ltx
+ $(MV) /tmp/xampl-jtb.ltx .
+ $(LATEX) xampl-jtb.ltx
+ $(BIBTEX) xampl-jtb
+ $(LATEX) xampl-jtb.ltx
+ $(LATEX) xampl-jtb.ltx
+
+xampl-kluwer.dvi: kluwer.bst xampl.ltx harvard.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[harvard]/g' \
+ -e 's/{plain}/{'kluwer'}/g' \
+ <xampl.ltx >/tmp/xampl-kluwer.ltx
+ $(MV) /tmp/xampl-kluwer.ltx .
+ $(LATEX) xampl-kluwer.ltx
+ $(BIBTEX) xampl-kluwer
+ $(LATEX) xampl-kluwer.ltx
+ $(LATEX) xampl-kluwer.ltx
+
+xampl-named.dvi: named.bst named.sty xampl.ltx
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[named]/g' \
+ -e 's/{plain}/{'named'}/g' \
+ <xampl.ltx >/tmp/xampl-named.ltx
+ $(MV) /tmp/xampl-named.ltx .
+ $(LATEX) xampl-named.ltx
+ $(BIBTEX) xampl-named
+ $(LATEX) xampl-named.ltx
+ $(LATEX) xampl-named.ltx
+
+xampl-nar.dvi: nar.bst xampl.ltx nar.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[nar]/g' \
+ -e 's/{plain}/{'nar'}/g' \
+ <xampl.ltx >/tmp/xampl-nar.ltx
+ $(MV) /tmp/xampl-nar.ltx .
+ $(LATEX) xampl-nar.ltx
+ $(BIBTEX) xampl-nar
+ $(LATEX) xampl-nar.ltx
+ $(LATEX) xampl-nar.ltx
+
+xampl-newapa.dvi: newapa.bst newapa.sty xampl.ltx apalike.sty
+ $(SED) -e 's/\\documentstyle\[\]/\\documentstyle[apalike,newapa]/g' \
+ -e 's/{plain}/{'newapa'}/g' \
+ <xampl.ltx >/tmp/xampl-newapa.ltx
+ $(MV) /tmp/xampl-newapa.ltx .
+ $(LATEX) xampl-newapa.ltx
+ $(BIBTEX) xampl-newapa
+ $(LATEX) xampl-newapa.ltx
+ $(LATEX) xampl-newapa.ltx
diff --git a/obsolete/biblio/bibtex/contrib/makefile/makefile.tops20 b/obsolete/biblio/bibtex/contrib/makefile/makefile.tops20
new file mode 100644
index 0000000000..b81d6f5643
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/makefile/makefile.tops20
@@ -0,0 +1,54 @@
+#=======================================================================
+# Makefile for BibTeX 0.99
+# [14-Nov-88]
+#=======================================================================
+
+.SUFFIXES:
+
+.SUFFIXES: .web .dvi .tex .ltx
+
+.tex.dvi:
+ latex $*\n
+ bibtex $*
+ delete $*.dvi
+ latex $*\n
+ delete $*.dvi
+ latex $*
+
+.ltx.dvi:
+ latex $*.ltx\n
+ bibtex $*
+ delete $*.dvi
+ latex $*.ltx\n
+ delete $*.dvi
+ latex $*.ltx\n
+
+.web.dvi:
+ delete $*.dvi
+ delete $*.tex
+ weave\n\
+ $*.web\n\
+ $*.tops20-changes\n\
+ $*.tex
+ tex $*\n
+ delete $*.tex
+
+.web.exe:
+ tangle\n\
+ $*.web\n\
+ $*.tops20-changes\n\
+ $*.pas\n\
+ $*.pool
+ load $*.pas
+ save $*
+ delete $*.pas
+ delete $*.rel
+
+all: bibtex.exe document
+
+install:
+ copy bibtex.exe tex:bibtex.exe
+
+bibtex.exe: bibtex.web bibtex.tops20-changes
+
+document: btxdoc.dvi btxhak.dvi bibtex.dvi
diff --git a/obsolete/biblio/bibtex/contrib/makefile/makefile.tops20-new b/obsolete/biblio/bibtex/contrib/makefile/makefile.tops20-new
new file mode 100644
index 0000000000..b04eaf1d97
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/makefile/makefile.tops20-new
@@ -0,0 +1,56 @@
+#=======================================================================
+# Makefile for BibTeX 0.99
+# In order to allow BibTeX 0.98 to continue to exist, the executable
+# program created here is called nbibtex.
+# [12-May-88]
+#=======================================================================
+
+.SUFFIXES:
+
+.SUFFIXES: .web .dvi .tex .ltx
+
+.tex.dvi:
+ latex $*\n
+ bibtex $*
+ delete $*.dvi
+ latex $*\n
+ delete $*.dvi
+ latex $*
+
+.ltx.dvi:
+ latex $*.ltx\n
+ bibtex $*
+ delete $*.dvi
+ latex $*.ltx\n
+ delete $*.dvi
+ latex $*.ltx\n
+
+.web.dvi:
+ delete $*.dvi
+ delete $*.tex
+ weave\n\
+ $*.web\n\
+ $*.tops20-changes\n\
+ $*.tex
+ tex $*\n
+ delete $*.tex
+
+.web.exe:
+ tangle\n\
+ $*.web\n\
+ $*.tops20-changes\n\
+ $*.pas\n\
+ $*.pool
+ load $*.pas
+ save $*
+ delete $*.pas
+ delete $*.rel
+
+all: bibtex.exe document
+
+install:
+ copy bibtex.exe tex:nbibtex.exe
+
+bibtex.exe: bibtex.web bibtex.tops20-changes
+
+document: btxdoc.dvi btxhak.dvi bibtex.dvi
diff --git a/obsolete/biblio/bibtex/contrib/makefile/makefile.vms b/obsolete/biblio/bibtex/contrib/makefile/makefile.vms
new file mode 100644
index 0000000000..b4c7bf8111
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/makefile/makefile.vms
@@ -0,0 +1,55 @@
+#=======================================================================
+# Makefile for BibTeX 0.99
+# In order to allow BibTeX 0.98 to continue to exist, the executable
+# program created here is called nbibtex; it should be installed in
+# a standard place, and a system-wide foreign command symbol created
+# for it.
+# [12-May-88]
+#=======================================================================
+
+.SUFFIXES:
+.SUFFIXES: .exe .dvi .web .tex .ltx
+
+.tex.dvi:
+ latex $*
+ nbibtex $*
+ - delete $*.dvi.*
+ latex $*
+ - delete $*.dvi.*
+ latex $*
+
+.ltx.dvi:
+ latex $*.ltx
+ nbibtex $*
+ - delete $*.dvi.*
+ latex $*.ltx
+ - delete $*.dvi.*
+ latex $*
+
+.web.dvi:
+ - delete $*.dvi.*
+ - delete $*.tex.*
+ copy $*.vms-changes $*.ch
+ weave $*
+ tex $*
+ - delete $*.tex.*
+
+.web.exe:
+ copy $*.vms-changes $*.ch
+ tangle $*
+ pascal $*/nolist/nowarn
+ link $*,[--.tex]prompt
+ - delete $*.ch.*
+ - delete $*.pas.*
+ - delete $*.obj.*
+
+all: nbibtex.exe document
+
+nbibtex.exe: bibtex.exe
+ copy bibtex.exe.* nbibtex.exe.*
+
+bibtex.exe: bibtex.web bibtex.vms-changes
+
+
+document: btxdoc.dvi btxhak.dvi bibtex.dvi
+
diff --git a/obsolete/biblio/bibtex/contrib/misc/cell.bst b/obsolete/biblio/bibtex/contrib/misc/cell.bst
new file mode 100644
index 0000000000..4d831b7a61
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/misc/cell.bst
@@ -0,0 +1,1442 @@
+% BibTex `cell' bibliography style
+% version = 1.25 of cell.bst 1994 October 15
+% from version = 1.27 of jmb.bst 1992 October 22
+
+% conversion from JMB to Cell by:
+% changing emphasis to roman (\em to \rm)
+% bold face to roman (\bf to \rm) (on volume)
+% making the volume be italics
+% removing the comma after the journal name
+%
+% Thomas Schneider
+% National Cancer Institute
+% Laboratory of Mathematical Biology
+% Frederick, Maryland 21702-1013
+% toms@ncifcrf.gov
+%
+% This file is available by anonymous ftp from ncifcrf.gov in pub/delila.
+%
+% TITLES can be turned on and off!
+% Just nocite the reference TitlesOn in the paper (i.e. \nocite{TitlesOn})
+% and have a bibliography article in your database with that cite key!
+%
+% WARNING: Since I use mostly article, book and inproceedings, these
+% are formatted pretty closely to the Journal of Theoretical Biology style
+% while other things are neglected. Also, I can't guarantee that the style
+% is exactly right.
+%
+% The following documentation is identical from the source of jmb.bst,
+% which was the apalike.bst taken from the Clarkson archive on 1989 June 19.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BibTeX `apalike' bibliography style (24-Jan-88 version)
+% Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a.
+% Copyright (C) 1988, all rights reserved.
+% Copying of this file is allowed, provided that if you make any changes at all
+% you name it something other than `apalike.bst'.
+% This restriction helps ensure that all copies are identical.
+% Differences between this style and `alpha' are generally heralded by a `%'.
+% The file btxbst.doc has the documentation for alpha.bst.
+%
+% This style should be used with the `apalike' LaTeX style (apalike.sty).
+% \cite's come out like "(Jones, 1986)" in the text but there are no labels
+% in the bibliography, and something like "(1986)" comes out immediately
+% after the author. Author (and editor) names appear as last name, comma,
+% initials. A `year' field is required for every entry, and so is either
+% an author (or in some cases, an editor) field or a key field.
+%
+% Editorial note:
+% Many journals require a style like `apalike', but I strongly, strongly,
+% strongly recommend that you not use it if you have a choice---use something
+% like `plain' instead. Mary-Claire van Leunen (A Handbook for Scholars,
+% Knopf, 1979) argues convincingly that a style like `plain' encourages better
+% writing than one like `apalike'. Furthermore the strongest arguments for
+% using an author-date style like `apalike'---that it's "the most practical"
+% (The Chicago Manual of Style, University of Chicago Press, thirteenth
+% edition, 1982, pages 400--401)---fall flat on their face with the new
+% computer-typesetting technology. For instance page 401 anachronistically
+% states "The chief disadvantage of [a style like `plain'] is that additions
+% or deletions cannot be made after the manuscript is typed without changing
+% numbers in both text references and list." LaTeX sidesteps the disadvantage.
+%
+% History:
+% 15-sep-86 (SK,OP) Original version, by Susan King and Oren Patashnik.
+% 10-nov-86 (OP) Truncated the sort.key$ string to the correct length
+% in bib.sort.order to eliminate error message.
+% 24-jan-88 (OP) Updated for BibTeX version 0.99a, from alpha.bst 0.99a;
+% apalike now sorts by author, then year, then title;
+% THIS `apalike' VERSION DOES NOT WORK WITH BIBTEX 0.98i.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% The program was further modified by Tom Schneider:
+%
+% 1989 June 19 (TDS) Renamed jmb.bst. Items that do not have years were
+% listed in the bibliography without identifiers. However, they
+% have identifiers in the text. The identifier was added.
+% Titles were removed :-(.
+%
+% 1989 October 2 (TDS) Made labels in the paper use the & symbol rather
+% than `and', as required by JMB.
+% 1989 October 3 (TDS) Made et~al. be in italics.
+% Removed comma after journal name. (actually, all
+% mid sentence commas go!)
+% Made volume number be bold faced.
+% Converted colon (:) after volume number to a comma (,).
+% If a journal name does NOT end in a period, add
+% a comma after the name.
+% 1989 October 14 (TDS) Without a year the program used to sort on the
+% title. I made it sort on the cite$ if there is no year.
+% 1989 October 18 (TDS) If there is one reference without a year, put
+% an "a" at the end of its label, so that it comes out
+% as (Smith, a) in the text. in FUNCTION {forward.pass}
+% 1989 November 2 (TDS) Unpublished papers now give the title.
+% 1989 November 18 (TDS) TITLES can be turned on and off!
+% Just nocite the reference TitlesOn in the paper
+% and have a bibliography article in your database
+% with that cite key!
+% 1989 December 5 (TDS) I can't stand sorting to fall back on the
+% titles of the article - no control! So in function
+% bib.sort.order the default is now cite$.
+% 1990 November 14 (TDS) Changes to match JTB better:
+% Names in the bibliography are now connected
+% with "\&" instead of "and", since this fits JTB better.
+% "In" is now "In:".
+% "editors" and "editor" are now "eds" and "ed".
+% booktitle follows editors. editors in parenthesis.
+% pp. and p. instead of pages and page.
+% location followed by colon (:) and then publisher.
+% 1992 October 22 (TDS) Publisher address is at the end of books.
+% with no colon after address.
+% no comma before & in name list in bibliography.
+% The extra.label (as the a of 1991a) is emphasized.
+% "In:" goes back to "In"!
+% publisher address is at the end of inproceedings.
+% volume is "vol.", with comma after number.
+% ed.", and comma after ) closing editors.
+% as a colon (:), JMB does NOT want the next
+% ed, but the format.title function uses
+% which leaves it capitalized. To fix this, a
+% place change.case$ must be written.
+%
+% When a title has a colon (:), JMB does NOT want the next
+% word capitalized, but the format.title function uses
+% change.case$, which leaves it capitalized. To fix this, a
+% function to replace change.case$ was written:
+% special.change.case
+%
+% edition should follow TITLE for books!
+
+% possible bug: sorting order probably should be first author followed
+% by year; but this is not absolutely clear. Sorting here is (I think)
+% by all authors (or perhaps the key) then year.
+
+
+ENTRY % declare variables that have a value for each entry on the list
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+% month not used in apalike
+ 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
+ docomma givetitles }
+
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+
+ #0 'docomma := % if it is 0 then don't do commas, otherwise do them.
+}
+
+FUNCTION {init.toggle.switches}
+{% set switches for controlling the output!
+ #0 'givetitles := % if it is 0 then don't give titles, otherwise do them.
+}
+
+STRINGS { s t }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+% "in of output.nonnull" warning$
+
+% % { ", " * write$ } % the comma here is responsible for every comma!
+% % % But JMB doesn't want commas, so away it goes!
+% { " " * write$ } % That does it!
+
+ { % doing a comma is controlled specifically in JMB using docomma
+ docomma #0 =
+ { " " * write$ }
+ { ", " * write$ }
+ if$
+ }
+ { 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
+% "out of output.nonnull" warning$
+}
+
+FUNCTION {output}
+{ duplicate$ empty$
+ 'pop$
+ 'output.nonnull
+ if$
+}
+
+FUNCTION {output.check}
+{ 't :=
+% "in output.check" warning$
+ duplicate$ empty$
+ { t "title" =
+ { pop$ } % jmb ignores titles and does not object if missing
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ if$
+ }
+ 'output.nonnull % block periods
+ % { pop$ } % don't do anything
+ if$
+% "ouT of output.check" warning$
+}
+
+% t "title" =
+% { "zowie" warning$ }
+% { duplicate$ empty$
+% { pop$ "EmPtY " t * " in " * cite$ * warning$ }
+% 'output.nonnull
+% }
+% if$
+% if$
+%}
+
+% apalike needs this function because
+% the year has special punctuation;
+% apalike ignores the month
+FUNCTION {output.year.check}
+{ year empty$
+ {
+ "empty year in " cite$ ", using label: " extra.label * * * warning$
+ write$
+% " (" extra.label * ")" * % TDS UNemphasized label
+
+% zzz here is the problem:
+% extra.label "BLURB" * warning$
+ " ({\rm{" extra.label * "}})" * % TDS emphasized label
+% "BLORB" warning$
+
+ { label "{\rm{" extra.label "}}" * * * 'label :=}
+% "BLUBEL" warning$
+
+ mid.sentence 'output.state :=
+% "BLIP" warning$
+ }
+ { write$
+
+% " (" year * extra.label * ")" * % TDS UNemphasized label
+ " (" year * "{\rm{" extra.label "}}" * * * ")" * % TDS emphasized label
+
+ mid.sentence 'output.state :=
+ }
+ if$
+% "POW" warning$
+}
+
+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.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\rm " swap$ * "}" * }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { numnames #2 >
+% { "," * } % remove this comma TDS
+ { " " * }
+ 'skip$
+ if$
+ t "others" =
+ { " {\rm et~al.}" * }
+ { " \& " * t * }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+}
+
+FUNCTION {format.key} % this function is just for apalike
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", eds" * } % TDS
+ { ", ed." * } % TDS
+ if$
+ }
+ if$
+}
+
+FUNCTION {special.change.case}
+% change the entire string to lower case except
+% for the first letter and things inside {}
+% That is, force the first letter after a colon (:) to be lower case
+% but otherwise use the change.case$ rules.
+{
+% title "t" change.case$ % TDS this line was the original method
+
+% start with the first letter of the title, hang on stack
+title #1 #1 substring$
+
+% unearth this to see the breakpoint
+%"|---|" *
+
+% take the title, change to entire lower case.
+title "l" change.case$
+
+% take from second position of lowered title to end of title
+#2
+global.max$
+substring$
+
+% concatenate first letter to rest of title
+*
+}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { % decide whether to give the title or not
+ givetitles #1 =
+% { title "t" change.case$ } % produce the title % TDS original function
+ { special.change.case } % produce the title
+ { title pop$ "" } % don't produce the title
+ if$
+ }
+ 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.btitle}
+{ 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 % TDS
+ { "vol." volume "," * tie.or.space.connect % made vol.
+ series empty$
+ 'skip$
+ { " of " * series emphasize * }
+ if$
+% "volume and number" number either.or.check % TDS
+ "vol. and num." number either.or.check % made vol.
+ }
+ if$
+}
+
+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$
+}
+
+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
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+ { "pp." pages n.dashify tie.or.space.connect } % TDS
+ { "p." pages tie.or.space.connect } % TDS
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ "{\rm " volume "}" * * field.or.null % make volume bold face
+
+% cell does not take numbers
+% number empty$
+% 'skip$
+%% { " (" number * ")" * *
+% { " ({\em " number "\/}" * * ")" * * % CELL IS ITALICS
+%% zzz
+% 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 * } % no more colons after the volume
+ { ", " * pages n.dashify * } % comma's instead
+ 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$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "In " booktitle emphasize * } % TDS
+ { "In " booktitle emphasize * ", " * % That's the comma after the title
+ "(" format.editors ")," * * * } % TDS
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{ "In" % this is for apalike % TDS
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In " % TDS
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+ "\cite{" * crossref * "}" * % this is for apalike
+}
+
+FUNCTION {format.incoll.inproc.crossref}
+{ "In" % this is for apalike % TDS
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {article}
+{
+ cite$ "TitlesOn" =
+ 'skip$ % Don't write out an article of this kind, it's a toggle switch!
+ {
+ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+% "===> about to" warning$
+ output.year.check % apalike
+% "===> after it" warning$
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { % figure out the last character of the journal name.
+ % "<<" journal #-1 #1 substring$ ">>" * * % for testing
+ % "<" journal ">" * * % this works ok % for testing
+
+ journal #-1 #1 substring$ "." =
+ { journal } % journal ended in period so don't do anything
+% { journal ", " *} % journal ended without period, so add comma
+ { journal " " *} % journal ended without period, so add comma NONE FOR CELL
+ if$
+ emphasize "journal" output.check
+
+% journal * emphasize "journal" output.check % the original method
+
+ format.vol.num.pages output
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+ }
+ if$
+}
+
+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$
+ output.year.check % special for apalike
+ new.block
+ format.btitle "title" output.check
+ #1 'docomma := % TURN COMMAS ON FOR JMB
+ crossref missing$
+ {
+ format.bvolume output
+ new.block
+ format.number.series output
+ format.edition output % TDS JMB position for edition
+% new.sentence
+% #0 'docomma := % no comma after address
+% address ":" * output % TDS
+ publisher "publisher" output.check % TDS
+% #1 'docomma := % comma back on
+% publisher "publisher" output.check
+% address output
+ address output % TDS - no colon!
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+% format.edition output % TDS original position of edition
+ new.block
+ note output
+ fin.entry
+ #0 'docomma := % TURN COMMAS OFF
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ howpublished output
+ address output
+ new.block
+ 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$
+ output.year.check % special for apalike
+ 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
+ #0 'docomma := % no comma after address
+ address ":" * output % TDS
+ publisher "publisher" output.check % TDS
+ #1 'docomma := % comma back on
+% 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
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ 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.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
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ {
+% #1 'docomma := % TURN COMMAS ON FOR JMB, BUT NOT FOR JTB: inconsistent. TDS NOW
+ format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.pages
+ pages empty$
+ { output }
+ { "," * output } % TDS toss in comma instead of period
+ if$
+
+% address output % TDS address is below for JTB
+% new.sentence % TDS remove period
+ organization output
+ #0 'docomma := % NO COMMA AFTER ADDRESS
+ publisher "publisher" output.check % TDS
+ #1 'docomma := % comma back on
+
+% publisher output % are simpler
+ address output % TDS
+ #0 'docomma := % TURN COMMAS OFF
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ organization address new.block.checkb
+ organization output
+ address output
+ format.edition output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title output
+ new.block
+ howpublished output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis," format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ format.editors output
+ editor format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ address output % for apalike
+ new.sentence % we always output
+ organization output % a nonempty organization
+ publisher output % here
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+% "===> about to unpuBLISH" warning$
+ output.year.check % apalike
+% "===> out of to unpuBLISH" warning$
+ new.block
+% "===> PLEASE PLEASE BE HERE" warning$
+
+% Since format.title is out of commission, the original method won't work:
+% format.title "title" output.check
+% so do the equivalent of the format.title procedure: (TDS)
+ title empty$
+ { "" }
+ { title "t" change.case$ } % produce the title
+ if$
+% "===> perfidity 1" warning$
+ "title" output.check
+% "===> perfidity" warning$
+
+ new.block
+ note "note" output.check
+ fin.entry
+
+% "===> GOlly done" warning$
+}
+
+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"}
+
+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 {check.for.titlecommand}
+% go through each entry and see if one of them has the key
+% 'TitlesOn'. If this is found, then do titles!
+% 1989 November 18 TDS
+{
+% "|" label "|" * * write$ newline$ % |Arrhenius {\rm et~al.}, 1986|
+% "|" cite$ "|" * * write$ newline$ % |Arrhenius1986|
+% so cite$ is the thing I want to detect...
+
+ cite$ "TitlesOn" =
+ { % got it!
+% "FOUND TitlesOn" write$ newline$
+ "Titles Will Be Printed" warning$
+ #1 'givetitles := % give titles!
+ }
+ 'skip$
+ if$
+}
+EXECUTE {init.toggle.switches}
+ITERATE {check.for.titlecommand}
+% ***********************************************************
+
+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$
+}
+
+% There are three apalike cases: one person (Jones),
+% two (Jones and de~Bruijn), and more (Jones et~al.).
+% This function is much like format.crossref.editors.
+%
+FUNCTION {format.lab.names}
+{ 's :=
+ s #1 "{vv~}{ll}" format.name$
+ s num.names$ duplicate$
+ #2 >
+ { pop$ " {\rm et~al.}" * }
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " {\rm et~al.}" * }
+ { " \& " * s #2 "{vv~}{ll}" format.name$ * }
+ % note new use of & rather than `and'. TDS
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key % apalike uses the whole key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key % apalike uses the whole 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 % apalike uses the whole key, no organization
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+
+FUNCTION {calc.label}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label % apalike ignores organization
+ 'author.key.label % for labeling and sorting
+ if$
+ }
+ if$
+ ", " % these three lines are
+ * % for apalike, which
+ year field.or.null purify$ #-1 #4 substring$ % uses all four digits
+ *
+ 'label :=
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$ % apalike uses initials
+ s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here
+ nameptr numnames = t "others" = and
+ { "{\rm 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$
+}
+
+% apalike uses two sorting passes; the first one sets the
+% labels so that the `a's, `b's, etc. can be computed;
+% the second pass puts the references in "correct" order.
+% The presort function is for the first pass. It computes
+% label, sort.label, and title, and then concatenates.
+FUNCTION {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$ % for
+ 'sort.label := % apalike
+ sort.label % style
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+
+SORT % by label, sort.label, title---for final label calculation
+
+STRINGS { last.label next.extra } % apalike labels are only for the text;
+
+INTEGERS { last.extra.num } % there are none in the bibliography
+
+FUNCTION {initialize.extra.label.stuff} % and hence there is no `longest.label'
+{ #0 int.to.chr$ 'last.label :=
+ "" 'next.extra :=
+ #0 'last.extra.num :=
+}
+
+FUNCTION {forward.pass}
+% pass through the references forward
+{
+%"\\ label=" label "//" * * write$ newline$ % display the label
+%"\\last.label=" last.label "//" * * write$ newline$ % display the label
+
+ last.label label = % if the label repeats the previous label...
+ { % then increment the extra number
+ last.extra.num #1 + 'last.extra.num :=
+ % and convert it to a label
+ last.extra.num int.to.chr$ 'extra.label :=
+ }
+ { % else set things up for the next entry
+ "a" chr.to.int$ 'last.extra.num :=
+
+ % However, if the year was missing, tack on an extra "a". TDS
+ year empty$
+ {"a" 'extra.label :=}
+ {"" 'extra.label :=}
+ if$
+
+% "" 'extra.label := % the original method was not to do anything TDS
+
+ label 'last.label := % capture this label for next time
+ }
+ if$
+%"\\extra.label = " extra.label "//" * * write$ newline$ % display the label
+}
+
+FUNCTION {reverse.pass}
+% pass through the references backwards
+% add extra characters to the end of the label string
+{
+%"{{" label "}}" * * write$ newline$ % display the label
+ next.extra "b" =
+% original logic:
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+
+% next.extra "b" = { "next.extra was = b" write$ newline$} 'skip$ if$
+
+% new as of 1989 Oct 18
+% { "a" 'extra.label := }
+% { % Put on an "a" at the end of the label if the year is missing. TDS
+% year empty$
+% { "a" 'extra.label := }
+% %{ label "a" * 'label := }
+% 'skip$ % otherwise leave it alone (orignial method)
+% if$ }
+% if$
+
+% label extra.label * 'label := % TDS ORIGINAL LABEL METHOD
+
+% stick {\rm } around extra.label if it's not empty TDS
+ extra.label "" =
+ 'skip$
+ { label "{\rm{" extra.label "}}" * * * 'label :=}
+ if$
+
+ extra.label 'next.extra :=
+%"{{" label "}}" * * write$ newline$ % display the label
+}
+
+FUNCTION {bib.sort.order}
+% Generate the sort.key$ variables for sorting.
+% The sorting is first on the sort.label (ie, author's name), followed
+% by the year then the title. If there is no year, the cite$ is used.
+{
+ sort.label % this is based on the author name
+ " " * % tack on some space
+% original apa command was to use the year or an empty string:
+% year field.or.null sortify
+%
+% Replace that with the use of the cite$, when there is no year:
+ year duplicate$ empty$
+ {pop$ cite$}
+ 'skip$
+ if$
+
+ * " " * % tack on some space
+
+% I CAN'T STAND SORTING ON TITLE!!! TDS 1989 Dec 5
+% title field.or.null
+% sort.format.title
+% * % attach them together
+ cite$
+ * % use cite$ instead!!
+
+ % note: if there is no year, then the cite$ will override the sorting
+ % on the title. Oh well. Title sorting is sorta (ha ha) awful.
+
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+
+ % The following line helps debug the program. It shows what the sort.key$ is.
+ % "%" sort.key$ * write$ newline$
+}
+
+% Here is the place that the actual executions of the labeling and sorting
+% functions are done.
+
+
+EXECUTE {initialize.extra.label.stuff} % initialize variables
+ITERATE {bib.sort.order} % set up the sorting keys
+SORT % by sort.label, year, title---giving final bibliography order
+% Having sorted NOW we apply the extra letters at the end!
+ITERATE {forward.pass}
+REVERSE {reverse.pass}
+
+FUNCTION {begin.bib}
+{ preamble$ empty$ % no \etalchar in apalike
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{}" write$ newline$ % no labels in apalike
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/misc/jas99.bst b/obsolete/biblio/bibtex/contrib/misc/jas99.bst
new file mode 100644
index 0000000000..ca4a4dc129
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/misc/jas99.bst
@@ -0,0 +1,1336 @@
+% Attempted hack to create BibTeX `jas' style for BibTeX version 0.99c
+% Journal of Atmospheric Science, Journal of Applied Meteorology
+% Monthly Weather Review
+% by Mike Moran, Dept. of Atmospheric Science, Colorado State University
+% based on `newapa' style file. Changes are documented. March 9, 1990
+% Submitted 20-JUL-1993 by Piotr J. Flatau <pflatau@macao.ucsd.edu>
+% e-mail for Mike Moran: <mmoran@cid.aes.doe.ca>
+% ========================================================================
+%
+% BibTeX `newapa' style file for BibTeX version 0.99c, LaTeX version 2.09
+% Place it in a file called newapa.bst in the BibTeX search path.
+%(Placing it in the same directory as the LaTeX document should also work.)
+% Support for named citations is provided by named.sty
+
+% This version was made by modifying the master file made by
+% Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU), and the 'named' BibTeX
+% style of Peter F. Patel-Schneider.
+
+% Copyright (C) 1985, all rights reserved.
+% Modifications Copyright 1989, 1990, Stephen N. Spencer
+% 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.
+
+% There are undoubtably bugs in this style. If you make bug fixes,
+% improvements, etc. please let me know. My e-mail address is:
+% spencer@heinlein.cgrg.ohio.state.edu
+%
+% Citation format: (author-last-name, year)
+% (author-last-name and author-last-name, year)
+% (author-last-name {\em et al.}, year)
+% (author-last-name)
+% (author-last-name and author-last-name)
+% (author-last-name {\em et al.})
+% (year)
+%
+% Reference list ordering: alphabetical by author or whatever passes
+% for author in the absence of one.
+%
+% This BibTeX style has support for abbreviated author lists and for
+% year-only citations. This is done by having the citations
+% actually look like
+%
+% \citeauthoryear{full-author-info}{abbrev-author-info}{year}
+%
+% The LaTeX style has to have the following (or similar)
+%
+% \let\@internalcite\cite
+% \def\fullcite{\def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
+% \def\fullciteA{\def\citeauthoryear##1##2##3{##1}\@internalcite}
+% \def\shortcite{\def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
+% \def\shortciteA{\def\citeauthoryear##1##2##3{##2}\@internalcite}
+% \def\citeyear{\def\citeauthoryear##1##2##3{##3}\@internalcite}
+%
+
+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 u }
+
+%% Added this function March 9, 1990. Used in FUNCTION format.vol.num.pages
+FUNCTION {boldcize}
+{ 's :=
+ s "" =
+ { "" }
+ { "{\bf " s * "}" * }
+ if$
+}
+
+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
+}
+
+%% Added this entire function based on JAS98.BST (March 10, 1990)
+FUNCTION {output.nonnull1}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { write$ %% This is only difference
+ 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$
+}
+
+%% Added this function based on JAS98.BST (March 10, 1990)
+FUNCTION {output.check1}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull1 %% Only difference
+ if$
+}
+
+FUNCTION {output.year.check}
+{ year empty$
+ { "empty year in " cite$ * warning$ }
+ { write$
+%% " (" year * extra.label * ") " *
+ ", " year * extra.label * ": " *
+%% March 9, 1990
+ mid.sentence 'output.state :=
+ }
+ 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$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr := % nameptr = 1;
+ s num.names$ 'numnames := % numnames = num.name$(s);
+ numnames 'namesleft :=
+ { namesleft #0 > }
+
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" 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 := % nameptr += 1;
+ namesleft #1 - 'namesleft := % namesleft =- 1;
+ }
+ while$
+}
+
+%% Added this entire function based on JAS98.BST (March 10, 1990)
+FUNCTION {format.names.reverse1}
+{ 's :=
+ #1 'nameptr := % nameptr = 1 (name pointer variable);
+ s num.names$ 'numnames := % numnames = num.name$(s);
+ numnames 'namesleft := % namesleft = numnames (names left variable);
+ { namesleft #0 > }
+
+%% So long as "namesleft" is positive, execute following function
+ {
+%% s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % Set name format
+
+ nameptr #1 >
+%% ** Co-authors section
+ {
+ s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := % Set name format
+ namesleft #1 >
+%% ** Not last author
+ { ", " * t * }
+%% ** Last author
+ { numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+%% ** First author section
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % Set name format
+ t
+ }
+ if$
+ nameptr #1 + 'nameptr := % nameptr += 1;
+ namesleft #1 - 'namesleft := % namesleft =- 1;
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+%% { author format.names }
+ { author format.names.reverse1 }
+%% March 10, 1990
+ if$
+}
+
+FUNCTION {format.key}
+{ empty$
+ { key field.or.null }
+ { "" }
+ 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.btitle}
+{ 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 =
+ { "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$
+}
+
+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
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+%% { "pages" pages n.dashify tie.or.space.connect }
+%% { "page" pages tie.or.space.connect }
+ { pages n.dashify tie.or.space.connect }
+ { pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+%%{ volume field.or.null
+{volume field.or.null boldcize %% March 9, 1990
+ 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 * }
+ { ", " * pages n.dashify * } %% March 9, 1990
+ 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$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "In " booktitle emphasize * }
+%% { "In " format.editors * ", " * booktitle emphasize * }
+ { "In " booktitle emphasize * ", " * format.editors * }
+%% March 11, 1990
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{ "In"
+ "\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}
+{ "In"
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 10, 1990
+ new.block
+ crossref missing$
+ { journal emphasize "journal" output.check
+ format.vol.num.pages output
+ }
+ { 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$
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ pages output %% March 11, 1990
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ howpublished output
+ address output
+ pages output %% March 11, 1990
+ 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$
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+%% format.chapter.pages "chapter and pages" output.check
+ pages output %% March 20, 1990
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+%% format.chapter.pages output %% March 20, 1990
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ format.edition output
+ pages output %% March 20, 1990
+ }
+ { 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
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+%% new.sentence %% March 17, 1990
+ organization output
+ publisher output
+ address output
+ pages output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ organization address new.block.checkb
+ organization output
+ address output
+ format.edition output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output % added
+ output.year.check % added
+ title howpublished new.block.checkb
+%% format.title output
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ howpublished output
+ pages output %% March 11, 1990
+%% new.block %% March 17, 1990
+ note output
+ fin.entry
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ format.bvolume output
+ format.number.series output
+ address output
+ new.sentence
+ organization output
+ publisher output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ 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"}
+
+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 { fullptr numfull fullsleft }
+
+STRINGS { u1 u2 }
+
+%FUNCTION {my.full.label}
+%{
+% "foo" 'u :=
+% u
+%}
+
+FUNCTION {my.full.label}
+{
+% Initialize 'u1','u2','s'.
+ "" 'u1 :=
+ "" 'u2 :=
+ 's :=
+
+% Initialize 'fullptr','numfull','fullsleft'.
+ #1 'fullptr :=
+ s num.names$ 'numfull :=
+ numfull 'fullsleft :=
+
+% enter the while loop which generates the first-citation information.
+% while we have names left,
+% format the next name
+% if this is the next-to-last name, tack the ampersand on the end
+% else if this isn't the last name, tack the comma on the end.
+% concatenate the next name onto the first-citation string.
+% update the counters.
+
+ { fullsleft #0 > }
+ { s fullptr "{vv~}{ll}" format.name$ 'u1 :=
+ fullsleft #2 =
+ { u1 " \& " * 'u1 := }
+ { fullsleft #2 >
+ { u1 ", " * 'u1 := }
+ 'skip$
+ if$
+ }
+ if$
+ u2 u1 * 'u2 :=
+ fullptr #1 + 'fullptr :=
+ fullsleft #1 - 'fullsleft :=
+ }
+ while$
+
+% push 'u2' onto the stack -- our first-citation information.
+ u2
+}
+
+FUNCTION {format.lab.names}
+{ 's :=
+ s #1 "{vv~}{ll}" format.name$
+ s num.names$ duplicate$
+ #2 >
+ { pop$ " et~al." * }
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { "et~al. " * }
+ { " and " * s #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ 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$
+}
+
+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 {calc.label}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label
+ 'author.key.label
+ if$
+ }
+ if$
+ duplicate$
+
+ author my.full.label % generate the first-citation information.
+
+ "\protect\citeauthoryear{" swap$ * "}{" * swap$ * "}{" *
+ year field.or.null purify$ #-1 #4 substring$ *
+ 'label :=
+ year field.or.null purify$ #-1 #4 substring$ *
+ 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{ }}{ 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 {editor.sort}
+{ editor empty$
+ { key empty$
+ { "to sort, need editor or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor 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 {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$ % added for newapa
+ 'sort.label := % added for newapa
+ sort.label % added for newapa
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+
+SORT % sort by label, sort.label, title --- for final label calculation
+
+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$
+ label extra.label * "}" * 'label :=
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.extra.label.stuff}
+
+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$ :=
+}
+
+ITERATE {bib.sort.order}
+
+SORT % by sort.label, year, title --- giving final bib. order.
+
+FUNCTION {begin.bib}
+
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{}" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/misc/jas99_m.bst b/obsolete/biblio/bibtex/contrib/misc/jas99_m.bst
new file mode 100644
index 0000000000..6b462051f2
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/misc/jas99_m.bst
@@ -0,0 +1,1365 @@
+% jas99_m.bst:
+% BibTeX style based on jas99.bst (Mike Moran, 1990, see below),
+% modified for better conformity to the American Meteorological
+% Society (AMS) style.
+%
+% Before distributing this file, I sent email to the original
+% author (Mike Moran) and the maintainer (Piotr J. Flatau) for
+% permission, but apparantly both email addresses listed below
+% were disabled and email messages I sent were bounced back.
+%
+% So, I make this modified file public without their permission,
+% since I guess they would grant it, as is usually the case for
+% this kind of files. If it's not OK to make this public, please
+% contact me.
+%
+% Undoubtedly there are remaining inconformities to the AMS
+% style, because I corrected only the features that I used.
+% If you find bugs, please let me know, although I cannot
+% promise that I would find time to fix it.
+%
+% Ryo Furue, Center for Climate System Research, U of Tokyo,
+% <furufuru@ccsr.u-tokyo.ac.jp>, 23 June 2000.
+%
+% =======================================================================
+% Attempted hack to create BibTeX `jas' style for BibTeX version 0.99c
+% Journal of Atmospheric Science, Journal of Applied Meteorology
+% Monthly Weather Review
+% by Mike Moran, Dept. of Atmospheric Science, Colorado State University
+% based on `newapa' style file. Changes are documented. March 9, 1990
+% Submitted 20-JUL-1993 by Piotr J. Flatau <pflatau@macao.ucsd.edu>
+% e-mail for Mike Moran: <mmoran@cid.aes.doe.ca>
+% ========================================================================
+%
+% BibTeX `newapa' style file for BibTeX version 0.99c, LaTeX version 2.09
+% Place it in a file called newapa.bst in the BibTeX search path.
+%(Placing it in the same directory as the LaTeX document should also work.)
+% Support for named citations is provided by named.sty
+
+% This version was made by modifying the master file made by
+% Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU), and the 'named' BibTeX
+% style of Peter F. Patel-Schneider.
+
+% Copyright (C) 1985, all rights reserved.
+% Modifications Copyright 1989, 1990, Stephen N. Spencer
+% 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.
+
+% There are undoubtably bugs in this style. If you make bug fixes,
+% improvements, etc. please let me know. My e-mail address is:
+% spencer@heinlein.cgrg.ohio.state.edu
+%
+% Citation format: (author-last-name, year)
+% (author-last-name and author-last-name, year)
+% (author-last-name {\em et al.}, year)
+% (author-last-name)
+% (author-last-name and author-last-name)
+% (author-last-name {\em et al.})
+% (year)
+%
+% Reference list ordering: alphabetical by author or whatever passes
+% for author in the absence of one.
+%
+% This BibTeX style has support for abbreviated author lists and for
+% year-only citations. This is done by having the citations
+% actually look like
+%
+% \citeauthoryear{full-author-info}{abbrev-author-info}{year}
+%
+% The LaTeX style has to have the following (or similar)
+%
+% \let\@internalcite\cite
+% \def\fullcite{\def\citeauthoryear##1##2##3{##1, ##3}\@internalcite}
+% \def\fullciteA{\def\citeauthoryear##1##2##3{##1}\@internalcite}
+% \def\shortcite{\def\citeauthoryear##1##2##3{##2, ##3}\@internalcite}
+% \def\shortciteA{\def\citeauthoryear##1##2##3{##2}\@internalcite}
+% \def\citeyear{\def\citeauthoryear##1##2##3{##3}\@internalcite}
+%
+
+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 u }
+
+%% Added this function March 9, 1990. Used in FUNCTION format.vol.num.pages
+FUNCTION {boldcize}
+{ 's :=
+ s "" =
+ { "" }
+ { "{\bf " s * "}" * }
+ if$
+}
+
+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
+}
+
+%% Added this entire function based on JAS98.BST (March 10, 1990)
+FUNCTION {output.nonnull1}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { write$ %% This is only difference
+ 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$
+}
+
+%% Added this function based on JAS98.BST (March 10, 1990)
+FUNCTION {output.check1}
+{ 't :=
+ duplicate$ empty$
+ { pop$ "empty " t * " in " * cite$ * warning$ }
+ 'output.nonnull1 %% Only difference
+ if$
+}
+
+FUNCTION {output.year.check}
+{ year empty$
+ { "empty year in " cite$ * warning$ }
+ { write$
+%% " (" year * extra.label * ") " *
+ ", " year * extra.label * ": " *
+%% March 9, 1990
+ mid.sentence 'output.state :=
+ }
+ 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$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+%% name format for names within an entry
+%% (for names *within* an entry, not for authors). %%Ryo%%
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr := % nameptr = 1;
+ s num.names$ 'numnames := % numnames = num.name$(s);
+ numnames 'namesleft :=
+ { namesleft #0 > }
+
+%%Ryo { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't :=
+ { 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 := % nameptr += 1;
+ namesleft #1 - 'namesleft := % namesleft =- 1;
+ }
+ while$
+}
+
+%% Added this entire function based on JAS98.BST (March 10, 1990)
+FUNCTION {format.names.reverse1}
+{ 's :=
+ #1 'nameptr := % nameptr = 1 (name pointer variable);
+ s num.names$ 'numnames := % numnames = num.name$(s);
+ numnames 'namesleft := % namesleft = numnames (names left variable);
+ { namesleft #0 > }
+
+%% So long as "namesleft" is positive, execute following function
+ {
+%% s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % Set name format
+
+ nameptr #1 >
+%% ** Co-authors section
+ {
+ s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := % Set name format
+ namesleft #1 >
+%% ** Not last author
+ { ", " * t * }
+%% ** Last author
+ { %% numnames #2 > %%Ryo
+ %% { "," * }
+ %% 'skip$
+ %%if$
+ "," *
+ t "others" =
+ { " et~al." * }
+ { " and " * t * }
+ if$
+ }
+ if$
+ }
+%% ** First author section
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % Set name format
+ t
+ }
+ if$
+ nameptr #1 + 'nameptr := % nameptr += 1;
+ namesleft #1 - 'namesleft := % namesleft =- 1;
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+%% { author format.names }
+ { author format.names.reverse1 }
+%% March 10, 1990
+ if$
+}
+
+FUNCTION {format.key}
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", Eds." * } %%Ryo%%
+ { ", Ed." * } %%Ryo%%
+ 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.btitle}
+{ 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 =
+ { "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$
+}
+
+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
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+%% { "pages" pages n.dashify tie.or.space.connect }
+%% { "page" pages tie.or.space.connect }
+ { pages n.dashify tie.or.space.connect }
+ { pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+%%{ volume field.or.null
+{volume field.or.null boldcize %% March 9, 1990
+ 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 * }
+ { ", " * pages n.dashify * } %% March 9, 1990
+ 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$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "" booktitle emphasize * } %%Ryo%%
+%% { "In " format.editors * ", " * booktitle emphasize * }
+ { "" booktitle emphasize * ", " * format.editors * } %%Ryo%%
+%% March 11, 1990
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+FUNCTION {format.article.crossref}
+{ "In"
+ "\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}
+{ "In"
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 10, 1990
+ new.block
+ crossref missing$
+ { journal emphasize "journal" output.check
+ format.vol.num.pages output
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+%%Ryo%% 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$
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+%%Ryo pages output %% March 11, 1990
+ pages " pp" * output
+ }
+ { new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ howpublished output
+ address output
+ pages output %% March 11, 1990
+ 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$
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ crossref missing$
+ { format.bvolume output
+ new.block
+ format.number.series output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+%% format.chapter.pages "chapter and pages" output.check
+ pages output %% March 20, 1990
+ }
+ { format.chapter.pages "chapter and pages" output.check
+ new.block
+ format.book.crossref output.nonnull
+ }
+ if$
+ format.edition output
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+%% format.chapter.pages output %% March 20, 1990
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ format.edition output
+ pages output %% March 20, 1990
+ }
+ { 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
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+%% new.sentence %% March 17, 1990
+ organization output
+ publisher output
+ address output
+ pages output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {conference} { inproceedings }
+
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ organization address new.block.checkb
+ organization output
+ address output
+ format.edition output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output % added
+ output.year.check % added
+ title howpublished new.block.checkb
+%% format.title output
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ howpublished output
+ pages output %% March 11, 1990
+%% new.block %% March 17, 1990
+ note output
+ fin.entry
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.btitle "title" output.check
+ format.btitle "title" output.check1 %% March 11, 1990
+ format.bvolume output
+ format.number.series output
+ address output
+ new.sentence
+ organization output
+ publisher output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ pages output %% March 11, 1990
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % added
+ output.year.check % added
+ new.block
+%% format.title "title" output.check
+ format.title "title" output.check1 %% March 11, 1990
+ new.block
+ 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"}
+
+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 { fullptr numfull fullsleft }
+
+STRINGS { u1 u2 }
+
+%FUNCTION {my.full.label}
+%{
+% "foo" 'u :=
+% u
+%}
+
+FUNCTION {my.full.label}
+{
+% Initialize 'u1','u2','s'.
+ "" 'u1 :=
+ "" 'u2 :=
+ 's :=
+
+% Initialize 'fullptr','numfull','fullsleft'.
+ #1 'fullptr :=
+ s num.names$ 'numfull :=
+ numfull 'fullsleft :=
+
+% enter the while loop which generates the first-citation information.
+% while we have names left,
+% format the next name
+% if this is the next-to-last name, tack the ampersand on the end
+% else if this isn't the last name, tack the comma on the end.
+% concatenate the next name onto the first-citation string.
+% update the counters.
+
+ { fullsleft #0 > }
+ { s fullptr "{vv~}{ll}" format.name$ 'u1 :=
+ fullsleft #2 =
+ { u1 " \& " * 'u1 := }
+ { fullsleft #2 >
+ { u1 ", " * 'u1 := }
+ 'skip$
+ if$
+ }
+ if$
+ u2 u1 * 'u2 :=
+ fullptr #1 + 'fullptr :=
+ fullsleft #1 - 'fullsleft :=
+ }
+ while$
+
+% push 'u2' onto the stack -- our first-citation information.
+ u2
+}
+
+FUNCTION {format.lab.names}
+{ 's :=
+ s #1 "{vv~}{ll}" format.name$
+ s num.names$ duplicate$
+ #2 >
+ { pop$ " et~al." * }
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { "et~al. " * }
+ { " and " * s #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key
+ 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$
+}
+
+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 {calc.label}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label
+ 'author.key.label
+ if$
+ }
+ if$
+ duplicate$
+
+ author my.full.label % generate the first-citation information.
+
+ "\protect\citeauthoryear{" swap$ * "}{" * swap$ * "}{" *
+ year field.or.null purify$ #-1 #4 substring$ *
+ 'label :=
+ year field.or.null purify$ #-1 #4 substring$ *
+ 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{ }}{ 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 {editor.sort}
+{ editor empty$
+ { key empty$
+ { "to sort, need editor or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor 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 {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$ % added for newapa
+ 'sort.label := % added for newapa
+ sort.label % added for newapa
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+
+ITERATE {presort}
+
+SORT % sort by label, sort.label, title --- for final label calculation
+
+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$
+ label extra.label * "}" * 'label :=
+ extra.label 'next.extra :=
+}
+
+EXECUTE {initialize.extra.label.stuff}
+
+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$ :=
+}
+
+ITERATE {bib.sort.order}
+
+SORT % by sort.label, year, title --- giving final bib. order.
+
+FUNCTION {begin.bib}
+
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{}" write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/misc/numalg.bst b/obsolete/biblio/bibtex/contrib/misc/numalg.bst
new file mode 100644
index 0000000000..697cd41974
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/misc/numalg.bst
@@ -0,0 +1,1370 @@
+%%% ====================================================================
+%%% @BibTeX-style-file{
+%%% filename = "numalg.bst",
+%%% version = "1.0",
+%%% date = "2003/06/30",
+%%% time = "00:00:00 CET",
+%%% author = "Richard J Mathar",
+%%% address = "Max Planck Institute of Astronomy,
+%%% Konigstuhl 17,
+%%% 69117 Heidelberg
+%%% Germany",
+%%% telephone = "(+49)6221-528-302",
+%%% FAX = "(+49)6221-528-246",
+%%% email = "mathar@mpia.de",
+%%% copyright = " This generated file can be redistributed and/or
+%%% modified under the terms of the LaTeX Project Public
+%%% License Distributed from CTAN archives in directory
+%%% macros/latex/base/lppl.txt; either version 1 of the
+%%% License, or any later version.",
+%%% codetable = "ISO/ASCII",
+%%% keywords = "bibtex, bibliography, Kluwer, Numerical Algorithms",
+%%% abstract = "BibTeX bibliography style `numalg' for BibTeX
+%%% versions 0.99a or later and LaTeX version 2e.
+%%% Produces items in a form close to the style
+%%% of Kluwer's Numerical Algorithms. For the generic
+%%% Kluwer styles see http://www.wkap.nl/authors/jrnlstylefiles/.",
+%%% docstring = "Produced by latex makebst.tex.
+%%% To be replaced by any official Kluwer file once
+%%% available."
+%%% }
+%%% ====================================================================
+
+%%
+%% This is file `numalg.bst',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% merlin.mbs (with options: `,nm-init,ed-au,yr-par,xmth,jttl-rm,vnum-x,volp-blk,jdt-vs,pgsep-s,pp-last,jnm-x,pub-date,pre-pub,url,url-blk,edby,edbyx,blk-com,in-col,pp,ed,abr,xedn,jabr,and-xcom,nfss')
+%% ----------------------------------------
+%% *** Kluwer Numerical Algorithms ***
+%%
+%% Copyright 1994-1999 Patrick W Daly
+ % ===============================================================
+ % IMPORTANT NOTICE:
+ % This bibliographic style (bst) file has been generated from one or
+ % more master bibliographic style (mbs) files, listed above.
+ %
+ % This generated file can be redistributed and/or modified under the terms
+ % of the LaTeX Project Public License Distributed from CTAN
+ % archives in directory macros/latex/base/lppl.txt; either
+ % version 1 of the License, or any later version.
+ % ===============================================================
+ % Name and version information of the main mbs file:
+ % \ProvidesFile{merlin.mbs}[1999/05/28 3.89 (PWD)]
+ % For use with BibTeX version 0.99a or later
+ %-------------------------------------------------------------------
+ % This bibliography style file is intended for texts in ENGLISH
+ % This is a numerical citation style, and as such is standard LaTeX.
+ % It requires no extra package to interface to the main text.
+ % The form of the \bibitem entries is
+ % \bibitem{key}...
+ % Usage of \cite is as follows:
+ % \cite{key} ==>> [#]
+ % \cite[chap. 2]{key} ==>> [#, chap. 2]
+ % where # is a number determined by the ordering in the reference list.
+ % The order in the reference list is alphabetical by authors.
+ %---------------------------------------------------------------------
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ url
+ volume
+ year
+ }
+ {}
+ { 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 {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 {add.blank}
+{ " " * before.all 'output.state :=
+}
+
+FUNCTION {date.block}
+{
+ skip$
+}
+
+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$ "" }
+ { "\emph{" swap$ * "}" * }
+ if$
+}
+
+
+FUNCTION {capitalize}
+{ "u" change.case$ "t" change.case$ }
+
+FUNCTION {space.word}
+{ " " swap$ * " " * }
+
+ % Here are the language-specific definitions for explicit words.
+ % Each function has a name bbl.xxx where xxx is the English word.
+ % The language selected here is ENGLISH
+FUNCTION {bbl.and}
+{ "and"}
+
+FUNCTION {bbl.etal}
+{ "et~al." }
+
+FUNCTION {bbl.editors}
+{ "eds." }
+
+FUNCTION {bbl.editor}
+{ "ed." }
+
+FUNCTION {bbl.edby}
+{ "edited by" }
+
+FUNCTION {bbl.edition}
+{ "edn." }
+
+FUNCTION {bbl.volume}
+{ "vol." }
+
+FUNCTION {bbl.of}
+{ "of" }
+
+FUNCTION {bbl.number}
+{ "no." }
+
+FUNCTION {bbl.nr}
+{ "no." }
+
+FUNCTION {bbl.in}
+{ "in" }
+
+FUNCTION {bbl.pages}
+{ "pp." }
+
+FUNCTION {bbl.page}
+{ "p." }
+
+FUNCTION {bbl.chapter}
+{ "chap." }
+
+FUNCTION {bbl.techrep}
+{ "Tech. Rep." }
+
+FUNCTION {bbl.mthesis}
+{ "Master's thesis" }
+
+FUNCTION {bbl.phdthesis}
+{ "Ph.D. thesis" }
+
+MACRO {jan} {"Jan."}
+
+MACRO {feb} {"Feb."}
+
+MACRO {mar} {"Mar."}
+
+MACRO {apr} {"Apr."}
+
+MACRO {may} {"May"}
+
+MACRO {jun} {"Jun."}
+
+MACRO {jul} {"Jul."}
+
+MACRO {aug} {"Aug."}
+
+MACRO {sep} {"Sep."}
+
+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."}
+
+
+FUNCTION {format.url}
+{ url empty$
+ { "" }
+ { "\urlprefix\url{" url * "}" * }
+ if$
+}
+
+INTEGERS { nameptr namesleft numnames }
+
+FUNCTION {format.names}
+{ 's :=
+ "" 't :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{f.~}{vv~}{ll}{, jj}" format.name$
+ 't :=
+ nameptr #1 >
+ {
+ namesleft #1 >
+ { ", " * t * }
+ {
+ s nameptr "{ll}" format.name$ duplicate$ "others" =
+ { 't := }
+ { pop$ }
+ if$
+ t "others" =
+ {
+ " " * bbl.etal *
+ }
+ { bbl.and
+ space.word * t *
+ }
+ if$
+ }
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.names.ed}
+{ format.names }
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+}
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ ", " *
+ editor num.names$ #1 >
+ 'bbl.editors
+ 'bbl.editor
+ if$
+ *
+ }
+ if$
+}
+
+FUNCTION {format.in.editors}
+{ editor empty$
+ { "" }
+ { editor format.names.ed
+ }
+ if$
+}
+
+FUNCTION {format.note}
+{
+ note empty$
+ { "" }
+ { note #1 #1 substring$
+ duplicate$ "{" =
+ 'skip$
+ { output.state mid.sentence =
+ { "l" }
+ { "u" }
+ if$
+ change.case$
+ }
+ if$
+ note #2 global.max$ substring$ *
+ }
+ if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$
+ }
+ if$
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+ "\bibitem{" write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+FUNCTION {if.digit}
+{ duplicate$ "0" =
+ swap$ duplicate$ "1" =
+ swap$ duplicate$ "2" =
+ swap$ duplicate$ "3" =
+ swap$ duplicate$ "4" =
+ swap$ duplicate$ "5" =
+ swap$ duplicate$ "6" =
+ swap$ duplicate$ "7" =
+ swap$ duplicate$ "8" =
+ swap$ "9" = or or or or or or or or or
+}
+FUNCTION {n.separate}
+{ 't :=
+ ""
+ #0 'numnames :=
+ { t empty$ not }
+ { t #-1 #1 substring$ if.digit
+ { numnames #1 + 'numnames := }
+ { #0 'numnames := }
+ if$
+ t #-1 #1 substring$ swap$ *
+ t #-2 global.max$ substring$ 't :=
+ numnames #5 =
+ { duplicate$ #1 #2 substring$ swap$
+ #3 global.max$ substring$
+ "\," swap$ * *
+ }
+ 'skip$
+ if$
+ }
+ while$
+}
+FUNCTION {n.dashify}
+{
+ n.separate
+ '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}
+{ bbl.in
+ ":" *
+ " " * }
+
+FUNCTION {format.date}
+{ year empty$
+ { "" }
+ 'year
+ if$
+ duplicate$ empty$
+ 'skip$
+ {
+ before.all 'output.state :=
+ " (" swap$ * ")" *
+ }
+ if$
+}
+
+FUNCTION{format.year}
+{ year duplicate$ empty$
+ { "empty year in " cite$ * warning$ pop$ "" }
+ { " (" swap$ * ")" * }
+ if$
+}
+
+FUNCTION {format.btitle}
+{ 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$
+ { "" }
+ { bbl.volume volume tie.or.space.connect
+ series empty$
+ 'skip$
+ { bbl.of space.word * 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 =
+ { bbl.number }
+ { bbl.number capitalize }
+ if$
+ number tie.or.space.connect
+ series empty$
+ { "there's a number but no series in " cite$ * warning$ }
+ { bbl.in space.word * series * }
+ if$
+ }
+ if$
+ }
+ { "" }
+ if$
+}
+
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " " * bbl.edition * }
+ { edition "t" change.case$ " " * bbl.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
+ { bbl.pages pages n.dashify tie.or.space.connect }
+ { bbl.page pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.journal.pages}
+{ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages }
+ {
+ " " *
+ pages n.dashify *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ format.year *
+}
+
+FUNCTION {format.chapter.pages}
+{ chapter empty$
+ { "" }
+ { type empty$
+ { bbl.chapter }
+ { type "l" change.case$ }
+ if$
+ chapter tie.or.space.connect
+ }
+ if$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { word.in booktitle emphasize * }
+ { word.in booktitle emphasize *
+ ", " *
+ editor num.names$ #1 >
+ { bbl.editors }
+ { bbl.editor }
+ if$
+ * " " *
+ format.in.editors *
+ }
+ 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$
+ { bbl.techrep }
+ '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$
+ ""
+ }
+ { word.in journal emphasize * }
+ if$
+ }
+ { word.in key * " " *}
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.crossref.editor}
+{ editor #1 "{vv~}{ll}" format.name$
+ editor num.names$ duplicate$
+ #2 >
+ { pop$
+ " " * bbl.etal *
+ }
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ {
+ " " * bbl.etal *
+ }
+ { bbl.and space.word * editor #2 "{vv~}{ll}" format.name$
+ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ word.in
+ }
+ { bbl.volume volume tie.or.space.connect
+ bbl.of space.word *
+ }
+ 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$
+ "" *
+ }
+ { series emphasize * }
+ 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$
+ ""
+ }
+ { word.in booktitle emphasize * }
+ if$
+ }
+ { word.in key * " " *}
+ if$
+ }
+ { word.in format.crossref.editor * " " *}
+ if$
+ " \cite{" * crossref * "}" *
+}
+
+FUNCTION {format.org.or.pub}
+{ 't :=
+ ""
+ year empty$
+ { "empty year in " cite$ * warning$ }
+ 'skip$
+ if$
+ address empty$ t empty$ and
+ year empty$ and
+ 'skip$
+ {
+ add.blank "(" *
+ t empty$
+ { address empty$
+ 'skip$
+ { address * }
+ if$
+ }
+ { t *
+ address empty$
+ 'skip$
+ { ", " * address * }
+ if$
+ }
+ if$
+ year empty$
+ 'skip$
+ { t empty$ address empty$ and
+ 'skip$
+ { ", " * }
+ if$
+ year *
+ }
+ if$
+ ")" *
+ }
+ if$
+}
+
+FUNCTION {format.publisher.address}
+{ publisher empty$
+ { "empty publisher in " cite$ * warning$
+ ""
+ }
+ { publisher }
+ if$
+ format.org.or.pub
+}
+
+FUNCTION {format.organization.address}
+{ organization empty$
+ { "" }
+ { organization }
+ if$
+ format.org.or.pub
+}
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ format.title "title" output.check
+ crossref missing$
+ { journal
+ "journal" output.check
+ add.blank
+ format.vol.num.pages output
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ format.journal.pages
+ format.url output
+ format.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$
+ format.btitle "title" output.check
+ crossref missing$
+ { format.bvolume output
+ format.number.series output
+ format.publisher.address output
+ }
+ {
+ format.book.crossref output.nonnull
+ format.date "year" output.check
+ }
+ if$
+ format.edition output
+ format.url output
+ format.note output
+ fin.entry
+}
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ format.title "title" output.check
+ howpublished output
+ address output
+ format.date output
+ format.url output
+ format.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$
+ format.btitle "title" output.check
+ crossref missing$
+ {
+ format.publisher.address output
+ format.bvolume output
+ format.chapter.pages "chapter and pages" output.check
+ format.number.series output
+ }
+ {
+ format.chapter.pages "chapter and pages" output.check
+ format.book.crossref output.nonnull
+ format.date "year" output.check
+ }
+ if$
+ format.edition output
+ format.pages "pages" output.check
+ format.url output
+ format.note output
+ fin.entry
+}
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ format.title "title" output.check
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ format.publisher.address output
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ format.edition output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ format.pages "pages" output.check
+ format.url output
+ format.note output
+ fin.entry
+}
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ format.title "title" output.check
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ publisher empty$
+ { format.organization.address output }
+ { organization output
+ format.publisher.address output
+ }
+ if$
+ format.bvolume output
+ format.number.series output
+ format.pages output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ format.url output
+ format.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$
+ format.btitle "title" output.check
+ author empty$
+ { organization empty$
+ {
+ address output
+ }
+ 'skip$
+ if$
+ }
+ {
+ organization output
+ address output
+ }
+ if$
+ format.edition output
+ format.date output
+ format.url output
+ format.note output
+ fin.entry
+}
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ format.btitle "title" output.check
+ bbl.mthesis format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ format.url output
+ format.note output
+ fin.entry
+}
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ format.title output
+ howpublished output
+ format.date output
+ format.url output
+ format.note output
+ fin.entry
+ empty.misc.check
+}
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ format.btitle "title" output.check
+ bbl.phdthesis format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ format.date "year" output.check
+ format.url output
+ format.note output
+ fin.entry
+}
+
+FUNCTION {proceedings}
+{ output.bibitem
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ editor empty$
+ { publisher empty$
+ 'skip$
+ {
+ format.publisher.address output
+ }
+ if$
+ }
+ { publisher empty$
+ {
+ format.organization.address output }
+ {
+ organization output
+ format.publisher.address output
+ }
+ if$
+ }
+ if$
+ format.url output
+ format.note output
+ fin.entry
+}
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ format.title "title" output.check
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ format.date "year" output.check
+ format.url output
+ format.note output
+ fin.entry
+}
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ format.title "title" output.check
+ format.date output
+ format.url output
+ format.note "note" output.check
+ fin.entry
+}
+
+FUNCTION {default.type} { misc }
+
+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$
+}
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr
+ "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}"
+ format.name$ 't :=
+ nameptr #1 >
+ {
+ " " *
+ namesleft #1 = t "others" = and
+ { "zzzzz" * }
+ { t sortify * }
+ if$
+ }
+ { 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$
+ "\expandafter\ifx\csname url\endcsname\relax"
+ write$ newline$
+ " \def\url#1{\texttt{#1}}\fi"
+ write$ newline$
+ "\expandafter\ifx\csname urlprefix\endcsname\relax\def\urlprefix{URL }\fi"
+ write$ newline$
+}
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
+%% End of customized bst file
+%%
+%% End of file `numalg.bst'.
diff --git a/obsolete/biblio/bibtex/contrib/nature.bst b/obsolete/biblio/bibtex/contrib/nature.bst
new file mode 100644
index 0000000000..4d23240bdf
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/nature.bst
@@ -0,0 +1,1012 @@
+% version = 1.05 of nature.bst 1992 June 29
+
+% 1.01 1991 July 3 last name first
+% bold face volume numbers
+% volume followed by comma, not colon
+% parenthesis around year
+% no comma after page numbers (not done yet!)
+% 1.02 1991 Aug 7 Titles removed in FUNCTION {format.title}.
+% (Should put \nocite{TitlesOn}
+% mechanism in from jmb.bst next)
+% 1.03 1991 Aug 29 in inproceedings, book title preceeds the editors!!
+% 1.04 1991 Aug 30 year at end of inproceedings
+% no 'pages' in inproceedings
+% when no comma, don't put space instead
+% 1.04 1992 Jun 29 Fix format.vol.num.pages to use field.or.null to
+% correctly handle case of missing volume.
+% [Nelson H. F. Beebe <beebe@plot79.math.utah.edu>]
+
+% from:
+% BibTeX standard bibliography style `unsrt'
+ % 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.
+ % The file btxbst.doc has the documentation for this style.
+
+ENTRY
+ { address
+ author
+ booktitle
+ chapter
+ edition
+ editor
+ howpublished
+ institution
+ journal
+ key
+ month
+ note
+ number
+ organization
+ pages
+ publisher
+ school
+ series
+ title
+ type
+ volume
+ year
+ }
+ {}
+ { label }
+
+INTEGERS { output.state before.all mid.sentence after.sentence after.block
+ docomma }
+
+FUNCTION {init.state.consts}
+{ #0 'before.all :=
+ #1 'mid.sentence :=
+ #2 'after.sentence :=
+ #3 'after.block :=
+
+ #1 'docomma := % if it is 0 then don't do commas, otherwise do them.
+}
+
+STRINGS { s t }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { % doing a comma is controlled specifically using docomma
+ docomma #0 =
+ { "" * write$ } % TDS nothing if no comma
+ { ", " * write$ }
+ if$
+ }
+ { 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 "{ff~}{vv~}{ll}{, jj}" format.name$ 't := % TDS
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+ 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$
+ { "" }
+ { "" } % the zapped title
+% { title "t" change.case$ } % TDS NO TITLES
+ 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 % TDS
+% { month " " * year * } % TDS
+ { " (" year * ")" * }
+ { " " month * " " * " (" year * ")" * * }
+%The preceding line was modified by Alan Rogers on 6/26/92. It used to
+%look like this: { month " " * " (" year * ")" * * }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.btitle}
+{ 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 =
+ { "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$
+}
+
+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
+}
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+% { "pages" pages n.dashify tie.or.space.connect }
+% { "page" pages tie.or.space.connect }
+% no word in nature!
+ { "" pages n.dashify tie.or.space.connect }
+ { "" pages tie.or.space.connect }
+ if$
+ }
+ if$
+}
+
+FUNCTION {format.vol.num.pages}
+{ "{ \bf " volume field.or.null * "}" * % make volume bold face
+ 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 * } % TDS
+ { ", " * pages n.dashify * } % comma, not colon TDS
+ 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$
+}
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "In " booktitle emphasize * }
+% { "In " format.editors * ", " * booktitle emphasize * }
+ { % book title preceeds the editors!! TDS
+ "In "
+ booktitle
+ ", "
+ *
+ emphasize
+ *
+ format.editors
+ *
+ }
+ if$
+ }
+ if$
+}
+
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and 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$
+ { "Technical Report" }
+ '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." * }
+ { " 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 * "}" *
+}
+
+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
+ #0 'docomma := % TURN COMMAS OFF
+ format.vol.num.pages output % these now do their own comma!!
+ format.date "year" output.check
+ #1 'docomma := % TURN COMMAS ON
+ }
+ { 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.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
+ 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.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
+ #0 'docomma := % TURN COMMAS OFF
+ format.date "year" output.check
+ #1 'docomma := % TURN COMMAS ON
+ 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 "booktitle" output.check
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ #0 'docomma := % TURN COMMAS OFF
+ format.edition output
+ format.date "year" output.check
+ #1 'docomma := % TURN COMMAS ON
+ }
+ { 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.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
+ }
+ {
+% new.sentence
+ #0 'docomma := % TURN COMMAS OFF
+ " (" output.nonnull
+ organization output
+ publisher output
+ #1 'docomma := % TURN COMMAS ON
+ address output.nonnull
+% year is at the end TDS
+% format.date "year" output.check
+%zzz
+ year ")" * 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.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
+ 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.title 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.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$
+ 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
+ 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} {"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"}
+
+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
+
+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}
diff --git a/obsolete/biblio/bibtex/contrib/nature.sty b/obsolete/biblio/bibtex/contrib/nature.sty
new file mode 100644
index 0000000000..0283f33d7d
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/nature.sty
@@ -0,0 +1,241 @@
+% article.sty 16-Mar-88
+
+\typeout{Document Style `article' <16 Mar 88>.}
+
+
+\def\@ptsize{0} \@namedef{ds@11pt}{\def\@ptsize{1}}
+\@namedef{ds@12pt}{\def\@ptsize{2}}
+\def\ds@twoside{\@twosidetrue \@mparswitchtrue} \def\ds@draft{\overfullrule
+5pt}
+\@options
+\input art1\@ptsize.sty\relax
+
+
+\def\labelenumi{\theenumi.}
+\def\theenumi{\arabic{enumi}}
+\def\labelenumii{(\theenumii)}
+\def\theenumii{\alph{enumii}}
+\def\p@enumii{\theenumi}
+\def\labelenumiii{\theenumiii.}
+\def\theenumiii{\roman{enumiii}}
+\def\p@enumiii{\theenumi(\theenumii)}
+\def\labelenumiv{\theenumiv.}
+\def\theenumiv{\Alph{enumiv}}
+\def\p@enumiv{\p@enumiii\theenumiii}
+
+\def\labelitemi{$\bullet$}
+\def\labelitemii{\bf --}
+\def\labelitemiii{$\ast$}
+\def\labelitemiv{$\cdot$}
+
+\def\verse{\let\\=\@centercr
+ \list{}{\itemsep\z@ \itemindent -1.5em\listparindent \itemindent
+ \rightmargin\leftmargin\advance\leftmargin 1.5em}\item[]}
+\let\endverse\endlist
+\def\quotation{\list{}{\listparindent 1.5em
+ \itemindent\listparindent
+ \rightmargin\leftmargin \parsep 0pt plus 1pt}\item[]}
+\let\endquotation=\endlist
+\def\quote{\list{}{\rightmargin\leftmargin}\item[]}
+\let\endquote=\endlist
+
+\def\descriptionlabel#1{\hspace\labelsep \bf #1}
+\def\description{\list{}{\labelwidth\z@ \itemindent-\leftmargin
+ \let\makelabel\descriptionlabel}}
+\let\enddescription\endlist
+
+
+\def\theequation{\arabic{equation}}
+
+
+\def\titlepage{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
+ \else \newpage \fi \thispagestyle{empty}\c@page\z@}
+\def\endtitlepage{\if@restonecol\twocolumn \else \newpage \fi}
+
+\arraycolsep 5pt \tabcolsep 6pt \arrayrulewidth .4pt \doublerulesep 2pt
+\tabbingsep \labelsep
+
+\skip\@mpfootins = \skip\footins
+\fboxsep = 3pt \fboxrule = .4pt
+
+\newcounter{part}
+\newcounter {section}
+\newcounter {subsection}[section]
+\newcounter {subsubsection}[subsection]
+\newcounter {paragraph}[subsubsection]
+\newcounter {subparagraph}[paragraph]
+
+\def\thepart{\Roman{part}} \def\thesection {\arabic{section}}
+\def\thesubsection {\thesection.\arabic{subsection}}
+\def\thesubsubsection {\thesubsection .\arabic{subsubsection}}
+\def\theparagraph {\thesubsubsection.\arabic{paragraph}}
+\def\thesubparagraph {\theparagraph.\arabic{subparagraph}}
+
+\def\@pnumwidth{1.55em}
+\def\@tocrmarg {2.55em}
+\def\@dotsep{4.5}
+\setcounter{tocdepth}{3}
+
+\def\tableofcontents{\section*{Contents\@mkboth{CONTENTS}{CONTENTS}}
+ \@starttoc{toc}}
+\def\l@part#1#2{\addpenalty{\@secpenalty}
+ \addvspace{2.25em plus 1pt} \begingroup
+ \@tempdima 3em \parindent \z@ \rightskip \@pnumwidth \parfillskip
+-\@pnumwidth
+ {\large \bf \leavevmode #1\hfil \hbox to\@pnumwidth{\hss #2}}\par
+ \nobreak \endgroup}
+\def\l@section#1#2{\addpenalty{\@secpenalty} \addvspace{1.0em plus 1pt}
+\@tempdima 1.5em \begingroup
+ \parindent \z@ \rightskip \@pnumwidth
+ \parfillskip -\@pnumwidth
+ \bf \leavevmode \advance\leftskip\@tempdima \hskip -\leftskip #1\nobreak\hfil
+\nobreak\hbox to\@pnumwidth{\hss #2}\par
+ \endgroup}
+
+\def\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}}
+\def\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}}
+\def\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}}
+\def\l@subparagraph{\@dottedtocline{5}{10em}{5em}}
+\def\listoffigures{\section*{List of Figures\@mkboth
+ {LIST OF FIGURES}{LIST OF FIGURES}}\@starttoc{lof}}
+\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}}
+\def\listoftables{\section*{List of Tables\@mkboth
+ {LIST OF TABLES}{LIST OF TABLES}}\@starttoc{lot}}
+\let\l@table\l@figure
+
+
+% \def\thebibliography#1{\section*{MyReferences\@mkboth
+\def\thebibliography#1{\section*{\@mkboth
+ {REFERENCES}{REFERENCES}}\list
+% {[\arabic{enumi}]}{\settowidth\labelwidth{[#1]}\leftmargin\labelwidth
+ {\arabic{enumi}.}{\settowidth\labelwidth{[#1]}\leftmargin\labelwidth
+ \advance\leftmargin\labelsep
+ \usecounter{enumi}}
+ \def\newblock{\hskip .11em plus .33em minus .07em}
+ \sloppy\clubpenalty4000\widowpenalty4000
+ \sfcode`\.=1000\relax}
+\let\endthebibliography=\endlist
+
+
+\newif\if@restonecol
+\def\theindex{\@restonecoltrue\if@twocolumn\@restonecolfalse\fi
+\columnseprule \z@
+\columnsep 35pt\twocolumn[\section*{Index}]
+ \@mkboth{INDEX}{INDEX}\thispagestyle{plain}\parindent\z@
+ \parskip\z@ plus .3pt\relax\let\item\@idxitem}
+\def\@idxitem{\par\hangindent 40pt}
+\def\subitem{\par\hangindent 40pt \hspace*{20pt}}
+\def\subsubitem{\par\hangindent 40pt \hspace*{30pt}}
+\def\endtheindex{\if@restonecol\onecolumn\else\clearpage\fi}
+\def\indexspace{\par \vskip 10pt plus 5pt minus 3pt\relax}
+
+\def\footnoterule{\kern-3\p@
+ \hrule width .4\columnwidth
+ \kern 2.6\p@}
+
+\long\def\@makefntext#1{\parindent 1em\noindent
+ \hbox to 1.8em{\hss$^{\@thefnmark}$}#1}
+
+
+\setcounter{topnumber}{2}
+\def\topfraction{.7}
+\setcounter{bottomnumber}{1}
+\def\bottomfraction{.3}
+\setcounter{totalnumber}{3}
+\def\textfraction{.2}
+\def\floatpagefraction{.5}
+\setcounter{dbltopnumber}{2}
+\def\dbltopfraction{.7}
+\def\dblfloatpagefraction{.5}
+
+\long\def\@makecaption#1#2{
+ \vskip 10pt
+ \setbox\@tempboxa\hbox{#1: #2}
+ \ifdim \wd\@tempboxa >\hsize #1: #2\par \else \hbox
+to\hsize{\hfil\box\@tempboxa\hfil}
+ \fi}
+
+
+\newcounter{figure}
+\def\thefigure{\@arabic\c@figure}
+\def\fps@figure{tbp}
+\def\ftype@figure{1}
+\def\ext@figure{lof}
+\def\fnum@figure{Figure \thefigure}
+\def\figure{\@float{figure}}
+\let\endfigure\end@float
+\@namedef{figure*}{\@dblfloat{figure}}
+\@namedef{endfigure*}{\end@dblfloat}
+\newcounter{table}
+\def\thetable{\@arabic\c@table}
+\def\fps@table{tbp}
+\def\ftype@table{2}
+\def\ext@table{lot}
+\def\fnum@table{Table \thetable}
+\def\table{\@float{table}}
+\let\endtable\end@float
+\@namedef{table*}{\@dblfloat{table}}
+\@namedef{endtable*}{\end@dblfloat}
+
+
+\def\maketitle{\par
+ \begingroup
+ \def\thefootnote{\fnsymbol{footnote}}
+ \def\@makefnmark{\hbox
+ to 0pt{$^{\@thefnmark}$\hss}}
+ \if@twocolumn
+ \twocolumn[\@maketitle]
+ \else \newpage
+ \global\@topnum\z@ \@maketitle \fi\thispagestyle{plain}\@thanks
+ \endgroup
+ \setcounter{footnote}{0}
+ \let\maketitle\relax
+ \let\@maketitle\relax
+ \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\let\thanks\relax}
+\def\@maketitle{\newpage
+ \null
+ \vskip 2em \begin{center}
+ {\LARGE \@title \par} \vskip 1.5em {\large \lineskip .5em
+\begin{tabular}[t]{c}\@author
+ \end{tabular}\par}
+ \vskip 1em {\large \@date} \end{center}
+ \par
+ \vskip 1.5em}
+\def\abstract{\if@twocolumn
+\section*{Abstract}
+\else \small
+\begin{center}
+{\bf Abstract\vspace{-.5em}\vspace{0pt}}
+\end{center}
+\quotation
+\fi}
+\def\endabstract{\if@twocolumn\else\endquotation\fi}
+
+\mark{{}{}}
+
+\if@twoside \def\ps@headings{\let\@mkboth\markboth
+\def\@oddfoot{}\def\@evenfoot{}\def\@evenhead{\rm \thepage\hfil \sl
+\leftmark}\def\@oddhead{\hbox{}\sl \rightmark \hfil
+\rm\thepage}\def\sectionmark##1{\markboth {\uppercase{\ifnum \c@secnumdepth
+>\z@
+ \thesection\hskip 1em\relax \fi ##1}}{}}\def\subsectionmark##1{\markright
+{\ifnum \c@secnumdepth >\@ne
+ \thesubsection\hskip 1em\relax \fi ##1}}}
+\else \def\ps@headings{\let\@mkboth\markboth
+\def\@oddfoot{}\def\@evenfoot{}\def\@oddhead{\hbox {}\sl \rightmark \hfil
+\rm\thepage}\def\sectionmark##1{\markright {\uppercase{\ifnum \c@secnumdepth
+>\z@
+ \thesection\hskip 1em\relax \fi ##1}}}}
+\fi
+\def\ps@myheadings{\let\@mkboth\@gobbletwo
+\def\@oddhead{\hbox{}\sl\rightmark \hfil
+\rm\thepage}\def\@oddfoot{}\def\@evenhead{\rm \thepage\hfil\sl\leftmark\hbox
+{}}\def\@evenfoot{}\def\sectionmark##1{}\def\subsectionmark##1{}}
+
+
+\def\today{\ifcase\month\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\fi
+ \space\number\day, \number\year}
+
+\ps@plain \pagenumbering{arabic} \onecolumn \if@twoside\else\raggedbottom\fi
diff --git a/obsolete/biblio/bibtex/contrib/phaip.bst b/obsolete/biblio/bibtex/contrib/phaip.bst
new file mode 100644
index 0000000000..4c138d904b
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phaip.bst
@@ -0,0 +1,1885 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % For American Institute of Physics Journals
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 0: an alphabetic label is used (if false then a numeric
+% label is used)
+% 0: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 1: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 0: months are spelled out in full (if false, then
+% they're abbreviated)
+% 0: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+ month
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+STRINGS { s t }
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { "," * 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 :=
+}
+% This function finishes all entries.
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ skip$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% The new.sentence.check functions are analogous.
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+FUNCTION {paren}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "(" swap$ * ")" * }
+ if$
+}
+INTEGERS { nameptr namesleft numnames }
+INTEGERS { etal }
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames #5 >
+ s numnames "{ll}" format.name$ "others" = numnames #1 > and
+ or 'etal :=
+ etal
+ { #1 #1 + 'namesleft := }
+ { numnames 'namesleft := }
+ if$
+ { namesleft #0 > }
+ { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { nameptr #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ etal or
+ { " 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.edited}
+{ editor empty$
+ { "" }
+ { "edited by " editor format.names * }
+ if$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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 {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+FUNCTION {format.date}
+{ year empty$
+ { "" }
+ 'year
+ if$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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.a}
+{ pages empty$
+ { "" }
+ { "page" pages first.page tie.or.space.connect }
+ if$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null embolden
+ " " swap$ * *
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages.a }
+ { ", " * pages first.page * }
+ if$
+ }
+ if$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "in " booktitle emphasize * }
+ { "in " booktitle emphasize * ", " * format.edited * }
+ if$
+ }
+ if$
+}
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "In " journal * }
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+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$
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+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 * "}" *
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+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 * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ crossref missing$
+ { journal field.or.null
+ format.vol.num.pages
+ format.date empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.date paren }
+ { " " * format.date paren * }
+ if$
+ }
+ if$
+ output
+ }
+ { 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.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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+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
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+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
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+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
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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."}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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."}
+%% /usr/local/lib/tex/bibtex/phyjfull.btx, Tue Jun 30 08:37:48 1992
+%% Edit by Nelson H. F. Beebe <beebe@alfred.math.utah.edu>
+%% Change file names in leading comment
+% Journal Title Abbreviations from the Physical Review Style and Notation
+% Guide, July, 1983, in BAPS Vol. 28.
+% Selected by Cris Barnes and Charles Karney, March 1988
+% IMPORTANT!! Don't make changes to this file without making the
+% corresponding changes to
+% phyjabb.bib
+% phyjabb.btx
+MACRO {advp} {"Advances in Physics"}
+MACRO {ajp} {"American Journal of Physics"}
+MACRO {ao} {"Applied Optics"}
+MACRO {apl} {"Applied Physics Letters"}
+MACRO {apj} {"Astrophysical Journal"}
+MACRO {baps} {"Bulletin of the American Physical Society"}
+MACRO {cpc} {"Computer Physics Communications"}
+MACRO {cppcf} {"Comments on Plasma Physics and Controlled Fusion"}
+MACRO {fed} {"Fusion Engineering and Design"}
+MACRO {ft} {"Fusion Technology"}
+MACRO {ieeens} {"IEEE Transactions on Nuclear Science"}
+MACRO {ieeeps} {"IEEE Transactions on Plasma Science"}
+MACRO {ijimw} {"International Journal of Infrared and Millimeter Waves"}
+MACRO {ip} {"Infrared Physics"}
+MACRO {jap} {"Journal of Applied Physics"}
+MACRO {jcp} {"Journal of Computational Physics"}
+MACRO {jetp} {"Soviet Physics-JETP"}
+MACRO {jfe} {"Journal of Fusion Energy"}
+MACRO {jfm} {"Journal of Fluid Mechanics"}
+MACRO {jgr} {"Journal of Geophysical Research"}
+MACRO {jmp} {"Journal of Mathematical Physics"}
+MACRO {jne} {"Journal of Nuclear Energy"}
+MACRO {jnec} {"Journal of Nuclear Energy, Part C: Plasma Physics, Accelerators, Thermonuclear Research"}
+MACRO {jnm} {"Journal of Nuclear Materials"}
+MACRO {josa} {"Journal of the Optical Society of America"}
+MACRO {jpp} {"Journal of Plasma Physics"}
+MACRO {jpsj} {"Journal of the Physical Society of Japan"}
+MACRO {jvst} {"Journal of Vacuum Science and Technology"}
+MACRO {nedf} {"Nuclear Engineering and Design/Fusion"}
+MACRO {nf} {"Nuclear Fusion"}
+MACRO {nim} {"Nuclear Instruments and Methods"}
+MACRO {nimpr} {"Nuclear Instruments and Methods in Physics Research"}
+MACRO {nt/f} {"Nuclear Technology/Fusion"}
+MACRO {pf} {"Physics of Fluids"}
+MACRO {pfa} {"Physics of Fluids A: Fluid Dynamics"}
+MACRO {pfb} {"Physics of Fluids B: Plasma Physics"}
+MACRO {pl} {"Physics Letters"}
+MACRO {pla} {"Physics Letters A"}
+MACRO {pnas} {"Proceedings of the National Academy of Sciences of the USA"}
+MACRO {pp} {"Plasma Physics"}
+MACRO {ppcf} {"Plasma Physics and Controlled Fusion"}
+MACRO {prl} {"Physical Review Letters"}
+MACRO {pr} {"Physical Review"}
+MACRO {pra} {"Physical Review A: General Physics"}
+MACRO {ps} {"Physica Scripta"}
+MACRO {rmp} {"Reviews of Modern Physics"}
+MACRO {rsi} {"Review of Scientific Instruments"}
+MACRO {sjpp} {"Soviet Journal of Plasma Phys."}
+MACRO {spd} {"Soviet Physics-Doklady"}
+MACRO {sptp} {"Soviet Physics-Technical Physics"}
+MACRO {spu} {"Soviet Physics-Uspeki"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+% Now comes the computation for numeric labels.
+% We use either the sorted order or original order.
+% We still have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+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}
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" * write$ newline$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/phapalik.bst b/obsolete/biblio/bibtex/contrib/phapalik.bst
new file mode 100644
index 0000000000..84a0dda965
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phapalik.bst
@@ -0,0 +1,1943 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % For American Psychological Association
+ % (same as ALPHA but with 0 set and 0 unset)
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% BibTeX `apalike' bibliography style (24-Jan-88 version)
+% Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a.
+% Copyright (C) 1988, all rights reserved.
+% Copying of this file is allowed, provided that if you make any changes at all
+% you name it something other than `apalike.bst'.
+% This restriction helps ensure that all copies are identical.
+% Differences between this style and `alpha' are generally heralded by a `%'.
+% The file btxbst.doc has the documentation for alpha.bst.
+%
+% This style should be used with the `apalike' LaTeX style (apalike.sty).
+% \cite's come out like "(Jones, 1986)" in the text but there are no labels
+% in the bibliography, and something like "(1986)" comes out immediately
+% after the author. Author (and editor) names appear as last name, comma,
+% initials. A `year' field is required for every entry, and so is either
+% an author (or in some cases, an editor) field or a key field.
+%
+% Editorial note:
+% Many journals require a style like `apalike', but I strongly, strongly,
+% strongly recommend that you not use it if you have a choice---use something
+% like `plain' instead. Mary-Claire van Leunen (A Handbook for Scholars,
+% Knopf, 1979) argues convincingly that a style like `plain' encourages better
+% writing than one like `apalike'. Furthermore the strongest arguments for
+% using an author-date style like `apalike'---that it's "the most practical"
+% (The Chicago Manual of Style, University of Chicago Press, thirteenth
+% edition, 1982, pages 400--401)---fall flat on their face with the new
+% computer-typesetting technology. For instance page 401 anachronistically
+% states "The chief disadvantage of [a style like `plain'] is that additions
+% or deletions cannot be made after the manuscript is typed without changing
+% numbers in both text references and list." LaTeX sidesteps the disadvantage.
+%
+% History:
+% 15-sep-86 (SK,OP) Original version, by Susan King and Oren Patashnik.
+% 10-nov-86 (OP) Truncated the sort.key$ string to the correct length
+% in bib.sort.order to eliminate error message.
+% 24-jan-88 (OP) Updated for BibTeX version 0.99a, from alpha.bst 0.99a;
+% apalike now sorts by author, then year, then title;
+% THIS `apalike' VERSION DOES NOT WORK WITH BIBTEX 0.98i.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 1: an alphabetic label is used (if false then a numeric
+% label is used)
+% 1: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 1: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 1: months are spelled out in full (if false, then
+% they're abbreviated)
+% 1: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+% month not used in apalike
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label extra.label sort.label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+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$
+}
+% apalike needs this function because
+% the year has special punctuation;
+% apalike ignores the month
+FUNCTION {output.year.check}
+{ year empty$
+ { "empty year in " cite$ * warning$ }
+ { write$
+ " (" year * extra.label * ")" *
+ mid.sentence 'output.state :=
+ }
+ if$
+}
+FUNCTION {output.bibitem}
+{ newline$
+ "\bibitem[" write$
+ label write$
+ "]{" write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+% This function finishes all entries.
+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$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+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 "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+ 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.key} % this function is just for apalike
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", editors" * }
+ { ", editor" * }
+ if$
+ }
+ if$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null
+ 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$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "In " booktitle emphasize * }
+ { "In " format.editors * ", " * booktitle emphasize * }
+ if$
+ }
+ if$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ "In" % this is for apalike
+ " \cite{" * crossref * "}" *
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In "
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+ "\cite{" * crossref * "}" * % this is for apalike
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+FUNCTION {format.incoll.inproc.crossref}
+{ "In" % this is for apalike
+ " \cite{" * crossref * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { journal emphasize "journal" output.check
+ format.vol.num.pages output
+ }
+ { 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
+ editor format.key output
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ output.year.check % special for apalike
+ 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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ howpublished output
+ address output
+ new.block
+ note output
+ fin.entry
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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$
+ output.year.check % special for apalike
+ 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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ 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.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ 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 output % for apalike
+ new.sentence % there's no year
+ organization output % here so things
+ publisher output % are simpler
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ organization address new.block.checkb
+ organization output
+ address output
+ format.edition output
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title output
+ new.block
+ howpublished output
+ new.block
+ note output
+ fin.entry
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+FUNCTION {proceedings}
+{ output.bibitem
+ format.editors output
+ editor format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ address output % for apalike
+ new.sentence % we always output
+ organization output % a nonempty organization
+ publisher output % here
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ note "note" output.check
+ fin.entry
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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"}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+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$
+}
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+% There are three apalike cases: one person (Jones),
+% two (Jones and de~Bruijn), and more (Jones et~al.).
+% This function is much like format.crossref.editors.
+%
+FUNCTION {format.lab.names}
+{ 's :=
+ s #1 "{vv~}{ll}" format.name$
+ s num.names$ duplicate$
+ #2 >
+ { pop$ " et~al." * }
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al." * }
+ { " and " * s #2 "{vv~}{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key % apalike uses the whole key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key % apalike uses the whole 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 % apalike uses the whole key, no organization
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+FUNCTION {calc.label}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label % apalike ignores organization
+ 'author.key.label % for labeling and sorting
+ if$
+ }
+ if$
+ ", " % these three lines are
+ * % for apalike, which
+ year field.or.null purify$ #-1 #4 substring$ % uses all four digits
+ *
+ 'label :=
+}
+% It doesn't seem like a particularly good idea to use an order-of-citation
+% reference list when using alphabetic labels, but we need to have a
+% special pass to calculate labels when this happens.
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$ % apalike uses initials
+ s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here
+ nameptr numnames = t "others" = and
+ { "et al" * }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+% The sort.format.title function returns the argument,
+% but first any leading "A "'s, "An "'s, or "The "'s are removed.
+% The chop.word function uses s, so we need another string variable, t
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+% The auxiliary functions here, for the presort function, are analogous to
+% the ones for calc.label; the same comments apply, except that the
+% organization field takes precedence here over the key field. For sorting
+% purposes, we still remove a leading "The " from the organization field.
+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$
+}
+% apalike uses two sorting passes; the first one sets the
+% labels so that the `a's, `b's, etc. can be computed;
+% the second pass puts the references in "correct" order.
+% The presort function is for the first pass. It computes
+% label, sort.label, and title, and then concatenates.
+FUNCTION {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$ % for
+ 'sort.label := % apalike
+ sort.label % style
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+ITERATE {presort}
+% And now we can sort
+SORT % by label, sort.label, title---for final label calculation
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+STRINGS { last.label next.extra } % apalike labels are only for the text;
+INTEGERS { last.extra.num } % there are none in the bibliography
+FUNCTION {initialize.extra.label.stuff} % and hence there is no `longest.label'
+{ #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$
+ label extra.label * 'label :=
+ extra.label 'next.extra :=
+}
+EXECUTE {initialize.extra.label.stuff}
+ITERATE {forward.pass}
+REVERSE {reverse.pass}
+% Now that the label is right we sort for real,
+% on sort.label then year then title. This is
+% for the second sorting 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$ :=
+}
+ITERATE {bib.sort.order}
+SORT % by sort.label, year, title---giving final bibliography order
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+FUNCTION {begin.bib}
+{ preamble$ empty$ % no \etalchar in apalike
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{}" write$ newline$ % no labels in apalike
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/phcpc.bst b/obsolete/biblio/bibtex/contrib/phcpc.bst
new file mode 100644
index 0000000000..e313fe16af
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phcpc.bst
@@ -0,0 +1,1885 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % For Computer Physics Communications
+% same as AIP except for 0, 0
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 0: an alphabetic label is used (if false then a numeric
+% label is used)
+% 0: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 1: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 0: months are spelled out in full (if false, then
+% they're abbreviated)
+% 0: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+ month
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+STRINGS { s t }
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { "," * 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 :=
+}
+% This function finishes all entries.
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ skip$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% The new.sentence.check functions are analogous.
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+FUNCTION {paren}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "(" swap$ * ")" * }
+ if$
+}
+INTEGERS { nameptr namesleft numnames }
+INTEGERS { etal }
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames #5 >
+ s numnames "{ll}" format.name$ "others" = numnames #1 > and
+ or 'etal :=
+ etal
+ { #1 #1 + 'namesleft := }
+ { numnames 'namesleft := }
+ if$
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { nameptr #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ etal or
+ { " 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.edited}
+{ editor empty$
+ { "" }
+ { "edited by " editor format.names * }
+ if$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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 {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+FUNCTION {format.date}
+{ year empty$
+ { "" }
+ 'year
+ if$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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.a}
+{ pages empty$
+ { "" }
+ { "page" pages first.page tie.or.space.connect }
+ if$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null embolden
+ " " swap$ * *
+ format.date empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.date paren }
+ { " " * format.date paren * }
+ if$
+ }
+ if$
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages.a }
+ { " " * pages first.page *}
+ if$
+ }
+ if$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "in " booktitle emphasize * }
+ { "in " booktitle emphasize * ", " * format.edited * }
+ if$
+ }
+ if$
+}
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "In " journal * }
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+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$
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+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 * "}" *
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+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 * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ crossref missing$
+ { journal field.or.null
+ format.vol.num.pages output
+ }
+ { 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.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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+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
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+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
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+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
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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."}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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."}
+%% /usr/local/lib/tex/bibtex/phyjfull.btx, Tue Jun 30 08:37:48 1992
+%% Edit by Nelson H. F. Beebe <beebe@alfred.math.utah.edu>
+%% Change file names in leading comment
+% Journal Title Abbreviations from the Physical Review Style and Notation
+% Guide, July, 1983, in BAPS Vol. 28.
+% Selected by Cris Barnes and Charles Karney, March 1988
+% IMPORTANT!! Don't make changes to this file without making the
+% corresponding changes to
+% phyjabb.bib
+% phyjabb.btx
+MACRO {advp} {"Advances in Physics"}
+MACRO {ajp} {"American Journal of Physics"}
+MACRO {ao} {"Applied Optics"}
+MACRO {apl} {"Applied Physics Letters"}
+MACRO {apj} {"Astrophysical Journal"}
+MACRO {baps} {"Bulletin of the American Physical Society"}
+MACRO {cpc} {"Computer Physics Communications"}
+MACRO {cppcf} {"Comments on Plasma Physics and Controlled Fusion"}
+MACRO {fed} {"Fusion Engineering and Design"}
+MACRO {ft} {"Fusion Technology"}
+MACRO {ieeens} {"IEEE Transactions on Nuclear Science"}
+MACRO {ieeeps} {"IEEE Transactions on Plasma Science"}
+MACRO {ijimw} {"International Journal of Infrared and Millimeter Waves"}
+MACRO {ip} {"Infrared Physics"}
+MACRO {jap} {"Journal of Applied Physics"}
+MACRO {jcp} {"Journal of Computational Physics"}
+MACRO {jetp} {"Soviet Physics-JETP"}
+MACRO {jfe} {"Journal of Fusion Energy"}
+MACRO {jfm} {"Journal of Fluid Mechanics"}
+MACRO {jgr} {"Journal of Geophysical Research"}
+MACRO {jmp} {"Journal of Mathematical Physics"}
+MACRO {jne} {"Journal of Nuclear Energy"}
+MACRO {jnec} {"Journal of Nuclear Energy, Part C: Plasma Physics, Accelerators, Thermonuclear Research"}
+MACRO {jnm} {"Journal of Nuclear Materials"}
+MACRO {josa} {"Journal of the Optical Society of America"}
+MACRO {jpp} {"Journal of Plasma Physics"}
+MACRO {jpsj} {"Journal of the Physical Society of Japan"}
+MACRO {jvst} {"Journal of Vacuum Science and Technology"}
+MACRO {nedf} {"Nuclear Engineering and Design/Fusion"}
+MACRO {nf} {"Nuclear Fusion"}
+MACRO {nim} {"Nuclear Instruments and Methods"}
+MACRO {nimpr} {"Nuclear Instruments and Methods in Physics Research"}
+MACRO {nt/f} {"Nuclear Technology/Fusion"}
+MACRO {pf} {"Physics of Fluids"}
+MACRO {pfa} {"Physics of Fluids A: Fluid Dynamics"}
+MACRO {pfb} {"Physics of Fluids B: Plasma Physics"}
+MACRO {pl} {"Physics Letters"}
+MACRO {pla} {"Physics Letters A"}
+MACRO {pnas} {"Proceedings of the National Academy of Sciences of the USA"}
+MACRO {pp} {"Plasma Physics"}
+MACRO {ppcf} {"Plasma Physics and Controlled Fusion"}
+MACRO {prl} {"Physical Review Letters"}
+MACRO {pr} {"Physical Review"}
+MACRO {pra} {"Physical Review A: General Physics"}
+MACRO {ps} {"Physica Scripta"}
+MACRO {rmp} {"Reviews of Modern Physics"}
+MACRO {rsi} {"Review of Scientific Instruments"}
+MACRO {sjpp} {"Soviet Journal of Plasma Phys."}
+MACRO {spd} {"Soviet Physics-Doklady"}
+MACRO {sptp} {"Soviet Physics-Technical Physics"}
+MACRO {spu} {"Soviet Physics-Uspeki"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+% Now comes the computation for numeric labels.
+% We use either the sorted order or original order.
+% We still have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+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}
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" * write$ newline$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/phiaea.bst b/obsolete/biblio/bibtex/contrib/phiaea.bst
new file mode 100644
index 0000000000..90dbdedac1
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phiaea.bst
@@ -0,0 +1,1889 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % For 1 Conferences
+% same as NF except for 0 and 0 set to 1
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 0: an alphabetic label is used (if false then a numeric
+% label is used)
+% 0: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 1: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 0: months are spelled out in full (if false, then
+% they're abbreviated)
+% 0: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+ month
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+STRINGS { s t }
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { "," * 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 :=
+}
+% This function finishes all entries.
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ skip$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% The new.sentence.check functions are analogous.
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+FUNCTION {paren}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "(" swap$ * ")" * }
+ if$
+}
+INTEGERS { nameptr namesleft numnames }
+INTEGERS { etal }
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames #1 >
+ s numnames "{ll}" format.name$ "others" = numnames #1 > and
+ or 'etal :=
+ etal
+ { #1 #1 + 'namesleft := }
+ { numnames 'namesleft := }
+ if$
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+ t "others" =
+ 'skip$
+ { t "u" change.case$ 't := }
+ if$
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { nameptr #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ etal or
+ { " 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.edited}
+{ editor empty$
+ { "" }
+ { "edited by " editor format.names * }
+ if$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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 {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+FUNCTION {format.date}
+{ year empty$
+ { "" }
+ 'year
+ if$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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.a}
+{ pages empty$
+ { "" }
+ { "page" pages first.page tie.or.space.connect }
+ if$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null embolden
+ " " swap$ * *
+ format.date empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.date paren }
+ { " " * format.date paren * }
+ if$
+ }
+ if$
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages.a }
+ { " " * pages first.page *}
+ if$
+ }
+ if$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "in " booktitle emphasize * }
+ { "in " booktitle emphasize * ", " * format.edited * }
+ if$
+ }
+ if$
+}
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "In " journal * }
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+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$
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+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 * "}" *
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+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 * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ crossref missing$
+ { journal field.or.null
+ format.vol.num.pages output
+ }
+ { 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.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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+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
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+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
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+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
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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."}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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."}
+%% /usr/local/lib/tex/bibtex/phyjfull.btx, Tue Jun 30 08:37:48 1992
+%% Edit by Nelson H. F. Beebe <beebe@alfred.math.utah.edu>
+%% Change file names in leading comment
+% Journal Title Abbreviations from the Physical Review Style and Notation
+% Guide, July, 1983, in BAPS Vol. 28.
+% Selected by Cris Barnes and Charles Karney, March 1988
+% IMPORTANT!! Don't make changes to this file without making the
+% corresponding changes to
+% phyjabb.bib
+% phyjabb.btx
+MACRO {advp} {"Advances in Physics"}
+MACRO {ajp} {"American Journal of Physics"}
+MACRO {ao} {"Applied Optics"}
+MACRO {apl} {"Applied Physics Letters"}
+MACRO {apj} {"Astrophysical Journal"}
+MACRO {baps} {"Bulletin of the American Physical Society"}
+MACRO {cpc} {"Computer Physics Communications"}
+MACRO {cppcf} {"Comments on Plasma Physics and Controlled Fusion"}
+MACRO {fed} {"Fusion Engineering and Design"}
+MACRO {ft} {"Fusion Technology"}
+MACRO {ieeens} {"IEEE Transactions on Nuclear Science"}
+MACRO {ieeeps} {"IEEE Transactions on Plasma Science"}
+MACRO {ijimw} {"International Journal of Infrared and Millimeter Waves"}
+MACRO {ip} {"Infrared Physics"}
+MACRO {jap} {"Journal of Applied Physics"}
+MACRO {jcp} {"Journal of Computational Physics"}
+MACRO {jetp} {"Soviet Physics-JETP"}
+MACRO {jfe} {"Journal of Fusion Energy"}
+MACRO {jfm} {"Journal of Fluid Mechanics"}
+MACRO {jgr} {"Journal of Geophysical Research"}
+MACRO {jmp} {"Journal of Mathematical Physics"}
+MACRO {jne} {"Journal of Nuclear Energy"}
+MACRO {jnec} {"Journal of Nuclear Energy, Part C: Plasma Physics, Accelerators, Thermonuclear Research"}
+MACRO {jnm} {"Journal of Nuclear Materials"}
+MACRO {josa} {"Journal of the Optical Society of America"}
+MACRO {jpp} {"Journal of Plasma Physics"}
+MACRO {jpsj} {"Journal of the Physical Society of Japan"}
+MACRO {jvst} {"Journal of Vacuum Science and Technology"}
+MACRO {nedf} {"Nuclear Engineering and Design/Fusion"}
+MACRO {nf} {"Nuclear Fusion"}
+MACRO {nim} {"Nuclear Instruments and Methods"}
+MACRO {nimpr} {"Nuclear Instruments and Methods in Physics Research"}
+MACRO {nt/f} {"Nuclear Technology/Fusion"}
+MACRO {pf} {"Physics of Fluids"}
+MACRO {pfa} {"Physics of Fluids A: Fluid Dynamics"}
+MACRO {pfb} {"Physics of Fluids B: Plasma Physics"}
+MACRO {pl} {"Physics Letters"}
+MACRO {pla} {"Physics Letters A"}
+MACRO {pnas} {"Proceedings of the National Academy of Sciences of the USA"}
+MACRO {pp} {"Plasma Physics"}
+MACRO {ppcf} {"Plasma Physics and Controlled Fusion"}
+MACRO {prl} {"Physical Review Letters"}
+MACRO {pr} {"Physical Review"}
+MACRO {pra} {"Physical Review A: General Physics"}
+MACRO {ps} {"Physica Scripta"}
+MACRO {rmp} {"Reviews of Modern Physics"}
+MACRO {rsi} {"Review of Scientific Instruments"}
+MACRO {sjpp} {"Soviet Journal of Plasma Phys."}
+MACRO {spd} {"Soviet Physics-Doklady"}
+MACRO {sptp} {"Soviet Physics-Technical Physics"}
+MACRO {spu} {"Soviet Physics-Uspeki"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+% Now comes the computation for numeric labels.
+% We use either the sorted order or original order.
+% We still have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+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}
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" * write$ newline$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/phnf.bst b/obsolete/biblio/bibtex/contrib/phnf.bst
new file mode 100644
index 0000000000..7c833bb825
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phnf.bst
@@ -0,0 +1,1890 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % For Nuclear Fusion
+ % see Nuclear Fusion Vol. 28, No. 2 (1988),
+ % "Announcement [of] Guidelines for Bibliographical Citations"
+% same as AIP except for 0, 0, 0 and
+% 0 and 0 set to use only three names if there are
+% 6 or more. Also, no 0, and use 0 and 0.
+% There are still some nits to be picked (years in parentheses for
+% other than journals, volumes having Vol. before them and pages not
+% having p.)
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 0: an alphabetic label is used (if false then a numeric
+% label is used)
+% 0: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 1: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 0: months are spelled out in full (if false, then
+% they're abbreviated)
+% 0: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+ month
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+STRINGS { s t }
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { "," * 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 :=
+}
+% This function finishes all entries.
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ skip$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% The new.sentence.check functions are analogous.
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+FUNCTION {paren}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "(" swap$ * ")" * }
+ if$
+}
+INTEGERS { nameptr namesleft numnames }
+INTEGERS { etal }
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames #5 >
+ s numnames "{ll}" format.name$ "others" = numnames #3 > and
+ or 'etal :=
+ etal
+ { #3 #1 + 'namesleft := }
+ { numnames 'namesleft := }
+ if$
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+ t "others" =
+ 'skip$
+ { t "u" change.case$ 't := }
+ if$
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { nameptr #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ etal or
+ { " 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$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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 {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+FUNCTION {format.date}
+{ year empty$
+ { "" }
+ 'year
+ if$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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.pages.a}
+{ pages empty$
+ { "" }
+ { "p." pages first.page tie.or.space.connect }
+ if$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null embolden
+ " " swap$ * *
+ format.date empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.date paren }
+ { " " * format.date paren * }
+ if$
+ }
+ if$
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages.a }
+ { " " * pages first.page *}
+ if$
+ }
+ if$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "in " booktitle emphasize * }
+ { "in " format.editors * ", " * booktitle emphasize * }
+ if$
+ }
+ if$
+}
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "In " journal * }
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+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$
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+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 * "}" *
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+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 * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ crossref missing$
+ { journal field.or.null
+ format.vol.num.pages output
+ }
+ { 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.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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+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
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+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
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+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
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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."}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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."}
+%% /usr/local/lib/tex/bibtex/phyjfull.btx, Tue Jun 30 08:37:48 1992
+%% Edit by Nelson H. F. Beebe <beebe@alfred.math.utah.edu>
+%% Change file names in leading comment
+% Journal Title Abbreviations from the Physical Review Style and Notation
+% Guide, July, 1983, in BAPS Vol. 28.
+% Selected by Cris Barnes and Charles Karney, March 1988
+% IMPORTANT!! Don't make changes to this file without making the
+% corresponding changes to
+% phyjabb.bib
+% phyjabb.btx
+MACRO {advp} {"Advances in Physics"}
+MACRO {ajp} {"American Journal of Physics"}
+MACRO {ao} {"Applied Optics"}
+MACRO {apl} {"Applied Physics Letters"}
+MACRO {apj} {"Astrophysical Journal"}
+MACRO {baps} {"Bulletin of the American Physical Society"}
+MACRO {cpc} {"Computer Physics Communications"}
+MACRO {cppcf} {"Comments on Plasma Physics and Controlled Fusion"}
+MACRO {fed} {"Fusion Engineering and Design"}
+MACRO {ft} {"Fusion Technology"}
+MACRO {ieeens} {"IEEE Transactions on Nuclear Science"}
+MACRO {ieeeps} {"IEEE Transactions on Plasma Science"}
+MACRO {ijimw} {"International Journal of Infrared and Millimeter Waves"}
+MACRO {ip} {"Infrared Physics"}
+MACRO {jap} {"Journal of Applied Physics"}
+MACRO {jcp} {"Journal of Computational Physics"}
+MACRO {jetp} {"Soviet Physics-JETP"}
+MACRO {jfe} {"Journal of Fusion Energy"}
+MACRO {jfm} {"Journal of Fluid Mechanics"}
+MACRO {jgr} {"Journal of Geophysical Research"}
+MACRO {jmp} {"Journal of Mathematical Physics"}
+MACRO {jne} {"Journal of Nuclear Energy"}
+MACRO {jnec} {"Journal of Nuclear Energy, Part C: Plasma Physics, Accelerators, Thermonuclear Research"}
+MACRO {jnm} {"Journal of Nuclear Materials"}
+MACRO {josa} {"Journal of the Optical Society of America"}
+MACRO {jpp} {"Journal of Plasma Physics"}
+MACRO {jpsj} {"Journal of the Physical Society of Japan"}
+MACRO {jvst} {"Journal of Vacuum Science and Technology"}
+MACRO {nedf} {"Nuclear Engineering and Design/Fusion"}
+MACRO {nf} {"Nuclear Fusion"}
+MACRO {nim} {"Nuclear Instruments and Methods"}
+MACRO {nimpr} {"Nuclear Instruments and Methods in Physics Research"}
+MACRO {nt/f} {"Nuclear Technology/Fusion"}
+MACRO {pf} {"Physics of Fluids"}
+MACRO {pfa} {"Physics of Fluids A: Fluid Dynamics"}
+MACRO {pfb} {"Physics of Fluids B: Plasma Physics"}
+MACRO {pl} {"Physics Letters"}
+MACRO {pla} {"Physics Letters A"}
+MACRO {pnas} {"Proceedings of the National Academy of Sciences of the USA"}
+MACRO {pp} {"Plasma Physics"}
+MACRO {ppcf} {"Plasma Physics and Controlled Fusion"}
+MACRO {prl} {"Physical Review Letters"}
+MACRO {pr} {"Physical Review"}
+MACRO {pra} {"Physical Review A: General Physics"}
+MACRO {ps} {"Physica Scripta"}
+MACRO {rmp} {"Reviews of Modern Physics"}
+MACRO {rsi} {"Review of Scientific Instruments"}
+MACRO {sjpp} {"Soviet Journal of Plasma Phys."}
+MACRO {spd} {"Soviet Physics-Doklady"}
+MACRO {sptp} {"Soviet Physics-Technical Physics"}
+MACRO {spu} {"Soviet Physics-Uspeki"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+% Now comes the computation for numeric labels.
+% We use either the sorted order or original order.
+% We still have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+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}
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" * write$ newline$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/phnflet.bst b/obsolete/biblio/bibtex/contrib/phnflet.bst
new file mode 100644
index 0000000000..4c7fc07790
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phnflet.bst
@@ -0,0 +1,1883 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % For Nuclear Fusion Letters
+% same as NF except for 0 and 0 set to 5
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 0: an alphabetic label is used (if false then a numeric
+% label is used)
+% 0: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 1: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 0: months are spelled out in full (if false, then
+% they're abbreviated)
+% 0: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+ month
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+STRINGS { s t }
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { "," * 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 :=
+}
+% This function finishes all entries.
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ skip$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% The new.sentence.check functions are analogous.
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+FUNCTION {paren}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "(" swap$ * ")" * }
+ if$
+}
+INTEGERS { nameptr namesleft numnames }
+INTEGERS { etal }
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames #5 >
+ s numnames "{ll}" format.name$ "others" = numnames #5 > and
+ or 'etal :=
+ etal
+ { #5 #1 + 'namesleft := }
+ { numnames 'namesleft := }
+ if$
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+ t "others" =
+ 'skip$
+ { t "u" change.case$ 't := }
+ if$
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { nameptr #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ etal or
+ { " 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$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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 {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+FUNCTION {format.date}
+{ year empty$
+ { "" }
+ 'year
+ if$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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.pages.a}
+{ pages empty$
+ { "" }
+ { "p." pages first.page tie.or.space.connect }
+ if$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null embolden
+ " " swap$ * *
+ format.date empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.date paren }
+ { " " * format.date paren * }
+ if$
+ }
+ if$
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages.a }
+ { " " * pages first.page *}
+ if$
+ }
+ if$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "in " booktitle emphasize * }
+ { "in " format.editors * ", " * booktitle emphasize * }
+ if$
+ }
+ if$
+}
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "In " journal * }
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+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$
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+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 * "}" *
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+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 * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ crossref missing$
+ { journal field.or.null
+ format.vol.num.pages output
+ }
+ { 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.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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+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
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+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
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+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
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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."}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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."}
+%% /usr/local/lib/tex/bibtex/phyjfull.btx, Tue Jun 30 08:37:48 1992
+%% Edit by Nelson H. F. Beebe <beebe@alfred.math.utah.edu>
+%% Change file names in leading comment
+% Journal Title Abbreviations from the Physical Review Style and Notation
+% Guide, July, 1983, in BAPS Vol. 28.
+% Selected by Cris Barnes and Charles Karney, March 1988
+% IMPORTANT!! Don't make changes to this file without making the
+% corresponding changes to
+% phyjabb.bib
+% phyjabb.btx
+MACRO {advp} {"Advances in Physics"}
+MACRO {ajp} {"American Journal of Physics"}
+MACRO {ao} {"Applied Optics"}
+MACRO {apl} {"Applied Physics Letters"}
+MACRO {apj} {"Astrophysical Journal"}
+MACRO {baps} {"Bulletin of the American Physical Society"}
+MACRO {cpc} {"Computer Physics Communications"}
+MACRO {cppcf} {"Comments on Plasma Physics and Controlled Fusion"}
+MACRO {fed} {"Fusion Engineering and Design"}
+MACRO {ft} {"Fusion Technology"}
+MACRO {ieeens} {"IEEE Transactions on Nuclear Science"}
+MACRO {ieeeps} {"IEEE Transactions on Plasma Science"}
+MACRO {ijimw} {"International Journal of Infrared and Millimeter Waves"}
+MACRO {ip} {"Infrared Physics"}
+MACRO {jap} {"Journal of Applied Physics"}
+MACRO {jcp} {"Journal of Computational Physics"}
+MACRO {jetp} {"Soviet Physics-JETP"}
+MACRO {jfe} {"Journal of Fusion Energy"}
+MACRO {jfm} {"Journal of Fluid Mechanics"}
+MACRO {jgr} {"Journal of Geophysical Research"}
+MACRO {jmp} {"Journal of Mathematical Physics"}
+MACRO {jne} {"Journal of Nuclear Energy"}
+MACRO {jnec} {"Journal of Nuclear Energy, Part C: Plasma Physics, Accelerators, Thermonuclear Research"}
+MACRO {jnm} {"Journal of Nuclear Materials"}
+MACRO {josa} {"Journal of the Optical Society of America"}
+MACRO {jpp} {"Journal of Plasma Physics"}
+MACRO {jpsj} {"Journal of the Physical Society of Japan"}
+MACRO {jvst} {"Journal of Vacuum Science and Technology"}
+MACRO {nedf} {"Nuclear Engineering and Design/Fusion"}
+MACRO {nf} {"Nuclear Fusion"}
+MACRO {nim} {"Nuclear Instruments and Methods"}
+MACRO {nimpr} {"Nuclear Instruments and Methods in Physics Research"}
+MACRO {nt/f} {"Nuclear Technology/Fusion"}
+MACRO {pf} {"Physics of Fluids"}
+MACRO {pfa} {"Physics of Fluids A: Fluid Dynamics"}
+MACRO {pfb} {"Physics of Fluids B: Plasma Physics"}
+MACRO {pl} {"Physics Letters"}
+MACRO {pla} {"Physics Letters A"}
+MACRO {pnas} {"Proceedings of the National Academy of Sciences of the USA"}
+MACRO {pp} {"Plasma Physics"}
+MACRO {ppcf} {"Plasma Physics and Controlled Fusion"}
+MACRO {prl} {"Physical Review Letters"}
+MACRO {pr} {"Physical Review"}
+MACRO {pra} {"Physical Review A: General Physics"}
+MACRO {ps} {"Physica Scripta"}
+MACRO {rmp} {"Reviews of Modern Physics"}
+MACRO {rsi} {"Review of Scientific Instruments"}
+MACRO {sjpp} {"Soviet Journal of Plasma Phys."}
+MACRO {spd} {"Soviet Physics-Doklady"}
+MACRO {sptp} {"Soviet Physics-Technical Physics"}
+MACRO {spu} {"Soviet Physics-Uspeki"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+% Now comes the computation for numeric labels.
+% We use either the sorted order or original order.
+% We still have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+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}
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" * write$ newline$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/phpf.bst b/obsolete/biblio/bibtex/contrib/phpf.bst
new file mode 100644
index 0000000000..a55d62d9e3
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phpf.bst
@@ -0,0 +1,1877 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % For Physics of Fluids, which now wants ALL the authors
+ % (Same as AIP but infinite names, abbreviate pages, and
+ % alternate incollection)
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 0: an alphabetic label is used (if false then a numeric
+% label is used)
+% 0: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 1: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 0: months are spelled out in full (if false, then
+% they're abbreviated)
+% 0: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+ month
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+STRINGS { s t }
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { "," * 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 :=
+}
+% This function finishes all entries.
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ skip$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% The new.sentence.check functions are analogous.
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+FUNCTION {paren}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "(" 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.edited}
+{ editor empty$
+ { "" }
+ { "edited by " editor format.names * }
+ if$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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 {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+FUNCTION {format.date}
+{ year empty$
+ { "" }
+ 'year
+ if$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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.pages.a}
+{ pages empty$
+ { "" }
+ { "p." pages first.page tie.or.space.connect }
+ if$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null embolden
+ " " swap$ * *
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages.a }
+ { ", " * pages first.page * }
+ if$
+ }
+ if$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "in " booktitle emphasize * }
+ { "in " booktitle emphasize * ", " * format.edited * }
+ if$
+ }
+ if$
+}
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "In " journal * }
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+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$
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+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 * "}" *
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+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 * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ crossref missing$
+ { journal field.or.null
+ format.vol.num.pages
+ format.date empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.date paren }
+ { " " * format.date paren * }
+ if$
+ }
+ if$
+ output
+ }
+ { 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.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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+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
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ crossref missing$
+ { format.in.ed.booktitle "booktitle" output.check
+ new.sentence
+ publisher "publisher" output.check
+ address output
+ format.edition output
+ format.date "year" output.check
+ format.bvolume output
+ format.number.series output
+ format.chapter.pages output
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+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
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+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
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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."}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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."}
+%% /usr/local/lib/tex/bibtex/phyjfull.btx, Tue Jun 30 08:37:48 1992
+%% Edit by Nelson H. F. Beebe <beebe@alfred.math.utah.edu>
+%% Change file names in leading comment
+% Journal Title Abbreviations from the Physical Review Style and Notation
+% Guide, July, 1983, in BAPS Vol. 28.
+% Selected by Cris Barnes and Charles Karney, March 1988
+% IMPORTANT!! Don't make changes to this file without making the
+% corresponding changes to
+% phyjabb.bib
+% phyjabb.btx
+MACRO {advp} {"Advances in Physics"}
+MACRO {ajp} {"American Journal of Physics"}
+MACRO {ao} {"Applied Optics"}
+MACRO {apl} {"Applied Physics Letters"}
+MACRO {apj} {"Astrophysical Journal"}
+MACRO {baps} {"Bulletin of the American Physical Society"}
+MACRO {cpc} {"Computer Physics Communications"}
+MACRO {cppcf} {"Comments on Plasma Physics and Controlled Fusion"}
+MACRO {fed} {"Fusion Engineering and Design"}
+MACRO {ft} {"Fusion Technology"}
+MACRO {ieeens} {"IEEE Transactions on Nuclear Science"}
+MACRO {ieeeps} {"IEEE Transactions on Plasma Science"}
+MACRO {ijimw} {"International Journal of Infrared and Millimeter Waves"}
+MACRO {ip} {"Infrared Physics"}
+MACRO {jap} {"Journal of Applied Physics"}
+MACRO {jcp} {"Journal of Computational Physics"}
+MACRO {jetp} {"Soviet Physics-JETP"}
+MACRO {jfe} {"Journal of Fusion Energy"}
+MACRO {jfm} {"Journal of Fluid Mechanics"}
+MACRO {jgr} {"Journal of Geophysical Research"}
+MACRO {jmp} {"Journal of Mathematical Physics"}
+MACRO {jne} {"Journal of Nuclear Energy"}
+MACRO {jnec} {"Journal of Nuclear Energy, Part C: Plasma Physics, Accelerators, Thermonuclear Research"}
+MACRO {jnm} {"Journal of Nuclear Materials"}
+MACRO {josa} {"Journal of the Optical Society of America"}
+MACRO {jpp} {"Journal of Plasma Physics"}
+MACRO {jpsj} {"Journal of the Physical Society of Japan"}
+MACRO {jvst} {"Journal of Vacuum Science and Technology"}
+MACRO {nedf} {"Nuclear Engineering and Design/Fusion"}
+MACRO {nf} {"Nuclear Fusion"}
+MACRO {nim} {"Nuclear Instruments and Methods"}
+MACRO {nimpr} {"Nuclear Instruments and Methods in Physics Research"}
+MACRO {nt/f} {"Nuclear Technology/Fusion"}
+MACRO {pf} {"Physics of Fluids"}
+MACRO {pfa} {"Physics of Fluids A: Fluid Dynamics"}
+MACRO {pfb} {"Physics of Fluids B: Plasma Physics"}
+MACRO {pl} {"Physics Letters"}
+MACRO {pla} {"Physics Letters A"}
+MACRO {pnas} {"Proceedings of the National Academy of Sciences of the USA"}
+MACRO {pp} {"Plasma Physics"}
+MACRO {ppcf} {"Plasma Physics and Controlled Fusion"}
+MACRO {prl} {"Physical Review Letters"}
+MACRO {pr} {"Physical Review"}
+MACRO {pra} {"Physical Review A: General Physics"}
+MACRO {ps} {"Physica Scripta"}
+MACRO {rmp} {"Reviews of Modern Physics"}
+MACRO {rsi} {"Review of Scientific Instruments"}
+MACRO {sjpp} {"Soviet Journal of Plasma Phys."}
+MACRO {spd} {"Soviet Physics-Doklady"}
+MACRO {sptp} {"Soviet Physics-Technical Physics"}
+MACRO {spu} {"Soviet Physics-Uspeki"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+% Now comes the computation for numeric labels.
+% We use either the sorted order or original order.
+% We still have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+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}
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" * write$ newline$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/phppcf.bst b/obsolete/biblio/bibtex/contrib/phppcf.bst
new file mode 100644
index 0000000000..2ca7056ef6
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phppcf.bst
@@ -0,0 +1,2009 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % A physics version of APALIKE
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% BibTeX `apalike' bibliography style (24-Jan-88 version)
+% Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a.
+% Copyright (C) 1988, all rights reserved.
+% Copying of this file is allowed, provided that if you make any changes at all
+% you name it something other than `apalike.bst'.
+% This restriction helps ensure that all copies are identical.
+% Differences between this style and `alpha' are generally heralded by a `%'.
+% The file btxbst.doc has the documentation for alpha.bst.
+%
+% This style should be used with the `apalike' LaTeX style (apalike.sty).
+% \cite's come out like "(Jones, 1986)" in the text but there are no labels
+% in the bibliography, and something like "(1986)" comes out immediately
+% after the author. Author (and editor) names appear as last name, comma,
+% initials. A `year' field is required for every entry, and so is either
+% an author (or in some cases, an editor) field or a key field.
+%
+% Editorial note:
+% Many journals require a style like `apalike', but I strongly, strongly,
+% strongly recommend that you not use it if you have a choice---use something
+% like `plain' instead. Mary-Claire van Leunen (A Handbook for Scholars,
+% Knopf, 1979) argues convincingly that a style like `plain' encourages better
+% writing than one like `apalike'. Furthermore the strongest arguments for
+% using an author-date style like `apalike'---that it's "the most practical"
+% (The Chicago Manual of Style, University of Chicago Press, thirteenth
+% edition, 1982, pages 400--401)---fall flat on their face with the new
+% computer-typesetting technology. For instance page 401 anachronistically
+% states "The chief disadvantage of [a style like `plain'] is that additions
+% or deletions cannot be made after the manuscript is typed without changing
+% numbers in both text references and list." LaTeX sidesteps the disadvantage.
+%
+% History:
+% 15-sep-86 (SK,OP) Original version, by Susan King and Oren Patashnik.
+% 10-nov-86 (OP) Truncated the sort.key$ string to the correct length
+% in bib.sort.order to eliminate error message.
+% 24-jan-88 (OP) Updated for BibTeX version 0.99a, from alpha.bst 0.99a;
+% apalike now sorts by author, then year, then title;
+% THIS `apalike' VERSION DOES NOT WORK WITH BIBTEX 0.98i.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 1: an alphabetic label is used (if false then a numeric
+% label is used)
+% 1: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 0: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 1: months are spelled out in full (if false, then
+% they're abbreviated)
+% 0: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+% month not used in apalike
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label extra.label sort.label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+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$
+}
+% apalike needs this function because
+% the year has special punctuation;
+% apalike ignores the month
+FUNCTION {output.year.check}
+{ year empty$
+ { "empty year in " cite$ * warning$ }
+ { write$
+ " (" year * extra.label * ")" *
+ mid.sentence 'output.state :=
+ }
+ if$
+}
+FUNCTION {output.bibitem}
+{ newline$
+ "\bibitem[" write$
+ label write$
+ "]{" write$
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+% This function finishes all entries.
+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$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+FUNCTION {caps}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\sc " swap$ * "}" * }
+ if$
+}
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+INTEGERS { nameptr namesleft numnames }
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+ t "others" =
+ 'skip$
+ { t caps 't := }
+ if$
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+ { numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ { " {\em 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.key} % this function is just for apalike
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", editors" * }
+ { ", editor" * }
+ if$
+ }
+ if$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ 'title
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null embolden
+ " " swap$ * *
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages }
+ { ", " * pages n.dashify * }
+ if$
+ }
+ if$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "In " booktitle emphasize * }
+ { "In " format.editors * ", " * booktitle emphasize * }
+ if$
+ }
+ if$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ "In" % this is for apalike
+ " \cite{" * crossref * "}" *
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In "
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+ "\cite{" * crossref * "}" * % this is for apalike
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+FUNCTION {format.incoll.inproc.crossref}
+{ "In" % this is for apalike
+ " \cite{" * crossref * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ crossref missing$
+ { journal emphasize
+ format.vol.num.pages output
+ }
+ { 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
+ editor format.key output
+ }
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+ output.year.check % special for apalike
+ 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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ howpublished output
+ address output
+ new.block
+ note output
+ fin.entry
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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$
+ output.year.check % special for apalike
+ 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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ 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.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ 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 output % for apalike
+ new.sentence % there's no year
+ organization output % here so things
+ publisher output % are simpler
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+FUNCTION {manual}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ organization address new.block.checkb
+ organization output
+ address output
+ format.edition output
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title output
+ new.block
+ howpublished output
+ new.block
+ note output
+ fin.entry
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+FUNCTION {proceedings}
+{ output.bibitem
+ format.editors output
+ editor format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+ address output % for apalike
+ new.sentence % we always output
+ organization output % a nonempty organization
+ publisher output % here
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+ new.block
+ note output
+ fin.entry
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ note "note" output.check
+ fin.entry
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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"}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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."}
+%% /usr/local/lib/tex/bibtex/phyjfull.btx, Tue Jun 30 08:37:48 1992
+%% Edit by Nelson H. F. Beebe <beebe@alfred.math.utah.edu>
+%% Change file names in leading comment
+% Journal Title Abbreviations from the Physical Review Style and Notation
+% Guide, July, 1983, in BAPS Vol. 28.
+% Selected by Cris Barnes and Charles Karney, March 1988
+% IMPORTANT!! Don't make changes to this file without making the
+% corresponding changes to
+% phyjabb.bib
+% phyjabb.btx
+MACRO {advp} {"Advances in Physics"}
+MACRO {ajp} {"American Journal of Physics"}
+MACRO {ao} {"Applied Optics"}
+MACRO {apl} {"Applied Physics Letters"}
+MACRO {apj} {"Astrophysical Journal"}
+MACRO {baps} {"Bulletin of the American Physical Society"}
+MACRO {cpc} {"Computer Physics Communications"}
+MACRO {cppcf} {"Comments on Plasma Physics and Controlled Fusion"}
+MACRO {fed} {"Fusion Engineering and Design"}
+MACRO {ft} {"Fusion Technology"}
+MACRO {ieeens} {"IEEE Transactions on Nuclear Science"}
+MACRO {ieeeps} {"IEEE Transactions on Plasma Science"}
+MACRO {ijimw} {"International Journal of Infrared and Millimeter Waves"}
+MACRO {ip} {"Infrared Physics"}
+MACRO {jap} {"Journal of Applied Physics"}
+MACRO {jcp} {"Journal of Computational Physics"}
+MACRO {jetp} {"Soviet Physics-JETP"}
+MACRO {jfe} {"Journal of Fusion Energy"}
+MACRO {jfm} {"Journal of Fluid Mechanics"}
+MACRO {jgr} {"Journal of Geophysical Research"}
+MACRO {jmp} {"Journal of Mathematical Physics"}
+MACRO {jne} {"Journal of Nuclear Energy"}
+MACRO {jnec} {"Journal of Nuclear Energy, Part C: Plasma Physics, Accelerators, Thermonuclear Research"}
+MACRO {jnm} {"Journal of Nuclear Materials"}
+MACRO {josa} {"Journal of the Optical Society of America"}
+MACRO {jpp} {"Journal of Plasma Physics"}
+MACRO {jpsj} {"Journal of the Physical Society of Japan"}
+MACRO {jvst} {"Journal of Vacuum Science and Technology"}
+MACRO {nedf} {"Nuclear Engineering and Design/Fusion"}
+MACRO {nf} {"Nuclear Fusion"}
+MACRO {nim} {"Nuclear Instruments and Methods"}
+MACRO {nimpr} {"Nuclear Instruments and Methods in Physics Research"}
+MACRO {nt/f} {"Nuclear Technology/Fusion"}
+MACRO {pf} {"Physics of Fluids"}
+MACRO {pfa} {"Physics of Fluids A: Fluid Dynamics"}
+MACRO {pfb} {"Physics of Fluids B: Plasma Physics"}
+MACRO {pl} {"Physics Letters"}
+MACRO {pla} {"Physics Letters A"}
+MACRO {pnas} {"Proceedings of the National Academy of Sciences of the USA"}
+MACRO {pp} {"Plasma Physics"}
+MACRO {ppcf} {"Plasma Physics and Controlled Fusion"}
+MACRO {prl} {"Physical Review Letters"}
+MACRO {pr} {"Physical Review"}
+MACRO {pra} {"Physical Review A: General Physics"}
+MACRO {ps} {"Physica Scripta"}
+MACRO {rmp} {"Reviews of Modern Physics"}
+MACRO {rsi} {"Review of Scientific Instruments"}
+MACRO {sjpp} {"Soviet Journal of Plasma Phys."}
+MACRO {spd} {"Soviet Physics-Doklady"}
+MACRO {sptp} {"Soviet Physics-Technical Physics"}
+MACRO {spu} {"Soviet Physics-Uspeki"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+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$
+}
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+% There are three apalike cases: one person (Jones),
+% two (Jones and de~Bruijn), and more (Jones et~al.).
+% This function is much like format.crossref.editors.
+%
+FUNCTION {format.lab.names}
+{ 's :=
+ s #1 "{vv~}{ll}" format.name$ caps
+ s num.names$ duplicate$
+ #2 >
+ { pop$ " {\em et~al.}" * }
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " {\em et~al.}" * }
+ { " and " * s #2 "{vv~}{ll}" format.name$ caps * }
+ if$
+ }
+ if$
+ }
+ if$
+}
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key % apalike uses the whole key
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key % apalike uses the whole 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 % apalike uses the whole key, no organization
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+FUNCTION {calc.label}
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+ 'editor.key.label % apalike ignores organization
+ 'author.key.label % for labeling and sorting
+ if$
+ }
+ if$
+ ", " % these three lines are
+ * % for apalike, which
+ year field.or.null purify$ #-1 #4 substring$ % uses all four digits
+ *
+ 'label :=
+}
+% It doesn't seem like a particularly good idea to use an order-of-citation
+% reference list when using alphabetic labels, but we need to have a
+% special pass to calculate labels when this happens.
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$ % apalike uses initials
+ s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here
+ nameptr numnames = t "others" = and
+ { "et al" * }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+% The sort.format.title function returns the argument,
+% but first any leading "A "'s, "An "'s, or "The "'s are removed.
+% The chop.word function uses s, so we need another string variable, t
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+% The auxiliary functions here, for the presort function, are analogous to
+% the ones for calc.label; the same comments apply, except that the
+% organization field takes precedence here over the key field. For sorting
+% purposes, we still remove a leading "The " from the organization field.
+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$
+}
+% apalike uses two sorting passes; the first one sets the
+% labels so that the `a's, `b's, etc. can be computed;
+% the second pass puts the references in "correct" order.
+% The presort function is for the first pass. It computes
+% label, sort.label, and title, and then concatenates.
+FUNCTION {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$ % for
+ 'sort.label := % apalike
+ sort.label % style
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+ITERATE {presort}
+% And now we can sort
+SORT % by label, sort.label, title---for final label calculation
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+STRINGS { last.label next.extra } % apalike labels are only for the text;
+INTEGERS { last.extra.num } % there are none in the bibliography
+FUNCTION {initialize.extra.label.stuff} % and hence there is no `longest.label'
+{ #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$
+ label extra.label * 'label :=
+ extra.label 'next.extra :=
+}
+EXECUTE {initialize.extra.label.stuff}
+ITERATE {forward.pass}
+REVERSE {reverse.pass}
+% Now that the label is right we sort for real,
+% on sort.label then year then title. This is
+% for the second sorting 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$ :=
+}
+ITERATE {bib.sort.order}
+SORT % by sort.label, year, title---giving final bibliography order
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+FUNCTION {begin.bib}
+{ preamble$ empty$ % no \etalchar in apalike
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{}" write$ newline$ % no labels in apalike
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/phreport.bst b/obsolete/biblio/bibtex/contrib/phreport.bst
new file mode 100644
index 0000000000..919ab181cb
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phreport.bst
@@ -0,0 +1,1885 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % For internal reports
+% same as AIP except for 0, 0, 0,
+% 0, 0, 0
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 0: an alphabetic label is used (if false then a numeric
+% label is used)
+% 0: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 0: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 0: months are spelled out in full (if false, then
+% they're abbreviated)
+% 0: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+ month
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+STRINGS { s t }
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { "," * 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 :=
+}
+% This function finishes all entries.
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ skip$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% The new.sentence.check functions are analogous.
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+FUNCTION {paren}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "(" 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.edited}
+{ editor empty$
+ { "" }
+ { "edited by " editor format.names * }
+ if$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ 'title
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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$
+}
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+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$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null embolden
+ " " swap$ * *
+ 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$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "in " booktitle emphasize * }
+ { "in " booktitle emphasize * ", " * format.edited * }
+ if$
+ }
+ if$
+}
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "In " journal * }
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+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$
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+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 * "}" *
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+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 * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ format.title "title" output.check
+ new.block
+ crossref missing$
+ { journal field.or.null
+ format.vol.num.pages
+ format.date empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.date paren }
+ { " " * format.date paren * }
+ if$
+ }
+ if$
+ output
+ }
+ { 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.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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+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
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+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
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+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
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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."}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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."}
+%% /usr/local/lib/tex/bibtex/phyjfull.btx, Tue Jun 30 08:37:48 1992
+%% Edit by Nelson H. F. Beebe <beebe@alfred.math.utah.edu>
+%% Change file names in leading comment
+% Journal Title Abbreviations from the Physical Review Style and Notation
+% Guide, July, 1983, in BAPS Vol. 28.
+% Selected by Cris Barnes and Charles Karney, March 1988
+% IMPORTANT!! Don't make changes to this file without making the
+% corresponding changes to
+% phyjabb.bib
+% phyjabb.btx
+MACRO {advp} {"Advances in Physics"}
+MACRO {ajp} {"American Journal of Physics"}
+MACRO {ao} {"Applied Optics"}
+MACRO {apl} {"Applied Physics Letters"}
+MACRO {apj} {"Astrophysical Journal"}
+MACRO {baps} {"Bulletin of the American Physical Society"}
+MACRO {cpc} {"Computer Physics Communications"}
+MACRO {cppcf} {"Comments on Plasma Physics and Controlled Fusion"}
+MACRO {fed} {"Fusion Engineering and Design"}
+MACRO {ft} {"Fusion Technology"}
+MACRO {ieeens} {"IEEE Transactions on Nuclear Science"}
+MACRO {ieeeps} {"IEEE Transactions on Plasma Science"}
+MACRO {ijimw} {"International Journal of Infrared and Millimeter Waves"}
+MACRO {ip} {"Infrared Physics"}
+MACRO {jap} {"Journal of Applied Physics"}
+MACRO {jcp} {"Journal of Computational Physics"}
+MACRO {jetp} {"Soviet Physics-JETP"}
+MACRO {jfe} {"Journal of Fusion Energy"}
+MACRO {jfm} {"Journal of Fluid Mechanics"}
+MACRO {jgr} {"Journal of Geophysical Research"}
+MACRO {jmp} {"Journal of Mathematical Physics"}
+MACRO {jne} {"Journal of Nuclear Energy"}
+MACRO {jnec} {"Journal of Nuclear Energy, Part C: Plasma Physics, Accelerators, Thermonuclear Research"}
+MACRO {jnm} {"Journal of Nuclear Materials"}
+MACRO {josa} {"Journal of the Optical Society of America"}
+MACRO {jpp} {"Journal of Plasma Physics"}
+MACRO {jpsj} {"Journal of the Physical Society of Japan"}
+MACRO {jvst} {"Journal of Vacuum Science and Technology"}
+MACRO {nedf} {"Nuclear Engineering and Design/Fusion"}
+MACRO {nf} {"Nuclear Fusion"}
+MACRO {nim} {"Nuclear Instruments and Methods"}
+MACRO {nimpr} {"Nuclear Instruments and Methods in Physics Research"}
+MACRO {nt/f} {"Nuclear Technology/Fusion"}
+MACRO {pf} {"Physics of Fluids"}
+MACRO {pfa} {"Physics of Fluids A: Fluid Dynamics"}
+MACRO {pfb} {"Physics of Fluids B: Plasma Physics"}
+MACRO {pl} {"Physics Letters"}
+MACRO {pla} {"Physics Letters A"}
+MACRO {pnas} {"Proceedings of the National Academy of Sciences of the USA"}
+MACRO {pp} {"Plasma Physics"}
+MACRO {ppcf} {"Plasma Physics and Controlled Fusion"}
+MACRO {prl} {"Physical Review Letters"}
+MACRO {pr} {"Physical Review"}
+MACRO {pra} {"Physical Review A: General Physics"}
+MACRO {ps} {"Physica Scripta"}
+MACRO {rmp} {"Reviews of Modern Physics"}
+MACRO {rsi} {"Review of Scientific Instruments"}
+MACRO {sjpp} {"Soviet Journal of Plasma Phys."}
+MACRO {spd} {"Soviet Physics-Doklady"}
+MACRO {sptp} {"Soviet Physics-Technical Physics"}
+MACRO {spu} {"Soviet Physics-Uspeki"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+% Now comes the computation for numeric labels.
+% We use either the sorted order or original order.
+% We still have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+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}
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+FUNCTION {begin.bib}
+{ preamble$ empty$
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" * write$ newline$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/phrmp.bst b/obsolete/biblio/bibtex/contrib/phrmp.bst
new file mode 100644
index 0000000000..b6dd3b0d62
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/phrmp.bst
@@ -0,0 +1,2150 @@
+% BibTeX styles for various physics journals (27-Feb-1990).
+% This file, physics.btx, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney@Princeton.EDU)
+ % of any bugs, improvements, etc.
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.btx
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create 1-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+% ALT_INCOLL alternate ordering of fields in incollections
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+% These are the original macros
+ % For Reviews of Modern Physics,
+% except first name not inverted yet and order of fields not hacked
+% This is the start of btxbst.doc
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% 1: an alphabetic label is used (if false then a numeric
+% label is used)
+% 1: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% 0: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% 1: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% 0: months are spelled out in full (if false, then
+% they're abbreviated)
+% 0: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+%# define PLAIN 1
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+ month
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+ { label extra.label sort.label }
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+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 :=
+}
+% the variables s and t are temporary string holders
+STRINGS { s t }
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+ { "," * 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 :=
+}
+% This function finishes all entries.
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+FUNCTION {new.sentence}
+{ skip$
+}
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+% The new.sentence.check functions are analogous.
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+FUNCTION {bracket}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "[" 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.edited}
+{ editor empty$
+ { "" }
+ { "edited by " editor format.names * }
+ if$
+}
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+ { title "t" change.case$ }
+ if$
+}
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+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 {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+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$
+}
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+FUNCTION {format.btitle}
+{ title emphasize
+}
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+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$
+}
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+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$
+}
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+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
+}
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+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.pages.a}
+{ pages empty$
+ { "" }
+ { "p." pages first.page tie.or.space.connect }
+ if$
+}
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+FUNCTION {format.vol.num.pages}
+{ volume field.or.null embolden
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.pages.a }
+ { ":" * pages first.page * }
+ if$
+ }
+ if$
+}
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+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$
+}
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+ { "in " booktitle emphasize * }
+ { "in " booktitle emphasize * ", " * format.edited * }
+ if$
+ }
+ if$
+}
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+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$
+}
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+ { "In " journal * }
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+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$
+}
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+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 * "}" *
+}
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+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 * "}" *
+}
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+ new.block
+ crossref missing$
+ { journal "journal" output.check
+ format.vol.num.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.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
+ new.block
+ note output
+ fin.entry
+}
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+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
+}
+% For the conference entry type, see inproceedings.
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% The conference function is included for Scribe compatibility.
+FUNCTION {conference} { inproceedings }
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+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
+ new.block
+ note output
+ fin.entry
+}
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+ new.block
+ note output
+ fin.entry
+ empty.misc.check
+}
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+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
+}
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+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$
+ new.block
+ note output
+ fin.entry
+}
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+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
+}
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+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
+}
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+FUNCTION {default.type} { misc }
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+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."}
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+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."}
+%% /usr/local/lib/tex/bibtex/phyjfull.btx, Tue Jun 30 08:37:48 1992
+%% Edit by Nelson H. F. Beebe <beebe@alfred.math.utah.edu>
+%% Change file names in leading comment
+% Journal Title Abbreviations from the Physical Review Style and Notation
+% Guide, July, 1983, in BAPS Vol. 28.
+% Selected by Cris Barnes and Charles Karney, March 1988
+% IMPORTANT!! Don't make changes to this file without making the
+% corresponding changes to
+% phyjabb.bib
+% phyjabb.btx
+MACRO {advp} {"Advances in Physics"}
+MACRO {ajp} {"American Journal of Physics"}
+MACRO {ao} {"Applied Optics"}
+MACRO {apl} {"Applied Physics Letters"}
+MACRO {apj} {"Astrophysical Journal"}
+MACRO {baps} {"Bulletin of the American Physical Society"}
+MACRO {cpc} {"Computer Physics Communications"}
+MACRO {cppcf} {"Comments on Plasma Physics and Controlled Fusion"}
+MACRO {fed} {"Fusion Engineering and Design"}
+MACRO {ft} {"Fusion Technology"}
+MACRO {ieeens} {"IEEE Transactions on Nuclear Science"}
+MACRO {ieeeps} {"IEEE Transactions on Plasma Science"}
+MACRO {ijimw} {"International Journal of Infrared and Millimeter Waves"}
+MACRO {ip} {"Infrared Physics"}
+MACRO {jap} {"Journal of Applied Physics"}
+MACRO {jcp} {"Journal of Computational Physics"}
+MACRO {jetp} {"Soviet Physics-JETP"}
+MACRO {jfe} {"Journal of Fusion Energy"}
+MACRO {jfm} {"Journal of Fluid Mechanics"}
+MACRO {jgr} {"Journal of Geophysical Research"}
+MACRO {jmp} {"Journal of Mathematical Physics"}
+MACRO {jne} {"Journal of Nuclear Energy"}
+MACRO {jnec} {"Journal of Nuclear Energy, Part C: Plasma Physics, Accelerators, Thermonuclear Research"}
+MACRO {jnm} {"Journal of Nuclear Materials"}
+MACRO {josa} {"Journal of the Optical Society of America"}
+MACRO {jpp} {"Journal of Plasma Physics"}
+MACRO {jpsj} {"Journal of the Physical Society of Japan"}
+MACRO {jvst} {"Journal of Vacuum Science and Technology"}
+MACRO {nedf} {"Nuclear Engineering and Design/Fusion"}
+MACRO {nf} {"Nuclear Fusion"}
+MACRO {nim} {"Nuclear Instruments and Methods"}
+MACRO {nimpr} {"Nuclear Instruments and Methods in Physics Research"}
+MACRO {nt/f} {"Nuclear Technology/Fusion"}
+MACRO {pf} {"Physics of Fluids"}
+MACRO {pfa} {"Physics of Fluids A: Fluid Dynamics"}
+MACRO {pfb} {"Physics of Fluids B: Plasma Physics"}
+MACRO {pl} {"Physics Letters"}
+MACRO {pla} {"Physics Letters A"}
+MACRO {pnas} {"Proceedings of the National Academy of Sciences of the USA"}
+MACRO {pp} {"Plasma Physics"}
+MACRO {ppcf} {"Plasma Physics and Controlled Fusion"}
+MACRO {prl} {"Physical Review Letters"}
+MACRO {pr} {"Physical Review"}
+MACRO {pra} {"Physical Review A: General Physics"}
+MACRO {ps} {"Physica Scripta"}
+MACRO {rmp} {"Reviews of Modern Physics"}
+MACRO {rsi} {"Review of Scientific Instruments"}
+MACRO {sjpp} {"Soviet Journal of Plasma Phys."}
+MACRO {spd} {"Soviet Physics-Doklady"}
+MACRO {sptp} {"Soviet Physics-Technical Physics"}
+MACRO {spu} {"Soviet Physics-Uspeki"}
+% Now we read in the .BIB entries.
+READ
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+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$
+}
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+INTEGERS { et.al.char.used }
+FUNCTION {initialize.et.al.char.used}
+{ #0 'et.al.char.used :=
+}
+EXECUTE {initialize.et.al.char.used}
+FUNCTION {format.lab.names}
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 >
+ { numnames #2 >
+ { s #1 "{vv }{ll}" format.name$ " et~al." * }
+ { s #1 "{vv }{ll}" format.name$
+ s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { " et~al." * }
+ { " and " * s #2 "{vv }{ll}" format.name$ * }
+ if$
+ }
+ if$
+ }
+ { s #1 "{vv }{ll}" format.name$ }
+ if$
+}
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key #3 text.prefix$ }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ { key #3 text.prefix$ }
+ 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 #9 text.prefix$ }
+ if$
+ }
+ { key #3 text.prefix$ }
+ 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 #9 text.prefix$ }
+ if$
+ }
+ { key #3 text.prefix$ }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+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 field.or.null purify$ #-1 #4 substring$
+ *
+ 'label :=
+ year field.or.null purify$ #-1 #4 substring$
+ *
+ sortify 'sort.label :=
+}
+% It doesn't seem like a particularly good idea to use an order-of-citation
+% reference list when using alphabetic labels, but we need to have a
+% special pass to calculate labels when this happens.
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+ if$ % apalike uses initials
+ s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here
+ nameptr numnames = t "others" = and
+ { "et al" * }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+% The sort.format.title function returns the argument,
+% but first any leading "A "'s, "An "'s, or "The "'s are removed.
+% The chop.word function uses s, so we need another string variable, t
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+% The auxiliary functions here, for the presort function, are analogous to
+% the ones for calc.label; the same comments apply, except that the
+% organization field takes precedence here over the key field. For sorting
+% purposes, we still remove a leading "The " from the organization field.
+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$
+}
+% There is a limit, entry.max$, on the length of an entry string variable
+% (which is what its sort.key$ is), so we take at most that many characters
+% of the constructed key, and hope there aren't many references that match
+% to that many characters!
+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}
+% And now we can sort
+SORT
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+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}
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+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$
+}
+EXECUTE {begin.bib}
+EXECUTE {init.state.consts}
+% Now we produce the output for all the entries
+ITERATE {call.type$}
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+EXECUTE {end.bib}
diff --git a/obsolete/biblio/bibtex/contrib/physics.bst b/obsolete/biblio/bibtex/contrib/physics.bst
new file mode 100644
index 0000000000..501c70067d
--- /dev/null
+++ b/obsolete/biblio/bibtex/contrib/physics.bst
@@ -0,0 +1,3520 @@
+%NAME: physics.bst
+% BibTeX styles for various physics journals.
+% This file, physics.bst, is based on the file btxbst.doc.
+ % Please notify Charles Karney (Karney%PPC.MFEnet@NMFECC.ARPA)
+ % of any bugs, improvements, etc.
+
+% Run this file through cpp to get specific versions. I have written
+% a version of cpp within Emacs. To access it put
+% (autoload 'cpp "tex$bibtex:cpp" ; Use cpp for BibTeX styles
+% "C preprocessor"
+% t)
+% into your .emacs file. Read in this file with
+% emacs tex$bibtex:physics.bst
+% and run cpp with e.g.,
+% M-x cpp <ret> aip <ret>
+% Save the resulting file to tex$latex:aip.bst.
+
+% To accomodate the variations we need (in addition to the definitions below)
+% ATIT_SUPPRESS: do not include the titles of journal articles
+% NAME_INVERT: put the initials last
+% NAME_UPPER: convert names to all caps.
+% MONTH_SUPPRESS: do not include months in journal articles
+% PAREN_DATE: dates go in parens in journal articles
+% DATE_FIRST: dates go before page numbers
+% VOLUME_SPACE: volume set off with space (not colon)
+% NUM_SUPPRESS: do not include numbers in journal articles
+% BOLD_VOL: volume numbers in bold face in journal articles
+% BRACKET_NOTE: notes in brackets
+% PAGE_START_J: include only starting page for journal articles
+% PAGE_START_O: include only starting page for other entries
+% PAGE_ABBREV: abbreviate page to p. and pages to pp.
+% PHYSICS_JOUR: include abbreviations for Physics journals
+% COMMA_DELIMIT: use comma (instead of period) to divide a citation
+% NOTE_SUPPRESS: suppress the note
+% NOTE_BRACKET: put note in brackets
+% MAX_NAMES: max number of authors before using et al (0 = infinity)
+% MIN_NAMES: number of authors to list with et al.
+% EDIT_VAR: use "edited by ..." instead of "..., editors"
+% RMP_LABELS: create RMP-style labels
+% KEY_CITE: use key as label
+% NAMED_REFS: use (Smith, 1988) style of citations
+% CSC_NAMES: names set in caps and small caps
+% JOUR_DEEMPH: don't emphasize journal name
+% ETAL_EMPH: emphasize et al.
+
+% These are all boolean (0 or 1) except for MAX_NAMES and MIN_NAMES.
+% These need to satisfy 0 <= MIN_NAMES <= MAX_NAMES.
+% The rule here is that if all these are defined to be zero, we revert to
+% the standard styles. For that reason we initialize them all to 0.
+
+# define ATIT_SUPPRESS 0
+# define NAME_INVERT 0
+# define NAME_UPPER 0
+# define MONTH_SUPPRESS 0
+# define PAREN_DATE 0
+# define DATE_FIRST 0
+# define VOLUME_SPACE 0
+# define NUM_SUPPRESS 0
+# define BOLD_VOL 0
+# define BRACKET_NOTE 0
+# define PAGE_START_J 0
+# define PAGE_START_O 0
+# define PAGE_ABBREV 0
+# define PHYSICS_JOUR 0
+# define COMMA_DELIMIT 0
+# define NOTE_SUPPRESS 0
+# define NOTE_BRACKET 0
+# define MAX_NAMES 0
+# define MIN_NAMES 0
+# define EDIT_VAR 0
+# define RMP_LABELS 0
+# define KEY_CITE 0
+# define NAMED_REFS 0
+# define CSC_NAMES 0
+# define JOUR_DEEMPH 0
+# define ETAL_EMPH 0
+
+% These are the original macros
+# define LAB_ALPH 0
+# define SORTED 0
+# define NAME_FULL 0
+# define ATIT_LOWER 0
+# define MONTH_FULL 0
+# define JOUR_FULL 0
+
+#ifdef AIP
+ % For American Institute of Physics Journals
+# define ATIT_SUPPRESS 1
+# define PAGE_START_J 1
+# define PHYSICS_JOUR 1
+# define MAX_NAMES 5
+# define MIN_NAMES 1
+# define EDIT_VAR 1
+# define ATIT_LOWER 1
+# define COMMA_DELIMIT 1
+# define VOLUME_SPACE 1
+# define MONTH_SUPPRESS 1
+# define PAREN_DATE 1
+# define NUM_SUPPRESS 1
+# define BOLD_VOL 1
+# define JOUR_DEEMPH 1
+#endif
+#ifdef NF
+ % For Nuclear Fusion
+% same as AIP except for NAME_INVERT, NAME_UPPER, DATE_FIRST and
+% MIN_NAMES and MAX_NAMES set to 0 (infinity)
+# define ATIT_SUPPRESS 1
+# define PAGE_START_J 1
+# define PHYSICS_JOUR 1
+# define EDIT_VAR 1
+# define ATIT_LOWER 1
+# define COMMA_DELIMIT 1
+# define VOLUME_SPACE 1
+# define MONTH_SUPPRESS 1
+# define PAREN_DATE 1
+# define NUM_SUPPRESS 1
+# define BOLD_VOL 1
+# define NAME_INVERT 1
+# define NAME_UPPER 1
+# define DATE_FIRST 1
+# define JOUR_DEEMPH 1
+#endif
+#ifdef NFLET
+ % For Nuclear Fusion Letters
+% same as NF except for MIN_NAMES and MAX_NAMES set to 5
+# define ATIT_SUPPRESS 1
+# define PAGE_START_J 1
+# define PHYSICS_JOUR 1
+# define EDIT_VAR 1
+# define ATIT_LOWER 1
+# define COMMA_DELIMIT 1
+# define VOLUME_SPACE 1
+# define MONTH_SUPPRESS 1
+# define PAREN_DATE 1
+# define NUM_SUPPRESS 1
+# define BOLD_VOL 1
+# define NAME_INVERT 1
+# define NAME_UPPER 1
+# define DATE_FIRST 1
+# define MAX_NAMES 5
+# define MIN_NAMES 5
+# define JOUR_DEEMPH 1
+#endif
+#ifdef IAEA
+ % For IAEA Conferences
+% same as NF except for MIN_NAMES and MAX_NAMES set to 1
+# define ATIT_SUPPRESS 1
+# define PAGE_START_J 1
+# define PHYSICS_JOUR 1
+# define EDIT_VAR 1
+# define ATIT_LOWER 1
+# define COMMA_DELIMIT 1
+# define VOLUME_SPACE 1
+# define MONTH_SUPPRESS 1
+# define PAREN_DATE 1
+# define NUM_SUPPRESS 1
+# define BOLD_VOL 1
+# define NAME_INVERT 1
+# define NAME_UPPER 1
+# define DATE_FIRST 1
+# define MAX_NAMES 1
+# define MIN_NAMES 1
+# define JOUR_DEEMPH 1
+#endif
+#ifdef CPC
+ % For Computer Physics Communications
+% same as AIP except for NAME_INVERT, DATE_FIRST
+# define ATIT_SUPPRESS 1
+# define PAGE_START_J 1
+# define PHYSICS_JOUR 1
+# define MAX_NAMES 5
+# define MIN_NAMES 1
+# define EDIT_VAR 1
+# define ATIT_LOWER 1
+# define COMMA_DELIMIT 1
+# define VOLUME_SPACE 1
+# define MONTH_SUPPRESS 1
+# define PAREN_DATE 1
+# define NUM_SUPPRESS 1
+# define BOLD_VOL 1
+# define NAME_INVERT 1
+# define DATE_FIRST 1
+# define JOUR_DEEMPH 1
+#endif
+#ifdef RMP
+ % For Reviews of Modern Physics,
+% except first name not inverted yet and order of fields not hacked
+# define LAB_ALPH 1
+# define SORTED 1
+# define RMP_LABELS 1
+# define ATIT_SUPPRESS 1
+# define ATIT_LOWER 1
+# define MONTH_SUPRESS 1
+# define NUM_SUPPRESS 1
+# define VOL_SUPPRESS 1
+# define BOLD_VOL 1
+# define BRACKET_NOTE 1
+# define PAGE_START_J 1
+# define PAGE_START_O 1
+# define PAGE_ABBREV 1
+# define PHYSICS_JOUR 1
+# define COMMA_DELIMIT 1
+# define EDIT_VAR 1
+# define JOUR_DEEMPH 1
+#endif
+#ifdef REPORT
+ % For internal reports
+% same as AIP except for ATIT_SUPPRESS, MONTH_SUPPRESS, PAGE_START_J,
+% NUM_SUPPRESS, MAX_NAMES, MIN_NAMES
+# define PHYSICS_JOUR 1
+# define EDIT_VAR 1
+# define ATIT_LOWER 0
+# define COMMA_DELIMIT 1
+# define VOLUME_SPACE 1
+# define PAREN_DATE 1
+# define BOLD_VOL 1
+# define JOUR_DEEMPH 1
+#endif
+#ifdef APALIKE
+ % For American Psychological Association
+ % (same as ALPHA but with NAMED_REFS set and NAME_FULL unset)
+# define LAB_ALPH 1
+# define SORTED 1
+# define NAME_FULL 0
+# define ATIT_LOWER 1
+# define MONTH_FULL 1
+# define JOUR_FULL 1
+# define NAMED_REFS 1
+# define NAME_INVERT 1
+#endif
+#ifdef PPCF
+ % A physics version of APALIKE
+# define PHYSICS_JOUR 1
+# define LAB_ALPH 1
+# define SORTED 1
+# define NAME_FULL 0
+# define ATIT_LOWER 0
+# define ATIT_SUPPRESS 1
+# define MONTH_FULL 1
+# define JOUR_FULL 0
+# define NAMED_REFS 1
+# define NAME_INVERT 1
+# define ETAL_EMPH 1
+# define CSC_NAMES 1
+# define NUM_SUPPRESS 1
+# define BOLD_VOL 1
+# define VOLUME_SPACE 1
+#endif
+
+% This is the start of btxbst.doc
+
+% BibTeX `plain' family
+ % version 0.99b 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.
+ % The file btxbst.doc has the documentation for this style.
+#if NAMED_REFS
+% BibTeX `apalike' bibliography style (24-Jan-88 version)
+% Adapted from the `alpha' style, version 0.99a; for BibTeX version 0.99a.
+% Copyright (C) 1988, all rights reserved.
+% Copying of this file is allowed, provided that if you make any changes at all
+% you name it something other than `apalike.bst'.
+% This restriction helps ensure that all copies are identical.
+% Differences between this style and `alpha' are generally heralded by a `%'.
+% The file btxbst.doc has the documentation for alpha.bst.
+%
+% This style should be used with the `apalike' LaTeX style (apalike.sty).
+% \cite's come out like "(Jones, 1986)" in the text but there are no labels
+% in the bibliography, and something like "(1986)" comes out immediately
+% after the author. Author (and editor) names appear as last name, comma,
+% initials. A `year' field is required for every entry, and so is either
+% an author (or in some cases, an editor) field or a key field.
+%
+% Editorial note:
+% Many journals require a style like `apalike', but I strongly, strongly,
+% strongly recommend that you not use it if you have a choice---use something
+% like `plain' instead. Mary-Claire van Leunen (A Handbook for Scholars,
+% Knopf, 1979) argues convincingly that a style like `plain' encourages better
+% writing than one like `apalike'. Furthermore the strongest arguments for
+% using an author-date style like `apalike'---that it's "the most practical"
+% (The Chicago Manual of Style, University of Chicago Press, thirteenth
+% edition, 1982, pages 400--401)---fall flat on their face with the new
+% computer-typesetting technology. For instance page 401 anachronistically
+% states "The chief disadvantage of [a style like `plain'] is that additions
+% or deletions cannot be made after the manuscript is typed without changing
+% numbers in both text references and list." LaTeX sidesteps the disadvantage.
+%
+% History:
+% 15-sep-86 (SK,OP) Original version, by Susan King and Oren Patashnik.
+% 10-nov-86 (OP) Truncated the sort.key$ string to the correct length
+% in bib.sort.order to eliminate error message.
+% 24-jan-88 (OP) Updated for BibTeX version 0.99a, from alpha.bst 0.99a;
+% apalike now sorts by author, then year, then title;
+% THIS `apalike' VERSION DOES NOT WORK WITH BIBTEX 0.98i.
+#endif APALIKE
+% Please notify Oren Patashnik (PATASHNIK@SCORE.STANFORD.EDU) of any bugs in
+% these standard styles or in this documentation file.
+%
+% This is file btxbxt.doc; it helps document bibliography styles,
+% and is also a template file that you can use to make
+% several different style files, if you have access to a C preprocessor.
+% For example, the standard styles were made by doing something like
+% cpp -P -DPLAIN btxbst.doc plain.txt
+% cpp -P -DUNSRT btxbst.doc unsrt.txt
+% cpp -P -DALPHA btxbst.doc alpha.txt
+% cpp -P -DABBRV btxbst.doc abbrv.txt
+% and then renaming after removing unwanted comments and blank lines.
+% If you don't have access,
+% you can edit this file by hand to imitate the preprocessor,
+% with the following explanation of the C preprocessor constructs used here.
+%
+% The output of the preprocessor is the same as the input, except that certain
+% lines will be excluded (and some blank lines will be added). The sequence
+% #if VAR
+% lines to be included when VAR is not zero
+% #else
+% lines to be included when VAR is zero
+% #endif
+% (with the #-signs appearing in column 1) means that one set or the other of
+% the lines are to be included depending on the value of VAR.
+% The #else part is optional. Comments can be added after #else and #endif.
+% Variables can be set by
+% #define VAR value
+% and one can also use #ifdef VAR to see if VAR has any value, and #ifndef
+% to see if it has none.
+% Another #if form used in this file is #if !VAR, which includes the lines
+% after the #if only if VAR is zero.
+%
+% Convention: Use all uppercase identifiers for these preprocessor variables
+% so you can spot them easily
+%
+% The command line to the preprocessor should define one of PLAIN, UNSRT, ALPHA
+% or ABBRV (though PLAIN will be used by default if none is given),
+% and the following lines will set various boolean variables to control the
+% various lines that are chosen from the rest of the file.
+% Each boolean variable should be set true (1) or false (0) in each style.
+% Here are the current variables, and their meanings:
+% LAB_ALPH: an alphabetic label is used (if false then a numeric
+% label is used)
+% SORTED: the entries should be sorted by label (if nonnumeric)
+% and other info, like authors (if false, then
+% entries remain in order of occurrence)
+% NAME_FULL: the authors, editors, etc., get the full names as
+% given in the bibliography file (if false, the first
+% names become initials)
+% ATIT_LOWER: titles of non-"books" (e.g., articles) should be
+% converted to lower-case, except the first letter or
+% first letter after a colon
+% (if false then they appear as in the database)
+% MONTH_FULL: months are spelled out in full (if false, then
+% they're abbreviated)
+% JOUR_FULL: macro journal names are spelled out in full
+% (if false then they are abbreviated, currently
+% as they appear in ACM publications)
+#ifndef UNSRT
+# ifndef ALPHA
+# ifndef ABBRV
+%# define PLAIN 1
+# endif
+# endif
+#endif
+#ifdef PLAIN
+% plain style (sorted numbers)
+# define LAB_ALPH 0
+# define SORTED 1
+# define NAME_FULL 1
+# define ATIT_LOWER 1
+# define MONTH_FULL 1
+# define JOUR_FULL 1
+#endif
+#ifdef UNSRT
+% unsrt style (unsorted numbers)
+# define LAB_ALPH 0
+# define SORTED 0
+# define NAME_FULL 1
+# define ATIT_LOWER 1
+# define MONTH_FULL 1
+# define JOUR_FULL 1
+#endif
+#ifdef ALPHA
+% alpha style (sorted short alphabetics)
+# define LAB_ALPH 1
+# define SORTED 1
+# define NAME_FULL 1
+# define ATIT_LOWER 1
+# define MONTH_FULL 1
+# define JOUR_FULL 1
+#endif
+#ifdef ABBRV
+% abbrv style (sorted numbers, with abbreviations)
+# define LAB_ALPH 0
+# define SORTED 1
+# define NAME_FULL 0
+# define ATIT_LOWER 1
+# define MONTH_FULL 0
+# define JOUR_FULL 0
+#endif
+%
+% Entry formatting: Similar to that recommended by Mary-Claire van Leunen
+% in "A Handbook for Scholars". Book-like titles are italicized
+% (emphasized) and non-book titles are converted to sentence
+% capitilization (and not enclosed in quotes).
+% This file outputs a \newblock between major blocks of an entry
+% (the name \newblock is analogous to the names \newline and \newpage)
+% so that the user can obtain an "open" format, which has a line break
+% before each block and lines after the first are indented within blocks,
+% by giving the optional \documentstyle argument `openbib';
+% The default is the "closed" format---blocks runs together.
+%
+% Citation alphabetic label format:
+% [Knu73] for single author (or editor or key)
+% [AHU83] (first letters of last names) for multiple authors
+%
+% Citation label numberic format:
+% [number]
+%
+% Reference list ordering for sorted, alphabetic lables:
+% alphabetical by citation label, then by author(s) or whatever
+% passes for author in the absence of one, then by year,
+% then title
+%
+% Reference list ordering for sorted, numeric lables:
+% alphabetical by author(s) or whatever passes
+% for author in the absence of one, then by year, then title
+%
+% Reference list ordering for unsorted:
+% by the order cited in the text
+%
+% History
+% 12/16/84 (HWT) Original `plain' version, by Howard Trickey.
+% 12/23/84 (LL) Some comments made by Leslie Lamport.
+% 2/16/85 (OP) Changes based on LL's comments, Oren Patashnik.
+% 2/17/85 (HWT) Template file and other standard styles made.
+% 3/28/85 (OP) First release, version 0.98b for BibTeX 0.98f.
+% 5/ 9/85 (OP) Version 0.98c for BibTeX 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.
+% 1/24/88 (OP) Version 0.99a for BibTeX 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+' instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook titles;
+% INBOOK and INCOLLECTION take an optional type (e.g.
+% type = "Section"), overriding the default "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series field;
+% PROCEEDINGS and INPROCEEDINGS now use the address field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional field.
+% 3/23/88 (OP) Version 0.99b for BibTeX 0.99c---changed the three
+% erroneous occurrences of `cite ' to `cite$ '; this
+% change didn't affect the four standard styles, so the
+% 0.99a versions of those styles are still current.
+%
+% The ENTRY declaration
+% Like Scribe's (according to pages 231-2 of the April '84 edition),
+% but no fullauthor or editors fields because BibTeX does name handling.
+% The annote field is commented out here because this family doesn't
+% include an annotated bibliography style. And in addition to the fields
+% listed here, BibTeX has a built-in crossref field, explained later.
+
+ENTRY
+% Fields:
+ { address
+% Usually the address of a publisher or other type of organization.
+% Put information in this field only if it helps the reader find the
+% thing---for example you should omit the address of a major
+% publisher entirely. For a PROCEEDINGS or an INPROCEEDINGS,
+% however, it's the address of the conference; for those two entry
+% types, include the publisher's or organization's address, if
+% necessary, in the publisher or organization field.
+% annote
+% Long annotation---for annotated bibliographies (begins sentence).
+ author
+% Name(s) of author(s), in BibTeX name format.
+ booktitle
+% Book title when the thing being referenced isn't the whole book.
+% For book entries, the title field should be used instead.
+ chapter
+% Chapter (or section or whatever) number.
+ edition
+% Edition of a book---should be an ordinal (e.g., "Second").
+ editor
+% Name(s) of editor(s), in BibTeX name format.
+% If there is also an author field, then the editor field should be
+% for the book or collection that the work appears in.
+ howpublished
+% How something strange has been published (begins sentence).
+ institution
+% Sponsoring institution of a technical report.
+ journal
+% Journal name (macros are provided for many).
+ key
+% Alphabetizing, labeling, and cross-referencing key
+% (needed when an entry has no author or editor).
+#if !NAMED_REFS
+ month
+#else NAMED_REFS
+% month not used in apalike
+#endif
+% Month (macros are provided).
+ note
+% To help the reader find a reference (begins sentence).
+ number
+% Number of a journal or technical report, or of a work in a series.
+ organization
+% Organization sponsoring a conference (or publishing a manual); if
+% the editor (or author) is empty, and if the organization produces
+% an awkward label or cross reference, you should put appropriately
+% condensed organization information in the key field as well.
+ pages
+% Page number or numbers (use `--' to separate a range, use `+'
+% to indicate pages following that don't form a simple range).
+ publisher
+% Publisher name.
+ school
+% School name (for theses).
+ series
+% The name of a series or set of books.
+% An individual book will will also have it's own title.
+ title
+% The title of the thing you're referred to.
+ type
+% Type of a Techreport (e.g., "Research Note") to be used instead of
+% the default "Technical Report"; or, similarly, the type of a
+% thesis; or of a part of a book.
+ volume
+% The volume number of a journal or multivolume work.
+ year
+% The year should contain only numerals (technically, it should end
+% with four numerals, after purification; doesn't a begin sentence).
+ }
+% There are no integer entry variables
+ {}
+% These string entry variables are used to form the citation label.
+% In a storage pinch, sort.label can be easily computed on the fly.
+#if LAB_ALPH
+#if SORTED
+ { label extra.label sort.label }
+#else !SORTED
+% It doesn't seem like a good idea to use an order-of-citation
+% reference list when using alphabetic labels, but when this happens
+% we do things a little differently
+ { label }
+#endif SORTED
+#else !LAB_ALPH
+ { label }
+#endif LAB_ALPH
+
+% Each entry function starts by calling output.bibitem, to write the
+% \bibitem and its arguments to the .BBL file. Then the various fields
+% are formatted and printed by output or output.check. Those functions
+% handle the writing of separators (commas, periods, \newblock's),
+% taking care not to do so when they are passed a null string.
+% Finally, fin.entry is called to add the final period and finish the
+% entry.
+%
+% A bibliographic reference is formatted into a number of `blocks':
+% in the open format, a block begins on a new line and subsequent
+% lines of the block are indented. A block may contain more than
+% one sentence (well, not a grammatical sentence, but something to
+% be ended with a sentence ending period). The entry functions should
+% call new.block whenever a block other than the first is about to be
+% started. They should call new.sentence whenever a new sentence is
+% to be started. The output functions will ensure that if two
+% new.sentence's occur without any non-null string being output between
+% them then there won't be two periods output. Similarly for two
+% successive new.block's.
+%
+% The output routines don't write their argument immediately.
+% Instead, by convention, that argument is saved on the stack to be
+% output next time (when we'll know what separator needs to come
+% after it). Meanwhile, the output routine has to pop the pending
+% output off the stack, append any needed separator, and write it.
+%
+% To tell which separator is needed, we maintain an output.state.
+% It will be one of these values:
+% before.all just after the \bibitem
+% mid.sentence in the middle of a sentence: comma needed
+% if more sentence is output
+% after.sentence just after a sentence: period needed
+% after.block just after a block (and sentence):
+% period and \newblock needed.
+% Note: These styles don't use after.sentence
+%
+% VAR: output.state : INTEGER -- state variable for output
+%
+% The output.nonnull function saves its argument (assumed to be nonnull)
+% on the stack, and writes the old saved value followed by any needed
+% separator. The ordering of the tests is decreasing frequency of
+% occurrence.
+%
+% output.nonnull(s) ==
+% BEGIN
+% s := argument on stack
+% if output.state = mid.sentence then
+% write$(pop() * ", ")
+% -- "pop" isn't a function: just use stack top
+% else
+% if output.state = after.block then
+% write$(add.period$(pop()))
+% newline$
+% write$("\newblock ")
+% else
+% if output.state = before.all then
+% write$(pop())
+% else -- output.state should be after.sentence
+% write$(add.period$(pop()) * " ")
+% fi
+% fi
+% output.state := mid.sentence
+% fi
+% push s on stack
+% END
+%
+% The output function calls output.nonnull if its argument is non-empty;
+% its argument may be a missing field (thus, not necessarily a string)
+%
+% output(s) ==
+% BEGIN
+% if not empty$(s) then output.nonnull(s)
+% fi
+% END
+%
+% The output.check function is the same as the output function except that, if
+% necessary, output.check warns the user that the t field shouldn't be empty
+% (this is because it probably won't be a good reference without the field;
+% the entry functions try to make the formatting look reasonable even when
+% such fields are empty).
+%
+% output.check(s,t) ==
+% BEGIN
+% if empty$(s) then
+% warning$("empty " * t * " in " * cite$)
+% else output.nonnull(s)
+% fi
+% END
+%
+% The output.bibitem function writes the \bibitem for the current entry
+% (the label should already have been set up), and sets up the separator
+% state for the output functions. And, it leaves a string on the stack
+% as per the output convention.
+%
+% output.bibitem ==
+% BEGIN
+% newline$
+% write$("\bibitem[") % for alphabetic labels,
+% write$(label) % these three lines
+% write$("]{") % are used
+% write$("\bibitem{") % this line for numeric labels
+% write$(cite$)
+% write$("}")
+% push "" on stack
+% output.state := before.all
+% END
+%
+% The fin.entry function finishes off an entry by adding a period to the
+% string remaining on the stack. If the state is still before.all
+% then nothing was produced for this entry, so the result will look bad,
+% but the user deserves it. (We don't omit the whole entry because the
+% entry was cited, and a bibitem is needed to define the citation label.)
+%
+% fin.entry ==
+% BEGIN
+% write$(add.period$(pop()))
+% newline$
+% END
+%
+% The new.block function prepares for a new block to be output, and
+% new.sentence prepares for a new sentence.
+%
+% new.block ==
+% BEGIN
+% if output.state <> before.all then
+% output.state := after.block
+% fi
+% END
+%
+% new.sentence ==
+% BEGIN
+% if output.state <> after.block then
+% if output.state <> before.all then
+% output.state := after.sentence
+% fi
+% fi
+% END
+%
+
+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 :=
+}
+
+% the variables s and t are temporary string holders
+
+STRINGS { s t }
+
+FUNCTION {output.nonnull}
+{ 's :=
+ output.state mid.sentence =
+ { ", " * write$ }
+ { output.state after.block =
+#if !COMMA_DELIMIT
+ { add.period$ write$
+#else COMMA_DELIMIT
+ { "," * write$
+#endif
+ 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$
+}
+
+#if NAMED_REFS
+% apalike needs this function because
+% the year has special punctuation;
+% apalike ignores the month
+FUNCTION {output.year.check}
+{ year empty$
+ { "empty year in " cite$ * warning$ }
+ { write$
+ " (" year * extra.label * ")" *
+ mid.sentence 'output.state :=
+ }
+ if$
+}
+#endif NAMED_REFS
+
+FUNCTION {output.bibitem}
+{ newline$
+#if LAB_ALPH
+ "\bibitem[" write$
+ label write$
+ "]{" write$
+#else
+ "\bibitem{" write$
+#endif LAB_ALPH
+ cite$ write$
+ "}" write$
+ newline$
+ ""
+ before.all 'output.state :=
+}
+
+% This function finishes all entries.
+
+FUNCTION {fin.entry}
+{ add.period$
+ write$
+ newline$
+}
+
+FUNCTION {new.block}
+{ output.state before.all =
+ 'skip$
+ { after.block 'output.state := }
+ if$
+}
+
+FUNCTION {new.sentence}
+#if !COMMA_DELIMIT
+{ output.state after.block =
+ 'skip$
+ { output.state before.all =
+ 'skip$
+ { after.sentence 'output.state := }
+ if$
+ }
+ if$
+#else COMMA_DELIMIT
+{ skip$
+#endif
+}
+
+% These three functions pop one or two (integer) arguments from the stack
+% and push a single one, either 0 or 1.
+% The 'skip$ in the `and' and `or' functions are used because
+% the corresponding if$ would be idempotent
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
+}
+
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+% Sometimes we begin a new block only if the block will be big enough. The
+% new.block.checka function issues a new.block if its argument is nonempty;
+% new.block.checkb does the same if either of its TWO arguments is nonempty.
+
+#if !NAMED_REFS
+FUNCTION {new.block.checka}
+{ empty$
+ 'skip$
+ 'new.block
+ if$
+}
+#endif !NAMED_REFS
+
+FUNCTION {new.block.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.block
+ if$
+}
+
+#if !NAMED_REFS
+% The new.sentence.check functions are analogous.
+
+FUNCTION {new.sentence.checka}
+{ empty$
+ 'skip$
+ 'new.sentence
+ if$
+}
+
+FUNCTION {new.sentence.checkb}
+{ empty$
+ swap$ empty$
+ and
+ 'skip$
+ 'new.sentence
+ if$
+}
+#endif !NAMED_REFS
+
+% Here are some functions for formatting chunks of an entry.
+% By convention they either produce a string that can be followed by
+% a comma or period (using add.period$, so it is OK to end in a period),
+% or they produce the null string.
+%
+% A useful utility is the field.or.null function, which checks if the
+% argument is the result of pushing a `missing' field (one for which no
+% assignment was made when the current entry was read in from the database)
+% or the result of pushing a string having no non-white-space characters.
+% It returns the null string if so, otherwise it returns the field string.
+% Its main (but not only) purpose is to guarantee that what's left on the
+% stack is a string rather than a missing field.
+%
+% field.or.null(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return s
+% END
+%
+% Another helper function is emphasize, which returns the argument emphazised,
+% if that is non-empty, otherwise it returns the null string. Italic
+% corrections aren't used, so this function should be used when punctation
+% will follow the result.
+%
+% emphasize(s) ==
+% BEGIN
+% if empty$(s) then return ""
+% else return "{\em " * s * "}"
+%
+% The format.names function formats the argument (which should be in
+% BibTeX name format) into "First Von Last, Junior", separated by commas
+% and with an "and" before the last (but ending with "et~al." if the last
+% of multiple authors is "others"). This function's argument should always
+% contain at least one name.
+%
+% VAR: nameptr, namesleft, numnames: INTEGER
+% pseudoVAR: nameresult: STRING (it's what's accumulated on the stack)
+%
+% format.names(s) ==
+% BEGIN
+% nameptr := 1
+% numnames := num.names$(s)
+% namesleft := numnames
+% while namesleft > 0
+% do
+% % for full names:
+% t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}")
+% % for abbreviated first names:
+% t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}")
+% if nameptr > 1 then
+% if namesleft > 1 then nameresult := nameresult * ", " * t
+% else if numnames > 2
+% then nameresult := nameresult * ","
+% fi
+% if t = "others"
+% then nameresult := nameresult * " et~al."
+% else nameresult := nameresult * " and " * t
+% fi
+% fi
+% else nameresult := t
+% fi
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% return nameresult
+% END
+%
+% The format.authors function returns the result of format.names(author)
+% if the author is present, or else it returns the null string
+%
+% format.authors ==
+% BEGIN
+% if empty$(author) then return ""
+% else return format.names(author)
+% fi
+% END
+%
+% Format.editors is like format.authors, but it uses the editor field,
+% and appends ", editor" or ", editors"
+%
+% format.editors ==
+% BEGIN
+% if empty$(editor) then return ""
+% else
+% if num.names$(editor) > 1 then
+% return format.names(editor) * ", editors"
+% else
+% return format.names(editor) * ", editor"
+% fi
+% fi
+% END
+%
+% Other formatting functions are similar, so no "comment version" will be
+% given for them.
+%
+% The `pop$' in this function gets rid of the duplicate `empty' value and
+% the `skip$' returns the duplicate field value
+
+FUNCTION {field.or.null}
+{ duplicate$ empty$
+ { pop$ "" }
+ 'skip$
+ if$
+}
+
+FUNCTION {emphasize}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\em " swap$ * "}" * }
+ if$
+}
+
+#if CSC_NAMES
+FUNCTION {caps}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\sc " swap$ * "}" * }
+ if$
+}
+#endif
+
+#if BOLD_VOL
+FUNCTION {embolden}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "{\bf " swap$ * "}" * }
+ if$
+}
+#endif
+
+#if BRACKET_NOTE
+FUNCTION {bracket}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "[" swap$ * "]" * }
+ if$
+}
+#endif
+
+#if PAREN_DATE
+FUNCTION {paren}
+{ duplicate$ empty$
+ { pop$ "" }
+ { "(" swap$ * ")" * }
+ if$
+}
+#endif
+
+INTEGERS { nameptr namesleft numnames }
+
+#if MAX_NAMES
+INTEGERS { etal }
+#endif
+
+FUNCTION {format.names}
+{ 's :=
+ #1 'nameptr :=
+ s num.names$ 'numnames :=
+#if !MAX_NAMES
+ numnames 'namesleft :=
+#else MAX_NAMES
+ numnames #MAX_NAMES >
+ s numnames "{ll}" format.name$ "others" = numnames #MIN_NAMES > and
+ or 'etal :=
+ etal
+ { #MIN_NAMES #1 + 'namesleft := }
+ { numnames 'namesleft := }
+ if$
+#endif
+ { namesleft #0 > }
+#if NAME_FULL
+#if !NAME_INVERT
+ { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=
+#else NAME_INVERT
+ { s nameptr "{vv~}{ll}{, jj}{, ff}" format.name$ 't :=
+#endif
+#else
+#if !NAME_INVERT
+ { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't :=
+#else NAME_INVERT
+ { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := % last name first
+#endif
+#endif NAME_FULL
+#if NAME_UPPER
+ t "others" =
+ 'skip$
+ { t "u" change.case$ 't := }
+ if$
+#endif
+#if CSC_NAMES
+ t "others" =
+ 'skip$
+ { t caps 't := }
+ if$
+#endif
+ nameptr #1 >
+ { namesleft #1 >
+ { ", " * t * }
+#if !MAX_NAMES
+ { numnames #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+#if !ETAL_EMPH
+ { " et~al." * }
+#else ETAL_EMPH
+ { " {\em et~al.}" * }
+#endif ETAL_EMPH
+ { " and " * t * }
+ if$
+ }
+#else MAX_NAMES
+ { nameptr #2 >
+ { "," * }
+ 'skip$
+ if$
+ t "others" =
+ etal or
+#if !ETAL_EMPH
+ { " et~al." * }
+#else ETAL_EMPH
+ { " {\em et~al.}" * }
+#endif ETAL_EMPH
+ { " and " * t * }
+ if$
+ }
+#endif
+ if$
+ }
+ 't
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+FUNCTION {format.authors}
+{ author empty$
+ { "" }
+ { author format.names }
+ if$
+}
+
+#if NAMED_REFS
+FUNCTION {format.key} % this function is just for apalike
+{ empty$
+ { key field.or.null }
+ { "" }
+ if$
+}
+#endif NAMED_REFS
+
+FUNCTION {format.editors}
+{ editor empty$
+ { "" }
+ { editor format.names
+ editor num.names$ #1 >
+ { ", editors" * }
+ { ", editor" * }
+ if$
+ }
+ if$
+}
+
+#if EDIT_VAR
+FUNCTION {format.edited}
+{ editor empty$
+ { "" }
+ { "edited by " editor format.names * }
+ if$
+}
+#endif
+
+% The format.title function is used for non-book-like titles.
+% For most styles we convert to lowercase (except for the very first letter,
+% and except for the first one after a colon (followed by whitespace)),
+% and hope the user has brace-surrounded words that need to stay capitilized;
+% for some styles, however, we leave it as it is in the database.
+
+FUNCTION {format.title}
+{ title empty$
+ { "" }
+#if ATIT_LOWER
+ { title "t" change.case$ }
+#else
+ 'title
+#endif ATIT_LOWER
+ if$
+}
+
+% By default, BibTeX sets the global integer variable global.max$ to the BibTeX
+% constant glob_str_size, the maximum length of a global string variable.
+% Analogously, BibTeX sets the global integer variable entry.max$ to
+% ent_str_size, the maximum length of an entry string variable.
+% The style designer may change these if necessary (but this is unlikely)
+
+% The n.dashify function makes each single `-' in a string a double `--'
+% if it's not already
+%
+% pseudoVAR: pageresult: STRING (it's what's accumulated on the stack)
+%
+% n.dashify(s) ==
+% BEGIN
+% t := s
+% pageresult := ""
+% while (not empty$(t))
+% do
+% if (first character of t = "-")
+% then
+% if (next character isn't)
+% then
+% pageresult := pageresult * "--"
+% t := t with the "-" removed
+% else
+% while (first character of t = "-")
+% do
+% pageresult := pageresult * "-"
+% t := t with the "-" removed
+% od
+% fi
+% else
+% pageresult := pageresult * the first character
+% t := t with the first character removed
+% fi
+% od
+% return pageresult
+% END
+
+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$
+}
+
+#define TEMP 0
+#if PAGE_START_J
+#define TEMP 1
+#endif
+#if PAGE_START_O
+#define TEMP 1
+#endif
+
+#if TEMP
+FUNCTION {first.page}
+{ 't :=
+ ""
+ { t empty$ not t #1 #1 substring$ "-" = not and }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ while$
+}
+#endif
+
+#if !NAMED_REFS
+% The format.date function is for the month and year, but we give a warning if
+% there's an empty year but the month is there, and we return the empty string
+% if they're both empty.
+
+FUNCTION {format.date}
+{ year empty$
+#if !MONTH_SUPPRESS
+ { month empty$
+ { "" }
+ { "there's a month but no year in " cite$ * warning$
+ month
+ }
+ if$
+ }
+ { month empty$
+ 'year
+ { month " " * year * }
+ if$
+ }
+#else MONTH_SUPPRESS
+ { "" }
+ 'year
+#endif
+ if$
+}
+#endif !NAMED_REFS
+
+% The format.btitle is for formatting the title field when it is a book-like
+% entry---the style used here keeps it in uppers-and-lowers and emphasizes it.
+
+FUNCTION {format.btitle}
+{ title emphasize
+}
+
+% For several functions we'll need to connect two strings with a
+% tie (~) if the second one isn't very long (fewer than 3 characters).
+% The tie.or.space.connect function does that. It concatenates the two
+% strings on top of the stack, along with either a tie or space between
+% them, and puts this concatenation back onto the stack:
+%
+% tie.or.space.connect(str1,str2) ==
+% BEGIN
+% if text.length$(str2) < 3
+% then return the concatenation of str1, "~", and str2
+% else return the concatenation of str1, " ", and str2
+% END
+
+FUNCTION {tie.or.space.connect}
+{ duplicate$ text.length$ #3 <
+ { "~" }
+ { " " }
+ if$
+ swap$ * *
+}
+
+% The either.or.check function complains if both fields or an either-or pair
+% are nonempty.
+%
+% either.or.check(t,s) ==
+% BEGIN
+% if empty$(s) then
+% warning$(can't use both " * t * " fields in " * cite$)
+% fi
+% END
+
+FUNCTION {either.or.check}
+{ empty$
+ 'pop$
+ { "can't use both " swap$ * " fields in " * cite$ * warning$ }
+ if$
+}
+
+% The format.bvolume function is for formatting the volume and perhaps
+% series name of a multivolume work. If both a volume and a series field
+% are there, we assume the series field is the title of the whole multivolume
+% work (the title field should be the title of the thing being referred to),
+% and we add an "of <series>". This function is called in mid-sentence.
+
+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$
+}
+
+% The format.number.series function is for formatting the series name
+% and perhaps number of a work in a series. This function is similar to
+% format.bvolume, although for this one the series must exist (and the
+% volume must not exist). If the number field is empty we output either
+% the series field unchanged if it exists or else the null string.
+% If both the number and series fields are there we assume the series field
+% gives the name of the whole series (the title field should be the title
+% of the work being one referred to), and we add an "in <series>".
+% We capitilize Number when this function is used at the beginning of a block.
+
+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$
+}
+
+% The format.edition function appends " edition" to the edition, if present.
+% We lowercase the edition (it should be something like "Third"), because
+% this doesn't start a sentence.
+
+FUNCTION {format.edition}
+{ edition empty$
+ { "" }
+ { output.state mid.sentence =
+ { edition "l" change.case$ " edition" * }
+ { edition "t" change.case$ " edition" * }
+ if$
+ }
+ if$
+}
+
+% The format.pages function is used for formatting a page range in a book
+% (and in rare circumstances, an article).
+%
+% The multi.page.check function examines the page field for a "-" or "," or "+"
+% so that format.pages can use "page" instead of "pages" if none exists.
+% Note: global.max$ here means "take the rest of the string"
+%
+% VAR: multiresult: INTEGER (actually, a boolean)
+%
+% multi.page.check(s) ==
+% BEGIN
+% t := s
+% multiresult := false
+% while ((not multiresult) and (not empty$(t)))
+% do
+% if (first character of t = "-" or "," or "+")
+% then multiresult := true
+% else t := t with the first character removed
+% fi
+% od
+% return multiresult
+% END
+
+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
+}
+
+% This function doesn't begin a sentence so "pages" isn't capitalized.
+% Other functions that use this should keep that in mind.
+
+FUNCTION {format.pages}
+{ pages empty$
+ { "" }
+ { pages multi.page.check
+#if !PAGE_ABBREV
+ { "pages" pages n.dashify tie.or.space.connect }
+ { "page" pages tie.or.space.connect }
+#else PAGE_ABBREV
+ { "pp." pages n.dashify tie.or.space.connect }
+ { "p." pages tie.or.space.connect }
+#endif
+ if$
+ }
+ if$
+}
+
+#if TEMP
+FUNCTION {format.pages.a}
+{ pages empty$
+ { "" }
+#if !PAGE_ABBREV
+ { "page" pages first.page tie.or.space.connect }
+#else PAGE_ABBREV
+ { "p." pages first.page tie.or.space.connect }
+#endif
+ if$
+}
+#endif
+
+% The format.vol.num.pages function is for the volume, number, and page range
+% of a journal article. We use the format: vol(number):pages, with some
+% variations for empty fields. This doesn't begin a sentence.
+
+FUNCTION {format.vol.num.pages}
+#if !BOLD_VOL
+{ volume field.or.null
+#else BOLD_VOL
+{ volume field.or.null embolden
+#endif
+#if VOLUME_SPACE
+ " " swap$ * *
+#endif
+#if !NUM_SUPPRESS
+ number empty$
+ 'skip$
+ { "(" number * ")" * *
+ volume empty$
+ { "there's a number but no volume in " cite$ * warning$ }
+ 'skip$
+ if$
+ }
+ if$
+#endif
+#if DATE_FIRST
+ format.date empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.date paren }
+ { " " * format.date paren * }
+ if$
+ }
+ if$
+#endif
+ pages empty$
+ 'skip$
+ { duplicate$ empty$
+#if !PAGE_START_J
+ { pop$ format.pages }
+#else PAGE_START_J
+ { pop$ format.pages.a }
+#endif
+#if !PAGE_START_J
+#if !DATE_FIRST
+#if !VOLUME_SPACE
+ { ":" * pages n.dashify * }
+#else VOLUME_SPACE
+ { ", " * pages n.dashify * }
+#endif
+#else DATE_FIRST
+ { " " * pages n.dashify *}
+#endif
+#else PAGE_START_J
+#if !DATE_FIRST
+#if !VOLUME_SPACE
+ { ":" * pages first.page * }
+#else VOLUME_SPACE
+ { ", " * pages first.page * }
+#endif
+#else DATE_FIRST
+ { " " * pages first.page *}
+#endif
+#endif
+ if$
+ }
+ if$
+}
+
+
+% The format.chapter.pages, if the chapter is present, puts whatever is in the
+% type field (or else "chapter" if type is empty) in front of a chapter number.
+% It then appends the pages, if present. This doesn't begin a sentence.
+
+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$
+}
+
+% The format.in.ed.booktitle function is used for starting out a sentence
+% that begins "In <booktitle>", putting an editor before the title if one
+% exists.
+
+FUNCTION {format.in.ed.booktitle}
+{ booktitle empty$
+ { "" }
+ { editor empty$
+#if !COMMA_DELIMIT
+ { "In " booktitle emphasize * }
+#if !EDIT_VAR
+ { "In " format.editors * ", " * booktitle emphasize * }
+#else EDIT_VAR
+ { "In " booktitle emphasize * ", " * format.edited * }
+#endif
+#else COMMA_DELIMIT
+ { "in " booktitle emphasize * }
+#if !EDIT_VAR
+ { "in " format.editors * ", " * booktitle emphasize * }
+#else EDIT_VAR
+ { "in " booktitle emphasize * ", " * format.edited * }
+#endif
+#endif
+ if$
+ }
+ if$
+}
+
+#if !NAMED_REFS
+% The function empty.misc.check complains if all six fields are empty, and
+% if there's been no sorting or alphabetic-label complaint.
+
+FUNCTION {empty.misc.check}
+{ author empty$ title empty$ howpublished empty$
+ month empty$ year empty$ note empty$
+ and and and and and
+#if SORTED
+ key empty$ not and
+#else !SORTED
+#if LAB_ALPH
+ key empty$ not and
+#endif LAB_ALPH
+#endif SORTED
+ { "all relevant fields are empty in " cite$ * warning$ }
+ 'skip$
+ if$
+}
+#endif
+
+% The function format.thesis.type returns either the (case-changed) type field,
+% if it is defined, or else the default string already on the stack
+% (like "Master's thesis" or "PhD thesis").
+
+FUNCTION {format.thesis.type}
+{ type empty$
+ 'skip$
+ { pop$
+ type "t" change.case$
+ }
+ if$
+}
+
+% The function format.tr.number makes a string starting with "Technical Report"
+% (or type, if that field is defined), followed by the number if there is one;
+% it returns the starting part (with a case change) even if there is no number.
+% This is used at the beginning of a sentence.
+
+FUNCTION {format.tr.number}
+{ type empty$
+ { "Technical Report" }
+ 'type
+ if$
+ number empty$
+ { "t" change.case$ }
+ { number tie.or.space.connect }
+ if$
+}
+
+% Now come the cross-referencing functions (these are invoked because
+% one entry in the database file(s) cross-references another, by giving
+% the other entry's database key in a `crossref' field). This feature
+% allows one or more titled things that are part of a larger titled
+% thing to cross-reference the larger thing. These styles allow for
+% five posibilities: (1) an ARTICLE may cross-reference an ARTICLE;
+% (2) a BOOK, (3) INBOOK, or (4) INCOLLECTION may cross-reference a BOOK;
+% or (5) an INPROCEEDINGS may cross-reference a PROCEEDINGS.
+% Each of these is explained in more detail later.
+%
+% An ARTICLE entry type may cross reference another ARTICLE (this is
+% intended for when an entire journal is devoted to a single topic---
+% but since there is no JOURNAL entry type, the journal, too, should be
+% classified as an ARTICLE but without the author and title fields).
+% This will result in two warning messages for the journal's entry
+% if it's included in the reference list, but such is life.
+%
+% format.article.crossref ==
+% BEGIN
+% if empty$(key) then
+% if empty$(journal) then
+% warning$("need key or journal for " * cite$ *
+% " to crossref " * crossref)
+% return(" \cite{" * crossref * "}")
+% else
+% return("In " * emphazise.correct (journal) *
+% " \cite{" * crossref * "}")
+% fi
+% else
+% return("In " * key * " \cite{" * crossref * "}")
+% fi
+% END
+%
+% The other cross-referencing functions are similar, so no "comment version"
+% will be given for them.
+
+#if !NAMED_REFS
+FUNCTION {format.article.crossref}
+{ key empty$
+ { journal empty$
+ { "need key or journal for " cite$ * " to crossref " * crossref *
+ warning$
+ ""
+ }
+#if !JOUR_DEEMPH
+ { "In {\em " journal * "\/}" * }
+#else JOUR_DEEMPH
+ { "In " journal * }
+#endif
+ if$
+ }
+ { "In " key * }
+ if$
+ " \cite{" * crossref * "}" *
+}
+#else NAMED_REFS
+FUNCTION {format.article.crossref}
+{ "In" % this is for apalike
+ " \cite{" * crossref * "}" *
+}
+#endif NAMED_REFS
+
+#if !NAMED_REFS
+% We use just the last names of editors for a cross reference: either
+% "editor", or "editor1 and editor2", or "editor1 et~al." depending on
+% whether there are one, or two, or more than two editors.
+
+FUNCTION {format.crossref.editor}
+#if !CSC_NAMES
+{ editor #1 "{vv~}{ll}" format.name$
+#else CSC_NAMES
+{ editor #1 "{vv~}{ll}" format.name$ caps
+#endif
+ editor num.names$ duplicate$
+ #2 >
+#if !ETAL_EMPH
+ { pop$ " et~al." * }
+#else ETAL_EMPH
+ { pop$ " {\em et~al.}" * }
+#endif ETAL_EMPH
+ { #2 <
+ 'skip$
+ { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+#if !ETAL_EMPH
+ { " et~al." * }
+#else ETAL_EMPH
+ { " {\em et~al.}" * }
+#endif ETAL_EMPH
+#if !CSC_NAMES
+ { " and " * editor #2 "{vv~}{ll}" format.name$ * }
+#else CSC_NAMES
+ { " and " * editor #2 "{vv~}{ll}" format.name$ caps * }
+#endif
+ if$
+ }
+ if$
+ }
+ if$
+}
+#endif
+
+% A BOOK (or INBOOK) entry type (assumed to be for a single volume in a
+% multivolume work) may cross reference another BOOK (the entire multivolume).
+% Usually there will be an editor, in which case we use that to construct the
+% cross reference; otherwise we use a nonempty key field or else the series
+% field (since the series gives the title of the multivolume work).
+
+FUNCTION {format.book.crossref}
+{ volume empty$
+ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
+ "In "
+ }
+ { "Volume" volume tie.or.space.connect
+ " of " *
+ }
+ if$
+#if !NAMED_REFS
+ 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 * "}" *
+#else NAMED_REFS
+ "\cite{" * crossref * "}" * % this is for apalike
+#endif
+}
+
+% An INCOLLECTION entry type may cross reference a BOOK (assumed to be the
+% collection), or an INPROCEEDINGS may cross reference a PROCEEDINGS.
+% Often there will be an editor, in which case we use that to construct
+% the cross reference; otherwise we use a nonempty key field or else
+% the booktitle field (which gives the cross-referenced work's title).
+
+#if !NAMED_REFS
+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 * "}" *
+}
+#else NAMED_REFS
+FUNCTION {format.incoll.inproc.crossref}
+{ "In" % this is for apalike
+ " \cite{" * crossref * "}" *
+}
+#endif NAMED_REFS
+
+% Now we define the type functions for all entry types that may appear
+% in the .BIB file---e.g., functions like `article' and `book'. These
+% are the routines that actually generate the .BBL-file output for
+% the entry. These must all precede the READ command. In addition, the
+% style designer should have a function `default.type' for unknown types.
+% Note: The fields (within each list) are listed in order of appearance,
+% except as described for an `inbook' or a `proceedings'.
+%
+% The article function is for an article in a journal. An article may
+% CROSSREF another article.
+% Required fields: author, title, journal, year
+% Optional fields: volume, number, pages, month, note
+%
+% article ==
+% BEGIN
+% output.bibitem
+% output.check(format.authors,"author")
+% new.block
+% output.check(format.title,"title")
+% new.block
+% if missing$(crossref) then
+% output.check(emphasize(journal),"journal")
+% output(format.vol.num.pages)
+% output.check(format.date,"year")
+% else
+% output.nonnull(format.article.crossref)
+% output(format.pages)
+% fi
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The book function is for a whole book. A book may CROSSREF another book.
+% Required fields: author or editor, title, publisher, year
+% Optional fields: volume or number, series, address, edition, month,
+% note
+%
+% book ==
+% BEGIN
+% if empty$(author) then output.check(format.editors,"author and editor")
+% else output.check(format.authors,"author")
+% if missing$(crossref) then
+% either.or.check("author and editor",editor)
+% fi
+% fi
+% new.block
+% output.check(format.btitle,"title")
+% if missing$(crossref) then
+% output(format.bvolume)
+% new.block
+% output(format.number.series)
+% new.sentence
+% output.check(publisher,"publisher")
+% output(address)
+% else
+% new.block
+% output.nonnull(format.book.crossref)
+% fi
+% output(format.edition)
+% output.check(format.date,"year")
+% new.block
+% output(note)
+% fin.entry
+% END
+%
+% The other entry functions are all quite similar, so no "comment version"
+% will be given for them.
+
+FUNCTION {article}
+{ output.bibitem
+ format.authors "author" output.check
+#if NAMED_REFS
+ author format.key output % special for
+ output.year.check % apalike
+#endif NAMED_REFS
+#if !ATIT_SUPPRESS
+ new.block
+ format.title "title" output.check
+#endif
+ new.block
+ crossref missing$
+#if !VOLUME_SPACE
+#if !JOUR_DEEMPH
+ { journal emphasize "journal" output.check
+#else JOUR_DEEMPH
+ { journal "journal" output.check
+#endif
+#else VOLUME_SPACE
+#if !JOUR_DEEMPH
+ { journal emphasize
+#else JOUR_DEEMPH
+ { journal field.or.null
+#endif
+#endif
+#if !NAMED_REFS
+#if !DATE_FIRST
+#if !PAREN_DATE
+ format.vol.num.pages output
+ format.date "year" output.check
+#else PAREN_DATE
+ format.vol.num.pages
+ format.date empty$
+ 'skip$
+ { duplicate$ empty$
+ { pop$ format.date paren }
+ { " " * format.date paren * }
+ if$
+ }
+ if$
+ output
+#endif
+#else DATE_FIRST
+ format.vol.num.pages output
+#endif DATE_FIRST
+#else NAMED_REFS
+ format.vol.num.pages output
+#endif NAMED_REFS
+ }
+ { format.article.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+FUNCTION {book}
+{ output.bibitem
+ author empty$
+#if !NAMED_REFS
+ { format.editors "author and editor" output.check }
+#else NAMED_REFS
+ { format.editors "author and editor" output.check
+ editor format.key output
+ }
+#endif NAMED_REFS
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+#if NAMED_REFS
+ output.year.check % special for apalike
+#endif
+ 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
+#if !NAMED_REFS
+ format.date "year" output.check
+#endif
+ new.block
+ note output
+ fin.entry
+}
+
+% A booklet is a bound thing without a publisher or sponsoring institution.
+% Required: title
+% Optional: author, howpublished, address, month, year, note
+
+FUNCTION {booklet}
+{ output.bibitem
+ format.authors output
+#if !NAMED_REFS
+ new.block
+ format.title "title" output.check
+ howpublished address new.block.checkb
+ howpublished output
+ address output
+ format.date output
+#else NAMED_REFS
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title "title" output.check
+ new.block
+ howpublished output
+ address output
+#endif NAMED_REFS
+ new.block
+ note output
+ fin.entry
+}
+
+% For the conference entry type, see inproceedings.
+
+% An inbook is a piece of a book: either a chapter and/or a page range.
+% It may CROSSREF a book. If there's no volume field, the type field
+% will come before number and series.
+% Required: author or editor, title, chapter and/or pages, publisher,year
+% Optional: volume or number, series, type, address, edition, month, note
+
+FUNCTION {inbook}
+{ output.bibitem
+ author empty$
+#if !NAMED_REFS
+ { format.editors "author and editor" output.check }
+#else NAMED_REFS
+ { format.editors "author and editor" output.check
+ editor format.key output
+ }
+#endif
+ { format.authors output.nonnull
+ crossref missing$
+ { "author and editor" editor either.or.check }
+ 'skip$
+ if$
+ }
+ if$
+#if NAMED_REFS
+ output.year.check % special for apalike
+#endif
+ 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
+#if !NAMED_REFS
+ format.date "year" output.check
+#endif
+ new.block
+ note output
+ fin.entry
+}
+
+% An incollection is like inbook, but where there is a separate title
+% for the referenced thing (and perhaps an editor for the whole).
+% An incollection may CROSSREF a book.
+% Required: author, title, booktitle, publisher, year
+% Optional: editor, volume or number, series, type, chapter, pages,
+% address, edition, month, note
+
+FUNCTION {incollection}
+{ output.bibitem
+ format.authors "author" output.check
+#if NAMED_REFS
+ author format.key output % special for
+ output.year.check % apalike
+#endif NAMED_REFS
+ 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
+#if !NAMED_REFS
+ format.date "year" output.check
+#endif !NAMED_REFS
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.chapter.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+% An inproceedings is an article in a conference proceedings, and it may
+% CROSSREF a proceedings. If there's no address field, the month (& year)
+% will appear just before note.
+% Required: author, title, booktitle, year
+% Optional: editor, volume or number, series, pages, address, month,
+% organization, publisher, note
+
+FUNCTION {inproceedings}
+{ output.bibitem
+ format.authors "author" output.check
+#if NAMED_REFS
+ author format.key output % special for
+ output.year.check % apalike
+#endif NAMED_REFS
+ 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
+#if !NAMED_REFS
+ 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$
+#else NAMED_REFS
+ address output % for apalike
+ new.sentence % there's no year
+ organization output % here so things
+ publisher output % are simpler
+#endif NAMED_REFS
+ }
+ { format.incoll.inproc.crossref output.nonnull
+ format.pages output
+ }
+ if$
+ new.block
+ note output
+ fin.entry
+}
+
+% The conference function is included for Scribe compatibility.
+
+FUNCTION {conference} { inproceedings }
+
+% A manual is technical documentation.
+% Required: title
+% Optional: author, organization, address, edition, month, year, note
+
+FUNCTION {manual}
+{ output.bibitem
+#if !NAMED_REFS
+ 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
+#else NAMED_REFS
+ format.authors output
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.btitle "title" output.check
+ organization address new.block.checkb
+ organization output
+ address output
+ format.edition output
+#endif NAMED_REFS
+ new.block
+ note output
+ fin.entry
+}
+
+% A mastersthesis is a Master's thesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+
+FUNCTION {mastersthesis}
+{ output.bibitem
+ format.authors "author" output.check
+#if NAMED_REFS
+ author format.key output % special for
+ output.year.check % apalike
+#endif NAMED_REFS
+ new.block
+ format.title "title" output.check
+ new.block
+ "Master's thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+#if !NAMED_REFS
+ format.date "year" output.check
+#endif !NAMED_REFS
+ new.block
+ note output
+ fin.entry
+}
+
+% A misc is something that doesn't fit elsewhere.
+% Required: at least one of the `optional' fields
+% Optional: author, title, howpublished, month, year, note
+
+FUNCTION {misc}
+{ output.bibitem
+ format.authors output
+#if !NAMED_REFS
+ title howpublished new.block.checkb
+ format.title output
+ howpublished new.block.checka
+ howpublished output
+ format.date output
+#else NAMED_REFS
+ author format.key output % special for
+ output.year.check % apalike
+ new.block
+ format.title output
+ new.block
+ howpublished output
+#endif NAMED_REFS
+ new.block
+ note output
+ fin.entry
+#if !NAMED_REFS
+ empty.misc.check
+#endif
+}
+
+% A phdthesis is like a mastersthesis.
+% Required: author, title, school, year
+% Optional: type, address, month, note
+
+FUNCTION {phdthesis}
+{ output.bibitem
+ format.authors "author" output.check
+#if NAMED_REFS
+ author format.key output % special for
+ output.year.check % apalike
+#endif NAMED_REFS
+ new.block
+ format.btitle "title" output.check
+ new.block
+ "PhD thesis" format.thesis.type output.nonnull
+ school "school" output.check
+ address output
+#if !NAMED_REFS
+ format.date "year" output.check
+#endif !NAMED_REFS
+ new.block
+ note output
+ fin.entry
+}
+
+% A proceedings is a conference proceedings.
+% If there is an organization but no editor field, the organization will
+% appear as the first optional field (we try to make the first block nonempty);
+% if there's no address field, the month (& year) will appear just before note.
+% Required: title, year
+% Optional: editor, volume or number, series, address, month,
+% organization, publisher, note
+
+FUNCTION {proceedings}
+{ output.bibitem
+#if !NAMED_REFS
+ editor empty$
+ { organization output }
+ { format.editors output.nonnull }
+ if$
+#else NAMED_REFS
+ format.editors output
+ editor format.key output % special for
+ output.year.check % apalike
+#endif NAMED_REFS
+ new.block
+ format.btitle "title" output.check
+ format.bvolume output
+ format.number.series output
+#if !NAMED_REFS
+ 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$
+#else NAMED_REFS
+ address output % for apalike
+ new.sentence % we always output
+ organization output % a nonempty organization
+ publisher output % here
+#endif NAMED_REFS
+ new.block
+ note output
+ fin.entry
+}
+
+% A techreport is a technical report.
+% Required: author, title, institution, year
+% Optional: type, number, address, month, note
+
+FUNCTION {techreport}
+{ output.bibitem
+ format.authors "author" output.check
+#if NAMED_REFS
+ author format.key output % special for
+ output.year.check % apalike
+#endif NAMED_REFS
+ new.block
+ format.title "title" output.check
+ new.block
+ format.tr.number output.nonnull
+ institution "institution" output.check
+ address output
+#if !NAMED_REFS
+ format.date "year" output.check
+#endif !NAMED_REFS
+ new.block
+ note output
+ fin.entry
+}
+
+% An unpublished is something that hasn't been published.
+% Required: author, title, note
+% Optional: month, year
+
+FUNCTION {unpublished}
+{ output.bibitem
+ format.authors "author" output.check
+#if NAMED_REFS
+ author format.key output % special for
+ output.year.check % apalike
+#endif NAMED_REFS
+ new.block
+ format.title "title" output.check
+ new.block
+ note "note" output.check
+#if !NAMED_REFS
+ format.date output
+#endif
+ fin.entry
+}
+
+% We use entry type `misc' for an unknown type; BibTeX gives a warning.
+
+FUNCTION {default.type} { misc }
+
+% Here are macros for common things that may vary from style to style.
+% Users are encouraged to use these macros.
+%
+% Months are either written out in full or abbreviated
+
+#if MONTH_FULL
+
+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"}
+
+#else !MONTH_FULL
+
+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."}
+
+#endif MONTH_FULL
+
+% Journals are either written out in full or abbreviated;
+% the abbreviations are like those found in ACM publications.
+%
+% To get a completely different set of abbreviations, it may be best to make
+% a separate .bib file with nothing but those abbreviations; users could then
+% include that file name as the first argument to the \bibliography command
+
+#if JOUR_FULL
+
+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"}
+
+#else !JOUR_FULL
+
+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."}
+
+#if PHYSICS_JOUR
+#include "journal-abbrev.bst"
+#endif PHYSICS_JOUR
+
+#endif JOUR_FULL
+
+% Now we read in the .BIB entries.
+
+READ
+
+% The sortify function converts to lower case after purify$ing; it's
+% used in sorting and in computing alphabetic labels after sorting
+%
+% The chop.word(w,len,s) function returns either s or, if the first len
+% letters of s equals w (this comparison is done in the third line of the
+% function's definition), it returns that part of s after w.
+
+#if SORTED
+
+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$
+}
+
+#else !SORTED
+#if LAB_ALPH
+
+% We need the chop.word stuff for the dubious unsorted-list-with-labels case.
+
+INTEGERS { len }
+
+FUNCTION {chop.word}
+{ 's :=
+ 'len :=
+ s #1 len substring$ =
+ { s len #1 + global.max$ substring$ }
+ 's
+ if$
+}
+
+#endif LAB_ALPH
+#endif SORTED
+
+% This long comment applies only to alphabetic labels
+%
+% The format.lab.names function makes a short label by using the initials of
+% the von and Last parts of the names (but if there are more than four names,
+% (i.e., people) it truncates after three and adds a superscripted "+";
+% it also adds such a "+" if the last of multiple authors is "others").
+% If there is only one name, and its von and Last parts combined have just
+% a single name-token ("Knuth" has a single token, "Brinch Hansen" has two),
+% we take the first three letters of the last name. The boolean
+% et.al.char.used tells whether we've used a superscripted "+", so that we
+% know whether to include a LaTeX macro for it.
+%
+% format.lab.names(s) ==
+% BEGIN
+% numnames := num.names$(s)
+% if numnames > 1 then
+% if numnames > 4 then
+% namesleft := 3
+% else
+% namesleft := numnames
+% nameptr := 1
+% nameresult := ""
+% while namesleft > 0
+% do
+% if (name_ptr = numnames) and
+% format.name$(s, nameptr, "{ff }{vv }{ll}{ jj}") = "others"
+% then nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else nameresult := nameresult *
+% format.name$(s, nameptr, "{v{}}{l{}}")
+% nameptr := nameptr + 1
+% namesleft := namesleft - 1
+% od
+% if numnames > 4 then
+% nameresult := nameresult * "{\etalchar{+}}"
+% et.al.char.used := true
+% else
+% t := format.name$(s, 1, "{v{}}{l{}}")
+% if text.length$(t) < 2 then % there's just one name-token
+% nameresult := text.prefix$(format.name$(s,1,"{ll}"),3)
+% else
+% nameresult := t
+% fi
+% fi
+% return nameresult
+% END
+%
+% Exactly what fields we look at in constructing the primary part of the label
+% depends on the entry type; this selectivity (as opposed to, say, always
+% looking at author, then editor, then key) helps ensure that "ignored" fields,
+% as described in the LaTeX book, really are ignored. Note that MISC is part
+% of the deepest `else' clause in the nested part of calc.label; thus, any
+% unrecognized entry type in the database is handled correctly.
+%
+% There is one auxiliary function for each of the four different sequences of
+% fields we use. The first of these functions looks at the author field, and
+% then, if necessary, the key field. The other three functions, which might
+% look at two fields and the key field, are similar, except that the key field
+% takes precedence over the organization field (for labels---not for sorting).
+%
+% The calc.label function calculates the preliminary label of an entry, which
+% is formed by taking three letters of information from the author or editor or
+% key or organization field (depending on the entry type and on what's empty,
+% but ignoring a leading "The " in the organization), and appending the last
+% two characters (digits) of the year. It is an error if the appropriate fields
+% among author, editor, organization, and key are missing, and we use
+% the first three letters of the cite$ in desperation when this happens.
+% The resulting label has the year part, but not the name part, purify$ed
+% (purify$ing the year allows some sorting shenanigans by the user).
+%
+% This function also calculates the version of the label to be used in sorting.
+%
+% The final label may need a trailing 'a', 'b', etc., to distinguish it from
+% otherwise identical labels, but we can't calculated those "extra.label"s
+% until after sorting.
+%
+% calc.label ==
+% BEGIN
+% if type$ = "book" or "inbook" then
+% author.editor.key.label
+% else if type$ = "proceedings" then
+% editor.key.organization.label
+% else if type$ = "manual" then
+% author.key.organization.label
+% else
+% author.key.label
+% fi fi fi
+% label := label * substring$(purify$(field.or.null(year)), -1, 2)
+% % assuming we will also sort, we calculate a sort.label
+% sort.label := sortify(label), but use the last four, not two, digits
+% END
+
+#if LAB_ALPH
+
+#if !NAMED_REFS
+INTEGERS { et.al.char.used }
+
+FUNCTION {initialize.et.al.char.used}
+{ #0 'et.al.char.used :=
+}
+
+EXECUTE {initialize.et.al.char.used}
+#endif !NAMED_REFS
+
+#if !NAMED_REFS
+FUNCTION {format.lab.names}
+#if !RMP_LABELS
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 >
+ { numnames #4 >
+ { #3 'namesleft := }
+ { numnames 'namesleft := }
+ if$
+ #1 'nameptr :=
+ ""
+ { namesleft #0 > }
+ { nameptr numnames =
+ { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+ { "{\etalchar{+}}" *
+ #1 'et.al.char.used :=
+ }
+ { s nameptr "{v{}}{l{}}" format.name$ * }
+ if$
+ }
+ { s nameptr "{v{}}{l{}}" format.name$ * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+ numnames #4 >
+ { "{\etalchar{+}}" *
+ #1 'et.al.char.used :=
+ }
+ 'skip$
+ if$
+ }
+ { s #1 "{v{}}{l{}}" format.name$
+ duplicate$ text.length$ #2 <
+ { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ }
+ 'skip$
+ if$
+ }
+ if$
+}
+#else RMP_LABELS
+{ 's :=
+ s num.names$ 'numnames :=
+ numnames #1 >
+ { numnames #2 >
+#if !CSC_NAMES
+#if !ETAL_EMPH
+ { s #1 "{vv }{ll}" format.name$ " et~al." * }
+#else ETAL_EMPH
+ { s #1 "{vv }{ll}" format.name$ " {\em et~al.}" * }
+#endif ETAL_EMPH
+ { s #1 "{vv }{ll}" format.name$
+#else CSC_NAMES
+#if !ETAL_EMPH
+ { s #1 "{vv }{ll}" format.name$ caps " et~al." * }
+#else ETAL_EMPH
+ { s #1 "{vv }{ll}" format.name$ caps " {\em et~al.}" * }
+#endif ETAL_EMPH
+ { s #1 "{vv }{ll}" format.name$ caps
+#endif CSC_NAMES
+ s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+#if !ETAL_EMPH
+ { " et~al." * }
+#else ETAL_EMPH
+ { " {\em et~al.}" * }
+#endif ETAL_EMPH
+#if !CSC_NAMES
+ { " and " * s #2 "{vv }{ll}" format.name$ * }
+#else CSC_NAMES
+ { " and " * s #2 "{vv }{ll}" format.name$ caps * }
+#endif CSC_NAMES
+ if$
+ }
+ if$
+ }
+#if !CSC_NAMES
+ { s #1 "{vv }{ll}" format.name$ }
+#else CSC_NAMES
+ { s #1 "{vv }{ll}" format.name$ caps }
+#endif
+ if$
+}
+#endif
+#else NAMED_REFS
+% There are three apalike cases: one person (Jones),
+% two (Jones and de~Bruijn), and more (Jones et~al.).
+% This function is much like format.crossref.editors.
+%
+FUNCTION {format.lab.names}
+{ 's :=
+#if !CSC_NAMES
+ s #1 "{vv~}{ll}" format.name$
+#else CSC_NAMES
+ s #1 "{vv~}{ll}" format.name$ caps
+#endif CSC_NAMES
+ s num.names$ duplicate$
+ #2 >
+#if !ETAL_EMPH
+ { pop$ " et~al." * }
+#else ETAL_EMPH
+ { pop$ " {\em et~al.}" * }
+#endif ETAL_EMPH
+ { #2 <
+ 'skip$
+ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
+#if !ETAL_EMPH
+ { " et~al." * }
+#else ETAL_EMPH
+ { " {\em et~al.}" * }
+#endif ETAL_EMPH
+#if !CSC_NAMES
+ { " and " * s #2 "{vv~}{ll}" format.name$ * }
+#else CSC_NAMES
+ { " and " * s #2 "{vv~}{ll}" format.name$ caps * }
+#endif
+ if$
+ }
+ if$
+ }
+ if$
+}
+#endif NAMED_REFS
+
+FUNCTION {author.key.label}
+{ author empty$
+ { key empty$
+#if SORTED
+ { cite$ #1 #3 substring$ }
+#else !SORTED % need warning here because we won't give it later
+ { "for label, need author or key in " cite$ * warning$
+ cite$ #1 #3 substring$
+ }
+#endif SORTED
+#if !NAMED_REFS
+ { key #3 text.prefix$ }
+#else NAMED_REFS
+ 'key % apalike uses the whole key
+#endif NAMED_REFS
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {author.editor.key.label}
+{ author empty$
+ { editor empty$
+ { key empty$
+#if SORTED
+ { cite$ #1 #3 substring$ }
+#else !SORTED % need warning here because we won't give it later
+ { "for label, need author, editor, or key in " cite$ * warning$
+ cite$ #1 #3 substring$
+ }
+#endif SORTED
+#if !NAMED_REFS
+ { key #3 text.prefix$ }
+#else NAMED_REFS
+ 'key % apalike uses the whole key
+#endif NAMED_REFS
+ if$
+ }
+ { editor format.lab.names }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+#if !NAMED_REFS
+FUNCTION {author.key.organization.label}
+{ author empty$
+ { key empty$
+ { organization empty$
+#if SORTED
+ { cite$ #1 #3 substring$ }
+#else !SORTED % need warning here because we won't give it later
+ { "for label, need author, key, or organization in " cite$ *
+ warning$
+ cite$ #1 #3 substring$
+ }
+#endif SORTED
+#if !RMP_LABELS
+ { "The " #4 organization chop.word #3 text.prefix$ }
+#else RMP_LABELS
+ { "The " #4 organization chop.word #9 text.prefix$ }
+#endif
+ if$
+ }
+ { key #3 text.prefix$ }
+ if$
+ }
+ { author format.lab.names }
+ if$
+}
+
+FUNCTION {editor.key.organization.label}
+{ editor empty$
+ { key empty$
+ { organization empty$
+#if SORTED
+ { cite$ #1 #3 substring$ }
+#else !SORTED % need warning here because we won't give it later
+ { "for label, need editor, key, or organization in " cite$ *
+ warning$
+ cite$ #1 #3 substring$
+ }
+#endif SORTED
+#if !RMP_LABELS
+ { "The " #4 organization chop.word #3 text.prefix$ }
+#else RMP_LABELS
+ { "The " #4 organization chop.word #9 text.prefix$ }
+#endif
+ if$
+ }
+ { key #3 text.prefix$ }
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+#else NAMED_REFS
+FUNCTION {editor.key.label}
+{ editor empty$
+ { key empty$
+ { cite$ #1 #3 substring$ }
+ 'key % apalike uses the whole key, no organization
+ if$
+ }
+ { editor format.lab.names }
+ if$
+}
+#endif NAMED_REFS
+
+FUNCTION {calc.label}
+#if !KEY_CITE
+{ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.key.label
+ { type$ "proceedings" =
+#if !NAMED_REFS
+ 'editor.key.organization.label
+ { type$ "manual" =
+ 'author.key.organization.label
+ 'author.key.label
+ if$
+ }
+#else NAMED_REFS
+ 'editor.key.label % apalike ignores organization
+ 'author.key.label % for labeling and sorting
+#endif NAMED_REFS
+ if$
+ }
+ if$
+#if !NAMED_REFS
+ duplicate$
+#if !RMP_LABELS
+ year field.or.null purify$ #-1 #2 substring$
+#else RMP_LABELS
+ " " * year field.or.null purify$ #-1 #4 substring$
+#endif
+ *
+ 'label :=
+ year field.or.null purify$ #-1 #4 substring$
+ *
+ sortify 'sort.label :=
+#else NAMED_REFS
+ ", " % these three lines are
+ * % for apalike, which
+ year field.or.null purify$ #-1 #4 substring$ % uses all four digits
+ *
+ 'label :=
+#endif NAMED_REFS
+}
+#else KEY_CITE
+{ cite$ 'label :=
+label sortify 'sort.label :=
+}
+#endif
+
+% It doesn't seem like a particularly good idea to use an order-of-citation
+% reference list when using alphabetic labels, but we need to have a
+% special pass to calculate labels when this happens.
+
+#if !SORTED
+
+ITERATE {calc.label}
+
+#endif !SORTED
+
+#endif LAB_ALPH
+
+% When sorting, we compute the sortkey by executing "presort" on each entry.
+% The presort key contains a number of "sortify"ed strings, concatenated
+% with multiple blanks between them. This makes things like "brinch per"
+% come before "brinch hansen per".
+%
+% The fields used here are: the sort.label for alphabetic labels (as set by
+% calc.label), followed by the author names (or editor names or organization
+% (with a leading "The " removed) or key field, depending on entry type and on
+% what's empty), followed by year, followed by the first bit of the title
+% (chopping off a leading "The ", "A ", or "An ").
+% Names are formatted: Von Last First Junior.
+% The names within a part will be separated by a single blank
+% (such as "brinch hansen"), two will separate the name parts themselves
+% (except the von and last), three will separate the names,
+% four will separate the names from year (and from label, if alphabetic),
+% and four will separate year from title.
+%
+% The sort.format.names function takes an argument that should be in
+% BibTeX name format, and returns a string containing " "-separated
+% names in the format described above. The function is almost the same
+% as format.names.
+
+#if SORTED
+
+FUNCTION {sort.format.names}
+{ 's :=
+ #1 'nameptr :=
+ ""
+ s num.names$ 'numnames :=
+ numnames 'namesleft :=
+ { namesleft #0 > }
+ { nameptr #1 >
+ { " " * }
+ 'skip$
+#if NAME_FULL
+ if$
+ s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't :=
+#else
+ if$ % apalike uses initials
+ s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here
+#endif NAME_FULL
+ nameptr numnames = t "others" = and
+ { "et al" * }
+ { t sortify * }
+ if$
+ nameptr #1 + 'nameptr :=
+ namesleft #1 - 'namesleft :=
+ }
+ while$
+}
+
+% The sort.format.title function returns the argument,
+% but first any leading "A "'s, "An "'s, or "The "'s are removed.
+% The chop.word function uses s, so we need another string variable, t
+
+FUNCTION {sort.format.title}
+{ 't :=
+ "A " #2
+ "An " #3
+ "The " #4 t chop.word
+ chop.word
+ chop.word
+ sortify
+ #1 global.max$ substring$
+}
+
+% The auxiliary functions here, for the presort function, are analogous to
+% the ones for calc.label; the same comments apply, except that the
+% organization field takes precedence here over the key field. For sorting
+% purposes, we still remove a leading "The " from the organization field.
+
+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$
+}
+
+#if !NAMED_REFS
+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$
+}
+#else NAMED_REFS
+FUNCTION {editor.sort}
+{ editor empty$
+ { key empty$
+ { "to sort, need editor or key in " cite$ * warning$
+ ""
+ }
+ { key sortify }
+ if$
+ }
+ { editor sort.format.names }
+ if$
+}
+#endif NAMED_REFS
+
+#if !NAMED_REFS
+% There is a limit, entry.max$, on the length of an entry string variable
+% (which is what its sort.key$ is), so we take at most that many characters
+% of the constructed key, and hope there aren't many references that match
+% to that many characters!
+
+FUNCTION {presort}
+#if LAB_ALPH
+{ calc.label
+ sort.label
+ " "
+ *
+ type$ "book" =
+#else !LAB_ALPH
+{ type$ "book" =
+#endif LAB_ALPH
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.organization.sort
+ { type$ "manual" =
+ 'author.organization.sort
+ 'author.sort
+ if$
+ }
+ if$
+ }
+ if$
+#if LAB_ALPH
+ *
+#endif LAB_ALPH
+ " "
+ *
+ year field.or.null sortify
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+#else NAMED_REFS
+% apalike uses two sorting passes; the first one sets the
+% labels so that the `a's, `b's, etc. can be computed;
+% the second pass puts the references in "correct" order.
+% The presort function is for the first pass. It computes
+% label, sort.label, and title, and then concatenates.
+FUNCTION {presort}
+{ calc.label
+ label sortify
+ " "
+ *
+ type$ "book" =
+ type$ "inbook" =
+ or
+ 'author.editor.sort
+ { type$ "proceedings" =
+ 'editor.sort
+ 'author.sort
+ if$
+ }
+ if$
+ #1 entry.max$ substring$ % for
+ 'sort.label := % apalike
+ sort.label % style
+ *
+ " "
+ *
+ title field.or.null
+ sort.format.title
+ *
+ #1 entry.max$ substring$
+ 'sort.key$ :=
+}
+#endif NAMED_REFS
+
+ITERATE {presort}
+
+% And now we can sort
+
+#if !NAMED_REFS
+SORT
+#else NAMED_REFS
+SORT % by label, sort.label, title---for final label calculation
+#endif
+
+#endif SORTED
+
+% This long comment applies only to alphabetic labels, when sorted
+%
+% Now comes the final computation for alphabetic labels, putting in the 'a's
+% and 'b's and so forth if required. This involves two passes: a forward
+% pass to put in the 'b's, 'c's and so on, and a backwards pass
+% to put in the 'a's (we don't want to put in 'a's unless we know there
+% are 'b's).
+% We have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+%
+% VAR: longest.label, last.sort.label, next.extra: string
+% longest.label.width, last.extra.num: integer
+%
+% initialize.longest.label ==
+% BEGIN
+% longest.label := ""
+% last.sort.label := int.to.chr$(0)
+% next.extra := ""
+% longest.label.width := 0
+% last.extra.num := 0
+% END
+%
+% forward.pass ==
+% BEGIN
+% if last.sort.label = sort.label then
+% last.extra.num := last.extra.num + 1
+% extra.label := int.to.chr$(last.extra.num)
+% else
+% last.extra.num := chr.to.int$("a")
+% extra.label := ""
+% last.sort.label := sort.label
+% fi
+% END
+%
+% reverse.pass ==
+% BEGIN
+% if next.extra = "b" then
+% extra.label := "a"
+% fi
+% label := label * extra.label
+% if width$(label) > longest.label.width then
+% longest.label := label
+% longest.label.width := width$(label)
+% fi
+% next.extra := extra.label
+% END
+
+#if LAB_ALPH
+
+#if SORTED
+
+#if !NAMED_REFS
+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$
+}
+#else NAMED_REFS
+STRINGS { last.label next.extra } % apalike labels are only for the text;
+
+INTEGERS { last.extra.num } % there are none in the bibliography
+
+FUNCTION {initialize.extra.label.stuff} % and hence there is no `longest.label'
+{ #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$
+}
+#endif NAMED_REFS
+
+FUNCTION {reverse.pass}
+{ next.extra "b" =
+ { "a" 'extra.label := }
+ 'skip$
+ if$
+ label extra.label * 'label :=
+#if !NAMED_REFS
+ label width$ longest.label.width >
+ { label 'longest.label :=
+ label width$ 'longest.label.width :=
+ }
+ 'skip$
+ if$
+#endif !NAMED_REFS
+ extra.label 'next.extra :=
+}
+
+#if !NAMED_REFS
+EXECUTE {initialize.longest.label}
+#else NAMED_REFS
+EXECUTE {initialize.extra.label.stuff}
+#endif NAMED_REFS
+
+ITERATE {forward.pass}
+
+REVERSE {reverse.pass}
+
+#if NAMED_REFS
+% Now that the label is right we sort for real,
+% on sort.label then year then title. This is
+% for the second sorting 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$ :=
+}
+
+ITERATE {bib.sort.order}
+
+SORT % by sort.label, year, title---giving final bibliography order
+#endif NAMED_REFS
+#else !SORTED
+
+% It still doesn't seem like a good idea to use an order-of-citation
+% reference list when using alphabetic labels, but when this happens we
+% must compute the longest label
+
+STRINGS { longest.label }
+
+INTEGERS { longest.label.width }
+
+FUNCTION {initialize.longest.label}
+{ "" 'longest.label :=
+ #0 'longest.label.width :=
+}
+
+FUNCTION {longest.label.pass}
+{ label width$ longest.label.width >
+ { label 'longest.label :=
+ label width$ 'longest.label.width :=
+ }
+ 'skip$
+ if$
+}
+
+EXECUTE {initialize.longest.label}
+
+ITERATE {longest.label.pass}
+
+#endif SORTED
+
+#else !LAB_ALPH
+
+% Now comes the computation for numeric labels.
+% We use either the sorted order or original order.
+% We still have to keep track of the longest (in width$ terms) label, for use
+% by the "thebibliography" environment.
+
+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}
+
+#endif LAB_ALPH
+
+% Now we're ready to start writing the .BBL file.
+% We begin, if necessary, with a LaTeX macro for unnamed names in an alphabetic
+% label; next comes stuff from the `preamble' command in the database files.
+% Then we give an incantation containing the command
+% \begin{thebibliography}{...}
+% where the `...' is the longest label.
+%
+% We also call init.state.consts, for use by the output routines.
+
+FUNCTION {begin.bib}
+#if !NAMED_REFS
+#if LAB_ALPH
+{ et.al.char.used
+ { "\newcommand{\etalchar}[1]{$^{#1}$}" write$ newline$ }
+ 'skip$
+ if$
+ preamble$ empty$
+#else !LAB_ALPH
+{ preamble$ empty$
+#endif LAB_ALPH
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{" longest.label * "}" * write$ newline$
+}
+#else NAMED_REFS
+{ preamble$ empty$ % no \etalchar in apalike
+ 'skip$
+ { preamble$ write$ newline$ }
+ if$
+ "\begin{thebibliography}{}" write$ newline$ % no labels in apalike
+}
+#endif NAMED_REFS
+
+EXECUTE {begin.bib}
+
+EXECUTE {init.state.consts}
+
+% Now we produce the output for all the entries
+
+ITERATE {call.type$}
+
+% Finally, we finish up by writing the `\end{thebibliography}' command.
+
+FUNCTION {end.bib}
+{ newline$
+ "\end{thebibliography}" write$ newline$
+}
+
+EXECUTE {end.bib}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/obsolete/biblio/bibtex/utils/misc/rfc2bib.awk b/obsolete/biblio/bibtex/utils/misc/rfc2bib.awk
new file mode 100644
index 0000000000..6b5fa043ee
--- /dev/null
+++ b/obsolete/biblio/bibtex/utils/misc/rfc2bib.awk
@@ -0,0 +1,117 @@
+######################################################################
+#
+# $Id: rfc2bib.awk,v 1.19 2001/02/14 10:41:50 rmm1002 Exp $
+#
+
+# Translates rfc-index.txt to a BibTeX file; probably GNU gawk
+# specific.
+
+# 20010214: fixed up handling of periods in titles (eg. HTTP1.1) by
+# changing FS. Also dealt with altered date parsing for RFC768 (why
+# the removal of hyphens? Wierd...)
+
+# (C) 2000 Richard Mortier, rmm1002@cl.cam.ac.uk
+
+# See http://www.cl.cam.ac.uk/~rmm1002/code.html for updates, etc.
+
+######################################################################
+#
+
+BEGIN {
+
+ FS="[.] " ; RS="\n\n" ;
+
+ # banner
+ printf ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%");
+ printf ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
+ printf ("%%\n");
+ printf ("%% Date: %s\n", strftime());
+ printf ("%%\n");
+ printf ("%% This file is auto-generated from rfc-index.txt by rfc2bib.awk\n") ;
+ printf ("%% by Richard Mortier (rmm1002 at cl.cam.ac.uk). Consequently it gets\n") ;
+ printf ("%% slightly confused by some entries, so as always\n") ;
+ printf ("%%\n");
+ printf ("%% PROOF-READ YOUR DOCUMENT!\n")
+ printf ("%%\n");
+ printf ("\n");
+ printf ("@string{ietf=\"{IETF}\"}\n\n") ;
+
+}
+
+######################################################################
+#
+
+/^[0-9][0-9][0-9][0-9]/{
+
+ gsub(/[\n]/, "", $0) ;
+ gsub(/[ ]+/, " ", $0) ;
+
+ # guard '$', '_', '#' from BibTeX/LaTeX in all fields
+ gsub(/\$/, "\\$", $0 ) ; # ");
+ gsub(/_/, "\\_", $0 ) ; # ");
+ gsub(/\#/, "\\" "\#", $0 ) ; # ");
+
+ number = substr($1, 0, 4) ;
+ printf ("@TechReport{rfc:%s,\n", number ) ;
+ printf (" key = {{\\sc rfc%s}},\n", number );
+
+ # authors are all the fields "in the middle"; can be separated by
+ # commas or ampersands
+ authors = $2 ;
+ for (i=3 ; i < NF-1 ; i++)
+ {
+ if (length( $ (i) ) > 1)
+ {
+ authors = ( authors ".~" $ (i) ) ;
+ }
+ else
+ {
+ authors = ( authors "." $ (i) ) ;
+ }
+ }
+ gsub(/,| &/, " and", authors) ;
+ gsub(/^ /, "", authors) ;
+ if (length(authors) == 0)
+ {
+ authors = "author list not available" ;
+ }
+ printf (" author = {%s},\n", authors ) ;
+
+ # guard capitals and '&' in the title
+ tmp = substr($1, 6) ;
+ title = gensub(/([A-Z])/, "{\\1}", "g", tmp) ;
+ gsub(/&/, "\\" "\\&", title ) ; # ");
+ printf (" title = {%s},\n", title) ;
+
+ # just let the institution be the IETF for now
+ printf (" institution = ietf,\n") ;
+
+ y_fld = $ (NF-1) ;
+ y_pos = length(y_fld) - 3 ;
+ year = substr(y_fld, y_pos, 4) ;
+ if (length(year) == 0)
+ {
+ year = "{year not available}" ;
+ }
+ printf (" year = %s,\n", year) ;
+
+ printf (" type = {{\\sc rfc}},\n") ;
+ printf (" number = %s,\n", number) ;
+
+ # early RFCs: mmm-dd-yyyy ; later RFCs: month yyyy
+ m_fld = $ (NF-1) ;
+ gsub(/-| |\n|[0-9]/, "", m_fld) ;
+ month = substr(tolower(m_fld), 0, 3) ;
+ if (length(month) == 0)
+ {
+ month = "{month not available}" ;
+ }
+ printf (" month = %s,\n", month) ;
+
+ printf (" annote = {%s},\n", $NF) ;
+ printf ("}\n\n") ;
+
+}
+
+######################################################################
+######################################################################