This repository provides User Manual for setting up a Docker environment tailored for testing DGTD code.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

5234 lines
143 KiB

%%
%% This is file `apacite.bst',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% apacite.dtx (with options: `bibstyle')
%%
%% This is a generated file.
%%
%% Copyright (C) 1994-2009 Erik Meijer and any individual authors listed
%% elsewhere in this file.
%%
%% This file is part of the `apacite' package.
%% -------------------------------------------
%%
%% It may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
%% version 1.3 of this license or (at your option) any later
%% version. The latest version of this license is in:
%%
%% http://www.latex-project.org/lppl.txt
%%
%% and version 1.3 or later is part of all distributions of
%% LaTeX version 2005/12/01 or later.
%%
%% The `apacite' package consists of the files apacite.dtx and
%% apacite.ins, and the following generated files:
%% apacite.sty, apacite.bst, apacitex.bst, apa5ex.bib,
%% apacite.drv, apacdoc.sty, apacann.bst, apacannx.bst,
%% english.apc, dutch.apc, finnish.apc, french.apc, german.apc,
%% ngerman.apc, greek.apc, norsk.apc, spanish.apc, swedish.apc.
%%
%% This work has the LPPL maintenance status `maintained'
%%
%% The Current Maintainer of this work is Erik Meijer
%%
%% This file may only be distributed together with a copy of the
%% source files of the apacite package, i.e., apacite.dtx and
%% apacite.ins. You may however distribute the apacite package without
%% the generated files.
%%
%% apacite.bst
%% [2009/03/01 v4.05 APA bibliography style]
%% apacite.bst : reference list according to APA manual
%% Written by Erik Meijer
FUNCTION {identify.apacite.version}
{ % Put identifying string in the .blg file
"apacite.bst"
" [2009/03/01 v4.05 APA bibliography style]"
* top$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ENTRY
{ address
annote % only used for annotated version
annotate % only used for annotated version
author
booktitle % for articles in books
chair % for lectures
chapter % for incollection, esp. internet documents
day
edition
editor
englishtitle % english translation of title in other language
firstkey % key for first citation
howpublished
institution % for technical reports
journal
key % key for second and later citations, or all
% citations if firstkey is missing
lastchecked % for URL's
month
note
number % number of journal or report
organization % for unpublished
%
% for reprints, translations, etc.
%
originaladdress
originalbooktitle
originaledition
originaleditor
originaljournal
originalnumber
originalpages
originalpublisher
originalvolume
originalyear
%
% back to normal
%
pages
publisher
school % for theses
series % not used
symposium % for lectures
text % for literals
title
translator % translator of book (or article)
type % type of phdthesis (e.g., Doctoral dissertation)
% or type of article (e.g., Letter to the editor)
% etc.
url
volume
year
}
{ title.number % for sorting titles
cite.initials % dummy (0-1) indicating whether or not
% initials of the 1st author must
% be used for citing
cite.num.names.full % number of names to be cited for full and
cite.num.names.short % short cite
add.to.year % For a, b, c, etc. after year
% in multiple citations with same author-year
}
{ year.label % For sorting entries by year
author.year.sort.label % For sorting entries and checking whether
% initials should be added, how many authors
% should be cited and whether a, b, etc.
% after year is necessary
title.sort.label % for sorting titles
type.2 % Replacement for type with misc entries and
% entries that revert to misc.
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
INTEGERS { len pos name.max old.number numnames numnames.old
nameptr lastname format.num.names cite.initials.old
cite.num.names.old add.to.year.old forward
multiresult dot brace.level
}
STRINGS { s t u old.label field
aut1f aut1s aut1f.old aut1s.old
aut2 aut2.old
aut3 aut3.old
aut4 aut4.old
aut5 aut5.old
aut6 aut6.old
year.label.old
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {test} { #0 }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.index} { #0 }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MACRO {jan} {"{\APACmonth{01}}"}
MACRO {feb} {"{\APACmonth{02}}"}
MACRO {mar} {"{\APACmonth{03}}"}
MACRO {apr} {"{\APACmonth{04}}"}
MACRO {may} {"{\APACmonth{05}}"}
MACRO {jun} {"{\APACmonth{06}}"}
MACRO {jul} {"{\APACmonth{07}}"}
MACRO {aug} {"{\APACmonth{08}}"}
MACRO {sep} {"{\APACmonth{09}}"}
MACRO {oct} {"{\APACmonth{10}}"}
MACRO {nov} {"{\APACmonth{11}}"}
MACRO {dec} {"{\APACmonth{12}}"}
MACRO {winter} {"{\APACmonth{13}}"}
MACRO {spring} {"{\APACmonth{14}}"}
MACRO {summer} {"{\APACmonth{15}}"}
MACRO {fall} {"{\APACmonth{16}}"}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {not}
{ { #0 }
{ #1 }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {and}
{ 'skip$
{ pop$ #0 }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {or}
{ { pop$ #1 }
'skip$
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% issues warning if field is empty
% call with
% "field" field warning.if.empty
% Note that the first field must be between quotes
% because it is the fieldname for use in the warning message.
%
FUNCTION {warning.if.empty}
{ empty$
{ "No " swap$ * " in " * cite$ * warning$ }
{ pop$ }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% issues warning if title, type, and howpublished are empty
%
FUNCTION {check.relevant.fields}
{ title empty$
type empty$ and
howpublished empty$ and
{ "No title, type, and howpublished in " cite$ * warning$ }
'skip$
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% delivers 1 if (both editor and translator
% not empty and not equal to each other)
% 0 if (editor or translator empty) or
% (editor = translator)
%
FUNCTION {editor.ne.trans}
{ translator empty$
{ #0 }
{ editor empty$
{ #0 }
{ translator editor =
{ #0 }
{ #1 }
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {conv.int.to.str}
{ duplicate$ #10 <
{ "0000" swap$ int.to.str$ * }
{ duplicate$ #100 <
{ "000" swap$ int.to.str$ * }
{ duplicate$ #1000 <
{ "00" swap$ int.to.str$ * }
{ duplicate$ #10000 <
{ "0" swap$ int.to.str$ * }
{ int.to.str$ }
if$
}
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {ref.type}
{ type$ "article" =
type$ "magazine" =
type$ "newspaper" =
type$ "book" =
type$ "techreport" =
type$ "unpublished" =
type$ "misc" =
type$ "booklet" =
type$ "manual" =
type$ "proceedings" =
or
or
or
or
or
or
or
or
or
{ #1 }
{ type$ "incollection" =
type$ "phdthesis" =
type$ "mastersthesis" =
type$ "lecture" =
type$ "inbook" =
type$ "inproceedings" =
type$ "conference" =
type$ "intechreport" =
or
or
or
or
or
or
or
{ #2 }
{ type$ "literal" =
{ #3 }
{ #0 }
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {is.atype}
{ type$ "article" =
type$ "magazine" =
type$ "newspaper" =
type$ "incollection" =
type$ "inbook" =
type$ "inproceedings" =
type$ "conference" =
type$ "intechreport" =
type$ "manual" =
or
or
or
or
or
or
or
or
{ #1 }
{ journal empty$ not
%
type$ "phdthesis" =
type$ "mastersthesis" =
or
%
and
{ #1 }
{ type$ "misc" =
type empty$ not and
{ type "\bibmessage" =
type "\bibcomputerprogram" =
type "\bibcomputerprogrammanual" =
type "\bibcomputerprogramandmanual" =
type "\bibcomputersoftware" =
type "\bibcomputersoftwaremanual" =
type "\bibcomputersoftwareandmanual" =
type "\bibprogramminglanguage" =
or
or
or
or
or
or
or
{ #1 }
{ #0 }
if$
}
{ #0 }
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% connects two strings with connect string
% if one of them empty, then connect string
% is left out
%
% call with S1 S2 connectstring connect.check
%
FUNCTION {connect.check}
{ 'u :=
%
% if S2 = ""
%
duplicate$ empty$
%
% then remove S2
%
{ pop$
%
% S1 is on top of stack.
% if it is empty, it is replaced by the empty string ""
%
duplicate$ empty$
{ pop$ "" }
'skip$
if$
}
%
% else swap S1 and S2 so that S1 can be checked
%
{ swap$
%
% if S1 is empty, remove S1 so that S2 is left on the
% stack and is the result is given
%
duplicate$ empty$
{ pop$ }
%
% now the real work starts:
% push the connect string "C"
% so that top of stack is "C" "S1" "S2"
% concatenate, so that top of stack is
% "S1+C" "S2"
%
{ u *
%
% swap and concatenate
%
swap$ *
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% connects two strings with space ("\ ")
% if length of second is 4 or larger,
% connects them with non-breaking space ("tie", "~")
% if length of second smaller than 4
%
% call with S1 S2 tie.or.space.connect
% result: "S1\ S2" or "S1~S2"
%
FUNCTION {tie.or.space.connect}
{ duplicate$ text.length$ #4 <
{ "~" }
{ "\ " }
if$
swap$ * *
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% connects two strings with comma (", ")
% if one of them is empty, the comma is left out
%
% call with S1 S2 connect.with.comma.check
% result: "S1, S2"
%
FUNCTION {connect.with.comma.check}
{ ", " connect.check }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% connects two strings with semicolon ("; ")
% if one of them is empty, semicolon is left out
%
% call with S1 S2 connect.with.semicolon.check
% result: "S1; S2"
%
FUNCTION {connect.with.semicolon.check}
{ "; " connect.check }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% connects two strings with colon (": ")
% if one of them is empty, colon is left out
%
% call with S1 S2 connect.with.colon.check
% result: "S1: S2"
%
FUNCTION {connect.with.colon.check}
{ ": " connect.check }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% connects two strings with space ("\ ")
%
% call with S1 S2 connect.with.space.check
% result: "S1\ S2"
%
FUNCTION {connect.with.space.check}
{ "\ " connect.check }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% encloses string in pre- and postfix string
% call with
% prefix postfix S enclose.check
% delivers empty string if S empty
%
FUNCTION {enclose.check}
{ duplicate$ empty$
{ pop$ pop$ pop$
""
}
{ swap$ * * }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% emphasizes top of stack
% call with
% "string" emphasize.check
%
FUNCTION {emphasize.check}
{ "\Bem{" swap$
"}" swap$
enclose.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% brackets top of stack
% call with
% "string" bracket
%
FUNCTION {bracket.check}
{ "[" swap$
"]" swap$
enclose.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% parenthesizes top of stack
% call with
% "string" parenthesize
%
FUNCTION {parenthesize.check}
{ "(" swap$
")" swap$
enclose.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% checks whether argument is "multiresult":
% whether it contains '-', '+', or ',' characters
% used with pages to check whether pp. or p. must be used
%
FUNCTION {multi.result.check}
{ 't :=
#0 'multiresult :=
%
% while (not multiresult) and (length(t) > 1) do
%
{ multiresult not
t text.length$ #1 >
and
}
%
% if t(1-2) = "--" or t(1) = "+" or ","
% then multiresult = 1
% else t = t(2-last)
%
{ t #1 #2 substring$ 's :=
"--" s =
{ #1 'multiresult := }
{ t #1 #1 substring$ 's :=
"+" s =
"," s =
or
{ #1 'multiresult := }
{ t #2 global.max$ substring$ 't := }
if$
}
if$
}
while$
multiresult
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Checks whether an author is a corporate author, i.e.,
% whether the field starts with "{\bibcorporate".
% Call with
% field is.bibcorporate
%
FUNCTION {is.bibcorporate}
{ #1 #14 substring$ "{\bibcorporate" = }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {sortify}
{ purify$
"l" change.case$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {remove.spaces}
{ % Remove spaces from string.
% Works best if string only contains alphanumeric characters and spaces.
's := % The original string
s text.length$ 'len := % Its length (no. of characters)
"" 't := % Initialize the transformed string
#0 'pos :=
%
% while (pos < len) do
%
{ pos len < }
{ pos #1 + 'pos :=
s pos #1 substring$ 'u :=
%
% u is the pos-th character in s
% If it is a space, move to next character,
% else copy character to output.
%
u " " =
'skip$
{ t u * 't := }
if$
}
while$
%
% Now push the result back on the stack
t
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% starting new block by writing what's left on the stack,
% starting a new line and adding some extra space or
% whatever is more defined in \newblock
%
FUNCTION {output.end.block}
{ write$
newline$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% starting new block by writing what's left on the stack,
% starting a new line and adding some extra space or
% whatever is more defined in \newblock
%
FUNCTION {output.new.block}
{ output.end.block
"\newblock" write$
newline$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% starting new block by writing what's left on the stack,
% starting a new line and adding some extra space or
% whatever is more defined in \newblock
%
FUNCTION {output.dot.new.block}
{ add.period$
output.new.block
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {start.new.block}
{ newline$
"\unskip\ " write$ newline$
"\newblock " write$ newline$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% finish current entry
% by writing what's left on the stack and starting a new line
%
FUNCTION {fin.entry}
{ output.end.block
"\PrintBackRefs{\CurrentBib}" write$ newline$
test
{ "\vspace{\baselineskip}" write$ newline$ }
'skip$
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {sort.name.format} { "{ll{}}{ f{}}{ vv{}}{ jj{}}" }
FUNCTION {cite.name.format} { "{ll}" }
FUNCTION {cite.initials.name.format} { "{f{\BPBI }.~~}{vv }{ll}{ jj}" }
FUNCTION {author.name.format} { "{ll}{, f{\BPBI }.}{ vv}{, jj}" }
FUNCTION {editor.name.format} { "{f{\BPBI }.~~}{vv }{ll}{ jj}" }
FUNCTION {index.name.format} { "{ll}{, f{\BPBI }.}{ vv}{, jj}" }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {init.initials}
{ "yyyyy" 'aut1f.old :=
"yyyyy" 'aut1s.old :=
#0 'cite.initials.old :=
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {update.no.initials}
{ 'field :=
field 'aut1f.old :=
field 'aut1s.old :=
#0 'cite.initials.old :=
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {check.add.initials.aut}
{ %
% If last name is equal to previous last name
% but initials are different, then initials should
% be cited. If initials are also the same, initials
% should be cited if that is the case for the previous
% author .
%
aut1s aut1s.old =
{ aut1f aut1f.old =
{ cite.initials.old 'cite.initials := }
{ #1 'cite.initials :=
aut1f 'aut1f.old :=
aut1s 'aut1s.old :=
cite.initials 'cite.initials.old :=
}
if$
}
{ %
% Different last name.
aut1f 'aut1f.old :=
aut1s 'aut1s.old :=
cite.initials 'cite.initials.old :=
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {check.add.initials.field}
{ 'field :=
field #1 cite.initials.name.format format.name$ 'aut1f :=
field #1 cite.name.format format.name$ 'aut1s :=
%
% Now do the actual work
%
check.add.initials.aut
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {check.add.initials}
{ %
% Check whether author or editor or other field acts as author.
% Initials are only relevant with author or editor.
%
firstkey empty$ not
{ key empty$ not
{ %
% Both key and firstkey are nonempty.
% Then, key is treated as last name of first author,
% and firstkey is treated as last name + initials of
% first author .
%
firstkey sortify remove.spaces 'aut1f :=
key sortify remove.spaces 'aut1s :=
check.add.initials.aut
}
{ firstkey sortify remove.spaces update.no.initials }
if$
}
{ key empty$ not
{ key sortify remove.spaces update.no.initials }
{ %
% No key or firstkey, so find out which field
% to use as author.
%
% Check reference type:
% if result is 1 then possibly editor acts as author
% 2 then editor does not act as author
% 3 then key should have been used
% 0 then unknown reference type
ref.type #2 =
{ %
% Format first author with and without initials
author empty$
{ title.sort.label update.no.initials }
{ author check.add.initials.field }
if$
}
{ %
% Format first author with and without initials
author empty$
{ editor empty$
{ title.sort.label update.no.initials }
{ editor check.add.initials.field }
if$
}
{ author check.add.initials.field }
if$
}
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {tentative.cite.num.names.field}
{ 'field :=
field num.names$ 'numnames :=
numnames #3 <
{ %
% 1 or 2 names: always cite all of them.
numnames 'cite.num.names.full :=
numnames 'cite.num.names.short :=
}
{ numnames #6 <
{ %
% 3-5 names: cite all of them the first time,
% only the first name later times
numnames 'cite.num.names.full :=
#1 'cite.num.names.short :=
}
{ %
% 6 or more names: cite only the first name
#1 'cite.num.names.full :=
#1 'cite.num.names.short :=
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {tentative.cite.num.names}
{ %
% Check whether author or editor or other field acts as author.
% Number of names is only relevant with author or editor.
%
firstkey empty$ not
{
#1 'cite.num.names.full :=
#1 'cite.num.names.short :=
}
{ key empty$ not
{
#1 'cite.num.names.full :=
#1 'cite.num.names.short :=
}
{ %
% No key or firstkey, so find out which field
% to use as author.
%
% Check reference type:
% if result is 1 then possibly editor acts as author
% 2 then editor does not act as author
% 3 then key should have been used
% 0 then unknown reference type
ref.type #2 =
{ %
% Format first author with and without initials
author empty$
{
#1 'cite.num.names.full :=
#1 'cite.num.names.short :=
}
{ author tentative.cite.num.names.field }
if$
}
{ %
% Format first author with and without initials
author empty$
{ editor empty$
{
#1 'cite.num.names.full :=
#1 'cite.num.names.short :=
}
{ editor tentative.cite.num.names.field }
if$
}
{ author tentative.cite.num.names.field }
if$
}
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {init.cite.num.names}
{ #0 'cite.num.names.old :=
#0 'numnames.old :=
"yyyy" 'year.label.old :=
#0 'add.to.year.old :=
"" 'aut1f.old :=
"" 'aut2.old :=
"" 'aut3.old :=
"" 'aut4.old :=
"" 'aut5.old :=
"" 'aut6.old :=
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {update.cite.num.names}
{ cite.num.names.short 'cite.num.names.old :=
numnames 'numnames.old :=
year.label 'year.label.old :=
add.to.year 'add.to.year.old :=
aut1f 'aut1f.old :=
aut2 'aut2.old :=
aut3 'aut3.old :=
aut4 'aut4.old :=
aut5 'aut5.old :=
aut6 'aut6.old :=
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.6.authors}
{ %
% First author: with initials.
%
field #1 cite.initials.name.format format.name$ 'aut1f :=
%
% Second and later authors: without initials.
%
numnames #1 >
name.max #1 >
and
{ %
% 2nd author
field #2 cite.name.format format.name$ 'aut2 :=
%
numnames #2 >
name.max #2 >
and
{ %
% 3nd author
field #3 cite.name.format format.name$ 'aut3 :=
%
numnames #3 >
name.max #3 >
and
{ %
% 4th author
field #4 cite.name.format format.name$ 'aut4 :=
%
numnames #4 >
name.max #4 >
and
{ %
% 5th author
field #5 cite.name.format format.name$ 'aut5 :=
%
numnames #5 >
name.max #5 >
and
{ %
% 6th author
field #6 cite.name.format format.name$ 'aut6 :=
}
{ %
% 5 authors: 6 is empty
%
"" 'aut6 :=
}
if$
}
{ %
% 4 authors: 5-6 are empty
%
"" 'aut5 :=
"" 'aut6 :=
}
if$
}
{ %
% 3 authors: 4-6 are empty
%
"" 'aut4 :=
"" 'aut5 :=
"" 'aut6 :=
}
if$
}
{ %
% 2 authors: 3-6 are empty
%
"" 'aut3 :=
"" 'aut4 :=
"" 'aut5 :=
"" 'aut6 :=
}
if$
}
{ %
% Only 1 author: 2-6 are empty
%
"" 'aut2 :=
"" 'aut3 :=
"" 'aut4 :=
"" 'aut5 :=
"" 'aut6 :=
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {change.add.to.year}
{
forward #1 =
{ %
% Moving forward: this add.to.year number must be 1 higher than
% previous.
%
add.to.year.old #0 >
{ add.to.year.old #1 + 'add.to.year := }
{ #2 'add.to.year := }
if$
}
{ %
% Moving backward: this add.to.year number must be 1 lower than
% previous.
%
add.to.year.old #1 - 'add.to.year :=
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {definitive.cite.num.names.1.or.2}
{ %
numnames numnames.old =
{ %
% Same number of names: ambiguity could arise. Check whether current
% and previous have the same author(s).
%
aut1f aut1f.old =
{ %
% Same first author: if the second author is also the same or if
% there is only one author, a's and b's should be added.
%
aut2 aut2.old =
numnames #2 =
and
%
numnames #1 =
or
{ %
% Same author(s): add to year.
%
change.add.to.year
}
{ %
% Different second author: no ambiguity possible.
%
skip$
}
if$
}
{ %
% Different first author: no ambiguity possible.
%
skip$
}
if$
}
{ %
% Different number of names: no ambiguity possible.
%
skip$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {definitive.cite.num.names.3.or.more}
{ %
% Check whether current and previous have the same first author.
%
aut1f aut1f.old =
{ %
% Same first author: check second author
%
aut2 aut2.old =
{ %
% Same 1st & 2nd author: check 3rd.
%
aut3 aut3.old =
{ %
% Same 1st-3rd authors: check 4th.
%
numnames.old #3 =
{ numnames #3 =
{ %
% Both current and previous have 3 authors, which are
% the same, so both have identical author-year
% combinations, so ambiguity should be resolved by
% a's and b's. Check whether more authors were
% necessary for previous one.
%
change.add.to.year
cite.num.names.short cite.num.names.old <
{ cite.num.names.old
'cite.num.names.short :=
}
'skip$
if$
}
{ %
% Previous has 3 authors, current has more, with same
% first 3, so at least 4 must be used for current to
% make a difference.
%
cite.num.names.short #4 <
{ #4 'cite.num.names.short := }
'skip$
if$
}
if$
}
{ numnames #3 =
{ %
% Current has 3 authors, previous has more, with same
% first 3, so all 3 of current must be used.
%
numnames 'cite.num.names.short :=
}
{ %
% Same 1st-3rd author and both current and previous
% have at least 4 authors: check 4th.
%
aut4 aut4.old =
{ %
% Same 1st-4th authors: check 5th.
%
numnames.old #4 =
{ numnames #4 =
{ %
% Both current and previous have 4 authors,
% which are the same, so both have
% identical author-year combinations, so
% ambiguity should be resolved by a's and
% b's. Check whether more authors were
% necessary for previous one.
%
change.add.to.year
cite.num.names.short cite.num.names.old <
{ cite.num.names.old
'cite.num.names.short :=
}
'skip$
if$
}
{ %
% Previous has 4 authors, current has more,
% with same first 4, so at least 5 must be
% used for current to make a difference.
%
cite.num.names.short #5 <
{ #5 'cite.num.names.short := }
'skip$
if$
}
if$
}
{ numnames #4 =
{ %
% Current has 4 authors, previous has more,
% with same first 4, so all 4 of current
% must be used.
%
numnames 'cite.num.names.short :=
}
{ %
% Same 1st-4th author and both current and
% previous have at least 5 authors: check
% 5th.
%
aut5 aut5.old =
{ %
% Same 1st-5th authors: check 6th.
%
numnames.old #5 =
{ numnames #5 =
{ %
% Both current and previous
% have 5 authors, which are the
% same, so both have identical
% author-year combinations, so
% ambiguity should be resolved
% by a's and b's. Check whether
% more authors were necessary
% for previous one.
%
change.add.to.year
cite.num.names.short
cite.num.names.old <
{ cite.num.names.old
'cite.num.names.short :=
}
'skip$
if$
}
{ %
% Previous has 5 authors,
% current has more, with same
% first 5, so at least 6 must
% be used for current to make
% a difference.
%
cite.num.names.short #6 <
{ #6 'cite.num.names.short := }
'skip$
if$
}
if$
}
{ numnames #5 =
{ %
% Current has 5 authors,
% previous has more, with same
% first 5, so all 5 of current
% must be used.
%
numnames 'cite.num.names.short :=
}
{ %
% Same 1st-5th author and both
% current and previous have at
% least 6 authors. If one has
% 6 authors and the other has
% more or the 6th is different,
% 6 should be used (which is
% the maximum).
%
numnames #6 >
numnames.old #6 =
and
%
numnames #6 =
numnames.old #6 >
and
%
or
%
aut6 aut6.old =
not
%
or
{ #6 cite.num.names.short <
{ #6
'cite.num.names.short
:=
}
'skip$
if$
}
{ %
% The first 6 authors are
% the same and either both
% have 6 or both have more.
% So for all practical
% purposes they have
% identical author-year
% combination, so ambiguity
% should be resolved by a's
% and b's. Check whether
% more authors were
% necessary for previous
% one.
%
change.add.to.year
cite.num.names.short
cite.num.names.old
<
{ cite.num.names.old
'cite.num.names.short
:=
}
'skip$
if$
}
if$
}
if$
}
if$
}
{ %
% Different 5th author: citing 5 authors is
% sufficient for this comparison.
%
cite.num.names.short #5 <
{ #5 'cite.num.names.short := }
'skip$
if$
}
if$
}
if$
}
if$
}
{ %
% Different 4th author: citing 4 authors is
% sufficient for this comparison.
%
cite.num.names.short #4 <
{ #4 'cite.num.names.short := }
'skip$
if$
}
if$
}
if$
}
if$
}
{ %
% Different 3rd author: citing 3 authors is sufficient for this
% comparison.
%
cite.num.names.short #3 <
{ #3 'cite.num.names.short := }
'skip$
if$
}
if$
}
{ %
% Different 2nd author: citing 2 authors is sufficient for this
% comparison.
%
cite.num.names.short #2 <
{ #2 'cite.num.names.short := }
'skip$
if$
}
if$
}
{ %
% Different first author: no ambiguity, move to next entry.
%
skip$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {definitive.cite.num.names.field}
{ 'field :=
field num.names$ 'numnames :=
%
% Format authors
%
format.6.authors
%
% Now compare authors with authors of previous entry.
%
cite.num.names.short numnames.old >
{ %
% The previous entry has less authors than already defined
% necessary to be cited. No ambiguity is possible and we're ready.
%
skip$
}
{ %
% Both previous and current entry have at least one author .
%
year.label year.label.old =
{ %
% Same year label: possibly ambiguous citation.
%
% First check: current and/or previous have 1 or
% 2 authors.
%
numnames #3 <
numnames.old #3 <
or
%
{ definitive.cite.num.names.1.or.2 }
{ definitive.cite.num.names.3.or.more }
if$
}
{ %
% Different year label: everything's fine,
% move to next entry.
%
skip$
}
if$
}
if$
%
% If during the previous process the name maximum is exceeded
% (which was not checked), correct this. NOTE: If the name
% maximum is smaller than 6, this could lead to ambiguous
% citations if, e.g., the year and the first 5 authors are
% the same, but the 6th author is different.
%
cite.num.names.short name.max >
{ name.max 'cite.num.names.short := }
'skip$
if$
%
% For a "full" cite, the number of names should always be at least
% as large as for a "short" cite.
%
cite.num.names.full cite.num.names.short <
{ cite.num.names.short 'cite.num.names.full := }
'skip$
if$
%
% Update "old" variables for next entry.
%
update.cite.num.names
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {definitive.cite.no.names}
{ %
% The formatted field that acts as author is on top
% of the stack.
'aut1f :=
"" 'aut2 :=
"" 'aut3 :=
"" 'aut4 :=
"" 'aut5 :=
"" 'aut6 :=
#1 'numnames :=
%
year.label year.label.old =
{ %
% Same year label: possibly ambiguous citation.
%
definitive.cite.num.names.1.or.2
}
{ %
% Different year label: everything's fine,
% move to next entry.
%
skip$
}
if$
%
% Update "old" variables for next entry.
%
update.cite.num.names
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {definitive.cite.num.names}
{ %
% Check whether author or editor or other field acts as author.
% Number of names is only relevant with author or editor.
%
firstkey empty$ not
{ firstkey sortify remove.spaces definitive.cite.no.names }
{ key empty$ not
{ key sortify remove.spaces definitive.cite.no.names }
{ %
% No key or firstkey, so find out which field
% to use as author.
%
% Check reference type:
% if result is 1 then possibly editor acts as author
% 2 then editor does not act as author
% 3 then key should have been used
% 0 then unknown reference type
ref.type #2 =
{ %
% Format first author with and without initials
author empty$
{ title.sort.label definitive.cite.no.names }
{ author definitive.cite.num.names.field }
if$
}
{ %
% Format first author with and without initials
author empty$
{ editor empty$
{ title.sort.label definitive.cite.no.names }
{ editor definitive.cite.num.names.field }
if$
}
{ author definitive.cite.num.names.field }
if$
}
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.tentative.year.sort.label}
{ %
% Implicit or explicit ``no date'' is put at the front
% (the year zero; years B.C. will imply complications)
% because these are possibly old works.
% ``In press'' is put at the end.
%
year empty$
{ "0000" 'year.label := }
{ year "\bibnodate" =
year "n.d." =
or
{ "0000" 'year.label := }
{ year "\BIP" =
{ "9999" 'year.label := }
{ % It is not checked whether the year field
% makes sense.
year sortify remove.spaces 'year.label :=
}
if$
}
if$
}
if$
%
% Push year sort label on the stack
year.label
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {month.number.day}
{ month empty$
{ "" }
{ month sortify remove.spaces
%
% Add the day when available.
day empty$
'skip$
{ "/" *
day sortify remove.spaces *
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.name.sort.label}
{ %
% Author or editor-acting-as-author available.
% => Make tentative "short cite with initials" author
% label (L1) of one of the forms
% "Last1 F1"
% "Last1 F1 Last2"
% "Last1 F1 zzzz" ("zzzz" representing et al.)
% => If more than 2 'authors': make label (L2) for 2nd-6th authors
% of one of the forms
% "Last2 Last3"
% "Last2 Last3 Last4"
% "Last2 Last3 Last4 Last5"
% "Last2 Last3 Last4 Last5 Last6"
% "Last2 Last3 Last4 Last5 Last6 zzzz"
%
% Then format year label (L3) of one of the forms:
% "0000" (missing year or explicit 'no date')
% "9999" ('in press')
% year (otherwise; don't use originalyear here yet)
%
% From earlier sorting of titles, we have title number. Convert
% to string, which gives title label (L4) .
%
% Then tentative sorting label (author.year.sort.label) is a
% concatenation of
% L1
% " "
% L3
% " "
% L2
% " "
% L4
%
% The name field is on top of the stack.
'field :=
%
% numnames is the total number of names contained in field
field num.names$ 'numnames :=
%
% Format first author
field #1 sort.name.format format.name$
%
% Format the second author if there are two, or else "zzzz" = et al.
numnames #1 =
'skip$
{ numnames #2 =
{ %
% Two authors: format second author
field #2 "{ll{}}" format.name$ 's :=
s "others" =
{ " zzzz" * } % Add "et al."-substitute
{ " " * s * } % Add second author
if$
}
{ " zzzz" * } % 3 or more authors: add "et al."-substitute
if$
}
if$
" " * % Add spaces
make.tentative.year.sort.label * % Add year (L3).
" " * % Add spaces
%
% Now build up L2 if applicable
numnames #3 <
'skip$
{ %
% Treat last author slightly differently
numnames name.max >
{ name.max 'lastname :=
" zzzz" % Push "et al."-substitute on stack
}
{ numnames 'lastname :=
"" % Push empty string on stack
}
if$
%
% Names 2 to "last" - 1
"" % Push empty string on stack
#2 'nameptr :=
{ nameptr lastname < }
{ % Add name no. nameptr
field nameptr "{ll{}}" format.name$ *
" " *
nameptr #1 + 'nameptr :=
}
while$
%
% "Last" author
field lastname "{ll{}}" format.name$ 's :=
s "others" =
{ "zzzz" * } % Add "et al."-substitute
{ s * } % Add last author
if$
%
swap$ * % Add the previously formatted empty string or
% "et al."-substitute if there are many authors.
* % Add L2 to the earlier labels.
}
if$
%
" " * % Add spaces
title.number conv.int.to.str * % Add sorted title number (L4).
sortify % Clean up and convert to lowercase
" " * % Add spaces
month.number.day * % Add month and day when available
'author.year.sort.label := % Assign result to sort label.
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.field.year.sort.label}
{ %
% 'field' acts as first author (L1), subsequent authors
% are empty (L2).
%
% Then format year label (L3) of one of the forms:
% "0000" (missing year or explicit 'no date')
% "9999" ('in press')
% year (otherwise; don't use originalyear here yet)
%
% From earlier sorting of titles, we have title number. Convert
% to string, which gives title label (L4) .
%
% Then tentative sorting label (author.year.sort.label) is a
% concatenation of
% L1
% " "
% L3
% " "
% L2
% " "
% L4
%
% 'field' is on top of the stack. It is already supposed to be cleaned
% (i.e., sortified and space-removed), so this is already L1.
" " * % Add spaces to L1
make.tentative.year.sort.label * % Add year (L3).
" " * % Add spaces
" " * % L2 is empty, add spaces
title.number conv.int.to.str * % Add sorted title number (L4).
sortify % Clean up and convert to lowercase
" " * % Add spaces
month.number.day * % Add month and day when available
'author.year.sort.label := % Assign result to sort label.
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.author.editor.sort.label}
{ author empty$
{ editor empty$
{ %
% Use what has previously been stored in title.sort.label
% as author substitute .
title.sort.label make.field.year.sort.label
}
{ editor make.name.sort.label }
if$
}
{ author make.name.sort.label }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.author.sort.label}
{ author empty$
{ %
% Use what has previously been stored in title.sort.label
% as author substitute .
title.sort.label make.field.year.sort.label
}
{ author make.name.sort.label }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.tentative.sort.label}
{ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% General strategy:
%
% Ordinary situation: author or editor-acting-as-author
% available.
% => Make tentative "short cite with initials" author
% label (L1) of one of the forms
% "Last1 F1"
% "Last1 F1 Last2"
% "Last1 F1 zzzz" ("zzzz" representing et al.)
% => If more than 2 'authors': make label (L2) for 2nd-6th authors
% of one of the forms
% "Last2 Last3"
% "Last2 Last3 Last4"
% "Last2 Last3 Last4 Last5"
% "Last2 Last3 Last4 Last5 Last6"
% "Last2 Last3 Last4 Last5 Last6 zzzz"
% When key is available (overrules author and editor fields):
% => L1 = key, L2 = ""
% No author, editor, and key: define title or substitute as key
% and format as key.
%
% Then format year label (L3) of one of the forms:
% "0000" (missing year or explicit 'no date')
% "9999" ('in press')
% year (otherwise; don't use originalyear here yet)
%
% From earlier sorting of titles, we have title number. Convert
% to string, which gives title label (L4) .
%
% Then tentative sorting label (author.year.sort.label) is a
% concatenation of
% L1
% " "
% L3
% " "
% L2
% " "
% L4
%
% This can then be sorted, from which it can be derived
% whether initials are necessary, how many names must
% be used for short and full citations, and whether "a"'s and
% "b"'s etc. are necessary behind the year labels.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% key and firstkey overrule author information
%
firstkey empty$ not
{ key empty$ not
{ %
% Both key and firstkey available:
% for sorting and checking initials, treat key as last
% name and firstkey as initials.
%
key sortify remove.spaces
" " *
firstkey sortify remove.spaces *
make.field.year.sort.label
}
{ firstkey sortify remove.spaces make.field.year.sort.label }
if$
}
{ key empty$ not
{ key sortify remove.spaces make.field.year.sort.label }
{ %
% No key or firstkey, so find out which field
% to use as author.
%
% Check reference type:
% if result is 1 then possibly editor acts as author
% 2 then editor does not act as author
% 3 then key should have been used
% 0 then unknown reference type
ref.type
duplicate$ #1 =
{ pop$
make.author.editor.sort.label
}
{ duplicate$ #2 =
{ pop$
make.author.sort.label
}
{ #3 =
{ "no key in " cite$ * warning$
make.author.editor.sort.label
}
{ make.author.editor.sort.label }
if$
}
if$
}
if$
}
if$
}
if$
%
author.year.sort.label 'sort.key$ :=
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.definitive.name.sort.label}
{ %
% Author or editor-acting-as-author available.
% => Make author-with-initials label (L1) of one of the forms
% "Last1 F1 Last2 F2 ... LastN FN"
% "Last1 F1 Last2 F2 ... Last6 F6 zzzz"
% (where N <= 6 is the total number of authors, and
% "zzzz" represents et al. if there are more than 6 authors)
% No author, editor, and key: define title or substitute as sort key.
%
% The name field is on top of the stack.
'field :=
%
% numnames is the total number of names contained in field
field num.names$ 'numnames :=
%
% If there are more than 6 authors, only 6 are mentioned.
numnames name.max >
{ name.max 'format.num.names := }
{ numnames 'format.num.names := }
if$
% Initialize stack with empty string
""
%
% Cycle over authors.
#1 'nameptr :=
{ nameptr format.num.names < }
{ % Format author and add spaces
field nameptr sort.name.format format.name$ *
" " *
nameptr #1 + 'nameptr :=
}
while$
% Format last author that must be formatted
field nameptr sort.name.format format.name$ *
% Add et al. if necessary
nameptr numnames <
{ " zzzz" * }
'skip$
if$
sortify % Clean up and change case
" " * % Add spaces
year.label * % Add year
" " * % Add spaces
title.number conv.int.to.str * % Add sorted title number
" " * % Add spaces
month.number.day * % Add month and day when available
'author.year.sort.label := % Assign result to sort label.
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.definitive.field.year.sort.label}
{ %
% 'field' acts as author (L1).
%
% Then format year label (L2) of one of the forms:
% "0000" (missing year or explicit `no date')
% "9999" (`in press')
% year (otherwise; don't use originalyear here yet)
%
% From earlier sorting of titles, we have title number. Convert
% to string, which gives title label (L3) .
%
% Then tentative sorting label (author.year.sort.label) is a
% concatenation of
% L1
% " "
% L2
% " "
% L3
%
% 'field' is on top of the stack. It is already supposed to be cleaned
% (i.e., sortified and space-removed), so this is already L1.
" " * % Add spaces
year.label * % Add year
" " * % Add spaces
title.number conv.int.to.str * % Add sorted title number
" " * % Add spaces
month.number.day * % Add month and day when available
'author.year.sort.label := % Assign result to sort label.
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.definitive.author.editor.sort.label}
{ author empty$
{ editor empty$
{ %
% Use what has previously been stored in title.sort.label
% as author substitute .
title.sort.label make.definitive.field.year.sort.label
}
{ editor make.definitive.name.sort.label }
if$
}
{ author make.definitive.name.sort.label }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.definitive.author.sort.label}
{ author empty$
{ %
% Use what has previously been stored in title.sort.label
% as author substitute .
title.sort.label make.definitive.field.year.sort.label
}
{ author make.definitive.name.sort.label }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.final.sort.key}
{ %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% General strategy:
%
% Ordinary situation: author or editor-acting-as-author
% available.
% => Make author-with-initials label (L1) of one of the forms
% "Last1 F1 Last2 F2 ... LastN FN"
% "Last1 F1 Last2 F2 ... Last6 F6 zzzz"
% (where N <= 6 is the total number of authors, and
% "zzzz" represents et al. if there are more than 6 authors)
% No author, editor, and key: define title or substitute as sort key.
%
% Then format year label (L2) of one of the forms:
% "0000" (missing year or explicit `no date')
% "9999" (`in press')
% year (otherwise; don't use originalyear here yet)
% Add "/"month"/"day to the latter when available.
%
% From earlier sorting of titles, we have title number. Convert
% to string, which gives title label (L3) .
%
% Then final sorting label (author.year.sort.label) is a
% concatenation of
% L1
% " "
% L2
% " "
% L3
%
% This can then be sorted.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%
% Find out which field
% to use as author.
%
% Check reference type:
% if result is 1 then possibly editor acts as author
% 2 then editor does not act as author
% 3 then key should have been used
% 0 then unknown reference type
ref.type #2 =
{ make.definitive.author.sort.label }
{ make.definitive.author.editor.sort.label }
if$
%
author.year.sort.label 'sort.key$ :=
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {chop.word}
{ 's :=
'len :=
s #1 len substring$ =
{ s len #1 + global.max$ substring$ }
{ s }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {chop.articles}
{ 's :=
"a " #2
"an " #3
"the " #4
s
chop.word
chop.word
chop.word
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.sort.title}
{ %
% Remove non-alphanumeric characters and change to lower case .
sortify
%
% Remove "a ", "an ", and "the " from the front .
chop.articles #1 entry.max$ substring$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.sort.title}
{ title empty$
{ text empty$
{ type empty$
{ howpublished empty$
{ note empty$
{ url empty$
{ " " }
{ url format.sort.title }
if$
}
{ note format.sort.title }
if$
}
{ howpublished format.sort.title }
if$
}
{ type format.sort.title }
if$
}
{ text format.sort.title }
if$
}
{ title format.sort.title }
if$
remove.spaces
'title.sort.label :=
title.sort.label 'sort.key$ :=
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.title.number}
{ title.sort.label old.label =
{ %
% A tie: old and new label are the same .
old.number 'title.number :=
}
{ %
% The usual situation: titles are different.
old.number #1 + 'title.number :=
title.number 'old.number :=
title.sort.label 'old.label :=
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {last.part.name.format} { "{ll}" }
FUNCTION {initials.with.space.name.format} { "{f.}" }
FUNCTION {von.last.junior.name.format} { "{vv }{ll}{ jj}" }
FUNCTION {von.junior.name.format} { "{ vv}{, jj}" }
FUNCTION {one.complete.name.format} { "{vv }{ll}{, jj}{, ff}" }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {string.length}
{ #0 'pos :=
% If the next character exists, i.e., is not empty,
% add 1 to the string length.
% We cannot use empty$ because " " empty$ is true.
{ duplicate$ pos #1 + #1 substring$ "" = not }
{ pos #1 + 'pos := }
while$
pop$ pos
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {transform.spaces.and.hyphens}
{ 's := % The original string
s string.length 'len := % Its length (no. of characters)
"" 't := % Initialize the transformed string
#1 'pos :=
#0 'brace.level :=
%
% while (pos < len) do
%
{ pos len < }
{ % First, check whether we are at brace level 0
brace.level #0 =
{
% At least two characters left: check for ". ", ".~", and ".-".
% If so, replace and shift two positions.
s pos #2 substring$ ". " =
s pos #2 substring$ ".~" = or
{ t "\BPBI " * 't :=
pos #2 + 'pos :=
}
{ s pos #2 substring$ ".-" =
{ t "\BHBI " * 't :=
pos #2 + 'pos :=
}
{ % neither is true, copy one character and shift one position
t s pos #1 substring$ * 't :=
% Check whether we need to increase brace level.
% Note that this is not sophisticated: it does not capture
% \{, \verb+}+, etc.
% Note also that unbalanced braces cause problems.
s pos #1 substring$ "{" =
{ brace.level #1 + 'brace.level := }
'skip$
if$
pos #1 + 'pos :=
}
if$
}
if$
}
{ % Not at brace level 0: copy result literally
t s pos #1 substring$ * 't :=
% Check whether we need to increase or decrease brace level.
% Note that this is not sophisticated: it does not capture
% \{, \verb+}+, etc.
s pos #1 substring$ "{" =
{ brace.level #1 + 'brace.level := }
{ s pos #1 substring$ "}" =
{ brace.level #1 - 'brace.level := }
'skip$
if$
}
if$
pos #1 + 'pos :=
}
if$
}
while$
%
pos len =
{ % Last character, copy
t s pos #1 substring$ * 't :=
}
{ % pos = len + 1, so s ends with ". " or ".-"
% This should not have happened, but make the best out of it.
% Push last two characters of s on the stack, i.e., ". " or ".-".
s len #1 - #2 substring$
% Remove "\BPBI " or "\BHBI " from t
t text.length$ 'len := % Length of t (no. of characters)
t #1 len #6 - substring$
% Concatenate and assign to t
swap$ * 't :=
}
if$
%
% Now push the result back on the stack
t
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.initials.with.hyphen}
{ % Format initials.
% Call with
% field authornumber format.initials.with.hyphen
% e.g.
% author #1 format.initials.with.hyphen
% Instead of field, a string may also be used.
%
% First, format initials in the default way, retaining spaces
% and hyphens.
initials.with.space.name.format format.name$
transform.spaces.and.hyphens
}
FUNCTION {format.last.part.name}
{ % Format a name with last.part.name.format,
% as part of more complicated things.
% Call with
% field authornumber format.last.part.name
% e.g.
% author #1 format.last.part.name
% Instead of field, a string may also be used.
last.part.name.format format.name$
}
FUNCTION {format.von.last.junior.name}
{ % Format a name with von.last.junior.name.format,
% for citing or as part of more complicated things.
% Call with
% field authornumber format.von.last.junior.name
% e.g.
% author #1 format.von.last.junior.name
% Instead of field, a string may also be used.
von.last.junior.name.format format.name$
}
FUNCTION {format.von.junior.name}
{ % Format a name with von.last.junior.name.format,
% for citing or as part of more complicated things.
% Call with
% field authornumber format.von.junior.name
% e.g.
% author #1 format.von.junior.name
% Instead of field, a string may also be used.
von.junior.name.format format.name$
}
FUNCTION {format.cite.initials.name}
{ % Format a name for citing with initials.
% Call with
% field authornumber format.cite.initials.name
% e.g.
% author #1 format.cite.initials.name
% Instead of field, a string may also be used.
%
% First, extract the complete name, format it in the canonical form,
% and push on the stack.
one.complete.name.format format.name$
%
% Format the initials and push on the stack.
duplicate$ #1 format.initials.with.hyphen
%
% Format the von-last-junior part and push on the stack.
swap$ #1 format.von.last.junior.name
%
% Connect with "~" hyphen (if they're both non-empty).
"~" connect.check
}
FUNCTION {format.author.name}
{ % Format an author name for the reference list.
% Call with
% field authornumber format.author.name
% e.g.
% author #1 format.author.name
% Instead of field, a string may also be used.
%
% First, extract the complete name, format it in the canonical form,
% and push on the stack.
one.complete.name.format format.name$
%
% Make two copies of the name, format the last name and push on the stack.
duplicate$ duplicate$ #1 format.last.part.name
%
% Format the initials and push on the stack.
swap$ #1 format.initials.with.hyphen
%
% Connect with last name.
connect.with.comma.check
%
% Format the von-junior part and connect with initials.
swap$ #1 format.von.junior.name "" connect.check
}
FUNCTION {format.editor.name}
{ % Format a name for the reference list as an editor.
% Call with
% field authornumber format.editor.name
% e.g.
% author #1 format.editor.name
% Instead of field, a string may also be used.
%
format.cite.initials.name
}
FUNCTION {format.index.name}
{ % Format an author name for the index.
% Call with
% field authornumber format.index.name
% e.g.
% author #1 format.index.name
% Instead of field, a string may also be used.
%
format.author.name
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {comma.between.two} { "\BCBT{}" }
FUNCTION {comma.between.names} { ", " }
FUNCTION {comma.before.last} { "\BCBL{}" }
FUNCTION {and.before.last} { "\ \BBA{} " }
FUNCTION {et.al.string.cite} { "\ \protect\BOthers{.}" }
FUNCTION {et.al.string} { "\ \BOthers{.}" }
FUNCTION {et.al.string.period} { "\ \BOthersPeriod{.}" }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {add.name.index}
{ %
%
make.index
{ "%" * write$ newline$
% Check for corporate author
field is.bibcorporate
{ "\corporateAX{" }
{ "\AX{" }
if$
write$
field nameptr sort.name.format format.name$ sortify write$ newline$
"@" write$
field nameptr format.index.name
"}%" * write$ newline$
}
{ "%" * write$ newline$ }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.name.cite.label}
{ 'field :=
'format.num.names :=
%
field num.names$ 'numnames := % numnames is the total number of names
% contained in field
%
% It is implicit in the APA manual that if "et al." would refer
% to exactly one author, then this author should be named
% instead of "et al."
%
format.num.names numnames #1 - =
{ numnames 'format.num.names := }
'skip$
if$
%
% Format first author: with or without initials
%
#1 'nameptr :=
cite.initials #1 =
{ field nameptr format.cite.initials.name }
{ field nameptr cite.name.format format.name$ }
if$
add.name.index % Add index entry when desired.
%
numnames #1 =
'skip$
{ format.num.names #1 =
{ %
% First author et al.
%
et.al.string.cite write$
}
{ numnames #2 =
{ %
% Given that format.num.names > 1, it is 2.
% Format second author.
%
#2 'nameptr :=
field nameptr cite.name.format format.name$ 's :=
%
% Check if 2nd author is explicit "others".
% If so, insert "et al." string.
%
s "others" =
{ et.al.string.cite write$ } % First et al.
{ %
% First \& Second
%
and.before.last write$
s
add.name.index % Add index entry when desired.
}
if$
}
{ %
% 3 or more names, 2 or more must be cited
%
% for nameptr := 2 to format.num.names - 1 do
%
#2 'nameptr :=
{ nameptr format.num.names < }
{ %
% Put comma between consecutive authors
%
comma.between.names write$
%
% Format and add next author
%
field nameptr cite.name.format format.name$
add.name.index % Add index entry when desired.
%
% Move to next author
%
nameptr #1 + 'nameptr :=
}
while$
%
% nameptr = format.num.names
% Format this author.
%
field nameptr cite.name.format format.name$ 's :=
%
format.num.names numnames =
{ %
% This is also the last author. Add (optional) comma.
%
comma.before.last write$
%
% Check if this author is explicit "others".
% If so, insert "et al." string.
%
s "others" =
{ et.al.string.cite write$ }
{ and.before.last write$
s
add.name.index % Add index entry when desired.
}
if$
}
{ %
% This is not the last author.
% Add comma, author name, and "et al."
%
comma.between.names write$
s
add.name.index % Add index entry when desired.
%
comma.before.last et.al.string.cite * write$
}
if$
}
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.title.cite.label}
{ %
% Formatting: check if formatted as article title or
% as book title, and insert this formatting.
%
is.atype
{ "\APACciteatitle{" }
{ "\APACcitebtitle{" }
if$
%
title empty$
{ text empty$
{ type empty$
{ howpublished empty$
{ note empty$
{ url empty$
{ cite$ }
{ url }
if$
}
{ note }
if$
}
{ howpublished }
if$
}
{ type }
if$
}
{ text }
if$
}
{ title }
if$
%
% Connect with formatting.
%
* "}" *
%
% Write to output
%
write$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.author.editor.cite.label}
{ author empty$
{ editor empty$
{ %
% No author or editor:
% Use title or other description as citation label.
%
make.title.cite.label
"}{%" write$ newline$
make.title.cite.label
}
{ cite.num.names.full editor make.name.cite.label
"}{%" write$ newline$
cite.num.names.short editor make.name.cite.label
}
if$
}
{ cite.num.names.full author make.name.cite.label
"}{%" write$ newline$
cite.num.names.short author make.name.cite.label
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.author.cite.label}
{ author empty$
{ %
% No author:
% Use title or other description as citation label.
%
make.title.cite.label
"}{%" write$ newline$
make.title.cite.label
}
{ cite.num.names.full author make.name.cite.label
"}{%" write$ newline$
cite.num.names.short author make.name.cite.label
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.definitive.year.supplement}
{ %
% Add "a", "b", etc. when necessary.
%
add.to.year #0 =
{ "" }
{ "{\protect"
year empty$
{ "\BCntND" * }
{ year "\bibnodate" =
{ "\BCntND" * }
{ year "\BIP" =
{ "\BCntIP" * }
{ "\BCnt" * }
if$
}
if$
}
if$
"{" * add.to.year int.to.str$ * "}}" *
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {protect.year}
{ year empty$
{ "{\protect\bibnodate{}}" }
{ year "\bibnodate" =
{ "{\protect\bibnodate{}}" }
{ year "\BIP" =
{ "{\protect\BIP{}}" }
{ year }
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.definitive.year.label}
{ "{\protect\APACyear{"
originalyear empty$
{ protect.year }
{ originalyear "\bibnodate" = % date of original publication unknown
{ translator empty$
{ protect.year }
{ year empty$
{ "{\protect\BTRANSL{}~\protect\bibnodate{}}" } % trans. n.d.
{ "{\protect\BTRANSL{}}~" protect.year * } % trans. 1931
if$
}
if$
}
{ year empty$
{ originalyear "/{\protect\bibnodate{}}" * } % 1923/n.d.
{ originalyear year =
{ protect.year }
{ originalyear "/" * protect.year * } % 1923/1961
if$
}
if$
}
if$
}
if$
* "}}%" * write$ newline$
%
% Add "a", "b", etc. when necessary.
%
"{\protect\APACexlab{" "}}"
make.definitive.year.supplement enclose.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {make.cite.labels}
{ newline$
%
% Write a few lines for testing purposes.
%
test
{ "\bibitem[]{} \fullciteA{" cite$ * "}" * write$ newline$
"\bibitem[]{} \citeA{" cite$ * "}" * write$ newline$
}
'skip$
if$
%
"\bibitem[\protect\citeauthoryear{%" write$ newline$
%
% When key or firstkey is available, this takes precedence.
%
firstkey empty$ not
{ %
% Full cite: firstkey.
%
firstkey write$
"}{%" write$ newline$
%
% Short cite: if key is not empty and cite.initials is 0,
% then key, else firstkey.
%
cite.initials #0 =
key empty$ not
and
{ key }
{ firstkey }
if$
write$
}
{ key empty$ not
{ %
% No firstkey, but key available:
% Both full and short labels are key.
%
key write$
"}{%" write$ newline$
key write$
}
{ % No key or firstkey, so find out which field
% to use as author.
%
% Check reference type:
% if result is 1 then possibly editor acts as author
% 2 then editor does not act as author
% 3 then key should have been used
% 0 then unknown reference type
ref.type #2 =
{ make.author.cite.label }
{ make.author.editor.cite.label }
if$
}
if$
}
if$
"}{%" write$ newline$
%
% Make year label that's used for citations
%
make.definitive.year.label write$
"}]{%" write$ newline$
cite$ write$
"}%" write$ newline$
% author.year.sort.label write$ newline$ % for testing purposes
% year.label write$ newline$ % for testing purposes
%
% If the item is used in a meta-analysis, indicate this with
% a star.
%
"\APACinsertmetastar{%" write$ newline$
cite$ write$
"}%" write$ newline$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {editor.postfix}
{ editor num.names$ #1 >
{ "(\BEDS)" }
{ "(\BED)" }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {editor.trans.postfix}
{ editor num.names$ #1 >
{ "(\BEDS{} \BAnd{} \BTRANSS)" }
{ "(\BED{} \BAnd{} \BTRANS)" }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% "(Trans.)" postfix
% translator must not be empty
%
FUNCTION {trans.postfix}
{ translator num.names$ #1 >
{ "(\BTRANSS)" }
{ "(\BTRANS)" }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.author.names}
{ 'field :=
'dot :=
%
field num.names$ 'numnames := % numnames is the total number of names
% contained in field
numnames 'format.num.names := % Format all authors
format.num.names name.max > % Unless this exceeds the maximum of 6.
{ dot
{ name.max 'format.num.names := } % Format 6 authors
{ cite.num.names.full 'format.num.names := } % Format 1 editor
if$
}
'skip$
if$
%
% It is kind of explicit in the APA manual that if "et al." would
% refer to exactly one author (the 7th), then this author should
% still be replaced by "et al.", unlike with citations.
% So format.num.names is not adapted.
%
% Format first author
%
#1 'nameptr :=
field nameptr format.author.name
%
% Add period if required and if this is the only author.
%
numnames #1 =
dot
and
{ add.period$ }
'skip$
if$
add.name.index % Add index entry when desired.
%
numnames #1 =
'skip$
{ format.num.names #1 =
{ %
% First author et al.
%
comma.between.two
%
% Add period if required.
%
dot
{ et.al.string.period * }
{ et.al.string * }
if$
write$
}
{ numnames #2 =
{ %
% Given that format.num.names > 1, it is 2.
%
comma.between.two write$
%
% Format second author.
%
#2 'nameptr :=
field nameptr format.author.name 's :=
%
% Check if 2nd author is explicit "others".
% If so, insert "et al." string.
%
s "others" =
{ %
% First et al.
% Add period if required.
%
dot
{ et.al.string.period }
{ et.al.string }
if$
write$
}
{ %
% First \& Second
%
and.before.last write$
%
% Add period if required.
%
dot
{ s add.period$ }
{ s }
if$
add.name.index % Add index entry when desired.
}
if$
}
{ %
% 3 or more names, 2 or more must be cited
%
% for nameptr := 2 to format.num.names - 1 do
%
#2 'nameptr :=
{ nameptr format.num.names < }
{ %
% Put comma between consecutive authors
%
comma.between.names write$
%
% Format and add next author
%
field nameptr format.author.name
add.name.index % Add index entry when desired.
%
% Move to next author
%
nameptr #1 + 'nameptr :=
}
while$
%
% nameptr = format.num.names
% Format this author.
%
field nameptr format.author.name 's :=
%
format.num.names numnames =
{ %
% This is also the last author. Add (optional) comma.
%
comma.before.last write$
%
% Check if this author is explicit "others".
% If so, insert "et al." string.
%
s "others" =
{ %
% Add period if required.
%
dot
{ et.al.string.period }
{ et.al.string }
if$
write$
}
{ and.before.last write$
%
% Add period if required.
%
dot
{ s add.period$ }
{ s }
if$
add.name.index % Add index entry when desired.
}
if$
}
{ %
% This is not the last author.
% Add comma, author name, and "et al."
%
comma.between.names write$
s
add.name.index % Add index entry when desired.
%
comma.before.last
%
% Add period if required.
%
dot
{ et.al.string.period * }
{ et.al.string * }
if$
write$
}
if$
}
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.authors}
{ #1 author format.author.names
"%" write$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.editors.as.authors}
{ #0 editor format.author.names
"\ " editor.postfix * add.period$ write$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.ed.trans.as.authors}
{ #0 editor format.author.names
"\ " editor.trans.postfix * add.period$ write$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.editor.names}
{ 'field :=
%
field num.names$ 'numnames := % numnames is the total number of names
% contained in field
numnames 'format.num.names := % Format all authors
format.num.names name.max > % Unless this exceeds the maximum of 6.
{ #1 'format.num.names := } % Then it becomes 1 (First et al.)
'skip$
if$
%
% Format first editor
%
field #1 format.editor.name
%
numnames #1 =
'skip$
{ format.num.names #1 =
{ et.al.string * } % First editor et al., no comma.
{ numnames #2 =
{ %
% Given that format.num.names > 1, it is 2.
% No comma. Format second editor.
%
field #2 format.editor.name 's :=
%
% Check if 2nd editor is explicit "others".
% If so, insert "et al." string.
%
s "others" =
{ et.al.string * } % First et al.
{ and.before.last * s * } % First \& Second
if$
}
{ %
% 3 or more names, 2 or more must be cited
%
% for nameptr := 2 to format.num.names - 1 do
%
#2 'nameptr :=
{ nameptr format.num.names < }
{ %
% Put comma between consecutive editors
%
comma.between.names *
%
% Format and add next editor
%
field nameptr format.editor.name *
%
% Move to next editor
%
nameptr #1 + 'nameptr :=
}
while$
%
% nameptr = format.num.names
% Format this editor.
%
field nameptr format.editor.name 's :=
%
format.num.names numnames =
{ %
% This is also the last editor. Add (optional) comma.
%
comma.before.last *
%
% Check if this editor is explicit "others".
% If so, insert "et al." string.
%
s "others" =
{ et.al.string * }
{ and.before.last * s * }
if$
}
{ %
% This is not the last editor.
% Add comma, editor name, and "et al."
%
comma.between.names * s *
comma.before.last * et.al.string *
}
if$
}
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format editors in case editors do not act as authors
% (such as reference to chapter in edited book)
%
% L. W. Poon (Ed.) (1 editor)
% or
% A. S. Gurman \& D. P. Kniskern (Eds.) (2 editors)
% or
% L. Poon, A. Jones, \& D. P. Smith (Eds.) (>2 editors)
%
% editor must not be empty
%
FUNCTION {format.editors.in.line}
{ editor format.editor.names
editor.postfix connect.with.space.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format editors in case editors are also translators
% and do not act as authors
% (such as reference to chapter in edited book
% of translated articles)
%
% L. W. Poon (Ed. and Trans.) (1 editor)
% or
% A. S. Gurman \& D. P. Kniskern (Eds. and Trans.) (2 editors)
% or
% L. Poon, A. Jones, \& D. P. Smith (Eds. and Trans.) (>2 editors)
%
% editor must not be empty
%
FUNCTION {format.editors.trans.in.line}
{ editor format.editor.names
editor.trans.postfix connect.with.space.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format translators in case translators act as editors
% (such as reference to chapter in translated book)
%
% L. W. Poon (Trans.) (1 translator)
% or
% A. S. Gurman \& D. P. Kniskern (Trans.) (2 translators)
% or
% L. Poon, A. Jones, \& D. P. Smith (Trans.) (>2 translators)
%
% translator must not be empty
%
FUNCTION {format.translators.in.line}
{ translator format.editor.names
trans.postfix connect.with.space.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format translators in case translator does not act as editor
% (such as reference to translated book)
%
% L. Solotaroff, Trans.
%
FUNCTION {format.translators.in.paren.check}
{ translator empty$
{ "" }
{ translator format.editor.names
translator num.names$ #1 >
{ ", \BTRANSS{}" * }
{ ", \BTRANS{}" * }
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format editors and translators in case neither act as editor
% (such as reference to edited or translated book with a
% a single author)
%
% L. Solotaroff, Ed.
% L. Solotaroff, Ed. \& Trans.
% L. Solotaroff, Trans.
% L. Solotaroff, Ed. \& S. Prokofieff, Trans.
%
FUNCTION {format.editors.translators.in.paren.check}
{ editor empty$
{ translator empty$
{ "" }
{ translator format.editor.names
translator num.names$ #1 >
{ ", \BTRANSS{}" * }
{ ", \BTRANS{}" * }
if$
}
if$
}
{ editor format.editor.names
editor num.names$ #1 >
{ ", \BEDS{}" * }
{ ", \BED{}" * }
if$
translator empty$
'skip$
{ editor translator =
{ editor num.names$ #1 >
{ " \BAnd{} \BTRANSS" * }
{ " \BAnd{} \BTRANS" * }
if$
}
{ " \BAnd{} " *
translator format.editor.names *
translator num.names$ #1 >
{ ", \BTRANSS{}" * }
{ ", \BTRANS{}" * }
if$
}
if$
}
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% translator of article
%
FUNCTION {format.atrans.check}
{ format.translators.in.paren.check parenthesize.check }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format "In editor (Ed.), "
%
FUNCTION {format.in.editors}
{ "\BIn{} "
editor empty$
'skip$
{ format.editors.in.line * ", " * }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format "In translator (Trans.),"
%
FUNCTION {format.in.trans}
{ "\BIn{} "
translator empty$
'skip$
{ format.translators.in.line * ", " * }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format "In editor (Ed. and Trans.)"
% or "In editor (Ed.)" if editor not equal to translator
%
FUNCTION {format.in.editors.trans}
{ "\BIn{} "
editor empty$
{ translator empty$
'skip$
{ format.translators.in.line * ", " * }
if$
}
{ translator empty$
{ format.editors.in.line * }
{ editor translator =
{ format.editors.trans.in.line * }
{ format.editors.in.line * }
if$
}
if$
", " *
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.year.check}
{ "\APACrefYear{"
year empty$
{ "\bibnodate{}" * }
{ year * }
if$
%
% Add "a", "b", etc. when necessary.
%
make.definitive.year.supplement *
"}" *
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {format.year.month.day.check}
{ "\APACrefYearMonthDay{"
year empty$
{ "\bibnodate{}" * }
{ year * }
if$
%
% Add "a", "b", etc. when necessary.
%
make.definitive.year.supplement *
"}{" *
%
% Add month and day when present.
%
month empty$
'skip$
{ month * }
if$
"}{" *
day empty$
'skip$
{ day * }
if$
"}" *
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title of article in journal or book
% no finishing period
% field must be on top of stack
% (so englishtitle can be handled also)
%
FUNCTION {format.atitle.no.dot}
{ "\BBOQ{}" swap$
"\BBCQ{}" swap$
duplicate$ empty$
'skip$
{ duplicate$
% Two arguments: Title twice: (1) don't change case; (2) change case
"\APACrefatitle{" swap$ * "}{" * swap$
"t" change.case$
* "}" *
}
if$
enclose.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title of article in journal or book
% with finishing period
% field must be on top of stack
% (so englishtitle can be handled also)
%
FUNCTION {format.atitle.dot}
{ "\BBOQ{}" swap$
"\BBCQ{}" swap$
duplicate$ empty$
'skip$
{ duplicate$
% Two arguments: Title twice: (1) don't change case; (2) change case
"\APACrefatitle{" swap$ * "}{" * swap$
"t" change.case$
* "}" * add.period$
}
if$
enclose.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title of article in journal or book
% field must be on top of stack
% second element on stack must be connected:
% if that is empty, then atitle.dot
% else atitle.no.dot, connect, and add period
%
FUNCTION {format.atitle.connect}
{ swap$
duplicate$ empty$
{ pop$
format.atitle.dot
}
{ swap$
format.atitle.no.dot
swap$ connect.with.space.check
add.period$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title of book or so, without period
% call with
% field format.btitle.no.dot
%
FUNCTION {format.btitle.no.dot}
{ duplicate$ empty$
'skip$
{ duplicate$
% Two arguments: Title twice: (1) don't change case; (2) change case
"\APACrefbtitle{" swap$ * "}{" * swap$
"t" change.case$
* "}" *
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title of book or so, with period
% call with
% field format.btitle.dot
%
FUNCTION {format.btitle.dot}
{ duplicate$ empty$
'skip$
{ add.period$ format.btitle.no.dot }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title of book and similar
% field must be on top of stack
% second element on stack must be connected:
% if that is empty, then btitle.dot
% else btitle.no.dot, connect, and add period
%
FUNCTION {format.btitle.connect}
{ swap$
duplicate$ empty$
{ pop$
format.btitle.dot
}
{ swap$
format.btitle.no.dot
swap$ connect.with.space.check
add.period$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title of book and similar
% field must be on top of stack
% second element on stack must be connected
%
FUNCTION {format.btitle.connect.no.dot}
{ swap$
duplicate$ empty$
{ pop$
format.btitle.no.dot
}
{ swap$
format.btitle.no.dot
swap$ connect.with.space.check
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format englishtitle (of nonenglish article, etc.)
%
FUNCTION {format.aetitle.check}
{ englishtitle empty$
{ "" }
{ % Two arguments: Title twice: (1) don't change case; (2) change case
"\APACrefaetitle{" englishtitle * "}{" *
englishtitle "t" change.case$ * "}" *
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format englishtitle (of nonenglish book, etc.)
%
FUNCTION {format.betitle.check}
{ englishtitle empty$
{ "" }
{ % Two arguments: Title twice: (1) don't change case; (2) change case
"\APACrefbetitle{" englishtitle * "}{" *
englishtitle "t" change.case$ * "}" *
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format type (of article, etc.)
%
FUNCTION {format.atype.check}
{ type bracket.check }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format title and englishtitle (of article, etc.)
%
FUNCTION {format.atitle.check}
{ format.aetitle.check
title format.atitle.connect
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format title, englishtitle, and type
% (of article, etc.)
%
FUNCTION {format.atitle.type.check}
{ format.aetitle.check
format.atype.check connect.with.space.check
title format.atitle.connect
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format title, englishtitle,
% and translator (of article, etc.)
%
FUNCTION {format.atitle.trans.check}
{ format.aetitle.check
format.atrans.check connect.with.space.check
title format.atitle.connect
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format title, englishtitle, type,
% and translator (of article, etc.)
%
FUNCTION {format.atitle.type.trans.check}
{ format.aetitle.check
format.atype.check connect.with.space.check
format.atrans.check connect.with.space.check
title format.atitle.connect
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format journal, volume, number and pages
% call with
% formatted.pages format.journal.vol.num.pages.check
%
FUNCTION { format.journal.vol.num.pages.check }
{ "journal" journal warning.if.empty
duplicate$ empty$
journal empty$ and
volume empty$ and
number empty$ and
{ pop$ "" }
{ "\APACjournalVolNumPages{" journal "" connect.check
"}{" * volume "" connect.check
"}{" * number "" connect.check
"}{" * swap$ "" connect.check
"}" *
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% volume of book, checks whether
% "Volume" or "Volumes"
%
% call with
% field format.bvolume.check
%
FUNCTION {format.bvolume.check}
{ duplicate$ empty$
'skip$
{ duplicate$ multi.result.check
{ "\BVOLS" swap$ tie.or.space.connect }
{ "\BVOL" swap$ tie.or.space.connect }
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% edition of book, must not be empty
% call with
% field format.edition.check
%
FUNCTION {format.edition.check}
{ duplicate$ empty$
'skip$
{ "\PrintOrdinal{" swap$ * "}" *
"\BEd" connect.with.space.check
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% volume and edition of book
%
FUNCTION {format.bvol.edition.check}
{ edition format.edition.check
volume format.bvolume.check
connect.with.comma.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% volume and edition of book
%
FUNCTION {format.bvol.edition}
{ format.bvol.edition.check
parenthesize.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% volume and edition and translator of translated book
%
FUNCTION {format.bvol.edition.trans}
{ format.bvol.edition.check
format.translators.in.paren.check connect.with.semicolon.check
parenthesize.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% volume, edition, editor, and translator of (translated) book
%
FUNCTION {format.bvol.edition.editor.trans}
{ format.bvol.edition.check
format.editors.translators.in.paren.check connect.with.semicolon.check
parenthesize.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% formats pages by first checking if 1 or more pages
% and prefixing pages with "p." or "pp." (these strings
% are given in the commands \BPG and \BPGS, respectively),
% whichever is applicable, and do a tie or space connect
%
% call with
% field format.bpages.check
%
FUNCTION {format.bpages.check}
{ duplicate$ empty$
'skip$
{ duplicate$ multi.result.check
{ "\BPGS" swap$ tie.or.space.connect }
{ "\BPG~" swap$ * }
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% formats chapters by first checking if 1 or more chapters
% and prefixing pages with "chap." (this string
% is given in the commands \BCHAP and \BCHAPS, respectively),
% whichever is applicable, and do a tie or space connect
%
% call with
% field format.bchapter.check
%
FUNCTION {format.bchapter.check}
{ duplicate$ empty$
'skip$
{ duplicate$ multi.result.check
{ "\BCHAPS" swap$ tie.or.space.connect }
{ "\BCHAP" swap$ tie.or.space.connect }
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% volume, edition, and pages or chapter of article in book etc.
%
FUNCTION {format.bvol.edition.pages}
{ format.bvol.edition.check
pages empty$
{ chapter format.bchapter.check connect.with.comma.check }
{ pages format.bpages.check connect.with.comma.check }
if$
parenthesize.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title, volume, edition of book
%
FUNCTION {format.btitle.vol.edition}
{ format.betitle.check
format.bvol.edition connect.with.space.check
title format.btitle.connect.no.dot
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title, volume, edition, and translator of book
%
FUNCTION {format.btitle.vol.edition.trans}
{ format.betitle.check
format.bvol.edition.trans connect.with.space.check
title format.btitle.connect.no.dot
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title, volume, edition, editor, and translator of book
%
FUNCTION {format.btitle.vol.edition.editor.trans}
{ format.betitle.check
format.bvol.edition.editor.trans connect.with.space.check
title format.btitle.connect.no.dot
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format address and publisher of book etc.
%
% New York: Wiley
% or
% Wiley (if address empty)
% or
% New York (if publisher empty)
%
FUNCTION {format.address.publisher}
{ %
% If publisher = author or publisher = "author" or publisher = "Author"
% then hand over the final choice how to format this to \LaTeX.
% (I could imagine similar code for editors, but the APA manual does
% not mention it and then we'd have to check whether the editor is in
% the author position, so let's keep it simple until someone complains.)
%
author empty$
publisher empty$ or
{ publisher "\APACaddressPublisher{" }
{ author publisher =
"author" publisher = or
"Author" publisher = or
{ author "\APACaddressPublisherEqAuth{" }
{ publisher "\APACaddressPublisher{" }
if$
}
if$
address "" connect.check "}{" *
% Recover publisher that was pushed onto the stack previously.
swap$ "" connect.check "}" *
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format address and publisher of book etc.
%
% New York: Wiley
% or
% Wiley (if address empty)
% or
% New York (if publisher empty)
%
% warning if no publisher or no address
%
FUNCTION {format.address.publisher.check}
{ "publisher" publisher warning.if.empty
"address" address warning.if.empty
publisher empty$
address empty$
and
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.address.publisher
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format number as in reports: No. 2017
% call with
% field format.rnumber.check
%
FUNCTION {format.rnumber.check}
{ duplicate$ empty$
'skip$
{ duplicate$ multi.result.check
{ "\BNUMS" swap$ tie.or.space.connect }
{ "\BNUM" swap$ tie.or.space.connect }
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format type and number of a standalone item
% call with
% format.type.number
%
FUNCTION { format.type.number }
{ type empty$
{ type.2 }
{ type }
if$
number empty$
{ bracket.check }
{ number format.rnumber.check connect.with.space.check
parenthesize.check
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format howpublished if not empty,
% for various entry types
% call with
% format.howpublished
%
FUNCTION {format.howpublished}
{ howpublished empty$
'skip$
{ % clear the stack
duplicate$ empty$
'pop$
{ output.dot.new.block }
if$
"\APAChowpublished{" howpublished * "}" *
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format howpublished if not empty,
% for misc
% call with
% output.howpublished
%
FUNCTION {output.howpublished}
{ howpublished empty$
'skip$
{ "\APAChowpublished{" howpublished * "}" *
output.dot.new.block
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% begin and end of url environment
%
FUNCTION {begin.end.url.env}
{ " \begin{APACrefURL} "
% For "Retrieved <date>, from"
lastchecked empty$
'skip$
{ "[{" * lastchecked * "}]" * }
if$
" \end{APACrefURL} "
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% begin and end of message environment
%
FUNCTION {begin.end.msg.env}
{ " \begin{APACrefURLmsg} "
" \end{APACrefURLmsg} "
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format url given that it is not empty,
% for various entry types
% call with
% format.url
%
FUNCTION {format.url}
{ % First format begin and end of the enclosing environment.
% With posted messages, a different environment is used.
type.2 empty$
{ begin.end.url.env }
{ type.2 "\bibmessage" =
{ begin.end.msg.env }
{ begin.end.url.env }
if$
}
if$
% The url string.
"\url{" url * "}" *
% Enclose in begin and end environment
enclose.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format optional note
%
FUNCTION {format.note}
{ "\APACrefnote{" "}" note enclose.check }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format original year of publication and note
% (reprint or translation)
%
FUNCTION {format.orig.year.note}
{ originalyear empty$
{ format.note }
{ "\APACorigyearnote{"
originalyear "" connect.check "}{" *
note "" connect.check "}" *
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format original journal of publication and note
% (reprint or translation)
%
FUNCTION {format.orig.journal.note}
{ "\APACorigjournalnote{"
originalyear "" connect.check "}{" *
originaljournal "" connect.check "}{" *
originalvolume "" connect.check "}{" *
originalnumber "" connect.check "}{" *
originalpages "" connect.check "}{" *
note "" connect.check "}" *
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format original book of publication and note
% (reprint or translation)
%
FUNCTION {format.orig.book.note}
{ "\APACorigbooknote{" originalyear "" connect.check "}{" *
%
originaleditor empty$
'skip$
{ originaleditor num.names$ #1 >
{ "\APACorigEDS{" * originaleditor format.editor.names * "}" * }
{ "\APACorigED{" * originaleditor format.editor.names * "}" * }
if$
}
if$
%
"}{" *
originalbooktitle format.btitle.no.dot "" connect.check "}{" *
originaledition format.edition.check "" connect.check "}{" *
originalvolume format.bvolume.check "" connect.check "}{" *
originalpages format.bpages.check "" connect.check "}{" *
originaladdress "" connect.check "}{" *
originalpublisher "" connect.check "}{" *
note "" connect.check "}" *
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format information about original publication of reprint
% and format optional note
%
FUNCTION {format.orig.note}
{ originaljournal empty$
{ originalbooktitle empty$
{ note empty$
{ originalyear empty$
'skip$
{ originalyear "\bibnodate" =
'skip$
{ output.new.block
format.orig.year.note
}
if$
}
if$
}
{ output.new.block
format.orig.year.note
}
if$
}
{ output.new.block
format.orig.book.note
}
if$
}
{ output.new.block
format.orig.journal.note
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% article in periodical: journal, magazine, newspaper, ...
%
% call with
% formatted.pages formatted.date periodical
%
FUNCTION {periodical}
{ %
% author or editor, year, title, englishtitle, type
%
author empty$
%
% no author: possibly special issue with editors as authors
% (APA manual, ex. 11, p. 121)
%
{ editor empty$
%
% no author or editor: title serves as author.
% title formatted as article title (APA manual not consistent in this,
% compare statement on p. 119: ``treat as book title'' and
% example 8, p. 121: no underlining => article title)
%
{ format.atitle.type.trans.check output.new.block
%
% now formatted date on top of stack
%
output.dot.new.block
}
%
% format editor and year, and check if year is present
% format article title and check if title or type present
%
{ format.editors.as.authors start.new.block
%
% now formatted date on top of stack
%
output.dot.new.block
format.atitle.type.trans.check output.new.block
}
if$
}
%
% format author and year, and check if year is present
% format article title and check if title or type present
%
{ format.authors start.new.block
%
% now formatted date on top of stack
%
output.dot.new.block
format.atitle.type.trans.check output.new.block
}
if$
%
% format journal name, volume and issue number, and pages
% and check if journal not empty
%
format.journal.vol.num.pages.check
%
% if not empty, insert howpublished.
% (used if article is retrieved from the internet)
%
format.howpublished add.period$
%
% format url
%
url empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.url
}
if$
%
% possible reprint and optional note
%
format.orig.note
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% journal article
%
FUNCTION {article}
{ pages format.year.month.day.check periodical }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% magazine article
%
FUNCTION {magazine}
{ pages format.year.month.day.check periodical }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% newspaper article
%
FUNCTION {newspaper}
{ pages format.bpages.check format.year.month.day.check periodical }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% (translation of) entire book
%
FUNCTION {book}
{ %
% author or editor,
% year, title, englishtitle, translator
%
author empty$
%
% no author: possibly edited book with editors as authors
%
{ editor empty$
%
% no author or editor: title serves as author.
% title formatted as book title
%
{ format.btitle.vol.edition.trans
format.type.number connect.with.space.check
output.dot.new.block
format.year.check add.period$
}
%
% format editor and year, and check if year is present
% format booktitle, volume, and edition and check if title present
%
{ translator empty$
{ format.editors.as.authors start.new.block
format.year.check output.dot.new.block
format.btitle.vol.edition
}
%
% format translator correctly
%
{ translator editor =
not
{ format.editors.as.authors start.new.block
format.year.check output.dot.new.block
format.btitle.vol.edition.trans
}
{ format.ed.trans.as.authors start.new.block
format.year.check output.dot.new.block
format.btitle.vol.edition
}
if$
}
if$
format.type.number connect.with.space.check
add.period$
}
if$
}
%
% format author and year, and check if year is present
% format booktitle, volume, and edition and check if title present
%
{ format.authors start.new.block
format.year.check output.dot.new.block
format.btitle.vol.edition.editor.trans
format.type.number connect.with.space.check
add.period$
}
if$
%
% format address and publisher, check if address and publisher present
%
format.address.publisher.check
%
% if not empty, insert howpublished.
% (used if book is retrieved from the internet)
%
format.howpublished add.period$
%
% format url
%
url empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.url
}
if$
%
% format original publication (of reprint/translation)
% and optional note
%
format.orig.note
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% (translated) article or chapter in edited book
%
FUNCTION {incollection}
{ author empty$
%
% no author: title serves as author.
% title formatted as article title (APA manual not consistent in this,
% compare statement on p. 119: ``treat as book title'' and
% example 8, p. 121: no underlining => article title)
%
{ editor.ne.trans
{ format.atitle.type.trans.check }
{ format.atitle.type.check }
if$
output.new.block
%
% format month and day as well when available
% esp. for ``collections'' that are not books,
% such as parts of internet documents
%
format.year.month.day.check add.period$
}
%
% format author and year, and check if year is present
% format article title and check if title or type present
%
{ format.authors start.new.block
format.year.month.day.check output.dot.new.block
editor.ne.trans
{ format.atitle.type.trans.check }
{ format.atitle.type.check }
if$
}
if$
%
% format "In " editor " (Ed. \& Trans.), "
% booktitle, volume, edition, pages
%
output.new.block
format.in.editors.trans
format.bvol.edition.pages
booktitle format.btitle.connect * add.period$
%
% format address and publisher, check if publisher present
%
format.address.publisher.check
%
% if not empty, insert howpublished.
% (used if article is retrieved from the internet)
%
format.howpublished add.period$
%
% format url
%
url empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.url
}
if$
%
% format original publication (of reprint/translation)
% and optional note
%
format.orig.note
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% technical report number
%
FUNCTION {format.tr.number}
{ type empty$
{ "\BTR{}" }
{ type "\bibnotype" =
{ "" }
{ type }
if$
}
if$
number format.rnumber.check connect.with.space.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title, volume, edition, report number
%
FUNCTION {format.tr.title.number}
{ format.betitle.check
% Single out the situation in which there is no number
% and type = {\bibnotype}, i.e., no type as well.
% (Why not use book then?)
type empty$
{ % Now, we're in the regular situation with at least a
% number, a type, a volume, or an edition.
"\APACbVolEdTR{" format.bvol.edition.check * "}{" *
format.tr.number * "}" *
}
{ type "\bibnotype" =
number empty$
volume empty$
edition empty$
and
and
and
{ "" }
{ % Now, we're in the regular situation with at least a
% number, a type, a volume, or an edition.
"\APACbVolEdTR{" format.bvol.edition.check * "}{" *
format.tr.number * "}" *
}
if$
}
if$
connect.with.space.check
title format.btitle.connect
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% format address and institution of reports etc.
%
% Washington, DC: National Institute of Education
% or
% National Institute of Education (if address empty)
%
% warning if no institution
%
FUNCTION {format.address.institution.check}
{ "institution" institution warning.if.empty
"address" address warning.if.empty
institution empty$
address empty$
and
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
%
% If institution = author or institution = "author"
% or institution = "Author" then hand over the final choice how to
% format this to \LaTeX. See also format.address.publisher
%
author empty$
institution empty$ or
{ institution "\APACaddressInstitution{" }
{ author institution =
"author" institution = or
"Author" institution = or
{ author "\APACaddressInstitutionEqAuth{" }
{ institution "\APACaddressInstitution{" }
if$
}
if$
address "" connect.check "}{" *
% Recover institution that was pushed onto the stack previously.
swap$ "" connect.check "}" *
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% reports
%
FUNCTION {techreport}
{ author empty$
%
% no author: possibly edited report with editors as authors
%
{ editor empty$
%
% no author or editor: title serves as author.
% title formatted as book title
%
{ format.tr.title.number output.dot.new.block
format.year.month.day.check add.period$
}
%
% format editor and year, and check if year is present
% format report title and check if title present
% format volume, edition, type, and number
%
{ format.editors.as.authors start.new.block
format.year.month.day.check output.dot.new.block
format.tr.title.number add.period$
}
if$
}
%
% format author and year, and check if year is present
% format report title and check if title present
% format volume, edition, type, and number
%
{ format.authors start.new.block
format.year.month.day.check output.dot.new.block
format.tr.title.number add.period$
}
if$
%
% format address and institution, check if institution present
%
format.address.institution.check
%
% if not empty, insert howpublished.
% (used if report is retrieved from the internet)
%
format.howpublished add.period$
%
% format url
%
url empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.url
}
if$
%
% format optional note
%
note empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.note
}
if$
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% (translated) article or chapter in report
%
FUNCTION {intechreport}
{ author empty$
%
% no author: title serves as author.
% title formatted as article title (APA manual not consistent in this,
% compare statement on p. 119: ``treat as book title'' and
% example 8, p. 121: no underlining => article title)
%
{ editor.ne.trans
{ format.atitle.trans.check }
{ format.atitle.check }
if$
output.new.block
format.year.month.day.check output.dot.new.block
}
%
% format author and year, and check if year is present
% format article title and check if title or type present
%
{ format.authors start.new.block
format.year.month.day.check output.dot.new.block
editor.ne.trans
{ format.atitle.trans.check }
{ format.atitle.check }
if$
output.new.block
}
if$
%
% format "In " editor " (Ed. \& Trans.), "
% booktitle, volume, edition, pages
%
format.in.editors.trans
%
% volume, edition, report type and number, pages
%
"\APACbVolEdTRpgs{" format.bvol.edition.check * "}{" *
format.tr.number *
"}{" * pages format.bpages.check *
"}" *
%
booktitle format.btitle.connect *
add.period$
%
% format address and publisher, check if publisher present
%
format.address.institution.check
%
% if not empty, insert howpublished.
% (used if report is retrieved from the internet)
%
format.howpublished add.period$
%
% format url
%
url empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.url
}
if$
%
% format original publication (of reprint/translation)
% and optional note
%
format.orig.note
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% papers presented at conferences etc.
%
FUNCTION {lecture}
{ author empty$
{ "author" author warning.if.empty }
{ format.authors start.new.block }
if$
%
% format year, month, and day, and check if year present
% format title and check if title present
% format howpublished and check if howpublished present
%
format.year.month.day.check output.dot.new.block
symposium empty$
{ format.betitle.check
title format.btitle.connect output.new.block
howpublished empty$
{ "symposium and howpublished missing in " cite$ * warning$
""
}
{ "\APAChowpublished{" howpublished * "}" * }
if$
address connect.with.comma.check
}
{ format.atitle.type.check output.new.block
"\BIn{} "
chair empty$
'skip$
{ chair format.editor.names
chair num.names$ #1 >
{ "(\BCHAIRS)" }
{ "(\BCHAIR)" }
if$
connect.with.space.check * ", " *
}
if$
symposium format.btitle.no.dot *
format.howpublished
address connect.with.comma.check
}
if$
add.period$
%
% format url
%
url empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.url
}
if$
%
% format optional note
%
note empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.note
}
if$
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% default thesis type is on top of stack
% now, if type field is empty, this default is used
% else default is removed and replaced by value of
% type field
%
FUNCTION {format.type.school}
{ type empty$
'skip$
{ pop$
type "t" change.case$
}
if$
school connect.with.comma.check
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% phd theses, etc.
% call with
% "default.published.thesis" "default.unpublished.thesis" thesis
%
FUNCTION {thesis}
{ author empty$
{ "author" author warning.if.empty }
{ format.authors start.new.block }
if$
%
% format year and check if year present
%
format.year.check output.dot.new.block
%
% format title and check if title present
% journal empty => unpublished PhD thesis
% journal not empty => published (e.g., Dissertation Abstracts Int.)
%
journal empty$
{ format.btitle.vol.edition output.dot.new.block
%
% pop default unpublished thesis, top is default published thesis
%
swap$ pop$
format.type.school
address connect.with.comma.check
}
%
% pop default published thesis, top is default unpublished thesis
%
{ pop$
type empty$
school empty$
originalyear empty$
and
and
{ pop$
""
}
{ format.type.school
originalyear connect.with.comma.check
parenthesize.check
}
if$
format.aetitle.check
swap$ connect.with.space.check
"title" title warning.if.empty
title format.atitle.connect output.new.block
pages format.journal.vol.num.pages.check
}
if$
%
% if not empty, insert howpublished.
% (used if thesis is retrieved from the internet)
%
format.howpublished add.period$
%
% format url
%
url empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.url
}
if$
%
% format optional note
%
note empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.note
}
if$
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% phd theses, etc.
%
FUNCTION {phdthesis}
{ "\BPhD" "\BUPhD" thesis }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% master's theses, etc.
%
FUNCTION {mastersthesis}
{ "\BMTh" "\BUMTh" thesis }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title of something (used in unpublished and misc)
% english translation of title
% type and number of something
%
FUNCTION {format.btitle.type.num}
{ format.betitle.check
format.bvol.edition connect.with.space.check
format.type.number
connect.with.space.check
title empty$
{ add.period$ }
{ title format.btitle.connect }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title of message or software-related thing (used in misc)
% english translation of title
% type and number of something
%
FUNCTION {format.mtitle.type.num}
{ format.aetitle.check
format.bvol.edition connect.with.space.check
type.2 "\bibmessage" =
{ number empty$
'skip$
{ type.2 number tie.or.space.connect
bracket.check
connect.with.space.check
}
if$
}
{ format.type.number
connect.with.space.check
}
if$
title empty$
{ add.period$ }
{ title format.atitle.connect }
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% title, english translation of title,
% type and number of something (used in misc)
%
FUNCTION {output.misctitle.type.num}
{ type.2 empty$
{ format.btitle.type.num }
{ type.2 "\bibmessage" =
type.2 "\bibcomputerprogram" = or
type.2 "\bibcomputerprogrammanual" = or
type.2 "\bibcomputerprogramandmanual" = or
type.2 "\bibcomputersoftware" = or
type.2 "\bibcomputersoftwaremanual" = or
type.2 "\bibcomputersoftwareandmanual" = or
type.2 "\bibprogramminglanguage" = or
{ format.mtitle.type.num }
{ format.btitle.type.num }
if$
}
if$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% unpublished manuscripts, etc.
%
FUNCTION {unpublished}
{ check.relevant.fields
author empty$
%
% no author: possibly edited book with editors as authors
%
{ editor empty$
%
% no author or editor: title serves as author.
% title formatted as book title
%
{ format.btitle.type.num output.new.block
format.year.month.day.check add.period$
}
%
% format editor and year, and check if year is present
% format book title, volume, and edition and check if title present
%
{ format.editors.as.authors start.new.block
format.year.month.day.check output.dot.new.block
format.btitle.type.num
}
if$
}
%
% format author and year, and check if year is present
% format book title, volume, and edition
% and check if title or type present
%
{ format.authors start.new.block
format.year.month.day.check output.dot.new.block
format.btitle.type.num
}
if$
howpublished empty$
organization empty$ and
address empty$ and
'skip$
{ output.new.block
"\APAChowpublished{" "}" howpublished enclose.check
organization connect.with.comma.check
address connect.with.comma.check
add.period$
}
if$
%
% format url
%
url empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.url
}
if$
%
% format optional note
%
note empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.note
}
if$
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% nonprint media and other things that don't fit
%
FUNCTION {misc}
{ %
% To handle @manual: use type.2 instead of type.
type.2 empty$
type empty$ not and
{ type 'type.2 := }
'skip$
if$
%
author empty$
%
% no author: possibly edited item with editors as authors
%
{ editor empty$
%
% no author or editor: title/type serves as author.
% title formatted as book title
%
% if no title and no type, howpublished is title
%
{ title empty$
type.2 empty$ and
{ howpublished empty$
{ "No author, editor, title, type, and howpublished in "
cite$ * warning$
""
}
{ "\APAChowpublished{" howpublished * "}" * add.period$ }
if$
format.year.month.day.check add.period$
}
{ output.misctitle.type.num output.new.block
format.year.month.day.check add.period$
format.howpublished add.period$
}
if$
}
%
% format editor and year, and check if year is present
% format book title, volume, and edition and check if title present
%
{ format.editors.as.authors start.new.block
format.year.month.day.check output.dot.new.block
output.misctitle.type.num
format.howpublished add.period$
}
if$
}
%
% format author and year, and check if year is present
% format book title, volume, and edition
% and check if title or type present
%
{ format.authors start.new.block
format.year.month.day.check output.dot.new.block
output.misctitle.type.num
format.howpublished add.period$
}
if$
%
address empty$
publisher empty$ and
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.address.publisher add.period$
}
if$
%
% format url
%
url empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.url
}
if$
%
% format optional note
%
note empty$
'skip$
{ % Clear the stack
duplicate$ empty$
'skip$
{ output.new.block }
if$
format.note
}
if$
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% for legal cases and other cases that need to be
% done by hand
%
FUNCTION {literal}
{ "key" key warning.if.empty
"text" text warning.if.empty
text empty$
{ "" }
{ text }
if$
fin.entry
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% technical documentation
%
FUNCTION {manual}
{ %
% If type is empty, assume that it is a computer software manual.
%
type empty$
{ "\bibcomputersoftwaremanual" 'type.2 := }
'skip$
if$
misc
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% following functions not used for APA Manual examples
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% booklet
%
FUNCTION {booklet}
{ misc }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% part of a book
%
FUNCTION {inbook}
{ incollection }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% article in proceedings
%
FUNCTION {inproceedings}
{ incollection }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% article in proceedings (Kopka & Daly, 2004, p. 230)
%
FUNCTION {conference}
{ inproceedings }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% proceedings
%
FUNCTION {proceedings}
{ misc }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% unknown types
%
FUNCTION {default.type}
{ misc }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {initialize}
{ %
% Maximum number of names to be formatted .
#6 'name.max :=
}
FUNCTION {init.old.number}
{ %
% For numbering the entries according to current sorting order.
#0 'old.number :=
}
FUNCTION {init.old.label}
{ %
% For comparing labels across entries .
"zzzzzz" 'old.label :=
}
FUNCTION {init.cite.initials.add.to.year}
{ %
% Initialize "cite initials" indicator for all entries.
#0 'cite.initials :=
%
% Initialize "add to year", i.e., whether a, b, etc. must
% be added to the year in citation, to "no".
#0 'add.to.year :=
%
}
FUNCTION {move.forward}
{ %
% Indicates that we're moving forward (ITERATE) through the entry list .
#1 'forward :=
}
FUNCTION {move.backward}
{ %
% Indicates that we're moving backward (REVERSE) through the entry list .
#0 'forward :=
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {begin.bib}
{ preamble$ empty$
'skip$
{ preamble$ write$ newline$ }
if$
"\begin{thebibliography}{}" write$ newline$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {end.bib}
{ newline$
"\end{thebibliography}" write$ newline$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
FUNCTION {write.bbl.entry}
{ %
% Output \bibitem and \citeauthoryear command.
%
make.cite.labels
%
% Format and output reference list entry.
%
call.type$
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
READ
EXECUTE { identify.apacite.version }
EXECUTE { initialize }
ITERATE { make.sort.title }
SORT
EXECUTE { init.old.number }
EXECUTE { init.old.label }
ITERATE { make.title.number }
ITERATE { make.tentative.sort.label }
SORT
ITERATE { init.cite.initials.add.to.year }
EXECUTE { init.initials }
ITERATE { check.add.initials }
EXECUTE { init.initials }
REVERSE { check.add.initials }
ITERATE { tentative.cite.num.names }
EXECUTE { init.cite.num.names }
EXECUTE { move.forward }
ITERATE { definitive.cite.num.names }
EXECUTE { init.cite.num.names }
EXECUTE { move.backward }
REVERSE { definitive.cite.num.names }
ITERATE { make.final.sort.key }
SORT
EXECUTE { begin.bib }
ITERATE { write.bbl.entry }
EXECUTE { end.bib }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%%
%% End of file `apacite.bst'.