Statistiques
| Branche: | Révision :

xlcloud / papers / 2014 / kwapi / IEEEtran.bst @ 3e01a9b3

Historique | Voir | Annoter | Télécharger (57,83 ko)

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.