% BibTeX bibliography style `aertt' % this file is based on the `harvard' family of files % 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, cje.bst, aer.bst, or kluwer.bst. % This restriction helps ensure that all standard styles are identical. % 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 } { label.touse extra.label sort.label list.year } FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { {} { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } {} if$ } INTEGERS {quoted italic bold plain attribute space comma tiedcomma semicolon colon period block empty separator prev.separator next.separator next.attribute} STRINGS { s temp f name.list first.name.format later.name.formats name.style} FUNCTION {init.state.consts} { #100 'quoted := #200 'italic := #300 'bold := #400 'plain := #7 'space := #6 'comma := % #5 'tiedcomma := % #4 'semicolon := #3 'colon := #2 'period := #1 'block := #0 'empty := } FUNCTION {output2} { % Wrap the attribute. attribute bold = {"{\bf " swap$ * "}" *} {} if$ attribute italic = {"\uline{" swap$ * "}" *} {} if$ attribute quoted = {"``" swap$ * "''" *} {} if$ % Append additional separators separator comma = {"," * space 'separator :=} {} if$ % separator tiedcomma = {",~" * empty 'separator :=} {} if$ separator space = {" " *} {} if$ write$ separator block = {newline$ "\newblock " write$} {} if$ % Update variables, and put the new string back on the stack next.attribute 'attribute := next.separator 'separator := temp } % output FUNCTION {output.nonnull} { 'next.separator := 'next.attribute := 'temp := 'prev.separator := % If the new separator is stronger than the previous one, use it. prev.separator separator < {prev.separator 'separator :=} {} if$ % Append most separators to the string. separator block = {add.period$} {} if$ separator period = {add.period$ space 'separator :=} {} if$ % separator semicolon = {";" * space 'separator :=} {} if$ separator colon = {":" * space 'separator :=} {} if$ separator comma = attribute quoted = and {"," * space 'separator :=} {} if$ output2 } FUNCTION {output} { 'next.separator := 'next.attribute := duplicate$ empty$ {pop$ pop$} {next.attribute next.separator output.nonnull} if$ } FUNCTION {output.check} { 's := 'next.separator := 'next.attribute := duplicate$ empty$ {pop$ pop$ "empty " s * " in " * cite$ * warning$ } {next.attribute next.separator output.nonnull} if$ } FUNCTION {item.check} { 'temp := empty$ { "empty " temp * " in " * cite$ * warning$ } {} if$ } FUNCTION {plain.space} { plain space } FUNCTION {plain.space.output} { plain.space output } FUNCTION {plain.comma} { plain comma } FUNCTION {fin.entry} { block note plain.space.output period "" plain empty output.nonnull pop$ newline$ } FUNCTION {field.or.null} { duplicate$ empty$ { pop$ "" } {} if$ } FUNCTION {emphasize} { duplicate$ empty$ { pop$ "" } { "{\em " swap$ * "}" * } if$ } FUNCTION {quote} { duplicate$ empty$ { pop$ "" } { add.period$ "`" swap$ * "'" * } if$ } % compare.names INTEGERS {len1 len2 i} FUNCTION {compare.names} { 's := 'temp := temp num.names$ 'len1 := s num.names$ 'len2 := % len1 := min(len1,len2) len1 len2 > {len2 'len1 :=} {} if$ % start with an empty string, then while the components are the same % add "\bysame" "" #1 'i := {i len1 > not} { temp i "{ff }{vv }{ll}{ jj}" format.name$ % duplicate$ i int.to.str$ * warning$ s i "{ff }{vv }{ll}{ jj}" format.name$ % duplicate$ i int.to.str$ * warning$ = { #1 i < {" and " *} {} if$ "\bysame{}" * i #1 + 'i :=} {#-1 'len1 :=} if$ } while$ % add the rest of the second string {i len2 > not} { #1 i < {" and " *} {} if$ s i "{ff }{vv }{ll}{ jj}" format.name$ * i #1 + 'i := } while$ % duplicate$ warning$ } INTEGERS { nameptr namesleft numnames } FUNCTION {format.names} { 'name.list := 'name.style := 'later.name.formats := 's := % binary separator 'first.name.format := #1 'nameptr := name.list num.names$ 'numnames := % If we're to make this entry bold or something, prepend to the string of names name.style "" = {} {"{" name.style *} if$ numnames 'namesleft := { namesleft #0 > } { name.list nameptr nameptr #1 = {first.name.format} {later.name.formats} if$ format.name$ 'temp := nameptr #1 > { namesleft #1 > { ", " * temp * } { temp "others" = { " et~al." * } {nameptr #2 = % handle ", and" vs " and " {s * temp *} {", and " * temp * } if$ } if$ } if$ } 'temp if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ % If we're to make this entry bold or something, append to the string of names name.style "" = {} {"}" * *} if$ } FUNCTION {format.authors} { 'temp := "{vv~}{ll}{, jj}{, ff}" " and " "{ff~}{vv~}{ll}{, jj}" "" temp format.names } FUNCTION {format.editors} { 'temp := "{vv~}{ll}{, jj}{, ff}" " and " "{ff~}{vv~}{ll}{, jj}" "" temp format.names editor num.names$ #1 > { ", eds" * } { ", ed." * } if$ } FUNCTION {format.editors.notkey} { editor empty$ { "" } { "{ff~}{vv~}{ll}{, jj}" " and " "{ff~}{vv~}{ll}{, jj}" "" editor format.names editor num.names$ #1 > {", eds."} {", ed."} if$ * } if$ } FUNCTION {format.title} { space title quoted comma } FUNCTION {n.dashify} { 'temp := "" { temp empty$ not } { temp #1 #1 substring$ "-" = { temp #1 #2 substring$ "--" = not { "--" * temp #2 global.max$ substring$ 'temp := } { { temp #1 #1 substring$ "-" = } { "-" * temp #2 global.max$ substring$ 'temp := } while$ } if$ } { temp #1 #1 substring$ * temp #2 global.max$ substring$ 'temp := } 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$ {} { " of " * series emphasize * } if$ "volume and number" number either.or.check } if$ } FUNCTION {format.bvolume.output} {comma format.bvolume plain.space.output} FUNCTION {mid.sentence.q} { separator empty = separator block = separator period = or or not } FUNCTION {format.number.series} { volume empty$ { number empty$ {series field.or.null} { mid.sentence.q { "number" } { "Number" } if$ number tie.or.space.connect series empty$ { "there's a number but no series in " cite$ * warning$ } { add.period$ " In " * series quote * } if$ } if$ } { "" } if$ } FUNCTION {format.edition.output} { edition empty$ { } { comma edition mid.sentence.q { "l" } { "t" } if$ change.case$ " ed." * plain.space.output } if$ } FUNCTION {format.publisher.address} { address empty$ {comma publisher plain.comma output} {publisher empty$ {} {comma address plain colon output colon publisher plain.comma output} if$} if$ } INTEGERS { multiresult } FUNCTION {multi.page.check} { 'temp := #0 'multiresult := { multiresult not temp empty$ not and } { temp #1 #1 substring$ duplicate$ "-" = swap$ duplicate$ "," = swap$ "+" = or or { #1 'multiresult := } { temp #2 global.max$ substring$ 'temp := } if$ } while$ multiresult } FUNCTION {format.pages} { pages empty$ { "" } { pages multi.page.check { "pp.~" pages n.dashify * } { "p.~" pages * } if$ } if$ } FUNCTION {output.month.year} { space month plain.space.output space year plain.comma "year" output.check } FUNCTION {output.vol.num.pages} { space volume italic space output number empty$ {} { space "(" number * ")" * plain.comma output.nonnull volume empty$ { "there's a number but no volume in " cite$ * warning$ } {} if$ } if$ % "*** a" warning$ comma 'next.separator := % hack pages empty$ {} { number empty$ volume empty$ and { comma format.pages plain.space.output } { comma pages n.dashify plain.space.output } 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$ {} { ", " * format.pages * } if$ } if$ } FUNCTION {output.in.ed.booktitle} { booktitle "booktitle" item.check comma "in" plain.space output.nonnull editor empty$ { space booktitle quoted space output.nonnull} { space format.editors.notkey plain.space output.nonnull comma booktitle italic comma output.nonnull } 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$ } {} if$ } FUNCTION {format.thesis.type} { type empty$ {} { pop$ type "t" change.case$ } if$ } FUNCTION {format.tr.number} { type empty$ { "Technical Report" } 'type if$ number empty$ { } { 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 {\it " journal * "\/} \cite{" * crossref * "}" *} if$ } { add.period$ "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$ "" * } { "{\it " * series * "\/} \cite{" * crossref * "}" *} if$ } { " \citeasnoun{" * crossref * "}" * } if$ } { " \citeasnoun{" * crossref * "}" * } if$ } FUNCTION {output.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$ } { period "In {\it " booktitle * "\/}" * " \cite{" * crossref * "}" * plain.space output.nonnull} if$ } { period "In \citeasnoun{" crossref * "}" * plain.space output.nonnull} if$ } { period "In \citeasnoun{" crossref * "}" * plain.space output.nonnull} if$ } INTEGERS { len } FUNCTION {chop.word} { 's := 'len := s #1 len substring$ = { s len #1 + global.max$ substring$ } 's if$ } 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 {format.lab.names.abbr} { 'name.list := name.list num.names$ 'numnames := numnames #1 > { numnames #2 > { name.list #1 "{vv~}{ll}" format.name$ " et al." * } { name.list #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = { name.list #1 "{vv~}{ll}" format.name$ " et al." * } { name.list #1 "{vv~}{ll}" format.name$ " and " * name.list #2 "{vv~}{ll}" format.name$ * } if$ } if$ field.used editor.field = {", eds" *} {} if$ } { name.list #1 "{vv~}{ll}" format.name$ field.used editor.field = {", ed" *} {} if$ } if$ } FUNCTION {format.lab.names.full} { 'name.list := #1 'nameptr := name.list num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { name.list nameptr "{vv~}{ll}" format.name$ 'temp := nameptr #1 > { namesleft #1 > { ", " * temp * } { temp "others" = { " et~al." * } { " and " * temp * } if$ } if$ } 'temp if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ numnames #1 > field.used editor.field = and {", eds" *} {} if$ numnames #1 = field.used editor.field = and {", ed" *} {} if$ } STRINGS { prev.author } FUNCTION {make.list.label} {author.field field.used = { prev.author author compare.names format.authors author 'prev.author :=} { editor.field field.used = { prev.author editor compare.names format.editors editor 'prev.author := } { organization.field field.used = { "The " #4 organization chop.word duplicate$ prev.author = {pop$ "\bysame{}"} {duplicate$ 'prev.author :=} if$} { "foo" 'prev.author := 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$ "" empty 'separator := plain 'attribute := % } % % FUNCTION {list.label.output} % { space make.list.label plain comma output.nonnull } FUNCTION {author.item.check} {author "author" item.check} FUNCTION {format.title.if.not.sortkey.check} {title.field field.used = {} { format.title "title" output.check } if$} FUNCTION {article} { output.bibitem author.item.check format.title.if.not.sortkey.check crossref missing$ { space journal italic comma "journal" output.check output.month.year output.vol.num.pages } { space format.article.crossref plain.space output.nonnull comma format.pages plain.space.output } if$ fin.entry } FUNCTION {book} { output.bibitem author empty$ { editor "author and editor" item.check } { crossref missing$ { "author and editor" editor either.or.check } {} if$ } if$ title.field field.used = {} { space title italic space "title" output.check } if$ crossref missing$ { space format.number.series plain.space.output format.edition.output format.bvolume.output format.publisher.address output.month.year } { space format.book.crossref plain.space output.nonnull format.edition.output } if$ fin.entry } FUNCTION {booklet} { output.bibitem format.title.if.not.sortkey.check space howpublished plain.space.output space address plain.space.output output.month.year fin.entry } FUNCTION {inbook} { output.bibitem author empty$ { editor "author and editor" item.check } { crossref missing$ { "author and editor" editor either.or.check } {} if$ } if$ title.field field.used = {} { space title italic space "title" output.check } if$ crossref missing$ { space format.number.series plain.space.output format.edition.output comma format.bvolume plain.comma output format.publisher.address output.month.year } { space format.book.crossref plain.space output.nonnull format.edition.output } if$ format.chapter.pages "chapter and pages" output.check fin.entry } FUNCTION {incollection} { output.bibitem format.title.if.not.sortkey.check author.item.check crossref missing$ { output.in.ed.booktitle format.edition.output format.bvolume.output space format.number.series plain.space.output format.publisher.address output.month.year } { output.incoll.inproc.crossref } if$ space format.chapter.pages plain.space.output fin.entry } FUNCTION {inproceedings} { output.bibitem format.title.if.not.sortkey.check author.item.check crossref missing$ { output.in.ed.booktitle format.bvolume.output space format.number.series plain.space.output address empty$ { space organization plain.space.output space publisher plain.space.output } { space organization plain.space.output space publisher plain.space.output space address plain.space output.nonnull } if$ output.month.year } { output.incoll.inproc.crossref} if$ space format.pages plain.space.output fin.entry } FUNCTION {conference} { inproceedings } FUNCTION {manual} { output.bibitem title.field field.used = {} {author empty$ {comma}{space} if$ title italic space "title" output.check } if$ organization.field field.used = organization empty$ or {} {space organization plain.space output.nonnull} if$ format.edition.output format.publisher.address output.month.year fin.entry } FUNCTION {mastersthesis} { output.bibitem author.item.check format.title.if.not.sortkey.check space "Master's thesis" format.thesis.type plain.space output.nonnull comma school plain.space "school" output.check comma address plain.space.output output.month.year fin.entry } FUNCTION {misc} { output.bibitem format.title.if.not.sortkey.check space howpublished plain.space.output output.month.year fin.entry empty.misc.check } FUNCTION {phdthesis} { output.bibitem author.item.check title.field field.used = {} { space title quoted period "title" output.check } if$ space "PhD dissertation" format.thesis.type plain.space output.nonnull comma school plain.space "school" output.check comma address plain.space.output output.month.year fin.entry } FUNCTION {proceedings} { output.bibitem title.field field.used = {} { space title italic space "title" output.check } if$ format.bvolume.output space format.number.series plain.space.output address empty$ { editor empty$ {} { space organization plain.space.output } if$ space publisher plain.space.output } { editor empty$ {} { space organization plain.space.output } if$ space publisher plain.space.output space address plain.space output.nonnull } if$ output.month.year fin.entry } FUNCTION {techreport} { output.bibitem author.item.check format.title.if.not.sortkey.check space format.tr.number plain.space output.nonnull institution empty$ {} { comma institution plain.space "institution" output.check } if$ comma address plain.space.output output.month.year fin.entry } FUNCTION {unpublished} { output.bibitem author.item.check format.title.if.not.sortkey.check output.month.year note "note" item.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"} READ EXECUTE {init.field.constants} FUNCTION {sortify} { purify$ "l" change.case$ } FUNCTION {author.editor.key.label} { author empty$ { editor empty$ { title empty$ { key.field 'field.used := } { title.field 'field.used := } if$ } { editor.field 'field.used := } if$ } { author.field 'field.used := } if$ } FUNCTION {key.organization.label} {organization empty$ { title empty$ { key.field 'field.used := } { title.field 'field.used := } if$ } { organization.field 'field.used := } if$} FUNCTION {author.key.organization.label} { author empty$ { key.organization.label} { author.field 'field.used := } if$ } FUNCTION {editor.key.organization.label} { editor empty$ { key.organization.label} { editor.field 'field.used := } if$ } FUNCTION {sort.format.title} { 'temp := "A " #2 "An " #3 "The " #4 temp 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.editor.key.label % don't really use .editor. 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} { "abcxyz" 'prev.author := calc.label sort.label title.field field.used = {} { " " * 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 := } {} 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} { "abcxyz" 'prev.author := make.list.label title.field field.used = { sort.format.title } { sortify } if$ " " * list.year field.or.null sortify * " " * title.field field.used = {} { title field.or.null sort.format.title * } if$ #1 entry.max$ substring$ 'sort.key$ := } ITERATE {second.presort} SORT INTEGERS { number.label } FUNCTION {initialize.longest.label} { #1 'number.label := "abcxyz" 'prev.author := } FUNCTION {longest.label.pass} { "" 'extra.label := author empty$ { editor empty$ {"foo"} {editor} if$} {author} if$ 'f := % remember this entry to compare to the next one author empty$ { editor empty$ {"abcxyz"} {editor} if$} {author} if$ 'prev.author := } EXECUTE {initialize.longest.label} ITERATE {longest.label.pass} FUNCTION {begin.bib} { preamble$ empty$ {} { preamble$ write$ newline$ } if$ "\ifx\undefined\bysame" write$ newline$ "\newcommand{\bysame}{\leavevmode\hbox to\leftmargin{\hrulefill\,\,}}" write$ newline$ "\fi" write$ newline$ "\begin{thebibliography}{xx}" write$ newline$ } EXECUTE {begin.bib} EXECUTE {init.state.consts} FUNCTION {init.call} { "abcxyz" 'prev.author := } EXECUTE {init.call} ITERATE {call.type$} FUNCTION {end.bib} {newline$ "\end{thebibliography}" write$ newline$ } EXECUTE {end.bib}