| %%% Modification of BibTeX style file alpha.bst |
| %%% ... by urlbst, version 0.7 (marked with "% urlbst") |
| %%% See <http://purl.org/nxg/dist/urlbst> |
| %%% Added webpage entry type, and url and lastchecked fields. |
| %%% Added eprint support. |
| %%% Added DOI support. |
| %%% Added PUBMED support. |
| %%% Added hyperref support. |
| %%% |
| %%% Also modified by Akira Yokosawa <akiyks@gmail.com> for perfbook. |
| %%% (marked with "% ay") |
| %%% Brought date field of unpublished entry in front of note field. |
| %%% (In perfbook, note field is mostly used for URL info.) |
| %%% Added support of location field in inproceedings entry. |
| %%% If "location" is available, it is used instead of "address". |
| %%% Copyright (C) 2016, 2017 Akira Yokosawa. |
| %%% |
| %%% Original headers follow... |
| |
| % BibTeX standard bibliography style `alpha' |
| % Version 0.99b (8-Dec-10 release) for BibTeX versions 0.99a or later. |
| % Copyright (C) 1984, 1985, 1988, 2010 Howard Trickey and Oren Patashnik. |
| % Unlimited copying and redistribution of this file are permitted as long as |
| % it is unmodified. Modifications (and redistribution of modified versions) |
| % are also permitted, but only if the resulting file is renamed to something |
| % besides 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 |
| eprint % urlbst |
| doi % urlbst |
| pubmed % urlbst |
| url % urlbst |
| lastchecked % urlbst |
| location %ay |
| } |
| {} |
| { label extra.label sort.label } |
| |
| INTEGERS { output.state before.all mid.sentence after.sentence after.block } |
| |
| % urlbst... |
| % urlbst constants and state variables |
| STRINGS { urlintro |
| eprinturl eprintprefix doiprefix doiurl pubmedprefix pubmedurl |
| citedstring onlinestring linktextstring |
| openinlinelink closeinlinelink } |
| INTEGERS { hrefform inlinelinks makeinlinelink |
| addeprints adddoiresolver addpubmedresolver } |
| FUNCTION {init.urlbst.variables} |
| { |
| % The following constants may be adjusted by hand, if desired |
| |
| % The first set allow you to enable or disable certain functionality. |
| #1 'addeprints := % 0=no eprints; 1=include eprints |
| #1 'adddoiresolver := % 0=no DOI resolver; 1=include it |
| #1 'addpubmedresolver := % 0=no PUBMED resolver; 1=include it |
| #2 'hrefform := % 0=no crossrefs; 1=hypertex xrefs; 2=hyperref refs |
| #1 'inlinelinks := % 0=URLs explicit; 1=URLs attached to titles |
| |
| % String constants, which you _might_ want to tweak. |
| "URL: " 'urlintro := % prefix before URL; typically "Available from:" or "URL": |
| "online" 'onlinestring := % indication that resource is online; typically "online" |
| "cited " 'citedstring := % indicator of citation date; typically "cited " |
| "[link]" 'linktextstring := % dummy link text; typically "[link]" |
| "http://arxiv.org/abs/" 'eprinturl := % prefix to make URL from eprint ref |
| "arXiv:" 'eprintprefix := % text prefix printed before eprint ref; typically "arXiv:" |
| "http://dx.doi.org/" 'doiurl := % prefix to make URL from DOI |
| "doi:" 'doiprefix := % text prefix printed before DOI ref; typically "doi:" |
| "http://www.ncbi.nlm.nih.gov/pubmed/" 'pubmedurl := % prefix to make URL from PUBMED |
| "PMID:" 'pubmedprefix := % text prefix printed before PUBMED ref; typically "PMID:" |
| |
| % The following are internal state variables, not configuration constants, |
| % so they shouldn't be fiddled with. |
| #0 'makeinlinelink := % state variable managed by possibly.setup.inlinelink |
| "" 'openinlinelink := % ditto |
| "" 'closeinlinelink := % ditto |
| } |
| INTEGERS { |
| bracket.state |
| outside.brackets |
| open.brackets |
| within.brackets |
| close.brackets |
| } |
| % ...urlbst to here |
| FUNCTION {init.state.consts} |
| { #0 'outside.brackets := % urlbst... |
| #1 'open.brackets := |
| #2 'within.brackets := |
| #3 'close.brackets := % ...urlbst to here |
| |
| #0 'before.all := |
| #1 'mid.sentence := |
| #2 'after.sentence := |
| #3 'after.block := |
| } |
| |
| STRINGS { s t } |
| |
| % urlbst |
| FUNCTION {output.nonnull.original} |
| { '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 |
| } |
| |
| % urlbst... |
| % The following three functions are for handling inlinelink. They wrap |
| % a block of text which is potentially output with write$ by multiple |
| % other functions, so we don't know the content a priori. |
| % They communicate between each other using the variables makeinlinelink |
| % (which is true if a link should be made), and closeinlinelink (which holds |
| % the string which should close any current link. They can be called |
| % at any time, but start.inlinelink will be a no-op unless something has |
| % previously set makeinlinelink true, and the two ...end.inlinelink functions |
| % will only do their stuff if start.inlinelink has previously set |
| % closeinlinelink to be non-empty. |
| % (thanks to 'ijvm' for suggested code here) |
| FUNCTION {uand} |
| { 'skip$ { pop$ #0 } if$ } % 'and' (which isn't defined at this point in the file) |
| FUNCTION {possibly.setup.inlinelink} |
| { makeinlinelink hrefform #0 > uand |
| { doi empty$ adddoiresolver uand |
| { pubmed empty$ addpubmedresolver uand |
| { eprint empty$ addeprints uand |
| { url empty$ |
| { "" } |
| { url } |
| if$ } |
| { eprinturl eprint * } |
| if$ } |
| { pubmedurl pubmed * } |
| if$ } |
| { doiurl doi * } |
| if$ |
| % an appropriately-formatted URL is now on the stack |
| hrefform #1 = % hypertex |
| { "\special {html:<a href=" quote$ * swap$ * quote$ * "> }{" * 'openinlinelink := |
| "\special {html:</a>}" 'closeinlinelink := } |
| { "\href {" swap$ * "} {" * 'openinlinelink := % hrefform=#2 -- hyperref |
| % the space between "} {" matters: a URL of just the right length can cause "\% newline em" |
| "}" 'closeinlinelink := } |
| if$ |
| #0 'makeinlinelink := |
| } |
| 'skip$ |
| if$ % makeinlinelink |
| } |
| FUNCTION {add.inlinelink} |
| { openinlinelink empty$ |
| 'skip$ |
| { openinlinelink swap$ * closeinlinelink * |
| "" 'openinlinelink := |
| } |
| if$ |
| } |
| FUNCTION {output.nonnull} |
| { % Save the thing we've been asked to output |
| 's := |
| % If the bracket-state is close.brackets, then add a close-bracket to |
| % what is currently at the top of the stack, and set bracket.state |
| % to outside.brackets |
| bracket.state close.brackets = |
| { "]" * |
| outside.brackets 'bracket.state := |
| } |
| 'skip$ |
| if$ |
| bracket.state outside.brackets = |
| { % We're outside all brackets -- this is the normal situation. |
| % Write out what's currently at the top of the stack, using the |
| % original output.nonnull function. |
| s |
| add.inlinelink |
| output.nonnull.original % invoke the original output.nonnull |
| } |
| { % Still in brackets. Add open-bracket or (continuation) comma, add the |
| % new text (in s) to the top of the stack, and move to the close-brackets |
| % state, ready for next time (unless inbrackets resets it). If we come |
| % into this branch, then output.state is carefully undisturbed. |
| bracket.state open.brackets = |
| { " [" * } |
| { ", " * } % bracket.state will be within.brackets |
| if$ |
| s * |
| close.brackets 'bracket.state := |
| } |
| if$ |
| } |
| |
| % Call this function just before adding something which should be presented in |
| % brackets. bracket.state is handled specially within output.nonnull. |
| FUNCTION {inbrackets} |
| { bracket.state close.brackets = |
| { within.brackets 'bracket.state := } % reset the state: not open nor closed |
| { open.brackets 'bracket.state := } |
| if$ |
| } |
| |
| FUNCTION {format.lastchecked} |
| { lastchecked empty$ |
| { "" } |
| { inbrackets citedstring lastchecked * } |
| if$ |
| } |
| % ...urlbst to here |
| |
| 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.original} % urlbst (renamed from output.bibitem, so it can be wrapped below) |
| { newline$ |
| "\bibitem[" write$ |
| label write$ |
| "]{" write$ |
| cite$ write$ |
| "}" write$ |
| newline$ |
| "" |
| before.all 'output.state := |
| } |
| |
| FUNCTION {fin.entry.original} % urlbst (renamed from fin.entry, so it can be wrapped below) |
| { 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 * } |
| { numnames #2 > |
| { "," * } |
| 'skip$ |
| if$ |
| t "others" = |
| { " et~al." * } |
| { " and " * t * } |
| if$ |
| } |
| if$ |
| } |
| 't |
| if$ |
| nameptr #1 + 'nameptr := |
| namesleft #1 - 'namesleft := |
| } |
| while$ |
| } |
| |
| FUNCTION {format.authors} |
| { author empty$ |
| { "" } |
| { author format.names } |
| if$ |
| } |
| |
| FUNCTION {format.editors} |
| { editor empty$ |
| { "" } |
| { editor format.names |
| editor num.names$ #1 > |
| { ", editors" * } |
| { ", editor" * } |
| if$ |
| } |
| if$ |
| } |
| |
| FUNCTION {format.title} |
| { title empty$ |
| { "" } |
| { title "t" change.case$ } |
| if$ |
| } |
| |
| FUNCTION {n.dashify} |
| { 't := |
| "" |
| { t empty$ not } |
| { t #1 #1 substring$ "-" = |
| { t #1 #2 substring$ "--" = not |
| { "--" * |
| t #2 global.max$ substring$ 't := |
| } |
| { { t #1 #1 substring$ "-" = } |
| { "-" * |
| t #2 global.max$ substring$ 't := |
| } |
| while$ |
| } |
| if$ |
| } |
| { t #1 #1 substring$ * |
| t #2 global.max$ substring$ 't := |
| } |
| if$ |
| } |
| while$ |
| } |
| |
| FUNCTION {format.date} |
| { year empty$ |
| { month empty$ |
| { "" } |
| { "there's a month but no year in " cite$ * warning$ |
| month |
| } |
| if$ |
| } |
| { month empty$ |
| 'year |
| { month " " * year * } |
| if$ |
| } |
| if$ |
| } |
| |
| FUNCTION {format.btitle} |
| { title emphasize |
| } |
| |
| 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 {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 " * 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 * "}" * |
| } |
| |
| % urlbst... |
| % Functions for making hypertext links. |
| % In all cases, the stack has (link-text href-url) |
| % |
| % make 'null' specials |
| FUNCTION {make.href.null} |
| { |
| pop$ |
| } |
| % make hypertex specials |
| FUNCTION {make.href.hypertex} |
| { |
| "\special {html:<a href=" quote$ * |
| swap$ * quote$ * "> }" * swap$ * |
| "\special {html:</a>}" * |
| } |
| % make hyperref specials |
| FUNCTION {make.href.hyperref} |
| { |
| "\href {" swap$ * "} {\path{" * swap$ * "}}" * |
| } |
| FUNCTION {make.href} |
| { hrefform #2 = |
| 'make.href.hyperref % hrefform = 2 |
| { hrefform #1 = |
| 'make.href.hypertex % hrefform = 1 |
| 'make.href.null % hrefform = 0 (or anything else) |
| if$ |
| } |
| if$ |
| } |
| |
| % If inlinelinks is true, then format.url should be a no-op, since it's |
| % (a) redundant, and (b) could end up as a link-within-a-link. |
| FUNCTION {format.url} |
| { inlinelinks #1 = url empty$ or |
| { "" } |
| { hrefform #1 = |
| { % special case -- add HyperTeX specials |
| urlintro "\url{" url * "}" * url make.href.hypertex * } |
| { urlintro "\url{" * url * "}" * } |
| if$ |
| } |
| if$ |
| } |
| |
| FUNCTION {format.eprint} |
| { eprint empty$ |
| { "" } |
| { eprintprefix eprint * eprinturl eprint * make.href } |
| if$ |
| } |
| |
| FUNCTION {format.doi} |
| { doi empty$ |
| { "" } |
| { doiprefix doi * doiurl doi * make.href } |
| if$ |
| } |
| |
| FUNCTION {format.pubmed} |
| { pubmed empty$ |
| { "" } |
| { pubmedprefix pubmed * pubmedurl pubmed * make.href } |
| if$ |
| } |
| |
| % Output a URL. We can't use the more normal idiom (something like |
| % `format.url output'), because the `inbrackets' within |
| % format.lastchecked applies to everything between calls to `output', |
| % so that `format.url format.lastchecked * output' ends up with both |
| % the URL and the lastchecked in brackets. |
| FUNCTION {output.url} |
| { url empty$ |
| 'skip$ |
| { new.block |
| format.url output |
| format.lastchecked output |
| } |
| if$ |
| } |
| |
| FUNCTION {output.web.refs} |
| { |
| new.block |
| inlinelinks |
| 'skip$ % links were inline -- don't repeat them |
| { |
| output.url |
| addeprints eprint empty$ not and |
| { format.eprint output.nonnull } |
| 'skip$ |
| if$ |
| adddoiresolver doi empty$ not and |
| { format.doi output.nonnull } |
| 'skip$ |
| if$ |
| addpubmedresolver pubmed empty$ not and |
| { format.pubmed output.nonnull } |
| 'skip$ |
| if$ |
| } |
| if$ |
| } |
| |
| % Wrapper for output.bibitem.original. |
| % If the URL field is not empty, set makeinlinelink to be true, |
| % so that an inline link will be started at the next opportunity |
| FUNCTION {output.bibitem} |
| { outside.brackets 'bracket.state := |
| output.bibitem.original |
| inlinelinks url empty$ not doi empty$ not or pubmed empty$ not or eprint empty$ not or and |
| { #1 'makeinlinelink := } |
| { #0 'makeinlinelink := } |
| if$ |
| } |
| |
| % Wrapper for fin.entry.original |
| FUNCTION {fin.entry} |
| { output.web.refs % urlbst |
| makeinlinelink % ooops, it appears we didn't have a title for inlinelink |
| { possibly.setup.inlinelink % add some artificial link text here, as a fallback |
| linktextstring output.nonnull } |
| 'skip$ |
| if$ |
| bracket.state close.brackets = % urlbst |
| { "]" * } |
| 'skip$ |
| if$ |
| fin.entry.original |
| } |
| |
| % Webpage entry type. |
| % Title and url fields required; |
| % author, note, year, month, and lastchecked fields optional |
| % See references |
| % ISO 690-2 http://www.nlc-bnc.ca/iso/tc46sc9/standard/690-2e.htm |
| % http://www.classroom.net/classroom/CitingNetResources.html |
| % http://neal.ctstateu.edu/history/cite.html |
| % http://www.cas.usf.edu/english/walker/mla.html |
| % for citation formats for web pages. |
| FUNCTION {webpage} |
| { output.bibitem |
| author empty$ |
| { editor empty$ |
| 'skip$ % author and editor both optional |
| { format.editors output.nonnull } |
| if$ |
| } |
| { editor empty$ |
| { format.authors output.nonnull } |
| { "can't use both author and editor fields in " cite$ * warning$ } |
| if$ |
| } |
| if$ |
| new.block |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ |
| format.title "title" output.check |
| inbrackets onlinestring output |
| new.block |
| year empty$ |
| 'skip$ |
| { format.date "year" output.check } |
| if$ |
| % We don't need to output the URL details ('lastchecked' and 'url'), |
| % because fin.entry does that for us, using output.web.refs. The only |
| % reason we would want to put them here is if we were to decide that |
| % they should go in front of the rather miscellaneous information in 'note'. |
| new.block |
| note output |
| fin.entry |
| } |
| % ...urlbst to here |
| |
| |
| FUNCTION {article} |
| { output.bibitem |
| format.authors "author" output.check |
| new.block |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| format.title "title" output.check |
| new.block |
| crossref missing$ |
| { journal emphasize "journal" output.check |
| possibly.setup.inlinelink format.vol.num.pages output% urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| location empty$ %ay |
| { address empty$ %ay |
| { 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$ |
| } % ay |
| { location output.nonnull % ay |
| format.date "year" output.check % ay |
| new.sentence % ay |
| organization output % ay |
| publisher output % ay |
| } % ay |
| if$ % ay |
| } |
| { 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| 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 |
| title empty$ 'skip$ 'possibly.setup.inlinelink if$ % urlbst |
| format.title "title" output.check |
| format.date output % ay |
| 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 { 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.urlbst.variables} % urlbst |
| EXECUTE {init.state.consts} |
| |
| ITERATE {call.type$} |
| |
| FUNCTION {end.bib} |
| { newline$ |
| "\end{thebibliography}" write$ newline$ |
| } |
| |
| EXECUTE {end.bib} |