%%% -*-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) % % % 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 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 { 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 '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 's := output.state mid.sentence = % { ". " * 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 '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 { "" } { numpages empty.or.unknown { "articleno field, but no numpages field, in " cite$ * warning$ } { } if$ "Article \bibinfo{articleno}{" articleno * "}" * } 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 { "" } { ", " format.articleno * } 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 http://dx.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. doi #1 #3 substring$ "10." = { doi } { doi #1 #7 substring$ "http://" = { doi #8 doi text.length$ #7 - substring$ 't := % get modifiable copy of rest of DOI "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{http://dx.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