github.com/vipernet-xyz/tm@v0.34.24/spec/consensus/consensus-paper/IEEEtran.bst (about)

     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.