/articles/toma

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