Commit 794ecf4d authored by Martina Maggio's avatar Martina Maggio
Browse files

adding original submission

parent a174c57b
%%% -*-BibTeX-*-
%%% ====================================================================
%%% @BibTeX-style-file{
%%% author = "Nelson H. F. Beebe, Boris Veytsman and Gerald Murray",
%%% version = "2.1",
%%% date = "14 June 2017",
%%% filename = "ACM-Reference-Format.bst",
%%% email = "borisv@lk.net, boris@varphi.com",
%%% codetable = "ISO/ASCII",
%%% keywords = "ACM Transactions bibliography style; BibTeX",
%%% license = "public domain",
%%% supported = "yes",
%%% abstract = "",
%%% }
%%% ====================================================================
%%% Revision history: see source in git
ENTRY
{ address
advisor
archiveprefix
author
booktitle
chapter
city
date
edition
editor
eprint
eprinttype
eprintclass
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 basic.label.year}
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 "[n. d.]" onto output stack
%% Because year is a mandatory field, we always force SOMETHING
%% to be output
"\bibinfo{year}{"
year empty.or.unknown
{ "[n. d.]" }
{ 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
{ }
{
%% Use \urldef here for the same reason it is used in output.url,
%% see output.url for further discussion.
"\urldef\tempurl%" writeln
"\url{https://doi.org/" strip.doi * "}" * writeln
"\showDOI{\tempurl}" 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 }