3 %% BibTeX Bibliography Style file for IEEE Journals and Conferences (unsorted)
4 %% Version 1.12 (2007/01/11)
6 %% Copyright (c) 2003-2007 Michael Shell
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:
12 %% 1. Howard Trickey and Oren Patashnik's ieeetr.bst (1985/1988)
13 %% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993)
16 %% http://www.michaelshell.org/tex/ieeetran/
17 %% http://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/
19 %% http://www.ieee.org/
21 %% For use with BibTeX version 0.99a or later
23 %% This is a numerical citation style.
25 %%*************************************************************************
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.
36 %% All comments are the opinions of their respective authors and are not
37 %% necessarily endorsed by the IEEE.
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. **
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 %%*************************************************************************
56 % 1.00 (2002/08/13) Initial release
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.
65 % 1. Fixed bug with URLs containing underscores when using url.sty. Thanks
66 % to Ming Kin Lai for reporting this.
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
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
87 % 8. Control entry types should not be considered when calculating longest
89 % 9. Added alias www for electronic/online.
90 % 10. Added CTLname_url_prefix control entry type.
93 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
94 %% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %%
95 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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.
100 % NOTE: The recommended LaTeX command to invoke a control entry type is:
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}%
111 % It is called at the start of the document, before the first \cite, like:
112 % \bstctlcite{IEEEexample:BSTcontrol}
114 % IEEEtran.cls V1.6 and later does provide this command.
118 % #0 turns off the display of the number for articles.
120 FUNCTION {default.is.use.number.for.article} { #1 }
123 % #0 turns off the display of the paper and type fields in @inproceedings.
125 FUNCTION {default.is.use.paper} { #1 }
128 % #0 turns off the forced use of "et al."
130 FUNCTION {default.is.forced.et.al} { #0 }
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
138 FUNCTION {default.max.num.names.before.forced.et.al} { #10 }
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 }
145 % #0 turns off the alternate interword spacing for entries with URLs.
147 FUNCTION {default.is.use.alt.interword.spacing} { #1 }
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" }
160 % #0 turns off the "dashification" of repeated (i.e., identical to those
161 % of the previous entry) names. IEEE normally does this.
163 FUNCTION {default.is.dash.repeated.names} { #1 }
166 % The default name format control string.
167 FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" }
170 % The default LaTeX font command for the names.
171 FUNCTION {default.name.latex.cmd}{ "" }
174 % The default URL prefix.
175 FUNCTION {default.name.url.prefix}{ "[Online]. Available:" }
178 % Other controls that cannot be accessed via IEEEtranBSTCTL entry type.
180 % #0 turns off the terminal startup banner/completed message so as to
181 % operate more quietly.
183 FUNCTION {is.print.banners.to.terminal} { #1 }
188 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
189 %% FILE VERSION AND BANNER %%
190 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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/" }
196 FUNCTION {banner.message}
197 { is.print.banners.to.terminal
198 { "-- IEEEtran.bst version" " " * bst.file.version *
199 " (" * bst.file.date * ") " * "by Michael Shell." *
201 "-- " bst.file.website *
203 "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * " manual for usage information." *
210 FUNCTION {completed.message}
211 { is.print.banners.to.terminal
224 %%%%%%%%%%%%%%%%%%%%%%
225 %% STRING CONSTANTS %%
226 %%%%%%%%%%%%%%%%%%%%%%
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" }
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 " }
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} { "------" }
269 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
270 %% PREDEFINED STRING MACROS %%
271 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
326 CTLuse_article_number
329 CTLmax_names_forced_etal
332 CTLalt_stretch_factor
333 CTLdash_repeated_names
334 CTLname_format_string
344 %%%%%%%%%%%%%%%%%%%%%%%
345 %% INTEGER VARIABLES %%
346 %%%%%%%%%%%%%%%%%%%%%%%
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
354 prev.status.nline this.status.nline nline.std
355 nline.no nline.newblock
359 INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames }
361 INTEGERS { is.use.number.for.article
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}
370 %%%%%%%%%%%%%%%%%%%%%%
371 %% STRING VARIABLES %%
372 %%%%%%%%%%%%%%%%%%%%%%
379 ALTinterwordstretchfactor
387 %%%%%%%%%%%%%%%%%%%%%%%%%
388 %% LOW LEVEL FUNCTIONS %%
389 %%%%%%%%%%%%%%%%%%%%%%%%%
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 :=
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.
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.
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):
431 % which, in this example, is to eventually appear in the bibliography as:
433 % "PREVIOUS_ITEM," CURRENT_ITEM
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:
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.
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.
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.
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.
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
478 FUNCTION {initialize.status.constants}
490 #1 'nline.newblock :=
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 :=
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 :=
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 :=
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 :=
528 FUNCTION {cap.status.std}{ cap.std 'status.cap := }
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 :=
557 % convert the strings "yes" or "no" to #1 or #0 respectively
558 FUNCTION {yes.no.to.int}
559 { "l" change.case$ duplicate$
564 { "unknown boolean " quote$ * swap$ * quote$ *
565 " in " * cite$ * warning$
574 % pushes true if the single char string on the stack is in the
575 % range of "0" to "9"
578 duplicate$ "0" chr.to.int$ < not
579 swap$ "9" chr.to.int$ > not and
582 % multiplies the integer on the stack by a factor of 10
583 FUNCTION {bump.int.mag}
595 % converts a single character string on the stack to an integer
596 FUNCTION {char.to.integer}
599 { chr.to.int$ "0" chr.to.int$ - }
600 {"noninteger character " quote$ * swap$ * quote$ *
601 " in integer field of " * cite$ * warning$
607 % converts a string on the stack to an integer
608 FUNCTION {string.to.integer}
609 { duplicate$ text.length$ 'namesleft :=
612 { nameptr namesleft > not }
613 { duplicate$ nameptr #1 substring$
614 char.to.integer numnames bump.int.mag +
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.
634 % "output.nonnull" does not check for the presence of a previous empty
637 % "output" does check for the presence of a previous empty item and will
638 % remove an empty item rather than outputing it.
640 % "output.warn" is like "output", but will issue a warning if it detects
643 FUNCTION {output.nonnull}
645 prev.status.punct punct.comma =
649 prev.status.punct punct.period =
653 prev.status.quote quote.close =
657 prev.status.space space.normal =
661 prev.status.space space.large =
666 prev.status.nline nline.newblock =
667 { newline$ "\newblock " write$ }
679 FUNCTION {output.warn}
682 { pop$ "empty " t * " in " * cite$ * warning$ }
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).
691 { this.status.punct punct.no =
695 this.status.quote quote.close =
704 FUNCTION {is.last.char.not.punct}
707 #-1 #1 substring$ "." =
710 FUNCTION {is.multiple.pages}
719 swap$ duplicate$ "," =
722 { #1 'multiresult := }
723 { t #2 global.max$ substring$ 't := }
730 FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ }
735 { "\emph{" swap$ * "}" * }
739 FUNCTION {do.name.latex.cmd}
743 { name.latex.cmd "{" * swap$ * "}" * }
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
752 FUNCTION {select.language}
753 { duplicate$ empty$ 'pop$
754 { language empty$ 'skip$
755 { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * }
761 FUNCTION {tie.or.space.prefix}
762 { duplicate$ text.length$ #3 <
769 FUNCTION {get.bbl.editor}
770 { editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ }
772 FUNCTION {space.word}{ " " swap$ * " " * }
775 % Field Conditioners, Converters, Checkers and External Interfaces
777 FUNCTION {empty.field.to.null.string}
784 FUNCTION {either.or.check}
787 { "can't use both " swap$ * " fields in " * cite$ * warning$ }
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$ }
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.
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.
817 FUNCTION {bibinfo.check}
818 { swap$ duplicate$ missing$
828 FUNCTION {bibinfo.warn}
829 { swap$ duplicate$ missing$
830 { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" }
832 { swap$ "empty " swap$ * " in " * cite$ * warning$ }
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.
844 % number of consecutive digits required to trigger the group separation.
845 FUNCTION {large.number.trigger}{ #5 }
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 }
853 % What is actually inserted between the number groups.
854 FUNCTION {large.number.separator}{ "\," }
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}
863 large.number.trigger 'nameptr :=
865 { t #-1 #1 substring$ is.num
866 { numnames #1 + 'numnames := }
868 large.number.trigger 'nameptr :=
871 t #-1 #1 substring$ swap$ *
872 t #-2 global.max$ substring$ 't :=
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 :=
886 % Converts all single dashes "-" to double dashes "--".
888 { large.number.separate
892 { t #1 #1 substring$ "-" =
893 { t #1 #2 substring$ "--" = not
895 t #2 global.max$ substring$ 't :=
897 { { t #1 #1 substring$ "-" = }
899 t #2 global.max$ substring$ 't :=
905 { t #1 #1 substring$ *
906 t #2 global.max$ substring$ 't :=
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}
922 { is.dash.repeated.names
923 { repeated.name.dashes }
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" =
940 { duplicate$ #-1 #1 substring$ "2" =
942 { duplicate$ #-1 #1 substring$ "3" =
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
957 FUNCTION {extract.num}
962 t #2 global.max$ substring$ 't :=
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 :=
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
1031 duplicate$ #1 #1 substring$ is.num
1033 { "edition ordinal word " quote$ * edition * quote$ *
1034 " may be too high (or improper) for conversion" * " in " * cite$ * warning$
1046 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1047 %% LATEX BIBLIOGRAPHY CODE %%
1048 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1050 FUNCTION {start.entry}
1057 initialize.prev.this.status
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 * ")" *
1070 preamble$ empty$ 'skip$
1071 { preamble$ write$ newline$ }
1073 "\begin{thebibliography}{" longest.label * "}" *
1075 "\providecommand{\url}[1]{#1}"
1077 "\csname url@samestyle\endcsname"
1079 "\providecommand{\newblock}{\relax}"
1081 "\providecommand{\bibinfo}[2]{#2}"
1083 "\providecommand{\BIBentrySTDinterwordspacing}{\spaceskip=0pt\relax}"
1085 "\providecommand{\BIBentryALTinterwordstretchfactor}{"
1086 ALTinterwordstretchfactor * "}" *
1088 "\providecommand{\BIBentryALTinterwordspacing}{\spaceskip=\fontdimen2\font plus "
1090 "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}"
1092 "\providecommand{\BIBforeignlanguage}[2]{{%"
1094 "\expandafter\ifx\csname l@#1\endcsname\relax"
1096 "\typeout{** WARNING: IEEEtran.bst: No hyphenation pattern has been}%"
1098 "\typeout{** loaded for the language `#1'. Using the pattern for}%"
1100 "\typeout{** the default language instead.}%"
1104 "\language=\csname l@#1\endcsname"
1110 "\providecommand{\BIBdecl}{\relax}"
1117 { newline$ "\end{thebibliography}" write$ newline$ }
1119 FUNCTION {if.url.alt.interword.spacing}
1120 { is.use.alt.interword.spacing
1121 {url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$}
1126 FUNCTION {if.url.std.interword.spacing}
1127 { is.use.alt.interword.spacing
1128 {url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$}
1136 %%%%%%%%%%%%%%%%%%%%%%%%
1137 %% LONGEST LABEL PASS %%
1138 %%%%%%%%%%%%%%%%%%%%%%%%
1140 FUNCTION {initialize.longest.label}
1141 { "" 'longest.label :=
1143 #0 'longest.label.width :=
1146 FUNCTION {longest.label.pass}
1147 { type$ "ieeetranbstctl" =
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 :=
1164 %%%%%%%%%%%%%%%%%%%%%
1165 %% FORMAT HANDLERS %%
1166 %%%%%%%%%%%%%%%%%%%%%
1168 %% Lower Level Formats (used by higher level formats)
1170 FUNCTION {format.address.org.or.pub.date}
1174 { "empty year in " cite$ * warning$ }
1177 address empty$ t empty$ and
1178 year empty$ and month empty$ and
1180 { this.to.prev.status
1183 address "address" bibinfo.check *
1186 { punct.period 'prev.status.punct :=
1187 space.large 'prev.status.space :=
1195 year empty$ month empty$ and
1197 { t empty$ address empty$ and
1204 { year "year" bibinfo.check * }
1207 { month "month" bibinfo.check *
1210 { " " * year "year" bibinfo.check * }
1221 FUNCTION {format.names}
1223 duplicate$ empty$ 'skip$ {
1229 s num.names$ 'numnames :=
1230 numnames 'namesleft :=
1235 bibinfo bibinfo.check
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
1247 { ", " * t do.name.latex.cmd * }
1248 { s nameptr "{ll}" format.name$ duplicate$ "others" =
1253 { " " * bbl.etal emphasize * }
1259 space.word * t do.name.latex.cmd *
1265 { t do.name.latex.cmd }
1267 nameptr #1 + 'nameptr :=
1268 namesleft #1 - 'namesleft :=
1278 %% Higher Level Formats
1280 %% addresses/locations
1282 FUNCTION {format.address}
1283 { address duplicate$ empty$ 'skip$
1284 { this.to.prev.status
1293 %% author/editor names
1295 FUNCTION {format.authors}{ author "author" format.names }
1297 FUNCTION {format.editors}
1298 { editor "editor" format.names duplicate$ empty$ 'skip$
1311 FUNCTION {format.date}
1313 month "month" bibinfo.check duplicate$ empty$
1314 year "year" bibinfo.check duplicate$ empty$
1316 { this.to.prev.status
1319 "there's a month but no year in " cite$ * warning$ }
1323 { this.to.prev.status
1337 FUNCTION {format.date.electronic}
1338 { month "month" bibinfo.check duplicate$ empty$
1339 year "year" bibinfo.check duplicate$ empty$
1342 { "there's a month but no year in " cite$ * warning$
1343 pop$ ")" * "(" swap$ *
1345 punct.no 'this.status.punct :=
1346 space.normal 'this.status.space :=
1347 quote.no 'this.status.quote :=
1348 cap.yes 'status.cap :=
1353 { swap$ pop$ ")" * "(" swap$ * }
1354 { "(" swap$ * ", " * swap$ * ")" * }
1357 punct.no 'this.status.punct :=
1358 space.normal 'this.status.space :=
1359 quote.no 'this.status.quote :=
1360 cap.yes 'status.cap :=
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
1382 "edition" bibinfo.check
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
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
1420 edition empty$ 'skip$
1425 * "~" * bbl.edition *
1428 bbl.in " " * swap$ *
1434 FUNCTION {format.article.title}
1435 { title duplicate$ empty$ 'skip$
1436 { this.to.prev.status
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 := }
1455 FUNCTION {format.article.title.electronic}
1456 { title duplicate$ empty$ 'skip$
1457 { this.to.prev.status
1463 "title" bibinfo.check
1470 FUNCTION {format.book.title.edition}
1471 { title "title" bibinfo.check
1473 { "empty title in " cite$ * warning$ }
1474 { this.to.prev.status
1478 edition empty$ 'skip$
1487 * "~" * bbl.edition *
1495 FUNCTION {format.book.title}
1496 { title "title" bibinfo.check
1497 duplicate$ empty$ 'skip$
1498 { this.to.prev.status
1511 FUNCTION {format.journal}
1512 { journal duplicate$ empty$ 'skip$
1513 { this.to.prev.status
1526 FUNCTION {format.howpublished}
1527 { howpublished duplicate$ empty$ 'skip$
1528 { this.to.prev.status
1537 %% institutions/organization/publishers/school
1539 FUNCTION {format.institution}
1540 { institution duplicate$ empty$ 'skip$
1541 { this.to.prev.status
1548 FUNCTION {format.organization}
1549 { organization duplicate$ empty$ 'skip$
1550 { this.to.prev.status
1557 FUNCTION {format.address.publisher.date}
1558 { publisher "publisher" bibinfo.warn format.address.org.or.pub.date }
1560 FUNCTION {format.address.publisher.date.nowarn}
1561 { publisher "publisher" bibinfo.check format.address.org.or.pub.date }
1563 FUNCTION {format.address.organization.date}
1564 { organization "organization" bibinfo.check format.address.org.or.pub.date }
1566 FUNCTION {format.school}
1567 { school duplicate$ empty$ 'skip$
1568 { this.to.prev.status
1577 %% volume/number/series/chapter/pages
1579 FUNCTION {format.volume}
1580 { volume empty.field.to.null.string
1581 duplicate$ empty$ 'skip$
1582 { this.to.prev.status
1589 swap$ tie.or.space.prefix
1590 "volume" bibinfo.check
1597 FUNCTION {format.number}
1598 { number empty.field.to.null.string
1599 duplicate$ empty$ 'skip$
1600 { this.to.prev.status
1603 { bbl.number capitalize }
1606 swap$ tie.or.space.prefix
1607 "number" bibinfo.check
1614 FUNCTION {format.number.if.use.for.article}
1615 { is.use.number.for.article
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}
1627 { this.to.prev.status
1630 series "series" bibinfo.check *
1637 FUNCTION {format.chapter}
1640 { this.to.prev.status
1644 { type "l" change.case$
1645 "type" bibinfo.check
1648 chapter tie.or.space.prefix
1649 "chapter" bibinfo.check
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}
1666 { this.to.prev.status
1668 type "type" bibinfo.check
1673 { this.to.prev.status
1677 { type "type" bibinfo.check }
1680 "paper" bibinfo.check
1691 FUNCTION {format.pages}
1692 { pages duplicate$ empty$ 'skip$
1693 { this.to.prev.status
1695 duplicate$ is.multiple.pages
1705 "pages" bibinfo.check
1714 %% technical report number
1716 FUNCTION {format.tech.report.number}
1717 { number "number" bibinfo.check
1721 type duplicate$ empty$
1727 "type" bibinfo.check
1728 swap$ duplicate$ empty$
1730 { tie.or.space.prefix * * }
1738 FUNCTION {format.note}
1741 { this.to.prev.status
1743 punct.period 'this.status.punct :=
1744 note #1 #1 substring$
1754 note #2 global.max$ substring$ * "note" bibinfo.check
1755 cap.yes 'status.cap :=
1764 FUNCTION {format.patent.date}
1765 { this.to.prev.status
1768 { monthfiled duplicate$ empty$
1769 { "monthfiled" bibinfo.check pop$ "" }
1770 { "monthfiled" bibinfo.check }
1772 dayfiled duplicate$ empty$
1773 { "dayfiled" bibinfo.check pop$ "" * }
1774 { "dayfiled" bibinfo.check
1776 { "dayfiled without a monthfiled in " cite$ * warning$
1784 { "no year or yearfiled in " cite$ * warning$ }
1785 { yearfiled "yearfiled" bibinfo.check
1794 { month duplicate$ empty$
1795 { "month" bibinfo.check pop$ "" }
1796 { "month" bibinfo.check }
1798 day duplicate$ empty$
1799 { "day" bibinfo.check pop$ "" * }
1800 { "day" bibinfo.check
1802 { "day without a month in " cite$ * warning$
1809 year "year" bibinfo.check
1820 FUNCTION {format.patent.nationality.type.number}
1821 { this.to.prev.status
1823 nationality duplicate$ empty$
1824 { "nationality" bibinfo.warn pop$ "" }
1825 { "nationality" bibinfo.check
1826 duplicate$ "l" change.case$ "united states" =
1827 { pop$ bbl.patentUS }
1834 { bbl.patent "type" bibinfo.check }
1835 { type "type" bibinfo.check }
1838 number duplicate$ empty$
1839 { "number" bibinfo.warn pop$ }
1840 { "number" bibinfo.check
1841 large.number.separate
1852 FUNCTION {format.organization.institution.standard.type.number}
1853 { this.to.prev.status
1855 organization duplicate$ empty$
1857 institution duplicate$ empty$
1858 { "institution" bibinfo.warn }
1859 { "institution" bibinfo.warn " " * }
1862 { "organization" bibinfo.warn " " * }
1865 { bbl.standard "type" bibinfo.check }
1866 { type "type" bibinfo.check }
1869 number duplicate$ empty$
1870 { "number" bibinfo.check pop$ }
1871 { "number" bibinfo.check
1872 large.number.separate
1879 FUNCTION {format.revision}
1882 { this.to.prev.status
1885 revision tie.or.space.prefix
1886 "revision" bibinfo.check
1896 FUNCTION {format.master.thesis.type}
1897 { this.to.prev.status
1904 type "type" bibinfo.check
1910 FUNCTION {format.phd.thesis.type}
1911 { this.to.prev.status
1918 type "type" bibinfo.check
1928 FUNCTION {format.url}
1931 { this.to.prev.status
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 :=
1948 %%%%%%%%%%%%%%%%%%%%
1949 %% ENTRY HANDLERS %%
1950 %%%%%%%%%%%%%%%%%%%%
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"
1957 { std.status.using.comma
1959 if.url.alt.interword.spacing
1960 format.authors "author" output.warn
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
1967 format.date "year" output.warn
1971 if.url.std.interword.spacing
1975 { std.status.using.comma
1977 if.url.alt.interword.spacing
1979 { format.editors "author and editor" output.warn }
1980 { format.authors output.nonnull }
1983 format.book.title.edition output
1984 format.series output
1987 { format.editors output }
1989 format.address.publisher.date output
1990 format.volume output
1991 format.number output
1995 if.url.std.interword.spacing
1999 { std.status.using.comma
2001 if.url.alt.interword.spacing
2002 format.authors output
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
2012 if.url.std.interword.spacing
2015 FUNCTION {electronic}
2016 { std.status.using.period
2018 if.url.alt.interword.spacing
2019 format.authors output
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
2030 if.url.std.interword.spacing
2034 { std.status.using.comma
2036 if.url.alt.interword.spacing
2038 { format.editors "author and editor" output.warn }
2039 { format.authors output.nonnull }
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
2052 if.url.std.interword.spacing
2055 FUNCTION {incollection}
2056 { std.status.using.comma
2058 if.url.alt.interword.spacing
2059 format.authors "author" output.warn
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
2073 if.url.std.interword.spacing
2076 FUNCTION {inproceedings}
2077 { std.status.using.comma
2079 if.url.alt.interword.spacing
2080 format.authors "author" output.warn
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
2089 { format.address.organization.date output }
2090 { format.organization "organization" bibinfo.check output
2091 format.address.publisher.date output
2099 if.url.std.interword.spacing
2103 { std.status.using.comma
2105 if.url.alt.interword.spacing
2106 format.authors output
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
2116 if.url.std.interword.spacing
2119 FUNCTION {mastersthesis}
2120 { std.status.using.comma
2122 if.url.alt.interword.spacing
2123 format.authors "author" output.warn
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
2133 if.url.std.interword.spacing
2137 { std.status.using.comma
2139 if.url.alt.interword.spacing
2140 format.authors output
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
2152 if.url.std.interword.spacing
2156 { std.status.using.comma
2158 if.url.alt.interword.spacing
2159 format.authors output
2161 format.article.title output
2162 format.patent.nationality.type.number output
2163 format.patent.date output
2168 if.url.std.interword.spacing
2171 FUNCTION {periodical}
2172 { std.status.using.comma
2174 if.url.alt.interword.spacing
2175 format.editors output
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
2186 if.url.std.interword.spacing
2189 FUNCTION {phdthesis}
2190 { std.status.using.comma
2192 if.url.alt.interword.spacing
2193 format.authors "author" output.warn
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
2203 if.url.std.interword.spacing
2206 FUNCTION {proceedings}
2207 { std.status.using.comma
2209 if.url.alt.interword.spacing
2210 format.editors output
2212 format.book.title "title" output.warn
2213 format.series output
2214 format.volume output
2215 format.number output
2217 { format.address.organization.date output }
2218 { format.organization "organization" bibinfo.check output
2219 format.address.publisher.date output
2225 if.url.std.interword.spacing
2229 { std.status.using.comma
2231 if.url.alt.interword.spacing
2232 format.authors output
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
2242 if.url.std.interword.spacing
2245 FUNCTION {techreport}
2246 { std.status.using.comma
2248 if.url.alt.interword.spacing
2249 format.authors "author" output.warn
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
2260 if.url.std.interword.spacing
2263 FUNCTION {unpublished}
2264 { std.status.using.comma
2266 if.url.alt.interword.spacing
2267 format.authors "author" output.warn
2269 format.article.title "title" output.warn
2271 format.note "note" output.warn
2274 if.url.std.interword.spacing
2278 % The special entry type which provides the user interface to the
2280 FUNCTION {IEEEtranBSTCTL}
2281 { is.print.banners.to.terminal
2282 { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." *
2287 CTLuse_article_number
2290 { CTLuse_article_number
2292 'is.use.number.for.article :=
2306 { CTLuse_forced_etal
2311 CTLmax_names_forced_etal
2314 { CTLmax_names_forced_etal
2316 'max.num.names.before.forced.et.al :=
2322 { CTLnames_show_etal
2324 'num.names.shown.with.forced.et.al :=
2330 { CTLuse_alt_spacing
2332 'is.use.alt.interword.spacing :=
2335 CTLalt_stretch_factor
2338 { CTLalt_stretch_factor
2339 'ALTinterwordstretchfactor :=
2340 "\renewcommand{\BIBentryALTinterwordstretchfactor}{"
2341 ALTinterwordstretchfactor * "}" *
2345 CTLdash_repeated_names
2348 { CTLdash_repeated_names
2350 'is.dash.repeated.names :=
2353 CTLname_format_string
2356 { CTLname_format_string
2357 'name.format.string :=
2370 { CTLname_url_prefix
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 :=
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}
2403 EXECUTE {initialize.controls}
2404 EXECUTE {initialize.status.constants}
2405 EXECUTE {banner.message}
2407 EXECUTE {initialize.longest.label}
2408 ITERATE {longest.label.pass}
2411 ITERATE {call.type$}
2414 EXECUTE{completed.message}
2417 %% That's all folks, mds.