Accounted for umlauts in enquote
[latex-mlastyle.git] / mlastyle.bst
index c7b9598e3507156a52e13b834892e7433e31b3ae..0beb5e44a7e513998abbf89fbc0e1b5ae9a13999 100644 (file)
@@ -1,4 +1,5 @@
-% BibTeX standard bibliography style `plain'
+% 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.
        % Copying of this file is authorized only if either
@@ -31,11 +32,18 @@ ENTRY
     type
     volume
     year
+    % New fields
+    url
+    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 }
+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}
@@ -49,23 +57,68 @@ FUNCTION {init.consts}
   #1 'author.last :=
   #2 'author.flast :=
   %#3 'author.firstlast :=
+
+  #0 'citealp.used :=
+  #0 'url.used :=
+  " \ \ \ \ \unskip\unskip\unskip\unskip\unskip " '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 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$
@@ -148,24 +201,6 @@ FUNCTION {new.sentence}
 %  if$
 %}
 
-FUNCTION {not}
-{   { #0 }
-    { #1 }
-  if$
-}
-
-FUNCTION {and}
-{   'skip$
-    { pop$ #0 }
-  if$
-}
-
-FUNCTION {or}
-{   { pop$ #1 }
-    'skip$
-  if$
-}
-
 FUNCTION {new.block.checka}
 { empty$
     'skip$
@@ -208,7 +243,51 @@ FUNCTION {field.or.null}
 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$
+      duplicate$ #1 #1 substring$ "`" =
+       { "``\thinspace" swap$ * }
+       { "``" swap$ *}
+      if$
+      duplicate$ #-1 #1 substring$ "'" =
+       { "\thinspace''" * }
+       { "''" *}
+      if$
+    }
   if$
 }
 
@@ -257,7 +336,7 @@ FUNCTION {format.names.beginning}
     { 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 := }
+         #2 global.max$ substring$ * 't := }
        { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't := }
       if$
       nameptr #1 >
@@ -334,14 +413,7 @@ FUNCTION {format.publisher}
 
 % Changed to preserve case and use quotes
 FUNCTION {format.title}
-{ title empty$
-    { "" }
-    { title #1 text.prefix$ "`" =
-       { "``\thinspace" title * "''" * }
-       { "``" title * "''" *}
-      if$
-    }
-  if$
+{ title enquote
 }
 
 FUNCTION {n.dashify}
@@ -380,14 +452,19 @@ FUNCTION {format.date}
     }
     { month empty$
        'year
-       { month " " * year * }
+       { month "~" * year * }
       if$
     }
   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}
@@ -447,16 +524,19 @@ FUNCTION {format.number.series}
 % Changed edition to MLA abbreviation
 FUNCTION {format.edition}
 { edition empty$
-    { "" }
+    { version empty$
+       { "" }
+       { "Vers.~" version *}
+      if$
+    }
     { edition "l" change.case$ 's := edition 't :=
-      "" "9th" "ninth" "8th" "eighth" "7th" "seventh" "6th" "sixth" "5th" "fifth" "4th" "fourth" "3rd" "third" "2nd" "second" "1st" "first"
+      ""
+      "10th" "tenth" "9th" "ninth" "8th" "eighth" "7th" "seventh" "6th" "sixth"
+      "5th" "fifth" "4th" "fourth" "3rd" "third" "2nd" "second" "1st" "first"
       {duplicate$ empty$ { pop$ #0 }{ #1 } if$ }{ s = { 't := }{ pop$ } if$ }
       while$
-%        output.state mid.sentence =
-%      { edition "l" change.case$ " ed." * }
-%      { edition "t" change.case$ " ed." * }
-%      if$
-    t " ed." *
+      t " ed." *
+      "edition and version" version either.or.check
     }
   if$
 }
@@ -601,6 +681,22 @@ FUNCTION {format.tr.number}
   if$
 }
 
+FUNCTION {format.url}
+{ url empty$
+    { "" }
+    { accessdate empty$
+       { "There's a url but no accessdate in " cite$ * warning$ "" }
+       { accessdate " " * }
+      if$
+      "$<$\url{" * url * "}$>$" *
+      urlpath empty$
+       'skip$
+       { do.period " Path: " * urlpath * }
+      if$
+    }
+  if$
+}
+
 FUNCTION {format.article.crossref}
 { %key empty$
     %{ journal empty$
@@ -613,7 +709,7 @@ FUNCTION {format.article.crossref}
     %}
     %{ "In " key * }
   %if$
-  pages empty$ { " \citeN" } { " \citeN[" format.chapter.pages * "]" * } if$
+  pages empty$ { "\citealp" } { "\citealp[" format.chapter.pages * "]" * } if$
   "{" * crossref * "}" *
 }
 
@@ -659,8 +755,7 @@ FUNCTION {format.book.crossref}
 %    }
 %    { format.crossref.editor * }
 %  if$
-  %" \citeN{" * crossref * "}" *
-  pages empty$ { " \citeN" } { " \citeN[" format.chapter.pages * "]" * } if$
+  pages empty$ { "\citealp" } { "\citealp[" format.chapter.pages * "]" * } if$
   "{" * crossref * "}" *
 }
 
@@ -682,8 +777,7 @@ FUNCTION {format.incoll.inproc.crossref}
 %    }
 %    { "In " format.crossref.editor * }
 %  if$
