phy-4660/feedback/papers/1701.07030/mnras.bst

1831 lines
42 KiB
Plaintext
Raw Normal View History

2017-04-26 18:50:37 +00:00
%%+
%% Name:
%% mnras.bst
%% Purpose:
%% BibTeX Bibliography style file for MNRAS
%% Invocation:
%% latex <latexfile>
%% bibtex <latexfile>
%% latex <latexfile>
%% latex <latexfile>
%% Description:
%% Provides a bibliography style that will allow bibtex to be
%% used when writing papers for MNRAS. This allows references
%% to be inserted automatically.
%% Notes:
%% This file should be used in conjunction with the Monthly Notices
%% LaTeX2e class file (mnras.cls).
%%
%% Hyperlinks:
%% To make the eprint and doi bibtex fields hyperlinks, you need
%% to have \usepackage{hyperref} in your latex preamble.
%% Authors:
%% John P. Sleath (MRAO)
%% Tim Jenness (MRAO/JAC)
%% Norman Gray (Glasgow University) <norman@astro.gla.ac.uk>
%% Oren Patashnik
%% Susan King
%% Sake J. Hogeveen
%% Philip Hall
%% Simeon Bird
%% Bugs:
%% The formatting has been compared to the MN style, and is
%% believed to be compatible with it. However this comparison has
%% (for obvious reasons) been done most carefully for articles, so
%% there may be deviations from it for other entry types.
%% History:
%% 1988 (Oren Patashnik and Susan King)
%% Apalike.bst derived from the "alpha.bst" style.
%% 1990 (Sake J. Hogeveen)
%% Astron.bst derived from apalike.bst
%% Summer 1995 (JPS/TJ):
%% Extensively modified from astron.bst
%% 19 Jul 1995 (JPS/TJ):
%% First release (version 1.1b)
%% 02 May 2001 (NG):
%% Limit the author lists to eight people.
%% 19 Jun 2001 (TJ):
%% Fix inproceedings
%% 30 Oct 2001 (NG):
%% Adjust author-limiting to conform to MN style (version 1.2)
%% 22 Sep 2012 (Philip Hall):
%% Remove comma before et al when many authors.
%% 01 July 2013 (Simeon Bird):
%% Ported Antony Lewis' hyperlinked arxiv entry additions across.
%% Originally modified for hyperlinked arxiv eprints by Antony Lewis April 2006
%% August 2013 (NG):
%% Fixed a/b/c... year suffixes -- these now appear in the
%% correct order.
%% February 2014 (TJ):
%% Add MACROs for MN journal abbreviations
%% May 2014 (NG):
%% Shorten some functions, so that bibtex's 'single function
%% space' parameter doesn't have to be above 100.
%% Sep 2014 (Jared M. Gabor):
%% Enabled ArXiv e-print identifier to be printed for articles that
%% are pre-prints only (and have "ArXiv e-print" in the journal field).
%% Still some problems with the use of commas. Only 1 comma will appear
%% between the year and "arXiv..." for such preprints, but for e.g.
%% conference precedings there may be no comma at all.
%% 09 March 2015 (TJ):
%% At the request of Keith Smith this file has been renamed to be mnras.bst
%% to match the new naming convention for the MNRAS class file.
%%
%% License:
%% This work 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.
%%
%% This work has the LPPL maintenance status `maintained'.
%%
%% The Current Maintainers of this work are T. Jenness
%% and Norman Gray <norman@astro.gla.ac.uk>
%%
%% This work consists of the file mnras.bst
%% This file is maintained on Github: https://github.com/timj/mn2e-bst/
%%-
ENTRY
{ address
doi
eprint
archiveprefix % used by ADS
author
booktitle
chapter
edition
editor
howpublished
institution
journal
key
% month not used in apalike
note
number
organization
pages
publisher
school
series
title
type
volume
year
adsurl % for MN style
url
}
{}
{ label extra.label sort.label presort.key }
INTEGERS { output.state before.all mid.sentence after.sentence after.block }
FUNCTION {init.state.consts}
{ #0 'before.all :=
#1 'mid.sentence :=
#2 'after.sentence :=
#3 'after.block :=
}
% If threeauthorvar is set to #1 in initialise.mn2e, then the bibitem for a
% three-author reference is generated using a \mniiiauthor command.
% This command should be defined in the .cls file as follows:
%
% \def\mniiiauthor#1#2#3{%
% \@ifundefined{mniiiauth@#1}
% {\global\expandafter\let\csname mniiiauth@#1\endcsname\null #2}
% {#3}}
%
% The effect of this is that the first time that \mniiiauthor{X}{a}{b}
% is evaluated, it expands to 'a', and it thereafter expands to 'b'.
% This implements the MN style guide stipulation that "For three
% authors, give all three names at first mention, e.g. (Brown, Jones &
% Smith 1994), but use first author et al. (in roman, not italic)
% thereafter, e.g. (Brown et al. 1994)."
%
% The above definition consumes a command for each such author. It's
% surely possible to avoid this (with some constructions involving
% {\\#1}; see Appendix D cleverness), but that would verge on the
% arcane, and not be really worth it.
INTEGERS { maxauthors threeauthorvar }
FUNCTION {initialise.mn2e}
{
#8 'maxauthors :=
#0 'threeauthorvar :=
}
STRINGS { s t fmt sep }
FUNCTION {output.nonnull}
{ 's :=
output.state mid.sentence =
{ ", " * write$ }
{ output.state after.block =
{ ". " * write$
newline$
% "\newblock " write$
}
{ output.state before.all =
'write$
{ ", " * write$ }
if$
}
if$
mid.sentence 'output.state :=
}
if$
s
}
% output.nonnull.extra is like output.nonnull, except that the thing
% we output is 'extra' to a block, so if we're in the after.block
% state, we append it rather than starting a new block.
FUNCTION {output.nonnull.extra}
{ 's :=
output.state mid.sentence =
{ ", " * write$ }
{ output.state after.block =
{ ", " * write$
newline$
"\newblock " write$
}
{ output.state before.all =
'write$
{ ", " * write$ }
if$
}
if$
mid.sentence 'output.state :=
}
if$
s
}
FUNCTION {output.nonnull.nocomma}
{'s :=
output.state mid.sentence =
{ write$ }
{ output.state after.block =
{ ". " * write$
newline$
% "\newblock " write$
}
{ output.state before.all =
'write$
{ ", " * write$ }
if$
}
if$
mid.sentence 'output.state :=
}
if$
s
}
FUNCTION {output}
{ duplicate$ empty$
'pop$
'output.nonnull
if$
}
FUNCTION {output.extra}
{ duplicate$ empty$
'pop$
'output.nonnull.extra
if$
}
FUNCTION {output.check}
{ 't :=
duplicate$ empty$
{ pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull
if$
}
FUNCTION {output.check.nocomma}
{ 't :=
duplicate$ empty$
'pop$ % or warn with { pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull.nocomma
if$
}
FUNCTION {output.check.extra}
{ 't :=
duplicate$ empty$
{ pop$ "empty " t * " in " * cite$ * warning$ }
'output.nonnull.extra
if$
}
FUNCTION {output.year.check}
{ year empty$
{ "empty year in " cite$ * warning$ }
{ write$
" " year * extra.label *
mid.sentence 'output.state :=
}
if$
}
FUNCTION {output.bibitem}
{ newline$
"\bibitem[" write$
label write$
"]{" write$
cite$ write$
"}" write$
% debugging: define eg \def\logsortkey#1{{[\tiny #1]}} to see this
%"\logsortkey{" presort.key * "/" * sort.key$ * "}" * write$
newline$
""
before.all 'output.state :=
}
FUNCTION {fin.entry}
{ write$
newline$
}
FUNCTION {new.block}
{ output.state before.all =
'skip$
{ after.block 'output.state := }
if$
}
FUNCTION {new.sentence}
{ output.state after.block =
'skip$
{ output.state before.all =
'skip$
{ after.sentence 'output.state := }
if$
}
if$
}
FUNCTION {not}
{ { #0 }
{ #1 }
if$
}
FUNCTION {and}
{ 'skip$
{ pop$ #0 }
if$
}
FUNCTION {or}
{ { pop$ #1 }
'skip$
if$
}
FUNCTION {new.block.checkb}
{ empty$
swap$ empty$
and
'skip$
'new.block
if$
}
FUNCTION {field.or.null}
{ duplicate$ empty$
{ pop$ "" }
'skip$
if$
}
FUNCTION {boldface}
{ duplicate$ empty$
{ pop$ "" }
{ "{ " swap$ * "}" * }
if$
}
FUNCTION {emphasize}
{ duplicate$ empty$
{ pop$ "" }
{ "{ " swap$ * "}" * }
if$
}
% Make hyperref links.
% The LaTeX hyperref package supports a macro \href{URL}{text}
%
% On call, the stack contains
% href-url
% link-text
FUNCTION {make.href.hyperref}
{
"\href {" swap$ * "} {" * swap$ * "}" *
}
INTEGERS { nameptr namesleft numnames }
% Helper functions for print.all.names: print the last or 'others' name.
%
% On call, the stack contains
% a formatted name,
% and the built-up string of names so far.
FUNCTION {print.all.names.plain.trailer}
{ duplicate$ "others" =
{ pop$ " et~al.," * }
{ " " swap$ * * }
if$
}
% as above
FUNCTION {print.all.names.label.trailer}
{ duplicate$ "others" =
{ pop$ " et~al." * }
{ " \& " swap$ * * }
if$
}
% Print out the complete author list
% (because we have maxauthors or fewer).
%
% On call, the stack contains
% a format string (for format.name$),
% a name-separator string (such as ", "),
% an author or editor field,
% and one of the 'trailer' functions above.
FUNCTION {print.all.names}
{ 'fmt :=
'sep :=
's :=
s num.names$ 'namesleft :=
namesleft #2 < % we're not going to need the trailer function, so discard it
'pop$
'skip$
if$
#1 'nameptr :=
{ namesleft #0 > }
{ s nameptr fmt format.name$ 't := % last name first
nameptr #1 >
{ namesleft #1 >
{ sep * t * }
{ % namesleft == 1: this is the last name.
% Invoke the trailer function.
s num.names$ #2 > % _why_ do we add this extra space for long lists?
{ " " * }
'skip$
if$
% This next line is a bit clever.
%
% We start with a stack
% string containing the list of names so far
% trailer function
%
% Rearrange the stack so that we have
% 'skip
% trailer function
% #1
% t
% names so far
% then call if$. This is a rather indirect way of
% invoking the trailer function on the stack
% t
% names so far
%
% Ta dahhhh!
swap$ t swap$ #1 swap$ 'skip$ if$
}
if$
}
't
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
% Name formatting. According to the MN instructions for authors, `In
% the references list [...] List all authors if eight or fewer,
% otherwise et al.'. This means (according to a ruling from the MN
% editors) that if there are eight or more authors, they should be
% listed as "first one plus et al."
%
% On call, the stack contains
% an author or editor field.
FUNCTION {format.names}
{ duplicate$ num.names$ maxauthors >
{ % Too many authors -- format as First author et al.
#1 "{vv }{ll}{ jj}{ f., }" format.name$ % last name first
" et~al.," *
}
{ 'print.all.names.plain.trailer swap$ " " "{vv }{ll}{ jj}{ f., }" print.all.names }
if$
}
% Format an author/editor field, for inclusion in a label
% (ie, "Surname, Surname \& Surname")
%
% On call, the stack contains an author/editor field.
FUNCTION {format.names.label}
{ duplicate$ num.names$ maxauthors >
{ % Too many authors -- format as First author et al.
#1 "{vv }{ll}{ jj}" format.name$ % last name first
" et~al.," *
}
{ 'print.all.names.label.trailer swap$ ", " "{vv }{ll}" print.all.names }
if$
}
FUNCTION {format.authors}
{ author empty$
{ "" }
{ author format.names }
if$
}
FUNCTION {format.key} % this function is just for apalike
{ empty$
{ key field.or.null }
{ "" }
if$
}
FUNCTION {format.editors}
{ editor empty$
{ "" }
{ editor format.names
editor num.names$ #1 >
{ " eds," * }
{ " ed." * }
if$
}
if$
}
FUNCTION {format.editors.extra}
{ editor empty$
{ "" }
{ editor format.names
editor num.names$ #1 >
{ " eds" * }
{ " ed." * }
if$
}
if$
}
FUNCTION {format.title}
{ title empty$
{ "" }
{ title "t" change.case$ }
if$
}
FUNCTION {format.eprint}
{ eprint empty$
{ "" }
{ " (\mn@eprint {"
archiveprefix empty$
{ "" }
{ archiveprefix }
if$
* "} {" * eprint * "})" * }
if$
}
FUNCTION {format.doi}
{ doi empty$
{ "" }
{ ", \mn@doi{" * doi * "}" }
if$
}
FUNCTION {n.dashify}
{ 't :=
""
{ t empty$ not }
{ t #1 #1 substring$ "-" =
{ t #1 #2 substring$ "--" = not
{ "--" *
t #2 global.max$ substring$ 't :=
}
{ { t #1 #1 substring$ "-" = }
{ "-" *
t #2 global.max$ substring$ 't :=
}
while$
}
if$
}
{ t #1 #1 substring$ *
t #2 global.max$ substring$ 't :=
}
if$
}
while$
}
FUNCTION {first.page.number}
{ 't :=
""
{ t "" =
{ #0 }
{ t #1 #1 substring$ "-" = not }
if$
}
{ t #1 #1 substring$ *
t #2 global.max$ substring$ 't :=
}
while$
}
FUNCTION {format.btitle}
{ title
}
FUNCTION {tie.or.space.connect}
{ duplicate$ text.length$ #5 <
{ "~" }
{ " " }
if$
swap$ * *
}
FUNCTION {either.or.check}
{ empty$
'pop$
{ "can't use both " swap$ * " fields in " * cite$ * warning$ }
if$
}
FUNCTION {format.bvolume}
{ volume empty$
{ "" }
{ "" series tie.or.space.connect
volume empty$
'skip$
{ " Vol. " * volume * }
if$
"volume and number" number either.or.check
}
if$
}
FUNCTION {format.number.series}
{ volume empty$
{ number empty$
{ series field.or.null }
{ output.state mid.sentence =
{ "No." }
{ "No." }
if$
number tie.or.space.connect
series empty$
{ "there's a number but no series in " cite$ * warning$ }
{ " in " * series * }
if$
}
if$
}
{ "" }
if$
}
FUNCTION {format.edition}
{ edition empty$
{ "" }
{ output.state mid.sentence =
{ edition "l" change.case$ " edn" * }
{ edition "t" change.case$ " edn" * }
if$
}
if$
}
INTEGERS { multiresult }
FUNCTION {multi.page.check}
{ 't :=
#0 'multiresult :=
{ multiresult not
t empty$ not
and
}
{ t #1 #1 substring$
duplicate$ "-" =
swap$ duplicate$ "," =
swap$ "+" =
or or
{ #1 'multiresult := }
{ t #2 global.max$ substring$ 't := }
if$
}
while$
multiresult
}
FUNCTION {format.pages}
{ pages empty$
{ "" }
{ pages multi.page.check
{ "pp" pages n.dashify tie.or.space.connect }
{ "p." pages tie.or.space.connect }
if$
}
if$
}
FUNCTION {format.page}
{ pages empty$
{ "" }
{ "p.~" pages first.page.number * }
if$
}
% If a paper is available as a preprint only, ADS will call the
% journal "ArXiv e-print". In this case MN suggests the journal
% should be called "preprint".
FUNCTION {format.journal.doi}
{ doi empty$
{ journal "ArXiv e-prints" =
{ "preprint" }
{ journal }
if$
}
{ journal "ArXiv e-prints" =
{ "preprint" }
{ "\mn@doi [" journal * "] {" * doi * "}" * }
if$
}
if$
}
FUNCTION {format.vol.num.pages}
{ volume field.or.null
number empty$
'skip$
{ "(" number * ")" * *
volume empty$
{ "there's a number but no volume in " cite$ * warning$ }
'skip$
if$
}
if$
pages empty$
'skip$
{ duplicate$ empty$
{ pop$ format.pages }
{ ", " * pages n.dashify * }
if$
}
if$
}
FUNCTION {format.vol.page}
{ volume field.or.null
pages empty$
'skip$
{ duplicate$ empty$
{ pop$ format.pages }
{ ", " * pages first.page.number * }
if$
}
if$
}
FUNCTION {format.vol.num.page}
{ volume field.or.null
number empty$
'skip$
{ "(" number * ")" * *
volume empty$
{ "there's a number but no volume in " cite$ * warning$ }
'skip$
if$
}
if$
pages empty$
'skip$
{ duplicate$ empty$
{ pop$ format.pages }
{ ", " * pages first.page.number * }
if$
}
if$
}
FUNCTION {format.chapter.pages}
{ chapter empty$
'format.pages
{ type empty$
{ "Chapt." }
{ type "l" change.case$ }
if$
chapter tie.or.space.connect
pages empty$
'skip$
{ ", " * format.pages * }
if$
}
if$
}
FUNCTION {format.in.ed.booktitle}
{ booktitle empty$
{ "" }
{ editor empty$
{ "in " booktitle * }
{ format.bvolume empty$
{ "in " format.editors.extra * ", " * booktitle * }
{ "in " format.editors.extra * ", " * format.bvolume * ", " * booktitle * }
if$
}
if$
}
if$
}
FUNCTION {format.in.ed.collect}
{ booktitle empty$
{ "" }
{ editor empty$
{ "in " }
{ "in " format.editors.extra * ", " * }
if$
series empty$
{ skip$ }
{ series * }
if$
volume empty$
{ number empty$
{ }
{ output.state mid.sentence =
{ "No." }
{ "No." }
if$
number tie.or.space.connect *
}
if$
}
{
output.state mid.sentence =
{ ", " * }
{ skip$ }
if$
"Vol." volume tie.or.space.connect *
}
if$
output.state mid.sentence =
{ ", " * }
{ skip$ }
if$
booktitle *
}
if$
}
FUNCTION {format.thesis.type}
{ type empty$
'skip$
{ pop$
type "t" change.case$
}
if$
}
% the \url{} macro is supplied by hyperref
FUNCTION {format.url}
{
url empty$
{ "" }
{ "\url {" url * "}" * }
if$
}
FUNCTION {format.tr.number}
{
type empty$
{ "Technical Report" }
{ type }
if$
number empty$
{ "t" change.case$ }
{ number tie.or.space.connect }
if$
}
FUNCTION {format.article.crossref}
{ "in" % this is for apalike
" \cite{" * crossref * "}" *
}
FUNCTION {format.book.crossref}
{ volume empty$
{ "empty volume in " cite$ * "'s crossref of " * crossref * warning$
"in "
}
{ "Vol." volume tie.or.space.connect
" of " *
}
if$
"\cite{" * crossref * "}" * % this is for apalike
}
FUNCTION {format.incoll.inproc.crossref}
{ "in" % this is for apalike
" \cite{" * crossref * "}" *
}
FUNCTION {article}
{ output.bibitem
format.authors "author" output.check
author format.key output % special for
output.year.check % apalike
% MN style does not display eprints or DOIs on published articles,
% but does link the journal name to any available DOI.
crossref missing$
{ format.journal.doi "journal" output.check.extra
% ...and links volume and page information to any available adsurl
adsurl empty$
{ format.vol.page }
{ format.vol.page adsurl make.href.hyperref }
if$
output.extra
}
{ format.article.crossref output.nonnull
format.page output
}
if$
% If the "journal" field is the arXiv, then print out the arXiv identifier
journal "ArXiv e-prints" =
{ format.eprint "eprint" output.check.nocomma }
{ }
if$
fin.entry
}
FUNCTION {book}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check
editor format.key output
}
{ format.authors output.nonnull
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
output.year.check % special for apalike
format.btitle "title" output.check
format.edition output
new.block
crossref missing$
{ format.bvolume output
format.number.series output
new.sentence
publisher "publisher" output.check
address output
}
{format.book.crossref output.nonnull}
if$
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {booklet}
{ output.bibitem
format.authors output
author format.key output % special for
output.year.check % apalike
format.btitle "title" output.check
howpublished output
address output
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {inbook}
{ output.bibitem
author empty$
{ format.editors "author and editor" output.check
editor format.key output
}
{ format.authors output.nonnull
crossref missing$
{ "author and editor" editor either.or.check }
'skip$
if$
}
if$
output.year.check % special for apalike
format.btitle "title" output.check
format.edition output
new.block
crossref missing$
{
new.sentence
publisher "publisher" output.check
address output
format.pages output
}
{ format.chapter.pages "chapter and pages" output.check
format.book.crossref output.nonnull
}
if$
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {incollection}
{ output.bibitem
format.authors "author" output.check
author format.key output % special for
output.year.check % apalike
crossref missing$
{
format.in.ed.collect "booktitle" output.check
format.edition output
booktitle empty$ edition empty$ =
{ } { new.block } if$
new.sentence
publisher "publisher" output.check
address output
}
{ format.incoll.inproc.crossref output.nonnull
format.chapter.pages output
}
if$
format.chapter.pages output
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {inproceedings}
{ output.bibitem
format.authors "author" output.check
author format.key output % special for
output.year.check % apalike
crossref missing$
{
format.in.ed.booktitle "booktitle" output.check
". " *
% format.bvolume output
before.all 'output.state :=
new.block
% format.title "title" output.check
format.number.series output
new.block
% organization output
publisher output
address output
format.pages output
}
{ format.incoll.inproc.crossref output.nonnull
format.pages output
}
if$
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {conference} { inproceedings }
FUNCTION {manual}
{ output.bibitem
format.authors output
author format.key output % special for
output.year.check % apalike
format.btitle "title" output.check
new.block
organization address new.block.checkb
organization output
address output
format.edition output
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {mastersthesis}
{ output.bibitem
format.authors "author" output.check
author format.key output % special for
output.year.check % apalike
"Master's thesis" format.thesis.type output.nonnull
school "school" output.check
address output
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {misc}
{ output.bibitem
format.authors output
author format.key output % special for apalike
output.year.check
format.btitle output
howpublished output
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {phdthesis}
{ output.bibitem
format.authors "author" output.check
author format.key output % special for
output.year.check % apalike
"PhD thesis" format.thesis.type output.nonnull
school "school" output.check
address output
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {proceedings}
{ output.bibitem
format.editors output
editor format.key output % special for
mid.sentence 'output.state :=
output.year.check % apalike
format.btitle "title" output.check
" " *
before.all 'output.state :=
% new.block
format.bvolume output
format.number.series output
new.block
% organization output % a nonempty organization
publisher output
address output
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {techreport}
{ output.bibitem
format.authors "author" output.check
author format.key output % special for
output.year.check % apalike
format.tr.number output.nonnull
format.btitle "title" output.check
format.url output
new.block
institution "institution" output.check
address output
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {unpublished}
{ output.bibitem
format.authors "author" output.check
author format.key output % special for
output.year.check % apalike
format.btitle "title" output.check
note "note" output.check
% the following are presumably redundant for 'unpublished'
format.eprint "eprint" output.check.nocomma
format.doi "doi" output.check.nocomma
format.url output
fin.entry
}
FUNCTION {default.type} { misc }
MACRO {jan} {"Jan."}
MACRO {feb} {"Feb."}
MACRO {mar} {"Mar."}
MACRO {apr} {"Apr."}
MACRO {may} {"May"}
MACRO {jun} {"June"}
MACRO {jul} {"July"}
MACRO {aug} {"Aug."}
MACRO {sep} {"Sept."}
MACRO {oct} {"Oct."}
MACRO {nov} {"Nov."}
MACRO {dec} {"Dec."}
%% Journal macros for bib files. Should be kept synchronized with
%% the entries in the class file.
%% Astronomy and Astrophysics
MACRO {aap} {"A\&A"}
%% Astronomy and Astrophysics
MACRO {astap} {"A\&A"}
%% Astronomy and Astrophysics Review (the)
MACRO {aapr} {"A\&ARv"}
%% Astronomy and Astrophysics Supplement Series
MACRO {aaps} {"A\&AS"}
%% Acta Astronomica
MACRO {actaa} {"Acta Astron."}
%% Astrofizika
MACRO {afz} {"Afz"}
%% Astronomical Journal (the)
MACRO {aj} {"AJ"}
%% Applied Optics
MACRO {ao} {"Appl. Opt."}
%% Applied Optics
MACRO {applopt} {"Appl. Opt."}
%% Astrophysics Letters
MACRO {aplett} {"Astrophys.~Lett."}
%% Astrophysical Journal
MACRO {apj} {"ApJ"}
%% Astrophysical Journal, Letters
MACRO {apjl} {"ApJ"}
%% Astrophysical Journal, Letters
MACRO {apjlett} {"ApJ"}
%% Astrophysical Journal, Supplement
MACRO {apjs} {"ApJS"}
%% Astrophysical Journal, Supplement
MACRO {apjsupp} {"ApJS"}
%% Astrophysics and Space Science
MACRO {apss} {"Ap\&SS"}
%% Annual Review of Astronomy and Astrophysics
MACRO {araa} {"ARA\&A"}
%% Astronomicheskii Zhurnal
MACRO {azh} {"Azh"}
%% Bulletin of the American Astronomical Society
MACRO {baas} {"BAAS"}
%% Bulletin of the Astronomical Institutes of Czechoslovakia
MACRO {bac} {"Bull. Astron. Inst. Czechoslovakia"}
%% Bulletin Astronomical Institute of the Netherlands
MACRO {bain} {"Bull. Astron. Inst. Netherlands"}
%% Chinese Astronomy and Astrophysics
MACRO {caa} {"Chinese Astron. Astrophys."}
%% Chinese Journal of Astronomy and Astrophysics
MACRO {cjaa} {"Chinese J.~Astron. Astrophys."}
%% Fundamentals of Cosmic Physics
MACRO {fcp} {"Fundamentals Cosmic Phys."}
%% Geochimica Cosmochimica Acta
MACRO {gca} {"Geochimica Cosmochimica Acta"}
%% Geophysics Research Letters
MACRO {grl} {"Geophys. Res. Lett."}
%% IAU Cirulars
MACRO {iaucirc} {"IAU~Circ."}
%% Icarus
MACRO {icarus} {"Icarus"}
%% Journal of Astrophysics and Astronomy
MACRO {japa} {"J.~Astrophys. Astron."}
%% Journal of Cosmology and Astroparticle Physics
MACRO {jcap} {"J.~Cosmology Astropart. Phys."}
%% Journal of Chemical Physics
MACRO {jcp} {"J.~Chem.~Phys."}
%% Journal of Geophysics Research
MACRO {jgr} {"J.~Geophys.~Res."}
%% Journal of Quantitiative Spectroscopy and Radiative Transfer
MACRO {jqsrt} {"J.~Quant. Spectrosc. Radiative Transfer"}
%% Journal of the RAS of Canada
MACRO {jrasc} {"J.~R.~Astron. Soc. Canada"}
%% Memoirs of the RAS
MACRO {memras} {"Mem.~RAS"}
%% Memoire della Societa Astronomica Italiana
MACRO {memsai} {"Mem. Soc. Astron. Italiana"}
%% Monthly Notes of the Astronomical Society of Southern Africa
MACRO {mnassa} {"MNASSA"}
%% Monthly Notices of the Royal Astronomical Society
MACRO {mnras} {"MNRAS"}
%% New Astronomy
MACRO {na} {"New~Astron."}
%% New Astronomy Review
MACRO {nar} {"New~Astron.~Rev."}
%% Nature
MACRO {nat} {"Nature"}
%% Nuclear Physics A
MACRO {nphysa} {"Nuclear Phys.~A"}
%% Physical Review A: General Physics
MACRO {pra} {"Phys. Rev.~A"}
%% Physical Review B: Solid State
MACRO {prb} {"Phys. Rev.~B"}
%% Physical Review C
MACRO {prc} {"Phys. Rev.~C"}
%% Physical Review D
MACRO {prd} {"Phys. Rev.~D"}
%% Physical Review E
MACRO {pre} {"Phys. Rev.~E"}
%% Physical Review Letters
MACRO {prl} {"Phys. Rev.~Lett."}
%% Publications of the Astronomical Society of Australia
MACRO {pasa} {"PASA"}
%% Publications of the Astronomical Society of the Pacific
MACRO {pasp} {"PASP"}
%% Publications of the Astronomical Society of Japan
MACRO {pasj} {"PASJ"}
%% Physics Reports
MACRO {physrep} {"Phys.~Rep."}
%% Physica Scripta
MACRO {physscr} {"Phys.~Scr."}
%% Planetary Space Science
MACRO {planss} {"Planet. Space~Sci."}
%% Proceedings of the Society of Photo-Optical Instrumentation Engineers
MACRO {procspie} {"Proc.~SPIE"}
%% Revista Mexicana de Astronomia y Astrofisica
MACRO {rmxaa} {"Rev. Mex. Astron. Astrofis."}
%% Quarterly Journal of the RAS
MACRO {qjras} {"QJRAS"}
%% Science
MACRO {sci} {"Science"}
%% Sky and Telescope
MACRO {skytel} {"Sky \& Telesc."}
%% Solar Physics
MACRO {solphys} {"Sol.~Phys."}
%% Soviet Astronomy (aka Astronomy Reports)
MACRO {sovast} {"Soviet~Ast."}
%% Space Science Reviews
MACRO {ssr} {"Space Sci. Rev."}
%% Zeitschrift fuer Astrophysik
MACRO {zap} {"Z.~Astrophys."}
%% Astronomical Society of the Pacific Conference Series
MACRO {aspconf} {"ASP Conf. Ser."}
%% Astronomische Nachrichten
MACRO {astnach} {"Astron. Nachr."}
%% Astronomy & Computing
MACRO {astcomp} {"Astron. Comput."}
READ
FUNCTION {sortify}
{ purify$
"l" change.case$
}
INTEGERS { len }
FUNCTION {chop.word}
{ 's :=
'len :=
s #1 len substring$ =
{ s len #1 + global.max$ substring$ }
's
if$
}
% There are three apalike cases: one person (Jones),
% two (Jones and de~Bruijn), and more (Jones et~al.).
% This function is much like format.crossref.editors.
%
% The goal here is to be compatible with the MN style prescription that:
% If there are several references with the same first author,
% arrange in the following order:
% firstly single-author papers (by date);
% then two-author papers (alphabetically by co-author, then by date);
% then multi-author papers (by date).
% We deem 'Jones and others' to be a multi-author paper, in this sense,
% so that it sorts, by date, with the three-or-more author papers.
% An alternative is to deem 'Jones and others' to sort just after the single-author papers
% (this case isn't really covered by the above rules, but this position looks sensible);
% we can get that by putting extra spaces before the 'et~al.', as noted below.
% Note: we can't put arbitrary characters here, to force the order,
% because the result of this function appears as the citation label in the typeset result.
FUNCTION {format.lab.names}
{ 's :=
s #1 "{vv~}{ll}" format.name$
s num.names$ duplicate$
#2 >
{ pop$ " et~al." * }
{ #2 <
'skip$
{ s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
{ " et~al." * } % <-----+-- alternate sortings
%{ " et~al." * } % <--+
{ " \& " * s #2 "{vv~}{ll}" format.name$ * }
if$
}
if$
}
if$
}
% Format names in full
%
FUNCTION {format.lab.names.full}
{ 's :=
s #1 "{vv~}{ll}" format.name$
s num.names$ duplicate$
#2 <
'skip$
{ s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" =
'skip$
{ " \& " * s #2 "{vv~}{ll}" format.name$ * }
if$
}
if$
}
FUNCTION {author.key.label}
{ author empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key % apalike uses the whole key
if$
}
{ author format.lab.names }
if$
}
FUNCTION {author.editor.key.label}
{ author empty$
{ editor empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key % apalike uses the whole key
if$
}
{ editor format.lab.names }
if$
}
{ author format.lab.names }
if$
}
FUNCTION {author.editor.key.label.full}
{ author empty$
{ editor empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key
if$
}
{ editor format.names.label }
if$
}
{ author format.names.label }
if$
}
FUNCTION {editor.key.label}
{ editor empty$
{ key empty$
{ cite$ #1 #3 substring$ }
'key % apalike uses the whole key, no organization
if$
}
{ editor format.lab.names }
if$
}
% Calculate the 'label' for the entry, which is used for sorting.
% Note that this does not include the a/b/c... for disambiguating
% years (that's added later, in forward.pass).
FUNCTION {calc.label}
{ % Define t: this is the 'full' set of names
type$ "book" =
type$ "inbook" =
or
'author.editor.key.label.full
{ type$ "proceedings" =
{ editor format.names.label }
{ author format.names.label }
if$
}
if$
't :=
% Define s: this is the 'shortened' set of names, with 'et al.',
% which are to appear in citations
type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.label % apalike ignores organization
'author.key.label % for labeling and sorting
if$
}
if$
's :=
% the '\protect... is for apalike
"\protect\citeauthoryear{" t * "}{" *
threeauthorvar
numnames #3 =
and
{ "\protect\mniiiauthor{" cite$ * "}{" *
t * "}{" * s * "}" * }
{ s }
if$
*
"}{" *
year field.or.null purify$ #-1 #4 substring$ % use all four digits
*
% the matching closing "}" comes in at the reverse.pass
'label :=
}
FUNCTION {sort.format.names}
{ 's :=
#1 'nameptr :=
""
s num.names$ 'numnames :=
numnames 'namesleft :=
{ namesleft #0 > }
{ nameptr #1 >
{ " " * }
'skip$
if$ % apalike uses initials
s nameptr "{vv{ } }{ll{ }}{ f{ }}{ jj{ }}" format.name$ 't := % <= here
"Mc" t #2 text.prefix$ =
{ "mac" t #3 t text.length$ substring$ * 't := }
'skip$
if$
nameptr numnames = t "others" = and
{ " et~al." * }
{ t sortify * }
if$
nameptr #1 + 'nameptr :=
namesleft #1 - 'namesleft :=
}
while$
}
FUNCTION {sort.format.title}
{ 't :=
"A " #2
"An " #3
"The " #4 t chop.word
chop.word
chop.word
sortify
#1 global.max$ substring$
}
FUNCTION {author.sort}
{ author empty$
{ key empty$
{ "to sort, need author or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {author.editor.sort}
{ author empty$
{ editor empty$
{ key empty$
{ "to sort, need author, editor, or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ editor sort.format.names }
if$
}
{ author sort.format.names }
if$
}
FUNCTION {editor.sort}
{ editor empty$
{ key empty$
{ "to sort, need editor or key in " cite$ * warning$
""
}
{ key sortify }
if$
}
{ editor sort.format.names }
if$
}
% Format numbers (eg volume, number, pages) into a fixed-width string,
% for sorting.
FUNCTION {number.for.presort}
{ field.or.null
duplicate$ text.length$ 'len :=
""
{ #5 len > }
{ "0" *
len #1 + 'len := }
while$
swap$ *
}
% apalike uses two sorting passes; the first one sets the
% labels so that the `a's, `b's, etc. can be computed;
% the second pass puts the references in "correct" order.
% The presort function is for the first pass. It computes
% presort.key, sort.label, and sort.key$
FUNCTION {presort}
{ calc.label
type$ "book" =
type$ "inbook" =
or
'author.editor.key.label
{ type$ "proceedings" =
'editor.key.label % apalike ignores organization
'author.key.label % for labeling and sorting
if$
}
if$
purify$ % remove {braces} round names, to avoid confusing sorting
" "
*
year number.for.presort *
#1 entry.max$ substring$
'presort.key :=
presort.key
" "
*
% Style apalike prefers 'title field.or.null sort.format.title *' here.
% We don't, because we will predominantly be sorting articles in
% this style, and we don't include their titles in the final bibliography.
volume number.for.presort *
number number.for.presort *
pages empty$
{ "0" }
{ pages first.page.number }
if$
number.for.presort *
#1 entry.max$ substring$
'sort.key$ :=
sort.key$ 'sort.label :=
}
EXECUTE {initialise.mn2e}
ITERATE {presort}
SORT % by label, sort.label, title---for final label calculation
% Manage the construction of the 'extra' labels for references. These
% are the a/b/c/... year suffixes which distinguish different
% publications by the same author.
%
% These apalike labels are only for the text; the 'label' does not
% appear in the bibiliography, so that the 'longest.label' variable is
% unnecessary in this style.
STRINGS { last.key next.extra }
INTEGERS { last.extra.num }
FUNCTION {initialize.extra.label.stuff}
{ #0 int.to.chr$ 'last.key :=
"" 'next.extra :=
#0 'last.extra.num :=
}
% By the time that this function is iterated over, the entries have
% had presort.key assigned, and have been presorted. However these labels
% do not (by design) respect the presence of multiple entries in the
% same year, so that there are duplicates. Detect successive
% duplicates, and add an extra a/b/c... suffix.
%
% At the end of this forward.pass, each entry with a duplicate presort.key
% will have an extra.label, starting with 'b' for the first duplicate,
% 'c' for the second, and so on. That is, only the first
% soon-to-be-discovered-to-be-duplicate label will not have an
% extra.label.
FUNCTION {forward.pass}
{ last.key presort.key =
{ last.extra.num #1 + 'last.extra.num :=
last.extra.num int.to.chr$ 'extra.label :=
}
{ % first time we've seen this key
"a" chr.to.int$ 'last.extra.num :=
"" 'extra.label :=
presort.key 'last.key :=
}
if$
}
% Work back through the labels. If, on this pass we discover that the
% next entry in the sequence (which is the last entry processed in
% this reverse pass) had an extra.label of 'b', then this tells us
% that _this_ entry should have an extra.label of 'a', which we were
% unable to detect in the forward.pass above.
%
% We also close the brace pair {...} opened in calc.label
FUNCTION {reverse.pass}
{ next.extra "b" =
{ "a" 'extra.label := }
'skip$
if$
label extra.label * "}" * 'label :=
extra.label 'next.extra :=
}
EXECUTE {initialize.extra.label.stuff}
ITERATE {forward.pass}
REVERSE {reverse.pass}
% Now that the label is right we sort for real. We sort on sort.label
% then year then title. Since sort.label starts with presort.key,
% this sorting is compatible with the letter suffixes added to years.
%
% This is for the second sorting pass.
FUNCTION {bib.sort.order}
{ sort.label
" "
*
year field.or.null sortify
*
" "
*
title field.or.null
sort.format.title
*
#1 entry.max$ substring$
'sort.key$ :=
}
ITERATE {bib.sort.order}
SORT % by sort.label, year, title---giving final bibliography order
FUNCTION {begin.bib}
{
preamble$ empty$ % no \etalchar in apalike
'skip$
{ preamble$ write$ newline$ }
if$
"\begin{thebibliography}{}" write$ newline$ % no labels in apalike
"\makeatletter" write$ newline$
% The following is the contents of mnras-insert.sty, minus comments and whitespace.
% DO NOT EDIT THIS TEXT,
% but instead make mnras-insert.txt, and paste the results in here.
"\relax" write$ newline$
"\def\mn@urlcharsother{\let\do\@makeother \do\$\do\&\do\#\do\^\do\_\do\%\do\~}" write$ newline$
"\def\mn@doi{\begingroup\mn@urlcharsother \@ifnextchar [ {\mn@doi@} {\mn@doi@[]}}" write$ newline$
"\def\mn@doi@[#1]#2{\def\@tempa{#1}\ifx\@tempa\@empty \href {http://dx.doi.org/#2} {doi:#2}\else \href {http://dx.doi.org/#2} {#1}\fi \endgroup}" write$ newline$
"\def\mn@eprint#1#2{\mn@eprint@#1:#2::\@nil}" write$ newline$
"\def\mn@eprint@arXiv#1{\href {http://arxiv.org/abs/#1} {{\tt arXiv:#1}}}" write$ newline$
"\def\mn@eprint@dblp#1{\href {http://dblp.uni-trier.de/rec/bibtex/#1.xml} {dblp:#1}}" write$ newline$
"\def\mn@eprint@#1:#2:#3:#4\@nil{\def\@tempa {#1}\def\@tempb {#2}\def\@tempc {#3}\ifx \@tempc \@empty \let \@tempc \@tempb \let \@tempb \@tempa \fi \ifx \@tempb \@empty \def\@tempb {arXiv}\fi \@ifundefined {mn@eprint@\@tempb}{\@tempb:\@tempc}{\expandafter \expandafter \csname mn@eprint@\@tempb\endcsname \expandafter{\@tempc}}}" write$ newline$
}
EXECUTE {begin.bib}
EXECUTE {init.state.consts}
ITERATE {call.type$}
FUNCTION {end.bib}
{ newline$
"\makeatother" write$ newline$
"\end{thebibliography}" write$ newline$
}
EXECUTE {end.bib}