You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3254 lines
83 KiB
BibTeX
3254 lines
83 KiB
BibTeX
%%% -*-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
|
|
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
|
|
{ }
|
|
{
|
|
%% 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, output top string and leave " YEAR<label>" on stack in mid-sentence
|
|
year empty.or.unknown
|
|
{ "empty year in " cite$ * warning$
|
|
write$
|
|
" \bibinfo{year}{[n. d.]}"
|
|
"\natexlab{" extra.label * "}" * *
|
|
mid.sentence 'output.state :=
|
|
}
|
|
{ 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$
|
|
}
|
|
|
|
% Calculate label and leave it on stack
|
|
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$
|
|
duplicate$
|
|
year empty.or.unknown
|
|
{ "[n. d.]" }
|
|
{ year field.or.null purify$ #-1 #4 substring$}
|
|
if$
|
|
*
|
|
'basic.label.year :=
|
|
}
|
|
|
|
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 empty.or.unknown
|
|
{ "[n. d.]" }
|
|
{ year field.or.null purify$ #-1 #4 substring$}
|
|
if$
|
|
'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 "author" output.check
|
|
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."}
|
|
|
|
|
|
|
|
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 "{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
|
|
basic.label.year
|
|
swap$
|
|
" "
|
|
swap$
|
|
* *
|
|
" "
|
|
*
|
|
sortify
|
|
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
|
|
|
|
% From plainnat.bst
|
|
STRINGS { longest.label }
|
|
|
|
INTEGERS { longest.label.width number.label }
|
|
|
|
FUNCTION {initialize.longest.label}
|
|
{ "" 'longest.label :=
|
|
#0 int.to.chr$ 'last.label :=
|
|
"" 'next.extra :=
|
|
#0 'longest.label.width :=
|
|
#0 'last.extra.num :=
|
|
#0 'number.label :=
|
|
}
|
|
|
|
|
|
|
|
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
|
|
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 :=
|
|
calc.basic.label year field.or.null purify$ #-1 #4 substring$ * % add year
|
|
#1 entry.max$ substring$ 'last.label := % assign to last.label
|
|
}
|
|
if$
|
|
number.label #1 + 'number.label :=
|
|
}
|
|
|
|
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}
|
|
EXECUTE {initialize.longest.label}
|
|
|
|
|
|
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}{" number.label int.to.str$ * "}" * 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}
|