-% BibTeX standard bibliography style `plain'
+% $Id: mlastyle.bst,v 1.13 2003-11-22 19:15:11 tpope Exp $
+% BibTeX bibliography style `mlastyle'
+% Based on BibTeX standard bibliography style `plain'
% version 0.99a for BibTeX versions 0.99a or later, LaTeX version 2.09.
- % Copyright (C) 1985, all rights reserved.
+ % Copyright (C) 2003 Tim Pope, all rights reserved.
% Copying of this file is authorized only if either
% (1) you make absolutely no changes to your copy, including name, or
% (2) if you do make changes, you name it something other than
% btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst.
% This restriction helps ensure that all standard styles are identical.
- % The file btxbst.doc has the documentation for this style.
+ % The file mlastyle.dvi has the documentation for this style.
ENTRY
{ address
year
% New fields
url
+ urldate
accessdate
urlpath
version
{ author.duplicate author.shared }
{ label }
-INTEGERS { output.state before.all mid.sentence after.sentence after.block after.title author.different author.last author.flast citen.used url.used }
+INTEGERS { output.state before.all mid.sentence after.sentence after.block after.title author.different author.last author.flast citealp.used url.used }
+
+STRINGS { s t u empty.title }
% Rearranged such that true values require capital letters
FUNCTION {init.consts}
#2 'author.flast :=
%#3 'author.firstlast :=
- #0 'citen.used :=
+ #0 'citealp.used :=
#0 'url.used :=
+ " \ \ \ \ \unskip\unskip\unskip\unskip\unskip " 'empty.title :=
+ "" 'empty.title :=
+}
+
+FUNCTION {not}
+{ { #0 }
+ { #1 }
+ if$
}
-STRINGS { s t u } % Added u
+FUNCTION {and}
+{ 'skip$
+ { pop$ #0 }
+ if$
+}
+
+FUNCTION {or}
+{ { pop$ #1 }
+ 'skip$
+ if$
+}
+
+INTEGERS {chars i j}
+
+% text.length$ does not include braces
+% ...this function is probably unnecessary
+FUNCTION {num.chars}
+{
+ #0 'chars :=
+ { duplicate$ duplicate$ #1 chars substring$ = not }
+ { duplicate$ duplicate$ text.length$ swap$ #1 chars
+ substring$ text.length$ - chars + #1 + 'chars := }
+ while$
+ { duplicate$ duplicate$ #1 chars #1 - substring$ = }
+ { chars #1 - 'chars := }
+ while$
+ pop$ chars
+}
% Puts the period inside any quotes
FUNCTION {do.period}
-{
- duplicate$ #-1 #3 substring$ "'''" =
- { duplicate$ text.length$ #3 - text.prefix$ add.period$ "'\thinspace''" * }
- { duplicate$ #-1 #3 substring$ "''}" =
- { #2 global.max$ substring$ duplicate$
- text.length$ #2 - text.prefix$ add.period$ "{" swap$ * "''}" * }
- { duplicate$ #-1 #2 substring$ "''" =
- { duplicate$ text.length$ #2 - text.prefix$ add.period$ "''" * }
- { add.period$ }
- if$
+{
+ duplicate$ #-1 #2 substring$ "''" =
+ { #2 'i :=
+ { duplicate$ #-1 i - #11 substring$ "'\thinspace" = }
+ { i #11 + 'i := }
+ while$
+ duplicate$ #-1 i - global.max$ substring$
+ add.period$ swap$ #-1 i substring$ *
+ }
+ {
+ duplicate$ #-1 #3 substring$ "''}" =
+ { #3 'i :=
+ { duplicate$ #-1 i - #11 substring$ "'\thinspace" = }
+ { i #11 + 'i := }
+ while$
+ duplicate$ #-1 i - global.max$ substring$
+ add.period$ swap$ #-1 i substring$ *
}
+ { add.period$ }
if$
}
if$
% if$
%}
-FUNCTION {not}
-{ { #0 }
- { #1 }
- if$
-}
-
-FUNCTION {and}
-{ 'skip$
- { pop$ #0 }
- if$
-}
-
-FUNCTION {or}
-{ { pop$ #1 }
- 'skip$
- if$
-}
-
FUNCTION {new.block.checka}
{ empty$
'skip$
if$
}
+FUNCTION {sortify}
+{ purify$
+ "l" change.case$
+}
+
FUNCTION {emphasize}
{ duplicate$ empty$
{ pop$ "" }
- { "{\em " swap$ * "}" * }
+ { "\emph{" swap$ * "}" * }
+ if$
+}
+
+FUNCTION {enquote}
+{ duplicate$ empty$
+ { pop$ "" }
+ {
+ #1 'i :=
+ #0 'j :=
+ { duplicate$ i #1 substring$ "" = not }
+ { duplicate$ duplicate$ i #1 substring$ quote$ =
+ swap$ i #1 - #1 substring$ "\" = not and %"
+ { duplicate$ #1 i #1 - substring$ swap$
+ i #1 + global.max$ substring$
+ j
+ { swap$ duplicate$ #-1 #1 substring$ "'" =
+ { swap$ "\thinspace'" }
+ { swap$ "'" }
+ if$
+ #0 'j :=
+ }
+ { duplicate$ #1 #1 substring$ "`" =
+ { "`\thinspace" }
+ { "`" }
+ if$
+ #1 'j :=
+ }
+ if$
+ swap$ * *
+ }
+ 'skip$
+ if$
+ i #1 + 'i :=
+ }
+ while$
+ j #1 =
+ { "odd number of quotation marks in " cite$ * warning$ }
+ 'skip$
+ if$
+ duplicate$ #1 #1 substring$ "`" =
+ { "``\thinspace" swap$ * }
+ { "``" swap$ *}
+ if$
+ duplicate$ #-1 #1 substring$ "'" =
+ { "\thinspace''" * }
+ { "''" *}
+ if$
+ }
+ if$
+}
+
+FUNCTION {selective.enquote}
+{ field.or.null duplicate$ sortify 's :=
+ s #1 #8 substring$ duplicate$ "rev. of " = swap$ "rev.~of " = or
+ s #1 #9 substring$ "rev.\ of " = or
+ s "introduction" = or
+ s "preface" = or
+ s "forward" = or
+ s "afterward" = or
+ 'skip$
+ 'enquote
if$
}
{ namesleft #0 > }
{ nameptr #1 =
{ s nameptr "{vv~}{ll}{, ff}{, jj}" format.name$
- duplicate$ #1 #1 substring$ "u" change.case$ swap$
- duplicate$ #-1 swap$ text.length$ #1 - substring$ * 't := }
+ duplicate$ #1 #1 substring$ duplicate$ "{" =
+ 'skip$
+ { "u" change.case$ }
+ if$
+ swap$ #2 global.max$ substring$ * 't :=
+ }
{ s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := }
if$
nameptr #1 >
% Changed to preserve case and use quotes
FUNCTION {format.title}
-{ title empty$
- { "" }
- { title #1 text.prefix$ "`" =
- { "``\thinspace" title * "''" * }
- { "``" title * "''" *}
- if$
- }
- if$
+{ title selective.enquote
}
FUNCTION {n.dashify}
if$
}
+%INTEGERS {xx}
FUNCTION {format.btitle}
{ title emphasize
+ %title num.chars int.to.str$ top$
+ %#0 'xx :=
+ %{ xx title num.chars < }
+ %{ title xx #1 + duplicate$ 'xx := #1 substring$ top$ } while$
}
FUNCTION {tie.or.space.connect}
if$
}
-FUNCTION {format.number.series}
-{ volume empty$
- { "" }
- { "" }
- if$
-}
-
% Changed edition to MLA abbreviation
FUNCTION {format.edition}
{ edition empty$
{ "Vers.~" version *}
if$
}
- { edition "l" change.case$ 's := edition 't :=
+ { edition sortify 's := edition 't :=
""
"10th" "tenth" "9th" "ninth" "8th" "eighth" "7th" "seventh" "6th" "sixth"
"5th" "fifth" "4th" "fourth" "3rd" "third" "2nd" "second" "1st" "first"
+ "Rev." "revised" "Abr." "abridged"
{duplicate$ empty$ { pop$ #0 }{ #1 } if$ }{ s = { 't := }{ pop$ } if$ }
while$
- t " ed." *
+ t "\ ed." *
"edition and version" version either.or.check
}
if$
FUNCTION {format.pages}
{ pages empty$
{ "" }
- { %pages multi.page.check
-% { "pages" pages n.dashify tie.or.space.connect }
-% { "page" pages tie.or.space.connect }
-% if$
- pages n.dashify
+ {
+% j is positive if pages contains a comma
+% (not fully implemented)
+ #0 'j :=
+ pages n.dashify 't :=
+ ""
+ { t empty$ not }
+ { t #1 #2 substring$ "--" =
+ { t #3 global.max$ substring$ 't :=
+ duplicate$ num.chars 'i :=
+ "--" *
+ i t num.chars =
+ { { i #2 > }
+ { duplicate$ #1 i #2 - substring$
+ t #1 i #2 - substring$ =
+ { t i #1 - global.max$ substring$ * "" 't := #2 'i := }
+ { i #1 - 'i := }
+ if$
+ }
+ while$
+ }
+ 'skip$
+ if$
+ }
+ { t #1 #1 substring$ *
+ t #2 global.max$ substring$ 't :=
+ }
+ if$
+ }
+ while$
+ }
+ if$
+}
+
+FUNCTION {format.year}
+{ year empty$
+ { "" }
+ { year n.dashify
+ duplicate$ duplicate$ num.chars #10 =
+ swap$ #5 #2 substring$ "--" = and
+ { duplicate$ duplicate$ #1 #2 substring$ swap$ #7 #2 substring$ =
+ { duplicate$ #1 #6 substring$ swap$ #8 #2 substring$ * }
+ {}
+ if$
+ }
+ {}
+ if$
}
if$
}
% chapter might be useful if type is set to "pars."
FUNCTION {format.chapter.pages}
{ chapter empty$
+ type field.or.null sortify duplicate$ "def." = swap$ "definition" = or
+ or
'format.pages
{ type empty$
{ "Chapter" }
if$
}
-FUNCTION {format.in.ed.booktitle}
-{ booktitle empty$
- { "" }
- { editor empty$
- { "In " booktitle emphasize * }
- { booktitle emphasize add.period$ format.editors.mid * }
- if$
- }
- if$
-}
-
FUNCTION {empty.misc.check}
{ author empty$ title empty$ howpublished empty$
month empty$ year empty$ note empty$
FUNCTION {format.url}
{ url empty$
{ "" }
- { accessdate empty$
- { "There's a url but no accessdate in " cite$ * warning$ "" }
- { accessdate " " * }
+ { urldate empty$
+ { accessdate empty$
+ { "there's a url but no urldate in " cite$ * warning$ "\today" }
+ { "accessdate in " cite$ * " depreciated; use urldate instead" *
+ warning$ accessdate }
+ if$
+ }
+ { urldate }
if$
- "$<$\url{" * url * "}$>$" *
+ " $<$\url{" * url * "}$>$" *
urlpath empty$
'skip$
{ do.period " Path: " * urlpath * }
if$
}
-FUNCTION {format.article.crossref}
-{ %key empty$
- %{ journal empty$
- %{ "need key or journal for " cite$ * " to crossref " * crossref *
- % warning$
- % ""
- %}
- %{ "In {\em " journal * "\/}" * }
- %if$
- %}
- %{ "In " key * }
- %if$
- pages empty$ { " \citeN" } { " \citeN[" format.chapter.pages * "]" * } if$
+FUNCTION {format.crossref}
+{
+ pages empty$ { "\citealp" } { "\citealp[" format.chapter.pages * "]" * } if$
"{" * crossref * "}" *
- citen.used #1 + 'citen.used :=
}
-FUNCTION {format.crossref.editor}
-{ editor #1 "{vv~}{ll}" format.name$
- editor num.names$ duplicate$
- #2 >
- { pop$ " et~al." * }
- { #2 <
- 'skip$
- { editor #2 "{ff }{vv }{ll}{, jj}" format.name$ "others" =
- { " et~al." * }
- { " and " * editor #2 "{vv~}{ll}" format.name$ * }
- if$
- }
- if$
- }
- if$
-}
-
-FUNCTION {format.book.crossref}
-{% volume empty$
-% { "empty volume in " cite$ * "'s crossref of " * crossref * warning$
-% "In "
-% }
-% { "Vol." volume tie.or.space.connect add.period$
-% }
-% if$
-% editor empty$
-% editor field.or.null author field.or.null =
-% or
-% { key empty$
-% { series empty$
- %{ "need editor, key, or series for " cite$ * " to crossref " *
- % crossref * warning$
- % "" *
- %}
- %{ "{\em " * series * "\/}" * }
- %if$
-% }
-% { key * }
-% if$
-% }
-% { format.crossref.editor * }
-% if$
- pages empty$ { " \citeN" } { " \citeN[" format.chapter.pages * "]" * } if$
- "{" * crossref * "}" *
- citen.used #1 + 'citen.used :=
-}
-
-FUNCTION {format.incoll.inproc.crossref}
-{% editor empty$
-% editor field.or.null author field.or.null =
-% or
-% { key empty$
-% { booktitle empty$
-% { "need editor, key, or booktitle for " cite$ * " to crossref " *
-% crossref * warning$
-% ""
-% }
-% { "In {\em " booktitle * "\/}" * }
-% if$
-% }
-% { "In " key * }
-% if$
-% }
-% { "In " format.crossref.editor * }
-% if$
- pages empty$ { " \citeN" } { " \citeN[" format.chapter.pages * "]" * } if$
- "{" * crossref * "}" *
- citen.used #1 + 'citen.used :=
-}
FUNCTION {cite.title}
{ title empty$ journal empty$ not and
{ "empty title and key in " cite$ * warning$ "" }
{ key empty$ {title}{key} if$
type$ "book" =
+ type$ "booklet" =
type$ "inbook" =
type$ "manual" =
type$ "phdthesis" =
type$ "proceedings" =
- or or or or
+ or or or or or
{ emphasize }
{ type$ "article" =
%type$ "booklet" =
type$ "techreport" =
type$ "unpublished" =
or or or or or or
- {"``" swap$ * "''" * }
+ { selective.enquote }
{}
if$
}
{ author }
if$
duplicate$ empty$
- { pop$ cite.title }
- {
+ { cite.title *
+ "(" * empty.title * ")" * }
+ { duplicate$
author.shared author.different =
- { "{vv~}{ll}" format.names.custom }
+ { "{vv~}{ll}" format.names.custom 's := }
{ author.shared author.last =
- { "{f.~}{vv~}{ll}{, jj}" format.names.custom }
+ { "{f.~}{vv~}{ll}{, jj}" format.names.custom 's := }
{ author.shared author.flast =
- { "{ff~}{vv~}{ll}{, jj}" format.names.custom }
- { "{vv~}{ll}" format.names.custom ", " * cite.title * }
+ { "{ff~}{vv~}{ll}{, jj}" format.names.custom 's := }
+ { "{vv~}{ll}" format.names.custom ", " * cite.title * 's := "WTF" warning$ }
if$
}
if$
}
if$
- author.duplicate { ", " * cite.title * }{} if$
+ s
+ "(" * empty.title *
+ author.duplicate { cite.title * }{} if$
+ ")" * swap$ "{ff~}{vv~}{ll}{, jj}" format.names.custom purify$ *
}
if$
%}
format.title "title" output.check
new.block
crossref missing$
- { journal emphasize "journal" output.check after.title 'output.state :=
+ { type empty$
+ 'skip$
+ { type sortify "review" =
+ { "Rev.\ of " booktitle emphasize *
+ "booktitle" output.check new.block
+ }
+ { "Ignoring invalid type in " cite$ warning$ }
+ if$
+ }
+ if$
+ journal emphasize "journal" output.check after.title 'output.state :=
+ address empty$
+ 'skip$
+ { "[" address * "]" * output
+ after.title 'output.state :=
+ }
+ if$
%format.date "year" output.check
%edition output
format.vol.num.year.pages output
}
- { format.article.crossref output.nonnull
+ { format.crossref output.nonnull
%format.pages output
}
if$
if$
new.block
format.btitle "title" output.check
- new.sentence
+ new.block
crossref missing$
- { author empty$ 'skip$ { format.editors.mid output new.sentence } if$
+ { author empty$ 'skip$ { format.editors.mid output new.block } if$
format.edition output
new.sentence
format.bvolume.or.num.series output
}
{% format.date "year" output
new.block
- format.book.crossref output.nonnull
+ format.crossref output.nonnull
}
if$
new.block
{ output.bibitem
format.authors output
new.block
- format.title "title" output.check
+ format.btitle "title" output.check
howpublished address new.block.checkb
howpublished output
address output
format.btitle "title" output.check
new.block
crossref missing$
- { author empty$ 'skip$ { format.editors.mid output new.sentence } if$
+ { author empty$ 'skip$ { format.editors.mid output new.block } if$
format.edition output
new.sentence
format.bvolume.or.num.series output
format.chapter.pages "chapter and pages" output.check
%address output
}
- {% format.chapter.pages "chapter and pages" output.check
+ {
new.block
- format.book.crossref output.nonnull
+ format.crossref output.nonnull
}
if$
new.block
format.authors "author" output.check
chapter empty$
{ new.block type output }
- {}
+ 'skip$
if$
new.block
format.title "title" output.check
+ type field.or.null sortify duplicate$ "definition" = swap$ "def." = or
+ { new.block "Def.~" chapter field.or.null * "chapter" output.check }
+ 'skip$
+ if$
new.block
crossref missing$
{
booktitle emphasize "booktitle" output.check
- new.sentence
+ new.block
format.editors.mid "editor" output.check
new.block
format.edition output
new.sentence
format.chapter.pages output
}
- { format.incoll.inproc.crossref output.nonnull
+ { format.crossref output.nonnull
%format.chapter.pages output
}
if$
format.title "title" output.check
new.block
crossref missing$
- { %format.in.ed.booktitle "booktitle" output.check
+ {
booktitle "booktitle" output.check
new.sentence
format.editors.mid output
- new.sentence
+ new.block
format.edition output
new.sentence
format.bvolume.or.num.series output
new.sentence
format.pages output
}
- { format.incoll.inproc.crossref output.nonnull
- %format.pages output
+ { format.crossref output.nonnull
}
if$
new.block
if$
new.block
format.btitle "title" output.check
- new.sentence
+ new.block
format.edition output
new.sentence
author empty$
new.block
format.title "title" output.check
new.block
- "Diss." format.thesis.type output.nonnull
+ "Diss." format.thesis.type do.period output.nonnull
after.title 'output.state :=
school "school" output.check
address output
new.block
format.btitle "title" output.check
new.block
- "Diss." format.thesis.type output.nonnull
+ "Diss." format.thesis.type do.period output.nonnull
after.title 'output.state :=
school "school" output.check
address output
if$
new.block
format.btitle "title" output.check
- new.sentence
+ new.block
format.bvolume.or.num.series output
address empty$
{ editor empty$
format.title "title" output.check
new.block
format.tr.number output.nonnull
+ new.block
institution "institution" output.check
address output
format.date "year" output.check
MACRO {dec} {"Dec."}
+% Currently left in to help with compatibility
+
MACRO {acmcs} {"ACM Computing Surveys"}
MACRO {acta} {"Acta Informatica"}
READ
-FUNCTION {sortify}
-{ purify$
- "l" change.case$
-}
-
INTEGERS { len }
FUNCTION {chop.word}
{ 't :=
"A " #2
"An " #3
- "The " #4 t chop.word
+ "The " #4
+ "Rev. of " #8
+ "Rev.~of " #8
+ "Rev.\ of " #9
+ t chop.word
+ chop.word
+ chop.word
+ chop.word
chop.word
chop.word
sortify
SORT
STRINGS {a b}
-INTEGERS {i j}
FUNCTION {init.vars}
{ #0 int.to.chr$ 'a :=
FUNCTION {forward.author.dup.check}
{
url empty$ 'skip$ { url.used #1 + 'url.used := } if$
- crossref empty$ 'skip$ { citen.used #1 + 'citen.used := } if$
+ crossref empty$ 'skip$ { citealp.used #1 + 'citealp.used := } if$
author empty$
{ editor empty$ { organization field.or.null 'a := }{ editor 'a :=} if$}
{ author 'a := }
FUNCTION {begin.bib}
{
- citen.used
- { "\ifx\undefined\citeN\let\citeN\cite\fi" write$ newline$ }
+ citealp.used
+ { "\expandafter\ifx\csname citealp\endcsname\relax\let\citealp\cite\fi"
+ write$ newline$ }
'skip$
if$
url.used
- { "\ifx\undefined\url\let\url\relax\fi" write$ newline$ }
+ { "\expandafter\ifx\csname citealp\endcsname\relax\url\let\url\relax\fi"
+ write$ newline$ }
'skip$
if$
preamble$ empty$