diff options
-rw-r--r-- | doc/paper/ACM-Reference-Format.bst | 3478 |
1 files changed, 3478 insertions, 0 deletions
diff --git a/doc/paper/ACM-Reference-Format.bst b/doc/paper/ACM-Reference-Format.bst new file mode 100644 index 000000000..033f0c862 --- /dev/null +++ b/doc/paper/ACM-Reference-Format.bst @@ -0,0 +1,3478 @@ +%%% -*-BibTeX-*- +%%% ==================================================================== +%%% @BibTeX-style-file{ +%%% author = "Nelson H. F. Beebe, Boris Veytsman and Gerald Murray", +%%% version = "1.18", +%%% date = "10 July 2016", +%%% filename = "ACM-Reference-Format.bst", +%%% email = "beebe@math.utah.edu, beebe@acm.org, +%%% beebe@computer.org, borisv@lk.net, murray@hq.acm.org", +%%% codetable = "ISO/ASCII", +%%% keywords = "ACM Transactions bibliography style; BibTeX", +%%% license = "public domain", +%%% supported = "yes", +%%% abstract = "", +%%% } +%%% ==================================================================== + +% ACM BibTeX style, ACM-Reference-Format.bst +% for BibTeX version 0.99c, LaTeX version 3.141 +% ACM extensions with code cleaned up, extended, and debugged 10--15-Nov-2008 +% Revised 17-APRIL-2008 (Nelson) +% Revised 13-MARCH-2011 (Boris/Gerry) +% Revised 23-MARCH-2011 (Boris/Gerry) +% Revised 27-MARCH-2011 (Boris/Gerry) +% Revised 15-APRIL-2011 (Boris/Gerry) +% Revised 27-SEPTEMBER-2011 (Boris) +% Revised 10-JULY-2016 (Boris) +% Revised 04-FEB-2017 (Boris) +% +% +% History (by Nelson) +% +% Based on 'acmtrans' (for ACM Journals) +% Date: 28th April 2008 +% +% 1. Avoid 'repeating' the 'month' values. +% 2. Avoid incorrectly italicizing the volume number. +% 3. Avoid non italicizing certain titles (book, inproceedings etc). +% 4. NO series if there is NO volume. +% 5. Sorting of reference with first surname. +% 6. Article no added for Inproceedings. +% +% Date: 07th May 2008 +% +% 1. Abbreviation list added +% +% Citation format: [author-last-name year] +% [author-last-name and author-last-name year] +% [author-last-name, author-last-name, and author-last-name year] +% [author-last-name et al. year] +% [author-last-name] +% author-last-name [year] +% [author-last-name and author-last-name] +% [author-last-name et al.] +% [year] or [year,year] +% year or year,year +% +% Reference list ordering: alphabetical by author or whatever passes +% for author in the absence of one. +% +% Features of the old acmtrans.bst: +% ================================= +% +% - all authors appear last name first. +% - all pages are listed xx-xx, (no pp.) and are at the end of the reference +% - publishers are identified as publisher, address +% - conferences papers (inproceedings) may give city of conference, +% date of conference, and journal that the proceedings appear in. +% - months abbreviated to max four letters (eg. Mar.) +% - volume of a series indicated after the title of the series +% - editors appear after edited title and are identified by a trailing "Eds." +% not in parentheses. Editor names are not given in small caps. +% (unless there is no author line) +% - names terminated with a period even if there is no first name. +% - editions are indicated trailing after the work, not in parentheses. +% - "et al." citations have a protected period to avoid bad spacing (jrh) +% - "address" required when publisher given +% - series (roman) and volume are in a sentence separate from (book-)title +% +% +% Features of chicago.bst: +% ======================= +% +% - full names used in citations, but abbreviated citations are available +% (see above) +% - if an entry has a "month", then the month and year are also printed +% as part of that bibitem. +% - all conjunctions use "and" instead of "\&" +% - major modification from Chicago Manual of Style (13th ed.) is that +% only the first author in a reference appears last name first- +% additional authors appear as J. Q. Public. +% - pages are listed as "pp. xx-xx" in all entry types except +% article entries. +% - book, inbook, and manual use "location: publisher" (or organization) +% for address and publisher. All other types list publishers separately. +% - "pp." are used to identify page numbers for all entry types except +% articles. +% - organization is used as a citation label if neither author nor editor +% is present (for manuals). +% - "et al." is used for long author and editor lists, or when "others" +% is used. +% +% Modifications and bug fixes from newapa.bst: +% =========================================== +% +% - added month, year to bib entries if month is present +% - fixed bug with In proceedings, added necessary comma after title +% - all conjunctions changed to "and" from "\&" +% - fixed bug with author labels in my.full.label: "et al." now is +% generated when "others" is an author name +% - major modification from Chicago Manual of Style (13th ed.) is that +% only the first author in a reference appears last name first- +% additional authors appear as J. Q. Public. +% - pages are listed as "pp. xx-xx" in all entry types except +% article entries. Unnecessary (IMHO) "()" around page numbers +% were removed, and page numbers now don't end with a period. +% - created chicago.sty for use with this bibstyle (required). +% - fixed bugs in FUNCTION {format.vol.num.pages} for missing volume, +% number, and /or pages. Renamed to format.journal.volume.number. +% - fixed bug in formatting booktitles: additional period an error if +% book has a volume. +% - fixed bug: editors usually given redundant period before next clause +% (format.editors.dot) removed. +% - added label support for organizations, if both author and editor +% are missing (from alpha.bst). If organization is too long, then +% the key field is used for abbreviated citations. +% - In proceedings or books of several volumes, no comma was written +% between the "Volume x" and the page numbers (this was intentional +% in newapa.bst). Fixed. +% - Some journals may not have volumes/numbers, only month/year (eg. +% IEEE Computer). Fixed bug in article style that assumed volume/number +% was always present. +% +% Original documentation for newapa.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. +% 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 'newapa.bst'. +% There are undoubtably bugs in this style. If you make bug fixes, +% improvements, etc. please let me know. My e-mail address is: +% spencer@cgrg.ohio.state.edu or 71160.3141@compuserve.com +% +% This style was made from 'plain.bst', 'named.bst', and 'apalike.bst', +% with lots of tweaking to make it look like APA style, along with tips +% from Young Ryu and Brian Reiser's modifications of 'apalike.bst'. +% +% +% Start of ACM-Reference-Format-Journals.bst +% +% Note: Many of the new bibentry 'fields' will only work with the +% 'ACM-Reference-Format-Journals.bst' file. Legacy .bib files (which will, in all probability, +% NOT contain these new fields) will _still_ work with the ACM-Reference-Format-Journals.bst. +% +% +ENTRY + { address + advisor + archiveprefix + author + booktitle + chapter + city % jtb: added + date % jtb: added + edition + editor + eprint + howpublished + institution + journal + key + month + note + number + organization + pages + primaryclass + publisher + school + series + title + type + volume + year + % New keys recognized + issue % UTAH: used in, e.g., ACM SIGSAM Bulletin and ACM Communications in Computer Algebra + articleno + eid + day % UTAH: needed for newspapers, weeklies, bi-weeklies + doi % UTAH + url % UTAH + bookpages % UTAH + numpages + lastaccessed % UTAH: used only for @Misc{...} + coden % UTAH + isbn % UTAH + isbn-13 % UTAH + issn % UTAH + lccn % UTAH + } + {} + { label.year extra.label sort.year sort.label } + +INTEGERS { output.state before.all mid.sentence after.sentence after.block } + +INTEGERS { show-isbn-10-and-13 } % initialized below in begin.bib + +INTEGERS { nameptr namesleft numnames } + +INTEGERS { multiresult } + +INTEGERS { len } + +INTEGERS { last.extra.num } + +STRINGS { s t t.org u } + +STRINGS { last.label next.extra } + +STRINGS { p1 p2 p3 page.count } + +FUNCTION { not } +{ + { #0 } + { #1 } + if$ +} + +FUNCTION { and } +{ + 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION { or } +{ + { pop$ #1 } + 'skip$ + if$ +} + + +FUNCTION { dump.stack.1 } +{ + duplicate$ "STACK[top] = [" swap$ * "]" * warning$ +} + +FUNCTION { dump.stack.2 } +{ + duplicate$ "STACK[top ] = [" swap$ * "]" * warning$ + swap$ + duplicate$ "STACK[top-1] = [" swap$ * "]" * warning$ + swap$ +} + +FUNCTION { empty.or.unknown } +{ + %% Examine the top stack entry, and push 1 if it is empty, or + %% consists only of whitespace, or is a string beginning with two + %% queries (??), and otherwise, push 0. + %% + %% This function provides a replacement for empty$, with the + %% convenient feature that unknown values marked by two leading + %% queries are treated the same as missing values, and thus, do not + %% appear in the output .bbl file, and yet, their presence in .bib + %% file(s) serves to mark values which are temporarily missing, but + %% are expected to be filled in eventually once more data is + %% obtained. The TeX User Group and BibNet bibliography archives + %% make extensive use of this practice. + %% + %% An empty string cannot serve the same purpose, because just as in + %% statistics data processing, an unknown value is not the same as an + %% empty value. + %% + %% At entry: stack = ... top:[string] + %% At exit: stack = ... top:[0 or 1] + + duplicate$ empty$ + { pop$ #1 } + { #1 #2 substring$ "??" = } + if$ +} + +FUNCTION { writeln } +{ + %% In BibTeX style files, the sequences + %% + %% ... "one" "two" output + %% ... "one" "two" output.xxx + %% + %% ship "one" to the output file, possibly following by punctuation, + %% leaving the stack with + %% + %% ... "two" + %% + %% There is thus a one-string lag in output processing that must be + %% carefully handled to avoid duplicating a string in the output + %% file. Unless otherwise noted, all output.xxx functions leave + %% just one new string on the stack, and that model should be born + %% in mind when reading or writing function code. + %% + %% BibTeX's asynchronous buffering of output from strings from the + %% stack is confusing because newline$ bypasses the buffer. It + %% would have been so much easier for newline to be a character + %% rather than a state of the output-in-progress. + %% + %% The documentation in btxhak.dvi is WRONG: it says + %% + %% newline$ Writes onto the bbl file what's accumulated in the + %% output buffer. It writes a blank line if and only + %% if the output buffer is empty. Since write$ does + %% reasonable line breaking, you should use this + %% function only when you want a blank line or an + %% explicit line break. + %% + %% write$ Pops the top (string) literal and writes it on the + %% output buffer (which will result in stuff being + %% written onto the bbl file when the buffer fills + %% up). + %% + %% Examination of the BibTeX source code shows that write$ does + %% indeed behave as claimed, but newline$ sends a newline character + %% directly to the output file, leaving the stack unchanged. The + %% first line "Writes onto ... buffer." is therefore wrong. + %% + %% The original BibTeX style files almost always use "write$ newline$" + %% in that order, so it makes sense to hide that pair in a private + %% function like this one, named after a statement in Pascal, + %% the programming language embedded in the BibTeX Web program. + + write$ % output top-of-stack string + newline$ % immediate write of newline (not via stack) +} + +FUNCTION { init.state.consts } +{ + #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} + +FUNCTION { output.nonnull } +{ % Stack in: ... R S T Stack out: ... R T File out: S<comma><space> + 's := + output.state mid.sentence = + { + ", " * write$ + } + { + output.state after.block = + { + add.period$ writeln + "\newblock " write$ + } + { + output.state before.all = + { + write$ + } + { + add.period$ " " * write$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION { output.nonnull.dot.space } +{ % Stack in: ... R S T Stack out: ... R T File out: S<dot><space> + 's := + output.state mid.sentence = % { "<DEBUG output.nonnull.dot.space>. " * write$ } + { + ". " * write$ + } + { + output.state after.block = + { + add.period$ writeln "\newblock " write$ + } + { + output.state before.all = + { + write$ + } + { + add.period$ " " * write$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION { output.nonnull.remove } +{ % Stack in: ... R S T Stack out: ... R T File out: S<space> + 's := + output.state mid.sentence = + { + " " * write$ + } + { + output.state after.block = + { + add.period$ writeln "\newblock " write$ + } + { + output.state before.all = + { + write$ + } + { + add.period$ " " * write$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION { output.nonnull.removenospace } +{ % Stack in: ... R S T Stack out: ... R T File out: S + 's := + output.state mid.sentence = + { + "" * write$ + } + { + output.state after.block = + { + add.period$ writeln "\newblock " write$ + } + { + output.state before.all = + { + write$ + } + { + add.period$ " " * write$ + } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION { output } +{ % discard top token if empty, else like output.nonnull + duplicate$ empty.or.unknown + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION { output.dot.space } +{ % discard top token if empty, else like output.nonnull.dot.space + duplicate$ empty.or.unknown + 'pop$ + 'output.nonnull.dot.space + if$ +} + +FUNCTION { output.removenospace } +{ % discard top token if empty, else like output.nonnull.removenospace + duplicate$ empty.or.unknown + 'pop$ + 'output.nonnull.removenospace + if$ +} + +FUNCTION { output.check } +{ % like output, but warn if key name on top-of-stack is not set + 't := + duplicate$ empty.or.unknown + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION { bibinfo.output.check } +{ % like output.check, adding bibinfo field + 't := + duplicate$ empty.or.unknown + { pop$ "empty " t * " in " * cite$ * warning$ } + { "\bibinfo{" t "}{" * * swap$ * "}" * + output.nonnull } + if$ +} + +FUNCTION { output.check.dot.space } +{ % like output.dot.space, but warn if key name on top-of-stack is not set + 't := + duplicate$ empty.or.unknown + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull.dot.space + if$ +} + +FUNCTION { fin.block } +{ % functionally, but not logically, identical to fin.entry + add.period$ + writeln +} + +FUNCTION { fin.entry } +{ + add.period$ + writeln +} + +FUNCTION { new.sentence } +{ % update sentence state, with neither output nor stack change + output.state after.block = + 'skip$ + { + output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION { fin.sentence } +{ + add.period$ + write$ + new.sentence + "" +} + +FUNCTION { new.block } +{ + output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION { output.coden } % UTAH +{ % output non-empty CODEN as one-line sentence (stack untouched) + coden empty.or.unknown + { } + { "\showCODEN{" coden * "}" * writeln } + if$ +} + +FUNCTION { format.articleno } +{ + articleno empty.or.unknown not eid empty.or.unknown not and + { "Both articleno and eid are defined for " cite$ * warning$ } + 'skip$ + if$ + articleno empty.or.unknown eid empty.or.unknown and + { "" } + { + numpages empty.or.unknown + { "articleno or eid field, but no numpages field, in " + cite$ * warning$ } + { } + if$ + eid empty.or.unknown + { "Article \bibinfo{articleno}{" articleno * "}" * } + { "Article \bibinfo{articleno}{" eid * "}" * } + if$ + } + if$ +} + +FUNCTION { format.year } +{ % push year string or "????" onto output stack + %% Because year is a mandatory field, we always force SOMETHING + %% to be output + "\bibinfo{year}{" + year empty.or.unknown + { "????" } + { year } + if$ + * "}" * +} + +FUNCTION { format.day.month } +{ % push "day month " or "month " or "" onto output stack + day empty.or.unknown + { + month empty.or.unknown + { "" } + { "\bibinfo{date}{" month * "} " *} + if$ + } + { + month empty.or.unknown + { "" } + { "\bibinfo{date}{" day * " " * month * "} " *} + if$ + } + if$ +} + +FUNCTION { format.day.month.year } % UTAH +{ % if month is empty, push "" else push "(MON.)" or "(DD MON.)" + % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.) + % acm-*.bst addition: prefix parenthesized date string with + % ", Article nnn " + articleno empty.or.unknown eid empty.or.unknown and + { "" } + { output.state after.block = + {", " format.articleno * } + { format.articleno } + if$ + } + if$ + " (" * format.day.month * format.year * ")" * +} + +FUNCTION { output.day.month.year } % UTAH +{ % if month is empty value, do nothing; else output stack top and + % leave with new top string "(MON.)" or "(DD MON.)" + % Needed for frequent periodicals: 2008. ... New York Times C-1, C-2, C-17 (23 Oct.) + format.day.month.year + output.nonnull.remove +} + +FUNCTION { strip.doi } % UTAH +{ % Strip any Web address prefix to recover the bare DOI, leaving the + % result on the output stack, as recommended by CrossRef DOI + % documentation. + % For example, reduce "http://doi.acm.org/10.1145/1534530.1534545" to + % "10.1145/1534530.1534545". That is later typeset and displayed as + % doi:10.1145/1534530.1534545 as the LAST item in the reference list + % entry. Publisher Web sites wrap this with a suitable link to a real + % URL to resolve the DOI, and the master https://doi.org/ address is + % preferred, since publisher-specific URLs can disappear in response + % to economic events. All journals are encouraged by the DOI + % authorities to use that typeset format and link procedures for + % uniformity across all publications that include DOIs in reference + % lists. + % The numeric prefix is guaranteed to start with "10.", so we use + % that as a test. + % 2017-02-04 Added stripping of https:// (Boris) + doi #1 #3 substring$ "10." = + { doi } + { + doi 't := % get modifiable copy of DOI + + % Change https:// to http:// to strip both prefixes (BV) + + t #1 #8 substring$ "https://" = + { "http://" t #9 t text.length$ #8 - substring$ * 't := } + { } + if$ + + t #1 #7 substring$ "http://" = + { + t #8 t text.length$ #7 - substring$ 't := + + "INTERNAL STYLE-FILE ERROR" 's := + + % search for next "/" and assign its suffix to s + + { t text.length$ } + { + t #1 #1 substring$ "/" = + { + % save rest of string as true DOI (should be 10.xxxx/yyyy) + t #2 t text.length$ #1 - substring$ 's := + "" 't := % empty string t terminates the loop + } + { + % discard first character and continue loop: t <= substring(t,2,last) + t #2 t text.length$ #1 - substring$ 't := + } + if$ + } + while$ + + % check for valid DOI (should be 10.xxxx/yyyy) + s #1 #3 substring$ "10." = + { } + { "unrecognized DOI substring " s * " in DOI value [" * doi * "]" * warning$ } + if$ + + s % push the stripped DOI on the output stack + + } + { + "unrecognized DOI value [" doi * "]" * warning$ + doi % push the unrecognized original DOI on the output stack + } + if$ + } + if$ +} + +% +% Change by BV: added standard prefix to URL +% +FUNCTION { output.doi } % UTAH +{ % output non-empty DOI as one-line sentence (stack untouched) + doi empty.or.unknown + { } + { + %% NB: We want URLs at beginning of line to reduce likelihood of + %% BibTeX's nasty line wrapping after column 79, which then requires + %% manual (or automated) editing of the .bbl file to repair. + %% The \url{} macro strips percent-newlines, and is thus safe in + %% the presence of the line wrapping, but \path|...| and + %% \verb|...| do not. + "\showDOI{%" writeln + "\url{https://doi.org/" strip.doi * "}}" * writeln + } + if$ +} + +FUNCTION { output.isbn } % UTAH +{ % output non-empty ISBN-10 and/or ISBN-13 as one-line sentences (stack untouched) + show-isbn-10-and-13 + { + %% show both 10- and 13-digit ISBNs + isbn empty.or.unknown + { } + { + "\showISBNx{" isbn * "}" * writeln + } + if$ + isbn-13 empty.or.unknown + { } + { + "\showISBNxiii{" isbn-13 * "}" * writeln + } + if$ + } + { + %% show 10-digit ISBNs only if 13-digit ISBNs not available + isbn-13 empty.or.unknown + { + isbn empty.or.unknown + { } + { + "\showISBNx{" isbn * "}" * writeln + } + if$ + } + { + "\showISBNxiii{" isbn-13 * "}" * writeln + } + if$ + } + if$ +} + +FUNCTION { output.issn } % UTAH +{ % output non-empty ISSN as one-line sentence (stack untouched) + issn empty.or.unknown + { } + { "\showISSN{" issn * "}" * writeln } + if$ +} + +FUNCTION { output.issue } +{ % output non-empty issue number as a one-line sentence (stack untouched) + issue empty.or.unknown + { } + { "Issue " issue * "." * writeln } + if$ +} + +FUNCTION { output.lccn } % UTAH +{ % return with stack untouched + lccn empty.or.unknown + { } + { "\showLCCN{" lccn * "}" * writeln } + if$ +} + +FUNCTION { output.note } % UTAH +{ % return with stack empty + note empty.or.unknown + { } + { "\shownote{" note add.period$ * "}" * writeln } + if$ +} + +FUNCTION { output.note.check } % UTAH +{ % return with stack empty + note empty.or.unknown + { "empty note in " cite$ * warning$ } + { "\shownote{" note add.period$ * "}" * writeln } + if$ +} + +FUNCTION { output.eprint } % +{ % return with stack empty + eprint empty.or.unknown + { } + { "\showeprint" + archiveprefix empty.or.unknown + { } + { "[" archiveprefix "l" change.case$ "]" * * * } + if$ + "{" * + primaryclass empty.or.unknown + { } + { primaryclass "/" * *} + if$ + eprint "}" * * + writeln + } + if$ +} + + +% +% Changes by BV 2011/04/15. Do not output +% url if doi is defined +% +FUNCTION { output.url } % UTAH +{ % return with stack untouched + % output URL and associated lastaccessed fields + doi empty.or.unknown + { + url empty.or.unknown + { } + { + %% NB: We want URLs at beginning of line to reduce likelihood of + %% BibTeX's nasty line wrapping after column 79, which would require + %% manual (or automated) editing of the .bbl file to repair. However, + %% the \url{} macro handles the unwrapping job automatically. + "\showURL{%" writeln + lastaccessed empty.or.unknown + { "" } + { "Retrieved " lastaccessed * " from " * } + if$ + + %% The URL field may contain a semicolon-separated list of Web + %% addresses, and we locate and wrap each of them in \url{...}. + %% The simplistic approach of putting the entire list into the + %% macro argument is that the semicolons are typeset in a + %% typewriter font, and no space follows them. + %% + %% We therefore replace the original code + %% "\url{" * url * "}}" * writeln + %% with this character-at-a-time loop: + + "\url{" * + + url 't := % get modifiable copy of URL list + + { t text.length$ } + { + t #1 #1 substring$ ";" = + { % then split argument at separator + "};" * writeln + "\url{" + } + { % else concatenate nonblank character to argument + t #1 #1 substring$ " " = + { } + { t #1 #1 substring$ * } + if$ + } + if$ + + t #2 t text.length$ #1 - substring$ 't := + } + while$ + + "}}" * writeln + } + if$ + } + { } + if$ +} + +FUNCTION { output.year.check } +{ % warn if year empty, else output top string and leave " YEAR<label>" on stack in mid-sentence + year empty.or.unknown + { "empty year in " cite$ * warning$ } + { write$ + " \bibinfo{year}{" year * "}" * + "\natexlab{" extra.label * "}" * * + mid.sentence 'output.state := + } + if$ +} + + +FUNCTION { le } +{ + %% test whether first number is less than or equal to second number + %% stack in: n1 n2 + %% stack out: if n1 <= n2 then 1 else 0 + + %% "DEBUG: le " cite$ * warning$ + > { #0 } { #1 } if$ +} + +FUNCTION { ge } +{ + %% test whether first number is greater than or equal to second number + %% stack in: n1 n2 + %% stack out: if n1 >= n2 then 1 else 0 + + %% "DEBUG: ge " cite$ * warning$ + < { #0 } { #1 } if$ +} + +FUNCTION { is.leading.digit } +{ + %% test whether first character of string is a digit + %% stack in: string + %% stack out: if first-char-is-digit then 1 else 0 + + #1 #1 substring$ % replace string by string[1:1] + duplicate$ % string[1:1] string[1:1] + chr.to.int$ + "0" chr.to.int$ swap$ le % "0" <= string[1:1] --> 0-or-1 + swap$ % 0-or-1 string[1:1] + chr.to.int$ + "9" chr.to.int$ le % string[1:1} <= "9" --> 0-or-1 + and +} + +FUNCTION { skip.digits } +{ + %% skip over leading digits in string + %% stack in: string + %% stack out: rest-of-string leading-digits + + %% "DEBUG: enter skip.digits " cite$ * warning$ + + %% dump.stack.1 + + duplicate$ + 't := + 't.org := + "" 'u := + + { t text.length$ } + { + %% "=================DEBUG: skip.digits t = [" t * "]" * warning$ + t is.leading.digit + { t #2 t text.length$ #1 - substring$ } + { + t 'u := + "" + } + if$ + 't := + } + while$ + + u % rest of string + t.org #1 t.org text.length$ u text.length$ - substring$ % leading digits + + %% "DEBUG: t.org = [" t.org * "]" * warning$ + %% "DEBUG: u = [" u * "]" * warning$ + + %% dump.stack.2 + + %% "DEBUG: leave skip.digits " cite$ * warning$ +} + +FUNCTION { skip.nondigits } +{ + %% skip over leading nondigits in string + %% stack in: string + %% stack out: rest-of-string + + %% "DEBUG: enter skip.nondigits " cite$ * warning$ + + 't := + "" 'u := + + { t text.length$ } + { + %% "=================DEBUG: skip.nondigits t = [" t * "]" * warning$ + t is.leading.digit + { + t 'u := + "" + } + { t #2 t text.length$ #1 - substring$ } + if$ + 't := + } + while$ + + u % rest of string + + %% dump.stack.1 + %% "DEBUG: leave skip.nondigits " cite$ * warning$ +} + +FUNCTION { parse.next.number } +{ + %% stack in: string + %% stack out: rest-of-string next-numeric-part-of-string + %% Example: + %% stack in: "123:1--123:59" + %% stack out: ":1--123:59" "123" + + 's := + s skip.nondigits 's := + s skip.digits +} + +FUNCTION { reduce.pages.to.page.count } +{ + %% Stack in: arbitrary-and-unused + %% Stack out: unchanged + %% + %% For the new-style pagination with article number and numpages or + %% pages, we expect to have BibTeX entries containing something like + %% articleno = "17", + %% pages = "1--23", + %% with output "Article 17, 23 pages", + %% or + %% articleno = "17", + %% numpages = "23", + %% with output "Article 17, 23 pages", + %% or + %% articleno = "17", + %% pages = "17:1--17:23", + %% with output "Article 17, 23 pages", + %% + %% If articleno is missing or empty, then we should output "1--23", + %% "23" (with a warning of a missing articleno), or "17:1--17:23", + %% respectively. + + %% "DEBUG: enter reduce.pages.to.page.count " cite$ * warning$ + + %% "DEBUG: pages = [" pages * "]" * warning$ + + pages + parse.next.number 'p1 := + parse.next.number 'p2 := + parse.next.number 'p3 := + parse.next.number 'page.count := + + duplicate$ + empty.or.unknown + { } + { + duplicate$ "unexpected trailing garbage [" swap$ * + "] after n:p1--n:p2 in pages = [" * + pages * + "] in " * + cite$ * + warning$ + } + if$ + + pop$ + + %% "DEBUG: reduce.pages.to.page.count: " + %% " p1 = " p1 * * + %% " p2 = " p2 * * + %% " p3 = " p3 * * + %% " p4 = " page.count * * + %% " in " cite$ * * warning$ + + p1 p3 = p2 "1" = and numpages empty.or.unknown and + { "INFO: reduced pages = [" pages * "] to numpages = [" * page.count * "]" * warning$ } + { + numpages empty.or.unknown + { pages } + { numpages } + if$ + 'page.count := + } + if$ + + p1 "1" = p3 empty.or.unknown and numpages empty.or.unknown and + { + p2 'page.count := + "INFO: reduced pages = [" pages * "] to numpages = [" * page.count * "]" * warning$ + } + { + numpages empty.or.unknown + { pages } + { numpages } + if$ + 'page.count := + } + if$ + + %% "DEBUG: leave reduce.pages.to.page.count " cite$ * warning$ +} + +FUNCTION { new.block.checkb } +{ % issue a new.block only if at least one of top two stack strings is not empty + empty.or.unknown + swap$ empty.or.unknown + and + 'skip$ + 'new.block + if$ +} + +FUNCTION { field.or.null } +{ % convert empty value to null string, else return value + duplicate$ empty.or.unknown + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION { emphasize } +{ % emphasize a non-empty top string on the stack (WITHOUT italic correction) + duplicate$ empty.or.unknown + { pop$ "" } + { "{\em " swap$ * "}" * } + if$ +} + +FUNCTION { emphasize.with.italic.correction } +{ % convert empty string to null string, or emphasize with a trailing italic correction + duplicate$ empty.or.unknown + { pop$ "" } + { "{\em " swap$ * "\/}" * } + if$ +} + +FUNCTION { comma } +{ % convert empty string to null string, or brace string and add trailing comma + duplicate$ empty.or.unknown + { pop$ "" } + { "{" swap$ * "}," * } + if$ +} + +FUNCTION { format.names } +{ + % Format bibliographical entries with the first author last name first, + % and subsequent authors with initials followed by last name. + % All names are formatted in this routine. + + 's := + #1 'nameptr := % nameptr = 1; + s num.names$ 'numnames := % numnames = num.name$(s); + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 = + %NO: BAD ORDER: {"{" s nameptr "{ff~}{ll}{, jj}{, vv}" format.name$ * "}" * 't := } + %NO: BAD ORDER: {"{" s nameptr "{ff~}{ll}{, jj}{, vv}" format.name$ * "}" * 't := } + {"\bibinfo{person}{" s nameptr "{ff }{vv }{ll}{, jj}" format.name$ * "}" * 't := } + {"\bibinfo{person}{" s nameptr "{ff }{vv }{ll}{, jj}" format.name$ * "}" * 't := } + if$ + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + t "\bibinfo{person}{others}" = + { " {et~al\mbox{.}}" * } % jrh: avoid spacing problems + { " {and} " * t * } % from Chicago Manual of Style + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := % nameptr += 1; + namesleft #1 - 'namesleft := % namesleft =- 1; + } + while$ +} + +FUNCTION { my.full.label } +{ + 's := + #1 'nameptr := % nameptr = 1; + s num.names$ 'numnames := % numnames = num.name$(s); + numnames 'namesleft := + { namesleft #0 > } + + { s nameptr "{vv~}{ll}" format.name$ 't := % get the next name + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " et~al\mbox{.}" * } % jrh: avoid spacing problems + { " and " * t * } % from Chicago Manual of Style + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := % nameptr += 1; + namesleft #1 - 'namesleft := % namesleft =- 1; + } + while$ + +} + +FUNCTION { format.names.fml } +{ + % Format names in "familiar" format, with first initial followed by + % last name. Like format.names, ALL names are formatted. + % jtb: The names are NOT put in small caps + + 's := + #1 'nameptr := % nameptr = 1; + s num.names$ 'numnames := % numnames = num.name$(s); + numnames 'namesleft := + { namesleft #0 > } + + { + "\bibinfo{person}{" s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ * "}" * 't := + + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + t "\bibinfo{person}{others}" = + { " {et~al\mbox{.}}" * } + { " {and} " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := % nameptr += 1; + namesleft #1 - 'namesleft := % namesleft =- 1; + } + while$ +} + +FUNCTION { format.authors } +{ + author empty.or.unknown + { "" } + { + "\bibfield{author}{" + author format.names add.period$ * "}" *} % jtb: add period if none before + if$ +} + +FUNCTION { format.key } +{ + empty.or.unknown + { key field.or.null } + { "" } + if$ +} + +FUNCTION { format.no.key } +{ + empty.or.unknown + { "" } + { "" } + if$ +} + +FUNCTION { format.editors.fml } +{ + % Format editor names for use in the "in" types: inbook, incollection, + % inproceedings: first initial, then last names. When editors are the + % LABEL for an entry, then format.editor is used which lists editors + % by last name first. + + editor empty.or.unknown + { "" } + { + "\bibfield{editor}{" + editor format.names.fml + * "}" * + editor num.names$ #1 > + { " (Eds.)" * } + { " (Ed.)" * } + if$ + } + if$ +} + +FUNCTION { format.editors } +{ % format editor names for use in labels, last names first. + editor empty.or.unknown + { "" } + { + "\bibfield{editor}{" + editor format.names + * "}" * + editor num.names$ #1 > + { " (Eds.)." * } + { " (Ed.)." * } + if$ + } + if$ +} + +FUNCTION { format.articletitle } +{ + title empty.or.unknown + { "" } + % Use this to preserve lettercase in titles: + { "\showarticletitle{" title * "}" * } + % Use this for downcase title style: + % { \showarticletitle{" title "t" change.case$ * "}" * } + if$ +} + +FUNCTION { format.title } +{ + title empty.or.unknown + { "" } + % Use this to preserve lettercase in titles: + { "\bibinfo{title}{" title * "}" * } + % Use this for downcase title style: + % { title "t" change.case$ } + if$ +} + +FUNCTION { n.dashify } +{ + 't := + "" + { t empty.or.unknown 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 } +{ + "\bibinfo{booktitle}{" + edition empty.or.unknown + { title emphasize } + { title empty.or.unknown + { title emphasize } % jtb: what is this supposed to do ?!? + { "{\em " title * "\/} (\bibinfo{edition}{" * edition "l" change.case$ * + "} ed.)" * } % jtb: no parens for ed. + if$ + } + if$ + * "}" * +} + +FUNCTION { format.emphasize.booktitle } +{ % push "" or "{\em booktitle}" or "{\em booktitle}, (second ed.)" on stack + "\bibinfo{booktitle}{" + edition empty.or.unknown + { booktitle emphasize } + { booktitle empty.or.unknown + { "" } + { "{\em " booktitle * "} (\bibinfo{edition}{" * + edition "l" change.case$ * "} ed.)" * } + if$ + } + if$ + * "}" * +} + +FUNCTION { format.city } +{ + % jtb: if the preceding string (the title of the conference) is non-empty, + % jtb: append the location, otherwise leave empty (so as to trigger the + % jtb: error message in output.check + + duplicate$ empty.or.unknown + { } + { + city empty.or.unknown + { + date empty.or.unknown + { } + { " (" * date * ")" * } + if$ + } + { + date empty.or.unknown + { " (" * city * ")" * } + { " (" * city * ", " * date * ")" * } + if$ + } + if$ + } + if$ +} + +FUNCTION { tie.or.space.connect } +{ + duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION { either.or.check } +{ + empty.or.unknown + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION { format.bvolume } +{ + % jtb: If there is a series, this is added and the volume trails after it. + % jtb: Otherwise, "Vol" is Capitalized. + + volume empty.or.unknown + { "" } + { + series empty.or.unknown + { "Vol.~\bibinfo{volume}{" volume "}" * *} + { "\bibinfo{series}{" series "}, " * * + "Vol.~\bibinfo{volume}{" volume "}" * * *} + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION { format.bvolume.noseries } +{ + volume empty.or.unknown + { "" } + { "Vol.~\bibinfo{volume}{" volume "}" * * + "volume and number" number either.or.check + } + if$ +} + +FUNCTION { format.series } +{ + series empty.or.unknown + {""} + {" {\em (\bibinfo{series}{" * series "})}" *} + if$ +} + +FUNCTION { format.number.series } +{ + volume empty.or.unknown + { + number empty.or.unknown + { + volume empty.or.unknown + { "" } + { + series empty.or.unknown + { "" } + { " (\bibinfo{series}{" series * "})" * } + if$ + } + if$ + } % { series field.or.null } + { + output.state mid.sentence = + { "Number" } % gnp - changed to mixed case always + { "Number" } + if$ + number tie.or.space.connect series empty.or.unknown + { "there's a number but no series in " cite$ * warning$ } + { " in \bibinfo{series}{" * series * "}" * } + if$ + } + if$ + } + { + "" + } + if$ +} + +FUNCTION { multi.page.check } +{ + 't := + #0 'multiresult := + { multiresult not + t empty.or.unknown 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.or.unknown + { "" } + { "\bibinfo{pages}{" + pages multi.page.check + { pages n.dashify } % gnp - removed () % jtb: removed pp. + { pages } + if$ + * "}" * + } + if$ +} + +FUNCTION { format.pages.check.without.articleno } +{ %% format pages field only if articleno is absent + %% Stack out: pages-specification + numpages missing$ pages missing$ and + { "page numbers missing in both pages and numpages fields in " cite$ * warning$ } + { } + if$ + + articleno empty.or.unknown eid empty.or.unknown and + { + pages missing$ + { numpages } + { format.pages } + if$ + } + { "" } + if$ +} + +FUNCTION { format.pages.check } +{ + pages empty.or.unknown + { "page numbers missing in " cite$ * warning$ "" } + { pages n.dashify } + if$ +} + +FUNCTION { format.bookpages } +{ + bookpages empty.or.unknown + { "" } + { bookpages "book pages" tie.or.space.connect } + if$ +} + +FUNCTION { format.named.pages } +{ + pages empty.or.unknown + { "" } + { format.pages "pages" tie.or.space.connect } + if$ +} + +% +% Changed by Boris Veytsman, 2011-03-13 +% Now the word "pages" is printed even if +% there field pages is not empty. +% + +FUNCTION { format.page.count } +{ + page.count empty.or.unknown + { "" } + { "\bibinfo{numpages}{" page.count * "}~pages" * } + if$ +} + +FUNCTION { format.articleno.numpages } +{ + %% There are seven possible outputs, depending on which fields are set. + %% + %% These four are handled here: + %% + %% articleno, numpages, pages -> "Article articleno-value, numpages-value pages" + %% articleno, numpages -> "Article articleno-value, numpages-value pages" + %% articleno, pages -> "Article articleno-value, reduced-pages-value pages" + %% articleno -> "Article articleno-value" and warn about missing numpages + %% + %% The remaining three have already been handled by + %% format.pages.check.without.articleno: + %% + %% numpages, pages -> "pages-value" + %% numpages -> "numpages-value" + %% pages -> "pages-value" + + articleno empty.or.unknown eid empty.or.unknown and + { + numpages empty.or.unknown + { } + { "numpages field, but no articleno or eid field, in " + cite$ * warning$ } + if$ + "" + } + { + numpages empty.or.unknown + { + pages empty.or.unknown + { + "articleno or eid, but no pages or numpages field in " + cite$ * warning$ + "" 'page.count := + } + { reduce.pages.to.page.count } + if$ + } + { numpages 'page.count := } + if$ + + %% The Article number is now handled in format.day.month.year because + %% ACM prefers the style "Digital Libraries 12, 3, Article 5 (July 2008)" + %% over "Digital Libraries 12, 3 (July 2008), Article 5" + %% format.articleno output + format.page.count + } + if$ +} + +FUNCTION {calc.format.page.count} +{ + numpages empty.or.unknown + { + pages empty.or.unknown + { + "" 'page.count := + } + { reduce.pages.to.page.count } + if$ + } + { numpages 'page.count := } + if$ + format.page.count +} + + + +FUNCTION { format.journal.volume.number.day.month.year } +{ + % By Young (and Spencer) + % GNP - fixed bugs with missing volume, number, and/or pages + % + % Format journal, volume, number, pages for article types. + % + journal empty.or.unknown + { "no journal in " cite$ * warning$ + "" } +% { journal emphasize.with.italic.correction } + { + "\bibinfo{journal}{" + journal "Journal of the ACM" = + { "{\it J. ACM}" } + { + journal "American Mathematical Society Translations" = + { "{\it Amer. Math. Soc. Transl.}" } + { + journal "Bulletin of the American Mathematical Society" = + { "{\it Bull. Amer. Math. Soc.}" } + { + journal "Proceedings of the American Mathematical Society" = + { "{\it Proc. Amer. Math. Soc.}" } + { + journal "Transactions of the American Mathematical Society" = + { "{\it Trans. Amer. Math. Soc.}" } + { + journal "Communications of the {ACM}" = + { "{\it Commun. {ACM}}" } + { + journal "{ACM} Computing Surveys" = + { "{\it Comput. Surveys}" } + { + journal "{ACM} Transactions on Mathematical Software" = + { "{\it {ACM} Trans. Math. Software}" } + { + journal "{ACM} {SIGNUM} Newsletter" = + { "{\it {ACM} {SIGNUM} Newslett.}" } + { + journal "American Journal of Sociology" = + { "{\it Amer. J. Sociology}" } + { + journal "Journal of the American Statistical Association" = + { "{\it J. Amer. Statist. Assoc.}" } + { + journal "Applied Mathematics and Computation" = + { "{\it Appl. Math. Comput.}" } + { + journal "American Mathematical Monthly" = + { "{\it Amer. Math. Monthly}" } + { + journal "British Journal of Mathematical and Statistical Psychology" = + { "{\it Brit. J. Math. Statist. Psych.}" } + { + journal "Canadian Mathematical Bulletin" = + { "{\it Canad. Math. Bull.}" } + { + journal "Journal of Computational and Applied Mathematics" = + { "{\it J. Comput. Appl. Math.}" } + { + journal "Journal of Computational Physics" = + { "{\it J. Comput. Phys.}" } + { + journal "Computers and Structures" = + { "{\it Comput. \& Structures}" } + { + journal "The Computer Journal" = + { "{\it Comput. J.}" } + { + journal "Journal of Computer and System Sciences" = + { "{\it J. Comput. System Sci.}" } + { + journal "Contemporary Mathematics" = + { "{\it Contemp. Math.}" } + { + journal "Crelle's Journal" = + { "{\it Crelle's J.}" } + { + journal "Giornale di Mathematiche" = + { "{\it Giorn. Mat.}" } + { + journal "{IEEE} Transactions on Computers" = + { "{\it {IEEE} Trans. Comput.}" } + { + journal "{IEEE} Transactions on Automatic Control" = + { "{\it {IEEE} Trans. Automat. Control}" } + { + journal "Proceedings of the {IEEE}" = + { "{\it Proc. {IEEE}}" } + { + journal "{IEEE} Transactions on Aerospace and Electronic Systems" = + { "{\it {IEEE} Trans. Aerospace Electron. Systems}" } + { + journal "{IMA} Journal of Numerical Analysis" = + { "{\it {IMA} J. Numer. Anal.}" } + { + journal "Information Processing Letters" = + { "{\it Inform. Process. Lett.}" } + { + journal "Journal of the Institute of Mathematics and its Applications" = + { "{\it J. Inst. Math. Appl.}" } + { + journal "International Journal of Control" = + { "{\it Internat. J. Control}" } + { + journal "International Journal for Numerical Methods in Engineering" = + { "{\it Internat. J. Numer. Methods Engrg.}" } + { + journal "International Journal of Supercomputing Applications" = + { "{\it Internat. J. Supercomputing Applic.}" } + { + journal "Journal of Research of the National Bureau of Standards" = + { "{\it J. Res. Nat. Bur. Standards}" } + { + journal "Linear Algebra and its Applications" = + { "{\it Linear Algebra Appl.}" } + { + journal "Journal of Mathematical Analysis and Applications" = + { "{\it J. Math. Anal. Appl.}" } + { + journal "Mathematische Annalen" = + { "{\it Math. Ann.}" } + { + journal "Journal of Mathematical Physics" = + { "{\it J. Math. Phys.}" } + { + journal "Mathematics of Computation" = + { "{\it Math. Comp.}" } + { + journal "Mathematica Scandinavica" = + { "{\it Math. Scand.}" } + { + journal "Mathematical Tables and Other Aids to Computation" = + { "{\it Math. Tables Aids Comput.}" } + { + journal "Numerische Mathematik" = + { "{\it Numer. Math.}" } + { + journal "Pacific Journal of Mathematics" = + { "{\it Pacific J. Math.}" } + { + journal "Journal of Parallel and Distributed Computing" = + { "{\it J. Parallel and Distrib. Comput.}" } + { + journal "Parallel Computing" = + { "{\it Parallel Comput.}" } + { + journal "Philosophical Magazine" = + { "{\it Philos. Mag.}" } + { + journal "Proceedings of the National Academy of Sciences of the USA" = + { "{\it Proc. Nat. Acad. Sci. U. S. A.}" } + { + journal "Quarterly Journal of Mathematics, Oxford, Series (2)" = + { "{\it Quart. J. Math. Oxford Ser. (2)}" } + { + journal "Quarterly of Applied Mathematics" = + { "{\it Quart. Appl. Math.}" } + { + journal "Review of the International Statisical Institute" = + { "{\it Rev. Inst. Internat. Statist.}" } + { + journal "Journal of the Society for Industrial and Applied Mathematics" = + { "{\it J. Soc. Indust. Appl. Math.}" } + { + journal "Journal of the Society for Industrial and Applied Mathematics, Series B, Numerical Analysis" = + { "{\it J. Soc. Indust. Appl. Math. Ser. B Numer. Anal.}" } + { + journal "{SIAM} Journal on Algebraic and Discrete Methods" = + { "{\it {SIAM} J. Algebraic Discrete Methods}" } + { + journal "{SIAM} Journal on Applied Mathematics" = + { "{\it {SIAM} J. Appl. Math.}" } + { + journal "{SIAM} Journal on Computing" = + { "{\it {SIAM} J. Comput.}" } + { + journal "{SIAM} Journal on Matrix Analysis and Applications" = + { "{\it {SIAM} J. Matrix Anal. Appl.}" } + { + journal "{SIAM} Journal on Numerical Analysis" = + { "{\it {SIAM} J. Numer. Anal.}" } + { + journal "{SIAM} Review" = + { "{\it {SIAM} Rev.}" } + { + journal "{SIAM} Journal on Scientific and Statistical Computing" = + { "{\it {SIAM} J. Sci. Statist. Comput.}" } + { + journal "Software Practice and Experience" = + { "{\it Software Prac. Experience}" } + { + journal "Statistical Science" = + { "{\it Statist. Sci.}" } + { + journal "{USSR} Computational Mathematics and Mathematical Physics" = + { "{\it {U. S. S. R.} Comput. Math. and Math. Phys.}" } + { + journal "Journal of {VLSI} and Computer Systems" = + { "{\it J. {VLSI} Comput. Syst.}" } + { + journal "Zeitschrift fur Angewandte Mathematik und Mechanik" = + { "{\it Z. Angew. Math. Mech.}" } + { + journal "Zeitschrift fur Angewandte Mathematik und Physik" = + { "{\it Z. Angew. Math. Phys.}" } + { + journal "ACM Computing Surveys" = + { "{\it Comput. Surveys}" } + { + journal "ACM Transactions on Mathematical Software" = + { "{\it ACM Trans. Math. Software}" } + { + journal "ACM {SIGNUM} Newsletter" = + { "{\it ACM {SIGNUM} Newslett.}" } + { + journal "IEEE Transactions on Computers" = + { "{\it IEEE Trans. Comput.}" } + { + journal "IEEE Transactions on Automatic Control" = + { "{\it IEEE Trans. Automat. Control}" } + { + journal "Proceedings of the IEEE" = + { "{\it Proc. IEEE}" } + { + journal "IEEE Transactions on Aerospace and Electronic Systems" = + { "{\it IEEE Trans. Aerospace Electron. Systems}" } + { + journal "IMA Journal of Numerical Analysis" = + { "{\it IMA J. Numer. Anal.}" } + { + journal "SIAM Journal on Algebraic and Discrete Methods" = + { "{\it SIAM J. Algebraic Discrete Methods}" } + { + journal "SIAM Journal on Applied Mathematics" = + { "{\it SIAM J. Appl. Math.}" } + { + journal "SIAM Journal on Computing" = + { "{\it SIAM J. Comput.}" } + { + journal "SIAM Journal on Matrix Analysis and Applications" = + { "{\it SIAM J. Matrix Anal. Appl.}" } + { + journal "SIAM Journal on Numerical Analysis" = + { "{\it SIAM J. Numer. Anal.}" } + { + journal "SIAM Review" = + { "{\it SIAM Rev.}" } + { + journal "SIAM Journal on Scientific and Statistical Computing" = + { "{\it SIAM J. Sci. Statist. Comput.}" } + { + journal "USSR Computational Mathematics and Mathematical Physics" = + { "{\it U. S. S. R. Comput. Math. and Math. Phys.}" } + { + journal "Journal of VLSI and Computer Systems" = + { "{\it J. VLSI Comput. Syst.}" } + { + journal "Communications of the ACM" = + { "{\it Commun. ACM}" } + %% If no match with cases needing special handling, just output journal name + { journal emphasize.with.italic.correction } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + } + if$ + * "}" * + } + if$ + + number empty.or.unknown + { + volume empty.or.unknown + { "no number and no volume in " cite$ * warning$ "" * } + { " " * " \bibinfo{volume}{" * volume * "}" * } + if$ + } + { + volume empty.or.unknown + { + "unusual to have number, but no volume, for " cite$ * warning$ + " \bibinfo{number}{" * number * "}" * + } + { " \bibinfo{volume}{" * volume * "}, \bibinfo{number}{" * + number * "}" *} + if$ + } + if$ + after.block 'output.state := + + % Sometimes proceedings are published in journals + % In this case we do not want to put year, day and month here + + type$ "inproceedings" = + { } + {format.day.month.year * } + if$ +} + +FUNCTION { format.chapter.pages } +{ + chapter empty.or.unknown + 'format.pages + { type empty.or.unknown + { "Chapter" } % gnp - changed to mixed case + { type "t" change.case$ } + if$ + chapter tie.or.space.connect + pages empty.or.unknown + {"page numbers missing in " cite$ * warning$} % gnp - added check + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION { format.in.emphasize.booktitle } +{ % jtb: format for collections or proceedings not appearing in a journal + booktitle empty.or.unknown + { "" } + { "In " format.emphasize.booktitle * } + if$ +} + +FUNCTION { format.in.booktitle } +{ % jtb: format for proceedings appearing in a journal + booktitle empty.or.unknown + { "" } + { "In \bibinfo{booktitle}{" booktitle * "}" * } + if$ +} + +FUNCTION { format.in.ed.booktitle } +{ + booktitle empty.or.unknown + { "" } + { editor empty.or.unknown + { "In " format.emphasize.booktitle * } + % jtb: swapped editor location + { "In " format.emphasize.booktitle * ", " * format.editors.fml * } + if$ + } + if$ +} + +FUNCTION { format.thesis.type } +{ % call with default type on stack top + type empty.or.unknown + 'skip$ % use default type + { + pop$ % discard default type + % NO: it is silly to have to brace protect every degree type!: type "t" change.case$ + type + } + if$ +} + +FUNCTION { format.tr.number } +{ + "\bibinfo{type}{" + type empty.or.unknown + { "{T}echnical {R}eport" } + 'type + if$ + "}" * * + number empty.or.unknown + { "t" change.case$ } + %% LOOKS BAD: { "." * number tie.or.space.connect } + %% Prefer "Research report RJ687." to "Research report. RJ687." + { number tie.or.space.connect } + if$ +} + +FUNCTION { format.advisor } +{ + advisor empty.or.unknown + { "" } + { "Advisor(s) " advisor * } + if$ +} + +FUNCTION { format.article.crossref } +{ "See" + "\citeN{" * crossref * "}" * +} + +FUNCTION { format.crossref.editor } +{ + editor #1 "{vv~}{ll}" format.name$ + editor num.names$ duplicate$ + #2 > + { pop$ " et~al\mbox{.}" * } % jrh: avoid spacing problems + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al\mbox{.}" * } % jrh: avoid spacing problems + { " and " * editor #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION { format.book.crossref } +{ + volume empty.or.unknown + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + "In " + } + { "Volume" volume tie.or.space.connect % gnp - changed to mixed case + " of " * + } + if$ + editor empty.or.unknown + editor field.or.null author field.or.null = + or + { key empty.or.unknown + { series empty.or.unknown + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { "{\em " * series * "\/}" * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \citeN{" * crossref * "}" * +} + +FUNCTION { format.incoll.inproc.crossref } +{ "See" + " \citeN{" * crossref * "}" * +} + +FUNCTION { format.lab.names } +{ + % format.lab.names: + % + % determines "short" names for the abbreviated author information. + % "Long" labels are created in calc.label, using the routine my.full.label + % to format author and editor fields. + % + % There are 4 cases for labels. (n=3 in the example) + % a) one author Foo + % b) one to n Foo, Bar and Baz + % c) use of "and others" Foo, Bar et al. + % d) more than n Foo et al. + + 's := + s num.names$ 'numnames := + numnames #2 > % change number to number of others allowed before + % forcing "et al". + { s #1 "{vv~}{ll}" format.name$ " et~al\mbox{.}" * } % jrh: \mbox{} added + { + numnames #1 - 'namesleft := + #2 'nameptr := + s #1 "{vv~}{ll}" format.name$ + { namesleft #0 > } + { nameptr numnames = + { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " et~al\mbox{.}" * } % jrh: avoid spacing problems + { " and " * s nameptr "{vv~}{ll}" format.name$ * } + if$ + } + { ", " * s nameptr "{vv~}{ll}" format.name$ * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } + if$ +} + +FUNCTION { author.key.label } +{ + author empty.or.unknown + { key empty.or.unknown + { "no key, author in " cite$ * warning$ + cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION { editor.key.organization.label } +{ % added - gnp. Provide label formatting by organization if editor is null. + editor empty.or.unknown + { organization empty.or.unknown + { key empty.or.unknown + { "no key, editor or organization in " cite$ * warning$ + cite$ #1 #3 substring$ } + 'key + if$ + } + { organization } + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION { author.editor.key.label } +{ + author empty.or.unknown + { editor empty.or.unknown + { key empty.or.unknown + { "no key, author, or editor in " cite$ * warning$ + cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION { author.editor.key.organization.label } +{ % added - gnp. Provide label formatting by organization if author is null. + author empty.or.unknown + { editor empty.or.unknown + { organization empty.or.unknown + { key empty.or.unknown + { "no key, author, editor or organization in " cite$ * warning$ + cite$ #1 #3 substring$ } + 'key + if$ + } + { organization } + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION { calc.basic.label } +{ + type$ "book" = + type$ "inbook" = + or + type$ "article" = + or + 'author.editor.key.label + { type$ "proceedings" = + type$ "periodical" = + or + 'editor.key.organization.label + { type$ "manual" = + 'author.editor.key.organization.label + 'author.key.label + if$ + } + if$ + } + if$ +} + +FUNCTION { calc.label } +{ + % Changed - GNP. See also author.editor.organization.sort, editor.organization.sort + % Form label for BibTeX entry. The classification of which fields are used + % for which type of entry (book, inbook, etc.) are taken from alpha.bst. + % The change here from newapa is to also include organization as a + % citation label if author or editor is missing. + + calc.basic.label + + author empty.or.unknown % generate the full label citation information. + { + editor empty.or.unknown + { + organization empty.or.unknown + { + key empty.or.unknown + { + "no author, editor, organization, or key in " cite$ * warning$ + "??" + } + { key } + if$ + } + { organization } + if$ + } + { editor my.full.label } + if$ + } + { author my.full.label } + if$ + + % leave label on the stack, to be popped when required. + + "}{" * swap$ * "}{" * + % year field.or.null purify$ #-1 #4 substring$ * + % + % save the year for sort processing afterwards (adding a, b, c, etc.) + % + year field.or.null purify$ #-1 #4 substring$ + 'label.year := +} + + +FUNCTION { output.bibitem } +{ + newline$ + "\bibitem[\protect\citeauthoryear{" write$ + calc.label write$ + sort.year write$ + "}]%" writeln + " {" write$ + cite$ write$ + "}" writeln + "" + before.all 'output.state := +} + + +FUNCTION { output.issue.doi.coden.isxn.lccn.url.eprint } +{ % enter and return with stack empty + %% We switch now from buffered output to output of complete lines, so + %% that the Issue .. URL data have their own lines, and are less likely + %% to be line-wrapped by BibTeX's short-sighted algorithm, which wraps + %% lines longer than 79 characters, backtracking to what it thinks is + %% a break point in the string. Any such wrapping MUST be undone to + %% prevent percent-newline from appearing in DOIs and URLs. The + %% output data are intentionally wrapped in \showxxx{} macros at + %% beginning of line, and that supply their own punctuation (if they + %% are not defined to suppress output entirely), to make it easier for + %% other software to recover them from .bbl files. + %% + %% It also makes it possible to later change the macro definitions + %% to suppress particular output values, or alter their appearance. + %% + %% Note that it is possible for theses, technical reports, and + %% manuals to have ISBNs, and anything that has an ISBN may also + %% have an ISSN. When there are no values for these keys, there + %% is no output generated for them here. + + "\newblock" writeln + after.block 'output.state := + + output.issue + output.isbn + output.coden % CODEN is functionally like ISSN, so output them sequentially + output.issn + output.lccn + output.doi % DOI is ALWAYS last according to CrossRef DOI documentation + output.eprint + output.url % but ACM wants URL last +} + +FUNCTION { output.issue.doi.coden.isxn.lccn.url.eprint.note } +{ % enter with stack empty, return with empty string on stack + output.issue.doi.coden.isxn.lccn.url.eprint + note empty.or.unknown + { } + { + "\newblock" writeln + output.note + } + if$ + "" +} + +FUNCTION { output.issue.doi.coden.isxn.lccn.url.eprint.note.check } +{ % enter with stack empty, return with empty string on stack + output.issue.doi.coden.isxn.lccn.url.eprint + note empty.or.unknown + { } + { + "\newblock" writeln + output.note.check + } + if$ + "" +} + +FUNCTION { article } +{ + output.bibitem + + author empty.or.unknown + { + editor empty.or.unknown + { "neither author and editor supplied for " cite$ * warning$ } + { format.editors "editor" output.check } + if$ + } + { format.authors "author" output.check } + if$ + + author format.no.key output % added + output.year.check % added + new.block + format.articletitle "title" output.check + new.block + howpublished empty.or.unknown + { } + { "\bibinfo{howpublished}{" howpublished "}" * * output } + if$ + + crossref missing$ + { format.journal.volume.number.day.month.year output} + { + "cross reference in @Article{...} is unusual" warning$ + format.article.crossref output.nonnull + } + if$ + + format.pages.check.without.articleno output + format.articleno.numpages output + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + fin.entry +} + +FUNCTION { book } +{ + output.bibitem + author empty.or.unknown + { 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 + crossref missing$ + { new.sentence % jtb: start a new sentence for series/volume + format.bvolume output + new.block + format.number.series output + new.sentence + publisher "publisher" bibinfo.output.check + address "address" bibinfo.output.check % jtb: require address + fin.sentence + pages empty.or.unknown + { format.bookpages } % use bookpages when pages empty + { format.pages.check "pages" tie.or.space.connect } + if$ + output + } + { new.block + format.book.crossref output.nonnull + } + if$ + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + 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 + new.block + howpublished empty.or.unknown + { } + { "\bibinfo{howpublished}{" howpublished "}" * * output } + if$ + address output + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + fin.entry +} + +FUNCTION { inbook } +{ + output.bibitem + author empty.or.unknown + { 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 + crossref missing$ + { new.sentence % jtb: start a new sentence for series/volume + format.bvolume output + new.block + format.number.series output + new.sentence + publisher "publisher" bibinfo.output.check + address "address" bibinfo.output.check % jtb: require address + format.bookpages output + format.chapter.pages + "chapter and pages" output.check % jtb: moved from before publisher + } + { + format.bookpages output + format.chapter.pages "chapter and pages" output.check + new.block + format.book.crossref output.nonnull + } + if$ + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + fin.entry +} + +FUNCTION { incollection } +{ + output.bibitem + format.authors "author" output.check + author format.key output % added + output.year.check % added + new.block + format.articletitle "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + new.sentence % jtb: start a new sentence for series/volume + format.bvolume output + format.number.series output + new.sentence + publisher "publisher" bibinfo.output.check + address "address" bibinfo.output.check % jtb: require address + format.bookpages output + format.chapter.pages output % gnp - was special.output.nonnull + % left out comma before page numbers + % jtb: moved from before publisher + } + { + format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + fin.entry +} + +FUNCTION { inproceedings } +{ + output.bibitem + format.authors "author" output.check + author format.key output % added + output.year.check % added + new.block + format.articletitle "title" output.check + howpublished empty.or.unknown + { } + { "\bibinfo{howpublished}{" howpublished "}" * * output.dot.space } + if$ + crossref missing$ + { + journal missing$ % jtb: proceedings appearing in journals + { format.in.emphasize.booktitle format.city "booktitle" output.check.dot.space + format.series output.removenospace + format.editors.fml output % BV 2011/09/27 Moved dot to comma + format.bvolume.noseries output + new.sentence + organization output + publisher "publisher" bibinfo.output.check % jtb: require publisher (?) + address "address" bibinfo.output.check % jtb: require address + format.bookpages output + } + { + format.in.booktitle format.city "booktitle" output.check + format.editors.fml output + new.sentence + format.journal.volume.number.day.month.year output + } + if$ + format.articleno output + format.pages.check.without.articleno output + } + { + format.incoll.inproc.crossref output.nonnull + format.articleno output + format.pages.check.without.articleno output + } + if$ + format.articleno.numpages output + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + fin.entry +} + +FUNCTION { conference } { inproceedings } + +FUNCTION { manual } +{ + output.bibitem + author empty.or.unknown + { editor empty.or.unknown + { organization "organization" output.check + organization format.key output } % if all else fails, use key + { format.editors "author and editor" output.check } + if$ + } + { format.authors output.nonnull } + if$ + output.year.check % added + new.block + format.btitle "title" output.check + organization address new.block.checkb + % jtb: back to normal style: organization, address + organization "organization" output.check + address output + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + fin.entry +} + +FUNCTION { mastersthesis } +{ + output.bibitem + format.authors "author" output.check + author format.key output % added + output.year.check % added + new.block + format.title emphasize "title" output.check % NB: ACM style requires emphasized thesis title + new.block + "\bibinfo{thesistype}{Master's\ thesis}" format.thesis.type output + new.sentence + school "school" bibinfo.output.check + address empty.or.unknown + { } + { "\bibinfo{address}{" address * "}" * output } + if$ + new.block + format.advisor output + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + 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 + new.block + howpublished empty.or.unknown + { } + { "\bibinfo{howpublished}{" howpublished "}" * * output } + if$ + "" output.nonnull.dot.space + output.day.month.year + calc.format.page.count output + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + fin.entry +} + +FUNCTION { online } { misc } + +FUNCTION { game } { misc } + + +FUNCTION { phdthesis } +{ + output.bibitem + format.authors "author" output.check + author format.key output % added + output.year.check % added + new.block + format.title emphasize "title" output.check % NB: ACM style requires emphasized thesis title + new.block + "\bibinfo{thesistype}{Ph.D. Dissertation}" format.thesis.type output + new.sentence + school "school" bibinfo.output.check + address empty.or.unknown + { } + { "\bibinfo{address}{" address * "}" * output } + if$ + new.block + format.advisor output + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + fin.entry +} + +FUNCTION {format.date} +{ year empty.or.unknown + { month empty.or.unknown + { + "" % output empty date if year/month both empty + day empty.or.unknown + { } + { "there's a day but no month or year in " cite$ * warning$ } + if$ + } + { "there's a month but no year in " cite$ * warning$ + month + day empty.or.unknown + { } + { " " * day * } + if$ + } + if$ + } + { month empty.or.unknown + { + year % output only year if month empty + day empty.or.unknown + { } + { "there's a day and year but no month in " cite$ * warning$ } + if$ + } + { + month " " * + day empty.or.unknown + { } + { day * ", " * } + if$ + year * + } + if$ + } + if$ +} + +FUNCTION {new.block.checka} +{ + empty.or.unknown + 'skip$ + 'new.block + if$ +} + +FUNCTION { periodical } +{ + output.bibitem + editor empty.or.unknown + { organization output } + { format.editors output.nonnull } + if$ + new.block + output.year.check + new.sentence + format.articletitle "title" output.check + format.journal.volume.number.day.month.year output + calc.format.page.count output + fin.entry +} + +FUNCTION { proceedings } +{ + output.bibitem + editor empty.or.unknown + { organization output + organization format.key output } % gnp - changed from author format.key + { format.editors output.nonnull } + if$ + % author format.key output % gnp - removed (should be either + % editor or organization + output.year.check % added (newapa) + new.block + format.btitle format.city "title" output.check % jtb: added city + new.sentence + format.bvolume output + format.number.series output + new.sentence + organization output + % jtb: normal order: publisher, address + publisher empty.or.unknown + { } + { "\bibinfo{publisher}{" publisher * "}" * output } + if$ + address empty.or.unknown + { } + { "\bibinfo{address}{" address * "}" * output } + if$ + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + fin.entry +} + +FUNCTION { techreport } +{ + output.bibitem + format.authors "author" output.check + author format.key output % added + output.year.check % added + new.block + format.btitle "title" output.check + new.block +% format.tr.number output % jtb: moved month ... + format.tr.number output new.sentence % Gerry - need dot 2011/09/28 + institution "institution" bibinfo.output.check + address empty.or.unknown + { } + { "\bibinfo{address}{" address "}" * * output } + if$ + new.sentence + format.named.pages output + % ACM omits year at end in transactions style + % format.day.month.year output.nonnull.dot.space % jtb: ... to here (no parens) + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note + 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 + fin.sentence + output.day.month.year % UTAH + calc.format.page.count output + fin.block + output.issue.doi.coden.isxn.lccn.url.eprint.note.check + fin.entry +} + +FUNCTION { default.type } { misc } + +%%% ACM journal-style month definitions: full name if 1--5 letters, else +%%% abbreviation of 3 or 4 characters and a dot + +MACRO {jan} {"Jan."} + +MACRO {feb} {"Feb."} + +MACRO {mar} {"March"} + +MACRO {apr} {"April"} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sept."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + + +%%% ==================================================================== +%%% I M P O R T A N T C H A N G E +%%% +%%% For the 2009 release of the official acm-*.bst files, there are to +%%% be NO predefined journal abbreviations in those style files. +%%% +%%% ACM may later develop an official list of mappings of full journal +%%% names of commonly-cited journals to ACM-preferred abbreviations, but +%%% authors should consider that use of any of these commented-out +%%% abbreviations is DEPRECATED unless the BibTeX file itself provides +%%% its own @String{name = "value"} definitions. +%%% +%%% Use of journal (and publisher and address) @String{...} +%%% abbreviations, as opposed to explicit value assignments such as +%%% journal = "J. ACM" and publisher = "IEEE", is preferred in +%%% bibliographic databases, because it makes it easier for journal +%%% production staff to replace those definitions by publisher-preferred +%%% abbreviations when articles are typeset for publication. +%%% +%%% For historical reasons, and because some of these abbreviations are +%%% used in other (non-ACM) bibliography style files, they are preserved +%%% here in comments. Future releases of the acm*-.bst files are likely +%%% to remove them entirely. +%%% ==================================================================== +%%% +%%% DEPRECATED: MACRO {acmcs} {"ACM Comput. Surv."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {acmlett} {"ACM Lett. Program. Lang. Syst."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {acta} {"Acta Inf."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ai} {"Artificial Intelligence"} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {al} {"Ada Lett."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {acr} {"Adv. Comput. Res."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {bit} {"Bit"} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {cacm} {"Commun. ACM"} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {cj} {"Comput. J."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {cn} {"Comput. Netw."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {cl} {"Comput. Lang."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ibmjrd} {"IBM J. Res. and Development"} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ibmsj} {"IBM Systems Journal"} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ict} {"Inf. Contr."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ieebcs} {"IEE/BCS Softw. Eng. J."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ieees} {"IEEE Softw."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ieeese} {"IEEE Trans. Softw. Eng."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ieeetc} {"IEEE Trans. Comput."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ieeetcad} {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ieeetpds} {"IEEE Trans. Parall. Distrib. Syst."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ieeetit} {"IEEE Trans. Inf. Theory"} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ipl} {"Inf. Process. Lett."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {icp} {"Inf. Comput."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ist} {"Inf. Softw. Tech."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ijsa} {"Int. J. Supercomput. Appl."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ijpp} {"Int. J. Parallel Program."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {jacm} {"J. ACM"} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: % MACRO {jcss} {"Journal of Computer and System Sciences"} % original BibTeX +%%% DEPRECATED: MACRO {jcss} {"J. Comput. Syst. Sci."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {jlp} {"J. Logic Program."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {jfp} {"J. Funct. Program."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {jsmrp} {"J. Softw. Maint. Res. Pract."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {jss} {"J. Syst. Softw."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {jlc} {"J. Logic and Comput."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {jlsc} {"J. Lisp Symb. Comput."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {lpls} {"Lett. Program. Lang. Syst."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {mor} {"Math. Oper. Res."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {mscs} {"Math. Struct. Comput. Sci."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {mst} {"Math. Syst. Theor."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {ngc} {"New Gen. Comput."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {scp} {"Sci. Comput. Program."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {sicomp} {"SIAM J. Comput."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {spe} {"Softw. Pract. Exper."} +%%% DEPRECATED: +%%% DEPRECATED: MACRO {tocs} {"ACM Trans. Comput. Syst."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {tods} {"ACM Trans. Database Syst."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {tog} {"ACM Trans. Graphics"} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {toms} {"ACM Trans. Math. Softw."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {toois} {"ACM Trans. Office Inf. Syst."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {toplas} {"ACM Trans. Program. Lang. Syst."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {tcs} {"Theor. Comput. Sci."} % original BibTeX +%%% DEPRECATED: +%%% DEPRECATED: MACRO {tr} {"Tech. Rep."} +%%% ==================================================================== + +READ + +FUNCTION { sortify } +{ + purify$ + "l" change.case$ +} + +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 "{ff{ } }{ll{ }}{ vv{ }}{ jj{ }}" format.name$ 't := + 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.or.unknown + { key empty.or.unknown + { "to sort, need author or key in " cite$ * warning$ + "" } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION { author.editor.sort } +{ + author empty.or.unknown + { + editor empty.or.unknown + { + key empty.or.unknown + { "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.organization.sort } +{ + % added - GNP. Stack editor or organization for sorting (from alpha.bst). + % Unlike alpha.bst, we need entire names, not abbreviations + + editor empty.or.unknown + { organization empty.or.unknown + { key empty.or.unknown + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { organization sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION { author.editor.organization.sort } +{ + % added - GNP. Stack author or organization for sorting (from alpha.bst). + % Unlike alpha.bst, we need entire names, not abbreviations + + author empty.or.unknown + { + editor empty.or.unknown + { organization empty.or.unknown + { key empty.or.unknown + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { organization sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION { presort } +{ + % Presort creates the bibentry's label via a call to calc.label, and then + % sorts the entries based on entry type. Chicago.bst adds support for + % including organizations as the sort key; the following is stolen from + % alpha.bst. + + calc.label sortify % recalculate bibitem label + year field.or.null purify$ #-1 #4 substring$ * % add year + " " + * + type$ "book" = + type$ "inbook" = + or + type$ "article" = + or + 'author.editor.sort + { type$ "proceedings" = + type$ "periodical" = + or + 'editor.organization.sort + { type$ "manual" = + 'author.editor.organization.sort + 'author.sort + if$ + } + 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 % by label, year, author/editor, title + +FUNCTION { initialize.extra.label.stuff } +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := +} + +FUNCTION { forward.pass } +{ + % Pass through all entries, comparing current entry to last one. + % Need to concatenate year to the stack (done by calc.label) to determine + % if two entries are the same (see presort) + + last.label + % OLD:calc.label year field.or.null purify$ #-1 #4 substring$ * % add year + % NEW: + calc.basic.label year field.or.null purify$ #-1 #4 substring$ * % add year + #1 entry.max$ substring$ = % are they equal? + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + % OLD: calc.label year field.or.null purify$ #-1 #4 substring$ * % add year + % NEW: + calc.basic.label year field.or.null purify$ #-1 #4 substring$ * % add year + #1 entry.max$ substring$ 'last.label := % assign to last.label + } + if$ +} + +FUNCTION { reverse.pass } +{ + next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ + label.year extra.label * 'sort.year := + 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 } +{ + %% Set to #0 show 13-digit ISBN in preference to 10-digit ISBN. + %% Set to #1 to show both 10-digit and 13-digit ISBNs. + #1 'show-isbn-10-and-13 := + + "%%% -*-BibTeX-*-" writeln + "%%% Do NOT edit. File created by BibTeX with style" writeln + "%%% ACM-Reference-Format-Journals [18-Jan-2012]." writeln + "" writeln + + preamble$ empty.or.unknown + 'skip$ + { preamble$ writeln } + if$ + "\begin{thebibliography}{00}" writeln + "" writeln + "%%% ====================================================================" writeln + "%%% NOTE TO THE USER: you can override these defaults by providing" writeln + "%%% customized versions of any of these macros before the \bibliography" writeln + "%%% command. Each of them MUST provide its own final punctuation," writeln + "%%% except for \shownote{}, \showDOI{}, and \showURL{}. The latter two" writeln + "%%% do not use final punctuation, in order to avoid confusing it with" writeln + "%%% the Web address." writeln + "%%%" writeln + "%%% To suppress output of a particular field, define its macro to expand" writeln + "%%% to an empty string, or better, \unskip, like this:" writeln + "%%%" writeln + "%%% \newcommand{\showDOI}[1]{\unskip} % LaTeX syntax" writeln + "%%%" writeln + "%%% \def \showDOI #1{\unskip} % plain TeX syntax" writeln + "%%%" writeln + "%%% ====================================================================" writeln + "" writeln + + %% ACM publications do not use CODEN, ISSN, and LCCN data, so their default + %% macro wrappers expand to \unskip, discarding their values and unwanted + %% space. + %% + %% For other publications, prior definitions like these may be useful: + %% + %% Plain TeX: + %% \def \showCODEN #1{CODEN #1.} + %% \def \showISSN #1{ISSN #1.} + %% \def \showLCCN #1{LCCN #1.} + %% + %% LaTeX: + %% \newcommand{\showCODEN}[1]{CODEN #1.} + %% \newcommand{\showISSN}[1]#1{ISSN #1.} + %% \newcommand{\showLCCN}[1]{LCCN #1.} + + "\ifx \showCODEN \undefined \def \showCODEN #1{\unskip} \fi" writeln + "\ifx \showDOI \undefined \def \showDOI #1{#1}\fi" writeln + % ACM styles omit ISBNs, but they can be included by suitable definitions of + % \showISBNx and \showISBNxiii before the .bbl file is read + "\ifx \showISBNx \undefined \def \showISBNx #1{\unskip} \fi" writeln + "\ifx \showISBNxiii \undefined \def \showISBNxiii #1{\unskip} \fi" writeln + "\ifx \showISSN \undefined \def \showISSN #1{\unskip} \fi" writeln + "\ifx \showLCCN \undefined \def \showLCCN #1{\unskip} \fi" writeln + "\ifx \shownote \undefined \def \shownote #1{#1} \fi" writeln % NB: final period supplied by add.period$ above + "\ifx \showarticletitle \undefined \def \showarticletitle #1{#1} \fi" writeln + "\ifx \showURL \undefined \def \showURL {\relax} \fi" writeln + "% The following commands are used for tagged output and should be " writeln + "% invisible to TeX" writeln + "\providecommand\bibfield[2]{#2}" writeln + "\providecommand\bibinfo[2]{#2}" writeln + "\providecommand\natexlab[1]{#1}" writeln + "\providecommand\showeprint[2][]{arXiv:#2}" writeln +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION { end.bib } +{ + newline$ + "\end{thebibliography}" + writeln +} + +EXECUTE {end.bib} |