Révision c3cc6a4e
/dev/null | ||
---|---|---|
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$ |
Formats disponibles : Unified diff