source: Publications/Wilfried Dron/JOURNAL - Scheduling Method for Network Lifetime Estimation of WSN/templates/IEEEtran.bst @ 139

Last change on this file since 139 was 132, checked in by dron, 11 years ago
File size: 60.2 KB
RevLine 
[132]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
120FUNCTION {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
125FUNCTION {default.is.use.paper} { #1 }
126
127
128% #0 turns off the forced use of "et al."
129% #1 enables
130FUNCTION {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.
138FUNCTION {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
142FUNCTION {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
147FUNCTION {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.
157FUNCTION {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
163FUNCTION {default.is.dash.repeated.names} { #1 }
164
165
166% The default name format control string.
167FUNCTION {default.name.format.string}{ "{f.~}{vv~}{ll}{, jj}" }
168
169
170% The default LaTeX font command for the names.
171FUNCTION {default.name.latex.cmd}{ "" }
172
173
174% The default URL prefix.
175FUNCTION {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
183FUNCTION {is.print.banners.to.terminal} { #1 }
184
185
186
187
188%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
189%% FILE VERSION AND BANNER %%
190%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
191
192FUNCTION{bst.file.version} { "1.12" }
193FUNCTION{bst.file.date} { "2007/01/11" }
194FUNCTION{bst.file.website} { "http://www.michaelshell.org/tex/ieeetran/bibtex/" }
195
196FUNCTION {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
210FUNCTION {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
228FUNCTION {bbl.and}{ "and" }
229FUNCTION {bbl.etal}{ "et~al." }
230FUNCTION {bbl.editors}{ "eds." }
231FUNCTION {bbl.editor}{ "ed." }
232FUNCTION {bbl.edition}{ "ed." }
233FUNCTION {bbl.volume}{ "vol." }
234FUNCTION {bbl.of}{ "of" }
235FUNCTION {bbl.number}{ "no." }
236FUNCTION {bbl.in}{ "in" }
237FUNCTION {bbl.pages}{ "pp." }
238FUNCTION {bbl.page}{ "p." }
239FUNCTION {bbl.chapter}{ "ch." }
240FUNCTION {bbl.paper}{ "paper" }
241FUNCTION {bbl.part}{ "pt." }
242FUNCTION {bbl.patent}{ "Patent" }
243FUNCTION {bbl.patentUS}{ "U.S." }
244FUNCTION {bbl.revision}{ "Rev." }
245FUNCTION {bbl.series}{ "ser." }
246FUNCTION {bbl.standard}{ "Std." }
247FUNCTION {bbl.techrep}{ "Tech. Rep." }
248FUNCTION {bbl.mthesis}{ "Master's thesis" }
249FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" }
250FUNCTION {bbl.st}{ "st" }
251FUNCTION {bbl.nd}{ "nd" }
252FUNCTION {bbl.rd}{ "rd" }
253FUNCTION {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).
258FUNCTION {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.
265FUNCTION {repeated.name.dashes} { "------" }
266
267
268
269%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
270%% PREDEFINED STRING MACROS %%
271%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
272
273MACRO {jan} {"Jan."}
274MACRO {feb} {"Feb."}
275MACRO {mar} {"Mar."}
276MACRO {apr} {"Apr."}
277MACRO {may} {"May"}
278MACRO {jun} {"Jun."}
279MACRO {jul} {"Jul."}
280MACRO {aug} {"Aug."}
281MACRO {sep} {"Sep."}
282MACRO {oct} {"Oct."}
283MACRO {nov} {"Nov."}
284MACRO {dec} {"Dec."}
285
286
287
288%%%%%%%%%%%%%%%%%%
289%% ENTRY FIELDS %%
290%%%%%%%%%%%%%%%%%%
291
292ENTRY
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
348INTEGERS { 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
359INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames }
360
361INTEGERS { 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
374STRINGS { 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
391FUNCTION {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
478FUNCTION {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
493FUNCTION {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
501FUNCTION {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
509FUNCTION {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
521FUNCTION {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
528FUNCTION {cap.status.std}{ cap.std 'status.cap := }
529
530FUNCTION {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
538FUNCTION {not}
539{   { #0 }
540    { #1 }
541  if$
542}
543
544FUNCTION {and}
545{   { skip$ }
546    { pop$ #0 }
547  if$
548}
549
550FUNCTION {or}
551{   { pop$ #1 }
552    { skip$ }
553  if$
554}
555
556
557% convert the strings "yes" or "no" to #1 or #0 respectively
558FUNCTION {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"
576FUNCTION {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
583FUNCTION {bump.int.mag}
584{ #0 'multiresult :=
585    { duplicate$ #0 > }
586    { #1 -
587      multiresult #10 +
588      'multiresult :=
589    }
590  while$
591pop$
592multiresult
593}
594
595% converts a single character string on the stack to an integer
596FUNCTION {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
608FUNCTION {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$
620pop$
621numnames
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
643FUNCTION {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
672FUNCTION {output}
673{ duplicate$ empty$
674    'pop$
675    'output.nonnull
676  if$
677}
678
679FUNCTION {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
690FUNCTION {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$
699write$
700newline$
701}
702
703
704FUNCTION {is.last.char.not.punct}
705{ duplicate$
706   "}" * add.period$
707   #-1 #1 substring$ "." =
708}
709
710FUNCTION {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
730FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ }
731
732FUNCTION {emphasize}
733{ duplicate$ empty$
734    { pop$ "" }
735    { "\emph{" swap$ * "}" * }
736  if$
737}
738
739FUNCTION {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).
752FUNCTION {select.language}
753{ duplicate$ empty$ 'pop$
754    { language empty$ 'skip$
755        { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * }
756      if$
757    }
758  if$
759}
760
761FUNCTION {tie.or.space.prefix}
762{ duplicate$ text.length$ #3 <
763    { "~" }
764    { " " }
765  if$
766  swap$
767}
768
769FUNCTION {get.bbl.editor}
770{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ }
771
772FUNCTION {space.word}{ " " swap$ * " " * }
773
774
775% Field Conditioners, Converters, Checkers and External Interfaces
776
777FUNCTION {empty.field.to.null.string}
778{ duplicate$ empty$
779    { pop$ "" }
780    { skip$ }
781  if$
782}
783
784FUNCTION {either.or.check}
785{ empty$
786    { pop$ }
787    { "can't use both " swap$ * " fields in " * cite$ * warning$ }
788  if$
789}
790
791FUNCTION {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
817FUNCTION {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
828FUNCTION {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.
845FUNCTION {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).
851FUNCTION {large.number.blocksize}{ #3 }
852
853% What is actually inserted between the number groups.
854FUNCTION {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.
859FUNCTION {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 "--".
887FUNCTION {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).
917FUNCTION {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.
937FUNCTION {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.
957FUNCTION {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".
977FUNCTION {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.
1024FUNCTION {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
1050FUNCTION {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.
1067FUNCTION {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
1116FUNCTION {end.bib}
1117{ newline$ "\end{thebibliography}" write$ newline$ }
1118
1119FUNCTION {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
1126FUNCTION {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
1140FUNCTION {initialize.longest.label}
1141{ "" 'longest.label :=
1142  #1 'number.label :=
1143  #0 'longest.label.width :=
1144}
1145
1146FUNCTION {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
1170FUNCTION {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
1221FUNCTION {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
1282FUNCTION {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
1295FUNCTION {format.authors}{ author "author" format.names }
1296
1297FUNCTION {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
1311FUNCTION {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
1337FUNCTION {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.
1373FUNCTION {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.
1395FUNCTION {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.
1414FUNCTION {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
1434FUNCTION {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
1455FUNCTION {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
1470FUNCTION {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
1495FUNCTION {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
1511FUNCTION {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
1526FUNCTION {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
1539FUNCTION {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
1548FUNCTION {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
1557FUNCTION {format.address.publisher.date}
1558{ publisher "publisher" bibinfo.warn format.address.org.or.pub.date }
1559
1560FUNCTION {format.address.publisher.date.nowarn}
1561{ publisher "publisher" bibinfo.check format.address.org.or.pub.date }
1562
1563FUNCTION {format.address.organization.date}
1564{ organization "organization" bibinfo.check format.address.org.or.pub.date }
1565
1566FUNCTION {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
1579FUNCTION {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
1597FUNCTION {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
1614FUNCTION {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.
1624FUNCTION {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
1637FUNCTION {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"
1661FUNCTION {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
1691FUNCTION {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
1716FUNCTION {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
1738FUNCTION {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
1764FUNCTION {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
1820FUNCTION {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
1852FUNCTION {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
1879FUNCTION {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
1896FUNCTION {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$
1907cap.status.std
1908}
1909
1910FUNCTION {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$
1921cap.status.std
1922}
1923
1924
1925
1926%% URL
1927
1928FUNCTION {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"
1956FUNCTION {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
1974FUNCTION {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
1998FUNCTION {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
2015FUNCTION {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
2033FUNCTION {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
2055FUNCTION {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
2076FUNCTION {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
2102FUNCTION {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
2119FUNCTION {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
2136FUNCTION {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
2155FUNCTION {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
2171FUNCTION {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
2189FUNCTION {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
2206FUNCTION {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
2228FUNCTION {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
2245FUNCTION {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
2263FUNCTION {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
2280FUNCTION {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%%%%%%%%%%%%%%%%%%%
2388FUNCTION {conference}{inproceedings}
2389FUNCTION {online}{electronic}
2390FUNCTION {internet}{electronic}
2391FUNCTION {webpage}{electronic}
2392FUNCTION {www}{electronic}
2393FUNCTION {default.type}{misc}
2394
2395
2396
2397%%%%%%%%%%%%%%%%%%
2398%% MAIN PROGRAM %%
2399%%%%%%%%%%%%%%%%%%
2400
2401READ
2402
2403EXECUTE {initialize.controls}
2404EXECUTE {initialize.status.constants}
2405EXECUTE {banner.message}
2406
2407EXECUTE {initialize.longest.label}
2408ITERATE {longest.label.pass}
2409
2410EXECUTE {begin.bib}
2411ITERATE {call.type$}
2412EXECUTE {end.bib}
2413
2414EXECUTE{completed.message}
2415
2416
2417%% That's all folks, mds.
Note: See TracBrowser for help on using the repository browser.