hpcs-17-collector

Using Virtualisation for Reproducible Research and Code Portability
git clone https://git.igankevich.com/hpcs-17-collector.git
Log | Files | Refs

IEEEtran.bst (59215B)


      1 %%
      2 %% IEEEtran.bst
      3 %% BibTeX Bibliography Style file for IEEE Journals and Conferences (unsorted)
      4 %% Version 1.12 (2007/01/11)
      5 %% 
      6 %% Copyright (c) 2003-2007 Michael Shell
      7 %% 
      8 %% Original starting code base and algorithms obtained from the output of
      9 %% Patrick W. Daly's makebst package as well as from prior versions of
     10 %% IEEE BibTeX styles:
     11 %% 
     12 %% 1. Howard Trickey and Oren Patashnik's ieeetr.bst  (1985/1988)
     13 %% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993)
     14 %% 
     15 %% Support sites:
     16 %% http://www.michaelshell.org/tex/ieeetran/
     17 %% http://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/
     18 %% and/or
     19 %% http://www.ieee.org/
     20 %% 
     21 %% For use with BibTeX version 0.99a or later
     22 %%
     23 %% This is a numerical citation style.
     24 %% 
     25 %%*************************************************************************
     26 %% Legal Notice:
     27 %% This code is offered as-is without any warranty either expressed or
     28 %% implied; without even the implied warranty of MERCHANTABILITY or
     29 %% FITNESS FOR A PARTICULAR PURPOSE! 
     30 %% User assumes all risk.
     31 %% In no event shall IEEE or any contributor to this code be liable for
     32 %% any damages or losses, including, but not limited to, incidental,
     33 %% consequential, or any other damages, resulting from the use or misuse
     34 %% of any information contained here.
     35 %%
     36 %% All comments are the opinions of their respective authors and are not
     37 %% necessarily endorsed by the IEEE.
     38 %%
     39 %% This work is distributed under the LaTeX Project Public License (LPPL)
     40 %% ( http://www.latex-project.org/ ) version 1.3, and may be freely used,
     41 %% distributed and modified. A copy of the LPPL, version 1.3, is included
     42 %% in the base LaTeX documentation of all distributions of LaTeX released
     43 %% 2003/12/01 or later.
     44 %% Retain all contribution notices and credits.
     45 %% ** Modified files should be clearly indicated as such, including  **
     46 %% ** renaming them and changing author support contact information. **
     47 %%
     48 %% File list of work: IEEEabrv.bib, IEEEfull.bib, IEEEexample.bib,
     49 %%                    IEEEtran.bst, IEEEtranS.bst, IEEEtranSA.bst,
     50 %%                    IEEEtranN.bst, IEEEtranSN.bst, IEEEtran_bst_HOWTO.pdf
     51 %%*************************************************************************
     52 %
     53 %
     54 % Changelog:
     55 %
     56 % 1.00 (2002/08/13) Initial release
     57 %
     58 % 1.10 (2002/09/27)
     59 %  1. Corrected minor bug for improperly formed warning message when a
     60 %     book was not given a title. Thanks to Ming Kin Lai for reporting this.
     61 %  2. Added support for CTLname_format_string and CTLname_latex_cmd fields
     62 %     in the BST control entry type.
     63 %
     64 % 1.11 (2003/04/02)
     65 %  1. Fixed bug with URLs containing underscores when using url.sty. Thanks
     66 %     to Ming Kin Lai for reporting this.
     67 %
     68 % 1.12 (2007/01/11)
     69 %  1. Fixed bug with unwanted comma before "et al." when an entry contained
     70 %     more than two author names. Thanks to Pallav Gupta for reporting this.
     71 %  2. Fixed bug with anomalous closing quote in tech reports that have a
     72 %     type, but without a number or address. Thanks to Mehrdad Mirreza for
     73 %     reporting this.
     74 %  3. Use braces in \providecommand in begin.bib to better support
     75 %     latex2html. TeX style length assignments OK with recent versions
     76 %     of latex2html - 1.71 (2002/2/1) or later is strongly recommended.
     77 %     Use of the language field still causes trouble with latex2html.
     78 %     Thanks to Federico Beffa for reporting this.
     79 %  4. Added IEEEtran.bst ID and version comment string to .bbl output.
     80 %  5. Provide a \BIBdecl hook that allows the user to execute commands
     81 %     just prior to the first entry.
     82 %  6. Use default urlstyle (is using url.sty) of "same" rather than rm to
     83 %     better work with a wider variety of bibliography styles.
     84 %  7. Changed month abbreviations from Sept., July and June to Sep., Jul.,
     85 %     and Jun., respectively, as IEEE now does. Thanks to Moritz Borgmann
     86 %     for reporting this.
     87 %  8. Control entry types should not be considered when calculating longest
     88 %     label width.
     89 %  9. Added alias www for electronic/online.
     90 % 10. Added CTLname_url_prefix control entry type.
     91 
     92 
     93 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     94 %% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %%
     95 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     96 
     97 % These are the defaults for the user adjustable controls. The values used
     98 % here can be overridden by the user via IEEEtranBSTCTL entry type.
     99 
    100 % NOTE: The recommended LaTeX command to invoke a control entry type is:
    101 % 
    102 %\makeatletter
    103 %\def\bstctlcite{\@ifnextchar[{\@bstctlcite}{\@bstctlcite[@auxout]}}
    104 %\def\@bstctlcite[#1]#2{\@bsphack
    105 %  \@for\@citeb:=#2\do{%
    106 %    \edef\@citeb{\expandafter\@firstofone\@citeb}%
    107 %    \if@filesw\immediate\write\csname #1\endcsname{\string\citation{\@citeb}}\fi}%
    108 %  \@esphack}
    109 %\makeatother
    110 %
    111 % It is called at the start of the document, before the first \cite, like:
    112 % \bstctlcite{IEEEexample:BSTcontrol}
    113 %
    114 % IEEEtran.cls V1.6 and later does provide this command.
    115 
    116 
    117 
    118 % #0 turns off the display of the number for articles.
    119 % #1 enables
    120 FUNCTION {default.is.use.number.for.article} { #1 }
    121 
    122 
    123 % #0 turns off the display of the paper and type fields in @inproceedings.
    124 % #1 enables
    125 FUNCTION {default.is.use.paper} { #1 }
    126 
    127 
    128 % #0 turns off the forced use of "et al."
    129 % #1 enables
    130 FUNCTION {default.is.forced.et.al} { #0 }
    131 
    132 % The maximum number of names that can be present beyond which an "et al."
    133 % usage is forced. Be sure that num.names.shown.with.forced.et.al (below)
    134 % is not greater than this value!
    135 % Note: There are many instances of references in IEEE journals which have
    136 % a very large number of authors as well as instances in which "et al." is
    137 % used profusely.
    138 FUNCTION {default.max.num.names.before.forced.et.al} { #10 }
    139 
    140 % The number of names that will be shown with a forced "et al.".
    141 % Must be less than or equal to max.num.names.before.forced.et.al
    142 FUNCTION {default.num.names.shown.with.forced.et.al} { #1 }
    143 
    144 
    145 % #0 turns off the alternate interword spacing for entries with URLs.
    146 % #1 enables
    147 FUNCTION {default.is.use.alt.interword.spacing} { #1 }
    148 
    149 % If alternate interword spacing for entries with URLs is enabled, this is
    150 % the interword spacing stretch factor that will be used. For example, the
    151 % default "4" here means that the interword spacing in entries with URLs can
    152 % stretch to four times normal. Does not have to be an integer. Note that
    153 % the value specified here can be overridden by the user in their LaTeX
    154 % code via a command such as: 
    155 % "\providecommand\BIBentryALTinterwordstretchfactor{1.5}" in addition to
    156 % that via the IEEEtranBSTCTL entry type.
    157 FUNCTION {default.ALTinterwordstretchfactor} { "4" }
    158 
    159 
    160 % #0 turns off the "dashification" of repeated (i.e., identical to those
    161 % of the previous entry) names. IEEE normally does this.
    162 % #1 enables
    163 FUNCTION {default.is.dash.repeated.names} { #1 }
    164 
    165 
    166 % The default name format control string.
    167 FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" }
    168 
    169 
    170 % The default LaTeX font command for the names.
    171 FUNCTION {default.name.latex.cmd}{ "" }
    172 
    173 
    174 % The default URL prefix.
    175 FUNCTION {default.name.url.prefix}{ "[Online]. Available:" }
    176 
    177 
    178 % Other controls that cannot be accessed via IEEEtranBSTCTL entry type.
    179 
    180 % #0 turns off the terminal startup banner/completed message so as to
    181 % operate more quietly.
    182 % #1 enables
    183 FUNCTION {is.print.banners.to.terminal} { #1 }
    184 
    185 
    186 
    187 
    188 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    189 %% FILE VERSION AND BANNER %%
    190 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    191 
    192 FUNCTION{bst.file.version} { "1.12" }
    193 FUNCTION{bst.file.date} { "2007/01/11" }
    194 FUNCTION{bst.file.website} { "http://www.michaelshell.org/tex/ieeetran/bibtex/" }
    195 
    196 FUNCTION {banner.message}
    197 { is.print.banners.to.terminal
    198      { "-- IEEEtran.bst version" " " * bst.file.version *
    199        " (" * bst.file.date * ") " * "by Michael Shell." *
    200        top$
    201        "-- " bst.file.website *
    202        top$
    203        "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * " manual for usage information." *
    204        top$
    205      }
    206      { skip$ }
    207    if$
    208 }
    209 
    210 FUNCTION {completed.message}
    211 { is.print.banners.to.terminal
    212      { ""
    213        top$
    214        "Done."
    215        top$
    216      }
    217      { skip$ }
    218    if$
    219 }
    220 
    221 
    222 
    223 
    224 %%%%%%%%%%%%%%%%%%%%%%
    225 %% STRING CONSTANTS %%
    226 %%%%%%%%%%%%%%%%%%%%%%
    227 
    228 FUNCTION {bbl.and}{ "and" }
    229 FUNCTION {bbl.etal}{ "et~al." }
    230 FUNCTION {bbl.editors}{ "eds." }
    231 FUNCTION {bbl.editor}{ "ed." }
    232 FUNCTION {bbl.edition}{ "ed." }
    233 FUNCTION {bbl.volume}{ "vol." }
    234 FUNCTION {bbl.of}{ "of" }
    235 FUNCTION {bbl.number}{ "no." }
    236 FUNCTION {bbl.in}{ "in" }
    237 FUNCTION {bbl.pages}{ "pp." }
    238 FUNCTION {bbl.page}{ "p." }
    239 FUNCTION {bbl.chapter}{ "ch." }
    240 FUNCTION {bbl.paper}{ "paper" }
    241 FUNCTION {bbl.part}{ "pt." }
    242 FUNCTION {bbl.patent}{ "Patent" }
    243 FUNCTION {bbl.patentUS}{ "U.S." }
    244 FUNCTION {bbl.revision}{ "Rev." }
    245 FUNCTION {bbl.series}{ "ser." }
    246 FUNCTION {bbl.standard}{ "Std." }
    247 FUNCTION {bbl.techrep}{ "Tech. Rep." }
    248 FUNCTION {bbl.mthesis}{ "Master's thesis" }
    249 FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" }
    250 FUNCTION {bbl.st}{ "st" }
    251 FUNCTION {bbl.nd}{ "nd" }
    252 FUNCTION {bbl.rd}{ "rd" }
    253 FUNCTION {bbl.th}{ "th" }
    254 
    255 
    256 % This is the LaTeX spacer that is used when a larger than normal space
    257 % is called for (such as just before the address:publisher).
    258 FUNCTION {large.space} { "\hskip 1em plus 0.5em minus 0.4em\relax " }
    259 
    260 % The LaTeX code for dashes that are used to represent repeated names.
    261 % Note: Some older IEEE journals used something like
    262 % "\rule{0.275in}{0.5pt}\," which is fairly thick and runs right along
    263 % the baseline. However, IEEE now uses a thinner, above baseline,
    264 % six dash long sequence.
    265 FUNCTION {repeated.name.dashes} { "------" }
    266 
    267 
    268 
    269 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    270 %% PREDEFINED STRING MACROS %%
    271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    272 
    273 MACRO {jan} {"Jan."}
    274 MACRO {feb} {"Feb."}
    275 MACRO {mar} {"Mar."}
    276 MACRO {apr} {"Apr."}
    277 MACRO {may} {"May"}
    278 MACRO {jun} {"Jun."}
    279 MACRO {jul} {"Jul."}
    280 MACRO {aug} {"Aug."}
    281 MACRO {sep} {"Sep."}
    282 MACRO {oct} {"Oct."}
    283 MACRO {nov} {"Nov."}
    284 MACRO {dec} {"Dec."}
    285 
    286 
    287 
    288 %%%%%%%%%%%%%%%%%%
    289 %% ENTRY FIELDS %%
    290 %%%%%%%%%%%%%%%%%%
    291 
    292 ENTRY
    293   { address
    294     assignee
    295     author
    296     booktitle
    297     chapter
    298     day
    299     dayfiled
    300     edition
    301     editor
    302     howpublished
    303     institution
    304     intype
    305     journal
    306     key
    307     language
    308     month
    309     monthfiled
    310     nationality
    311     note
    312     number
    313     organization
    314     pages
    315     paper
    316     publisher
    317     school
    318     series
    319     revision
    320     title
    321     type
    322     url
    323     volume
    324     year
    325     yearfiled
    326     CTLuse_article_number
    327     CTLuse_paper
    328     CTLuse_forced_etal
    329     CTLmax_names_forced_etal
    330     CTLnames_show_etal
    331     CTLuse_alt_spacing
    332     CTLalt_stretch_factor
    333     CTLdash_repeated_names
    334     CTLname_format_string
    335     CTLname_latex_cmd
    336     CTLname_url_prefix
    337   }
    338   {}
    339   { label }
    340 
    341 
    342 
    343 
    344 %%%%%%%%%%%%%%%%%%%%%%%
    345 %% INTEGER VARIABLES %%
    346 %%%%%%%%%%%%%%%%%%%%%%%
    347 
    348 INTEGERS { prev.status.punct this.status.punct punct.std
    349            punct.no punct.comma punct.period 
    350            prev.status.space this.status.space space.std
    351            space.no space.normal space.large
    352            prev.status.quote this.status.quote quote.std
    353            quote.no quote.close
    354            prev.status.nline this.status.nline nline.std
    355            nline.no nline.newblock 
    356            status.cap cap.std
    357            cap.no cap.yes}
    358 
    359 INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames }
    360 
    361 INTEGERS { is.use.number.for.article
    362            is.use.paper
    363            is.forced.et.al
    364            max.num.names.before.forced.et.al
    365            num.names.shown.with.forced.et.al
    366            is.use.alt.interword.spacing
    367            is.dash.repeated.names}
    368 
    369 
    370 %%%%%%%%%%%%%%%%%%%%%%
    371 %% STRING VARIABLES %%
    372 %%%%%%%%%%%%%%%%%%%%%%
    373 
    374 STRINGS { bibinfo
    375           longest.label
    376           oldname
    377           s
    378           t
    379           ALTinterwordstretchfactor
    380           name.format.string
    381           name.latex.cmd
    382           name.url.prefix}
    383 
    384 
    385 
    386 
    387 %%%%%%%%%%%%%%%%%%%%%%%%%
    388 %% LOW LEVEL FUNCTIONS %%
    389 %%%%%%%%%%%%%%%%%%%%%%%%%
    390 
    391 FUNCTION {initialize.controls}
    392 { default.is.use.number.for.article 'is.use.number.for.article :=
    393   default.is.use.paper 'is.use.paper :=
    394   default.is.forced.et.al 'is.forced.et.al :=
    395   default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al :=
    396   default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al :=
    397   default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing :=
    398   default.is.dash.repeated.names 'is.dash.repeated.names :=
    399   default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor :=
    400   default.name.format.string 'name.format.string :=
    401   default.name.latex.cmd 'name.latex.cmd :=
    402   default.name.url.prefix 'name.url.prefix :=
    403 }
    404 
    405 
    406 % This IEEEtran.bst features a very powerful and flexible mechanism for
    407 % controlling the capitalization, punctuation, spacing, quotation, and
    408 % newlines of the formatted entry fields. (Note: IEEEtran.bst does not need
    409 % or use the newline/newblock feature, but it has been implemented for
    410 % possible future use.) The output states of IEEEtran.bst consist of
    411 % multiple independent attributes and, as such, can be thought of as being
    412 % vectors, rather than the simple scalar values ("before.all", 
    413 % "mid.sentence", etc.) used in most other .bst files.
    414 % 
    415 % The more flexible and complex design used here was motivated in part by
    416 % IEEE's rather unusual bibliography style. For example, IEEE ends the
    417 % previous field item with a period and large space prior to the publisher
    418 % address; the @electronic entry types use periods as inter-item punctuation
    419 % rather than the commas used by the other entry types; and URLs are never
    420 % followed by periods even though they are the last item in the entry.
    421 % Although it is possible to accommodate these features with the conventional
    422 % output state system, the seemingly endless exceptions make for convoluted,
    423 % unreliable and difficult to maintain code.
    424 %
    425 % IEEEtran.bst's output state system can be easily understood via a simple
    426 % illustration of two most recently formatted entry fields (on the stack):
    427 %
    428 %               CURRENT_ITEM
    429 %               "PREVIOUS_ITEM
    430 %
    431 % which, in this example, is to eventually appear in the bibliography as:
    432 % 
    433 %               "PREVIOUS_ITEM," CURRENT_ITEM
    434 %
    435 % It is the job of the output routine to take the previous item off of the
    436 % stack (while leaving the current item at the top of the stack), apply its
    437 % trailing punctuation (including closing quote marks) and spacing, and then
    438 % to write the result to BibTeX's output buffer:
    439 % 
    440 %               "PREVIOUS_ITEM," 
    441 % 
    442 % Punctuation (and spacing) between items is often determined by both of the
    443 % items rather than just the first one. The presence of quotation marks
    444 % further complicates the situation because, in standard English, trailing
    445 % punctuation marks are supposed to be contained within the quotes.
    446 % 
    447 % IEEEtran.bst maintains two output state (aka "status") vectors which
    448 % correspond to the previous and current (aka "this") items. Each vector
    449 % consists of several independent attributes which track punctuation,
    450 % spacing, quotation, and newlines. Capitalization status is handled by a
    451 % separate scalar because the format routines, not the output routine,
    452 % handle capitalization and, therefore, there is no need to maintain the
    453 % capitalization attribute for both the "previous" and "this" items.
    454 % 
    455 % When a format routine adds a new item, it copies the current output status
    456 % vector to the previous output status vector and (usually) resets the
    457 % current (this) output status vector to a "standard status" vector. Using a
    458 % "standard status" vector in this way allows us to redefine what we mean by
    459 % "standard status" at the start of each entry handler and reuse the same
    460 % format routines under the various inter-item separation schemes. For
    461 % example, the standard status vector for the @book entry type may use
    462 % commas for item separators, while the @electronic type may use periods,
    463 % yet both entry handlers exploit many of the exact same format routines.
    464 % 
    465 % Because format routines have write access to the output status vector of
    466 % the previous item, they can override the punctuation choices of the
    467 % previous format routine! Therefore, it becomes trivial to implement rules
    468 % such as "Always use a period and a large space before the publisher." By
    469 % pushing the generation of the closing quote mark to the output routine, we
    470 % avoid all the problems caused by having to close a quote before having all
    471 % the information required to determine what the punctuation should be.
    472 %
    473 % The IEEEtran.bst output state system can easily be expanded if needed.
    474 % For instance, it is easy to add a "space.tie" attribute value if the
    475 % bibliography rules mandate that two items have to be joined with an
    476 % unbreakable space. 
    477 
    478 FUNCTION {initialize.status.constants}
    479 { #0 'punct.no :=
    480   #1 'punct.comma :=
    481   #2 'punct.period :=
    482   #0 'space.no := 
    483   #1 'space.normal :=
    484   #2 'space.large :=
    485   #0 'quote.no :=
    486   #1 'quote.close :=
    487   #0 'cap.no :=
    488   #1 'cap.yes :=
    489   #0 'nline.no :=
    490   #1 'nline.newblock :=
    491 }
    492 
    493 FUNCTION {std.status.using.comma}
    494 { punct.comma 'punct.std :=
    495   space.normal 'space.std :=
    496   quote.no 'quote.std :=
    497   nline.no 'nline.std :=
    498   cap.no 'cap.std :=
    499 }
    500 
    501 FUNCTION {std.status.using.period}
    502 { punct.period 'punct.std :=
    503   space.normal 'space.std :=
    504   quote.no 'quote.std :=
    505   nline.no 'nline.std :=
    506   cap.yes 'cap.std :=
    507 }
    508 
    509 FUNCTION {initialize.prev.this.status}
    510 { punct.no 'prev.status.punct :=
    511   space.no 'prev.status.space :=
    512   quote.no 'prev.status.quote :=
    513   nline.no 'prev.status.nline :=
    514   punct.no 'this.status.punct :=
    515   space.no 'this.status.space :=
    516   quote.no 'this.status.quote :=
    517   nline.no 'this.status.nline :=
    518   cap.yes 'status.cap :=
    519 }
    520 
    521 FUNCTION {this.status.std}
    522 { punct.std 'this.status.punct :=
    523   space.std 'this.status.space :=
    524   quote.std 'this.status.quote :=
    525   nline.std 'this.status.nline :=
    526 }
    527 
    528 FUNCTION {cap.status.std}{ cap.std 'status.cap := }
    529 
    530 FUNCTION {this.to.prev.status}
    531 { this.status.punct 'prev.status.punct :=
    532   this.status.space 'prev.status.space :=
    533   this.status.quote 'prev.status.quote :=
    534   this.status.nline 'prev.status.nline :=
    535 }
    536 
    537 
    538 FUNCTION {not}
    539 {   { #0 }
    540     { #1 }
    541   if$
    542 }
    543 
    544 FUNCTION {and}
    545 {   { skip$ }
    546     { pop$ #0 }
    547   if$
    548 }
    549 
    550 FUNCTION {or}
    551 {   { pop$ #1 }
    552     { skip$ }
    553   if$
    554 }
    555 
    556 
    557 % convert the strings "yes" or "no" to #1 or #0 respectively
    558 FUNCTION {yes.no.to.int}
    559 { "l" change.case$ duplicate$
    560     "yes" =
    561     { pop$  #1 }
    562     { duplicate$ "no" =
    563         { pop$ #0 }
    564         { "unknown boolean " quote$ * swap$ * quote$ *
    565           " in " * cite$ * warning$
    566           #0
    567         }
    568       if$
    569     }
    570   if$
    571 }
    572 
    573 
    574 % pushes true if the single char string on the stack is in the
    575 % range of "0" to "9"
    576 FUNCTION {is.num}
    577 { chr.to.int$
    578   duplicate$ "0" chr.to.int$ < not
    579   swap$ "9" chr.to.int$ > not and
    580 }
    581 
    582 % multiplies the integer on the stack by a factor of 10
    583 FUNCTION {bump.int.mag}
    584 { #0 'multiresult :=
    585     { duplicate$ #0 > }
    586     { #1 -
    587       multiresult #10 +
    588       'multiresult :=
    589     }
    590   while$
    591 pop$
    592 multiresult
    593 }
    594 
    595 % converts a single character string on the stack to an integer
    596 FUNCTION {char.to.integer}
    597 { duplicate$ 
    598   is.num
    599     { chr.to.int$ "0" chr.to.int$ - }
    600     {"noninteger character " quote$ * swap$ * quote$ *
    601           " in integer field of " * cite$ * warning$
    602     #0
    603     }
    604   if$
    605 }
    606 
    607 % converts a string on the stack to an integer
    608 FUNCTION {string.to.integer}
    609 { duplicate$ text.length$ 'namesleft :=
    610   #1 'nameptr :=
    611   #0 'numnames :=
    612     { nameptr namesleft > not }
    613     { duplicate$ nameptr #1 substring$
    614       char.to.integer numnames bump.int.mag +
    615       'numnames :=
    616       nameptr #1 +
    617       'nameptr :=
    618     }
    619   while$
    620 pop$
    621 numnames
    622 }
    623 
    624 
    625 
    626 
    627 % The output routines write out the *next* to the top (previous) item on the
    628 % stack, adding punctuation and such as needed. Since IEEEtran.bst maintains
    629 % the output status for the top two items on the stack, these output
    630 % routines have to consider the previous output status (which corresponds to
    631 % the item that is being output). Full independent control of punctuation,
    632 % closing quote marks, spacing, and newblock is provided.
    633 % 
    634 % "output.nonnull" does not check for the presence of a previous empty
    635 % item.
    636 % 
    637 % "output" does check for the presence of a previous empty item and will
    638 % remove an empty item rather than outputing it.
    639 % 
    640 % "output.warn" is like "output", but will issue a warning if it detects
    641 % an empty item.
    642 
    643 FUNCTION {output.nonnull}
    644 { swap$
    645   prev.status.punct punct.comma =
    646      { "," * }
    647      { skip$ }
    648    if$
    649   prev.status.punct punct.period =
    650      { add.period$ }
    651      { skip$ }
    652    if$ 
    653   prev.status.quote quote.close =
    654      { "''" * }
    655      { skip$ }
    656    if$
    657   prev.status.space space.normal =
    658      { " " * }
    659      { skip$ }
    660    if$
    661   prev.status.space space.large =
    662      { large.space * }
    663      { skip$ }
    664    if$
    665   write$
    666   prev.status.nline nline.newblock =
    667      { newline$ "\newblock " write$ }
    668      { skip$ }
    669    if$
    670 }
    671 
    672 FUNCTION {output}
    673 { duplicate$ empty$
    674     'pop$
    675     'output.nonnull
    676   if$
    677 }
    678 
    679 FUNCTION {output.warn}
    680 { 't :=
    681   duplicate$ empty$
    682     { pop$ "empty " t * " in " * cite$ * warning$ }
    683     'output.nonnull
    684   if$
    685 }
    686 
    687 % "fin.entry" is the output routine that handles the last item of the entry
    688 % (which will be on the top of the stack when "fin.entry" is called).
    689 
    690 FUNCTION {fin.entry}
    691 { this.status.punct punct.no =
    692      { skip$ }
    693      { add.period$ }
    694    if$
    695    this.status.quote quote.close =
    696      { "''" * }
    697      { skip$ }
    698    if$
    699 write$
    700 newline$
    701 }
    702 
    703 
    704 FUNCTION {is.last.char.not.punct}
    705 { duplicate$
    706    "}" * add.period$
    707    #-1 #1 substring$ "." =
    708 }
    709 
    710 FUNCTION {is.multiple.pages}
    711 { 't :=
    712   #0 'multiresult :=
    713     { multiresult not
    714       t empty$ not
    715       and
    716     }
    717     { t #1 #1 substring$
    718       duplicate$ "-" =
    719       swap$ duplicate$ "," =
    720       swap$ "+" =
    721       or or
    722         { #1 'multiresult := }
    723         { t #2 global.max$ substring$ 't := }
    724       if$
    725     }
    726   while$
    727   multiresult
    728 }
    729 
    730 FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ }
    731 
    732 FUNCTION {emphasize}
    733 { duplicate$ empty$
    734     { pop$ "" }
    735     { "\emph{" swap$ * "}" * }
    736   if$
    737 }
    738 
    739 FUNCTION {do.name.latex.cmd}
    740 { name.latex.cmd
    741   empty$
    742     { skip$ }
    743     { name.latex.cmd "{" * swap$ * "}" * }
    744   if$
    745 }
    746 
    747 % IEEEtran.bst uses its own \BIBforeignlanguage command which directly
    748 % invokes the TeX hyphenation patterns without the need of the Babel
    749 % package. Babel does a lot more than switch hyphenation patterns and
    750 % its loading can cause unintended effects in many class files (such as
    751 % IEEEtran.cls).
    752 FUNCTION {select.language}
    753 { duplicate$ empty$ 'pop$
    754     { language empty$ 'skip$
    755         { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * }
    756       if$
    757     }
    758   if$
    759 }
    760 
    761 FUNCTION {tie.or.space.prefix}
    762 { duplicate$ text.length$ #3 <
    763     { "~" }
    764     { " " }
    765   if$
    766   swap$
    767 }
    768 
    769 FUNCTION {get.bbl.editor}
    770 { editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ }
    771 
    772 FUNCTION {space.word}{ " " swap$ * " " * }
    773 
    774 
    775 % Field Conditioners, Converters, Checkers and External Interfaces
    776 
    777 FUNCTION {empty.field.to.null.string}
    778 { duplicate$ empty$
    779     { pop$ "" }
    780     { skip$ }
    781   if$
    782 }
    783 
    784 FUNCTION {either.or.check}
    785 { empty$
    786     { pop$ }
    787     { "can't use both " swap$ * " fields in " * cite$ * warning$ }
    788   if$
    789 }
    790 
    791 FUNCTION {empty.entry.warn}
    792 { author empty$ title empty$ howpublished empty$
    793   month empty$ year empty$ note empty$ url empty$
    794   and and and and and and
    795     { "all relevant fields are empty in " cite$ * warning$ }
    796     'skip$
    797   if$
    798 }
    799 
    800 
    801 % The bibinfo system provides a way for the electronic parsing/acquisition
    802 % of a bibliography's contents as is done by ReVTeX. For example, a field
    803 % could be entered into the bibliography as:
    804 % \bibinfo{volume}{2}
    805 % Only the "2" would show up in the document, but the LaTeX \bibinfo command
    806 % could do additional things with the information. IEEEtran.bst does provide
    807 % a \bibinfo command via "\providecommand{\bibinfo}[2]{#2}". However, it is
    808 % currently not used as the bogus bibinfo functions defined here output the
    809 % entry values directly without the \bibinfo wrapper. The bibinfo functions
    810 % themselves (and the calls to them) are retained for possible future use.
    811 % 
    812 % bibinfo.check avoids acting on missing fields while bibinfo.warn will
    813 % issue a warning message if a missing field is detected. Prior to calling
    814 % the bibinfo functions, the user should push the field value and then its
    815 % name string, in that order.
    816 
    817 FUNCTION {bibinfo.check}
    818 { swap$ duplicate$ missing$
    819     { pop$ pop$ "" }
    820     { duplicate$ empty$
    821         { swap$ pop$ }
    822         { swap$ pop$ }
    823       if$
    824     }
    825   if$
    826 }
    827 
    828 FUNCTION {bibinfo.warn}
    829 { swap$ duplicate$ missing$
    830     { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" }
    831     { duplicate$ empty$
    832         { swap$ "empty " swap$ * " in " * cite$ * warning$ }
    833         { swap$ pop$ }
    834       if$
    835     }
    836   if$
    837 }
    838 
    839 
    840 % IEEE separates large numbers with more than 4 digits into groups of
    841 % three. IEEE uses a small space to separate these number groups. 
    842 % Typical applications include patent and page numbers.
    843 
    844 % number of consecutive digits required to trigger the group separation.
    845 FUNCTION {large.number.trigger}{ #5 }
    846 
    847 % For numbers longer than the trigger, this is the blocksize of the groups.
    848 % The blocksize must be less than the trigger threshold, and 2 * blocksize
    849 % must be greater than the trigger threshold (can't do more than one
    850 % separation on the initial trigger).
    851 FUNCTION {large.number.blocksize}{ #3 }
    852 
    853 % What is actually inserted between the number groups.
    854 FUNCTION {large.number.separator}{ "\," }
    855 
    856 % So as to save on integer variables by reusing existing ones, numnames
    857 % holds the current number of consecutive digits read and nameptr holds
    858 % the number that will trigger an inserted space.
    859 FUNCTION {large.number.separate}
    860 { 't :=
    861   ""
    862   #0 'numnames :=
    863   large.number.trigger 'nameptr :=
    864   { t empty$ not }
    865   { t #-1 #1 substring$ is.num
    866       { numnames #1 + 'numnames := }
    867       { #0 'numnames := 
    868         large.number.trigger 'nameptr :=
    869       }
    870     if$
    871     t #-1 #1 substring$ swap$ *
    872     t #-2 global.max$ substring$ 't :=
    873     numnames nameptr =
    874       { duplicate$ #1 nameptr large.number.blocksize - substring$ swap$
    875         nameptr large.number.blocksize - #1 + global.max$ substring$
    876         large.number.separator swap$ * *
    877         nameptr large.number.blocksize - 'numnames :=
    878         large.number.blocksize #1 + 'nameptr :=
    879       }
    880       { skip$ }
    881     if$
    882   }
    883   while$
    884 }
    885 
    886 % Converts all single dashes "-" to double dashes "--".
    887 FUNCTION {n.dashify}
    888 { large.number.separate
    889   't :=
    890   ""
    891     { t empty$ not }
    892     { t #1 #1 substring$ "-" =
    893         { t #1 #2 substring$ "--" = not
    894             { "--" *
    895               t #2 global.max$ substring$ 't :=
    896             }
    897             {   { t #1 #1 substring$ "-" = }
    898                 { "-" *
    899                   t #2 global.max$ substring$ 't :=
    900                 }
    901               while$
    902             }
    903           if$
    904         }
    905         { t #1 #1 substring$ *
    906           t #2 global.max$ substring$ 't :=
    907         }
    908       if$
    909     }
    910   while$
    911 }
    912 
    913 
    914 % This function detects entries with names that are identical to that of
    915 % the previous entry and replaces the repeated names with dashes (if the
    916 % "is.dash.repeated.names" user control is nonzero).
    917 FUNCTION {name.or.dash}
    918 { 's :=
    919    oldname empty$
    920      { s 'oldname := s }
    921      { s oldname =
    922          { is.dash.repeated.names
    923               { repeated.name.dashes }
    924               { s 'oldname := s }
    925             if$
    926          }
    927          { s 'oldname := s }
    928        if$
    929      }
    930    if$
    931 }
    932 
    933 % Converts the number string on the top of the stack to
    934 % "numerical ordinal form" (e.g., "7" to "7th"). There is
    935 % no artificial limit to the upper bound of the numbers as the
    936 % least significant digit always determines the ordinal form.
    937 FUNCTION {num.to.ordinal}
    938 { duplicate$ #-1 #1 substring$ "1" =
    939      { bbl.st * }
    940      { duplicate$ #-1 #1 substring$ "2" =
    941          { bbl.nd * }
    942          { duplicate$ #-1 #1 substring$ "3" =
    943              { bbl.rd * }
    944              { bbl.th * }
    945            if$
    946          }
    947        if$
    948      }
    949    if$
    950 }
    951 
    952 % If the string on the top of the stack begins with a number,
    953 % (e.g., 11th) then replace the string with the leading number
    954 % it contains. Otherwise retain the string as-is. s holds the
    955 % extracted number, t holds the part of the string that remains
    956 % to be scanned.
    957 FUNCTION {extract.num}
    958 { duplicate$ 't :=
    959   "" 's :=
    960   { t empty$ not }
    961   { t #1 #1 substring$
    962     t #2 global.max$ substring$ 't :=
    963     duplicate$ is.num
    964       { s swap$ * 's := }
    965       { pop$ "" 't := }
    966     if$
    967   }
    968   while$
    969   s empty$
    970     'skip$
    971     { pop$ s }
    972   if$
    973 }
    974 
    975 % Converts the word number string on the top of the stack to
    976 % Arabic string form. Will be successful up to "tenth".
    977 FUNCTION {word.to.num}
    978 { duplicate$ "l" change.case$ 's :=
    979   s "first" =
    980     { pop$ "1" }
    981     { skip$ }
    982   if$
    983   s "second" =
    984     { pop$ "2" }
    985     { skip$ }
    986   if$
    987   s "third" =
    988     { pop$ "3" }
    989     { skip$ }
    990   if$
    991   s "fourth" =
    992     { pop$ "4" }
    993     { skip$ }
    994   if$
    995   s "fifth" =
    996     { pop$ "5" }
    997     { skip$ }
    998   if$
    999   s "sixth" =
   1000     { pop$ "6" }
   1001     { skip$ }
   1002   if$
   1003   s "seventh" =
   1004     { pop$ "7" }
   1005     { skip$ }
   1006   if$
   1007   s "eighth" =
   1008     { pop$ "8" }
   1009     { skip$ }
   1010   if$
   1011   s "ninth" =
   1012     { pop$ "9" }
   1013     { skip$ }
   1014   if$
   1015   s "tenth" =
   1016     { pop$ "10" }
   1017     { skip$ }
   1018   if$
   1019 }
   1020 
   1021 
   1022 % Converts the string on the top of the stack to numerical
   1023 % ordinal (e.g., "11th") form.
   1024 FUNCTION {convert.edition}
   1025 { duplicate$ empty$ 'skip$
   1026     { duplicate$ #1 #1 substring$ is.num
   1027         { extract.num
   1028           num.to.ordinal
   1029         }
   1030         { word.to.num
   1031           duplicate$ #1 #1 substring$ is.num
   1032             { num.to.ordinal }
   1033             { "edition ordinal word " quote$ * edition * quote$ *
   1034               " may be too high (or improper) for conversion" * " in " * cite$ * warning$
   1035             }
   1036           if$
   1037         }
   1038       if$
   1039     }
   1040   if$
   1041 }
   1042 
   1043 
   1044 
   1045 
   1046 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   1047 %% LATEX BIBLIOGRAPHY CODE %%
   1048 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   1049 
   1050 FUNCTION {start.entry}
   1051 { newline$
   1052   "\bibitem{" write$
   1053   cite$ write$
   1054   "}" write$
   1055   newline$
   1056   ""
   1057   initialize.prev.this.status
   1058 }
   1059 
   1060 % Here we write out all the LaTeX code that we will need. The most involved
   1061 % code sequences are those that control the alternate interword spacing and
   1062 % foreign language hyphenation patterns. The heavy use of \providecommand
   1063 % gives users a way to override the defaults. Special thanks to Javier Bezos,
   1064 % Johannes Braams, Robin Fairbairns, Heiko Oberdiek, Donald Arseneau and all
   1065 % the other gurus on comp.text.tex for their help and advice on the topic of
   1066 % \selectlanguage, Babel and BibTeX.
   1067 FUNCTION {begin.bib}
   1068 { "% Generated by IEEEtran.bst, version: " bst.file.version * " (" * bst.file.date * ")" *
   1069   write$ newline$
   1070   preamble$ empty$ 'skip$
   1071     { preamble$ write$ newline$ }
   1072   if$
   1073   "\begin{thebibliography}{"  longest.label  * "}" *
   1074   write$ newline$
   1075   "\providecommand{\url}[1]{#1}"
   1076   write$ newline$
   1077   "\csname url@samestyle\endcsname"
   1078   write$ newline$
   1079   "\providecommand{\newblock}{\relax}"
   1080   write$ newline$
   1081   "\providecommand{\bibinfo}[2]{#2}"
   1082   write$ newline$
   1083   "\providecommand{\BIBentrySTDinterwordspacing}{\spaceskip=0pt\relax}"
   1084   write$ newline$
   1085   "\providecommand{\BIBentryALTinterwordstretchfactor}{"
   1086   ALTinterwordstretchfactor * "}" *
   1087   write$ newline$
   1088   "\providecommand{\BIBentryALTinterwordspacing}{\spaceskip=\fontdimen2\font plus "
   1089   write$ newline$
   1090   "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}"
   1091   write$ newline$
   1092   "\providecommand{\BIBforeignlanguage}[2]{{%"
   1093   write$ newline$
   1094   "\expandafter\ifx\csname l@#1\endcsname\relax"
   1095   write$ newline$
   1096   "\typeout{** WARNING: IEEEtran.bst: No hyphenation pattern has been}%"
   1097   write$ newline$
   1098   "\typeout{** loaded for the language `#1'. Using the pattern for}%"
   1099   write$ newline$
   1100   "\typeout{** the default language instead.}%"
   1101   write$ newline$
   1102   "\else"
   1103   write$ newline$
   1104   "\language=\csname l@#1\endcsname"
   1105   write$ newline$
   1106   "\fi"
   1107   write$ newline$
   1108   "#2}}"
   1109   write$ newline$
   1110   "\providecommand{\BIBdecl}{\relax}"
   1111   write$ newline$
   1112   "\BIBdecl"
   1113   write$ newline$
   1114 }
   1115 
   1116 FUNCTION {end.bib}
   1117 { newline$ "\end{thebibliography}" write$ newline$ }
   1118 
   1119 FUNCTION {if.url.alt.interword.spacing}
   1120 { is.use.alt.interword.spacing 
   1121      {url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$}
   1122      { skip$ }
   1123    if$
   1124 }
   1125 
   1126 FUNCTION {if.url.std.interword.spacing}
   1127 { is.use.alt.interword.spacing 
   1128      {url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$}
   1129      { skip$ }
   1130    if$
   1131 }
   1132 
   1133 
   1134 
   1135 
   1136 %%%%%%%%%%%%%%%%%%%%%%%%
   1137 %% LONGEST LABEL PASS %%
   1138 %%%%%%%%%%%%%%%%%%%%%%%%
   1139 
   1140 FUNCTION {initialize.longest.label}
   1141 { "" 'longest.label :=
   1142   #1 'number.label :=
   1143   #0 'longest.label.width :=
   1144 }
   1145 
   1146 FUNCTION {longest.label.pass}
   1147 { type$ "ieeetranbstctl" =
   1148     { skip$ }
   1149     { number.label int.to.str$ 'label :=
   1150       number.label #1 + 'number.label :=
   1151       label width$ longest.label.width >
   1152         { label 'longest.label :=
   1153           label width$ 'longest.label.width :=
   1154         }
   1155         { skip$ }
   1156       if$
   1157     }
   1158   if$
   1159 }
   1160 
   1161 
   1162 
   1163 
   1164 %%%%%%%%%%%%%%%%%%%%%
   1165 %% FORMAT HANDLERS %%
   1166 %%%%%%%%%%%%%%%%%%%%%
   1167 
   1168 %% Lower Level Formats (used by higher level formats)
   1169 
   1170 FUNCTION {format.address.org.or.pub.date}
   1171 { 't :=
   1172   ""
   1173   year empty$
   1174     { "empty year in " cite$ * warning$ }
   1175     { skip$ }
   1176   if$
   1177   address empty$ t empty$ and
   1178   year empty$ and month empty$ and
   1179     { skip$ }
   1180     { this.to.prev.status
   1181       this.status.std
   1182       cap.status.std
   1183       address "address" bibinfo.check *
   1184       t empty$
   1185         { skip$ }
   1186         { punct.period 'prev.status.punct :=
   1187           space.large 'prev.status.space :=
   1188           address empty$
   1189             { skip$ }
   1190             { ": " * }
   1191           if$
   1192           t *
   1193         }
   1194       if$
   1195       year empty$ month empty$ and
   1196         { skip$ }
   1197         { t empty$ address empty$ and
   1198             { skip$ }
   1199             { ", " * }
   1200           if$
   1201           month empty$
   1202             { year empty$
   1203                 { skip$ }
   1204                 { year "year" bibinfo.check * }
   1205               if$
   1206             }
   1207             { month "month" bibinfo.check *
   1208               year empty$
   1209                  { skip$ }
   1210                  { " " * year "year" bibinfo.check * }
   1211               if$
   1212             }
   1213           if$
   1214         }
   1215       if$
   1216     }
   1217   if$
   1218 }
   1219 
   1220 
   1221 FUNCTION {format.names}
   1222 { 'bibinfo :=
   1223   duplicate$ empty$ 'skip$ {
   1224   this.to.prev.status
   1225   this.status.std
   1226   's :=
   1227   "" 't :=
   1228   #1 'nameptr :=
   1229   s num.names$ 'numnames :=
   1230   numnames 'namesleft :=
   1231     { namesleft #0 > }
   1232     { s nameptr
   1233       name.format.string
   1234       format.name$
   1235       bibinfo bibinfo.check
   1236       't :=
   1237       nameptr #1 >
   1238         { nameptr num.names.shown.with.forced.et.al #1 + =
   1239           numnames max.num.names.before.forced.et.al >
   1240           is.forced.et.al and and
   1241             { "others" 't :=
   1242               #1 'namesleft :=
   1243             }
   1244             { skip$ }
   1245           if$
   1246           namesleft #1 >
   1247             { ", " * t do.name.latex.cmd * }
   1248             { s nameptr "{ll}" format.name$ duplicate$ "others" =
   1249                 { 't := }
   1250                 { pop$ }
   1251               if$
   1252               t "others" =
   1253                 { " " * bbl.etal emphasize * }
   1254                 { numnames #2 >
   1255                     { "," * }
   1256                     { skip$ }
   1257                   if$
   1258                   bbl.and
   1259                   space.word * t do.name.latex.cmd *
   1260                 }
   1261               if$
   1262             }
   1263           if$
   1264         }
   1265         { t do.name.latex.cmd }
   1266       if$
   1267       nameptr #1 + 'nameptr :=
   1268       namesleft #1 - 'namesleft :=
   1269     }
   1270   while$
   1271   cap.status.std
   1272   } if$
   1273 }
   1274 
   1275 
   1276 
   1277 
   1278 %% Higher Level Formats
   1279 
   1280 %% addresses/locations
   1281 
   1282 FUNCTION {format.address}
   1283 { address duplicate$ empty$ 'skip$
   1284     { this.to.prev.status
   1285       this.status.std
   1286       cap.status.std
   1287     }
   1288   if$
   1289 }
   1290 
   1291 
   1292 
   1293 %% author/editor names
   1294 
   1295 FUNCTION {format.authors}{ author "author" format.names }
   1296 
   1297 FUNCTION {format.editors}
   1298 { editor "editor" format.names duplicate$ empty$ 'skip$
   1299     { ", " *
   1300       get.bbl.editor
   1301       capitalize
   1302       *
   1303     }
   1304   if$
   1305 }
   1306 
   1307 
   1308 
   1309 %% date
   1310 
   1311 FUNCTION {format.date}
   1312 {
   1313   month "month" bibinfo.check duplicate$ empty$
   1314   year  "year" bibinfo.check duplicate$ empty$
   1315     { swap$ 'skip$
   1316         { this.to.prev.status
   1317           this.status.std
   1318           cap.status.std
   1319          "there's a month but no year in " cite$ * warning$ }
   1320       if$
   1321       *
   1322     }
   1323     { this.to.prev.status
   1324       this.status.std
   1325       cap.status.std
   1326       swap$ 'skip$
   1327         {
   1328           swap$
   1329           " " * swap$
   1330         }
   1331       if$
   1332       *
   1333     }
   1334   if$
   1335 }
   1336 
   1337 FUNCTION {format.date.electronic}
   1338 { month "month" bibinfo.check duplicate$ empty$
   1339   year  "year" bibinfo.check duplicate$ empty$
   1340     { swap$ 
   1341         { pop$ }
   1342         { "there's a month but no year in " cite$ * warning$
   1343         pop$ ")" * "(" swap$ *
   1344         this.to.prev.status
   1345         punct.no 'this.status.punct :=
   1346         space.normal 'this.status.space :=
   1347         quote.no 'this.status.quote :=
   1348         cap.yes  'status.cap :=
   1349         }
   1350       if$
   1351     }
   1352     { swap$ 
   1353         { swap$ pop$ ")" * "(" swap$ * }
   1354         { "(" swap$ * ", " * swap$ * ")" * }
   1355       if$
   1356     this.to.prev.status
   1357     punct.no 'this.status.punct :=
   1358     space.normal 'this.status.space :=
   1359     quote.no 'this.status.quote :=
   1360     cap.yes  'status.cap :=
   1361     }
   1362   if$
   1363 }
   1364 
   1365 
   1366 
   1367 %% edition/title
   1368 
   1369 % Note: IEEE considers the edition to be closely associated with
   1370 % the title of a book. So, in IEEEtran.bst the edition is normally handled 
   1371 % within the formatting of the title. The format.edition function is 
   1372 % retained here for possible future use.
   1373 FUNCTION {format.edition}
   1374 { edition duplicate$ empty$ 'skip$
   1375     { this.to.prev.status
   1376       this.status.std
   1377       convert.edition
   1378       status.cap
   1379         { "t" }
   1380         { "l" }
   1381       if$ change.case$
   1382       "edition" bibinfo.check
   1383       "~" * bbl.edition *
   1384       cap.status.std
   1385     }
   1386   if$
   1387 }
   1388 
   1389 % This is used to format the booktitle of a conference proceedings.
   1390 % Here we use the "intype" field to provide the user a way to 
   1391 % override the word "in" (e.g., with things like "presented at")
   1392 % Use of intype stops the emphasis of the booktitle to indicate that
   1393 % we no longer mean the written conference proceedings, but the
   1394 % conference itself.
   1395 FUNCTION {format.in.booktitle}
   1396 { booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$
   1397     { this.to.prev.status
   1398       this.status.std
   1399       select.language
   1400       intype missing$
   1401         { emphasize
   1402           bbl.in " " *
   1403         }
   1404         { intype " " * }
   1405       if$
   1406       swap$ *
   1407       cap.status.std
   1408     }
   1409   if$
   1410 }
   1411 
   1412 % This is used to format the booktitle of collection.
   1413 % Here the "intype" field is not supported, but "edition" is.
   1414 FUNCTION {format.in.booktitle.edition}
   1415 { booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$
   1416     { this.to.prev.status
   1417       this.status.std
   1418       select.language
   1419       emphasize
   1420       edition empty$ 'skip$
   1421         { ", " *
   1422           edition
   1423           convert.edition
   1424           "l" change.case$
   1425           * "~" * bbl.edition *
   1426         }
   1427       if$
   1428       bbl.in " " * swap$ *
   1429       cap.status.std
   1430     }
   1431   if$
   1432 }
   1433 
   1434 FUNCTION {format.article.title}
   1435 { title duplicate$ empty$ 'skip$
   1436     { this.to.prev.status
   1437       this.status.std
   1438       "t" change.case$
   1439     }
   1440   if$
   1441   "title" bibinfo.check
   1442   duplicate$ empty$ 'skip$
   1443     { quote.close 'this.status.quote :=
   1444       is.last.char.not.punct
   1445         { punct.std 'this.status.punct := }
   1446         { punct.no 'this.status.punct := }
   1447       if$
   1448       select.language
   1449       "``" swap$ *
   1450       cap.status.std
   1451     }
   1452   if$
   1453 }
   1454 
   1455 FUNCTION {format.article.title.electronic}
   1456 { title duplicate$ empty$ 'skip$
   1457     { this.to.prev.status
   1458       this.status.std
   1459       cap.status.std
   1460       "t" change.case$ 
   1461     }
   1462   if$
   1463   "title" bibinfo.check
   1464   duplicate$ empty$ 
   1465     { skip$ } 
   1466     { select.language }
   1467   if$
   1468 }
   1469 
   1470 FUNCTION {format.book.title.edition}
   1471 { title "title" bibinfo.check
   1472   duplicate$ empty$
   1473     { "empty title in " cite$ * warning$ }
   1474     { this.to.prev.status
   1475       this.status.std
   1476       select.language
   1477       emphasize
   1478       edition empty$ 'skip$
   1479         { ", " *
   1480           edition
   1481           convert.edition
   1482           status.cap
   1483             { "t" }
   1484             { "l" }
   1485           if$
   1486           change.case$
   1487           * "~" * bbl.edition *
   1488         }
   1489       if$
   1490       cap.status.std
   1491     }
   1492   if$
   1493 }
   1494 
   1495 FUNCTION {format.book.title}
   1496 { title "title" bibinfo.check
   1497   duplicate$ empty$ 'skip$
   1498     { this.to.prev.status
   1499       this.status.std
   1500       cap.status.std
   1501       select.language
   1502       emphasize
   1503     }
   1504   if$
   1505 }
   1506 
   1507 
   1508 
   1509 %% journal
   1510 
   1511 FUNCTION {format.journal}
   1512 { journal duplicate$ empty$ 'skip$
   1513     { this.to.prev.status
   1514       this.status.std
   1515       cap.status.std
   1516       select.language
   1517       emphasize
   1518     }
   1519   if$
   1520 }
   1521 
   1522 
   1523 
   1524 %% how published
   1525 
   1526 FUNCTION {format.howpublished}
   1527 { howpublished duplicate$ empty$ 'skip$
   1528     { this.to.prev.status
   1529       this.status.std
   1530       cap.status.std
   1531     }
   1532   if$
   1533 }
   1534 
   1535 
   1536 
   1537 %% institutions/organization/publishers/school
   1538 
   1539 FUNCTION {format.institution}
   1540 { institution duplicate$ empty$ 'skip$
   1541     { this.to.prev.status
   1542       this.status.std
   1543       cap.status.std
   1544     }
   1545   if$
   1546 }
   1547 
   1548 FUNCTION {format.organization}
   1549 { organization duplicate$ empty$ 'skip$
   1550     { this.to.prev.status
   1551       this.status.std
   1552       cap.status.std
   1553     }
   1554   if$
   1555 }
   1556 
   1557 FUNCTION {format.address.publisher.date}
   1558 { publisher "publisher" bibinfo.warn format.address.org.or.pub.date }
   1559 
   1560 FUNCTION {format.address.publisher.date.nowarn}
   1561 { publisher "publisher" bibinfo.check format.address.org.or.pub.date }
   1562 
   1563 FUNCTION {format.address.organization.date}
   1564 { organization "organization" bibinfo.check format.address.org.or.pub.date }
   1565 
   1566 FUNCTION {format.school}
   1567 { school duplicate$ empty$ 'skip$
   1568     { this.to.prev.status
   1569       this.status.std
   1570       cap.status.std
   1571     }
   1572   if$
   1573 }
   1574 
   1575 
   1576 
   1577 %% volume/number/series/chapter/pages
   1578 
   1579 FUNCTION {format.volume}
   1580 { volume empty.field.to.null.string
   1581   duplicate$ empty$ 'skip$
   1582     { this.to.prev.status
   1583       this.status.std
   1584       bbl.volume 
   1585       status.cap
   1586         { capitalize }
   1587         { skip$ }
   1588       if$
   1589       swap$ tie.or.space.prefix
   1590       "volume" bibinfo.check
   1591       * *
   1592       cap.status.std
   1593     }
   1594   if$
   1595 }
   1596 
   1597 FUNCTION {format.number}
   1598 { number empty.field.to.null.string
   1599   duplicate$ empty$ 'skip$
   1600     { this.to.prev.status
   1601       this.status.std
   1602       status.cap
   1603          { bbl.number capitalize }
   1604          { bbl.number }
   1605        if$
   1606       swap$ tie.or.space.prefix
   1607       "number" bibinfo.check
   1608       * *
   1609       cap.status.std
   1610     }
   1611   if$
   1612 }
   1613 
   1614 FUNCTION {format.number.if.use.for.article}
   1615 { is.use.number.for.article 
   1616      { format.number }
   1617      { "" }
   1618    if$
   1619 }
   1620 
   1621 % IEEE does not seem to tie the series so closely with the volume
   1622 % and number as is done in other bibliography styles. Instead the
   1623 % series is treated somewhat like an extension of the title.
   1624 FUNCTION {format.series}
   1625 { series empty$ 
   1626    { "" }
   1627    { this.to.prev.status
   1628      this.status.std
   1629      bbl.series " " *
   1630      series "series" bibinfo.check *
   1631      cap.status.std
   1632    }
   1633  if$
   1634 }
   1635 
   1636 
   1637 FUNCTION {format.chapter}
   1638 { chapter empty$
   1639     { "" }
   1640     { this.to.prev.status
   1641       this.status.std
   1642       type empty$
   1643         { bbl.chapter }
   1644         { type "l" change.case$
   1645           "type" bibinfo.check
   1646         }
   1647       if$
   1648       chapter tie.or.space.prefix
   1649       "chapter" bibinfo.check
   1650       * *
   1651       cap.status.std
   1652     }
   1653   if$
   1654 }
   1655 
   1656 
   1657 % The intended use of format.paper is for paper numbers of inproceedings.
   1658 % The paper type can be overridden via the type field.
   1659 % We allow the type to be displayed even if the paper number is absent
   1660 % for things like "postdeadline paper"
   1661 FUNCTION {format.paper}
   1662 { is.use.paper
   1663      { paper empty$
   1664         { type empty$
   1665             { "" }
   1666             { this.to.prev.status
   1667               this.status.std
   1668               type "type" bibinfo.check
   1669               cap.status.std
   1670             }
   1671           if$
   1672         }
   1673         { this.to.prev.status
   1674           this.status.std
   1675           type empty$
   1676             { bbl.paper }
   1677             { type "type" bibinfo.check }
   1678           if$
   1679           " " * paper
   1680           "paper" bibinfo.check
   1681           *
   1682           cap.status.std
   1683         }
   1684       if$
   1685      }
   1686      { "" } 
   1687    if$
   1688 }
   1689 
   1690 
   1691 FUNCTION {format.pages}
   1692 { pages duplicate$ empty$ 'skip$
   1693     { this.to.prev.status
   1694       this.status.std
   1695       duplicate$ is.multiple.pages
   1696         {
   1697           bbl.pages swap$
   1698           n.dashify
   1699         }
   1700         {
   1701           bbl.page swap$
   1702         }
   1703       if$
   1704       tie.or.space.prefix
   1705       "pages" bibinfo.check
   1706       * *
   1707       cap.status.std
   1708     }
   1709   if$
   1710 }
   1711 
   1712 
   1713 
   1714 %% technical report number
   1715 
   1716 FUNCTION {format.tech.report.number}
   1717 { number "number" bibinfo.check
   1718   this.to.prev.status
   1719   this.status.std
   1720   cap.status.std
   1721   type duplicate$ empty$
   1722     { pop$ 
   1723       bbl.techrep
   1724     }
   1725     { skip$ }
   1726   if$
   1727   "type" bibinfo.check 
   1728   swap$ duplicate$ empty$
   1729     { pop$ }
   1730     { tie.or.space.prefix * * }
   1731   if$
   1732 }
   1733 
   1734 
   1735 
   1736 %% note
   1737 
   1738 FUNCTION {format.note}
   1739 { note empty$
   1740     { "" }
   1741     { this.to.prev.status
   1742       this.status.std
   1743       punct.period 'this.status.punct :=
   1744       note #1 #1 substring$
   1745       duplicate$ "{" =
   1746         { skip$ }
   1747         { status.cap
   1748           { "u" }
   1749           { "l" }
   1750         if$
   1751         change.case$
   1752         }
   1753       if$
   1754       note #2 global.max$ substring$ * "note" bibinfo.check
   1755       cap.yes  'status.cap :=
   1756     }
   1757   if$
   1758 }
   1759 
   1760 
   1761 
   1762 %% patent
   1763 
   1764 FUNCTION {format.patent.date}
   1765 { this.to.prev.status
   1766   this.status.std
   1767   year empty$
   1768     { monthfiled duplicate$ empty$
   1769         { "monthfiled" bibinfo.check pop$ "" }
   1770         { "monthfiled" bibinfo.check }
   1771       if$
   1772       dayfiled duplicate$ empty$
   1773         { "dayfiled" bibinfo.check pop$ "" * }
   1774         { "dayfiled" bibinfo.check 
   1775           monthfiled empty$ 
   1776              { "dayfiled without a monthfiled in " cite$ * warning$
   1777                * 
   1778              }
   1779              { " " swap$ * * }
   1780            if$
   1781         }
   1782       if$
   1783       yearfiled empty$
   1784         { "no year or yearfiled in " cite$ * warning$ }
   1785         { yearfiled "yearfiled" bibinfo.check 
   1786           swap$
   1787           duplicate$ empty$
   1788              { pop$ }
   1789              { ", " * swap$ * }
   1790            if$
   1791         }
   1792       if$
   1793     }
   1794     { month duplicate$ empty$
   1795         { "month" bibinfo.check pop$ "" }
   1796         { "month" bibinfo.check }
   1797       if$
   1798       day duplicate$ empty$
   1799         { "day" bibinfo.check pop$ "" * }
   1800         { "day" bibinfo.check 
   1801           month empty$ 
   1802              { "day without a month in " cite$ * warning$
   1803                * 
   1804              }
   1805              { " " swap$ * * }
   1806            if$
   1807         }
   1808       if$
   1809       year "year" bibinfo.check 
   1810       swap$
   1811       duplicate$ empty$
   1812         { pop$ }
   1813         { ", " * swap$ * }
   1814       if$
   1815     }
   1816   if$
   1817   cap.status.std
   1818 }
   1819 
   1820 FUNCTION {format.patent.nationality.type.number}
   1821 { this.to.prev.status
   1822   this.status.std
   1823   nationality duplicate$ empty$
   1824     { "nationality" bibinfo.warn pop$ "" }
   1825     { "nationality" bibinfo.check
   1826       duplicate$ "l" change.case$ "united states" =
   1827         { pop$ bbl.patentUS }
   1828         { skip$ }
   1829       if$
   1830       " " *
   1831     }
   1832   if$
   1833   type empty$
   1834     { bbl.patent "type" bibinfo.check }
   1835     { type "type" bibinfo.check }
   1836   if$  
   1837   *
   1838   number duplicate$ empty$
   1839     { "number" bibinfo.warn pop$ }
   1840     { "number" bibinfo.check
   1841       large.number.separate
   1842       swap$ " " * swap$ *
   1843     }
   1844   if$ 
   1845   cap.status.std
   1846 }
   1847 
   1848 
   1849 
   1850 %% standard
   1851 
   1852 FUNCTION {format.organization.institution.standard.type.number}
   1853 { this.to.prev.status
   1854   this.status.std
   1855   organization duplicate$ empty$
   1856     { pop$ 
   1857       institution duplicate$ empty$
   1858         { "institution" bibinfo.warn }
   1859         { "institution" bibinfo.warn " " * }
   1860       if$
   1861     }
   1862     { "organization" bibinfo.warn " " * }
   1863   if$
   1864   type empty$
   1865     { bbl.standard "type" bibinfo.check }
   1866     { type "type" bibinfo.check }
   1867   if$  
   1868   *
   1869   number duplicate$ empty$
   1870     { "number" bibinfo.check pop$ }
   1871     { "number" bibinfo.check
   1872       large.number.separate
   1873       swap$ " " * swap$ *
   1874     }
   1875   if$ 
   1876   cap.status.std
   1877 }
   1878 
   1879 FUNCTION {format.revision}
   1880 { revision empty$
   1881     { "" }
   1882     { this.to.prev.status
   1883       this.status.std
   1884       bbl.revision
   1885       revision tie.or.space.prefix
   1886       "revision" bibinfo.check
   1887       * *
   1888       cap.status.std
   1889     }
   1890   if$
   1891 }
   1892 
   1893 
   1894 %% thesis
   1895 
   1896 FUNCTION {format.master.thesis.type}
   1897 { this.to.prev.status
   1898   this.status.std
   1899   type empty$
   1900     {
   1901       bbl.mthesis
   1902     }
   1903     { 
   1904       type "type" bibinfo.check
   1905     }
   1906   if$
   1907 cap.status.std
   1908 }
   1909 
   1910 FUNCTION {format.phd.thesis.type}
   1911 { this.to.prev.status
   1912   this.status.std
   1913   type empty$
   1914     {
   1915       bbl.phdthesis
   1916     }
   1917     { 
   1918       type "type" bibinfo.check
   1919     }
   1920   if$
   1921 cap.status.std
   1922 }
   1923 
   1924 
   1925 
   1926 %% URL
   1927 
   1928 FUNCTION {format.url}
   1929 { url empty$
   1930     { "" }
   1931     { this.to.prev.status
   1932       this.status.std
   1933       cap.yes 'status.cap :=
   1934       name.url.prefix " " *
   1935       "\url{" * url * "}" *
   1936       punct.no 'this.status.punct :=
   1937       punct.period 'prev.status.punct :=
   1938       space.normal 'this.status.space :=
   1939       space.normal 'prev.status.space :=
   1940       quote.no 'this.status.quote :=
   1941     }
   1942   if$
   1943 }
   1944 
   1945 
   1946 
   1947 
   1948 %%%%%%%%%%%%%%%%%%%%
   1949 %% ENTRY HANDLERS %%
   1950 %%%%%%%%%%%%%%%%%%%%
   1951 
   1952 
   1953 % Note: In many journals, IEEE (or the authors) tend not to show the number
   1954 % for articles, so the display of the number is controlled here by the
   1955 % switch "is.use.number.for.article"
   1956 FUNCTION {article}
   1957 { std.status.using.comma
   1958   start.entry
   1959   if.url.alt.interword.spacing
   1960   format.authors "author" output.warn
   1961   name.or.dash
   1962   format.article.title "title" output.warn
   1963   format.journal "journal" bibinfo.check "journal" output.warn
   1964   format.volume output
   1965   format.number.if.use.for.article output
   1966   format.pages output
   1967   format.date "year" output.warn
   1968   format.note output
   1969   format.url output
   1970   fin.entry
   1971   if.url.std.interword.spacing
   1972 }
   1973 
   1974 FUNCTION {book}
   1975 { std.status.using.comma
   1976   start.entry
   1977   if.url.alt.interword.spacing
   1978   author empty$
   1979     { format.editors "author and editor" output.warn }
   1980     { format.authors output.nonnull }
   1981   if$
   1982   name.or.dash
   1983   format.book.title.edition output
   1984   format.series output
   1985   author empty$
   1986     { skip$ }
   1987     { format.editors output }
   1988   if$
   1989   format.address.publisher.date output
   1990   format.volume output
   1991   format.number output
   1992   format.note output
   1993   format.url output
   1994   fin.entry
   1995   if.url.std.interword.spacing
   1996 }
   1997 
   1998 FUNCTION {booklet}
   1999 { std.status.using.comma
   2000   start.entry
   2001   if.url.alt.interword.spacing
   2002   format.authors output
   2003   name.or.dash
   2004   format.article.title "title" output.warn
   2005   format.howpublished "howpublished" bibinfo.check output
   2006   format.organization "organization" bibinfo.check output
   2007   format.address "address" bibinfo.check output
   2008   format.date output
   2009   format.note output
   2010   format.url output
   2011   fin.entry
   2012   if.url.std.interword.spacing
   2013 }
   2014 
   2015 FUNCTION {electronic}
   2016 { std.status.using.period
   2017   start.entry
   2018   if.url.alt.interword.spacing
   2019   format.authors output
   2020   name.or.dash
   2021   format.date.electronic output
   2022   format.article.title.electronic output
   2023   format.howpublished "howpublished" bibinfo.check output
   2024   format.organization "organization" bibinfo.check output
   2025   format.address "address" bibinfo.check output
   2026   format.note output
   2027   format.url output
   2028   fin.entry
   2029   empty.entry.warn
   2030   if.url.std.interword.spacing
   2031 }
   2032 
   2033 FUNCTION {inbook}
   2034 { std.status.using.comma
   2035   start.entry
   2036   if.url.alt.interword.spacing
   2037   author empty$
   2038     { format.editors "author and editor" output.warn }
   2039     { format.authors output.nonnull }
   2040   if$
   2041   name.or.dash
   2042   format.book.title.edition output
   2043   format.series output
   2044   format.address.publisher.date output
   2045   format.volume output
   2046   format.number output
   2047   format.chapter output
   2048   format.pages output
   2049   format.note output
   2050   format.url output
   2051   fin.entry
   2052   if.url.std.interword.spacing
   2053 }
   2054 
   2055 FUNCTION {incollection}
   2056 { std.status.using.comma
   2057   start.entry
   2058   if.url.alt.interword.spacing
   2059   format.authors "author" output.warn
   2060   name.or.dash
   2061   format.article.title "title" output.warn
   2062   format.in.booktitle.edition "booktitle" output.warn
   2063   format.series output
   2064   format.editors output
   2065   format.address.publisher.date.nowarn output
   2066   format.volume output
   2067   format.number output
   2068   format.chapter output
   2069   format.pages output
   2070   format.note output
   2071   format.url output
   2072   fin.entry
   2073   if.url.std.interword.spacing
   2074 }
   2075 
   2076 FUNCTION {inproceedings}
   2077 { std.status.using.comma
   2078   start.entry
   2079   if.url.alt.interword.spacing
   2080   format.authors "author" output.warn
   2081   name.or.dash
   2082   format.article.title "title" output.warn
   2083   format.in.booktitle "booktitle" output.warn
   2084   format.series output
   2085   format.editors output
   2086   format.volume output
   2087   format.number output
   2088   publisher empty$
   2089     { format.address.organization.date output }
   2090     { format.organization "organization" bibinfo.check output
   2091       format.address.publisher.date output
   2092     }
   2093   if$
   2094   format.paper output
   2095   format.pages output
   2096   format.note output
   2097   format.url output
   2098   fin.entry
   2099   if.url.std.interword.spacing
   2100 }
   2101 
   2102 FUNCTION {manual}
   2103 { std.status.using.comma
   2104   start.entry
   2105   if.url.alt.interword.spacing
   2106   format.authors output
   2107   name.or.dash
   2108   format.book.title.edition "title" output.warn
   2109   format.howpublished "howpublished" bibinfo.check output 
   2110   format.organization "organization" bibinfo.check output
   2111   format.address "address" bibinfo.check output
   2112   format.date output
   2113   format.note output
   2114   format.url output
   2115   fin.entry
   2116   if.url.std.interword.spacing
   2117 }
   2118 
   2119 FUNCTION {mastersthesis}
   2120 { std.status.using.comma
   2121   start.entry
   2122   if.url.alt.interword.spacing
   2123   format.authors "author" output.warn
   2124   name.or.dash
   2125   format.article.title "title" output.warn
   2126   format.master.thesis.type output.nonnull
   2127   format.school "school" bibinfo.warn output
   2128   format.address "address" bibinfo.check output
   2129   format.date "year" output.warn
   2130   format.note output
   2131   format.url output
   2132   fin.entry
   2133   if.url.std.interword.spacing
   2134 }
   2135 
   2136 FUNCTION {misc}
   2137 { std.status.using.comma
   2138   start.entry
   2139   if.url.alt.interword.spacing
   2140   format.authors output
   2141   name.or.dash
   2142   format.article.title output
   2143   format.howpublished "howpublished" bibinfo.check output 
   2144   format.organization "organization" bibinfo.check output
   2145   format.address "address" bibinfo.check output
   2146   format.pages output
   2147   format.date output
   2148   format.note output
   2149   format.url output
   2150   fin.entry
   2151   empty.entry.warn
   2152   if.url.std.interword.spacing
   2153 }
   2154 
   2155 FUNCTION {patent}
   2156 { std.status.using.comma
   2157   start.entry
   2158   if.url.alt.interword.spacing
   2159   format.authors output
   2160   name.or.dash
   2161   format.article.title output
   2162   format.patent.nationality.type.number output
   2163   format.patent.date output
   2164   format.note output
   2165   format.url output
   2166   fin.entry
   2167   empty.entry.warn
   2168   if.url.std.interword.spacing
   2169 }
   2170 
   2171 FUNCTION {periodical}
   2172 { std.status.using.comma
   2173   start.entry
   2174   if.url.alt.interword.spacing
   2175   format.editors output
   2176   name.or.dash
   2177   format.book.title "title" output.warn
   2178   format.series output
   2179   format.volume output
   2180   format.number output
   2181   format.organization "organization" bibinfo.check output
   2182   format.date "year" output.warn
   2183   format.note output
   2184   format.url output
   2185   fin.entry
   2186   if.url.std.interword.spacing
   2187 }
   2188 
   2189 FUNCTION {phdthesis}
   2190 { std.status.using.comma
   2191   start.entry
   2192   if.url.alt.interword.spacing
   2193   format.authors "author" output.warn
   2194   name.or.dash
   2195   format.article.title "title" output.warn
   2196   format.phd.thesis.type output.nonnull
   2197   format.school "school" bibinfo.warn output
   2198   format.address "address" bibinfo.check output
   2199   format.date "year" output.warn
   2200   format.note output
   2201   format.url output
   2202   fin.entry
   2203   if.url.std.interword.spacing
   2204 }
   2205 
   2206 FUNCTION {proceedings}
   2207 { std.status.using.comma
   2208   start.entry
   2209   if.url.alt.interword.spacing
   2210   format.editors output
   2211   name.or.dash
   2212   format.book.title "title" output.warn
   2213   format.series output
   2214   format.volume output
   2215   format.number output
   2216   publisher empty$
   2217     { format.address.organization.date output }
   2218     { format.organization "organization" bibinfo.check output
   2219       format.address.publisher.date output
   2220     }
   2221   if$
   2222   format.note output
   2223   format.url output
   2224   fin.entry
   2225   if.url.std.interword.spacing
   2226 }
   2227 
   2228 FUNCTION {standard}
   2229 { std.status.using.comma
   2230   start.entry
   2231   if.url.alt.interword.spacing
   2232   format.authors output
   2233   name.or.dash
   2234   format.book.title "title" output.warn
   2235   format.howpublished "howpublished" bibinfo.check output 
   2236   format.organization.institution.standard.type.number output
   2237   format.revision output
   2238   format.date output
   2239   format.note output
   2240   format.url output
   2241   fin.entry
   2242   if.url.std.interword.spacing
   2243 }
   2244 
   2245 FUNCTION {techreport}
   2246 { std.status.using.comma
   2247   start.entry
   2248   if.url.alt.interword.spacing
   2249   format.authors "author" output.warn
   2250   name.or.dash
   2251   format.article.title "title" output.warn
   2252   format.howpublished "howpublished" bibinfo.check output 
   2253   format.institution "institution" bibinfo.warn output
   2254   format.address "address" bibinfo.check output
   2255   format.tech.report.number output.nonnull
   2256   format.date "year" output.warn
   2257   format.note output
   2258   format.url output
   2259   fin.entry
   2260   if.url.std.interword.spacing
   2261 }
   2262 
   2263 FUNCTION {unpublished}
   2264 { std.status.using.comma
   2265   start.entry
   2266   if.url.alt.interword.spacing
   2267   format.authors "author" output.warn
   2268   name.or.dash
   2269   format.article.title "title" output.warn
   2270   format.date output
   2271   format.note "note" output.warn
   2272   format.url output
   2273   fin.entry
   2274   if.url.std.interword.spacing
   2275 }
   2276 
   2277 
   2278 % The special entry type which provides the user interface to the
   2279 % BST controls
   2280 FUNCTION {IEEEtranBSTCTL}
   2281 { is.print.banners.to.terminal
   2282     { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." *
   2283       top$
   2284     }
   2285     { skip$ }
   2286   if$
   2287   CTLuse_article_number
   2288   empty$
   2289     { skip$ }
   2290     { CTLuse_article_number
   2291       yes.no.to.int
   2292       'is.use.number.for.article :=
   2293     }
   2294   if$
   2295   CTLuse_paper
   2296   empty$
   2297     { skip$ }
   2298     { CTLuse_paper
   2299       yes.no.to.int
   2300       'is.use.paper :=
   2301     }
   2302   if$
   2303   CTLuse_forced_etal
   2304   empty$
   2305     { skip$ }
   2306     { CTLuse_forced_etal
   2307       yes.no.to.int
   2308       'is.forced.et.al :=
   2309     }
   2310   if$
   2311   CTLmax_names_forced_etal
   2312   empty$
   2313     { skip$ }
   2314     { CTLmax_names_forced_etal
   2315       string.to.integer
   2316       'max.num.names.before.forced.et.al :=
   2317     }
   2318   if$
   2319   CTLnames_show_etal
   2320   empty$
   2321     { skip$ }
   2322     { CTLnames_show_etal
   2323       string.to.integer
   2324       'num.names.shown.with.forced.et.al :=
   2325     }
   2326   if$
   2327   CTLuse_alt_spacing
   2328   empty$
   2329     { skip$ }
   2330     { CTLuse_alt_spacing
   2331       yes.no.to.int
   2332       'is.use.alt.interword.spacing :=
   2333     }
   2334   if$
   2335   CTLalt_stretch_factor
   2336   empty$
   2337     { skip$ }
   2338     { CTLalt_stretch_factor
   2339       'ALTinterwordstretchfactor :=
   2340       "\renewcommand{\BIBentryALTinterwordstretchfactor}{"
   2341       ALTinterwordstretchfactor * "}" *
   2342       write$ newline$
   2343     }
   2344   if$
   2345   CTLdash_repeated_names
   2346   empty$
   2347     { skip$ }
   2348     { CTLdash_repeated_names
   2349       yes.no.to.int
   2350       'is.dash.repeated.names :=
   2351     }
   2352   if$
   2353   CTLname_format_string
   2354   empty$
   2355     { skip$ }
   2356     { CTLname_format_string
   2357       'name.format.string :=
   2358     }
   2359   if$
   2360   CTLname_latex_cmd
   2361   empty$
   2362     { skip$ }
   2363     { CTLname_latex_cmd
   2364       'name.latex.cmd :=
   2365     }
   2366   if$
   2367   CTLname_url_prefix
   2368   missing$
   2369     { skip$ }
   2370     { CTLname_url_prefix
   2371       'name.url.prefix :=
   2372     }
   2373   if$
   2374 
   2375 
   2376   num.names.shown.with.forced.et.al max.num.names.before.forced.et.al >
   2377     { "CTLnames_show_etal cannot be greater than CTLmax_names_forced_etal in " cite$ * warning$ 
   2378       max.num.names.before.forced.et.al 'num.names.shown.with.forced.et.al :=
   2379     }
   2380     { skip$ }
   2381   if$
   2382 }
   2383 
   2384 
   2385 %%%%%%%%%%%%%%%%%%%
   2386 %% ENTRY ALIASES %%
   2387 %%%%%%%%%%%%%%%%%%%
   2388 FUNCTION {conference}{inproceedings}
   2389 FUNCTION {online}{electronic}
   2390 FUNCTION {internet}{electronic}
   2391 FUNCTION {webpage}{electronic}
   2392 FUNCTION {www}{electronic}
   2393 FUNCTION {default.type}{misc}
   2394 
   2395 
   2396 
   2397 %%%%%%%%%%%%%%%%%%
   2398 %% MAIN PROGRAM %%
   2399 %%%%%%%%%%%%%%%%%%
   2400 
   2401 READ
   2402 
   2403 EXECUTE {initialize.controls}
   2404 EXECUTE {initialize.status.constants}
   2405 EXECUTE {banner.message}
   2406 
   2407 EXECUTE {initialize.longest.label}
   2408 ITERATE {longest.label.pass}
   2409 
   2410 EXECUTE {begin.bib}
   2411 ITERATE {call.type$}
   2412 EXECUTE {end.bib}
   2413 
   2414 EXECUTE{completed.message}
   2415 
   2416 
   2417 %% That's all folks, mds.