comparison docs/SMC15/IEEEtran.bst @ 1118:3edcbbea168b

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