% Written by Taco Hoekwater % Donated to the Public Domain. Use at your own risk. % Preliminary version, 19-aug-1999. % New 17/9/2003: 'eprint' and 'doi' tags % This style produces citations in a format the ConTeXt can handle. % It outputs a large collection of labels so that context can decide % which one to use. % % Actually, there are a number of separate bst files that change in % only two lines: the ITERATEs right before the two SORTs can % have different values, sorting by either one of % % -------------------------- cont-master.bst author % - the author (+year, title) : cont-au.bst author % - the title (+author, year) : cont-ti.bst title % - the short key a la abbrev : cont-ab.bst clabel % - nothing at all (cite order): cont-no.bst none % % % Output gives the following computed info: % % - the total number of bib entries % - the longest short label % % And per entry: % % - the key % - the entry type % - the yeardata for crossrefs % - the authordata for crossrefs % - the short key % - the .bib appearance number % Commands that may be written to the bbl file (not counting stuff the % bib database defines itself): % % \setuppublicationlist % \startpublication % \stoppublication % Field entries with a strange format/appearance: % % \artauthor, % \editor, % \author: \xxx[junior]{firstnames}[inits]{von}{lastname} % \etalchar: appears in short keys sometimes % \maybeyear: appears in \pubyear sometimes % % And these commands for the entries have only one argument, % precisely matching the corresponding field. Note that there % are more fields supported than in the standard bst files. % % \abstract % \annotate % \arttitle % \chapter % \city % \comment % \country % \crossref % \edition % \isbn % \issn % \issue % \journal % \keyword % \keywords % \lang % \month % \names % \note % \notes % \organization % \pages % \pubname % \pubyear % \series % \size % \thekey % \title % \bibtype % \volume % \eprint % \doi % \howpublished % \biburl % \lastchecked % for ieee: % \nationality % \assignee % \bibnumber % \day % \dayfiled % \monthfiled % \yearfiled % \revision ENTRY { abstract address annotate author booktitle chapter comment country doi edition editor eprint howpublished institution isbn issn journal key keyword keywords language lastchecked month names note notes number organization pages publisher school series size title type url volume year nationality assignee bibnumber day dayfiled monthfiled yearfiled revision } {} { label extra.label sort.label clabel sort.clabel ordinal.label} STRINGS { s t autype} STRINGS { last.label next.extra nlabel } STRINGS { longest.label last.sort.label} INTEGERS { longest.label.width last.extra.num ordinal.num } INTEGERS { nameptr namesleft numnames } INTEGERS { len } FUNCTION {begin.bib} { #0 'ordinal.num := preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ "\setuppublicationlist[samplesize={" write$ longest.label "},totalnumber=" * write$ nlabel "]" * write$ newline$ } FUNCTION {end.bib} { newline$ } FUNCTION {do.out} { duplicate$ empty$ { pop$ pop$ write$} { "{" swap$ * "}" * * write$ pop$ newline$ } if$ } FUNCTION {do.t.out} { duplicate$ empty$ { pop$ pop$ write$} { "{" swap$ "t" change.case$ * "}" * * write$ pop$ newline$ } if$ } FUNCTION {format.year} { year empty$ 'skip$ { "\pubyear{" year * write$ extra.label empty$ { "}" write$ } { "\maybeyear{" extra.label * "}}" * write$ } if$ newline$ } if$ } FUNCTION {start.entry} { ordinal.num #1 + 'ordinal.num := newline$ "\startpublication[" write$ "k=" write$ cite$ "," * write$ "t=" write$ type$ "," * write$ newline$ label write$ "," write$ doi empty$ {} { "o={" write$ doi write$ "}," write$ } if$ newline$ url empty$ {} { "u={" write$ url write$ "}," write$ newline$ } if$ "n=" write$ ordinal.label write$ ",s=" write$ clabel write$ "]" write$ newline$ "" "\lang" language do.out } FUNCTION {stop.entry} { "" "\country" country do.out "" "\note" note do.out "" "\notes" notes do.out "" "\annotate" annotate do.out "" "\eprint" eprint do.out "" "\doi" doi do.out "" "\keyword" keyword do.out "" "\keywords" keywords do.out "" "\comment" comment do.out "" "\abstract" abstract do.out "" "\names" names do.out "" "\size" size do.out "" "\biburl" url do.out "" "\lastchecked" lastchecked do.out "\stoppublication" write$ newline$ } 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 {format.names} { 's := 'autype := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { autype write$ s nameptr "{jj}" format.name$ 't := "[" t * "]" * write$ s nameptr "{ff}" format.name$ 't := "{" t * "}" * write$ s nameptr "{f}" format.name$ add.period$ 't := "[" t * "]" * write$ s nameptr "{vv}" format.name$ 't := "{" t * "}" * write$ s nameptr "{ll}" format.name$ 't := "{" t * "}" * write$ newline$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {format.key} { "" "\thekey" key do.out } FUNCTION {format.artauthors} { author empty$ { format.key } { "\artauthor" author format.names } if$ } FUNCTION {format.authors} { author empty$ { format.key } { "\author" author format.names } if$ } FUNCTION {format.editors} { editor empty$ { format.key } { "\editor" editor format.names } if$ } FUNCTION {format.title} { "" "\title" title do.out "" "\isbn" isbn do.out } FUNCTION {format.t.title} { "" "\title" title do.t.out "" "\isbn" isbn do.out } FUNCTION {format.arttitle} { "" "\arttitle" title do.t.out } FUNCTION {format.journal} { "" "\journal" journal do.out "" "\issn" issn do.out } 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.volume} { "" "\volume" volume do.out } FUNCTION {format.volume.issue} { "" "\volume" volume do.out "" "\issue" number do.out } FUNCTION {format.number.series} { "" "\series" series do.out volume empty$ { "" "\volume" number do.out } { "" "\volume" volume do.out "" "\issue" number do.out } if$ } FUNCTION {format.edition} { "" "\edition" edition do.out "" "\month" month do.out } FUNCTION {format.pages} { "" "\pages" pages do.out } FUNCTION {format.vol.num.pages} { format.volume.issue format.pages } FUNCTION {format.vol.num.page} { format.volume.issue format.pages } FUNCTION {format.type.chapter.pages} { chapter empty$ 'format.pages { "" "\bibtype" type do.out "" "\chapter" chapter do.out } if$ format.pages } FUNCTION {format.booktitle} {"" "\title" booktitle do.out "" "\isbn" isbn do.out } FUNCTION {format.in.ed.booktitle} { booktitle empty$ 'skip$ { format.booktitle } if$ } FUNCTION {format.in.booktitle.or.series} { "" "\series" series do.out booktitle empty$ 'skip$ { editor empty$ { format.booktitle } { format.editors format.booktitle } if$ } if$ } FUNCTION {format.tr.number} {"" "\bibtype" type do.out "" "\volume" number do.out } FUNCTION {format.crossref} { "" "\crossref" crossref do.out } FUNCTION {format.book.crossref} { "" "\volume" volume do.out format.crossref } FUNCTION {format.incoll.inproc.crossref} { format.crossref } FUNCTION {article} { start.entry format.artauthors format.year format.arttitle crossref missing$ { format.journal format.vol.num.pages } { format.crossref format.pages } if$ "" "\month" month do.out stop.entry } FUNCTION {book} { start.entry author empty$ { format.editors } { format.authors } if$ format.year format.title crossref missing$ { format.number.series "" "\city" address do.out "" "\pubname" publisher do.out } { format.book.crossref } if$ format.edition stop.entry } FUNCTION {booklet} { start.entry format.authors format.year format.t.title format.key "" "\pubname" publisher do.out "" "\howpublished" howpublished do.out "" "\city" address do.out stop.entry } FUNCTION {inbook} { start.entry author empty$ { format.editors } { format.authors } if$ format.year format.title crossref missing$ { format.type.chapter.pages format.number.series "" "\city" address do.out "" "\pubname" publisher do.out } { format.type.chapter.pages format.book.crossref } if$ format.edition stop.entry } FUNCTION {incollection} { start.entry format.artauthors format.year format.arttitle format.editors crossref missing$ { format.in.ed.booktitle format.number.series "" "\city" address do.out format.edition format.type.chapter.pages } { format.incoll.inproc.crossref format.type.chapter.pages } if$ "" "\pubname" publisher do.out stop.entry } FUNCTION {inproceedings} { start.entry format.authors format.year format.arttitle crossref missing$ { format.in.booktitle.or.series format.number.series "" "\city" address do.out format.pages } { format.incoll.inproc.crossref format.pages } if$ "" "\pubname" publisher do.out "" "\organization" organization do.out stop.entry } FUNCTION {conference} { inproceedings } FUNCTION {manual} { start.entry format.authors format.year format.title "" "\organization" organization do.out "" "\city" address do.out "" "\edition" edition do.out stop.entry } FUNCTION {mastersthesis} { start.entry format.authors format.year format.t.title "" "\bibtype" type do.out "" "\pubname" school do.out "" "\month" month do.out "" "\city" address do.out stop.entry } FUNCTION {misc} { start.entry format.authors format.year format.t.title format.key "" "\city" address do.out "" "\day" day do.out "" "\month" month do.out "" "\pubname" publisher do.out "" "\howpublished" howpublished do.out stop.entry } FUNCTION {phdthesis} { start.entry format.authors format.title format.year "" "\bibtype" type do.out "" "\month" month do.out "" "\pubname" school do.out "" "\city" address do.out stop.entry } FUNCTION {proceedings} { start.entry format.editors format.year format.title format.number.series "" "\city" address do.out "" "\pubname" publisher do.out "" "\organization" organization do.out stop.entry } FUNCTION {techreport} { start.entry format.authors format.year format.t.title format.tr.number "" "\city" address do.out "" "\pubname" institution do.out stop.entry } FUNCTION {unpublished} { start.entry format.authors format.year format.t.title "" "\month" month do.out stop.entry } % 4 additions from IEEEtran FUNCTION {electronic} { start.entry format.authors format.year format.t.title "" "\month" month do.out "" "\city" address do.out "" "\organization" organization do.out "" "\howpublished" howpublished do.out stop.entry } FUNCTION {patent} { start.entry format.authors format.year format.t.title "" "\bibnumber" number do.out "" "\city" address do.out "" "\nationality" nationality do.out "" "\assignee" assignee do.out "" "\bibtype" type do.out "" "\month" month do.out "" "\monthfiled" monthfiled do.out "" "\yearfiled" yearfiled do.out "" "\day" day do.out "" "\dayfiled" dayfiled do.out stop.entry } FUNCTION {periodical} { start.entry format.editors format.year format.title format.number.series "" "\bibnumber" number do.out "" "\month" month do.out "" "\organization" organization do.out stop.entry } FUNCTION {standard} { start.entry format.authors format.year format.title "" "\bibtype" type do.out "" "\organization" organization do.out "" "\city" address do.out "" "\revision" revision do.out "" "\pubname" institution do.out "" "\howpublished" howpublished do.out "" "\bibnumber" number do.out "" "\month" month do.out stop.entry } FUNCTION {IEEEtranBSTCTL} { } FUNCTION {default.type} { misc } MACRO {jan} {"1"} MACRO {feb} {"2"} MACRO {mar} {"3"} MACRO {apr} {"4"} MACRO {may} {"5"} MACRO {jun} {"6"} MACRO {jul} {"7"} MACRO {aug} {"8"} MACRO {sep} {"9"} MACRO {oct} {"10"} MACRO {nov} {"11"} MACRO {dec} {"12"} READ FUNCTION {initialize.ordinal.label} { #0 'ordinal.num := } FUNCTION {set.ordinal.label} { #1 ordinal.num + 'ordinal.num := ordinal.num int.to.str$ 'ordinal.label := } EXECUTE {initialize.ordinal.label} ITERATE {set.ordinal.label} FUNCTION {sortify} { purify$ "l" change.case$ } FUNCTION {chop.word} { 's := 'len := s #1 len substring$ = { s len #1 + global.max$ substring$ } 's if$ } FUNCTION {format.lab.names} { 's := s #1 "{vv~}{ll}" format.name$ "{" swap$ * "}" * s num.names$ duplicate$ #1 > { pop$ "," * } { pop$ } if$ s num.names$ duplicate$ #2 > { pop$ "{}" * } { #2 < 'skip$ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = { "{}" * } { s #2 "{vv~}{ll}" format.name$ "{" swap$ * "}" * * } if$ } if$ } if$ "{" swap$ * "}," * } FUNCTION {author.key.label} { author empty$ { key empty$ { "{" cite$ * "}," *} { "{" key * "}," * } if$ } { author format.lab.names } if$ } FUNCTION {author.editor.key.label} { author empty$ { editor empty$ { key empty$ { "{" cite$ * "}," *} { "{" key * "}," * } if$ } { editor format.lab.names } if$ } { author format.lab.names } if$ } FUNCTION {editor.key.label} { editor empty$ { key empty$ { "{" cite$ * "}," *} { "{" key * "}," * } if$ } { editor 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$ "a=" swap$ * "y=" * year field.or.null purify$ #-1 #4 substring$ * 'label := } INTEGERS { et.al.char.used } FUNCTION {initialize.et.al.char.used} { #0 'et.al.char.used := } EXECUTE {initialize.et.al.char.used} FUNCTION {format.clab.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.clabel} { author empty$ { key empty$ { cite$ #1 #3 substring$ } { key #3 text.prefix$ } if$ } { author format.clab.names } if$ } FUNCTION {author.editor.key.clabel} { author empty$ { editor empty$ { key empty$ { cite$ #1 #3 substring$ } { key #3 text.prefix$ } if$ } { editor format.clab.names } if$ } { author format.clab.names } if$ } FUNCTION {author.key.organization.clabel} { 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.clab.names } if$ } FUNCTION {editor.key.organization.clabel} { 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.clab.names } if$ } FUNCTION {calc.clabel} { type$ "book" = type$ "inbook" = or 'author.editor.key.clabel { type$ "proceedings" = 'editor.key.organization.clabel { type$ "manual" = 'author.key.organization.clabel 'author.key.clabel if$ } if$ } if$ duplicate$ year field.or.null purify$ #-1 #2 substring$ * 'clabel := year field.or.null purify$ #-1 #4 substring$ * sortify 'sort.clabel := } 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.title} { calc.label calc.clabel title field.or.null sort.format.title " " * #1 entry.max$ substring$ 'sort.label := sort.label 'sort.key$ := } FUNCTION {presort.author} { calc.clabel calc.label type$ "book" = type$ "inbook" = or 'author.editor.sort { type$ "proceedings" = 'editor.sort 'author.sort if$ } if$ #1 entry.max$ substring$ 'sort.label := sort.label 'sort.key$ := } FUNCTION {presort.clabel} { calc.label calc.clabel clabel sortify duplicate$ 'sort.label := #1 entry.max$ substring$ #1 entry.max$ substring$ 'sort.key$ := } FUNCTION {presort.none} { calc.label calc.clabel "" 'sort.label := "" 'sort.key$ := } ITERATE {presort.title} SORT FUNCTION {initialize.extra.label.stuff} { #0 int.to.chr$ 'last.label := "" 'next.extra := #0 'last.extra.num := #0 'ordinal.num := } FUNCTION {forward.pass} { ordinal.num #1 + 'ordinal.num := ordinal.num int.to.str$ 'nlabel := 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 := clabel extra.label * 'clabel := extra.label 'next.extra := clabel width$ longest.label.width > { clabel 'longest.label := clabel width$ 'longest.label.width := } 'skip$ if$ } EXECUTE {initialize.extra.label.stuff} FUNCTION {initialize.longest.label} { "" 'longest.label := #0 int.to.chr$ 'last.sort.label := "" 'next.extra := #0 'longest.label.width := #0 'last.extra.num := } EXECUTE {initialize.longest.label} ITERATE {forward.pass} REVERSE {reverse.pass} FUNCTION {bib.sort.order.author} { sort.label " " * year field.or.null sortify * " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } FUNCTION {bib.sort.order.title} { sort.label " " * type$ "book" = type$ "inbook" = or 'author.editor.sort { type$ "proceedings" = 'editor.sort 'author.sort if$ } if$ * " " * year field.or.null sortify * #1 entry.max$ substring$ 'sort.key$ := } FUNCTION {bib.sort.order.clabel} { sort.label " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } FUNCTION {bib.sort.order.none} { sort.label 'sort.key$ := } ITERATE {bib.sort.order.title} SORT EXECUTE {begin.bib} ITERATE {call.type$} EXECUTE {end.bib}