comparison bibtex/IEEEtranS.bst @ 0:c0d36568602d

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