From 0e477519feda29c45d815f3e5678019b39920fe7 Mon Sep 17 00:00:00 2001 From: Oscar Pocock Date: Fri, 11 Feb 2022 17:47:13 +0000 Subject: [PATCH] Added project outline --- docs/project-outline/IEEEannot.bst | 2655 +++++++++++++++++ docs/project-outline/IEEEannotU.bst | 2474 +++++++++++++++ docs/project-outline/authordate2annot.bst | 1364 +++++++++ docs/project-outline/mmp.bib | 111 + docs/project-outline/mmpv2.sty | 130 + docs/project-outline/project-outline-osp1.pdf | Bin 0 -> 74132 bytes docs/project-outline/project-outline-osp1.tex | 117 + {icon => img}/icon.png | Bin {icon => img}/icon.svg | 0 {icon => img}/icon.xcf | Bin 10 files changed, 6851 insertions(+) create mode 100644 docs/project-outline/IEEEannot.bst create mode 100644 docs/project-outline/IEEEannotU.bst create mode 100644 docs/project-outline/authordate2annot.bst create mode 100644 docs/project-outline/mmp.bib create mode 100644 docs/project-outline/mmpv2.sty create mode 100644 docs/project-outline/project-outline-osp1.pdf create mode 100644 docs/project-outline/project-outline-osp1.tex rename {icon => img}/icon.png (100%) rename {icon => img}/icon.svg (100%) rename {icon => img}/icon.xcf (100%) diff --git a/docs/project-outline/IEEEannot.bst b/docs/project-outline/IEEEannot.bst new file mode 100644 index 0000000..9a9d760 --- /dev/null +++ b/docs/project-outline/IEEEannot.bst @@ -0,0 +1,2655 @@ +%% +%% IEEEannot.bst +%% BibTeX Bibliography Style file +%% Sorting version of IEEEtran.bst +%% *** Not for use with work to be submitted to the IEEE *** +%% Version 1.11 (2003/04/02) +%% +%% Copyright (c) 2003 Michael Shell +%% +%% Modified by Titus Barik (titus@barik.net) to support annotated +%% bibliographies in IEEE citation format. Renamed to IEEEannot.bst. +%% The latest version of IEEEannot can always be downloaded at: +%% +%% http://www.barik.net/sw/ieee/ +%% +%% This version of IEEEannot is: 2004-15-02 +%% +%% Original starting code base and algorithms obtained from the output of +%% Patrick W. Daly's makebst package as well as from prior versions of +%% IEEE BibTeX styles: +%% +%% 1. Howard Trickey and Oren Patashnik's ieeetr.bst (1985/1988) +%% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993) +%% +%% Added sorting code is from plain.bst. +%% +%% Updated Legal Notice to provide updated URL for Perl Artistic License. +%% 1st March 2017. Neil Taylor (nst@aber.ac.uk) +%% +%% See: +%% http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/ +%% for latest version and current contact information. +%% +%% For use with BibTeX version 0.99a or later +%% +%% This is a numerical citation style. +%% +%%********************************************************************** +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall IEEE or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% This code is distributed under the Perl Artistic License +%% ( http://dev.perl.org/licenses/artistic.html ) +%% and may be freely used, distributed and modified - subject to the +%% constraints therein. +%% Retain all contribution notices, credits and disclaimers. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE. +%%********************************************************************** +% +% +% Changelog: +% +% 1.10 (2002/09/27) Initial release +% +% 1.11 (2003/04/02) +% 1. Fixed bug with URLs containing underscores when using url.sty. Thanks +% to Ming Kin Lai for reporting this. + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% These are the defaults for the user adjustable controls. The values used +% here can be overridden by the user via IEEEtranBSTCTL entry type. + +% NOTE: The recommended LaTeX command to invoke a control entry type is: +% +%\makeatletter +%\def\bstctlcite#1{\@bsphack +% \@for\@citeb:=#1\do{% +% \edef\@citeb{\expandafter\@firstofone\@citeb}% +% \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi}% +% \@esphack} +%\makeatother +% +% It is called at the start of the document, before the first \cite, like: +% \bstctlcite{IEEEexample:BSTcontrol} +% +% IEEEtran.cls V1.6 and later does provide this command. + + + +% #0 turns off the display of the number for articles. +% #1 enables +FUNCTION {default.is.use.number.for.article} { #1 } + + +% #0 turns off the display of the paper and type fields in @inproceedings. +% #1 enables +FUNCTION {default.is.use.paper} { #1 } + + +% #0 turns off the forced use of "et al." +% #1 enables +FUNCTION {default.is.forced.et.al} { #0 } + +% The maximum number of names that can be present beyond which an "et al." +% usage is forced. Be sure that num.names.shown.with.forced.et.al (below) +% is not greater than this value! +% Note: There are many instances of references in IEEE journals which have +% a very large number of authors as well as instances in which "et al." is +% used profusely. +FUNCTION {default.max.num.names.before.forced.et.al} { #10 } + +% The number of names that will be shown with a forced "et al.". +% Must be less than or equal to max.num.names.before.forced.et.al +FUNCTION {default.num.names.shown.with.forced.et.al} { #1 } + + +% #0 turns off the alternate interword spacing for entries with URLs. +% #1 enables +FUNCTION {default.is.use.alt.interword.spacing} { #1 } + +% If alternate interword spacing for entries with URLs is enabled, this is +% the interword spacing stretch factor that will be used. For example, the +% default "4" here means that the interword spacing in entries with URLs can +% stretch to four times normal. Does not have to be an integer. Note that +% the value specified here can be overridden by the user in their LaTeX +% code via a command such as: +% "\providecommand\BIBentryALTinterwordstretchfactor{1.5}" in addition to +% that via the IEEEtranBSTCTL entry type. +FUNCTION {default.ALTinterwordstretchfactor} { "4" } + + +% #0 turns off the "dashification" of repeated (i.e., identical to those +% of the previous entry) names. IEEE normally does this. +% #1 enables +FUNCTION {default.is.dash.repeated.names} { #1 } + + +% The default name format control string. +FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" } + + +% The default LaTeX font command for the names. +FUNCTION {default.name.latex.cmd}{ "" } + + +% Other controls that cannot be accessed via IEEEtranBSTCTL entry type. + +% #0 turns off the terminal startup banner/completed message so as to +% operate more quietly. +% #1 enables +FUNCTION {is.print.banners.to.terminal} { #1 } + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% FILE VERSION AND BANNER %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION{bst.file.version} { "1.11" } +FUNCTION{bst.file.date} { "2003/04/02" } +FUNCTION{bst.file.website} { "http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/" } + +FUNCTION {banner.message} +{ is.print.banners.to.terminal + { "-- IEEEtranS.bst version" " " * bst.file.version * + " (" * bst.file.date * ") " * "by Michael Shell." * + top$ + "-- " bst.file.website * + top$ + "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * " manual for usage information." * + top$ + "** Sorting version - not for use with work to be submitted to the IEEE." + top$ + } + { skip$ } + if$ +} + +FUNCTION {completed.message} +{ is.print.banners.to.terminal + { "" + top$ + "Done." + top$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING CONSTANTS %% +%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {bbl.and}{ "and" } +FUNCTION {bbl.etal}{ "et~al." } +FUNCTION {bbl.editors}{ "eds." } +FUNCTION {bbl.editor}{ "ed." } +FUNCTION {bbl.edition}{ "ed." } +FUNCTION {bbl.volume}{ "vol." } +FUNCTION {bbl.of}{ "of" } +FUNCTION {bbl.number}{ "no." } +FUNCTION {bbl.in}{ "in" } +FUNCTION {bbl.pages}{ "pp." } +FUNCTION {bbl.page}{ "p." } +FUNCTION {bbl.chapter}{ "ch." } +FUNCTION {bbl.paper}{ "paper" } +FUNCTION {bbl.part}{ "pt." } +FUNCTION {bbl.patent}{ "Patent" } +FUNCTION {bbl.patentUS}{ "U.S." } +FUNCTION {bbl.revision}{ "Rev." } +FUNCTION {bbl.series}{ "ser." } +FUNCTION {bbl.standard}{ "Std." } +FUNCTION {bbl.techrep}{ "Tech. Rep." } +FUNCTION {bbl.mthesis}{ "Master's thesis" } +FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" } +FUNCTION {bbl.urlprefix}{ "[Online]. Available:" } +FUNCTION {bbl.st}{ "st" } +FUNCTION {bbl.nd}{ "nd" } +FUNCTION {bbl.rd}{ "rd" } +FUNCTION {bbl.th}{ "th" } + + +% This is the LaTeX spacer that is used when a larger than normal space +% is called for (such as just before the address:publisher). +FUNCTION {large.space} { "\hskip 1em plus 0.5em minus 0.4em\relax " } + +% The LaTeX code for dashes that are used to represent repeated names. +% Note: Some older IEEE journals used something like +% "\rule{0.275in}{0.5pt}\," which is fairly thick and runs right along +% the baseline. However, IEEE now uses a thinner, above baseline, +% six dash long sequence. +FUNCTION {repeated.name.dashes} { "------" } + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% PREDEFINED STRING MACROS %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MACRO {jan} {"Jan."} +MACRO {feb} {"Feb."} +MACRO {mar} {"Mar."} +MACRO {apr} {"Apr."} +MACRO {may} {"May"} +MACRO {jun} {"June"} +MACRO {jul} {"July"} +MACRO {aug} {"Aug."} +MACRO {sep} {"Sept."} +MACRO {oct} {"Oct."} +MACRO {nov} {"Nov."} +MACRO {dec} {"Dec."} + + + +%%%%%%%%%%%%%%%%%% +%% ENTRY FIELDS %% +%%%%%%%%%%%%%%%%%% + +ENTRY + { + address + annote + assignee + author + booktitle + chapter + day + dayfiled + edition + editor + howpublished + institution + intype + isbn + journal + key + language + month + monthfiled + nationality + note + number + organization + pages + paper + publisher + school + series + revision + title + type + url + volume + year + yearfiled + CTLuse_article_number + CTLuse_paper + CTLuse_forced_etal + CTLmax_names_forced_etal + CTLnames_show_etal + CTLuse_alt_spacing + CTLalt_stretch_factor + CTLdash_repeated_names + CTLname_format_string + CTLname_latex_cmd + } + {} + { label } + + + + +%%%%%%%%%%%%%%%%%%%%%%% +%% INTEGER VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%%% + +INTEGERS { prev.status.punct this.status.punct punct.std + punct.no punct.comma punct.period + prev.status.space this.status.space space.std + space.no space.normal space.large + prev.status.quote this.status.quote quote.std + quote.no quote.close + prev.status.nline this.status.nline nline.std + nline.no nline.newblock + status.cap cap.std + cap.no cap.yes} + +INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames } + +INTEGERS { is.use.number.for.article + is.use.paper + is.forced.et.al + max.num.names.before.forced.et.al + num.names.shown.with.forced.et.al + is.use.alt.interword.spacing + is.dash.repeated.names} + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%% + +STRINGS { bibinfo + longest.label + oldname + s + t + ALTinterwordstretchfactor + name.format.string + name.latex.cmd} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOW LEVEL FUNCTIONS %% +%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.controls} +{ default.is.use.number.for.article 'is.use.number.for.article := + default.is.use.paper 'is.use.paper := + default.is.forced.et.al 'is.forced.et.al := + default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al := + default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al := + default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing := + default.is.dash.repeated.names 'is.dash.repeated.names := + default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor := + default.name.format.string 'name.format.string := + default.name.latex.cmd 'name.latex.cmd := +} + + +% This IEEEtran.bst features a very powerful and flexible mechanism for +% controlling the capitalization, punctuation, spacing, quotation, and +% newlines of the formatted entry fields. (Note: IEEEtran.bst does not need +% or use the newline/newblock feature, but it has been implemented for +% possible future use.) The output states of IEEEtran.bst consist of +% multiple independent attributes and, as such, can be thought of as being +% vectors, rather than the simple scalar values ("before.all", +% "mid.sentence", etc.) used in most other .bst files. +% +% The more flexible and complex design used here was motivated in part by +% IEEE's rather unusual bibliography style. For example, IEEE ends the +% previous field item with a period and large space prior to the publisher +% address; the @electronic entry types use periods as inter-item punctuation +% rather than the commas used by the other entry types; and URLs are never +% followed by periods even though they are the last item in the entry. +% Although it is possible to accommodate these features with the conventional +% output state system, the seemingly endless exceptions make for convoluted, +% unreliable and difficult to maintain code. +% +% IEEEtran.bst's output state system can be easily understood via a simple +% illustration of two most recently formatted entry fields (on the stack): +% +% CURRENT_ITEM +% "PREVIOUS_ITEM +% +% which, in this example, is to eventually appear in the bibliography as: +% +% "PREVIOUS_ITEM," CURRENT_ITEM +% +% It is the job of the output routine to take the previous item off of the +% stack (while leaving the current item at the top of the stack), apply its +% trailing punctuation (including closing quote marks) and spacing, and then +% to write the result to BibTeX's output buffer: +% +% "PREVIOUS_ITEM," +% +% Punctuation (and spacing) between items is often determined by both of the +% items rather than just the first one. The presence of quotation marks +% further complicates the situation because, in standard English, trailing +% punctuation marks are supposed to be contained within the quotes. +% +% IEEEtran.bst maintains two output state (aka "status") vectors which +% correspond to the previous and current (aka "this") items. Each vector +% consists of several independent attributes which track punctuation, +% spacing, quotation, and newlines. Capitalization status is handled by a +% separate scalar because the format routines, not the output routine, +% handle capitalization and, therefore, there is no need to maintain the +% capitalization attribute for both the "previous" and "this" items. +% +% When a format routine adds a new item, it copies the current output status +% vector to the previous output status vector and (usually) resets the +% current (this) output status vector to a "standard status" vector. Using a +% "standard status" vector in this way allows us to redefine what we mean by +% "standard status" at the start of each entry handler and reuse the same +% format routines under the various inter-item separation schemes. For +% example, the standard status vector for the @book entry type may use +% commas for item separators, while the @electronic type may use periods, +% yet both entry handlers exploit many of the exact same format routines. +% +% Because format routines have write access to the output status vector of +% the previous item, they can override the punctuation choices of the +% previous format routine! Therefore, it becomes trivial to implement rules +% such as "Always use a period and a large space before the publisher." By +% pushing the generation of the closing quote mark to the output routine, we +% avoid all the problems caused by having to close a quote before having all +% the information required to determine what the punctuation should be. +% +% The IEEEtran.bst output state system can easily be expanded if needed. +% For instance, it is easy to add a "space.tie" attribute value if the +% bibliography rules mandate that two items have to be joined with an +% unbreakable space. + +% Titus Barik Annotation Addition + +% annotation addition +FUNCTION {format.annotate} +{ annote empty$ + { "" } + { " \begin{quotation}\noindent " + annote + * " \end{quotation} " * + } + if$ +} + + +FUNCTION {initialize.status.constants} +{ #0 'punct.no := + #1 'punct.comma := + #2 'punct.period := + #0 'space.no := + #1 'space.normal := + #2 'space.large := + #0 'quote.no := + #1 'quote.close := + #0 'cap.no := + #1 'cap.yes := + #0 'nline.no := + #1 'nline.newblock := +} + +FUNCTION {std.status.using.comma} +{ punct.comma 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.no 'cap.std := +} + +FUNCTION {std.status.using.period} +{ punct.period 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.yes 'cap.std := +} + +FUNCTION {initialize.prev.this.status} +{ punct.no 'prev.status.punct := + space.no 'prev.status.space := + quote.no 'prev.status.quote := + nline.no 'prev.status.nline := + punct.no 'this.status.punct := + space.no 'this.status.space := + quote.no 'this.status.quote := + nline.no 'this.status.nline := + cap.yes 'status.cap := +} + +FUNCTION {this.status.std} +{ punct.std 'this.status.punct := + space.std 'this.status.space := + quote.std 'this.status.quote := + nline.std 'this.status.nline := +} + +FUNCTION {cap.status.std}{ cap.std 'status.cap := } + +FUNCTION {this.to.prev.status} +{ this.status.punct 'prev.status.punct := + this.status.space 'prev.status.space := + this.status.quote 'prev.status.quote := + this.status.nline 'prev.status.nline := +} + + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ { skip$ } + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + { skip$ } + if$ +} + + +% convert the strings "yes" or "no" to #1 or #0 respectively +FUNCTION {yes.no.to.int} +{ "l" change.case$ duplicate$ + "yes" = + { pop$ #1 } + { duplicate$ "no" = + { pop$ #0 } + { "unknown boolean " quote$ * swap$ * quote$ * + " in " * cite$ * warning$ + #0 + } + if$ + } + if$ +} + + +% pushes true if the single char string on the stack is in the +% range of "0" to "9" +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +% multiplies the integer on the stack by a factor of 10 +FUNCTION {bump.int.mag} +{ #0 'multiresult := + { duplicate$ #0 > } + { #1 - + multiresult #10 + + 'multiresult := + } + while$ +pop$ +multiresult +} + +% converts a single character string on the stack to an integer +FUNCTION {char.to.integer} +{ duplicate$ + is.num + { chr.to.int$ "0" chr.to.int$ - } + {"noninteger character " quote$ * swap$ * quote$ * + " in integer field of " * cite$ * warning$ + #0 + } + if$ +} + +% converts a string on the stack to an integer +FUNCTION {string.to.integer} +{ duplicate$ text.length$ 'namesleft := + #1 'nameptr := + #0 'numnames := + { nameptr namesleft > not } + { duplicate$ nameptr #1 substring$ + char.to.integer numnames bump.int.mag + + 'numnames := + nameptr #1 + + 'nameptr := + } + while$ +pop$ +numnames +} + + + + +% The output routines write out the *next* to the top (previous) item on the +% stack, adding punctuation and such as needed. Since IEEEtran.bst maintains +% the output status for the top two items on the stack, these output +% routines have to consider the previous output status (which corresponds to +% the item that is being output). Full independent control of punctuation, +% closing quote marks, spacing, and newblock is provided. +% +% "output.nonnull" does not check for the presence of a previous empty +% item. +% +% "output" does check for the presence of a previous empty item and will +% remove an empty item rather than outputing it. +% +% "output.warn" is like "output", but will issue a warning if it detects +% an empty item. + +FUNCTION {output.nonnull} +{ swap$ + prev.status.punct punct.comma = + { "," * } + { skip$ } + if$ + prev.status.punct punct.period = + { add.period$ } + { skip$ } + if$ + prev.status.quote quote.close = + { "''" * } + { skip$ } + if$ + prev.status.space space.normal = + { " " * } + { skip$ } + if$ + prev.status.space space.large = + { large.space * } + { skip$ } + if$ + write$ + prev.status.nline nline.newblock = + { newline$ "\newblock " write$ } + { skip$ } + if$ +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.warn} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +% "fin.entry" is the output routine that handles the last item of the entry +% (which will be on the top of the stack when "fin.entry" is called). + +FUNCTION {fin.entry} +{ this.status.punct punct.no = + { skip$ } + { add.period$ } + if$ + this.status.quote quote.close = + { "''" * } + { skip$ } + if$ +write$ +newline$ +} + + +FUNCTION {is.last.char.not.punct} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {is.multiple.pages} +{ '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 +} + +FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ } + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} + +FUNCTION {do.name.latex.cmd} +{ name.latex.cmd + empty$ + { skip$ } + { name.latex.cmd "{" * swap$ * "}" * } + if$ +} + +% IEEEtran.bst uses its own \BIBforeignlanguage command which directly +% invokes the TeX hyphenation patterns without the need of the Babel +% package. Babel does a lot more than switch hyphenation patterns and +% its loading can cause unintended effects in many class files (such as +% IEEEtran.cls). +FUNCTION {select.language} +{ duplicate$ empty$ 'pop$ + { language empty$ 'skip$ + { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {space.word}{ " " swap$ * " " * } + + +% Field Conditioners, Converters, Checkers and External Interfaces + +FUNCTION {empty.field.to.null.string} +{ duplicate$ empty$ + { pop$ "" } + { skip$ } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + { pop$ } + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {empty.entry.warn} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ url empty$ + and and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + + +% The bibinfo system provides a way for the electronic parsing/acquisition +% of a bibliography's contents as is done by ReVTeX. For example, a field +% could be entered into the bibliography as: +% \bibinfo{volume}{2} +% Only the "2" would show up in the document, but the LaTeX \bibinfo command +% could do additional things with the information. IEEEtran.bst does provide +% a \bibinfo command via "\providecommand{\bibinfo}[2]{#2}". However, it is +% currently not used as the bogus bibinfo functions defined here output the +% entry values directly without the \bibinfo wrapper. The bibinfo functions +% themselves (and the calls to them) are retained for possible future use. +% +% bibinfo.check avoids acting on missing fields while bibinfo.warn will +% issue a warning message if a missing field is detected. Prior to calling +% the bibinfo functions, the user should push the field value and then its +% name string, in that order. + +FUNCTION {bibinfo.check} +{ swap$ duplicate$ missing$ + { pop$ pop$ "" } + { duplicate$ empty$ + { swap$ pop$ } + { swap$ pop$ } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ duplicate$ missing$ + { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } + { duplicate$ empty$ + { swap$ "empty " swap$ * " in " * cite$ * warning$ } + { swap$ pop$ } + if$ + } + if$ +} + + +% IEEE separates large numbers with more than 4 digits into groups of +% three. IEEE uses a small space to separate these number groups. +% Typical applications include patent and page numbers. + +% number of consecutive digits required to trigger the group separation. +FUNCTION {large.number.trigger}{ #5 } + +% For numbers longer than the trigger, this is the blocksize of the groups. +% The blocksize must be less than the trigger threshold, and 2 * blocksize +% must be greater than the trigger threshold (can't do more than one +% separation on the initial trigger). +FUNCTION {large.number.blocksize}{ #3 } + +% What is actually inserted between the number groups. +FUNCTION {large.number.separator}{ "\," } + +% So as to save on integer variables by reusing existing ones, numnames +% holds the current number of consecutive digits read and nameptr holds +% the number that will trigger an inserted space. +FUNCTION {large.number.separate} +{ 't := + "" + #0 'numnames := + large.number.trigger 'nameptr := + { t empty$ not } + { t #-1 #1 substring$ is.num + { numnames #1 + 'numnames := } + { #0 'numnames := + large.number.trigger 'nameptr := + } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames nameptr = + { duplicate$ #1 nameptr large.number.blocksize - substring$ swap$ + nameptr large.number.blocksize - #1 + global.max$ substring$ + large.number.separator swap$ * * + nameptr large.number.blocksize - 'numnames := + large.number.blocksize #1 + 'nameptr := + } + { skip$ } + if$ + } + while$ +} + +% Converts all single dashes "-" to double dashes "--". +FUNCTION {n.dashify} +{ large.number.separate + '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$ +} + + +% This function detects entries with names that are identical to that of +% the previous entry and replaces the repeated names with dashes (if the +% "is.dash.repeated.names" user control is nonzero). +FUNCTION {name.or.dash} +{ 's := + oldname empty$ + { s 'oldname := s } + { s oldname = + { is.dash.repeated.names + { repeated.name.dashes } + { s 'oldname := s } + if$ + } + { s 'oldname := s } + if$ + } + if$ +} + +% Converts the number string on the top of the stack to +% "numerical ordinal form" (e.g., "7" to "7th"). There is +% no artificial limit to the upper bound of the numbers as the +% least significant digit always determines the ordinal form. +FUNCTION {num.to.ordinal} +{ duplicate$ #-1 #1 substring$ "1" = + { bbl.st * } + { duplicate$ #-1 #1 substring$ "2" = + { bbl.nd * } + { duplicate$ #-1 #1 substring$ "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ +} + +% If the string on the top of the stack begins with a number, +% (e.g., 11th) then replace the string with the leading number +% it contains. Otherwise retain the string as-is. s holds the +% extracted number, t holds the part of the string that remains +% to be scanned. +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +% Converts the word number string on the top of the stack to +% Arabic string form. Will be successful up to "tenth". +FUNCTION {word.to.num} +{ duplicate$ "l" change.case$ 's := + s "first" = + { pop$ "1" } + { skip$ } + if$ + s "second" = + { pop$ "2" } + { skip$ } + if$ + s "third" = + { pop$ "3" } + { skip$ } + if$ + s "fourth" = + { pop$ "4" } + { skip$ } + if$ + s "fifth" = + { pop$ "5" } + { skip$ } + if$ + s "sixth" = + { pop$ "6" } + { skip$ } + if$ + s "seventh" = + { pop$ "7" } + { skip$ } + if$ + s "eighth" = + { pop$ "8" } + { skip$ } + if$ + s "ninth" = + { pop$ "9" } + { skip$ } + if$ + s "tenth" = + { pop$ "10" } + { skip$ } + if$ +} + + +% Converts the string on the top of the stack to numerical +% ordinal (e.g., "11th") form. +FUNCTION {convert.edition} +{ duplicate$ empty$ 'skip$ + { duplicate$ #1 #1 substring$ is.num + { extract.num + num.to.ordinal + } + { word.to.num + duplicate$ #1 #1 substring$ is.num + { num.to.ordinal } + { "edition ordinal word " quote$ * edition * quote$ * + " may be too high (or improper) for conversion" * " in " * cite$ * warning$ + } + if$ + } + if$ + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LATEX BIBLIOGRAPHY CODE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {start.entry} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + initialize.prev.this.status +} + +% Here we write out all the LaTeX code that we will need. The most involved +% code sequences are those that control the alternate interword spacing and +% foreign language hyphenation patterns. The heavy use of \providecommand +% gives users a way to override the defaults. Special thanks to Javier Bezos, +% Johannes Braams, Robin Fairburns, Heiko Oberdiek, Donald Arseneau and all +% the other gurus on comp.text.tex for their help and advice on the topic of +% \selectlanguage, Babel and BibTeX. +FUNCTION {begin.bib} +{ preamble$ empty$ 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{#1}" + write$ newline$ + "\csname url@rmstyle\endcsname" + write$ newline$ + "\providecommand{\newblock}{\relax}" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ + "\providecommand\BIBentrySTDinterwordspacing{\spaceskip=0pt\relax}" + write$ newline$ + "\providecommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + "\providecommand\BIBentryALTinterwordspacing{\spaceskip=\fontdimen2\font plus " + write$ newline$ + "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}" + write$ newline$ + "\providecommand\BIBforeignlanguage[2]{{%" + write$ newline$ + "\expandafter\ifx\csname l@#1\endcsname\relax" + write$ newline$ + "\typeout{** WARNING: IEEEtran.bst: No hyphenation pattern has been}%" + write$ newline$ + "\typeout{** loaded for the language `#1'. Using the pattern for}%" + write$ newline$ + "\typeout{** the default language instead.}%" + write$ newline$ + "\else" + write$ newline$ + "\language=\csname l@#1\endcsname" + write$ newline$ + "\fi" + write$ newline$ + "#2}}" + write$ newline$ +} + +FUNCTION {end.bib} +{ newline$ "\end{thebibliography}" write$ newline$ } + +FUNCTION {if.url.alt.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + +FUNCTION {if.url.std.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%% +%% LONGEST LABEL PASS %% +%%%%%%%%%%%%%%%%%%%%%%%% + +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$ +} + + + + +%%%%%%%%%%%%%%%%%%%%% +%% FORMAT HANDLERS %% +%%%%%%%%%%%%%%%%%%%%% + +%% Lower Level Formats (used by higher level formats) + +FUNCTION {format.address.org.or.pub.date} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + { skip$ } + if$ + address empty$ t empty$ and + year empty$ and month empty$ and + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + address "address" bibinfo.check * + t empty$ + { skip$ } + { punct.period 'prev.status.punct := + space.large 'prev.status.space := + address empty$ + { skip$ } + { ": " * } + if$ + t * + } + if$ + year empty$ month empty$ and + { skip$ } + { t empty$ address empty$ and + { skip$ } + { ", " * } + if$ + month empty$ + { year empty$ + { skip$ } + { year "year" bibinfo.check * } + if$ + } + { month "month" bibinfo.check * + year empty$ + { skip$ } + { " " * year "year" bibinfo.check * } + if$ + } + if$ + } + if$ + } + if$ +} + + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + this.to.prev.status + this.status.std + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + name.format.string + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { nameptr num.names.shown.with.forced.et.al #1 + = + numnames max.num.names.before.forced.et.al > + is.forced.et.al and and + { "others" 't := + #1 'namesleft := + } + { skip$ } + if$ + namesleft #1 > + { ", " * t do.name.latex.cmd * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal emphasize * + } + { + bbl.and + space.word * t do.name.latex.cmd * + } + if$ + } + if$ + } + { t do.name.latex.cmd } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + cap.status.std + } if$ +} + + + + +%% Higher Level Formats + +%% addresses/locations + +FUNCTION {format.address} +{ address duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% author/editor names + +FUNCTION {format.authors}{ author "author" format.names } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { ", " * + get.bbl.editor + capitalize + * + } + if$ +} + + + +%% date + +FUNCTION {format.date} +{ + month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { this.to.prev.status + this.status.std + cap.status.std + swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ +} + +FUNCTION {format.date.electronic} +{ month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ + { pop$ } + { "there's a month but no year in " cite$ * warning$ + pop$ ")" * "(" swap$ * + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ + } + { swap$ + { swap$ pop$ ")" * "(" swap$ * } + { "(" swap$ * ", " * swap$ * ")" * } + if$ + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ +} + + + +%% edition/title + +% Note: IEEE considers the edition to be closely associated with +% the title of a book. So, in IEEEtran.bst the edition is normally handled +% within the formatting of the title. The format.edition function is +% retained here for possible future use. +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + convert.edition + status.cap + { "t" } + { "l" } + if$ change.case$ + "edition" bibinfo.check + "~" * bbl.edition * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of a conference proceedings. +% Here we use the "intype" field to provide the user a way to +% override the word "in" (e.g., with things like "presented at") +% Use of intype stops the emphasis of the booktitle to indicate that +% we no longer mean the written conference proceedings, but the +% conference itself. +FUNCTION {format.in.booktitle} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + intype missing$ + { emphasize + bbl.in " " * + } + { intype " " * } + if$ + swap$ * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of collection. +% Here the "intype" field is not supported, but "edition" is. +FUNCTION {format.in.booktitle.edition} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + "l" change.case$ + * "~" * bbl.edition * + } + if$ + bbl.in " " * swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { quote.close 'this.status.quote := + is.last.char.not.punct + { punct.std 'this.status.punct := } + { punct.no 'this.status.punct := } + if$ + select.language + "``" swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title.electronic} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ + { skip$ } + { select.language } + if$ +} + +FUNCTION {format.book.title.edition} +{ title "title" bibinfo.check + duplicate$ empty$ + { "empty title in " cite$ * warning$ } + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + status.cap + { "t" } + { "l" } + if$ + change.case$ + * "~" * bbl.edition * + } + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.book.title} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% journal + +FUNCTION {format.journal} +{ journal duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% how published + +FUNCTION {format.howpublished} +{ howpublished duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% institutions/organization/publishers/school + +FUNCTION {format.institution} +{ institution duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.organization} +{ organization duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.address.publisher.date} +{ publisher "publisher" bibinfo.warn format.address.org.or.pub.date } + +FUNCTION {format.address.publisher.date.nowarn} +{ publisher "publisher" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.address.organization.date} +{ organization "organization" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.school} +{ school duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% volume/number/series/chapter/pages + +FUNCTION {format.volume} +{ volume empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + bbl.volume + status.cap + { capitalize } + { skip$ } + if$ + swap$ tie.or.space.prefix + "volume" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number} +{ number empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + status.cap + { bbl.number capitalize } + { bbl.number } + if$ + swap$ tie.or.space.prefix + "number" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number.if.use.for.article} +{ is.use.number.for.article + { format.number } + { "" } + if$ +} + +% IEEE does not seem to tie the series so closely with the volume +% and number as is done in other bibliography styles. Instead the +% series is treated somewhat like an extension of the title. +FUNCTION {format.series} +{ series empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.series " " * + series "series" bibinfo.check * + cap.status.std + } + if$ +} + + +FUNCTION {format.chapter} +{ chapter empty$ + { "" } + { this.to.prev.status + this.status.std + type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + cap.status.std + } + if$ +} + + +% The intended use of format.paper is for paper numbers of inproceedings. +% The paper type can be overridden via the type field. +% We allow the type to be displayed even if the paper number is absent +% for things like "postdeadline paper" +FUNCTION {format.paper} +{ is.use.paper + { paper empty$ + { type empty$ + { "" } + { this.to.prev.status + this.status.std + type "type" bibinfo.check + cap.status.std + } + if$ + } + { this.to.prev.status + this.status.std + type empty$ + { bbl.paper } + { type "type" bibinfo.check } + if$ + " " * paper + "paper" bibinfo.check + * + cap.status.std + } + if$ + } + { "" } + if$ +} + + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + duplicate$ is.multiple.pages + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + cap.status.std + } + if$ +} + + + +%% technical report number + +FUNCTION {format.tech.report.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ + this.to.prev.status + this.status.std + cap.status.std + bbl.techrep + } + { skip$ } + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ } + { this.to.prev.status + this.status.std + cap.status.std + tie.or.space.prefix * * } + if$ +} + +%% isbn + +FUNCTION {format.isbn} +{ isbn empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + isbn #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + isbn #2 global.max$ substring$ * "isbn" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + +%% note + +FUNCTION {format.note} +{ note empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + note #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + + +%% patent + +FUNCTION {format.patent.date} +{ this.to.prev.status + this.status.std + year empty$ + { monthfiled duplicate$ empty$ + { "monthfiled" bibinfo.check pop$ "" } + { "monthfiled" bibinfo.check } + if$ + dayfiled duplicate$ empty$ + { "dayfiled" bibinfo.check pop$ "" * } + { "dayfiled" bibinfo.check + monthfiled empty$ + { "dayfiled without a monthfiled in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + yearfiled empty$ + { "no year or yearfiled in " cite$ * warning$ } + { yearfiled "yearfiled" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + } + { month duplicate$ empty$ + { "month" bibinfo.check pop$ "" } + { "month" bibinfo.check } + if$ + day duplicate$ empty$ + { "day" bibinfo.check pop$ "" * } + { "day" bibinfo.check + month empty$ + { "day without a month in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + year "year" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + cap.status.std +} + +FUNCTION {format.patent.nationality.type.number} +{ this.to.prev.status + this.status.std + nationality duplicate$ empty$ + { "nationality" bibinfo.warn pop$ "" } + { "nationality" bibinfo.check + duplicate$ "l" change.case$ "united states" = + { pop$ bbl.patentUS } + { skip$ } + if$ + " " * + } + if$ + type empty$ + { bbl.patent "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.warn pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + + + +%% standard + +FUNCTION {format.organization.institution.standard.type.number} +{ this.to.prev.status + this.status.std + organization duplicate$ empty$ + { pop$ + institution duplicate$ empty$ + { "institution" bibinfo.warn } + { "institution" bibinfo.warn " " * } + if$ + } + { "organization" bibinfo.warn " " * } + if$ + type empty$ + { bbl.standard "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.check pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + +FUNCTION {format.revision} +{ revision empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.revision + revision tie.or.space.prefix + "revision" bibinfo.check + * * + cap.status.std + } + if$ +} + + +%% thesis + +FUNCTION {format.master.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.mthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + +FUNCTION {format.phd.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.phdthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + + + +%% URL + +FUNCTION {format.url} +{ url empty$ + { "" } + { this.to.prev.status + this.status.std + cap.yes 'status.cap := + bbl.urlprefix " " * + "\url{" * url * "}" * + punct.no 'this.status.punct := + punct.period 'prev.status.punct := + space.normal 'this.status.space := + space.normal 'prev.status.space := + quote.no 'this.status.quote := + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%% +%% ENTRY HANDLERS %% +%%%%%%%%%%%%%%%%%%%% + + +% Note: In many journals, IEEE (or the authors) tend not to show the number +% for articles, so the display of the number is controlled here by the +% switch "is.use.number.for.article" +FUNCTION {article} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.journal "journal" bibinfo.check "journal" output.warn + format.volume output + format.number.if.use.for.article output + format.pages output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {book} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + author empty$ + { skip$ } + { format.editors output } + if$ + format.address.publisher.date output + format.volume output + format.number output + format.pages output + format.note output + format.url output + format.isbn output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {booklet} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {electronic} +{ std.status.using.period + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.date.electronic output + format.article.title.electronic output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {inbook} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + format.address.publisher.date output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {incollection} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle.edition "booktitle" output.warn + format.series output + format.editors output + format.address.publisher.date.nowarn output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {inproceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle "booktitle" output.warn + format.series output + format.editors output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.paper output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {manual} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title.edition "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {mastersthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.master.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {misc} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.pages output + format.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {patent} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.patent.nationality.type.number output + format.patent.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {periodical} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + format.organization "organization" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {phdthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.phd.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {proceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {standard} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization.institution.standard.type.number output + format.revision output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {techreport} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.institution "institution" bibinfo.warn output + format.address "address" bibinfo.check output + format.tech.report.number output.nonnull + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {unpublished} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.date output + format.note "note" output.warn + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + + +% The special entry type which provides the user interface to the +% BST controls +FUNCTION {IEEEtranBSTCTL} +{ is.print.banners.to.terminal + { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." * + top$ + } + { skip$ } + if$ + CTLuse_article_number + empty$ + { skip$ } + { CTLuse_article_number + yes.no.to.int + 'is.use.number.for.article := + } + if$ + CTLuse_paper + empty$ + { skip$ } + { CTLuse_paper + yes.no.to.int + 'is.use.paper := + } + if$ + CTLuse_forced_etal + empty$ + { skip$ } + { CTLuse_forced_etal + yes.no.to.int + 'is.forced.et.al := + } + if$ + CTLmax_names_forced_etal + empty$ + { skip$ } + { CTLmax_names_forced_etal + string.to.integer + 'max.num.names.before.forced.et.al := + } + if$ + CTLnames_show_etal + empty$ + { skip$ } + { CTLnames_show_etal + string.to.integer + 'num.names.shown.with.forced.et.al := + } + if$ + CTLuse_alt_spacing + empty$ + { skip$ } + { CTLuse_alt_spacing + yes.no.to.int + 'is.use.alt.interword.spacing := + } + if$ + CTLalt_stretch_factor + empty$ + { skip$ } + { CTLalt_stretch_factor + 'ALTinterwordstretchfactor := + "\renewcommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + } + if$ + CTLdash_repeated_names + empty$ + { skip$ } + { CTLdash_repeated_names + yes.no.to.int + 'is.dash.repeated.names := + } + if$ + CTLname_format_string + empty$ + { skip$ } + { CTLname_format_string + 'name.format.string := + } + if$ + CTLname_latex_cmd + empty$ + { skip$ } + { CTLname_latex_cmd + 'name.latex.cmd := + } + if$ + + + num.names.shown.with.forced.et.al max.num.names.before.forced.et.al > + { "CTLnames_show_etal cannot be greater than CTLmax_names_forced_etal in " cite$ * warning$ + max.num.names.before.forced.et.al 'num.names.shown.with.forced.et.al := + } + { skip$ } + if$ +} + + +%%%%%%%%%%%%%%%%%%% +%% ENTRY ALIASES %% +%%%%%%%%%%%%%%%%%%% +FUNCTION {conference}{inproceedings} +FUNCTION {online}{electronic} +FUNCTION {internet}{electronic} +FUNCTION {webpage}{electronic} +FUNCTION {default.type}{misc} + + + +%%%%%%%%%%%%%%%%%% +%% MAIN PROGRAM %% +%%%%%%%%%%%%%%%%%% + +READ + +EXECUTE {initialize.controls} +EXECUTE {initialize.status.constants} +EXECUTE {banner.message} + + + +% BEGIN sort code based on that of plain.bst + +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$ +} + +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$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ "" } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ 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$ +} + +FUNCTION {author.organization.sort} +{ 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$ +} + +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$ +} + +FUNCTION {author.organization.institution.sort} +{ author empty$ + { organization empty$ + { institution empty$ + { key empty$ + { "to sort, need author, organization, institution or key in " cite$ * warning$ "" } + { key sortify } + if$ + } + { "The " #4 institution chop.word sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + + +FUNCTION {presort} +{ type$ "ieeetranbstctl" = + { key empty$ + { "_" } + { key sortify } + if$ + } + { type$ "book" = + type$ "inbook" = + or + { author.editor.sort } + { type$ "proceedings" = + type$ "periodical" = + or + { editor.organization.sort } + { type$ "manual" = + type$ "electronic" = + type$ "misc" = + or or + { author.organization.sort } + { type$ "standard" = + { author.organization.institution.sort } + { author.sort } + if$ + } + if$ + } + if$ + } + if$ + " " + * + year empty.field.to.null.string sortify + * + " " + * + title empty.field.to.null.string + sort.format.title + * + } + if$ + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +SORT + +% END sort code based on that of plain.bst + + + +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} + +EXECUTE {begin.bib} +ITERATE {call.type$} +EXECUTE {end.bib} + +EXECUTE{completed.message} + + +%% That's all folks, mds. diff --git a/docs/project-outline/IEEEannotU.bst b/docs/project-outline/IEEEannotU.bst new file mode 100644 index 0000000..5a3fd05 --- /dev/null +++ b/docs/project-outline/IEEEannotU.bst @@ -0,0 +1,2474 @@ +%% +%% IEEEannot.bst +%% BibTeX Bibliography Style file +%% Sorting version of IEEEtran.bst +%% *** Not for use with work to be submitted to the IEEE *** +%% Version 1.2 (2017-02-05) +%% +%% Copyright (c) 2003 Michael Shell +%% +%% Modified by Titus Barik (titus@barik.net) to support annotated +%% bibliographies in IEEE citation format. Renamed to IEEEannot.bst. +%% The latest version of IEEEannot can always be downloaded at: +%% +%% http://www.barik.net/sw/ieee/ +%% +%% Modified by Neil Taylor (nst@aber.ac.uk) to remove the +%% sorting based on plain.bst. Renamed to IEEEannotU (unsorted) +%% This modified version is available at https://gitlab.dcs.aber.ac.uk/mmp/mmp-student +%% +%% Updated Legal Notice to provide updated URL for Perl Artistic License. +%% 1st March 2017. Neil Taylor (nst@aber.ac.uk) +%% +%% This version of IEEEannot is: 2017-02-05 +%% +%% Original starting code base and algorithms obtained from the output of +%% Patrick W. Daly's makebst package as well as from prior versions of +%% IEEE BibTeX styles: +%% +%% 1. Howard Trickey and Oren Patashnik's ieeetr.bst (1985/1988) +%% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993) +%% +%% See: +%% http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/ +%% for latest version and current contact information. +%% +%% For use with BibTeX version 0.99a or later +%% +%% This is a numerical citation style. +%% +%%********************************************************************** +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall IEEE or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% This code is distributed under the Perl Artistic License +%% ( http://dev.perl.org/licenses/artistic.html ) +%% and may be freely used, distributed and modified - subject to the +%% constraints therein. +%% +%% Retain all contribution notices, credits and disclaimers. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE. +%%********************************************************************** +% +% Changelog: +% +% 1.10 (2002/09/27) Initial release +% +% 1.11 (2003/04/02) +% 1. Fixed bug with URLs containing underscores when using url.sty. Thanks +% to Ming Kin Lai for reporting this. +% 1.2 (2017-02-05) +% 1. Removed sorting from the template. The items should now appear in +% the normal IEEE order, which is in the order they are first cited. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% These are the defaults for the user adjustable controls. The values used +% here can be overridden by the user via IEEEtranBSTCTL entry type. + +% NOTE: The recommended LaTeX command to invoke a control entry type is: +% +%\makeatletter +%\def\bstctlcite#1{\@bsphack +% \@for\@citeb:=#1\do{% +% \edef\@citeb{\expandafter\@firstofone\@citeb}% +% \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi}% +% \@esphack} +%\makeatother +% +% It is called at the start of the document, before the first \cite, like: +% \bstctlcite{IEEEexample:BSTcontrol} +% +% IEEEtran.cls V1.6 and later does provide this command. + + + +% #0 turns off the display of the number for articles. +% #1 enables +FUNCTION {default.is.use.number.for.article} { #1 } + + +% #0 turns off the display of the paper and type fields in @inproceedings. +% #1 enables +FUNCTION {default.is.use.paper} { #1 } + + +% #0 turns off the forced use of "et al." +% #1 enables +FUNCTION {default.is.forced.et.al} { #0 } + +% The maximum number of names that can be present beyond which an "et al." +% usage is forced. Be sure that num.names.shown.with.forced.et.al (below) +% is not greater than this value! +% Note: There are many instances of references in IEEE journals which have +% a very large number of authors as well as instances in which "et al." is +% used profusely. +FUNCTION {default.max.num.names.before.forced.et.al} { #10 } + +% The number of names that will be shown with a forced "et al.". +% Must be less than or equal to max.num.names.before.forced.et.al +FUNCTION {default.num.names.shown.with.forced.et.al} { #1 } + + +% #0 turns off the alternate interword spacing for entries with URLs. +% #1 enables +FUNCTION {default.is.use.alt.interword.spacing} { #1 } + +% If alternate interword spacing for entries with URLs is enabled, this is +% the interword spacing stretch factor that will be used. For example, the +% default "4" here means that the interword spacing in entries with URLs can +% stretch to four times normal. Does not have to be an integer. Note that +% the value specified here can be overridden by the user in their LaTeX +% code via a command such as: +% "\providecommand\BIBentryALTinterwordstretchfactor{1.5}" in addition to +% that via the IEEEtranBSTCTL entry type. +FUNCTION {default.ALTinterwordstretchfactor} { "4" } + + +% #0 turns off the "dashification" of repeated (i.e., identical to those +% of the previous entry) names. IEEE normally does this. +% #1 enables +FUNCTION {default.is.dash.repeated.names} { #1 } + + +% The default name format control string. +FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" } + + +% The default LaTeX font command for the names. +FUNCTION {default.name.latex.cmd}{ "" } + + +% Other controls that cannot be accessed via IEEEtranBSTCTL entry type. + +% #0 turns off the terminal startup banner/completed message so as to +% operate more quietly. +% #1 enables +FUNCTION {is.print.banners.to.terminal} { #1 } + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% FILE VERSION AND BANNER %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION{bst.file.version} { "1.2" } +FUNCTION{bst.file.date} { "2017-02-05" } +FUNCTION{bst.file.website} { "http://www.ctan.org/tex-archive/macros/latex/contrib/supported/IEEEtran/" } + +FUNCTION {banner.message} +{ is.print.banners.to.terminal + { "-- IEEEannotU.bst version" " " * bst.file.version * + " (" * bst.file.date * ") " * "by Neil Taylor, based on work by Michael Shell (IEEEtransS.bst) and Titus Barik (IEEEannot)." * + top$ + "-- " bst.file.website * + top$ + "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * " manual for usage information." * + top$ + "** Sorting version - not for use with work to be submitted to the IEEE." + top$ + } + { skip$ } + if$ +} + +FUNCTION {completed.message} +{ is.print.banners.to.terminal + { "" + top$ + "Done." + top$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING CONSTANTS %% +%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {bbl.and}{ "and" } +FUNCTION {bbl.etal}{ "et~al." } +FUNCTION {bbl.editors}{ "eds." } +FUNCTION {bbl.editor}{ "ed." } +FUNCTION {bbl.edition}{ "ed." } +FUNCTION {bbl.volume}{ "vol." } +FUNCTION {bbl.of}{ "of" } +FUNCTION {bbl.number}{ "no." } +FUNCTION {bbl.in}{ "in" } +FUNCTION {bbl.pages}{ "pp." } +FUNCTION {bbl.page}{ "p." } +FUNCTION {bbl.chapter}{ "ch." } +FUNCTION {bbl.paper}{ "paper" } +FUNCTION {bbl.part}{ "pt." } +FUNCTION {bbl.patent}{ "Patent" } +FUNCTION {bbl.patentUS}{ "U.S." } +FUNCTION {bbl.revision}{ "Rev." } +FUNCTION {bbl.series}{ "ser." } +FUNCTION {bbl.standard}{ "Std." } +FUNCTION {bbl.techrep}{ "Tech. Rep." } +FUNCTION {bbl.mthesis}{ "Master's thesis" } +FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" } +FUNCTION {bbl.urlprefix}{ "[Online]. Available:" } +FUNCTION {bbl.st}{ "st" } +FUNCTION {bbl.nd}{ "nd" } +FUNCTION {bbl.rd}{ "rd" } +FUNCTION {bbl.th}{ "th" } + + +% This is the LaTeX spacer that is used when a larger than normal space +% is called for (such as just before the address:publisher). +FUNCTION {large.space} { "\hskip 1em plus 0.5em minus 0.4em\relax " } + +% The LaTeX code for dashes that are used to represent repeated names. +% Note: Some older IEEE journals used something like +% "\rule{0.275in}{0.5pt}\," which is fairly thick and runs right along +% the baseline. However, IEEE now uses a thinner, above baseline, +% six dash long sequence. +FUNCTION {repeated.name.dashes} { "------" } + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% PREDEFINED STRING MACROS %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MACRO {jan} {"Jan."} +MACRO {feb} {"Feb."} +MACRO {mar} {"Mar."} +MACRO {apr} {"Apr."} +MACRO {may} {"May"} +MACRO {jun} {"June"} +MACRO {jul} {"July"} +MACRO {aug} {"Aug."} +MACRO {sep} {"Sept."} +MACRO {oct} {"Oct."} +MACRO {nov} {"Nov."} +MACRO {dec} {"Dec."} + + + +%%%%%%%%%%%%%%%%%% +%% ENTRY FIELDS %% +%%%%%%%%%%%%%%%%%% + +ENTRY + { + address + annote + assignee + author + booktitle + chapter + day + dayfiled + edition + editor + howpublished + institution + intype + isbn + journal + key + language + month + monthfiled + nationality + note + number + organization + pages + paper + publisher + school + series + revision + title + type + url + volume + year + yearfiled + CTLuse_article_number + CTLuse_paper + CTLuse_forced_etal + CTLmax_names_forced_etal + CTLnames_show_etal + CTLuse_alt_spacing + CTLalt_stretch_factor + CTLdash_repeated_names + CTLname_format_string + CTLname_latex_cmd + } + {} + { label } + + + + +%%%%%%%%%%%%%%%%%%%%%%% +%% INTEGER VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%%% + +INTEGERS { prev.status.punct this.status.punct punct.std + punct.no punct.comma punct.period + prev.status.space this.status.space space.std + space.no space.normal space.large + prev.status.quote this.status.quote quote.std + quote.no quote.close + prev.status.nline this.status.nline nline.std + nline.no nline.newblock + status.cap cap.std + cap.no cap.yes} + +INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames } + +INTEGERS { is.use.number.for.article + is.use.paper + is.forced.et.al + max.num.names.before.forced.et.al + num.names.shown.with.forced.et.al + is.use.alt.interword.spacing + is.dash.repeated.names} + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%% + +STRINGS { bibinfo + longest.label + oldname + s + t + ALTinterwordstretchfactor + name.format.string + name.latex.cmd} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOW LEVEL FUNCTIONS %% +%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.controls} +{ default.is.use.number.for.article 'is.use.number.for.article := + default.is.use.paper 'is.use.paper := + default.is.forced.et.al 'is.forced.et.al := + default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al := + default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al := + default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing := + default.is.dash.repeated.names 'is.dash.repeated.names := + default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor := + default.name.format.string 'name.format.string := + default.name.latex.cmd 'name.latex.cmd := +} + + +% This IEEEtran.bst features a very powerful and flexible mechanism for +% controlling the capitalization, punctuation, spacing, quotation, and +% newlines of the formatted entry fields. (Note: IEEEtran.bst does not need +% or use the newline/newblock feature, but it has been implemented for +% possible future use.) The output states of IEEEtran.bst consist of +% multiple independent attributes and, as such, can be thought of as being +% vectors, rather than the simple scalar values ("before.all", +% "mid.sentence", etc.) used in most other .bst files. +% +% The more flexible and complex design used here was motivated in part by +% IEEE's rather unusual bibliography style. For example, IEEE ends the +% previous field item with a period and large space prior to the publisher +% address; the @electronic entry types use periods as inter-item punctuation +% rather than the commas used by the other entry types; and URLs are never +% followed by periods even though they are the last item in the entry. +% Although it is possible to accommodate these features with the conventional +% output state system, the seemingly endless exceptions make for convoluted, +% unreliable and difficult to maintain code. +% +% IEEEtran.bst's output state system can be easily understood via a simple +% illustration of two most recently formatted entry fields (on the stack): +% +% CURRENT_ITEM +% "PREVIOUS_ITEM +% +% which, in this example, is to eventually appear in the bibliography as: +% +% "PREVIOUS_ITEM," CURRENT_ITEM +% +% It is the job of the output routine to take the previous item off of the +% stack (while leaving the current item at the top of the stack), apply its +% trailing punctuation (including closing quote marks) and spacing, and then +% to write the result to BibTeX's output buffer: +% +% "PREVIOUS_ITEM," +% +% Punctuation (and spacing) between items is often determined by both of the +% items rather than just the first one. The presence of quotation marks +% further complicates the situation because, in standard English, trailing +% punctuation marks are supposed to be contained within the quotes. +% +% IEEEtran.bst maintains two output state (aka "status") vectors which +% correspond to the previous and current (aka "this") items. Each vector +% consists of several independent attributes which track punctuation, +% spacing, quotation, and newlines. Capitalization status is handled by a +% separate scalar because the format routines, not the output routine, +% handle capitalization and, therefore, there is no need to maintain the +% capitalization attribute for both the "previous" and "this" items. +% +% When a format routine adds a new item, it copies the current output status +% vector to the previous output status vector and (usually) resets the +% current (this) output status vector to a "standard status" vector. Using a +% "standard status" vector in this way allows us to redefine what we mean by +% "standard status" at the start of each entry handler and reuse the same +% format routines under the various inter-item separation schemes. For +% example, the standard status vector for the @book entry type may use +% commas for item separators, while the @electronic type may use periods, +% yet both entry handlers exploit many of the exact same format routines. +% +% Because format routines have write access to the output status vector of +% the previous item, they can override the punctuation choices of the +% previous format routine! Therefore, it becomes trivial to implement rules +% such as "Always use a period and a large space before the publisher." By +% pushing the generation of the closing quote mark to the output routine, we +% avoid all the problems caused by having to close a quote before having all +% the information required to determine what the punctuation should be. +% +% The IEEEtran.bst output state system can easily be expanded if needed. +% For instance, it is easy to add a "space.tie" attribute value if the +% bibliography rules mandate that two items have to be joined with an +% unbreakable space. + +% Titus Barik Annotation Addition + +% annotation addition +FUNCTION {format.annotate} +{ annote empty$ + { "" } + { " \begin{quotation}\noindent " + annote + * " \end{quotation} " * + } + if$ +} + + +FUNCTION {initialize.status.constants} +{ #0 'punct.no := + #1 'punct.comma := + #2 'punct.period := + #0 'space.no := + #1 'space.normal := + #2 'space.large := + #0 'quote.no := + #1 'quote.close := + #0 'cap.no := + #1 'cap.yes := + #0 'nline.no := + #1 'nline.newblock := +} + +FUNCTION {std.status.using.comma} +{ punct.comma 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.no 'cap.std := +} + +FUNCTION {std.status.using.period} +{ punct.period 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.yes 'cap.std := +} + +FUNCTION {initialize.prev.this.status} +{ punct.no 'prev.status.punct := + space.no 'prev.status.space := + quote.no 'prev.status.quote := + nline.no 'prev.status.nline := + punct.no 'this.status.punct := + space.no 'this.status.space := + quote.no 'this.status.quote := + nline.no 'this.status.nline := + cap.yes 'status.cap := +} + +FUNCTION {this.status.std} +{ punct.std 'this.status.punct := + space.std 'this.status.space := + quote.std 'this.status.quote := + nline.std 'this.status.nline := +} + +FUNCTION {cap.status.std}{ cap.std 'status.cap := } + +FUNCTION {this.to.prev.status} +{ this.status.punct 'prev.status.punct := + this.status.space 'prev.status.space := + this.status.quote 'prev.status.quote := + this.status.nline 'prev.status.nline := +} + + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ { skip$ } + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + { skip$ } + if$ +} + + +% convert the strings "yes" or "no" to #1 or #0 respectively +FUNCTION {yes.no.to.int} +{ "l" change.case$ duplicate$ + "yes" = + { pop$ #1 } + { duplicate$ "no" = + { pop$ #0 } + { "unknown boolean " quote$ * swap$ * quote$ * + " in " * cite$ * warning$ + #0 + } + if$ + } + if$ +} + + +% pushes true if the single char string on the stack is in the +% range of "0" to "9" +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +% multiplies the integer on the stack by a factor of 10 +FUNCTION {bump.int.mag} +{ #0 'multiresult := + { duplicate$ #0 > } + { #1 - + multiresult #10 + + 'multiresult := + } + while$ +pop$ +multiresult +} + +% converts a single character string on the stack to an integer +FUNCTION {char.to.integer} +{ duplicate$ + is.num + { chr.to.int$ "0" chr.to.int$ - } + {"noninteger character " quote$ * swap$ * quote$ * + " in integer field of " * cite$ * warning$ + #0 + } + if$ +} + +% converts a string on the stack to an integer +FUNCTION {string.to.integer} +{ duplicate$ text.length$ 'namesleft := + #1 'nameptr := + #0 'numnames := + { nameptr namesleft > not } + { duplicate$ nameptr #1 substring$ + char.to.integer numnames bump.int.mag + + 'numnames := + nameptr #1 + + 'nameptr := + } + while$ +pop$ +numnames +} + + + + +% The output routines write out the *next* to the top (previous) item on the +% stack, adding punctuation and such as needed. Since IEEEtran.bst maintains +% the output status for the top two items on the stack, these output +% routines have to consider the previous output status (which corresponds to +% the item that is being output). Full independent control of punctuation, +% closing quote marks, spacing, and newblock is provided. +% +% "output.nonnull" does not check for the presence of a previous empty +% item. +% +% "output" does check for the presence of a previous empty item and will +% remove an empty item rather than outputing it. +% +% "output.warn" is like "output", but will issue a warning if it detects +% an empty item. + +FUNCTION {output.nonnull} +{ swap$ + prev.status.punct punct.comma = + { "," * } + { skip$ } + if$ + prev.status.punct punct.period = + { add.period$ } + { skip$ } + if$ + prev.status.quote quote.close = + { "''" * } + { skip$ } + if$ + prev.status.space space.normal = + { " " * } + { skip$ } + if$ + prev.status.space space.large = + { large.space * } + { skip$ } + if$ + write$ + prev.status.nline nline.newblock = + { newline$ "\newblock " write$ } + { skip$ } + if$ +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.warn} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + +% "fin.entry" is the output routine that handles the last item of the entry +% (which will be on the top of the stack when "fin.entry" is called). + +FUNCTION {fin.entry} +{ this.status.punct punct.no = + { skip$ } + { add.period$ } + if$ + this.status.quote quote.close = + { "''" * } + { skip$ } + if$ +write$ +newline$ +} + + +FUNCTION {is.last.char.not.punct} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {is.multiple.pages} +{ '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 +} + +FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ } + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} + +FUNCTION {do.name.latex.cmd} +{ name.latex.cmd + empty$ + { skip$ } + { name.latex.cmd "{" * swap$ * "}" * } + if$ +} + +% IEEEtran.bst uses its own \BIBforeignlanguage command which directly +% invokes the TeX hyphenation patterns without the need of the Babel +% package. Babel does a lot more than switch hyphenation patterns and +% its loading can cause unintended effects in many class files (such as +% IEEEtran.cls). +FUNCTION {select.language} +{ duplicate$ empty$ 'pop$ + { language empty$ 'skip$ + { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {space.word}{ " " swap$ * " " * } + + +% Field Conditioners, Converters, Checkers and External Interfaces + +FUNCTION {empty.field.to.null.string} +{ duplicate$ empty$ + { pop$ "" } + { skip$ } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + { pop$ } + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {empty.entry.warn} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ url empty$ + and and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + + +% The bibinfo system provides a way for the electronic parsing/acquisition +% of a bibliography's contents as is done by ReVTeX. For example, a field +% could be entered into the bibliography as: +% \bibinfo{volume}{2} +% Only the "2" would show up in the document, but the LaTeX \bibinfo command +% could do additional things with the information. IEEEtran.bst does provide +% a \bibinfo command via "\providecommand{\bibinfo}[2]{#2}". However, it is +% currently not used as the bogus bibinfo functions defined here output the +% entry values directly without the \bibinfo wrapper. The bibinfo functions +% themselves (and the calls to them) are retained for possible future use. +% +% bibinfo.check avoids acting on missing fields while bibinfo.warn will +% issue a warning message if a missing field is detected. Prior to calling +% the bibinfo functions, the user should push the field value and then its +% name string, in that order. + +FUNCTION {bibinfo.check} +{ swap$ duplicate$ missing$ + { pop$ pop$ "" } + { duplicate$ empty$ + { swap$ pop$ } + { swap$ pop$ } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ duplicate$ missing$ + { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } + { duplicate$ empty$ + { swap$ "empty " swap$ * " in " * cite$ * warning$ } + { swap$ pop$ } + if$ + } + if$ +} + + +% IEEE separates large numbers with more than 4 digits into groups of +% three. IEEE uses a small space to separate these number groups. +% Typical applications include patent and page numbers. + +% number of consecutive digits required to trigger the group separation. +FUNCTION {large.number.trigger}{ #5 } + +% For numbers longer than the trigger, this is the blocksize of the groups. +% The blocksize must be less than the trigger threshold, and 2 * blocksize +% must be greater than the trigger threshold (can't do more than one +% separation on the initial trigger). +FUNCTION {large.number.blocksize}{ #3 } + +% What is actually inserted between the number groups. +FUNCTION {large.number.separator}{ "\," } + +% So as to save on integer variables by reusing existing ones, numnames +% holds the current number of consecutive digits read and nameptr holds +% the number that will trigger an inserted space. +FUNCTION {large.number.separate} +{ 't := + "" + #0 'numnames := + large.number.trigger 'nameptr := + { t empty$ not } + { t #-1 #1 substring$ is.num + { numnames #1 + 'numnames := } + { #0 'numnames := + large.number.trigger 'nameptr := + } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames nameptr = + { duplicate$ #1 nameptr large.number.blocksize - substring$ swap$ + nameptr large.number.blocksize - #1 + global.max$ substring$ + large.number.separator swap$ * * + nameptr large.number.blocksize - 'numnames := + large.number.blocksize #1 + 'nameptr := + } + { skip$ } + if$ + } + while$ +} + +% Converts all single dashes "-" to double dashes "--". +FUNCTION {n.dashify} +{ large.number.separate + '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$ +} + + +% This function detects entries with names that are identical to that of +% the previous entry and replaces the repeated names with dashes (if the +% "is.dash.repeated.names" user control is nonzero). +FUNCTION {name.or.dash} +{ 's := + oldname empty$ + { s 'oldname := s } + { s oldname = + { is.dash.repeated.names + { repeated.name.dashes } + { s 'oldname := s } + if$ + } + { s 'oldname := s } + if$ + } + if$ +} + +% Converts the number string on the top of the stack to +% "numerical ordinal form" (e.g., "7" to "7th"). There is +% no artificial limit to the upper bound of the numbers as the +% least significant digit always determines the ordinal form. +FUNCTION {num.to.ordinal} +{ duplicate$ #-1 #1 substring$ "1" = + { bbl.st * } + { duplicate$ #-1 #1 substring$ "2" = + { bbl.nd * } + { duplicate$ #-1 #1 substring$ "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ +} + +% If the string on the top of the stack begins with a number, +% (e.g., 11th) then replace the string with the leading number +% it contains. Otherwise retain the string as-is. s holds the +% extracted number, t holds the part of the string that remains +% to be scanned. +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +% Converts the word number string on the top of the stack to +% Arabic string form. Will be successful up to "tenth". +FUNCTION {word.to.num} +{ duplicate$ "l" change.case$ 's := + s "first" = + { pop$ "1" } + { skip$ } + if$ + s "second" = + { pop$ "2" } + { skip$ } + if$ + s "third" = + { pop$ "3" } + { skip$ } + if$ + s "fourth" = + { pop$ "4" } + { skip$ } + if$ + s "fifth" = + { pop$ "5" } + { skip$ } + if$ + s "sixth" = + { pop$ "6" } + { skip$ } + if$ + s "seventh" = + { pop$ "7" } + { skip$ } + if$ + s "eighth" = + { pop$ "8" } + { skip$ } + if$ + s "ninth" = + { pop$ "9" } + { skip$ } + if$ + s "tenth" = + { pop$ "10" } + { skip$ } + if$ +} + + +% Converts the string on the top of the stack to numerical +% ordinal (e.g., "11th") form. +FUNCTION {convert.edition} +{ duplicate$ empty$ 'skip$ + { duplicate$ #1 #1 substring$ is.num + { extract.num + num.to.ordinal + } + { word.to.num + duplicate$ #1 #1 substring$ is.num + { num.to.ordinal } + { "edition ordinal word " quote$ * edition * quote$ * + " may be too high (or improper) for conversion" * " in " * cite$ * warning$ + } + if$ + } + if$ + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LATEX BIBLIOGRAPHY CODE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {start.entry} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + initialize.prev.this.status +} + +% Here we write out all the LaTeX code that we will need. The most involved +% code sequences are those that control the alternate interword spacing and +% foreign language hyphenation patterns. The heavy use of \providecommand +% gives users a way to override the defaults. Special thanks to Javier Bezos, +% Johannes Braams, Robin Fairburns, Heiko Oberdiek, Donald Arseneau and all +% the other gurus on comp.text.tex for their help and advice on the topic of +% \selectlanguage, Babel and BibTeX. +FUNCTION {begin.bib} +{ preamble$ empty$ 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{#1}" + write$ newline$ + "\csname url@rmstyle\endcsname" + write$ newline$ + "\providecommand{\newblock}{\relax}" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ + "\providecommand\BIBentrySTDinterwordspacing{\spaceskip=0pt\relax}" + write$ newline$ + "\providecommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + "\providecommand\BIBentryALTinterwordspacing{\spaceskip=\fontdimen2\font plus " + write$ newline$ + "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}" + write$ newline$ + "\providecommand\BIBforeignlanguage[2]{{%" + write$ newline$ + "\expandafter\ifx\csname l@#1\endcsname\relax" + write$ newline$ + "\typeout{** WARNING: IEEEtran.bst: No hyphenation pattern has been}%" + write$ newline$ + "\typeout{** loaded for the language `#1'. Using the pattern for}%" + write$ newline$ + "\typeout{** the default language instead.}%" + write$ newline$ + "\else" + write$ newline$ + "\language=\csname l@#1\endcsname" + write$ newline$ + "\fi" + write$ newline$ + "#2}}" + write$ newline$ +} + +FUNCTION {end.bib} +{ newline$ "\end{thebibliography}" write$ newline$ } + +FUNCTION {if.url.alt.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + +FUNCTION {if.url.std.interword.spacing} +{ is.use.alt.interword.spacing + {url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$} + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%% +%% LONGEST LABEL PASS %% +%%%%%%%%%%%%%%%%%%%%%%%% + +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$ +} + + + + +%%%%%%%%%%%%%%%%%%%%% +%% FORMAT HANDLERS %% +%%%%%%%%%%%%%%%%%%%%% + +%% Lower Level Formats (used by higher level formats) + +FUNCTION {format.address.org.or.pub.date} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + { skip$ } + if$ + address empty$ t empty$ and + year empty$ and month empty$ and + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + address "address" bibinfo.check * + t empty$ + { skip$ } + { punct.period 'prev.status.punct := + space.large 'prev.status.space := + address empty$ + { skip$ } + { ": " * } + if$ + t * + } + if$ + year empty$ month empty$ and + { skip$ } + { t empty$ address empty$ and + { skip$ } + { ", " * } + if$ + month empty$ + { year empty$ + { skip$ } + { year "year" bibinfo.check * } + if$ + } + { month "month" bibinfo.check * + year empty$ + { skip$ } + { " " * year "year" bibinfo.check * } + if$ + } + if$ + } + if$ + } + if$ +} + + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + this.to.prev.status + this.status.std + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + name.format.string + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { nameptr num.names.shown.with.forced.et.al #1 + = + numnames max.num.names.before.forced.et.al > + is.forced.et.al and and + { "others" 't := + #1 'namesleft := + } + { skip$ } + if$ + namesleft #1 > + { ", " * t do.name.latex.cmd * } + { + numnames #2 > + { "," * } + 'skip$ + if$ + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { + " " * bbl.etal emphasize * + } + { + bbl.and + space.word * t do.name.latex.cmd * + } + if$ + } + if$ + } + { t do.name.latex.cmd } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + cap.status.std + } if$ +} + + + + +%% Higher Level Formats + +%% addresses/locations + +FUNCTION {format.address} +{ address duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% author/editor names + +FUNCTION {format.authors}{ author "author" format.names } + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { ", " * + get.bbl.editor + capitalize + * + } + if$ +} + + + +%% date + +FUNCTION {format.date} +{ + month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { this.to.prev.status + this.status.std + cap.status.std + swap$ 'skip$ + { + swap$ + " " * swap$ + } + if$ + * + } + if$ +} + +FUNCTION {format.date.electronic} +{ month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ + { pop$ } + { "there's a month but no year in " cite$ * warning$ + pop$ ")" * "(" swap$ * + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ + } + { swap$ + { swap$ pop$ ")" * "(" swap$ * } + { "(" swap$ * ", " * swap$ * ")" * } + if$ + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ +} + + + +%% edition/title + +% Note: IEEE considers the edition to be closely associated with +% the title of a book. So, in IEEEtran.bst the edition is normally handled +% within the formatting of the title. The format.edition function is +% retained here for possible future use. +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + convert.edition + status.cap + { "t" } + { "l" } + if$ change.case$ + "edition" bibinfo.check + "~" * bbl.edition * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of a conference proceedings. +% Here we use the "intype" field to provide the user a way to +% override the word "in" (e.g., with things like "presented at") +% Use of intype stops the emphasis of the booktitle to indicate that +% we no longer mean the written conference proceedings, but the +% conference itself. +FUNCTION {format.in.booktitle} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + intype missing$ + { emphasize + bbl.in " " * + } + { intype " " * } + if$ + swap$ * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of collection. +% Here the "intype" field is not supported, but "edition" is. +FUNCTION {format.in.booktitle.edition} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + "l" change.case$ + * "~" * bbl.edition * + } + if$ + bbl.in " " * swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { quote.close 'this.status.quote := + is.last.char.not.punct + { punct.std 'this.status.punct := } + { punct.no 'this.status.punct := } + if$ + select.language + "``" swap$ * + cap.status.std + } + if$ +} + +FUNCTION {format.article.title.electronic} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ + { skip$ } + { select.language } + if$ +} + +FUNCTION {format.book.title.edition} +{ title "title" bibinfo.check + duplicate$ empty$ + { "empty title in " cite$ * warning$ } + { this.to.prev.status + this.status.std + select.language + emphasize + edition empty$ 'skip$ + { ", " * + edition + convert.edition + status.cap + { "t" } + { "l" } + if$ + change.case$ + * "~" * bbl.edition * + } + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.book.title} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% journal + +FUNCTION {format.journal} +{ journal duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + emphasize + } + if$ +} + + + +%% how published + +FUNCTION {format.howpublished} +{ howpublished duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% institutions/organization/publishers/school + +FUNCTION {format.institution} +{ institution duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.organization} +{ organization duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.address.publisher.date} +{ publisher "publisher" bibinfo.warn format.address.org.or.pub.date } + +FUNCTION {format.address.publisher.date.nowarn} +{ publisher "publisher" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.address.organization.date} +{ organization "organization" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.school} +{ school duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% volume/number/series/chapter/pages + +FUNCTION {format.volume} +{ volume empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + bbl.volume + status.cap + { capitalize } + { skip$ } + if$ + swap$ tie.or.space.prefix + "volume" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number} +{ number empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + status.cap + { bbl.number capitalize } + { bbl.number } + if$ + swap$ tie.or.space.prefix + "number" bibinfo.check + * * + cap.status.std + } + if$ +} + +FUNCTION {format.number.if.use.for.article} +{ is.use.number.for.article + { format.number } + { "" } + if$ +} + +% IEEE does not seem to tie the series so closely with the volume +% and number as is done in other bibliography styles. Instead the +% series is treated somewhat like an extension of the title. +FUNCTION {format.series} +{ series empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.series " " * + series "series" bibinfo.check * + cap.status.std + } + if$ +} + + +FUNCTION {format.chapter} +{ chapter empty$ + { "" } + { this.to.prev.status + this.status.std + type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + cap.status.std + } + if$ +} + + +% The intended use of format.paper is for paper numbers of inproceedings. +% The paper type can be overridden via the type field. +% We allow the type to be displayed even if the paper number is absent +% for things like "postdeadline paper" +FUNCTION {format.paper} +{ is.use.paper + { paper empty$ + { type empty$ + { "" } + { this.to.prev.status + this.status.std + type "type" bibinfo.check + cap.status.std + } + if$ + } + { this.to.prev.status + this.status.std + type empty$ + { bbl.paper } + { type "type" bibinfo.check } + if$ + " " * paper + "paper" bibinfo.check + * + cap.status.std + } + if$ + } + { "" } + if$ +} + + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + duplicate$ is.multiple.pages + { + bbl.pages swap$ + n.dashify + } + { + bbl.page swap$ + } + if$ + tie.or.space.prefix + "pages" bibinfo.check + * * + cap.status.std + } + if$ +} + + + +%% technical report number + +FUNCTION {format.tech.report.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ + this.to.prev.status + this.status.std + cap.status.std + bbl.techrep + } + { skip$ } + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ } + { this.to.prev.status + this.status.std + cap.status.std + tie.or.space.prefix * * } + if$ +} + +%% isbn + +FUNCTION {format.isbn} +{ isbn empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + isbn #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + isbn #2 global.max$ substring$ * "isbn" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + +%% note + +FUNCTION {format.note} +{ note empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + note #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + + +%% patent + +FUNCTION {format.patent.date} +{ this.to.prev.status + this.status.std + year empty$ + { monthfiled duplicate$ empty$ + { "monthfiled" bibinfo.check pop$ "" } + { "monthfiled" bibinfo.check } + if$ + dayfiled duplicate$ empty$ + { "dayfiled" bibinfo.check pop$ "" * } + { "dayfiled" bibinfo.check + monthfiled empty$ + { "dayfiled without a monthfiled in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + yearfiled empty$ + { "no year or yearfiled in " cite$ * warning$ } + { yearfiled "yearfiled" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + } + { month duplicate$ empty$ + { "month" bibinfo.check pop$ "" } + { "month" bibinfo.check } + if$ + day duplicate$ empty$ + { "day" bibinfo.check pop$ "" * } + { "day" bibinfo.check + month empty$ + { "day without a month in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + year "year" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + cap.status.std +} + +FUNCTION {format.patent.nationality.type.number} +{ this.to.prev.status + this.status.std + nationality duplicate$ empty$ + { "nationality" bibinfo.warn pop$ "" } + { "nationality" bibinfo.check + duplicate$ "l" change.case$ "united states" = + { pop$ bbl.patentUS } + { skip$ } + if$ + " " * + } + if$ + type empty$ + { bbl.patent "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.warn pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + + + +%% standard + +FUNCTION {format.organization.institution.standard.type.number} +{ this.to.prev.status + this.status.std + organization duplicate$ empty$ + { pop$ + institution duplicate$ empty$ + { "institution" bibinfo.warn } + { "institution" bibinfo.warn " " * } + if$ + } + { "organization" bibinfo.warn " " * } + if$ + type empty$ + { bbl.standard "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.check pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + +FUNCTION {format.revision} +{ revision empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.revision + revision tie.or.space.prefix + "revision" bibinfo.check + * * + cap.status.std + } + if$ +} + + +%% thesis + +FUNCTION {format.master.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.mthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + +FUNCTION {format.phd.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.phdthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + + + +%% URL + +FUNCTION {format.url} +{ url empty$ + { "" } + { this.to.prev.status + this.status.std + cap.yes 'status.cap := + bbl.urlprefix " " * + "\url{" * url * "}" * + punct.no 'this.status.punct := + punct.period 'prev.status.punct := + space.normal 'this.status.space := + space.normal 'prev.status.space := + quote.no 'this.status.quote := + } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%% +%% ENTRY HANDLERS %% +%%%%%%%%%%%%%%%%%%%% + + +% Note: In many journals, IEEE (or the authors) tend not to show the number +% for articles, so the display of the number is controlled here by the +% switch "is.use.number.for.article" +FUNCTION {article} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.journal "journal" bibinfo.check "journal" output.warn + format.volume output + format.number.if.use.for.article output + format.pages output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {book} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + author empty$ + { skip$ } + { format.editors output } + if$ + format.address.publisher.date output + format.volume output + format.number output + format.pages output + format.note output + format.url output + format.isbn output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {booklet} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {electronic} +{ std.status.using.period + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.date.electronic output + format.article.title.electronic output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {inbook} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + format.address.publisher.date output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {incollection} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle.edition "booktitle" output.warn + format.series output + format.editors output + format.address.publisher.date.nowarn output + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {inproceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle "booktitle" output.warn + format.series output + format.editors output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.paper output + format.pages output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {manual} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title.edition "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {mastersthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.master.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {misc} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.pages output + format.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {patent} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.patent.nationality.type.number output + format.patent.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {periodical} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + format.organization "organization" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {phdthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.phd.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {proceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {standard} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization.institution.standard.type.number output + format.revision output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {techreport} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.institution "institution" bibinfo.warn output + format.address "address" bibinfo.check output + format.tech.report.number output.nonnull + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {unpublished} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.date output + format.note "note" output.warn + format.url output + fin.entry + if.url.std.interword.spacing +% TB: added for annotation + format.annotate write$ + newline$ +} + + +% The special entry type which provides the user interface to the +% BST controls +FUNCTION {IEEEtranBSTCTL} +{ is.print.banners.to.terminal + { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." * + top$ + } + { skip$ } + if$ + CTLuse_article_number + empty$ + { skip$ } + { CTLuse_article_number + yes.no.to.int + 'is.use.number.for.article := + } + if$ + CTLuse_paper + empty$ + { skip$ } + { CTLuse_paper + yes.no.to.int + 'is.use.paper := + } + if$ + CTLuse_forced_etal + empty$ + { skip$ } + { CTLuse_forced_etal + yes.no.to.int + 'is.forced.et.al := + } + if$ + CTLmax_names_forced_etal + empty$ + { skip$ } + { CTLmax_names_forced_etal + string.to.integer + 'max.num.names.before.forced.et.al := + } + if$ + CTLnames_show_etal + empty$ + { skip$ } + { CTLnames_show_etal + string.to.integer + 'num.names.shown.with.forced.et.al := + } + if$ + CTLuse_alt_spacing + empty$ + { skip$ } + { CTLuse_alt_spacing + yes.no.to.int + 'is.use.alt.interword.spacing := + } + if$ + CTLalt_stretch_factor + empty$ + { skip$ } + { CTLalt_stretch_factor + 'ALTinterwordstretchfactor := + "\renewcommand\BIBentryALTinterwordstretchfactor{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + } + if$ + CTLdash_repeated_names + empty$ + { skip$ } + { CTLdash_repeated_names + yes.no.to.int + 'is.dash.repeated.names := + } + if$ + CTLname_format_string + empty$ + { skip$ } + { CTLname_format_string + 'name.format.string := + } + if$ + CTLname_latex_cmd + empty$ + { skip$ } + { CTLname_latex_cmd + 'name.latex.cmd := + } + if$ + + + num.names.shown.with.forced.et.al max.num.names.before.forced.et.al > + { "CTLnames_show_etal cannot be greater than CTLmax_names_forced_etal in " cite$ * warning$ + max.num.names.before.forced.et.al 'num.names.shown.with.forced.et.al := + } + { skip$ } + if$ +} + + +%%%%%%%%%%%%%%%%%%% +%% ENTRY ALIASES %% +%%%%%%%%%%%%%%%%%%% +FUNCTION {conference}{inproceedings} +FUNCTION {online}{electronic} +FUNCTION {internet}{electronic} +FUNCTION {webpage}{electronic} +FUNCTION {default.type}{misc} + + + +%%%%%%%%%%%%%%%%%% +%% MAIN PROGRAM %% +%%%%%%%%%%%%%%%%%% + +READ + +EXECUTE {initialize.controls} +EXECUTE {initialize.status.constants} +EXECUTE {banner.message} + +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} + +EXECUTE {begin.bib} +ITERATE {call.type$} +EXECUTE {end.bib} + +EXECUTE{completed.message} + +%% That's all folks, mds. diff --git a/docs/project-outline/authordate2annot.bst b/docs/project-outline/authordate2annot.bst new file mode 100644 index 0000000..18f4d1d --- /dev/null +++ b/docs/project-outline/authordate2annot.bst @@ -0,0 +1,1364 @@ +% This BibTeX 0.99 style file is intended for documents that use the +% author-date citation system. It should be used in conjunction with the +% authordate1-4.sty (or equivalent) LaTeX style-option. +% +% In deciding on the bibliography layout to be implemented, the following +% works have been consulted: +% 1. British Standard 5605: "Citing publications by bibliographic +% references", 1978. +% 2. British Standard 1629: "Bibliographic references", 1976. +% (Note: There is now a 1989 edition.) +% 3. "Copy-editing" by Judith Butcher, Cambridge University Press, 1981. +% 4. "The Oxford Dictionary for Writers and Editors", Oxford University +% Press, 1981 (for abbreviations). +% 5. "The Chicago Manual of Style", Chicago University Press, 1982. +% +% Discretion has been used in certain matters. In particular: +% - Titles are italic except when there is a "contribution title" and +% a "main publication title", in which case the "contribution title" +% is roman while the "main publication title" is italic. +% - When there is a PUBLISHER, it is assumed that ADDRESS contains "place of +% publication"; output is of the form "place-of-publication: publisher". +% When there is an ORGANIZATION as well as a PUBLISHER, output is of the +% form "place-of-publication: publisher, for organization". Otherwise, +% it is assumed that ADDRESS is a postal address, and output is of the +% form "institution, address", "organization, address", "school, address" +% or "howpublished, address". +% - If there is a MONTH but no VOLUME or NUMBER for a journal-article, the +% MONTH is used on the assumption that it contains information that is +% equivalent to VOLUME or NUMBER. MONTH is ignored for other documents +% that have a PUBLISHER, but output after YEAR for anything else. +% - When CHAPTER and/or PAGES are specified with INBOOK, it is assumed that +% these fields are being used to pick out particular pages of interest +% (as an alternative to using the optional [...] argument of \cite); +% the information is put at the very end of the entry, in line with BS 1629. +% When CHAPTER and/or PAGES are specified for INCOLLECTION or INPROCEEDINGS, +% it is assumed that the fields are being used to specify the location of +% the part/article of interest; the information is put before the +% BOOKTITLE, in line with Chicago's treatment of "parts" and "chapters". +% - Since "volume" can be used in various ways (see page 219 of Butcher), +% this file assumes that, when there is a SERIES, any VOLUME and NUMBER +% refer to position in the SERIES (i.e. Butcher's meaning 4). +% If there is a VOLUME but no SERIES, it is assumed that VOLUME refers +% to a volume within a particular work (i.e. Butcher's meaning 1, 2 or 3). +% For INPROCEEDINGS and INCOLLECTION, this information goes after the +% BOOKTITLE. (If you prefer to have volume information before EDITOR, +% as on page 449 of Chicago, you can set TYPE = "Vol." with INCOLLECTION.) +% +% This file differs from authordate1.bst, authordate3.bst and authordate4.bst +% in that: +% - Titles of journals, articles and boooks are "downstyle". Apart from the +% first character, and the first character following : and white space, +% uppercase letters are converted to lowercase unless protected by {}. +% - Author's and editor's names are in roman. +% +% The combination of authordate2.bst and authordate1-4.sty allows citations +% of the form \shortcite{bloggs-60} as well as the usual \cite{bloggs-60}. +% When +% ... \cite{bloggs-60} ... \shortcite{bloggs-60} ... +% appears in the input file, +% ... (Bloggs, 1960) ... (1960) ... +% appears in the final document. +% +% This file was developed from apalike.bst. It also uses code taken from +% acm.bst, aaai-named.bst, btxbst.doc, ieeetr.bst and siam.bst. +% +% David Rhead +% Cripps Computing Centre +% Nottingham University +% March 1990 +% + +%nst - added annot +ENTRY + { address + annote + author + booktitle + chapter + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + } + {} + { label extra.label sort.label } + +INTEGERS { 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 := +} + +STRINGS { s t } + +% annotation addition +FUNCTION {format.annotate} +{ annote empty$ + { "" } + { " \begin{quotation}\noindent " + annote + * " \end{quotation} " * + } + if$ +} + +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.year.month.check} +{ year empty$ + { "empty year in " cite$ * warning$ } + { add.period$ write$ + month empty$ + { " " year * extra.label * "." * + after.sentence 'output.state := + } + { " " year * extra.label * " (" * month * ")." * + after.sentence 'output.state := + } + if$ + } + if$ +} + +FUNCTION {output.year.check} +{ year empty$ + { "empty year in " cite$ * warning$ } + { add.period$ write$ + " " year * extra.label * "." * + after.sentence 'output.state := + } + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem[" write$ + label write$ + "]{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + 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$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {boldface} +{ duplicate$ empty$ + { pop$ "" } + { "{\bf " swap$ * "}" * } + 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 "{vv~}{ll}{, jj}{, ff}" format.name$ 't := + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { t "others" = + { ", {\em et~al.}" * } + { ", \& " * t * } % Butcher, pages + if$ % 186-189. + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {format.key} +{ empty$ + { key field.or.null } + { "" } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > % Use ODWE abbrevs. + { " (eds)" * } % to avoid + { " (ed)" * } % ambiguity between + if$ % "editor" and + } % "edition". + if$ +} + +FUNCTION {format.title} % Howells example +{ title empty$ % in BS 5605 comes + { "" } % out wrong because + { title "t" change.case$ } % Patashnik + if$ % capitalizes +} % after a colon. + +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$ +} + +FUNCTION {format.btitle} +{ title empty$ + { "" } + { title "t" change.case$ emphasize } + if$ +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +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 +} + +FUNCTION {format.numberinseries} +{ number empty$ + { "" } + { number multi.page.check + { ", nos. " number n.dashify tie.or.space.connect } + { ", no. " number tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {booklike.series.volume.number} % Chicago, pages +{ series empty$ % 450-451. + { volume empty$ + { " " } + { " Vol. " volume * } + if$ + } + { + volume empty$ + { number empty$ + { series } + { series format.numberinseries * } + if$ + } + { number empty$ + { series ", vol. " volume * * } + { series ", vol. " * volume * format.numberinseries * } + if$ + } + if$ + } + if$ +} + +FUNCTION {incollectionlike.series.volume.number} +{ series empty$ + { volume empty$ + { " " } + { " vol. " volume * } + if$ + } + { new.block + volume empty$ + { number empty$ + { series } + { series format.numberinseries * } + if$ + } + { number empty$ + { series ", vol. " volume * * } + { series ", vol. " * volume * format.numberinseries * } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ " edn." * } + { edition "t" change.case$ " edn." * } + if$ + } + if$ +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { "" pages n.dashify tie.or.space.connect } + { "" pages tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {format.pagesinbook} % By the time the +{ pages empty$ % reader has read + { "" } % address, pub'r, + { pages multi.page.check % note (where the + { "Pages " pages n.dashify tie.or.space.connect } % note may end with + { "Page " pages tie.or.space.connect } % numbers), s/he + if$ % may not recognise + } % a number-range as + if$ % meaning pages. +} % Avoid ambiguity + % (Butcher, p.181). + +FUNCTION {format.vol.num.date.pages} +{ volume empty$ + { month empty$ + { "" } + { month } + if$ + } + { volume boldface field.or.null + number empty$ + { month empty$ + 'skip$ + { "(" month * ")" * * } + if$ + } + { "(" number * ")" * * + volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + } + if$ + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ", " * pages n.dashify * } + if$ + } + if$ +} + +FUNCTION {format.chapter.pages.inbook} +{ chapter empty$ + 'format.pagesinbook + { type empty$ + { "Chap." } + { type } + if$ + chapter tie.or.space.connect + pages empty$ + 'skip$ + { ", " * format.pagesinbook "l" change.case$ * } + if$ + } + if$ +} + +FUNCTION {format.chapter.pages.incoll} +{ chapter empty$ + { pages empty$ + { "{\em In:} " } + { "{\em " format.pagesinbook " of:} " * * } + if$ + } + { type empty$ + { "{\em Chap. " chapter * } + { "{\em " type * " " * chapter * } + if$ + pages empty$ + { " of:} " * } + { ", " * format.pagesinbook "l" change.case$ " of:} " * * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} % Achieves effect +{ booktitle empty$ % shown in 16.51 + { "" } % of Chicago, at + { editor empty$ % expense of not + { format.chapter.pages.incoll % achieving effects + booktitle "t" change.case$ emphasize * } % shown in 16.50 + { format.chapter.pages.incoll % of Chicago, on + format.editors * ", " * % page 189 of + booktitle "t" change.case$ emphasize * } % Butcher and in + if$ % 4.4 of BS 1629. + } + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { "Tech. rept." } % ODWE abbrevs. + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {format.addr.pub} +{ publisher empty$ + { "" } + { address empty$ + { "" } + { address ": " * } + if$ + publisher * + } + if$ +} + +FUNCTION {format.addr.pub.org} % If there's an +{ address empty$ % an organization + { publisher * ", for " * organization * } % and a publisher + { address ": " * publisher * ", for " * organization * } % too. + if$ +} + +FUNCTION {format.addr.inst} +{ address empty$ + { institution empty$ + { "" } + { institution } + if$ + } + { institution empty$ + { "" } + { institution ", " * } + if$ + address * + } + if$ +} + +FUNCTION {format.addr.org} +{ address empty$ + { organization empty$ + { "" } + { organization } + if$ + } + { organization empty$ + { "" } + { organization ", " * } + if$ + address * + } + if$ +} + +FUNCTION {format.article.crossref} +{ "{\em In:}" + " \cite{" * crossref * "}" * +} + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + "{\em In:}" + } + { " Vol." volume tie.or.space.connect + " of " * + } + if$ + "\cite{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ "{\em In:}" + " \cite{" * crossref * "}" * +} + + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + author format.key output + output.year.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { journal "t" change.case$ emphasize + "journal" output.check + format.vol.num.date.pages output + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + new.block + note output + fin.entry +% NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + output.year.check + new.block + format.btitle "title" output.check + crossref missing$ + { new.sentence + format.edition output + new.block + booklike.series.volume.number output + new.block + format.addr.pub "publisher" output.check + } + { new.block + format.book.crossref output.nonnull + } + if$ + new.block + note output + fin.entry +% NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + author format.key output + output.year.month.check + new.block + format.btitle "title" output.check + new.block + howpublished output + address output + new.block + note output + fin.entry +% NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check + editor format.key output + } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + output.year.check + new.block + format.btitle "title" output.check + crossref missing$ + { new.sentence + format.edition output + new.block + booklike.series.volume.number output + new.block + format.addr.pub "publisher" output.check + } + { new.block + format.book.crossref output.nonnull + } + if$ + new.block + note output + new.block % BS 1629 (rather + format.chapter.pages.inbook "chapter and pages" output.check + fin.entry % than Chicago, p. 451 +% NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {incollection} +{ output.bibitem + author empty$ + { format.editors "editor" output.check + editor format.key output } + { format.authors "author" output.check + author format.key output } + if$ + output.year.check + new.block + format.title "title" output.check + new.block + crossref missing$ % Chapter and/or + { format.in.ed.booktitle output % page numbers can + format.edition output % come out via this + incollectionlike.series.volume.number output % route, too. + new.block + format.addr.pub "publisher" output.check + } + { format.incoll.inproc.crossref output.nonnull + new.block + } + if$ + new.block + note output + fin.entry + % NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + author format.key output + publisher empty$ + { output.year.month.check } + { output.year.check } + if$ + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + incollectionlike.series.volume.number output + new.block + publisher empty$ + { + organization empty$ + 'skip$ + { format.addr.org output } + if$ + } + { + organization empty$ + { format.addr.pub output } + { format.addr.pub.org output } + if$ + } + if$ + } + { format.incoll.inproc.crossref output.nonnull + } + if$ + new.block + note output + fin.entry + % NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + format.authors output + author format.key output + output.year.month.check + new.block + format.btitle "title" output.check + new.sentence + format.edition output + new.block + organization address new.block.checkb + format.addr.org output + new.block + note output + fin.entry + % NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + output.year.month.check + new.block + format.btitle "title" output.check + new.block + "M.Phil. thesis" format.thesis.type output.nonnull % ODWE abbrev. + school "school" output.check + address output + new.block + note output + fin.entry +% NST: added for annotation + format.annotate write$ + newline$ + +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + author format.key output + output.year.month.check + new.block + format.btitle output + new.block + howpublished output + new.block + note output + fin.entry +% NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + author format.key output + output.year.month.check + new.block + format.btitle "title" output.check + new.block + "Ph.D. thesis" format.thesis.type output.nonnull % Butcher, + school "school" output.check % page 174. + address output + new.block + note output + fin.entry +% NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {proceedings} +{ output.bibitem + format.editors "author and editor" output.check + editor format.key output + publisher empty$ + { output.year.month.check } + { output.year.check } + if$ + new.block + format.btitle "title" output.check + new.block + booklike.series.volume.number output + new.block + publisher empty$ + { + organization empty$ + 'skip$ + { format.addr.org output } + if$ + } + { + organization empty$ + { format.addr.pub output } + { format.addr.pub.org output } + if$ + } + if$ + new.block + note output + fin.entry +% NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + author format.key output + output.year.month.check + new.block + format.btitle "title" output.check + new.block + format.tr.number output.nonnull + new.sentence + format.addr.inst "institution" output.check + new.block + note output + fin.entry +% NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + author format.key output + output.year.month.check + new.block + format.btitle "title" output.check + new.block + note "note" output.check + fin.entry +% NST: added for annotation + format.annotate write$ + newline$ +} + +FUNCTION {default.type} { misc } + +MACRO {jan} {"Jan."} % ODWE, "months", & + % Chicago, p. 383. +MACRO {feb} {"Feb."} + +MACRO {mar} {"Mar."} + +MACRO {apr} {"Apr."} + +MACRO {may} {"May"} + +MACRO {jun} {"June"} + +MACRO {jul} {"July"} + +MACRO {aug} {"Aug."} + +MACRO {sep} {"Sept."} + +MACRO {oct} {"Oct."} + +MACRO {nov} {"Nov."} + +MACRO {dec} {"Dec."} + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +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 {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +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 {tcs} {"Theoretical Computer Science"} + +READ + +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$ +} + +FUNCTION {format.lab.names} +{ 's := + s #1 "{vv~}{ll}" format.name$ + s num.names$ duplicate$ + #2 > + { pop$ " {\em et~al.}" * } + { #2 < + 'skip$ + { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { " {\em et~al.}" * } + { " \& " * s #2 "{vv~}{ll}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.label} +{ editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + 'key + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.label} + { type$ "book" = + type$ "inbook" = + type$ "incollection" = % For sensible + or or % treatment of + 'author.editor.key.label % Singer in + { type$ "proceedings" = % BS 1629. + 'editor.key.label + 'author.key.label + if$ + } + if$ + duplicate$ + year empty$ + { + "\protect\citename{" swap$ * ", }" * + "n.d." * 'label := % Chicago, + } % page 457. + { + "\protect\citename{" swap$ * ", }" * + year + * + 'label := + } + if$ + year field.or.null purify$ * + sortify 'sort.label := +} + + +FUNCTION {sort.format.names} % To produce the +{ 's := % order of entries + #1 'nameptr := % specified in item + "" % (3) on page 187 + s num.names$ 'numnames := % of Butcher. + numnames 'namesleft := + { namesleft #0 > nameptr #3 < and } % Only 1st 2 names + { nameptr #1 > % matter for + { " " * } % sorting. + 'skip$ + if$ % Anything that's + nameptr #2 = numnames #2 > and % "et al" goes + { "zzzzz" * } % after works by 2 + { % authors. + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = t "others" = and + { "zzzzz" * } + { t sortify * } + if$ + } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.editor.sort} +{ 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$ +} + +FUNCTION {editor.sort} +{ editor empty$ + { key empty$ + { "to sort, need editor or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} % Two sorting +{ calc.label % passes, from + label sortify % apalike.bst. + " " + * + type$ "book" = + type$ "inbook" = + type$ "incollection" = % For Singer + or or % in BS 1629. + 'author.editor.sort + { type$ "proceedings" = + 'editor.sort + 'author.sort + if$ + } + if$ + #1 entry.max$ substring$ + 'sort.label := + sort.label + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +SORT + +STRINGS { last.label next.extra } + +INTEGERS { last.extra.num } + +FUNCTION {initialize.extra.label.stuff} +{ #0 int.to.chr$ 'last.label := + "" 'next.extra := + #0 'last.extra.num := +} + +FUNCTION {forward.pass} +{ last.label label = + { last.extra.num #1 + 'last.extra.num := + last.extra.num int.to.chr$ 'extra.label := + } + { "a" chr.to.int$ 'last.extra.num := + "" 'extra.label := + label 'last.label := + } + if$ +} + +FUNCTION {reverse.pass} +{ next.extra "b" = + { "a" 'extra.label := } + 'skip$ + if$ % Code needed here + % if \citeauthor + % and \citeyear + label extra.label * 'label := % were supported. + extra.label 'next.extra := +} + +EXECUTE {initialize.extra.label.stuff} + +ITERATE {forward.pass} + +REVERSE {reverse.pass} + +FUNCTION {bib.sort.order} +{ sort.label + " " + * + year field.or.null sortify + * + " " + * + title field.or.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {bib.sort.order} + +SORT + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{}" write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{thebibliography}" write$ newline$ +} + +EXECUTE {end.bib} diff --git a/docs/project-outline/mmp.bib b/docs/project-outline/mmp.bib new file mode 100644 index 0000000..4b9131b --- /dev/null +++ b/docs/project-outline/mmp.bib @@ -0,0 +1,111 @@ + +@article{dcnn, + title = {Photo {Aesthetics} {Analysis} via {DCNN} {Feature} {Encoding}}, + volume = {19}, + issn = {1941-0077}, + doi = {10.1109/TMM.2017.2687759}, + abstract = {We propose an automatic framework for quality assessment of a photograph as well as analysis of its aesthetic attributes. In contrast to the previous methods that rely on manually designed features to account for photo aesthetics, our method automatically extracts such features using a pretrained deep convolutional neural network (DCNN). To make the DCNN-extracted features more suited to our target tasks of photo quality assessment and aesthetic attribute analysis, we propose a novel feature encoding scheme, which supports vector machines-driven sparse restricted Boltzmann machines, which enhances sparseness of features and discrimination between target classes. Experimental results show that our method outperforms the current state-of-the-art methods in automatic photo quality assessment, and gives aesthetic attribute ratings that can be used for photo editing. We demonstrate that our feature encoding scheme can also be applied to general object classification task to achieve performance gains.}, + number = {8}, + journal = {IEEE Transactions on Multimedia}, + author = {Lee, Hui-Jin and Hong, Ki-Sang and Kang, Henry and Lee, Seungyong}, + month = aug, + year = {2017}, + note = {Conference Name: IEEE Transactions on Multimedia}, + keywords = {Aesthetic attributes, deep convolutional neural network (DCNN), Encoding, feature encoding, Feature extraction, Mathematical model, Neural networks, photo aesthetics, Quality assessment, restricted Boltzmann machines, Support vector machines, Training}, + pages = {1921--1932}, + annote = {This paper discusses the use of a Convolution Neural Network to predict how aesthetic a given picture is.}, + file = {IEEE Xplore Abstract Record:/home/noble/Zotero/storage/E6YUFLQE/7886320.html:text/html}, +} + +@inproceedings{ava_paper, + title = {{AVA}: {A} large-scale database for aesthetic visual analysis}, + shorttitle = {{AVA}}, + doi = {10.1109/CVPR.2012.6247954}, + abstract = {With the ever-expanding volume of visual content available, the ability to organize and navigate such content by aesthetic preference is becoming increasingly important. While still in its nascent stage, research into computational models of aesthetic preference already shows great potential. However, to advance research, realistic, diverse and challenging databases are needed. To this end, we introduce a new large-scale database for conducting Aesthetic Visual Analysis: AVA. It contains over 250,000 images along with a rich variety of meta-data including a large number of aesthetic scores for each image, semantic labels for over 60 categories as well as labels related to photographic style. We show the advantages of AVA with respect to existing databases in terms of scale, diversity, and heterogeneity of annotations. We then describe several key insights into aesthetic preference afforded by AVA. Finally, we demonstrate, through three applications, how the large scale of AVA can be leveraged to improve performance on existing preference tasks.}, + booktitle = {2012 {IEEE} {Conference} on {Computer} {Vision} and {Pattern} {Recognition}}, + author = {Murray, Naila and Marchesotti, Luca and Perronnin, Florent}, + month = jun, + year = {2012}, + note = {ISSN: 1063-6919}, + keywords = {Communities, Image color analysis, Semantics, Social network services, Visual databases, Visualization}, + pages = {2408--2415}, + annote = {A paper that discusses the creation of the AVA dataset. It's composed of 250 thousand aesthetic images collected from a photography competition website along with grades for aesthetic features.}, + file = {IEEE Xplore Abstract Record:/home/noble/Zotero/storage/HE3EFVJV/6247954.html:text/html}, +} + +@misc{AADB, + title = {Photo {Aesthetics} {Ranking} {Network} with {Attributes} and {Content} {Adaptation}}, + url = {https://github.com/aimerykong/deepImageAestheticsAnalysis}, + abstract = {ECCV2016 - fine-grained photo aesthetics rating with interpretability}, + urldate = {2022-02-11}, + author = {Kong, Shu}, + month = jan, + year = {2022}, + note = {original-date: 2016-06-05T06:08:10Z}, + annote = {A tool that uses the AADB dataset to predict the aesthetics of a given picture using a CNN.}, +} + +@misc{pytorch, + title = {{PyTorch}}, + url = {https://www.pytorch.org}, + abstract = {An open source machine learning framework that accelerates the path from research prototyping to production deployment.}, + language = {en}, + urldate = {2022-02-11}, + author = {{Adam Paszke} and {Sam Gross} and {Soumith Chintala} and {Gregory Chanan}}, + annote = {An open-source machine learning framework developed by Facebook (based on the Torch library)}, + file = {Snapshot:/home/noble/Zotero/storage/HPSFJGU3/pytorch.org.html:text/html}, +} + +@misc{opencv, + title = {{OpenCV}}, + url = {https://opencv.org}, + abstract = {OpenCV provides a real-time optimized Computer Vision library, tools, and hardware. It also supports model execution for Machine Learning (ML) and Artificial Intelligence (AI).}, + language = {en-US}, + urldate = {2022-02-11}, + journal = {OpenCV}, + author = {{Intel Corporation} and {Willow Garage} and {Itseez}}, + annote = {An open source library used for real-time computer vision.}, + file = {Snapshot:/home/noble/Zotero/storage/JYX6KIPC/opencv.org.html:text/html}, +} + +@misc{ava_downloader, + title = {{AVA} {Dataset}}, + url = {https://github.com/imfing/ava_downloader}, + abstract = {:arrow\_double\_down: Download AVA dataset (A Large-Scale Database for Aesthetic Visual Analysis)}, + urldate = {2022-02-11}, + author = {Fing}, + month = feb, + year = {2022}, + note = {original-date: 2016-11-13T02:20:32Z}, + keywords = {aesthetic-visual-analysis, ava, computer-vision, dataset, python}, + annote = {A project with tools required to build the AVA dateset.}, +} + +@misc{image_quality_assessment, + title = {Image {Quality} {Assessment}}, + copyright = {Apache-2.0}, + url = {https://github.com/idealo/image-quality-assessment}, + abstract = {Convolutional Neural Networks to predict the aesthetic and technical quality of images.}, + urldate = {2022-02-11}, + publisher = {idealo}, + month = feb, + year = {2022}, + note = {original-date: 2018-06-12T14:46:09Z}, + keywords = {aws, computer-vision, convolutional-neural-networks, deep-learning, e-commerce, idealo, image-quality-assessment, keras, machine-learning, mobilenet, neural-network, nima, tensorflow}, + annote = {An open source tool developed by Idealo which uses a CNN to predict the aesthetic value of a given image.}, +} + +@misc{tensorflow, + title = {{TensorFlow}}, + url = {https://www.tensorflow.org/}, + urldate = {2022-02-11}, + author = {{Google Brain Team}}, + annote = {Open-source library for machine learning and AI developed by Google.}, +} + +@misc{flutter, + title = {Flutter - {Build} apps for any screen}, + url = {https://flutter.dev/}, + abstract = {Flutter transforms the entire app development process. Build, test, and deploy beautiful mobile, web, desktop, and embedded apps from a single codebase.}, + urldate = {2022-02-11}, +} diff --git a/docs/project-outline/mmpv2.sty b/docs/project-outline/mmpv2.sty new file mode 100644 index 0000000..dcc58ae --- /dev/null +++ b/docs/project-outline/mmpv2.sty @@ -0,0 +1,130 @@ +%% LaTeX class to write Major/Minor projects for the Computer Science Department, +%% Aberystwyth University. +%% +%% Written by Neil Taylor +%% Comments and bugs to nst@aber.ac.uk +%% +%% See the accompanying file MMP_ProgressReport_example.tex for an example on how to +%% use it. +%% +\ProvidesPackage{mmpv2} +\usepackage[a4paper,margin=2.5cm,nohead, headheight=3cm, headsep=20pt]{geometry} +\usepackage{graphicx} %to allow images to be imported see example at end of template + +\newcommand{\is}{\hspace*{0.2in}} %little indent space + +\newcommand{\mmpdocdate}{\today} + +\newcommand{\documentdate}[1]{ + \renewcommand{\mmpdocdate}{#1} +} + +\newcommand{\name}[1]{ + \newcommand{\showname}{#1} +} + +\newcommand{\userid}[1]{ + \newcommand{\showuserid}{#1} +} + +\newcommand{\supervisor}[1]{ + \newcommand{\showsupervisor}{#1} +} + +\newcommand{\supervisorid}[1]{ + \newcommand{\showsupervisorid}{#1} +} + +\newcommand{\projecttitle}[1]{ + \newcommand{\showprojecttitle}{#1} +} + +\newcommand{\reporttitle}[1]{ + \newcommand{\showreporttitle}{#1} +} + +\newcommand{\projecttitlememoir}[1]{ + \newcommand{\showprojecttitlememoir}{#1} +} + +\newcommand{\version}[1]{ + \newcommand{\showversion}{#1} +} + +\newcommand{\docstatus}[1]{ + \newcommand{\showdocstatus}{#1} +} + +\newcommand{\degreeschemecode}[1]{ + \newcommand{\showdegreeschemecode}{#1} +} + +\newcommand{\degreeschemename}[1]{ + \newcommand{\showdegreeschemename}{#1} +} + +\newcommand{\modulecode}[1]{ + \newcommand{\showmodulecode}{#1} +} + +\newcommand{\helv}{ + %bold, 18point, 21point line spacing + \fontfamily{phv}\fontseries{b}\fontsize{18}{21}\selectfont +} + +\newcommand{\mmp}{ +\pagestyle{fancy} +\thispagestyle{empty} %no headers/footers on title page +% +\begin{center} +\parbox{\textwidth}{ + \begin{center} \helv + \showprojecttitle + \end{center} +} +% +\vspace{0.3in}\\ +% +\fontsize{10}{12} +\selectfont +\begin{tabular}[t]{ll} + \hline + \\ + Report Name & \parbox{4in}{\showreporttitle}\\ + Author (User Id) & \parbox{4in}{\showname \hspace*{0.05in}(\showuserid)}\\ + Supervisor (User Id) & \showsupervisor \hspace*{0.05in}(\showsupervisorid)\\ + \\ + Module & \parbox{4in}{\showmodulecode}\\ + Degree Scheme & \showdegreeschemecode \hspace*{0.05in}(\showdegreeschemename)\\ + \\ + Date & \mmpdocdate\\ + Revision & \showversion\\ + Status & \showdocstatus\\ + \\ + \hline + \vspace{0.1in} + \end{tabular} + \end{center} + % + \pagebreak + \newpage + \makeheaders + \setcounter{page}{1} + \normalsize +} + +%============================================================================== +%header and footer information +%============================================================================== +\newcommand{\makeheaders}{ + \fancyhead{} + %Right on Odd numberd pages and Left on Even numbered pages + \fancyhead[LO,RE]{{\showreporttitle} - {\showversion} ({\showdocstatus})} + \fancyhead[RO,LE]{{\showname} ({\showuserid})} + \fancyfoot{} + \fancyfoot[RO,LE]{{\thepage} of {\pageref{LastPage}}} + \fancyfoot[LO,RE]{\showprojecttitlememoir} + \renewcommand{\headrulewidth}{0.0pt} + \renewcommand{\footrulewidth}{0.0pt} +} + diff --git a/docs/project-outline/project-outline-osp1.pdf b/docs/project-outline/project-outline-osp1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2503fff81a17a41c2b67038f38303d60d57ec8e7 GIT binary patch literal 74132 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 z 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