IEEEtran.bst (59215B)
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.