]> git.donarmstrong.com Git - lilypond.git/blobdiff - Documentation/lily-bib.bst
Imported Upstream version 2.14.2
[lilypond.git] / Documentation / lily-bib.bst
diff --git a/Documentation/lily-bib.bst b/Documentation/lily-bib.bst
new file mode 100644 (file)
index 0000000..13320d4
--- /dev/null
@@ -0,0 +1,400 @@
+% This template file was written by Phil Holmes to replace the one used for the bibliogrphy
+% on the LilyPond project.  18 Feb 2011
+
+% This section lists the possible fields, although not all are handled by the template
+ENTRY
+  { abstract
+    address
+    author
+    booktitle
+    chapter
+    comment
+    earlier
+    edition
+    editor
+    howpublished
+    institution
+    journal
+    key
+    keyword
+    later
+    month
+    note
+    number
+    organization
+    pages
+    private
+    publisher
+    school
+    series
+    title
+    type
+    URL
+    volume
+    year
+  }
+  {}
+  { label extra.label sort.label }
+
+% s and t came from the original.  The other strings are self explanatory
+STRINGS { s t }
+STRINGS { ThesisType ReportType }
+
+% from the original
+INTEGERS { nameptr namesleft numnames }
+
+% This was simply copied and pasted from the original
+FUNCTION {format.names}
+{ 's :=
+  #1 'nameptr :=
+  s num.names$ 'numnames :=
+  numnames 'namesleft :=
+    { namesleft #0 > }
+    % This line was changed: the {ff{ } } entry outputs the first name without allowing bibtex to use
+    % a ~ to replace the spaces where it thinks fit.  The downside is that we lose hyphens...
+    { s nameptr "{ff{ } }{vv }{ll}{, jj}" format.name$ 't :=
+      nameptr #1 >
+       { namesleft #1 >
+           { ", " * t * }
+           { numnames #2 >
+               { "," * }
+               'skip$
+             if$
+             t "others" =
+               { " et al." * }
+               { " and " * t * }
+             if$
+           }
+         if$
+       }
+       't
+      if$
+      nameptr #1 + 'nameptr :=
+      namesleft #1 - 'namesleft :=
+    }
+  while$
+}
+
+FUNCTION {format.authors}
+% This is a very common construct.  It means "if the author is empty, process the lines in the first pair
+% of braces {}.  Otherwise process the lines in the second pair.  So if it's empty, an empty string is
+% stacked.
+{ author empty$
+    { "" }
+    % If it's not empty, it formats author (and stacks the result) and then checks whether editor is empty
+    { author format.names
+      editor empty$
+        % If editor is empty, it appends an empty string (the * is a postfix operator meaning append this
+        % string to the top entry on the stack
+        { "" * }
+        % Otherwise it appends a period, parenthesis.
+        { ". (" * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.editor}
+{ editor empty$
+    { "" }
+    { editor format.names
+      editor num.names$ #1 >
+       { ", editors" * }
+       { ", editor" * }
+      if$
+      author empty$
+        { "" * }
+        { ")" * }
+      if$
+    }
+  if$
+
+}
+
+FUNCTION {output.bibitem}
+{ newline$
+  "@item " write$ newline$
+}
+
+FUNCTION {format.edition}
+{ edition empty$
+    { "" }
+    { edition " edition, " * }
+  if$
+}
+
+FUNCTION {format.date}
+{ year empty$
+    { month empty$
+       { "" }
+       { "there's a month but no year in " cite$ * warning$
+         month
+       }
+      if$
+    }
+    { month empty$
+       'year
+       { month " " * year * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.address}
+{ address empty$
+    { "" }
+    { address
+    year empty$
+      { "" * }
+      { ", " * }
+    if$
+    }
+  if$
+}
+
+FUNCTION {format.publisher}
+{
+  publisher empty$
+    { "" }
+    { publisher
+      address empty$
+        { year empty$
+            { "" * }
+            { ", " * }
+          if$
+        }
+        { ", " * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.note}
+{ note empty$
+    { "" }
+    { note
+      add.period$
+    }
+  if$
+}
+
+FUNCTION {format.title}
+{ title empty$
+    { "" }
+    { "@strong{" title * "}" *
+    journal empty$
+    {
+      volume empty$
+        { "" * }
+        { ", " * }
+      if$
+    }
+    { "" * }
+    if$
+  }
+  if$
+}
+
+FUNCTION {format.number}
+{
+  % ReportType is set by us when we call the correct function for the bibliography type
+  ReportType empty$
+  {
+    volume empty$
+      {number empty$
+        { "" }
+        { "Number " number * ". " * }
+      if$
+      }
+      { "" }
+    if$
+    }
+    { ReportType
+      number empty$
+        { ", " * }
+        { " " * number * ", " * institution * ", " * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.volume}
+{ journal empty$
+  {
+    volume empty$
+      { "" }
+      { "volume " volume * }
+    if$
+  }
+  { "" }
+  if$
+}
+
+FUNCTION {format.journal}
+{ journal empty$
+  { "" write$ }
+  { "@emph{" journal * "}" *
+    write$
+    volume empty$
+      { "" }
+      { ", " volume * }
+    if$
+    write$
+    number empty$
+      { "" }
+      { "(" number * ")" * }
+    if$
+    write$
+    pages empty$
+      { "" }
+      { ":" pages * }
+    if$
+    write$
+    year empty$
+      { "" }
+      { ", " }
+    if$
+    write$
+ }
+  if$
+}
+
+FUNCTION {format.series}
+{ series empty$
+    { "" }
+    { series
+      % This is an inbuilt function that adds a period when appropriate.
+      add.period$
+      " " *
+    }
+  if$
+}
+
+FUNCTION {format.booktitle}
+{ booktitle empty$
+    { "" }
+    { "In @emph{" booktitle * "}, " *
+      pages empty$
+        { "" * }
+        { "pages " * pages * ", " * }
+      if$
+    }
+  if$
+}
+
+FUNCTION {format.thesis}
+{ ThesisType empty$
+    { "" }
+    { ThesisType school * ", " *}
+  if$
+}
+
+% This is the function that runs the formatting code.  It's called when the biblio type is @Book
+FUNCTION {book}
+{ output.bibitem
+  format.authors write$
+  format.editor write$
+  "." write$ newline$
+  format.title write$
+  format.volume write$
+  "." write$ newline$
+  format.number write$
+  format.journal
+  format.series write$
+  format.publisher write$
+  format.address write$
+  format.edition write$
+  format.booktitle write$
+  format.thesis write$
+  format.date write$
+  "." write$ newline$
+  format.note write$
+  newline$
+  newline$
+  newline$
+  newline$
+}
+
+% All the following functions are called for the other biblio types. This is @article
+FUNCTION {article}
+{
+  % And we just call the book function
+  book
+}
+
+FUNCTION {booklet}
+{
+  book
+}
+
+FUNCTION {PhDThesis}
+{
+  % This sets the string ThesisType to be equal to "PhD Thesis"
+  "PhD thesis, " 'ThesisType :=
+  book
+  % And this sets it back to an empty string
+  "" 'ThesisType :=
+}
+
+FUNCTION {TechReport}
+{
+  "Technical Report" 'ReportType :=
+  book
+  "" 'ReportType :=
+}
+
+FUNCTION {InProceedings}
+{
+  book
+}
+
+FUNCTION {MastersThesis}
+{
+  "Master's thesis, " 'ThesisType :=
+  book
+  "" 'ThesisType :=
+}
+
+FUNCTION {InBook}
+{
+  book
+}
+
+% Haven't dug too deeply into this, but it seems to set the sort key
+FUNCTION {presort}
+{ cite$
+  #1 entry.max$ substring$
+  'sort.key$ :=
+}
+
+% The entry point for processing
+
+% Read the .bib file
+READ
+
+% Work through the entries, calling the presort function
+ITERATE {presort}
+
+% Sort the entries
+SORT
+
+% This could go higher with all the other functions, but it _has_ to be above the call
+FUNCTION {begin.bib}
+{ "@c bib -> itexi intro" write$ newline$
+  "@itemize" write$ newline$
+}
+
+% Run the begin.bib function
+EXECUTE {begin.bib}
+
+% For each bibliogrpahy entry call the relevant function (e.g. book, article, booklet, etc.)
+ITERATE {call.type$}
+
+FUNCTION {end.bib}
+{ newline$
+  "@end itemize" write$ newline$
+  "@c bib -> itexi end" write$ newline$
+}
+
+EXECUTE {end.bib}
+% And that's it.