]> AND Private Git Repository - mpi-energy2.git/blob - IEEEtran/IEEEtranS.bst
Logo AND Algorithmique Numérique Distribuée

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