%%+ %% Name: %% mnras.bst %% Purpose: %% BibTeX Bibliography style file for MNRAS %% Invocation: %% latex %% bibtex %% latex %% latex %% 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) %% 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 %% %% 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}