% 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.