%%% ==================================================================== %%% @BibTeX-style-file{ %%% author = "David M. Jones", %%% version = "1.00", %%% date = "27 October 1993", %%% time = "15:21:11 EDT", %%% filename = "hilbert.bst", %%% address = "MIT Laboratory for Computer Science %%% Room NE43-316 %%% 545 Technology Square %%% Cambridge, MA 02139 %%% USA", %%% telephone = "(617) 253-5936", %%% FAX = "(617) 253-3480", %%% checksum = "47437 2344 8786 62605", %%% email = "dmjones@theory.lcs.mit.edu", %%% codetable = "ISO/ASCII", %%% keywords = "", %%% supported = "yes", %%% docstring = "This is a BibTeX style file that implements %%% a bibliography format similar to that used %%% by Yuri Matijasevich in is book {\em %%% Hilbert's Tenth Problem\/} (MIT Press, %%% 1993). This file is not identical to the %%% one used for the book; it has been modified %%% in an attempt to make it more generally %%% useful. However, it is still deficient in %%% one big way -- the \cite command is not %%% supported. (For historical reasons, we %%% didn't use the \cite command in our book, %%% and so I didn't bother implementing it in %%% this style file.) If there is sufficient %%% interest, I'll try to remedy this defect. %%% %%% This file has been released for public use %%% with the kind permission of MIT Press. %%% %%% This file is originally based upon the file %%% plain.bst by Oren Patashnik, but has been %%% massively modified. %%% %%% This and related files are available via %%% anonymous ftp from theory.lcs.mit.edu in %%% the directory pub/hilbert10. See the file %%% ``README'' in that directory for a list and %%% description of what is available. %%% %%% The checksum field above contains a CRC-16 %%% checksum as the first value, followed by the %%% equivalent of the standard UNIX wc (word %%% count) utility output of lines, words, and %%% characters. This is produced by Robert %%% Solovay's checksum utility.", %%% } %%% ==================================================================== % Entry formatting: Similar to that recommended by Mary-Claire van % Leunen in "A Handbook for Scholars". Book-like titles are % italicized (emphasized) and non-book titles are converted to % sentence capitilization (and not enclosed in quotes). This % file outputs a \newblock between major blocks of an entry (the % name \newblock is analogous to the names \newline and % \newpage) so that the user can obtain an "open" format, which % has a line break before each block and lines after the first % are indented within blocks, by giving the optional % \documentstyle argument `openbib'; The default is the "closed" % format---blocks runs together. The month field is suppressed. % % In the bibliography produced by this file, papers are arranged % alphabetically by author and then listed by year, in the % following format: % % Zofia Adamowicz % % 1992 A sharp version of the bounded {Matijasevich} % conjecture and the end-extension problem. {\em % Journal of Symbolic Logic}, 57(2):597--616. % % Andrew Adler % % 1969a Existential formulas in arithmetic. {\em % Dissertation Abstracts}, 29B(8):2962--2963. % % 1969b Extensions of non-standard models of number % theory. {\em Zeitschrift f{\"u}r Mathematische % Logik und Grundlagen der Mathematik}, % 15(4):289--290. % % 1969c Some recursively unsolvable problems in analysis. % {\em Proceedings of the American Mathematical % Society}, 22(2):523--526. % % 1971 A.~Adler. A reduction of homogeneous {Diophantine} % problems. {\em The Journal of the London % Mathematical Society (Second Series)}, % 3(3):446--448. % % The actual LaTeX code produced looks something like this: % % \bibauthor{Zofia Adamowicz} % % \begin{paperlist} % % \item[1992] % A sharp version of the bounded {Matijasevich} conjecture % and the end-extension problem. % \newblock {\em Journal of Symbolic Logic}, 57(2):597--616. % % \end{paperlist} % % The macro \bibauthor and the environment \paperlist are % defined in the file hilbert.sty. % % In some cases, an author's name will appear in different ways % on different papers, which provides a dilemma: on one hand, % it's necessary to give the author's name uniformly in order % for an author's papers to be correctly grouped together as % above. On the other hand, it's desirable to indicate the % precise spelling of the author's name in the bibliography, % especially when the variant spellings are a matter of % different transliterations of a name. The sort-author field % is provided to deal with this contigency. Suppose you have % three papers by John Q. Smith in your bibliography. On two of % the papers, his name appears as "John Q. Smith", while on the % third it is listed as as "J. Smith". In each case, the author % field would be given precisely as the name appeared on the % article, but the third paper would also have a sort-author % field containing "John Q. Smith". The final bibliography % would end up looking something like this: % % John Q. Smith % % 1980 Paper title 1.... % % 1981 Paper title 1.... % % 1982 J. Smith. Paper title 3.... % % % Citation label format: % Author [1993] % Author1 and Author2 [1993] % Author1, Author 2, and Author 3 [1993] % % The ENTRY declaration % Like Scribe's (according to pages 231-2 of the April '84 edition), % but no fullauthor or editors fields because BibTeX does name % handling. The annote field is commented out here because this % family doesn't include an annotated bibliography style. And in % addition to the fields listed here, BibTeX has a built-in crossref % field, explained later. ENTRY % Fields: { abstract % address % Usually the address of a publisher or other type of % organization. Put information in this field only if it % helps the reader find the thing---for example you should % omit the address of a major publisher entirely. For a % PROCEEDINGS or an INPROCEEDINGS, however, it's the address % of the conference; for those two entry types, include the % publisher's or organization's address, if necessary, in % the publisher or organization field. author % Name(s) of author(s), in BibTeX name format. sort-author % See above for an explanation of this field. booktitle % Book title when the thing being referenced isn't the whole % book. For book entries, the title field should be used % instead. chapter % Chapter (or section or whatever) number. crossrefonly % added by dmj % Hack to add flexibility in crossref feature edition % Edition of a book---should be an ordinal (e.g., "Second"). editor % Name(s) of editor(s), in BibTeX name format. If there is % also an author field, then the editor field should be for % the book or collection that the work appears in. howpublished % How something strange has been published (begins sentence). institution % Sponsoring institution of a technical report. journal % Journal name (macros are provided for many). key % Alphabetizing, labeling, and cross-referencing key % (needed when an entry has no author or editor). language month % Month (macros are provided). The month field is not used % in this style. note % To help the reader find a reference (begins sentence). number % Number of a journal or technical report, or of a work in a % series. organization % Organization sponsoring a conference (or publishing a % manual); if the editor (or author) is empty, and if the % organization produces an awkward label or cross reference, % you should put appropriately condensed organization % information in the key field as well. pages % Page number or numbers (use `--' to separate a range, use % `+' to indicate pages following that don't form a simple % range). publisher % Publisher name. sortgroup % key used to group entries together when doing sorting % v1.01 sortkey % key used to alter the position of a particular entry % v1.01 school % School name (for theses). series % The name of a series or set of books. % An individual book will will also have it's own title. subyear title % The title of the thing you're referred to. translation type % Type of a Techreport (e.g., "Research Note") to be used % instead of the default "Technical Report"; or, similarly, % the type of a thesis; or of a part of a book. volume % The volume number of a journal or multivolume work. year % The year should contain only numerals (technically, it % should end with four numerals, after purification; doesn't % a begin sentence). } % There are no integer entry variables {} % These string entry variables are used to form the citation label. % In a storage pinch, sort.label can be easily computed on the fly. { label extra.label } % These three functions pop one or two (integer) arguments from the % stack and push a single one, either 0 or 1. The 'skip$ in the `and' % and `or' functions are used because the corresponding if$ would be % idempotent FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { 'skip$ { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } 'skip$ if$ } % Each entry function starts by calling output.bibitem, to write the % \bibitem and its arguments to the .BBL file. It also decides % whether to start a new paperlist or to continue the current one % (i.e., it checks to see if the author has changed since the previous % entry and, if so, ends the old paperlist and starts a new one). % Then the various fields are formatted and printed by output or % output.check. Those functions handle the writing of separators % (commas, periods, \newblock's), taking care not to do so when they % are passed a null string. Finally, fin.entry is called to add the % final period, format the translation field and finish the entry. % (fin.entry also optionally calls the function output.language.end to % close the group began by output.language.begin.) % % A bibliographic reference is formatted into a number of `blocks': in % the open format, a block begins on a new line and subsequent lines % of the block are indented. A block may contain more than one % sentence (well, not a grammatical sentence, but something to be % ended with a sentence ending period). The entry functions should % call new.block whenever a block other than the first is about to be % started. They should call new.sentence whenever a new sentence is % to be started. The output functions will ensure that if two % new.sentence's occur without any non-null string being output % between them then there won't be two periods output. Similarly for % two successive new.block's. % % The output routines don't write their argument immediately. % Instead, by convention, that argument is saved on the stack to be % output next time (when we'll know what separator needs to come after % it). Meanwhile, the output routine has to pop the pending output % off the stack, append any needed separator, and write it. % % To tell which separator is needed, we maintain an output.state. It % will be one of these values: % before.all just after the \bibitem % mid.sentence in the middle of a sentence: comma % needed if more sentence is output % after.sentence just after a sentence: period needed % after.block just after a block (and sentence): % period and \newblock needed. % Note: These styles don't use after.sentence % % VAR: output.state : INTEGER -- state variable for output % % The output.nonnull function saves its argument (assumed to be % nonnull) on the stack, and writes the old saved value followed by % any needed separator. The ordering of the tests is decreasing % frequency of occurrence. % % output.nonnull(s) == % BEGIN % s := argument on stack % if output.state = mid.sentence then % write$(pop() * ", ") % -- "pop" isn't a function: just use stack top % else % if output.state = after.block then % write$(add.period$(pop())) % newline$ % write$("\newblock ") % else % if output.state = before.all then % write$(pop()) % else -- output.state should be after.sentence % write$(add.period$(pop()) * " ") % fi % fi % output.state := mid.sentence % fi % push s on stack % END % % The output function calls output.nonnull if its argument is % non-empty; its argument may be a missing field (thus, not % necessarily a string) % % output(s) == % BEGIN % if not empty$(s) then output.nonnull(s) % fi % END % % The output.check function is the same as the output function except % that, if necessary, output.check warns the user that the t field % shouldn't be empty (this is because it probably won't be a good % reference without the field; the entry functions try to make the % formatting look reasonable even when such fields are empty). % % output.check(s,t) == % BEGIN % if empty$(s) then % warning$("empty " * t * " in " * cite$) % else output.nonnull(s) % fi % END % % The output.bibitem checks the extra.label field to see if it is % "\bysame". If so, this means that the current item has the same % author as the previous item, so no special action is needed. % Otherwise, it calls begin.new.author to end the old paperlist, % output a new \bibauthor command, and begin a paperlist environment. % It also leaves a string on the stack as per the output convention % and initializes the output.state to "before.all". % % output.bibitem == % BEGIN % if not(empty$(author)) % begin.new.author % fi % push "" on stack % output.state := before.all % END % % The fin.entry function finishes off an entry by adding a period to % the string remaining on the stack. If the state is still before.all % then nothing was produced for this entry, so the result will look % bad, but the user deserves it. (We don't omit the whole entry % because the entry was cited, and a bibitem is needed to define the % citation label.) % % fin.entry == % BEGIN % write$(add.period$(pop())) % format.translation % %output.language.end %commented out in this version % newline$ % END % % The new.block function prepares for a new block to be output, and % new.sentence prepares for a new sentence. % % new.block == % BEGIN % if output.state <> before.all then % output.state := after.block % fi % END % % new.sentence == % BEGIN % if output.state <> after.block then % if output.state <> before.all then % output.state := after.sentence % fi % fi % END % INTEGERS { beginning 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 := } % the variables s and t are temporary string holders STRINGS { s t } FUNCTION {output.nonnull} { 's := output.state mid.sentence = { ", " * write$ } { output.state after.block = { add.period$ write$ newline$ "\newblock " write$ } { output.state before.all = 'write$ { add.period$ " " * write$ } if$ } if$ mid.sentence 'output.state := } if$ s } FUNCTION {output} { duplicate$ empty$ 'pop$ 'output.nonnull if$ } FUNCTION {output.check} { 't := duplicate$ empty$ { pop$ "empty " t * " in " * cite$ * warning$ } 'output.nonnull if$ } FUNCTION {output.language.begin} {""} %% { "" %% language empty$ %% 'skip$ %% { %% language "Russian" = %% { pop$ "\bibcyr " } %% 'skip$ %% if$ %% language "German" = %% { pop$ "\selectlanguage{germanb}" } %% 'skip$ %% if$ %% } %% if$ %% } FUNCTION {output.language.begin.group} {""} %% { "" %% language empty$ %% 'skip$ %% { %% language "Russian" = %% { pop$ "{\bibcyr " } %% 'skip$ %% if$ %% language "German" = %% { pop$ "{\selectlanguage{germanb}" } %% 'skip$ %% if$ %% } %% if$ %% } FUNCTION {output.language.end} {""} %% { "" %% language empty$ %% 'skip$ %% { language "Russian" = %% language "German" = %% or %% { pop$ "}" } %% 'skip$ %% if$ %% } %% if$ %% } FUNCTION {format.language} { language empty$ { "" } { " (" language * ")" * } if$ } FUNCTION {format.translation} {} %% { translation empty$ %% 'skip$ %% { %% " {\selectlanguage{english} (Translated as " %% translation * %% ")}" * %% write$ %% } %% if$ %% } % This function finishes all entries. FUNCTION {fin.entry} { add.period$ write$ format.translation % output.language.end 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$ } % Sometimes we begin a new block only if the block will be big enough. % The new.block.checka function issues a new.block if its argument is % nonempty; new.block.checkb does the same if either of its TWO % arguments is nonempty. FUNCTION {new.block.checka} { empty$ 'skip$ 'new.block if$ } FUNCTION {new.block.checkb} { empty$ swap$ empty$ and 'skip$ 'new.block if$ } % The new.sentence.check functions are analogous. FUNCTION {new.sentence.checka} { empty$ 'skip$ 'new.sentence if$ } FUNCTION {new.sentence.checkb} { empty$ swap$ empty$ and 'skip$ 'new.sentence if$ } % Here are some functions for formatting chunks of an entry. By % convention they either produce a string that can be followed by a % comma or period (using add.period$, so it is OK to end in a period), % or they produce the null string. % % A useful utility is the field.or.null function, which checks if the % argument is the result of pushing a `missing' field (one for which % no assignment was made when the current entry was read in from the % database) or the result of pushing a string having no % non-white-space characters. It returns the null string if so, % otherwise it returns the field string. Its main (but not only) % purpose is to guarantee that what's left on the stack is a string % rather than a missing field. % % field.or.null(s) == % BEGIN % if empty$(s) then return "" % else return s % END % % Another helper function is emphasize, which returns the argument % emphazised, if that is non-empty, otherwise it returns the null % string. Italic corrections aren't used, so this function should be % used when punctation will follow the result. % % emphasize(s) == % BEGIN % if empty$(s) then return "" % else return "{\em " * s * "}" % % The format.names function formats the argument (which should be in % BibTeX name format) into "First Von Last, Junior", separated by % commas and with an "and" before the last (but ending with "et~al." % if the last of multiple authors is "others"). This function's % argument should always contain at least one name. % % VAR: nameptr, namesleft, numnames: INTEGER % pseudoVAR: nameresult: STRING (it's what's accumulated on the % stack) % % format.names(s) == % BEGIN % nameptr := 1 % numnames := num.names$(s) % namesleft := numnames % while namesleft > 0 % do % % for full names: % t := format.name$(s, nameptr, "{ff~}{vv~}{ll}{, jj}") % % for abbreviated first names: % t := format.name$(s, nameptr, "{f.~}{vv~}{ll}{, jj}") % if nameptr > 1 then % if namesleft > 1 then nameresult := nameresult * ", " * t % else if numnames > 2 % then nameresult := nameresult * "," % fi % if t = "others" % then nameresult := nameresult * " et~al." % else nameresult := nameresult * " and " * t % fi % fi % else nameresult := t % fi % nameptr := nameptr + 1 % namesleft := namesleft - 1 % od % return nameresult % END % % The format.names.and.index function is identical to format.names % except that it also calls the function format.name.index.entry. % % The format.authors function returns the result of % format.names(author) if the author is present, or else it returns % the null string % % format.authors == % BEGIN % if empty$(author) then return "" % else return format.names(author) % fi % END % % Format.editors is like format.authors, but it uses the editor field, % and appends ", editor" or ", editors" % % format.editors == % BEGIN % if empty$(editor) then return "" % else % if num.names$(editor) > 1 then % return format.names(editor) * ", editors" % else % return format.names(editor) * ", editor" % fi % fi % END % % Other formatting functions are similar, so no "comment version" will % be given for them. % % The `pop$' in this function gets rid of the duplicate `empty' value % and the `skip$' returns the duplicate field value FUNCTION {field.or.null} { duplicate$ empty$ { pop$ "" } 'skip$ if$ } FUNCTION {emphasize} { duplicate$ empty$ { pop$ "" } { "{\em " swap$ * "}" * } if$ } INTEGERS { nameptr namesleft numnames } FUNCTION {format.names} { 's := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { 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.name.index.entry} {""} %% { "\index[aut]{" %% s nameptr "{vv{ }}{ll{ }}{, jj}" format.name$ * %% s nameptr "{, ff{ }}" format.name$ * %% "}" * %% } %% FUNCTION {format.names.and.index} { 's := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { format.name.index.entry 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$ } % The variable "beginning" is 0 if this is the first item in the % bibliography (i.e., if the .bbl file is empty), and 0 otherwise. FUNCTION {begin.new.author} { newline$ beginning #0 = { #1 'beginning := } { "\end{paperlist}" write$ newline$ newline$ } if$ "\bibauthor{" output.language.begin * sort-author missing$ { author } { sort-author } if$ format.names.and.index "}" * * write$ newline$ newline$ "\begin{paperlist}" write$ newline$ } FUNCTION {output.bibitem} { author empty$ 'skip$ { extra.label "\bysame" = 'skip$ { begin.new.author } if$ } if$ "" before.all 'output.state := } FUNCTION {format.transliteration} { sort-author purify$ author purify$ = 'skip$ { author format.names output } if$ } FUNCTION {format.authors} { "" before.all 'output.state := sort-author empty$ 'skip$ 'format.transliteration if$ } FUNCTION {format.editors} { editor empty$ { "" } { editor format.names editor num.names$ #1 > { ", editors" * } { ", editor" * } if$ } if$ } % The format.title function is used for non-book-like titles. For % most styles we convert to lowercase (except for the very first % letter, and except for the first one after a colon (followed by % whitespace)), and hope the user has brace-surrounded words that need % to stay capitilized; for some styles, however, we leave it as it is % in the database. FUNCTION {format.title} { title empty$ { "" } { output.language.begin.group title "t" change.case$ output.language.end * * } if$ } % By default, BibTeX sets the global integer variable global.max$ to % the BibTeX constant glob_str_size, the maximum length of a global % string variable. Analogously, BibTeX sets the global integer % variable entry.max$ to ent_str_size, the maximum length of an entry % string variable. The style designer may change these if necessary % (but this is unlikely) % The n.dashify function makes each single `-' in a string a double % `--' if it's not already % % pseudoVAR: pageresult: STRING (it's what's accumulated on the % stack) % % n.dashify(s) == % BEGIN % t := s % pageresult := "" % while (not empty$(t)) % do % if (first character of t = "-") % then % if (next character isn't) % then % pageresult := pageresult * "--" % t := t with the "-" removed % else % while (first character of t = "-") % do % pageresult := pageresult * "-" % t := t with the "-" removed % od % fi % else % pageresult := pageresult * the first character % t := t with the first character removed % fi % od % return pageresult % END 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$ } % The format.date function is for the month and year, but we give a % warning if there's an empty year but the month is there, and we % return the empty string if they're both empty. FUNCTION {format.date} { year empty$ { month empty$ { "" } { "there's a month but no year in " cite$ * warning$ month } if$ } { month empty$ { subyear empty$ 'year { year subyear * } if$ } { month " " * year * subyear empty$ 'skip$ { subyear * } if$ } if$ } if$ } %%% ADD \bibitem HERE FUNCTION {format.year} { newline$ "\item[" year empty$ { "" } { subyear empty$ 'year { year subyear * } if$ } if$ "]" * * write$ newline$ write$ % output.language.begin before.all 'output.state := } %% FUNCTION {format.year} %% { year empty$ %% { "" } %% { subyear empty$ %% 'year %% { year subyear * } %% if$ %% } %% if$ %% } FUNCTION {format.month} { month empty$ { "" } 'month if$ } % The format.btitle is for formatting the title field when it is a % book-like entry---the style used here keeps it in uppers-and-lowers % and emphasizes it. FUNCTION {format.btitle} { output.language.begin title * emphasize } % For several functions we'll need to connect two strings with a tie % (~) if the second one isn't very long (fewer than 3 characters). % The tie.or.space.connect function does that. It concatenates the % two strings on top of the stack, along with either a tie or space % between them, and puts this concatenation back onto the stack: % % tie.or.space.connect(str1,str2) == % BEGIN % if text.length$(str2) < 3 % then return the concatenation of str1, "~", and str2 % else return the concatenation of str1, " ", and str2 % END FUNCTION {tie.or.space.connect} { duplicate$ text.length$ #3 < { "~" } { " " } if$ swap$ * * } % The either.or.check function complains if both fields or an % either-or pair are nonempty. % % either.or.check(t,s) == % BEGIN % if empty$(s) then % warning$(can't use both " * t * " fields in " * cite$) % fi % END FUNCTION {either.or.check} { empty$ 'pop$ { "can't use both " swap$ * " fields in " * cite$ * warning$ } if$ } % The format.bvolume function is for formatting the volume and perhaps % series name of a multivolume work. If both a volume and a series % field are there, we assume the series field is the title of the % whole multivolume work (the title field should be the title of the % thing being referred to), and we add an "of ". This % function is called in mid-sentence. FUNCTION {format.bvolume} { volume empty$ { "" } { "volume" volume tie.or.space.connect series empty$ 'skip$ { " of " * series emphasize * } if$ "volume and number" number either.or.check } if$ } % The format.number.series function is for formatting the series name % and perhaps number of a work in a series. This function is similar % to format.bvolume, although for this one the series must exist (and % the volume must not exist). If the number field is empty we output % either the series field unchanged if it exists or else the null % string. If both the number and series fields are there we assume % the series field gives the name of the whole series (the title field % should be the title of the work being one referred to), and we add % an "in ". We capitilize Number when this function is used % at the beginning of a block. FUNCTION {format.number.series} { volume empty$ { number empty$ { series field.or.null } { output.state mid.sentence = { "number" } { "Number" } if$ number tie.or.space.connect series empty$ { "there's a number but no series in " cite$ * warning$ } { " in " * series * } if$ } if$ } { "" } if$ } % The format.edition function appends " edition" to the edition, if % present. We lowercase the edition (it should be something like % "Third"), because this doesn't start a sentence. FUNCTION {format.edition} { edition empty$ { "" } { output.state mid.sentence = { edition "l" change.case$ " edition" * } { edition "t" change.case$ " edition" * } if$ } if$ } % The format.pages function is used for formatting a page range in a % book (and in rare circumstances, an article). % % The multi.page.check function examines the page field for a "-" or % "," or "+" so that format.pages can use "page" instead of "pages" if % none exists. Note: global.max$ here means "take the rest of the % string" % % VAR: multiresult: INTEGER (actually, a boolean) % % multi.page.check(s) == % BEGIN % t := s % multiresult := false % while ((not multiresult) and (not empty$(t))) % do % if (first character of t = "-" or "," or "+") % then multiresult := true % else t := t with the first character removed % fi % od % return multiresult % END 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 } % This function doesn't begin a sentence so "pages" isn't capitalized. % Other functions that use this should keep that in mind. FUNCTION {format.pages} { pages empty$ { "" } { pages multi.page.check { "pages" pages n.dashify tie.or.space.connect } { "page" pages tie.or.space.connect } if$ } if$ } % The format.vol.num.pages function is for the volume, number, and % page range of a journal article. We use the format: % vol(number):pages, with some variations for empty fields. This % doesn't begin a sentence. FUNCTION {format.vol.num.pages} { volume empty$ { number empty$ { "" } { "no.~" number * } if$ pages empty$ 'skip$ { duplicate$ empty$ { pop$ format.pages } { ":" * pages n.dashify * } if$ } if$ } { volume number empty$ 'skip$ { "(" number * ")" * * } if$ pages empty$ 'skip$ { ":" * pages n.dashify * } 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$ %% } % The format.chapter.pages, if the chapter is present, puts whatever % is in the type field (or else "chapter" if type is empty) in front % of a chapter number. It then appends the pages, if present. This % doesn't begin a sentence. FUNCTION {format.chapter.pages} { chapter empty$ 'format.pages { type empty$ { "chapter" } { type "l" change.case$ } if$ chapter tie.or.space.connect pages empty$ 'skip$ { ", " * format.pages * } if$ } if$ } % The format.in.ed.booktitle function is used for starting out a % sentence that begins "In ", putting an editor before the % title if one exists. FUNCTION {format.in.ed.booktitle} { booktitle empty$ { "" } { editor empty$ { "In " output.language.begin booktitle * emphasize * } { "In " format.editors * ", " * output.language.begin booktitle * emphasize * } if$ } if$ } % The function empty.misc.check complains if all six fields are empty, % and if there's been no sorting or alphabetic-label complaint. FUNCTION {empty.misc.check} { author empty$ title empty$ howpublished empty$ month empty$ year empty$ note empty$ and and and and and key empty$ not and { "all relevant fields are empty in " cite$ * warning$ } 'skip$ if$ } % The function format.thesis.type returns either the (case-changed) % type field, if it is defined, or else the default string already on % the stack (like "Master's thesis" or "PhD thesis"). FUNCTION {format.thesis.type} { type empty$ 'skip$ { pop$ type "t" change.case$ } if$ } % The function format.tr.number makes a string starting with % "Technical Report" (or type, if that field is defined), followed by % the number if there is one; it returns the starting part (with a % case change) even if there is no number. This is used at the % beginning of a sentence. FUNCTION {format.tr.number} { type empty$ { "Technical Report" } 'type if$ number empty$ { "t" change.case$ } { number tie.or.space.connect } if$ } FUNCTION {do.abstract} { abstract empty$ 'skip$ { "\beginbibabs" write$ newline$ abstract write$ newline$ "\endbibabs" write$ newline$ } if$ } % Now we define the type functions for all entry types that may appear % in the .BIB file---e.g., functions like `article' and `book'. These % are the routines that actually generate the .BBL-file output for the % entry. These must all precede the READ command. In addition, the % style designer should have a function `default.type' for unknown % types. Note: The fields (within each list) are listed in order of % appearance, except as described for an `inbook' or a `proceedings'. % % The article function is for an article in a journal. An article may % CROSSREF another article. % Required fields: author, title, journal, year % Optional fields: volume, number, pages, month, note % % The book function is for a whole book. A book may CROSSREF another % book. % Required fields: author or editor, title, publisher, year % Optional fields: volume or number, series, address, edition, % month, note % % The other entry functions are all quite similar, so no "comment % version" will be given for them. FUNCTION {article} { output.bibitem format.year %"year" output.check format.authors %"author" output.check new.block format.title "title" output.check new.block output.language.begin journal * emphasize "journal" output.check format.vol.num.pages output new.block publisher output address output new.block format.language * note output fin.entry do.abstract } % A bachelorsthesis is a Bachelor's thesis. MIT % Required: author, title, school, year % Optional: type, address, month, note FUNCTION {bachelorsthesis} { output.bibitem format.year %"year" output.check format.authors %"author" output.check new.block format.title "title" output.check new.block "Bachelor's thesis" format.thesis.type output.nonnull school "school" output.check address output format.month output new.block note output fin.entry do.abstract } FUNCTION {do.book} { output.bibitem format.year %"year" output.check author empty$ { format.editors "author and editor" output.check } { format.authors %output.nonnull % "author and editor" editor either.or.check } if$ new.block format.btitle "title" output.check format.bvolume output new.block format.number.series output new.sentence publisher "publisher" output.check address output format.edition output format.month output new.block format.language * note output fin.entry do.abstract } FUNCTION {book} { crossrefonly missing$ { do.book } { crossrefonly "1" = 'skip$ { do.book } if$ } if$ } %FUNCTION {book} %{ crossrefonly missing$ % { do.book } % { crossrefonly "1" = % { newline$ % "\ifusecrossrefs " write$ % do.book % "\fi " write$ % newline$ % } % { do.book } % if$ % } % if$ %} % A booklet is a bound thing without a publisher or sponsoring % institution. % Required: title % Optional: author, howpublished, address, month, year, note FUNCTION {booklet} { output.bibitem format.year %"year" output.check format.authors new.block format.title "title" output.check howpublished address new.block.checkb howpublished output address output format.month output new.block note output fin.entry do.abstract } % For the conference entry type, see inproceedings. % An inbook is a piece of a book: either a chapter and/or a page % range. It may CROSSREF a book. If there's no volume field, the % type field will come before number and series. % Required: author or editor, title, chapter and/or pages, % publisher, year % Optional: volume or number, series, type, address, edition, month, % note FUNCTION {inbook} { output.bibitem format.year %"year" output.check author empty$ { format.editors "author and editor" output.check } { format.authors %output.nonnull %"author and editor" editor either.or.check } if$ new.block format.btitle "title" output.check format.bvolume output format.chapter.pages "chapter and pages" output.check new.block format.number.series output new.sentence publisher "publisher" output.check address output format.edition output format.month output new.block format.language * note output fin.entry do.abstract } % An incollection is like inbook, but where there is a separate title % for the referenced thing (and perhaps an editor for the whole). An % incollection may CROSSREF a book. % Required: author, title, booktitle, publisher, year % Optional: editor, volume or number, series, type, chapter, pages, % address, edition, month, note FUNCTION {incollection} { output.bibitem format.year %"year" output.check format.authors %"author" output.check new.block format.title "title" output.check new.block format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.chapter.pages output new.sentence publisher "publisher" output.check address output format.edition output format.month output new.block format.language * note output fin.entry do.abstract } % An inproceedings is an article in a conference proceedings, and it % may CROSSREF a proceedings. If there's no address field, the month % (& year) will appear just before note. % Required: author, title, booktitle, year % Optional: editor, volume or number, series, pages, address, month, % organization, publisher, note FUNCTION {inproceedings} { output.bibitem format.year %"year" output.check format.authors %"author" output.check new.block format.title "title" output.check new.block format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.pages output address empty$ { organization publisher new.sentence.checkb organization output publisher output format.month output } { address output.nonnull format.month output new.sentence organization output publisher output } if$ new.block format.language * note output fin.entry do.abstract } % The conference function is included for Scribe compatibility. FUNCTION {conference} { inproceedings } % A manual is technical documentation. % Required: title % Optional: author, organization, address, edition, month, year, % note FUNCTION {manual} { output.bibitem format.year %"year" output.check author empty$ { organization empty$ 'skip$ { organization output.nonnull address output } if$ } { format.authors output.nonnull } if$ new.block format.btitle "title" output.check author empty$ { organization empty$ { address new.block.checka address output } 'skip$ if$ } { organization address new.block.checkb organization output address output } if$ format.edition output format.month output new.block note output fin.entry do.abstract } % A mastersthesis is a Master's thesis. % Required: author, title, school, year % Optional: type, address, month, note FUNCTION {mastersthesis} { output.bibitem format.year %"year" output.check format.authors %"author" output.check new.block format.title "title" output.check new.block "Master's thesis" format.thesis.type output.nonnull school "school" output.check address output format.month output new.block note output fin.entry do.abstract } % A misc is something that doesn't fit elsewhere. % Required: at least one of the `optional' fields % Optional: author, title, howpublished, month, year, note FUNCTION {misc} { output.bibitem format.year %"year" output.check format.authors title howpublished new.block.checkb format.title output howpublished new.block.checka howpublished output format.month output new.block format.language * note output fin.entry do.abstract empty.misc.check } % A phdthesis is like a mastersthesis. % Required: author, title, school, year % Optional: type, address, month, note FUNCTION {phdthesis} { output.bibitem format.year %"year" output.check format.authors %"author" output.check new.block format.btitle "title" output.check new.block "PhD thesis" format.thesis.type output.nonnull school "school" output.check address output format.month output new.block note output fin.entry do.abstract } % A proceedings is a conference proceedings. If there is an % organization but no editor field, the organization will appear as % the first optional field (we try to make the first block nonempty); % if there's no address field, the month (& year) will appear just % before note. % Required: title, year % Optional: editor, volume or number, series, address, month, % organization, publisher, note FUNCTION {do.proceedings} { output.bibitem editor empty$ { organization output } { format.editors output.nonnull } if$ format.year %"year" output new.block format.btitle "title" output.check format.bvolume output format.number.series output address empty$ { editor empty$ { publisher new.sentence.checka } { organization publisher new.sentence.checkb organization output } if$ publisher output format.month output } { address output.nonnull format.month output new.sentence editor empty$ 'skip$ { organization output } if$ publisher output } if$ new.block note output fin.entry do.abstract } FUNCTION {proceedings} { crossrefonly missing$ { do.proceedings } { crossrefonly "1" = 'skip$ { do.proceedings } if$ } if$ } % A techreport is a technical report. % Required: author, title, institution, year % Optional: type, number, address, month, note FUNCTION {techreport} { output.bibitem format.year %"year" output.check format.authors %"author" output.check new.block format.title "title" output.check new.block format.tr.number output.nonnull institution "institution" output.check address output format.month output new.block note output fin.entry do.abstract } % An unpublished is something that hasn't been published. % Required: author, title, note % Optional: month, year FUNCTION {unpublished} { output.bibitem format.year %"year" output.check format.authors %"author" output.check new.block format.title "title" output.check new.block note "note" output.check format.month output fin.entry do.abstract } % We use entry type `misc' for an unknown type; BibTeX gives a % warning. FUNCTION {default.type} { misc } % Here are macros for common things that may vary from style to style. % Users are encouraged to use these macros. % % Months are written out in full MACRO {jan} {"January"} MACRO {feb} {"February"} MACRO {mar} {"March"} MACRO {apr} {"April"} MACRO {may} {"May"} MACRO {jun} {"June"} MACRO {jul} {"July"} MACRO {aug} {"August"} MACRO {sep} {"September"} MACRO {oct} {"October"} MACRO {nov} {"November"} MACRO {dec} {"December"} % Journals are written out in full % % To get a completely different set of abbreviations, it may be best % to make a separate .bib file with nothing but those abbreviations; % users could then include that file name as the first argument to the % \bibliography command MACRO {aal} {"Algebra and Logic"} MACRO {aam} {"Advances in Applied Mathematics"} MACRO {acmcs} {"ACM Computing Surveys"} MACRO {acta} {"Acta Informatica"} MACRO {ai} {"Artificial Intelligence"} MACRO {ail} {"Algebra i Logika"} MACRO {algolb} {"ALGOL Bulletin"} MACRO {algor} {"Algorithmica"} MACRO {ama} {"Advances in Mathematics"} MACRO {apal} {"Annals of Pure and Applied Logic"} MACRO {archiv} {"Archiv Math. Logik Grundlagenforsch"} MACRO {cacm} {"Communications of the ACM"} MACRO {cee} {"Computers and Electrical Engineering"} MACRO {cmu} {"Carnegie-Mellon University"} MACRO {cma} {"Computers and Mathematics with Applications"} MACRO {comb} {"Combinatorica"} MACRO {comj} {"Computer Journal"} MACRO {comlan} {"Computer Languages"} MACRO {comnet} {"Computer Networks"} MACRO {cwi} {"Centrum voor Wiskunde en Informatica"} MACRO {discomgeom} {"Discrete and Computational Geometry"} MACRO {discomp} {"Distributed Computing"} MACRO {eatcs} {"Bulletin of the European Association for Theoretical Computer Science"} MACRO {i&comp} {"Information and Computation"} MACRO {iandcomp} {"Information and Computation"} MACRO {i&c} {"Information and Computation"} MACRO {iandc} {"Information and Control"} MACRO {ibmjrd} {"IBM Journal of Research and Development"} MACRO {ibmsj} {"IBM Systems Journal"} MACRO {icalp} {"International Colloquium on Automata, Languages, and Programming"} MACRO {ieeeit} {"IEEE Transactions on Information Theory"} MACRO {ieeese} {"IEEE Transactions on Software Engineering"} MACRO {ieeetc} {"IEEE Transactions on Computers"} MACRO {ieeetcad} {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} MACRO {ieeetpami} {"IEEE Transactions on Pattern Analysis and Machine Intelligence"} MACRO {ijpp} {"International Journal of Parallel Programming"} MACRO {ipl} {"Information Processing Letters"} MACRO {jacm} {"Journal of the ACM"} MACRO {jalg} {"Journal of Algorithms"} MACRO {jcss} {"Journal of Computer and System Sciences"} MACRO {jir} {"Journal of Irreproducible Results"} MACRO {jpdc} {"Journal of Parallel and Distributed Computing"} MACRO {jsc} {"Journal of Symbolic Computation"} MACRO {jsl} {"Journal of Symbolic Logic"} MACRO {jvlsics} {"Journal of VLSI and Computer Systems"} MACRO {lics} {"Logic in Computer Science"} MACRO {lncs} {"Lecture Notes in Computer Science"} MACRO {lnmath} {"Lecture Notes in Mathematics"} MACRO {mathprog} {"Mathematical Programming"} MACRO {mit} {"Mass\-a\-chu\-setts Insti\-tute of Tech\-no\-logy"} MACRO {mitai} {"MIT Artificial Intelligence Laboratory"} MACRO {miteecs} {"Department of Electrical Engineering and Computer Science, Mass\-a\-chu\-setts Insti\-tute of Tech\-no\-logy"} MACRO {mitlcs} {"MIT Laboratory for Computer Science"} MACRO {mitmath} {"Department of Mathematics, Mass\-a\-chu\-setts Insti\-tute of Tech\-no\-logy"} MACRO {mitp} {"MIT Press"} MACRO {mor} {"Mathematics of Operations Research"} MACRO {mst} {"Mathematical Systems Theory"} MACRO {networks} {"Networks"} MACRO {or} {"Operations Research"} MACRO {orl} {"Operations Research Letters"} MACRO {pieee} {"Proceedings of the IEEE"} MACRO {popl} {"Principles of Programming Languages"} MACRO {prentice} {"Prentice-Hall, Inc."} MACRO {scp} {"Science of Computer Programming"} MACRO {sicomp} {"SIAM Journal on Computing"} MACRO {siamjdm} {"SIAM Journal on Discrete Mathematics"} MACRO {siamr} {"SIAM Review"} MACRO {sigplan} {"ACM SIGPLAN Notices"} MACRO {slfm} {"Studies in Logic and the Foundations of Mathematics"} MACRO {sp&e} {"Software: Practice \& Experience"} MACRO {spande} {"Software: Practice \& Experience"} MACRO {tcs} {"Theoretical Computer Science"} MACRO {tocs} {"ACM Transactions on Computer Systems"} MACRO {tods} {"ACM Transactions on Database Systems"} MACRO {tog} {"ACM Transactions on Graphics"} MACRO {toms} {"ACM Transactions on Mathematical Software"} MACRO {toois} {"ACM Transactions on Office Information Systems"} MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} MACRO {utm} {"Undergraduate Texts in Mathematics"} MACRO {zmlgm} {"Zeitschrift f\accent'177 ur Mathematische Logik und Grundlagen der Mathematik"} % Now we read in the .BIB entries. READ % The sortify function converts to lower case after purify$ing; it's % used in sorting and in computing alphabetic labels after sorting % % The chop.word(w,len,s) function returns either s or, if the first % len letters of s equals w (this comparison is done in the third line % of the function's definition), it returns that part of s after w. 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$ } % When sorting, we compute the sortkey by executing "presort" on each % entry. The presort key contains a number of "sortify"ed strings, % concatenated with multiple blanks between them. This makes things % like "brinch per" come before "brinch hansen per". % % The fields used here are: the sort.label for alphabetic labels (as % set by calc.label), followed by the author names (or editor names or % organization (with a leading "The " removed) or key field, depending % on entry type and on what's empty), followed by year, followed by % the first bit of the title (chopping off a leading "The ", "A ", or % "An "). % % Names are formatted as: Von Last First Junior. % % The names within a part will be separated by a single blank (such as % "brinch hansen"), two will separate the name parts themselves % (except the von and last), three will separate the names, four will % separate the names from year (and from label, if alphabetic), and % four will separate year from title. % % The sort.format.names function takes an argument that should be in % BibTeX name format, and returns a string containing " "-separated % names in the format described above. The function is almost the % same as format.names. FUNCTION {sort.format.names} { 's := #1 'nameptr := "" s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { nameptr #1 > { " " * } 'skip$ if$ s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := nameptr numnames = t "others" = and { "et al" * } { t sortify * } if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } % The sort.format.title function returns the argument, but first any % leading "A "'s, "An "'s, or "The "'s are removed. The chop.word % function uses s, so we need another string variable, t FUNCTION {sort.format.title} { 't := "A " #2 "An " #3 "The " #4 t chop.word chop.word chop.word sortify #1 global.max$ substring$ } % The auxiliary functions here, for the presort function, are % analogous to the ones for calc.label; the same comments apply, % except that the organization field takes precedence here over the % key field. For sorting purposes, we still remove a leading "The " % from the organization field. FUNCTION {author.sort} { sort-author empty$ { author empty$ { key empty$ { "to sort, need author or key in " cite$ * warning$ "" } { key sortify } if$ } { author sort.format.names } if$ } { sort-author sort.format.names } if$ } FUNCTION {author.editor.sort} { sort-author empty$ { 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$ } { sort-author sort.format.names } if$ } FUNCTION {author.organization.sort} { sort-author empty$ { author empty$ { organization empty$ { key empty$ { "to sort, need author, organization, or key in " cite$ * warning$ "" } { key sortify } if$ } { "The " #4 organization chop.word sortify } if$ } { author sort.format.names } if$ } { sort-author sort.format.names } if$ } FUNCTION {editor.organization.sort} { editor empty$ { organization empty$ { key empty$ { "to sort, need editor, organization, or key in " cite$ * warning$ "" } { key sortify } if$ } { "The " #4 organization chop.word sortify } if$ } { editor sort.format.names } if$ } % There is a limit, entry.max$, on the length of an entry string % variable (which is what its sort.key$ is), so we take at most that % many characters of the constructed key, and hope there aren't many % references that match to that many characters! FUNCTION {presort} { sortgroup field.or.null " " * #1 #8 substring$ sortkey empty$ { type$ "book" = type$ "inbook" = or 'author.editor.sort { type$ "proceedings" = 'editor.organization.sort { type$ "manual" = 'author.organization.sort 'author.sort if$ } if$ } if$ } { sortkey sortify } if$ * " " * year field.or.null sortify * subyear empty$ 'skip$ { subyear * } if$ " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } ITERATE {presort} % And now we can sort SORT %% % Now comes the computation for numeric labels. %% % We use either the sorted order or original order. %% % We still have to keep track of the longest (in width$ terms) %% % label, for use by the "thebibliography" environment. %% %% STRINGS { longest.label } %% %% INTEGERS { number.label longest.label.width } %% %% FUNCTION {initialize.longest.label} %% { "" 'longest.label := %% #1 'number.label := %% #0 'longest.label.width := %% } %% %% FUNCTION {longest.label.pass} %% { number.label int.to.str$ 'label := %% number.label #1 + 'number.label := %% label width$ longest.label.width > %% { label 'longest.label := %% label width$ 'longest.label.width := %% } %% 'skip$ %% if$ %% } %% %% EXECUTE {initialize.longest.label} %% %% ITERATE {longest.label.pass} STRINGS { prev.author } FUNCTION {initialize.prev.author} { "abcxyz" 'prev.author := } FUNCTION {do.fix.authors} { sort-author empty$ { author purify$ prev.author = { "\bysame" 'extra.label := } { "" 'extra.label := author purify$ 'prev.author := } if$ } { sort-author purify$ prev.author = { "\bysame" 'extra.label := } { "" 'extra.label := sort-author purify$ 'prev.author := } if$ } if$ } FUNCTION {fix.authors} { crossrefonly missing$ 'do.fix.authors { type$ "proceedings" = crossrefonly "1" = and 'skip$ 'do.fix.authors if$ } if$ } EXECUTE {initialize.prev.author} ITERATE {fix.authors} FUNCTION {longest.label} { "00" } % Now we're ready to start writing the .BBL file. We begin, if % necessary, with a LaTeX macro for unnamed names in an alphabetic % label; next comes stuff from the `preamble' command in the database % files. Then we give an incantation containing the command % \begin{thebibliography}{...} % where the `...' is the longest label. % % We also call init.state.consts, for use by the output routines. FUNCTION {begin.bib} { preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ "\begin{thebibliography}" write$ newline$ #0 'beginning := } EXECUTE {begin.bib} EXECUTE {init.state.consts} % Now we produce the output for all the entries ITERATE {call.type$} % Finally, we finish up by writing the `\end{thebibliography}' command. FUNCTION {end.bib} { newline$ "\end{paperlist}" write$ newline$ newline$ "\end{thebibliography}" write$ newline$ } EXECUTE {end.bib}