-%  " \citeN{" * crossref * "}" *
-  pages empty$ { " \citeN" } { " \citeN[" format.chapter.pages * "]" * } if$
+  pages empty$ { "\citealp" } { "\citealp[" format.chapter.pages * "]" * } if$
   "{" * crossref * "}" *
 }
 
@@ -709,7 +803,7 @@ FUNCTION {cite.title}
              type$ "techreport" =
              type$ "unpublished" =
              or or or or or or
-               {"``" swap$ * "''" *  }
+               { enquote }
                {}
              if$
            }
@@ -736,21 +830,25 @@ FUNCTION {cite.label}
     { 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 *
     }
   if$
       %}
@@ -781,6 +879,7 @@ FUNCTION {article}
   new.block
   crossref missing$
     { journal emphasize "journal" output.check after.title 'output.state :=
+      address empty$ skip$ { "[" address * "]" * output } if$
       %format.date "year" output.check
       %edition output
       format.vol.num.year.pages output
@@ -790,6 +889,8 @@ FUNCTION {article}
     }
   if$
   new.block
+  format.url output
+  new.block
   note output
   fin.entry
 }
@@ -802,9 +903,9 @@ FUNCTION {book}
   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
@@ -818,6 +919,8 @@ FUNCTION {book}
     }
   if$
   new.block
+  format.url output
+  new.block
   note output
   fin.entry
 }
@@ -846,7 +949,7 @@ FUNCTION {inbook}
   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
@@ -862,6 +965,8 @@ FUNCTION {inbook}
       format.book.crossref output.nonnull
     }
   if$
+  new.block
+  format.url output
   note output
   fin.entry
 }
@@ -879,7 +984,7 @@ FUNCTION {incollection}
   crossref missing$
     { 
       booktitle emphasize "booktitle" output.check
-      new.sentence
+      new.block
       format.editors.mid "editor" output.check
       new.block
       format.edition output
@@ -897,6 +1002,8 @@ FUNCTION {incollection}
     }
   if$
   new.block
+  format.url output
+  new.block
   note output
   fin.entry
 }
@@ -912,7 +1019,7 @@ FUNCTION {inproceedings}
       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
@@ -942,6 +1049,8 @@ FUNCTION {inproceedings}
     }
   if$
   new.block
+  format.url output
+  new.block
   note output
   fin.entry
 }
@@ -962,7 +1071,7 @@ FUNCTION {manual}
   if$
   new.block
   format.btitle "title" output.check
-  new.sentence
+  new.block
   format.edition output
   new.sentence
   author empty$
@@ -980,6 +1089,8 @@ FUNCTION {manual}
   if$
   format.date output
   new.block
+  format.url output
+  new.block
   note output
   fin.entry
 }
@@ -990,12 +1101,14 @@ FUNCTION {mastersthesis}
   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
   format.date "year" output.check
   new.block
+  format.url output
+  new.block
   note output
   fin.entry
 }
@@ -1004,11 +1117,14 @@ FUNCTION {misc}
 { output.bibitem
   format.authors output
   title howpublished new.block.checkb
-  format.title output after.sentence 'output.state :=
-  howpublished new.block.checka
+  format.title output
+  new.block
+  %howpublished new.block.checka
   howpublished output
   format.date output
   new.block
+  format.url output
+  new.block
   note output
   fin.entry
   empty.misc.check
@@ -1020,12 +1136,14 @@ FUNCTION {phdthesis}
   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
   format.date "year" output.check
   new.block
+  format.url output
+  new.block
   note output
   fin.entry
 }
@@ -1061,6 +1179,8 @@ FUNCTION {proceedings}
     }
   if$
   new.block
+  format.url output
+  new.block
   note output
   fin.entry
 }
@@ -1086,6 +1206,8 @@ FUNCTION {unpublished}
   new.block
   format.title "title" output.check
   new.block
+  format.url output
+  new.block
   note "note" output.check
   format.date output
   fin.entry
@@ -1306,7 +1428,6 @@ ITERATE {presort}
 SORT
 
 STRINGS {a b}
-INTEGERS {i j}
 
 FUNCTION {init.vars}
 { #0 int.to.chr$ 'a :=
@@ -1317,6 +1438,8 @@ FUNCTION {init.vars}
 
 FUNCTION {forward.author.dup.check}
 {
+  url empty$ 'skip$ { url.used #1 + 'url.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 := }
@@ -1409,12 +1532,22 @@ REVERSE {reverse.author}
 %ITERATE {longest.label.pass}
 
 FUNCTION {begin.bib}
-{ preamble$ empty$
+{
+  citealp.used
+    { "\expandafter\ifx\csname citealp\endcsname\relax\let\citealp\cite\fi"
+      write$ newline$ }
+    'skip$
+  if$
+  url.used
+    { "\expandafter\ifx\csname citealp\endcsname\relax\url\let\url\relax\fi"
+      write$ newline$ }
+    'skip$
+  if$
+  preamble$ empty$
     'skip$
     { preamble$ write$ newline$ }
   if$
   "\begin{thebibliography}{\rule{.5in}{0pt}}" write$ newline$
-  "\ifx\undefined\citeN\let\citeN\cite\fi" write$ newline$
 }
 
 EXECUTE {begin.bib}