]> AND Private Git Repository - 16dcc.git/blob - IEEEtran.cls
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Merge branch 'master' of ssh://bilbo.iut-bm.univ-fcomte.fr/16dcc
[16dcc.git] / IEEEtran.cls
1 %%
2 %% IEEEtran.cls 2015/08/26 version V1.8b
3 %% 
4 %% This is the IEEEtran LaTeX class for authors of the Institute of 
5 %% Electrical and Electronics Engineers (IEEE) Transactions journals and
6 %% conferences.
7 %% 
8 %% Support sites:
9 %% http://www.michaelshell.org/tex/ieeetran/
10 %% http://www.ctan.org/pkg/ieeetran
11 %% and
12 %% http://www.ieee.org/
13 %%
14 %% Based on the original 1993 IEEEtran.cls, but with many bug fixes
15 %% and enhancements (from both JVH and MDS) over the 1996/7 version.
16 %%
17 %%
18 %% Contributors:
19 %% Gerry Murray (1993), Silvano Balemi (1993),
20 %% Jon Dixon (1996), Peter N"uchter (1996),
21 %% Juergen von Hagen (2000), and Michael Shell (2001-2014)
22 %% 
23 %% 
24 %% Copyright (c) 1993-2000 by Gerry Murray, Silvano Balemi, 
25 %%                         Jon Dixon, Peter N"uchter,
26 %%                         Juergen von Hagen
27 %%                         and
28 %% Copyright (c) 2001-2015 by Michael Shell
29 %%
30 %% Current maintainer (V1.3 to V1.8b): Michael Shell
31 %%                                     See:
32 %%                                     http://www.michaelshell.org/
33 %%                                     for current contact information.
34 %%
35 %% Special thanks to Peter Wilson (CUA) and Donald Arseneau
36 %% for allowing the inclusion of the \@ifmtarg command 
37 %% from their ifmtarg LaTeX package. 
38 %% 
39 %%*************************************************************************
40 %% Legal Notice:
41 %% This code is offered as-is without any warranty either expressed or
42 %% implied; without even the implied warranty of MERCHANTABILITY or
43 %% FITNESS FOR A PARTICULAR PURPOSE! 
44 %% User assumes all risk.
45 %% In no event shall the IEEE or any contributor to this code be liable for
46 %% any damages or losses, including, but not limited to, incidental,
47 %% consequential, or any other damages, resulting from the use or misuse
48 %% of any information contained here.
49 %%
50 %% All comments are the opinions of their respective authors and are not
51 %% necessarily endorsed by the IEEE.
52 %%
53 %% This work is distributed under the LaTeX Project Public License (LPPL)
54 %% ( http://www.latex-project.org/ ) version 1.3, and may be freely used,
55 %% distributed and modified. A copy of the LPPL, version 1.3, is included
56 %% in the base LaTeX documentation of all distributions of LaTeX released
57 %% 2003/12/01 or later.
58 %% Retain all contribution notices and credits.
59 %% ** Modified files should be clearly indicated as such, including  **
60 %% ** renaming them and changing author support contact information. **
61 %%
62 %% File list of work: IEEEtran.cls, IEEEtran_HOWTO.pdf, bare_adv.tex,
63 %%                    bare_conf.tex, bare_jrnl.tex, bare_conf_compsoc.tex,
64 %%                    bare_jrnl_compsoc.tex
65 %% 
66 %% Major changes to the user interface should be indicated by an 
67 %% increase in the version numbers. If a version is a beta, it will 
68 %% be indicated with a BETA suffix, i.e., 1.4 BETA.
69 %% Small changes can be indicated by appending letters to the version
70 %% such as "IEEEtran_v14a.cls".
71 %% In all cases, \Providesclass, any \typeout messages to the user,
72 %% \IEEEtransversionmajor and \IEEEtransversionminor must reflect the
73 %% correct version information.
74 %% The changes should also be documented via source comments.
75 %%*************************************************************************
76 %%
77 %
78 % Available class options 
79 % e.g., \documentclass[10pt,conference]{IEEEtran} 
80
81 %             *** choose only one from each category ***
82 %
83 % 9pt, 10pt, 11pt, 12pt
84 %    Sets normal font size. The default is 10pt.
85
86 % conference, journal, technote, peerreview, peerreviewca
87 %    determines format mode - conference papers, journal papers,
88 %    correspondence papers (technotes), or peer review papers. The user
89 %    should also select 9pt when using technote. peerreview is like
90 %    journal mode, but provides for a single-column "cover" title page for
91 %    anonymous peer review. The paper title (without the author names) is
92 %    repeated at the top of the page after the cover page. For peer review
93 %    papers, the \IEEEpeerreviewmaketitle command must be executed (will
94 %    automatically be ignored for non-peerreview modes) at the place the
95 %    cover page is to end, usually just after the abstract (keywords are
96 %    not normally used with peer review papers). peerreviewca is like
97 %    peerreview, but allows the author names to be entered and formatted
98 %    as with conference mode so that author affiliation and contact
99 %    information can be easily seen on the cover page.
100 %    The default is journal.
101 %
102 % draft, draftcls, draftclsnofoot, final
103 %    determines if paper is formatted as a widely spaced draft (for
104 %    handwritten editor comments) or as a properly typeset final version.
105 %    draftcls restricts draft mode to the class file while all other LaTeX
106 %    packages (i.e., \usepackage{graphicx}) will behave as final - allows
107 %    for a draft paper with visible figures, etc. draftclsnofoot is like
108 %    draftcls, but does not display the date and the word "DRAFT" at the foot
109 %    of the pages. If using one of the draft modes, the user will probably
110 %    also want to select onecolumn.
111 %    The default is final.
112 %
113 % letterpaper, a4paper, cspaper
114 %    determines paper size: 8.5in X 11in, 210mm X 297mm or 7.875in X 10.75in.
115 %    Changing the paper size in the standard journal and conference modes
116 %    will not alter the typesetting of the document - only the margins will
117 %    be affected. In particular, documents using the a4paper option will
118 %    have reduced side margins (A4 is narrower than US letter) and a longer
119 %    bottom margin (A4 is longer than US letter). For both cases, the top
120 %    margins will be the same and the text will be horizontally centered.
121 %    For the compsoc conference and draft modes, it is the margins that will
122 %    remain constant, and thus the text area size will vary, with changes in
123 %    the paper size.
124 %    The cspaper option is the special ``trim'' paper size (7.875in x 10.75in)
125 %    used in the actual publication of Computer Society journals. Under
126 %    compsoc journal mode, this option does not alter the typesetting of the
127 %    document. Authors should invoke the cspaper option only if requested to
128 %    do so by the editors of the specific journal they are submitting to.
129 %    For final submission to the IEEE, authors should generally use US letter 
130 %    (8.5 X 11in) paper unless otherwise instructed. Note that authors should
131 %    ensure that all post-processing (ps, pdf, etc.) uses the same paper
132 %    specificiation as the .tex document. Problems here are by far the number
133 %    one reason for incorrect margins. IEEEtran will automatically set the
134 %    default paper size under pdflatex (without requiring any change to
135 %    pdftex.cfg), so this issue is more important to dvips users. Fix
136 %    config.ps, config.pdf, or ~/.dvipsrc for dvips, or use the
137 %    dvips -t papersize option instead as needed. For the cspaper option,
138 %    the corresponding dvips paper name is "ieeecs".
139 %    See the testflow documentation
140 %    http://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/testflow
141 %    for more details on dvips paper size configuration.
142 %    The default is letterpaper.
143 %
144 % oneside, twoside
145 %    determines if layout follows single sided or two sided (duplex)
146 %    printing. The only notable change is with the headings at the top of
147 %    the pages.
148 %    The default is oneside.
149 %
150 % onecolumn, twocolumn
151 %    determines if text is organized into one or two columns per page. One
152 %    column mode is usually used only with draft papers.
153 %    The default is twocolumn.
154 %
155 % comsoc, compsoc, transmag
156 %    Use the format of the IEEE Communications Society, IEEE Computer Society
157 %    or IEEE Transactions on Magnetics, respectively.
158 %
159 % romanappendices
160 %    Use the "Appendix I" convention when numbering appendices. IEEEtran.cls
161 %    now defaults to Alpha "Appendix A" convention - the opposite of what
162 %    v1.6b and earlier did.
163 %
164 % captionsoff
165 %    disables the display of the figure/table captions. Some IEEE journals
166 %    request that captions be removed and figures/tables be put on pages
167 %    of their own at the end of an initial paper submission. The endfloat
168 %    package can be used with this class option to achieve this format.
169 %
170 % nofonttune
171 %    turns off tuning of the font interword spacing. Maybe useful to those
172 %    not using the standard Times fonts or for those who have already "tuned"
173 %    their fonts.
174 %    The default is to enable IEEEtran to tune font parameters.
175 %
176 %
177 %----------
178 % Available CLASSINPUTs provided (all are macros unless otherwise noted):
179 % \CLASSINPUTbaselinestretch
180 % \CLASSINPUTinnersidemargin
181 % \CLASSINPUToutersidemargin
182 % \CLASSINPUTtoptextmargin
183 % \CLASSINPUTbottomtextmargin
184 %
185 % Available CLASSINFOs provided:
186 % \ifCLASSINFOpdf                       (TeX if conditional)
187 % \CLASSINFOpaperwidth                  (macro)
188 % \CLASSINFOpaperheight                 (macro)
189 % \CLASSINFOnormalsizebaselineskip      (length)
190 % \CLASSINFOnormalsizeunitybaselineskip (length)
191 %
192 % Available CLASSOPTIONs provided:
193 % all class option flags (TeX if conditionals) unless otherwise noted,
194 % e.g., \ifCLASSOPTIONcaptionsoff
195 % point size options provided as a single macro:
196 % \CLASSOPTIONpt
197 % which will be defined as 9, 10, 11, or 12 depending on the document's
198 % normalsize point size.
199 % also, class option peerreviewca implies the use of class option peerreview
200 % and classoption draft implies the use of class option draftcls
201
202
203
204
205
206 \ProvidesClass{IEEEtran}[2015/08/26 V1.8b by Michael Shell]
207 \typeout{-- See the "IEEEtran_HOWTO" manual for usage information.}
208 \typeout{-- http://www.michaelshell.org/tex/ieeetran/}
209 \NeedsTeXFormat{LaTeX2e}
210
211 % IEEEtran.cls version numbers, provided as of V1.3
212 % These values serve as a way a .tex file can
213 % determine if the new features are provided.
214 % The version number of this IEEEtrans.cls can be obtained from 
215 % these values. i.e., V1.4
216 % KEEP THESE AS INTEGERS! i.e., NO {4a} or anything like that-
217 % (no need to enumerate "a" minor changes here)
218 \def\IEEEtransversionmajor{1}
219 \def\IEEEtransversionminor{8}
220
221
222 % hook to allow easy changeover to IEEEtran.cls/tools.sty error reporting
223 \def\@IEEEclspkgerror{\ClassError{IEEEtran}}
224
225
226 % These do nothing, but provide them like in article.cls
227 \newif\if@restonecol
228 \newif\if@titlepage
229
230
231 % class option conditionals
232 \newif\ifCLASSOPTIONonecolumn       \CLASSOPTIONonecolumnfalse
233 \newif\ifCLASSOPTIONtwocolumn       \CLASSOPTIONtwocolumntrue
234
235 \newif\ifCLASSOPTIONoneside         \CLASSOPTIONonesidetrue
236 \newif\ifCLASSOPTIONtwoside         \CLASSOPTIONtwosidefalse
237
238 \newif\ifCLASSOPTIONfinal           \CLASSOPTIONfinaltrue
239 \newif\ifCLASSOPTIONdraft           \CLASSOPTIONdraftfalse
240 \newif\ifCLASSOPTIONdraftcls        \CLASSOPTIONdraftclsfalse
241 \newif\ifCLASSOPTIONdraftclsnofoot  \CLASSOPTIONdraftclsnofootfalse
242
243 \newif\ifCLASSOPTIONpeerreview      \CLASSOPTIONpeerreviewfalse
244 \newif\ifCLASSOPTIONpeerreviewca    \CLASSOPTIONpeerreviewcafalse
245
246 \newif\ifCLASSOPTIONjournal         \CLASSOPTIONjournaltrue
247 \newif\ifCLASSOPTIONconference      \CLASSOPTIONconferencefalse
248 \newif\ifCLASSOPTIONtechnote        \CLASSOPTIONtechnotefalse
249
250 \newif\ifCLASSOPTIONnofonttune      \CLASSOPTIONnofonttunefalse
251
252 \newif\ifCLASSOPTIONcaptionsoff     \CLASSOPTIONcaptionsofffalse
253
254 \newif\ifCLASSOPTIONcomsoc          \CLASSOPTIONcomsocfalse
255 \newif\ifCLASSOPTIONcompsoc         \CLASSOPTIONcompsocfalse
256 \newif\ifCLASSOPTIONtransmag        \CLASSOPTIONtransmagfalse
257
258 \newif\ifCLASSOPTIONromanappendices \CLASSOPTIONromanappendicesfalse
259
260
261 % class info conditionals
262
263 % indicates if pdf (via pdflatex) output
264 \newif\ifCLASSINFOpdf               \CLASSINFOpdffalse
265
266
267 % V1.6b internal flag to show if using a4paper
268 \newif\if@IEEEusingAfourpaper       \@IEEEusingAfourpaperfalse
269 % V1.6b internal flag to show if using cspaper
270 \newif\if@IEEEusingcspaper          \@IEEEusingcspaperfalse
271
272
273 % IEEEtran class scratch pad registers
274 % dimen
275 \newdimen\@IEEEtrantmpdimenA
276 \newdimen\@IEEEtrantmpdimenB
277 \newdimen\@IEEEtrantmpdimenC
278 % count
279 \newcount\@IEEEtrantmpcountA
280 \newcount\@IEEEtrantmpcountB
281 \newcount\@IEEEtrantmpcountC
282 % token list
283 \newtoks\@IEEEtrantmptoksA
284
285 % we use \CLASSOPTIONpt so that we can ID the point size (even for 9pt docs)
286 % as well as LaTeX's \@ptsize to retain some compatability with some
287 % external packages
288 \def\@ptsize{0}
289 % LaTeX does not support 9pt, so we set \@ptsize to 0 - same as that of 10pt
290 \DeclareOption{9pt}{\def\CLASSOPTIONpt{9}\def\@ptsize{0}}
291 \DeclareOption{10pt}{\def\CLASSOPTIONpt{10}\def\@ptsize{0}}
292 \DeclareOption{11pt}{\def\CLASSOPTIONpt{11}\def\@ptsize{1}}
293 \DeclareOption{12pt}{\def\CLASSOPTIONpt{12}\def\@ptsize{2}}
294
295
296
297 \DeclareOption{letterpaper}{\setlength{\paperwidth}{8.5in}%
298                             \setlength{\paperheight}{11in}%
299                             \@IEEEusingAfourpaperfalse
300                             \@IEEEusingcspaperfalse
301                             \def\CLASSOPTIONpaper{letter}%
302                             \def\CLASSINFOpaperwidth{8.5in}%
303                             \def\CLASSINFOpaperheight{11in}}
304
305
306 \DeclareOption{a4paper}{\setlength{\paperwidth}{210mm}%
307                         \setlength{\paperheight}{297mm}%
308                         \@IEEEusingAfourpapertrue
309                         \@IEEEusingcspaperfalse
310                         \def\CLASSOPTIONpaper{a4}%
311                         \def\CLASSINFOpaperwidth{210mm}%
312                         \def\CLASSINFOpaperheight{297mm}}
313
314 % special paper option for compsoc journals
315 \DeclareOption{cspaper}{\setlength{\paperwidth}{7.875in}%
316                         \setlength{\paperheight}{10.75in}%
317                         \@IEEEusingcspapertrue
318                         \@IEEEusingAfourpaperfalse
319                         \def\CLASSOPTIONpaper{ieeecs}%
320                         \def\CLASSINFOpaperwidth{7.875in}%
321                         \def\CLASSINFOpaperheight{10.75in}}
322
323 \DeclareOption{oneside}{\@twosidefalse\@mparswitchfalse
324                         \CLASSOPTIONonesidetrue\CLASSOPTIONtwosidefalse}
325 \DeclareOption{twoside}{\@twosidetrue\@mparswitchtrue
326                         \CLASSOPTIONtwosidetrue\CLASSOPTIONonesidefalse}
327
328 \DeclareOption{onecolumn}{\CLASSOPTIONonecolumntrue\CLASSOPTIONtwocolumnfalse}
329 \DeclareOption{twocolumn}{\CLASSOPTIONtwocolumntrue\CLASSOPTIONonecolumnfalse}
330
331 % If the user selects draft, then this class AND any packages
332 % will go into draft mode.
333 \DeclareOption{draft}{\CLASSOPTIONdrafttrue\CLASSOPTIONdraftclstrue
334                       \CLASSOPTIONdraftclsnofootfalse} 
335 % draftcls is for a draft mode which will not affect any packages
336 % used by the document.
337 \DeclareOption{draftcls}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclstrue
338                          \CLASSOPTIONdraftclsnofootfalse} 
339 % draftclsnofoot is like draftcls, but without the footer.
340 \DeclareOption{draftclsnofoot}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclstrue
341                                \CLASSOPTIONdraftclsnofoottrue} 
342 \DeclareOption{final}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclsfalse
343                       \CLASSOPTIONdraftclsnofootfalse}
344
345 \DeclareOption{journal}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse
346                         \CLASSOPTIONjournaltrue\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse}
347
348 \DeclareOption{conference}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse
349                            \CLASSOPTIONjournalfalse\CLASSOPTIONconferencetrue\CLASSOPTIONtechnotefalse}
350
351 \DeclareOption{technote}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse
352                          \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotetrue}
353
354 \DeclareOption{peerreview}{\CLASSOPTIONpeerreviewtrue\CLASSOPTIONpeerreviewcafalse
355                            \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse}
356
357 \DeclareOption{peerreviewca}{\CLASSOPTIONpeerreviewtrue\CLASSOPTIONpeerreviewcatrue
358                              \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse}
359
360 \DeclareOption{nofonttune}{\CLASSOPTIONnofonttunetrue}
361
362 \DeclareOption{captionsoff}{\CLASSOPTIONcaptionsofftrue}
363
364 \DeclareOption{comsoc}{\CLASSOPTIONcomsoctrue\CLASSOPTIONcompsocfalse\CLASSOPTIONtransmagfalse}
365
366 \DeclareOption{compsoc}{\CLASSOPTIONcomsocfalse\CLASSOPTIONcompsoctrue\CLASSOPTIONtransmagfalse}
367
368 \DeclareOption{transmag}{\CLASSOPTIONtransmagtrue\CLASSOPTIONcomsocfalse\CLASSOPTIONcompsocfalse}
369
370 \DeclareOption{romanappendices}{\CLASSOPTIONromanappendicestrue}
371
372
373 % default to US letter paper, 10pt, twocolumn, one sided, final, journal
374 \ExecuteOptions{letterpaper,10pt,twocolumn,oneside,final,journal}
375 % overrride these defaults per user requests
376 \ProcessOptions
377
378
379
380 %% -- Command Argument Scanning Support Functions --
381
382 % Sets the category codes for punctuation to their normal values.
383 % For local use with argument scanning.
384 \def\IEEEnormalcatcodespunct{\catcode`\!=12 \catcode`\,=12 \catcode`\:=12
385 \catcode`\;=12 \catcode`\`=12 \catcode`\'=12 \catcode`\"=12 \catcode`\.=12
386 \catcode`\/=12 \catcode`\?=12 \catcode`\*=12 \catcode`\+=12 \catcode`\-=12
387 \catcode`\<=12 \catcode`\>=12 \catcode`\(=12 \catcode`\)=12 \catcode`\[=12
388 \catcode`\]=12 \catcode`\==12 \catcode`\|=12}
389 % Sets the category codes for numbers to their normal values.
390 % For local use with argument scanning.
391 \def\IEEEnormalcatcodesnum{\catcode`\0=12 \catcode`\1=12 \catcode`\2=12
392 \catcode`\3=12 \catcode`\4=12 \catcode`\5=12 \catcode`\6=12 \catcode`\7=12
393 \catcode`\8=12 \catcode`\9=12}
394 % combined action of \IEEEnormalcatcodespunct and \IEEEnormalcatcodesnum
395 \def\IEEEnormalcatcodes{\IEEEnormalcatcodespunct\IEEEnormalcatcodesnum}
396
397
398 % usage: \@IEEEextracttoken*{}
399 % \@IEEEextracttoken fully expands its argument (which it then stores in
400 % \@IEEEextracttokenarg) via \edef and then the meaning of the first
401 % nonbrace (but including the empty group) token found is assigned via \let
402 % to \@IEEEextractedtoken as well as stored in the macro
403 % \@IEEEextractedtokenmacro. Tokens that would otherwise be discarded during
404 % the acquisition of the first are stored in \@IEEEextractedtokensdiscarded,
405 % however their original relative brace nesting depths are not guaranteed to
406 % be preserved.
407 % If the argument is empty, or if a first nonbrace token does not exist (or
408 % is an empty group), \@IEEEextractedtoken will be \relax and
409 % \@IEEEextractedtokenmacro and \@IEEEextractedtokensdiscarded will be empty.
410 %
411 % For example:
412 % \@IEEEextracttoken{{{ab}{cd}}{{ef}g}}
413 % results in:
414 %
415 % \@IEEEextracttokenarg          ==> a macro containing {{ab}{cd}}{{ef}g}
416 % \@IEEEextractedtoken           ==> the letter a
417 % \@IEEEextractedtokenmacro      ==> a macro containing a
418 % \@IEEEextractedtokensdiscarded ==> a macro containing bcd{ef}g
419 %
420 % the *-star form, \@IEEEextracttoken*, does not expand its argument
421 % contents during processing.
422 \def\@IEEEextracttoken{\@ifstar{\let\@IEEEextracttokendef=\def\@@IEEEextracttoken}{\let\@IEEEextracttokendef=\edef\@@IEEEextracttoken}}
423
424 \def\@@IEEEextracttoken#1{\@IEEEextracttokendef\@IEEEextracttokenarg{#1}\relax
425 \def\@IEEEextractedtokensdiscarded{}\relax % initialize to empty
426 % if the macro is unchanged after being acquired as a single undelimited argument
427 % with anything after it being stripped off as a delimited argument
428 % we know we have one token without any enclosing braces. loop until this is true.
429 \let\@IEEEextracttokencurgroup\@IEEEextracttokenarg
430 \loop
431   % trap case of an empty argument as this would cause a problem with
432   % \@@@IEEEextracttoken's first (nondelimited) argument acquisition
433   \ifx\@IEEEextracttokencurgroup\@empty
434     \def\@IEEEextractedtokenmacro{}\relax
435   \else
436     \expandafter\@@@IEEEextracttoken\@IEEEextracttokencurgroup\@IEEEgeneralsequenceDELIMITER\relax
437   \fi
438   \ifx\@IEEEextractedtokenmacro\@IEEEextracttokencurgroup
439   \else
440     \let\@IEEEextracttokencurgroup=\@IEEEextractedtokenmacro
441 \repeat
442 % we can safely do a \let= here because there should be at most one token
443 % the relax is needed to handle the case of no token found
444 \expandafter\let\expandafter\@IEEEextractedtoken\@IEEEextractedtokenmacro\relax}
445
446 \def\@@@IEEEextracttoken#1#2\@IEEEgeneralsequenceDELIMITER{\def\@IEEEextractedtokenmacro{#1}\relax
447 \def\@@IEEEextractedtokensdiscarded{#2}\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter
448 \@IEEEextractedtokensdiscarded\expandafter\expandafter\expandafter
449 {\expandafter\@@IEEEextractedtokensdiscarded\@IEEEextractedtokensdiscarded}}
450 %%
451 %% -- End of Command Argument Scanning Support Functions --
452
453
454
455 % Computer Society conditional execution command
456 \long\def\@IEEEcompsoconly#1{\relax\ifCLASSOPTIONcompsoc\relax#1\relax\fi\relax}
457 % inverse
458 \long\def\@IEEEnotcompsoconly#1{\relax\ifCLASSOPTIONcompsoc\else\relax#1\relax\fi\relax}
459 % compsoc conference
460 \long\def\@IEEEcompsocconfonly#1{\relax\ifCLASSOPTIONcompsoc\ifCLASSOPTIONconference\relax#1\relax\fi\fi\relax}
461 % compsoc not conference
462 \long\def\@IEEEcompsocnotconfonly#1{\relax\ifCLASSOPTIONcompsoc\ifCLASSOPTIONconference\else\relax#1\relax\fi\fi\relax}
463
464
465 % comsoc verify that newtxmath, mtpro2, mt11p or mathtime has been loaded
466 \def\@IEEEcomsocverifymathfont{\typeout{-- Verifying Times compatible math font.}\relax
467   \@ifpackageloaded{newtxmath}{\typeout{-- newtxmath loaded, OK.}}{\@@IEEEcomsocverifymathfont}}
468 \def\@@IEEEcomsocverifymathfont{\@ifpackageloaded{mtpro2}{\typeout{-- mtpro2 loaded, OK.}}{\@@@IEEEcomsocverifymathfont}}
469 \def\@@@IEEEcomsocverifymathfont{\@ifpackageloaded{mt11p}{\typeout{-- mt11p2 loaded, OK.}}{\@@@@IEEEcomsocverifymathfont}}
470 \def\@@@@IEEEcomsocverifymathfont{\@ifpackageloaded{mathtime}{\typeout{-- mathtime loaded, OK.}}{\@IEEEcomsocenforcemathfont}}
471
472 % comsoc, if a Times math font was not loaded by user, enforce it
473 \def\@IEEEcomsocenforcemathfont{\typeout{** Times compatible math font not found, forcing.}\relax
474 \IfFileExists{newtxmath.sty}{\typeout{-- Found newtxmath, loading.}\RequirePackage{newtxmath}}{\@@IEEEcomsocenforcemathfont}}
475 \def\@@IEEEcomsocenforcemathfont{\IfFileExists{mtpro2.sty}{\typeout{-- Found mtpro2, loading.}\RequirePackage{mtpro2}}{\@@@IEEEcomsocenforcemathfont}}
476 \def\@@@IEEEcomsocenforcemathfont{\IfFileExists{mt11p.sty}{\typeout{-- Found mt11p, loading.}\RequirePackage{mt11p}}{\@@@@IEEEcomsocenforcemathfont}}
477 \def\@@@@IEEEcomsocenforcemathfont{\IfFileExists{mathtime.sty}{\typeout{-- Found mathtime, loading.}\RequirePackage{mathtime}}{\@@@@@IEEEcomsocenforcemathfont}}
478 % if no acceptable Times math font package found, error with newtxmath requirement
479 \def\@@@@@IEEEcomsocenforcemathfont{\typeout{** No Times compatible math font package found. newtxmath is required.}\RequirePackage{newtxmath}}
480
481
482 \ifCLASSOPTIONcomsoc
483   % ensure that if newtxmath is used, the cmintegrals option is also invoked
484   \PassOptionsToPackage{cmintegrals}{newtxmath}
485   % comsoc requires a Times like math font
486   % ensure this requirement is satisfied at document start
487   \AtBeginDocument{\@IEEEcomsocverifymathfont}
488 \fi
489
490
491
492 % The IEEE uses Times Roman font, so we'll default to Times.
493 % These three commands make up the entire times.sty package.
494 \renewcommand{\sfdefault}{phv}
495 \renewcommand{\rmdefault}{ptm}
496 \renewcommand{\ttdefault}{pcr}
497
498 % V1.7 compsoc nonconference papers, use Palatino/Palladio as the main text font,
499 % not Times Roman.
500 \@IEEEcompsocnotconfonly{\renewcommand{\rmdefault}{ppl}}
501
502 % enable the selected main text font
503 \normalfont\selectfont
504
505
506 \ifCLASSOPTIONcomsoc
507   \typeout{-- Using IEEE Communications Society mode.}
508 \fi
509
510 \ifCLASSOPTIONcompsoc
511   \typeout{-- Using IEEE Computer Society mode.}
512 \fi
513
514
515 % V1.7 conference notice message hook
516 \def\@IEEEconsolenoticeconference{\typeout{}%
517 \typeout{** Conference Paper **}%
518 \typeout{Before submitting the final camera ready copy, remember to:}%
519 \typeout{}%
520 \typeout{ 1. Manually equalize the lengths of two columns on the last page}%
521 \typeout{ of your paper;}%
522 \typeout{}%
523 \typeout{ 2. Ensure that any PostScript and/or PDF output post-processing}%
524 \typeout{ uses only Type 1 fonts and that every step in the generation}%
525 \typeout{ process uses the appropriate paper size.}%
526 \typeout{}}
527
528
529 % we can send console reminder messages to the user here
530 \AtEndDocument{\ifCLASSOPTIONconference\@IEEEconsolenoticeconference\fi}
531
532
533 % warn about the use of single column other than for draft mode
534 \ifCLASSOPTIONtwocolumn\else%
535   \ifCLASSOPTIONdraftcls\else%
536    \typeout{** ATTENTION: Single column mode is not typically used with IEEE publications.}%
537   \fi%
538 \fi
539
540
541 % V1.7 improved paper size setting code.
542 % Set pdfpage and dvips paper sizes. Conditional tests are similar to that
543 % of ifpdf.sty. Retain within {} to ensure tested macros are never altered,
544 % even if only effect is to set them to \relax.
545 % if \pdfoutput is undefined or equal to relax, output a dvips special
546 {\@ifundefined{pdfoutput}{\AtBeginDvi{\special{papersize=\CLASSINFOpaperwidth,\CLASSINFOpaperheight}}}{%
547 % pdfoutput is defined and not equal to \relax
548 % check for pdfpageheight existence just in case someone sets pdfoutput
549 % under non-pdflatex. If exists, set them regardless of value of \pdfoutput.
550 \@ifundefined{pdfpageheight}{\relax}{\global\pdfpagewidth\paperwidth
551 \global\pdfpageheight\paperheight}%
552 % if using \pdfoutput=0 under pdflatex, send dvips papersize special
553 \ifcase\pdfoutput
554 \AtBeginDvi{\special{papersize=\CLASSINFOpaperwidth,\CLASSINFOpaperheight}}%
555 \else
556 % we are using pdf output, set CLASSINFOpdf flag
557 \global\CLASSINFOpdftrue
558 \fi}}
559
560 % let the user know the selected papersize
561 \typeout{-- Using \CLASSINFOpaperwidth\space x \CLASSINFOpaperheight\space
562 (\CLASSOPTIONpaper)\space paper.}
563
564 \ifCLASSINFOpdf
565 \typeout{-- Using PDF output.}
566 \else
567 \typeout{-- Using DVI output.}
568 \fi
569
570
571 % The idea hinted here is for LaTeX to generate markleft{} and markright{}
572 % automatically for you after you enter \author{}, \journal{},
573 % \journaldate{}, journalvol{}, \journalnum{}, etc.
574 % However, there may be some backward compatibility issues here as
575 % well as some special applications for IEEEtran.cls and special issues
576 % that may require the flexible \markleft{}, \markright{} and/or \markboth{}.
577 % We'll leave this as an open future suggestion.
578 %\newcommand{\journal}[1]{\def\@journal{#1}}
579 %\def\@journal{}
580
581
582
583 % pointsize values
584 % used with ifx to determine the document's normal size
585 \def\@IEEEptsizenine{9}
586 \def\@IEEEptsizeten{10}
587 \def\@IEEEptsizeeleven{11}
588 \def\@IEEEptsizetwelve{12}
589
590
591
592 % FONT DEFINITIONS (No sizexx.clo file needed) 
593 % V1.6 revised font sizes, displayskip values and
594 %      revised normalsize baselineskip to reduce underfull vbox problems
595 %      on the 58pc = 696pt = 9.5in text height we want
596 %      normalsize     #lines/column  baselineskip (aka leading)
597 %             9pt     63             11.0476pt (truncated down)
598 %            10pt     58             12pt      (exact)
599 %            11pt     52             13.3846pt (truncated down)
600 %            12pt     50             13.92pt   (exact)
601 %
602
603 % we need to store the nominal baselineskip for the given font size
604 % in case baselinestretch ever changes.
605 % this is a dimen, so it will not hold stretch or shrink
606 \newdimen\@IEEEnormalsizeunitybaselineskip
607 \@IEEEnormalsizeunitybaselineskip\baselineskip
608
609
610
611 %% ******* WARNING! *******
612 %%
613 %% Authors should not alter font sizes, baselineskip ("leading"),
614 %% margins or other spacing values in an attempt to squeeze more
615 %% material on each page.
616 %%
617 %% The IEEE's own typesetting software will restore the correct
618 %% values when re-typesetting/proofing the submitted document,
619 %% possibly resulting in unexpected article over length charges.
620 %%
621 %% ******* WARNING! *******
622
623
624 % 9pt option defaults
625 \ifx\CLASSOPTIONpt\@IEEEptsizenine
626 \typeout{-- This is a 9 point document.}
627 \def\normalsize{\@setfontsize{\normalsize}{9}{11.0476pt}}
628 \setlength{\@IEEEnormalsizeunitybaselineskip}{11.0476pt}
629 \normalsize
630 \abovedisplayskip 1.5ex plus 3pt minus 1pt
631 \belowdisplayskip \abovedisplayskip
632 \abovedisplayshortskip 0pt plus 3pt
633 \belowdisplayshortskip 1.5ex plus 3pt minus 1pt
634 \def\small{\@setfontsize{\small}{8.5}{10pt}}
635 \def\footnotesize{\@setfontsize{\footnotesize}{8}{9pt}}
636 \def\scriptsize{\@setfontsize{\scriptsize}{7}{8pt}}
637 \def\tiny{\@setfontsize{\tiny}{5}{6pt}}
638 % sublargesize is the same as large - 10pt
639 \def\sublargesize{\@setfontsize{\sublargesize}{10}{12pt}}
640 \def\large{\@setfontsize{\large}{10}{12pt}}
641 \def\Large{\@setfontsize{\Large}{12}{14pt}}
642 \def\LARGE{\@setfontsize{\LARGE}{14}{17pt}}
643 \def\huge{\@setfontsize{\huge}{17}{20pt}}
644 \def\Huge{\@setfontsize{\Huge}{20}{24pt}}
645 \fi
646 %
647 % 10pt option defaults
648 \ifx\CLASSOPTIONpt\@IEEEptsizeten
649 \typeout{-- This is a 10 point document.}
650 \def\normalsize{\@setfontsize{\normalsize}{10}{12.00pt}}
651 \setlength{\@IEEEnormalsizeunitybaselineskip}{12pt}
652 \normalsize
653 \abovedisplayskip 1.5ex plus 4pt minus 2pt
654 \belowdisplayskip \abovedisplayskip
655 \abovedisplayshortskip 0pt plus 4pt
656 \belowdisplayshortskip 1.5ex plus 4pt minus 2pt
657 \def\small{\@setfontsize{\small}{9}{10pt}}
658 \def\footnotesize{\@setfontsize{\footnotesize}{8}{9pt}}
659 \def\scriptsize{\@setfontsize{\scriptsize}{7}{8pt}}
660 \def\tiny{\@setfontsize{\tiny}{5}{6pt}}
661 % sublargesize is a tad smaller than large - 11pt
662 \def\sublargesize{\@setfontsize{\sublargesize}{11}{13.4pt}}
663 \def\large{\@setfontsize{\large}{12}{14pt}}
664 \def\Large{\@setfontsize{\Large}{14}{17pt}}
665 \def\LARGE{\@setfontsize{\LARGE}{17}{20pt}}
666 \def\huge{\@setfontsize{\huge}{20}{24pt}}
667 \def\Huge{\@setfontsize{\Huge}{24}{28pt}}
668 \fi
669 %
670 % 11pt option defaults
671 \ifx\CLASSOPTIONpt\@IEEEptsizeeleven
672 \typeout{-- This is an 11 point document.}
673 \def\normalsize{\@setfontsize{\normalsize}{11}{13.3846pt}}
674 \setlength{\@IEEEnormalsizeunitybaselineskip}{13.3846pt}
675 \normalsize
676 \abovedisplayskip 1.5ex plus 5pt minus 3pt
677 \belowdisplayskip \abovedisplayskip
678 \abovedisplayshortskip 0pt plus 5pt
679 \belowdisplayshortskip 1.5ex plus 5pt minus 3pt
680 \def\small{\@setfontsize{\small}{10}{12pt}}
681 \def\footnotesize{\@setfontsize{\footnotesize}{9}{10.5pt}}
682 \def\scriptsize{\@setfontsize{\scriptsize}{8}{9pt}}
683 \def\tiny{\@setfontsize{\tiny}{6}{7pt}}
684 % sublargesize is the same as large - 12pt
685 \def\sublargesize{\@setfontsize{\sublargesize}{12}{14pt}}
686 \def\large{\@setfontsize{\large}{12}{14pt}}
687 \def\Large{\@setfontsize{\Large}{14}{17pt}}
688 \def\LARGE{\@setfontsize{\LARGE}{17}{20pt}}
689 \def\huge{\@setfontsize{\huge}{20}{24pt}}
690 \def\Huge{\@setfontsize{\Huge}{24}{28pt}}
691 \fi
692 %
693 % 12pt option defaults
694 \ifx\CLASSOPTIONpt\@IEEEptsizetwelve
695 \typeout{-- This is a 12 point document.}
696 \def\normalsize{\@setfontsize{\normalsize}{12}{13.92pt}}
697 \setlength{\@IEEEnormalsizeunitybaselineskip}{13.92pt}
698 \normalsize
699 \abovedisplayskip 1.5ex plus 6pt minus 4pt
700 \belowdisplayskip \abovedisplayskip
701 \abovedisplayshortskip 0pt plus 6pt
702 \belowdisplayshortskip 1.5ex plus 6pt minus 4pt
703 \def\small{\@setfontsize{\small}{10}{12pt}}
704 \def\footnotesize{\@setfontsize{\footnotesize}{9}{10.5pt}}
705 \def\scriptsize{\@setfontsize{\scriptsize}{8}{9pt}}
706 \def\tiny{\@setfontsize{\tiny}{6}{7pt}}
707 % sublargesize is the same as large - 14pt
708 \def\sublargesize{\@setfontsize{\sublargesize}{14}{17pt}}
709 \def\large{\@setfontsize{\large}{14}{17pt}}
710 \def\Large{\@setfontsize{\Large}{17}{20pt}}
711 \def\LARGE{\@setfontsize{\LARGE}{20}{24pt}}
712 \def\huge{\@setfontsize{\huge}{22}{26pt}}
713 \def\Huge{\@setfontsize{\Huge}{24}{28pt}}
714 \fi
715
716
717
718 % V1.8a compsoc font sizes
719 % compsoc font sizes use bp "Postscript" point units (1/72in) 
720 % rather than the traditional pt (1/72.27)
721 \ifCLASSOPTIONcompsoc
722 % -- compsoc defaults --
723 % ** will override some of these values later **
724 % 9pt
725 \ifx\CLASSOPTIONpt\@IEEEptsizenine
726 \def\normalsize{\@setfontsize{\normalsize}{9bp}{11bp}}
727 \setlength{\@IEEEnormalsizeunitybaselineskip}{11bp}
728 \normalsize
729 \abovedisplayskip 1.5ex plus 3bp minus 1bp
730 \belowdisplayskip \abovedisplayskip
731 \abovedisplayshortskip 0bp plus 3bp
732 \belowdisplayshortskip 1.5ex plus 3bp minus 1bp
733 \def\small{\@setfontsize{\small}{8.5bp}{10bp}}
734 \def\footnotesize{\@setfontsize{\footnotesize}{8bp}{9bp}}
735 \def\scriptsize{\@setfontsize{\scriptsize}{7bp}{8bp}}
736 \def\tiny{\@setfontsize{\tiny}{5bp}{6bp}}
737 % sublargesize is the same as large - 10bp
738 \def\sublargesize{\@setfontsize{\sublargesize}{10bp}{12bp}}
739 \def\large{\@setfontsize{\large}{10bp}{12bp}}
740 \def\Large{\@setfontsize{\Large}{12bp}{14bp}}
741 \def\LARGE{\@setfontsize{\LARGE}{14bp}{17bp}}
742 \def\huge{\@setfontsize{\huge}{17bp}{20bp}}
743 \def\Huge{\@setfontsize{\Huge}{20bp}{24bp}}
744 \fi
745 %
746 % 10pt
747 \ifx\CLASSOPTIONpt\@IEEEptsizeten
748 \def\normalsize{\@setfontsize{\normalsize}{10bp}{12bp}}
749 \setlength{\@IEEEnormalsizeunitybaselineskip}{12bp}
750 \normalsize
751 \abovedisplayskip 1.5ex plus 4bp minus 2bp
752 \belowdisplayskip \abovedisplayskip
753 \abovedisplayshortskip 0pt plus 4bp
754 \belowdisplayshortskip 1.5ex plus 4bp minus 2bp
755 \def\small{\@setfontsize{\small}{9bp}{10bp}}
756 \def\footnotesize{\@setfontsize{\footnotesize}{8bp}{9bp}}
757 \def\scriptsize{\@setfontsize{\scriptsize}{7bp}{8bp}}
758 \def\tiny{\@setfontsize{\tiny}{5bp}{6bp}}
759 % sublargesize is a tad smaller than large - 11bp
760 \def\sublargesize{\@setfontsize{\sublargesize}{11bp}{13.5bp}}
761 \def\large{\@setfontsize{\large}{12bp}{14bp}}
762 \def\Large{\@setfontsize{\Large}{14bp}{17bp}}
763 \def\LARGE{\@setfontsize{\LARGE}{17bp}{20bp}}
764 \def\huge{\@setfontsize{\huge}{20bp}{24bp}}
765 \def\Huge{\@setfontsize{\Huge}{24bp}{28bp}}
766 \fi
767 %
768 % 11pt
769 \ifx\CLASSOPTIONpt\@IEEEptsizeeleven
770 \def\normalsize{\@setfontsize{\normalsize}{11bp}{13.5bp}}
771 \setlength{\@IEEEnormalsizeunitybaselineskip}{13.5bp}
772 \normalsize
773 \abovedisplayskip 1.5ex plus 5bp minus 3bp
774 \belowdisplayskip \abovedisplayskip
775 \abovedisplayshortskip 0pt plus 5bp
776 \belowdisplayshortskip 1.5ex plus 5bp minus 3bp
777 \def\small{\@setfontsize{\small}{10bp}{12bp}}
778 \def\footnotesize{\@setfontsize{\footnotesize}{9bp}{10.5bp}}
779 \def\scriptsize{\@setfontsize{\scriptsize}{8bp}{9bp}}
780 \def\tiny{\@setfontsize{\tiny}{6bp}{7bp}}
781 % sublargesize is the same as large - 12bp
782 \def\sublargesize{\@setfontsize{\sublargesize}{12bp}{14bp}}
783 \def\large{\@setfontsize{\large}{12bp}{14bp}}
784 \def\Large{\@setfontsize{\Large}{14bp}{17bp}}
785 \def\LARGE{\@setfontsize{\LARGE}{17bp}{20bp}}
786 \def\huge{\@setfontsize{\huge}{20bp}{24bp}}
787 \def\Huge{\@setfontsize{\Huge}{24bp}{28bp}}
788 \fi
789 %
790 % 12pt
791 \ifx\CLASSOPTIONpt\@IEEEptsizetwelve
792 \def\normalsize{\@setfontsize{\normalsize}{12bp}{14bp}}%
793 \setlength{\@IEEEnormalsizeunitybaselineskip}{14bp}%
794 \normalsize
795 \abovedisplayskip 1.5ex plus 6bp minus 4bp
796 \belowdisplayskip \abovedisplayskip
797 \abovedisplayshortskip 0pt plus 6bp
798 \belowdisplayshortskip 1.5ex plus 6bp minus 4bp
799 \def\small{\@setfontsize{\small}{10bp}{12bp}}
800 \def\footnotesize{\@setfontsize{\footnotesize}{9bp}{10.5bp}}
801 \def\scriptsize{\@setfontsize{\scriptsize}{8bp}{9bp}}
802 \def\tiny{\@setfontsize{\tiny}{6bp}{7bp}}
803 % sublargesize is the same as large - 14bp
804 \def\sublargesize{\@setfontsize{\sublargesize}{14bp}{17bp}}
805 \def\large{\@setfontsize{\large}{14bp}{17bp}}
806 \def\Large{\@setfontsize{\Large}{17bp}{20bp}}
807 \def\LARGE{\@setfontsize{\LARGE}{20bp}{24bp}}
808 \def\huge{\@setfontsize{\huge}{22bp}{26bp}}
809 \def\Huge{\@setfontsize{\Huge}{24bp}{28bp}}
810 \fi
811 %
812 % -- override defaults: compsoc journals use special normalsizes --
813 \ifCLASSOPTIONconference
814
815 % compsoc conferences
816 % 9pt
817 \ifx\CLASSOPTIONpt\@IEEEptsizenine
818 \def\normalsize{\@setfontsize{\normalsize}{9bp}{10.8bp}}
819 \setlength{\@IEEEnormalsizeunitybaselineskip}{10.8bp}
820 \normalsize
821 \abovedisplayskip 1.5ex plus 3bp minus 1bp
822 \belowdisplayskip \abovedisplayskip
823 \abovedisplayshortskip 0bp plus 3bp
824 \belowdisplayshortskip 1.5ex plus 3bp minus 1bp
825 \fi
826 % 10pt
827 \ifx\CLASSOPTIONpt\@IEEEptsizeten
828 \def\normalsize{\@setfontsize{\normalsize}{10bp}{11.2bp}}
829 \setlength{\@IEEEnormalsizeunitybaselineskip}{11.2bp}
830 \normalsize
831 \abovedisplayskip 1.5ex plus 4bp minus 2bp
832 \belowdisplayskip \abovedisplayskip
833 \abovedisplayshortskip 0pt plus 4bp
834 \belowdisplayshortskip 1.5ex plus 4bp minus 2bp
835 \fi
836 % 11pt
837 \ifx\CLASSOPTIONpt\@IEEEptsizeeleven
838 \def\normalsize{\@setfontsize{\normalsize}{11bp}{13.2bp}}
839 \setlength{\@IEEEnormalsizeunitybaselineskip}{13.2bp}
840 \normalsize
841 \abovedisplayskip 1.5ex plus 5bp minus 3bp
842 \belowdisplayskip \abovedisplayskip
843 \abovedisplayshortskip 0pt plus 5bp
844 \belowdisplayshortskip 1.5ex plus 5bp minus 3bp
845 \fi
846 % 12pt
847 \ifx\CLASSOPTIONpt\@IEEEptsizetwelve
848 \def\normalsize{\@setfontsize{\normalsize}{12bp}{14.4bp}}
849 \setlength{\@IEEEnormalsizeunitybaselineskip}{14.4bp}
850 \normalsize
851 \abovedisplayskip 1.5ex plus 6bp minus 4bp
852 \belowdisplayskip \abovedisplayskip
853 \abovedisplayshortskip 0pt plus 6bp
854 \belowdisplayshortskip 1.5ex plus 6bp minus 4bp
855 \fi
856
857 % compsoc nonconferences
858 \else
859 % 9pt
860 \ifx\CLASSOPTIONpt\@IEEEptsizenine
861 \def\normalsize{\@setfontsize{\normalsize}{9bp}{10.8bp}}
862 \setlength{\@IEEEnormalsizeunitybaselineskip}{10.8bp}
863 \normalsize
864 \abovedisplayskip 1.5ex plus 3bp minus 1bp
865 \belowdisplayskip \abovedisplayskip
866 \abovedisplayshortskip 0bp plus 3bp
867 \belowdisplayshortskip 1.5ex plus 3bp minus 1bp
868 \fi
869 % 10pt
870 \ifx\CLASSOPTIONpt\@IEEEptsizeten
871 % the official spec is 9.5bp with 11.4bp leading for 10pt,
872 % but measurements of proofs suggest upto 11.723bp leading
873 % here we'll use 11.54bp which gives 61 lines per column
874 % with the standard compsoc margins
875 \def\normalsize{\@setfontsize{\normalsize}{9.5bp}{11.54bp}}
876 \setlength{\@IEEEnormalsizeunitybaselineskip}{11.54bp}
877 \normalsize
878 \abovedisplayskip 1.5ex plus 4bp minus 2bp
879 \belowdisplayskip \abovedisplayskip
880 \abovedisplayshortskip 0pt plus 4bp
881 \belowdisplayshortskip 1.5ex plus 4bp minus 2bp
882 \fi
883 % 11pt
884 \ifx\CLASSOPTIONpt\@IEEEptsizeeleven
885 \def\normalsize{\@setfontsize{\normalsize}{11bp}{13.2bp}}
886 \setlength{\@IEEEnormalsizeunitybaselineskip}{13.2bp}
887 \normalsize
888 \abovedisplayskip 1.5ex plus 5bp minus 3bp
889 \belowdisplayskip \abovedisplayskip
890 \abovedisplayshortskip 0pt plus 5bp
891 \belowdisplayshortskip 1.5ex plus 5bp minus 3bp
892 \fi
893 % 12pt
894 \ifx\CLASSOPTIONpt\@IEEEptsizetwelve
895 \def\normalsize{\@setfontsize{\normalsize}{12bp}{14.4bp}}
896 \setlength{\@IEEEnormalsizeunitybaselineskip}{14.4bp}
897 \normalsize
898 \abovedisplayskip 1.5ex plus 6bp minus 4bp
899 \belowdisplayskip \abovedisplayskip
900 \abovedisplayshortskip 0pt plus 6bp
901 \belowdisplayshortskip 1.5ex plus 6bp minus 4bp
902 \fi
903 \fi\fi
904
905
906
907
908 % V1.6 The Computer Modern Fonts will issue a substitution warning for
909 % 24pt titles (24.88pt is used instead, but the default and correct
910 % Times font will scale exactly as needed) increase the substitution
911 % tolerance to turn off this warning.
912
913 % V1.8a, the compsoc bp font sizes can also cause bogus font substitution
914 % warnings with footnote or scriptsize math and the $\bullet$ itemized
915 % list of \IEEEcompsocitemizethanks. So, increase this to 1.5pt or more.
916 \def\fontsubfuzz{1.7bp}
917
918
919 % warn the user in case they forget to use the 9pt option with
920 % technote
921 \ifCLASSOPTIONtechnote%
922  \ifx\CLASSOPTIONpt\@IEEEptsizenine\else%
923   \typeout{** ATTENTION: Technotes are normally 9pt documents.}%
924  \fi%
925 \fi
926
927
928 % V1.7
929 % Improved \textunderscore to provide a much better fake _ when used with
930 % OT1 encoding. Under OT1, detect use of pcr or cmtt \ttfamily and use
931 % available true _ glyph for those two typewriter fonts.
932 \def\@IEEEstringptm{ptm} % Times Roman family
933 \def\@IEEEstringppl{ppl} % Palatino Roman family
934 \def\@IEEEstringphv{phv} % Helvetica Sans Serif family
935 \def\@IEEEstringpcr{pcr} % Courier typewriter family
936 \def\@IEEEstringcmtt{cmtt} % Computer Modern typewriter family
937 \DeclareTextCommandDefault{\textunderscore}{\leavevmode
938 \ifx\f@family\@IEEEstringpcr\string_\else
939 \ifx\f@family\@IEEEstringcmtt\string_\else
940 \ifx\f@family\@IEEEstringptm\kern 0em\vbox{\hrule\@width 0.5em\@height 0.5pt\kern -0.3ex}\else
941 \ifx\f@family\@IEEEstringppl\kern 0em\vbox{\hrule\@width 0.5em\@height 0.5pt\kern -0.3ex}\else
942 \ifx\f@family\@IEEEstringphv\kern -0.03em\vbox{\hrule\@width 0.62em\@height 0.52pt\kern -0.33ex}\kern -0.03em\else
943 \kern 0.09em\vbox{\hrule\@width 0.6em\@height 0.44pt\kern -0.63pt\kern -0.42ex}\kern 0.09em\fi\fi\fi\fi\fi\relax}
944
945
946
947
948 % set the default \baselinestretch
949 \def\baselinestretch{1}
950 \ifCLASSOPTIONdraftcls
951   \def\baselinestretch{1.5}% default baselinestretch for draft modes
952 \fi 
953
954
955 % process CLASSINPUT baselinestretch
956 \ifx\CLASSINPUTbaselinestretch\@IEEEundefined
957 \else
958   \edef\baselinestretch{\CLASSINPUTbaselinestretch} % user CLASSINPUT override
959   \typeout{** ATTENTION: Overriding \string\baselinestretch\space to
960            \baselinestretch\space via \string\CLASSINPUT.}
961 \fi
962
963 \small\normalsize % make \baselinestretch take affect
964
965
966
967
968 % store the normalsize baselineskip
969 \newdimen\CLASSINFOnormalsizebaselineskip
970 \CLASSINFOnormalsizebaselineskip=\baselineskip\relax
971 % and the normalsize unity (baselinestretch=1) baselineskip
972 % we could save a register by giving the user access to
973 % \@IEEEnormalsizeunitybaselineskip. However, let's protect
974 % its read only internal status
975 \newdimen\CLASSINFOnormalsizeunitybaselineskip
976 \CLASSINFOnormalsizeunitybaselineskip=\@IEEEnormalsizeunitybaselineskip\relax
977 % store the nominal value of jot
978 \newdimen\IEEEnormaljot
979 \IEEEnormaljot=0.25\baselineskip\relax
980
981 % set \jot
982 \jot=\IEEEnormaljot\relax
983
984
985
986
987 % V1.6, we are now going to fine tune the interword spacing
988 % The default interword glue for Times under TeX appears to use a
989 % nominal interword spacing of 25% (relative to the font size, i.e., 1em)
990 % a maximum of 40% and a minimum of 19%.
991 % For example, 10pt text uses an interword glue of:
992
993 % 2.5pt plus 1.49998pt minus 0.59998pt
994
995 % However, the IEEE allows for a more generous range which reduces the need
996 % for hyphenation, especially for two column text. Furthermore, the IEEE
997 % tends to use a little bit more nominal space between the words.
998 % The IEEE's interword spacing percentages appear to be:
999 % 35% nominal
1000 % 23% minimum
1001 % 50% maximum
1002 % (They may even be using a tad more for the largest fonts such as 24pt.)
1003
1004 % for bold text, the IEEE increases the spacing a little more:
1005 % 37.5% nominal
1006 % 23% minimum
1007 % 55% maximum
1008
1009 % here are the interword spacing ratios we'll use
1010 % for medium (normal weight)
1011 \def\@IEEEinterspaceratioM{0.35}
1012 \def\@IEEEinterspaceMINratioM{0.23}
1013 \def\@IEEEinterspaceMAXratioM{0.50}
1014
1015 % for bold
1016 \def\@IEEEinterspaceratioB{0.375}
1017 \def\@IEEEinterspaceMINratioB{0.23}
1018 \def\@IEEEinterspaceMAXratioB{0.55}
1019
1020
1021 % compsoc nonconference papers use Palatino,
1022 % tweak settings to better match the proofs
1023 \ifCLASSOPTIONcompsoc
1024 \ifCLASSOPTIONconference\else
1025 % for medium (normal weight)
1026 \def\@IEEEinterspaceratioM{0.28}
1027 \def\@IEEEinterspaceMINratioM{0.21}
1028 \def\@IEEEinterspaceMAXratioM{0.47}
1029 % for bold
1030 \def\@IEEEinterspaceratioB{0.305}
1031 \def\@IEEEinterspaceMINratioB{0.21}
1032 \def\@IEEEinterspaceMAXratioB{0.52}
1033 \fi\fi
1034
1035
1036 % command to revise the interword spacing for the current font under TeX:
1037 % \fontdimen2 = nominal interword space
1038 % \fontdimen3 = interword stretch
1039 % \fontdimen4 = interword shrink
1040 % since all changes to the \fontdimen are global, we can enclose these commands
1041 % in braces to confine any font attribute or length changes
1042 \def\@@@IEEEsetfontdimens#1#2#3{{%
1043 \setlength{\@IEEEtrantmpdimenB}{\f@size pt}% grab the font size in pt, could use 1em instead.
1044 \setlength{\@IEEEtrantmpdimenA}{#1\@IEEEtrantmpdimenB}%
1045 \fontdimen2\font=\@IEEEtrantmpdimenA\relax
1046 \addtolength{\@IEEEtrantmpdimenA}{-#2\@IEEEtrantmpdimenB}%
1047 \fontdimen3\font=-\@IEEEtrantmpdimenA\relax
1048 \setlength{\@IEEEtrantmpdimenA}{#1\@IEEEtrantmpdimenB}%
1049 \addtolength{\@IEEEtrantmpdimenA}{-#3\@IEEEtrantmpdimenB}%
1050 \fontdimen4\font=\@IEEEtrantmpdimenA\relax}}
1051
1052 % revise the interword spacing for each font weight
1053 \def\@@IEEEsetfontdimens{{%
1054 \mdseries
1055 \@@@IEEEsetfontdimens{\@IEEEinterspaceratioM}{\@IEEEinterspaceMAXratioM}{\@IEEEinterspaceMINratioM}%
1056 \bfseries
1057 \@@@IEEEsetfontdimens{\@IEEEinterspaceratioB}{\@IEEEinterspaceMAXratioB}{\@IEEEinterspaceMINratioB}%
1058 }}
1059
1060 % revise the interword spacing for each font shape
1061 % \slshape is not often used for IEEE work and is not altered here. The \scshape caps are
1062 % already a tad too large in the free LaTeX fonts (as compared to what the IEEE uses) so we
1063 % won't alter these either.
1064 \def\@IEEEsetfontdimens{{%
1065 \normalfont
1066 \@@IEEEsetfontdimens
1067 \normalfont\itshape
1068 \@@IEEEsetfontdimens
1069 }}
1070
1071 % command to revise the interword spacing for each font size (and shape
1072 % and weight). Only the \rmfamily is done here as \ttfamily uses a 
1073 % fixed spacing and \sffamily is not used as the main text of IEEE papers.
1074 \def\@IEEEtunefonts{{\selectfont\rmfamily
1075 \tiny\@IEEEsetfontdimens
1076 \scriptsize\@IEEEsetfontdimens
1077 \footnotesize\@IEEEsetfontdimens
1078 \small\@IEEEsetfontdimens
1079 \normalsize\@IEEEsetfontdimens
1080 \sublargesize\@IEEEsetfontdimens
1081 \large\@IEEEsetfontdimens
1082 \LARGE\@IEEEsetfontdimens
1083 \huge\@IEEEsetfontdimens
1084 \Huge\@IEEEsetfontdimens}}
1085
1086 % if the nofonttune class option is not given, revise the interword spacing
1087 % now - in case IEEEtran makes any default length measurements, and make
1088 % sure all the default fonts are loaded
1089 \ifCLASSOPTIONnofonttune\else
1090 \@IEEEtunefonts
1091 \fi
1092
1093 % and again at the start of the document in case the user loaded different fonts
1094 \AtBeginDocument{\ifCLASSOPTIONnofonttune\else\@IEEEtunefonts\fi}
1095
1096
1097
1098
1099
1100 % -- V1.8a page setup commands --
1101
1102 % The default sample text for calculating margins
1103 % Note that IEEE publications use \scriptsize for headers and footers.
1104 \def\IEEEdefaultsampletext{\normalfont\normalsize gT}
1105 \def\IEEEdefaultheadersampletext{\normalfont\scriptsize T}% IEEE headers default to uppercase
1106 \def\IEEEdefaultfootersampletext{\normalfont\scriptsize gT}
1107
1108
1109
1110 % usage: \IEEEsettextwidth{inner margin}{outer margin}
1111 % Sets \textwidth to allow the specified inner and outer margins
1112 % for the current \paperwidth.
1113 \def\IEEEsettextwidth#1#2{\@IEEEtrantmpdimenA\paperwidth
1114 \@IEEEtrantmpdimenB#1\relax
1115 \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB
1116 \@IEEEtrantmpdimenB#2\relax
1117 \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB
1118 \textwidth\@IEEEtrantmpdimenA}
1119
1120
1121
1122 % usage: \IEEEsetsidemargin{mode: i, o, c, a}{margin/offset}
1123 % Sets \oddsidemargin and \evensidemargin to yield the specified margin
1124 % of the given mode.
1125 % The available modes are:
1126 % i = inner margin
1127 % o = outer margin
1128 % c = centered, with the given offset
1129 % a = adjust the margins using the given offset
1130 % For the offsets, positive values increase the inner margin.
1131 % \textwidth should be set properly for the given margins before calling this
1132 % function.
1133 \def\IEEEsetsidemargin#1#2{\@IEEEtrantmpdimenA #2\relax
1134 \@IEEEextracttoken{#1}\relax
1135 % check for mode errors
1136 \ifx\@IEEEextractedtokenmacro\@empty
1137   \@IEEEclspkgerror{Empty mode type in \string\IEEEsetsidemargin\space (line \the\inputlineno).\MessageBreak
1138   Defaulting to `i'}{Valid modes for \string\IEEEsetsidemargin\space are: i, o, c and a.}\relax
1139   \let\@IEEEextractedtoken=i\relax
1140   \def\@IEEEextractedtokenmacro{i}\relax
1141 \else
1142   \ifx\@IEEEextractedtokensdiscarded\@empty\else
1143     \typeout{** WARNING: \string\IEEEsetsidemargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax
1144   \fi
1145 \fi
1146 % handle each mode
1147 \if\@IEEEextractedtoken a\relax
1148   \advance\oddsidemargin by \@IEEEtrantmpdimenA\relax
1149 \else
1150 \if\@IEEEextractedtoken c\relax
1151   \oddsidemargin\paperwidth
1152   \advance\oddsidemargin by -\textwidth
1153   \divide\oddsidemargin by 2\relax
1154   \advance\oddsidemargin by -1in\relax
1155   \advance\oddsidemargin by \@IEEEtrantmpdimenA\relax
1156 \else
1157 \if\@IEEEextractedtoken o\relax
1158   \oddsidemargin\paperwidth
1159   \advance\oddsidemargin by -\textwidth
1160   \advance\oddsidemargin by -\@IEEEtrantmpdimenA
1161   \advance\oddsidemargin by -1in\relax
1162 \else
1163   \if\@IEEEextractedtoken i\relax
1164   \else
1165     \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetsidemargin\space (line \the\inputlineno).\MessageBreak
1166     Defaulting to `i'}%
1167     {Valid modes for \string\IEEEsetsidemargin\space are: i, o, c  and a.}%
1168   \fi
1169   \oddsidemargin\@IEEEtrantmpdimenA
1170   \advance\oddsidemargin by -1in\relax
1171 \fi\fi\fi
1172 % odd and even side margins both mean "inner" for single sided pages
1173 \evensidemargin\oddsidemargin
1174 % but are mirrors of each other when twosided is in effect
1175 \if@twoside
1176   \evensidemargin\paperwidth
1177   \advance\evensidemargin by -\textwidth
1178   \advance\evensidemargin by -\oddsidemargin
1179   % have to compensate for both the builtin 1in LaTex offset
1180   % and the fact we already subtracted this offset from \oddsidemargin
1181   \advance\evensidemargin -2in\relax
1182 \fi}
1183
1184
1185
1186 % usage: \IEEEsettextheight[sample text]{top text margin}{bottom text margin}
1187 % Sets \textheight based on the specified top margin and bottom margin.
1188 % Takes into consideration \paperheight, \topskip, and (by default) the
1189 % the actual height and depth of the \IEEEdefaultsampletext text. 
1190 \def\IEEEsettextheight{\@ifnextchar [{\@IEEEsettextheight}{\@IEEEsettextheight[\IEEEdefaultsampletext]}}
1191 \def\@IEEEsettextheight[#1]#2#3{\textheight\paperheight\relax
1192   \@IEEEtrantmpdimenA #2\relax
1193   \advance \textheight by -\@IEEEtrantmpdimenA% subtract top margin
1194   \@IEEEtrantmpdimenA #3\relax
1195   \advance \textheight by -\@IEEEtrantmpdimenA% subtract bottom margin
1196   \advance \textheight by \topskip% add \topskip
1197   % subtract off everything above the top, and below the bottom, baselines
1198   \settoheight{\@IEEEtrantmpdimenA}{\begingroup #1\relax\relax\relax\endgroup}\relax
1199   \advance \textheight by -\@IEEEtrantmpdimenA
1200   \settodepth{\@IEEEtrantmpdimenA}{\begingroup #1\relax\relax\relax\endgroup}\relax
1201   \advance \textheight by -\@IEEEtrantmpdimenA}
1202
1203
1204
1205 \newdimen\IEEEquantizedlength
1206 \IEEEquantizedlength 0sp\relax
1207 \newdimen\IEEEquantizedlengthdiff
1208 \IEEEquantizedlengthdiff 0sp\relax
1209 \def\IEEEquantizedlengthint{0}
1210
1211 % usage: \IEEEquantizelength{mode: d, c, i}{base unit}{length}
1212 % Sets the length \IEEEquantizedlength to be an integer multiple of the given
1213 % (nonzero) base unit such that \IEEEquantizedlength approximates the given
1214 % length.
1215 % \IEEEquantizedlengthdiff is a length equal to the difference between the
1216 % \IEEEquantizedlength and the given length.
1217 % \IEEEquantizedlengthint is a macro containing the integer number of base units
1218 % in \IEEEquantizedlength.
1219 % i.e., \IEEEquantizedlength =  \IEEEquantizedlengthint * base unit
1220 % The mode determines how \IEEEquantizedlength is quantized:
1221 % d = always decrease (always round down \IEEEquantizeint)
1222 % c = use the closest match
1223 % i = always increase (always round up \IEEEquantizeint)
1224 % In anycase, if the given length is already quantized,
1225 % \IEEEquantizedlengthdiff will be set to zero.
1226 \def\IEEEquantizelength#1#2#3{\begingroup
1227 % work in isolation so as not to externally disturb the \@IEEEtrantmp
1228 % variables
1229 % load the argument values indirectly via \IEEEquantizedlengthdiff
1230 % in case the user refers to our \@IEEEtrantmpdimenX, \IEEEquantizedlength,
1231 % etc. in the arguments. we also will work with these as counters,
1232 % i.e., in sp units
1233 % A has the base unit
1234 \IEEEquantizedlengthdiff #2\relax\relax\relax\relax
1235 \@IEEEtrantmpcountA\IEEEquantizedlengthdiff
1236 % B has the input length
1237 \IEEEquantizedlengthdiff #3\relax\relax\relax\relax
1238 \@IEEEtrantmpcountB\IEEEquantizedlengthdiff
1239 \@IEEEtrantmpdimenA\the\@IEEEtrantmpcountA sp\relax
1240 \@IEEEtrantmpdimenB\the\@IEEEtrantmpcountB sp\relax
1241 % \@IEEEtrantmpcountC will have the quantized int
1242 % \IEEEquantizedlength will have the quantized length
1243 % \@IEEEtrantmpdimenC will have the quantized diff
1244 % initialize them to zero as this is what will be
1245 % exported if an error occurs
1246 \@IEEEtrantmpcountC 0\relax
1247 \IEEEquantizedlength 0sp\relax
1248 \@IEEEtrantmpdimenC 0sp\relax
1249 % extract mode
1250 \@IEEEextracttoken{#1}\relax
1251 % check for mode errors
1252 \ifx\@IEEEextractedtokenmacro\@empty
1253   \@IEEEclspkgerror{Empty mode type in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak
1254   Defaulting to `d'}{Valid modes for \string\IEEEquantizelength\space are: d, c and i.}\relax
1255   \let\@IEEEextractedtoken=d\relax
1256   \def\@IEEEextractedtokenmacro{d}\relax
1257 \else
1258   \ifx\@IEEEextractedtokensdiscarded\@empty\else
1259     \typeout{** WARNING: \string\IEEEquantizelength\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax
1260   \fi
1261 \fi
1262 % check for base unit is zero error
1263 \ifnum\@IEEEtrantmpcountA=0\relax
1264 \@IEEEclspkgerror{Base unit is zero in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak
1265   \string\IEEEquantizedlength\space and \string\IEEEquantizedlengthdiff\space are set to zero}{Division by zero is not allowed.}\relax
1266 \else% base unit is nonzero
1267   % \@IEEEtrantmpcountC carries the number of integer units
1268   % in the quantized length (integer length \ base)
1269   \@IEEEtrantmpcountC\@IEEEtrantmpcountB\relax
1270   \divide\@IEEEtrantmpcountC by \@IEEEtrantmpcountA\relax
1271   % \IEEEquantizedlength has the (rounded down) quantized length
1272   % = base * int
1273   \IEEEquantizedlength\@IEEEtrantmpdimenA\relax
1274   \multiply\IEEEquantizedlength by \@IEEEtrantmpcountC\relax
1275   % \@IEEEtrantmpdimenC has the difference
1276   % = quantized length - length
1277   \@IEEEtrantmpdimenC\IEEEquantizedlength\relax
1278   \advance\@IEEEtrantmpdimenC by -\@IEEEtrantmpdimenB\relax
1279   % trap special case of length being already quantized
1280   % to avoid a roundup under i option
1281   \ifdim\@IEEEtrantmpdimenC=0sp\relax
1282   \else % length not is already quantized
1283     % set dimenA to carry the upper quantized (absolute value) difference:
1284     % quantizedlength + base - length
1285     \advance\@IEEEtrantmpdimenA by \IEEEquantizedlength\relax
1286     \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB\relax
1287     % set dimenB to carry the lower quantized (absolute value) difference:
1288     % length - quantizedlength
1289     \advance\@IEEEtrantmpdimenB by -\IEEEquantizedlength\relax
1290     % handle each mode
1291     \if\@IEEEextractedtoken c\relax
1292       % compare upper and lower amounts, select upper if lower > upper
1293       \ifdim\@IEEEtrantmpdimenB>\@IEEEtrantmpdimenA\relax
1294         % use upper
1295         \advance\IEEEquantizedlength by \the\@IEEEtrantmpcountA sp\relax
1296         \advance\@IEEEtrantmpcountC by 1\relax
1297         \@IEEEtrantmpdimenC\@IEEEtrantmpdimenA
1298       \else% <=. uselower
1299         % no need to do anything for lower, use output values already setup
1300       \fi
1301     \else% not mode c
1302     \if\@IEEEextractedtoken i\relax
1303       % always round up under i mode
1304       \advance\IEEEquantizedlength by \the\@IEEEtrantmpcountA sp\relax
1305       \advance\@IEEEtrantmpcountC by 1\relax
1306       \@IEEEtrantmpdimenC\@IEEEtrantmpdimenA
1307     \else
1308       \if\@IEEEextractedtoken d\relax
1309       \else
1310         \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak
1311         Defaulting to `d'}%
1312         {Valid modes for \string\IEEEquantizelength\space are: d, c, and i.}\relax
1313       \fi % if d
1314       % no need to do anything for d, use output values already setup
1315     \fi\fi % if i, c
1316   \fi % if length is already quantized
1317 \fi% if base unit is zero
1318 % globally assign the results to macros we use here to escape the enclosing
1319 % group without needing to call \global on any of the \@IEEEtrantmp variables.
1320 % \@IEEEtrantmpcountC has the quantized int
1321 % \IEEEquantizedlength has the quantized length
1322 % \@IEEEtrantmpdimenC has the quantized diff
1323 \xdef\@IEEEquantizedlengthintmacro{\the\@IEEEtrantmpcountC}\relax
1324 \@IEEEtrantmpcountC\IEEEquantizedlength\relax
1325 \xdef\@IEEEquantizedlengthmacro{\the\@IEEEtrantmpcountC}\relax
1326 \@IEEEtrantmpcountC\@IEEEtrantmpdimenC\relax
1327 \xdef\@IEEEquantizedlengthdiffmacro{\the\@IEEEtrantmpcountC}\relax
1328 \endgroup
1329 % locally assign the outputs here from the macros
1330 \expandafter\IEEEquantizedlength\@IEEEquantizedlengthmacro sp\relax
1331 \expandafter\IEEEquantizedlengthdiff\@IEEEquantizedlengthdiffmacro sp\relax
1332 \edef\IEEEquantizedlengthint{\@IEEEquantizedlengthintmacro}\relax}
1333
1334
1335
1336 \newdimen\IEEEquantizedtextheightdiff
1337 \IEEEquantizedtextheightdiff 0sp\relax
1338
1339 % usage: \IEEEquantizetextheight[base unit]{mode: d, c, i}
1340 % Sets \textheight to be an integer multiple of the current \baselineskip
1341 % (or the optionally specified base unit) plus the first (\topskip) line.
1342 % \IEEEquantizedtextheightdiff is a length equal to the difference between
1343 % the new quantized and original \textheight.
1344 % \IEEEquantizedtextheightlpc is a macro containing the integer number of
1345 % lines per column under the quantized \textheight. i.e.,
1346 % \textheight = \IEEEquantizedtextheightlpc * \baselineskip + \topskip
1347 % The mode determines how \textheight is quantized:
1348 % d = always decrease (always round down the number of lines per column)
1349 % c = use the closest match
1350 % i = always increase (always round up the number of lines per column)
1351 % In anycase, if \textheight is already quantized, it will remain unchanged,
1352 % and \IEEEquantizedtextheightdiff will be set to zero.
1353 % Depends on: \IEEEquantizelength
1354 \def\IEEEquantizetextheight{\@ifnextchar [{\@IEEEquantizetextheight}{\@IEEEquantizetextheight[\baselineskip]}}
1355 \def\@IEEEquantizetextheight[#1]#2{\begingroup
1356 % use our \IEEEquantizedtextheightdiff as a scratch pad
1357 % we need to subtract off \topskip before quantization
1358 \IEEEquantizedtextheightdiff\textheight
1359 \advance\IEEEquantizedtextheightdiff by -\topskip\relax
1360 \IEEEquantizelength{#2}{#1}{\IEEEquantizedtextheightdiff}
1361 % add back \topskip line
1362 \advance\IEEEquantizedlength by \topskip
1363 \@IEEEtrantmpcountC\IEEEquantizedlengthint\relax
1364 \advance\@IEEEtrantmpcountC by 1\relax
1365 % globally assign the results to macros we use here to escape the enclosing
1366 % group without needing to call \global on any of the \@IEEEtrantmp variables.
1367 \xdef\@IEEEquantizedtextheightlpcmacro{\the\@IEEEtrantmpcountC}\relax
1368 \@IEEEtrantmpcountC\IEEEquantizedlength\relax
1369 \xdef\@IEEEquantizedtextheightmacro{\the\@IEEEtrantmpcountC}\relax
1370 \@IEEEtrantmpcountC\IEEEquantizedlengthdiff\relax
1371 \xdef\@IEEEquantizedtextheightdiffmacro{\the\@IEEEtrantmpcountC}\relax
1372 \endgroup
1373 % locally assign the outputs here from the macros
1374 \textheight\@IEEEquantizedtextheightmacro sp\relax
1375 \IEEEquantizedtextheightdiff\@IEEEquantizedtextheightdiffmacro sp\relax
1376 \edef\IEEEquantizedtextheightlpc{\@IEEEquantizedtextheightlpcmacro}}
1377
1378
1379
1380 % usage: \IEEEsettopmargin[sample text]{mode: t, b, c, a, q}{margin/offset}
1381 % Sets \topmargin based on the specified vertical margin.
1382 % Takes into consideration the base 1in offset, \headheight, \headsep,
1383 % \topskip, and (by default) the the actual height (or, for the bottom, depth)
1384 % of the \IEEEdefaultsampletext text.
1385 % The available modes are:
1386 % t = top margin
1387 % b = bottom margin
1388 % c = vertically centered, with the given offset
1389 % a = adjust the vertical margins using the given offset
1390 % q = adjust the margins using \IEEEquantizedtextheightdiff and the given offset
1391 % For the offsets, positive values increase the top margin.
1392 % \headheight, \headsep, \topskip and \textheight should be set properly for the
1393 % given margins before calling this function.
1394 \def\IEEEsettopmargin{\@ifnextchar [{\@IEEEsettopmargin}{\@IEEEsettopmargin[\IEEEdefaultsampletext]}}
1395 \def\@IEEEsettopmargin[#1]#2#3{\@IEEEtrantmpdimenA #3\relax
1396 \@IEEEextracttoken{#2}\relax
1397 % check for mode errors
1398 \ifx\@IEEEextractedtokenmacro\@empty
1399   \@IEEEclspkgerror{Empty mode type in \string\IEEEsettopmargin\space (line \the\inputlineno).\MessageBreak
1400   Defaulting to `t'}{Valid modes for \string\IEEEsettopmargin\space are: t, b, c, a and q.}\relax
1401   \let\@IEEEextractedtoken=t\relax
1402   \def\@IEEEextractedtokenmacro{t}\relax
1403 \else
1404   \ifx\@IEEEextractedtokensdiscarded\@empty\else
1405     \typeout{** WARNING: \string\IEEEsettopmargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax
1406   \fi
1407 \fi
1408 % handle each mode
1409 \if\@IEEEextractedtoken a\relax
1410   \advance\topmargin by \@IEEEtrantmpdimenA\relax
1411 \else
1412 \if\@IEEEextractedtoken q\relax
1413   % we need to adjust by half the \IEEEquantizedtextheightdiff value
1414   \@IEEEtrantmpdimenB\IEEEquantizedtextheightdiff\relax
1415   \divide\@IEEEtrantmpdimenB by 2\relax
1416   % a positive \IEEEquantizedtextheightdiff means we need to reduce \topmargin
1417   % because \textheight has been lenghtened
1418   \advance\topmargin by -\@IEEEtrantmpdimenB\relax
1419   \advance\topmargin by \@IEEEtrantmpdimenA\relax
1420 \else
1421 \if\@IEEEextractedtoken c\relax
1422   \topmargin\paperheight
1423   \advance\topmargin by -\textheight
1424   % \textheight includes \topskip, but we should not count topskip whitespace here, backout
1425   \advance \topmargin by \topskip
1426   \settoheight{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax
1427   \advance\topmargin by -\@IEEEtrantmpdimenB\relax
1428   \settodepth{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax
1429   \advance\topmargin by -\@IEEEtrantmpdimenB\relax
1430   \divide\topmargin by 2\relax
1431   \advance\topmargin by \@IEEEtrantmpdimenA\relax
1432 \else
1433 \if\@IEEEextractedtoken b\relax
1434   \topmargin\paperheight
1435   \advance\topmargin by -\textheight
1436   % \textheight includes \topskip, but we should not count topskip whitespace here, backout
1437   \advance \topmargin by \topskip
1438   \settodepth{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax
1439   \advance\topmargin by -\@IEEEtrantmpdimenB\relax
1440   \advance\topmargin by -\@IEEEtrantmpdimenA\relax
1441 \else
1442   \if\@IEEEextractedtoken t\relax
1443   \else
1444     \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsettopmargin\space (line \the\inputlineno).\MessageBreak
1445     Defaulting to `t'}%
1446     {Valid modes for \string\IEEEsettopmargin\space are: t, b, c, a and q.}\relax
1447   \fi
1448   \topmargin\@IEEEtrantmpdimenA\relax
1449   \settoheight{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax
1450   \advance\topmargin by \@IEEEtrantmpdimenB\relax
1451 \fi\fi % if t, b, c
1452 % convert desired top margin into actual \topmargin
1453 % this is not done for the q or a modes because they are only adjustments
1454 \advance \topmargin by -\topskip
1455 \advance \topmargin by -1in
1456 \advance \topmargin by -\headheight
1457 \advance \topmargin by -\headsep
1458 \fi\fi % if q, a
1459 }
1460
1461
1462
1463 % usage: \IEEEsetheadermargin[header sample][text sample]{mode: t, b, c, a}{margin/offset}
1464 % Differentially adjusts \topmargin and \headsep (such that their sum is unchanged)
1465 % based on the specified header margin.
1466 % Takes into consideration the base 1in offset, \headheight, \topskip, and (by default)
1467 % the actual height (or depth) of the \IEEEdefaultheadersampletext and
1468 % \IEEEdefaultsampletext text.
1469 % The available modes are:
1470 % t = top margin (top of the header text to the top of the page)
1471 % b = bottom margin (bottom of the header text to the top of the main text)
1472 % c = vertically centered between the main text and the top of the page,
1473 %     with the given offset
1474 % a = adjust the vertical position using the given offset
1475 % For the offsets, positive values move the header downward.
1476 % \headheight, \headsep, \topskip and \topmargin should be set properly before
1477 % calling this function.
1478 \def\IEEEsetheadermargin{\@ifnextchar [{\@IEEEsetheadermargin}{\@IEEEsetheadermargin[\IEEEdefaultheadersampletext]}}
1479 \def\@IEEEsetheadermargin[#1]{\@ifnextchar [{\@@IEEEsetheadermargin[#1]}{\@@IEEEsetheadermargin[#1][\IEEEdefaultsampletext]}}
1480 \def\@@IEEEsetheadermargin[#1][#2]#3#4{\@IEEEtrantmpdimenA #4\relax
1481 \@IEEEextracttoken{#3}\relax
1482 % check for mode errors
1483 \ifx\@IEEEextractedtokenmacro\@empty
1484   \@IEEEclspkgerror{Empty mode type in \string\IEEEsetheadermargin\space (line \the\inputlineno).\MessageBreak
1485   Defaulting to `t'}{Valid modes for \string\IEEEsetheadermargin\space are: t, b, c, and a.}\relax
1486   \let\@IEEEextractedtoken=t\relax
1487   \def\@IEEEextractedtokenmacro{t}\relax
1488 \else
1489   \ifx\@IEEEextractedtokensdiscarded\@empty\else
1490     \typeout{** WARNING: \string\IEEEsetheadermargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax
1491   \fi
1492 \fi
1493 % handle each mode
1494 \if\@IEEEextractedtoken a\relax
1495   % No need to do anything here and can pass through the adjustment
1496   % value as is. The end adjustment of \topmargin and \headsep will
1497   % do all that is needed
1498 \else
1499 \if\@IEEEextractedtoken c\relax
1500   % get the bottom margin
1501   \@IEEEtrantmpdimenB\headsep\relax
1502   \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax
1503   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC
1504   \advance\@IEEEtrantmpdimenB by \topskip
1505   \settoheight{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax
1506   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC
1507   % at this point \@IEEEtrantmpdimenB has the actual header bottom margin
1508   % subtract from it the top header margin
1509   \advance\@IEEEtrantmpdimenB -1in\relax % take into consideration the system 1in offset of the top margin
1510   \advance\@IEEEtrantmpdimenB by -\topmargin
1511   \advance\@IEEEtrantmpdimenB by -\headheight
1512   \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax
1513   \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC
1514   % at this point \@IEEEtrantmpdimenB has the difference between the bottom and top margins
1515   % we need to adjust by half this amount to center the header
1516   \divide\@IEEEtrantmpdimenB by 2\relax
1517   % and add to offset
1518   \advance\@IEEEtrantmpdimenA by \@IEEEtrantmpdimenB
1519 \else
1520 \if\@IEEEextractedtoken b\relax
1521   \@IEEEtrantmpdimenB\headsep\relax
1522   \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax
1523   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC
1524   \advance\@IEEEtrantmpdimenB by \topskip
1525   \settoheight{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax
1526   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC
1527   % at this point \@IEEEtrantmpdimenB has the actual header bottom margin
1528   % get the difference between the actual and the desired
1529   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenA
1530   \@IEEEtrantmpdimenA\@IEEEtrantmpdimenB
1531 \else
1532   \if\@IEEEextractedtoken t\relax
1533   \else
1534     \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetheadermargin\space (line \the\inputlineno).\MessageBreak
1535     Defaulting to `t'}%
1536     {Valid modes for \string\IEEEsetheadermargin\space are: t, b, c and a.}\relax
1537   \fi
1538   \@IEEEtrantmpdimenB 1in\relax % take into consideration the system 1in offset of the top margin
1539   \advance\@IEEEtrantmpdimenB by \topmargin
1540   \advance\@IEEEtrantmpdimenB by \headheight
1541   \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax
1542   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC
1543   % at this point \@IEEEtrantmpdimenB has the actual header top margin
1544   % get the difference between the desired and the actual
1545   \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB
1546 \fi\fi % if t, b, c
1547 \fi % if a
1548 % advance \topmargin by the needed amount and reduce \headsep by the same
1549 % so as not to disturb the location of the main text
1550 \advance\topmargin by \@IEEEtrantmpdimenA\relax
1551 \advance\headsep by -\@IEEEtrantmpdimenA\relax
1552 }
1553
1554
1555
1556 % usage: \IEEEsetfootermargin[footer sample][text sample]{mode: t, b, c, a}{margin/offset}
1557 % Adjusts \footskip based on the specified footer margin.
1558 % Takes into consideration the base 1in offset, \paperheight, \headheight,
1559 % \headsep, \textheight and (by default) the actual height (or depth) of the
1560 % \IEEEdefaultfootersampletext and \IEEEdefaultsampletext text.
1561 % The available modes are:
1562 % t = top margin (top of the footer text to the bottom of the main text)
1563 % b = bottom margin (bottom of the footer text to the bottom of page)
1564 % c = vertically centered between the main text and the bottom of the page,
1565 %     with the given offset
1566 % a = adjust the vertical position using the given offset
1567 % For the offsets, positive values move the footer downward.
1568 % \headheight, \headsep, \topskip, \topmargin, and \textheight should be set
1569 % properly before calling this function.
1570 \def\IEEEsetfootermargin{\@ifnextchar [{\@IEEEsetfootermargin}{\@IEEEsetfootermargin[\IEEEdefaultfootersampletext]}}
1571 \def\@IEEEsetfootermargin[#1]{\@ifnextchar [{\@@IEEEsetfootermargin[#1]}{\@@IEEEsetfootermargin[#1][\IEEEdefaultsampletext]}}
1572 \def\@@IEEEsetfootermargin[#1][#2]#3#4{\@IEEEtrantmpdimenA #4\relax
1573 \@IEEEextracttoken{#3}\relax
1574 % check for mode errors
1575 \ifx\@IEEEextractedtokenmacro\@empty
1576   \@IEEEclspkgerror{Empty mode type in \string\IEEEsetfootermargin\space (line \the\inputlineno).\MessageBreak
1577   Defaulting to `t'}{Valid modes for \string\IEEEsetfootermargin\space are: t, b, c, and a.}\relax
1578   \let\@IEEEextractedtoken=t\relax
1579   \def\@IEEEextractedtokenmacro{t}\relax
1580 \else
1581   \ifx\@IEEEextractedtokensdiscarded\@empty\else
1582     \typeout{** WARNING: \string\IEEEsetfootermargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax
1583   \fi
1584 \fi
1585 % handle each mode
1586 \if\@IEEEextractedtoken a\relax
1587   % No need to do anything here and can pass through the adjustment
1588   % value as is. The end adjustment of \footskip will do all that
1589   % is needed
1590 \else
1591 \if\@IEEEextractedtoken c\relax
1592   % calculate the bottom margin
1593   \@IEEEtrantmpdimenB 1in\relax % system 1in offset
1594   \advance\@IEEEtrantmpdimenB\topmargin\relax
1595   \advance\@IEEEtrantmpdimenB\headheight\relax
1596   \advance\@IEEEtrantmpdimenB\headsep\relax
1597   \advance\@IEEEtrantmpdimenB\textheight\relax
1598   \advance\@IEEEtrantmpdimenB\footskip\relax
1599   \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax
1600   \advance\@IEEEtrantmpdimenC by \@IEEEtrantmpdimenB
1601   \@IEEEtrantmpdimenB\paperheight
1602   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC
1603   % at this point \@IEEEtrantmpdimenB has the actual footer bottom margin
1604   % now subtract off the footer top margin
1605   \advance\@IEEEtrantmpdimenB -\footskip\relax
1606   \settodepth{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax
1607   \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC
1608   \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax
1609   \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC
1610   % at this point \@IEEEtrantmpdimenB has the difference between the bottom
1611   % and top footer margins
1612   % our adjustment must be half this value to center the footer
1613   \divide\@IEEEtrantmpdimenB by 2\relax
1614   % add to the offset
1615   \advance\@IEEEtrantmpdimenA by \@IEEEtrantmpdimenB
1616 \else
1617 \if\@IEEEextractedtoken b\relax
1618   % calculate the bottom margin
1619   \@IEEEtrantmpdimenB 1in\relax % system 1in offset
1620   \advance\@IEEEtrantmpdimenB\topmargin\relax
1621   \advance\@IEEEtrantmpdimenB\headheight\relax
1622   \advance\@IEEEtrantmpdimenB\headsep\relax
1623   \advance\@IEEEtrantmpdimenB\textheight\relax
1624   \advance\@IEEEtrantmpdimenB\footskip\relax
1625   \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax
1626   \advance\@IEEEtrantmpdimenC by \@IEEEtrantmpdimenB
1627   \@IEEEtrantmpdimenB\paperheight
1628   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC
1629   % at this point \@IEEEtrantmpdimenB has the actual footer bottom margin
1630   % get the difference between the actual and the desired
1631   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenA
1632   \@IEEEtrantmpdimenA\@IEEEtrantmpdimenB
1633 \else
1634   \if\@IEEEextractedtoken t\relax
1635   \else
1636     \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetfootermargin\space (line \the\inputlineno).\MessageBreak
1637     Defaulting to `t'}%
1638     {Valid modes for \string\IEEEsetfootermargin\space are: t, b, c and a.}\relax
1639   \fi
1640   \@IEEEtrantmpdimenB\footskip\relax
1641   \settodepth{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax
1642   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC
1643   \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax
1644   \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC
1645   % at this point \@IEEEtrantmpdimenB has the actual footer top margin
1646   % get the difference between the desired and the actual
1647   \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB
1648 \fi\fi % if t, b, c
1649 \fi % if a
1650 % advance \footskip by the needed amount
1651 \advance\footskip by \@IEEEtrantmpdimenA\relax
1652 }
1653
1654 % -- End V1.8a page setup commands --
1655
1656
1657
1658
1659
1660 % V1.6
1661 % LaTeX is a little to quick to use hyphenations
1662 % So, we increase the penalty for their use and raise
1663 % the badness level that triggers an underfull hbox
1664 % warning. The author may still have to tweak things,
1665 % but the appearance will be much better "right out
1666 % of the box" than that under V1.5 and prior.
1667 % TeX default is 50
1668 \hyphenpenalty=750
1669 \ifCLASSOPTIONcompsoc
1670 \hyphenpenalty 500
1671 \fi
1672 % If we didn't adjust the interword spacing, 2200 might be better.
1673 % The TeX default is 1000
1674 \hbadness=1350
1675 % The IEEE does not use extra spacing after punctuation
1676 \frenchspacing
1677
1678 % V1.7 increase this a tad to discourage equation breaks
1679 \binoppenalty=1000 % default 700
1680 \relpenalty=800     % default 500
1681
1682 % v1.8a increase these to discourage widows and orphans
1683 \clubpenalty=1000          % default 150
1684 \widowpenalty=1000         % default 150
1685 \displaywidowpenalty=1000 % default  50
1686
1687
1688 % margin note stuff
1689 \marginparsep      10pt
1690 \marginparwidth    20pt
1691 \marginparpush     25pt
1692
1693
1694 % if things get too close, go ahead and let them touch
1695 \lineskip            0pt
1696 \normallineskip      0pt
1697 \lineskiplimit       0pt
1698 \normallineskiplimit 0pt
1699
1700 % The distance from the lower edge of the text body to the
1701 % footline
1702 \footskip 0.4in
1703
1704 % normally zero, should be relative to font height.
1705 % put in a little rubber to help stop some bad breaks (underfull vboxes)
1706 \parskip 0ex plus 0.2ex minus 0.1ex
1707
1708 \parindent    1.0em
1709 \ifCLASSOPTIONcompsoc
1710   \parindent    1.5em
1711 \fi
1712
1713 \headheight   12pt
1714 \headsep      18pt
1715 % use the normal font baselineskip
1716 % so that \topskip is unaffected by changes in \baselinestretch
1717 \topskip=\@IEEEnormalsizeunitybaselineskip
1718
1719
1720 % V1.8 \maxdepth defaults to 4pt, but should be font size dependent
1721 \maxdepth=0.5\@IEEEnormalsizeunitybaselineskip
1722 \textheight       58pc  % 9.63in, 696pt
1723
1724 % set the default top margin to 58pt
1725 % which results in a \topmargin of -49.59pt for 10pt documents
1726 \IEEEsettopmargin{t}{58pt}
1727 % tweak textheight to a perfect integer number of lines/column.
1728 % standard is: 9pt/63 lpc; 10pt/58 lpc; 11pt/52 lpc; 12pt/50 lpc
1729 \IEEEquantizetextheight{c}
1730 % tweak top margin so that the error is shared equally at the top and bottom
1731 \IEEEsettopmargin{q}{0sp}
1732
1733
1734 \columnsep         1pc
1735 \textwidth        43pc   % 2 x 21pc + 1pc = 43pc
1736
1737 % set the default side margins to center the text
1738 \IEEEsetsidemargin{c}{0pt}
1739
1740
1741 % adjust margins for default conference mode
1742 \ifCLASSOPTIONconference
1743  \textheight        9.25in % The standard for conferences (668.4975pt)
1744  \IEEEsettopmargin{t}{0.75in}
1745  % tweak textheight to a perfect integer number of lines/page.
1746  % standard is: 9pt/61 lpc; 10pt/56 lpc; 11pt/50 lpc; 12pt/48 lpc
1747  \IEEEquantizetextheight{c}
1748  % tweak top margin so that the error is shared equally at the top and bottom
1749  \IEEEsettopmargin{q}{0sp}
1750 \fi
1751
1752
1753 % compsoc text sizes, margins and spacings
1754 \ifCLASSOPTIONcompsoc
1755  \columnsep         12bp
1756  % CS specs for \textwdith are 6.875in
1757  % \textwidth         6.875in
1758  % however, measurements from proofs show they are using 3.5in columns
1759  \textwidth         7in
1760  \advance\textwidth by \columnsep
1761  % set the side margins to center the text
1762  \IEEEsetsidemargin{c}{0pt}
1763  % top/bottom margins to center
1764  % could just set \textheight to 9.75in for all the different paper sizes
1765  % and then quantize, but we'll do it the long way here to allow for easy
1766  % future per-paper size adjustments
1767  \IEEEsettextheight{0.625in}{0.625in}% 11in - 2 * 0.625in = 9.75in is the standard text height for compsoc journals
1768  \IEEEsettopmargin{t}{0.625in}
1769  \if@IEEEusingcspaper
1770    \IEEEsettextheight{0.5in}{0.5in}% 10.75in - 2 * 0.5in = 9.75in
1771    \IEEEsettopmargin{t}{0.5in}
1772  \fi
1773  \if@IEEEusingAfourpaper
1774    \IEEEsettextheight{24.675mm}{24.675mm}% 297mm - 2 * 24.675mm = 247.650mm (9.75in)
1775    \IEEEsettopmargin{t}{24.675mm}
1776  \fi
1777  % tweak textheight to a perfect integer number of lines/page.
1778  % standard is: 9pt/65 lpc; 10pt/61 lpc; 11pt/53 lpc; 12pt/49 lpc
1779  \IEEEquantizetextheight{c}
1780  % tweak top margin so that the error is shared equally at the top and bottom
1781  \IEEEsettopmargin{q}{0sp}
1782
1783 % compsoc conference
1784  \ifCLASSOPTIONconference
1785   % compsoc conference use a larger value for columnsep
1786   \columnsep 0.25in
1787   \IEEEsettextwidth{0.75in}{0.75in}
1788   % set the side margins to center the text (0.75in for letterpaper)
1789   \IEEEsetsidemargin{c}{0pt}
1790   % compsoc conferences want 1in top and bottom margin
1791   \IEEEsettextheight{1in}{1in}
1792   \IEEEsettopmargin{t}{1in}
1793   % tweak textheight to a perfect integer number of lines/page.
1794   % standard is: 9pt/58 lpc; 10pt/53 lpc; 11pt/48 lpc; 12pt/46 lpc
1795   \IEEEquantizetextheight{c}
1796   % tweak top margin so that the error is shared equally at the top and bottom
1797   \IEEEsettopmargin{q}{0sp}
1798  \fi
1799 \fi
1800
1801
1802
1803 % draft mode settings override that of all other modes
1804 % provides a nice 1in margin all around the paper and extra
1805 % space between the lines for editor's comments
1806 \ifCLASSOPTIONdraftcls
1807   % we want 1in side margins regardless of paper type
1808   \IEEEsettextwidth{1in}{1in}
1809   \IEEEsetsidemargin{c}{0pt}
1810   % want 1in top and bottom margins
1811   \IEEEsettextheight{1in}{1in}
1812   \IEEEsettopmargin{t}{1in}
1813   % digitize textheight to be an integer number of lines.
1814   % this may cause the top and bottom margins to be off a tad
1815   \IEEEquantizetextheight{c}
1816   % tweak top margin so that the error is shared equally at the top and bottom
1817   \IEEEsettopmargin{q}{0sp}
1818 \fi
1819
1820
1821
1822 % process CLASSINPUT inner/outer margin
1823 % if inner margin defined, but outer margin not, set outer to inner.
1824 \ifx\CLASSINPUTinnersidemargin\@IEEEundefined
1825 \else
1826   \ifx\CLASSINPUToutersidemargin\@IEEEundefined
1827     \edef\CLASSINPUToutersidemargin{\CLASSINPUTinnersidemargin}
1828   \fi
1829 \fi
1830
1831 \ifx\CLASSINPUToutersidemargin\@IEEEundefined
1832 \else
1833   % if outer margin defined, but inner margin not, set inner to outer.
1834   \ifx\CLASSINPUTinnersidemargin\@IEEEundefined
1835     \edef\CLASSINPUTinnersidemargin{\CLASSINPUToutersidemargin}
1836   \fi
1837   \IEEEsettextwidth{\CLASSINPUTinnersidemargin}{\CLASSINPUToutersidemargin}
1838   \IEEEsetsidemargin{i}{\CLASSINPUTinnersidemargin}
1839   \typeout{** ATTENTION: Overriding inner side margin to \CLASSINPUTinnersidemargin\space and 
1840            outer side margin to \CLASSINPUToutersidemargin\space via \string\CLASSINPUT.}
1841 \fi
1842
1843
1844
1845 % process CLASSINPUT top/bottom text margin
1846 % if toptext margin defined, but bottomtext margin not, set bottomtext to toptext margin
1847 \ifx\CLASSINPUTtoptextmargin\@IEEEundefined
1848 \else
1849   \ifx\CLASSINPUTbottomtextmargin\@IEEEundefined
1850     \edef\CLASSINPUTbottomtextmargin{\CLASSINPUTtoptextmargin}
1851   \fi
1852 \fi
1853
1854 \ifx\CLASSINPUTbottomtextmargin\@IEEEundefined
1855 \else
1856   % if bottomtext margin defined, but toptext margin not, set toptext to bottomtext margin
1857   \ifx\CLASSINPUTtoptextmargin\@IEEEundefined
1858     \edef\CLASSINPUTtoptextmargin{\CLASSINPUTbottomtextmargin}
1859   \fi
1860   \IEEEsettextheight{\CLASSINPUTtoptextmargin}{\CLASSINPUTbottomtextmargin}
1861   \IEEEsettopmargin{t}{\CLASSINPUTtoptextmargin}
1862   \typeout{** ATTENTION: Overriding top text margin to \CLASSINPUTtoptextmargin\space and 
1863            bottom text margin to \CLASSINPUTbottomtextmargin\space via \string\CLASSINPUT.}
1864 \fi
1865
1866
1867
1868 % default to center header and footer text in the margins
1869 \IEEEsetheadermargin{c}{0pt}
1870 \IEEEsetfootermargin{c}{0pt}
1871
1872 % adjust header and footer positions for compsoc journals
1873 \ifCLASSOPTIONcompsoc
1874   \ifCLASSOPTIONjournal
1875     \IEEEsetheadermargin{b}{\@IEEEnormalsizeunitybaselineskip}
1876     \IEEEsetfootermargin{t}{\@IEEEnormalsizeunitybaselineskip}
1877   \fi
1878 \fi
1879
1880
1881 % V1.8a display lines per column info message on user's console
1882 \def\IEEEdisplayinfolinespercolumn{\@IEEEtrantmpdimenA=\textheight
1883 % topskip represents only one line even if > baselineskip
1884 \advance\@IEEEtrantmpdimenA by -1\topskip
1885 \@IEEEtrantmpcountA=\@IEEEtrantmpdimenA
1886 \@IEEEtrantmpcountB=\@IEEEtrantmpdimenA
1887 \divide\@IEEEtrantmpcountB by \baselineskip
1888 % need to add one line to include topskip (first) line
1889 \advance\@IEEEtrantmpcountB by 1
1890 % save lines per column value as text
1891 \edef\@IEEEnumlinespercolumninfotxt{\the\@IEEEtrantmpcountB}
1892 % backout topskip advance to allow direct \@IEEEtrantmpcountA comparison
1893 \advance\@IEEEtrantmpcountB by -1
1894 % restore value as text height (without topskip) rather than just as number of lines
1895 \multiply\@IEEEtrantmpcountB by \baselineskip
1896 % is the column height an integer number of lines per column?
1897 \ifnum\@IEEEtrantmpcountA=\@IEEEtrantmpcountB
1898 \edef\@IEEEnumlinespercolumnexactinfotxt{exact}
1899 \else
1900 \@IEEEtrantmpdimenA\@IEEEtrantmpcountA sp\relax
1901 \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpcountB sp\relax
1902 \edef\@IEEEnumlinespercolumnexactinfotxt{approximate, difference = \the\@IEEEtrantmpdimenA}
1903 \fi
1904 \typeout{-- Lines per column: \@IEEEnumlinespercolumninfotxt\space (\@IEEEnumlinespercolumnexactinfotxt).}}
1905 % delay execution till start of document to allow for user changes
1906 \AtBeginDocument{\IEEEdisplayinfolinespercolumn}
1907
1908
1909
1910 % LIST SPACING CONTROLS
1911
1912 % Controls the amount of EXTRA spacing
1913 % above and below \trivlist 
1914 % Both \list and IED lists override this.
1915 % However, \trivlist will use this as will most
1916 % things built from \trivlist like the \center
1917 % environment.
1918 \topsep           0.5\baselineskip
1919
1920 % Controls the additional spacing around lists preceded
1921 % or followed by blank lines. the IEEE does not increase
1922 % spacing before or after paragraphs so it is set to zero.
1923 % \z@ is the same as zero, but faster.
1924 \partopsep          \z@
1925
1926 % Controls the spacing between paragraphs in lists. 
1927 % The IEEE does not increase spacing before or after paragraphs
1928 % so this is also zero. 
1929 % With IEEEtran.cls, global changes to
1930 % this value DO affect lists (but not IED lists).
1931 \parsep             \z@
1932
1933 % Controls the extra spacing between list items. 
1934 % The IEEE does not put extra spacing between items.
1935 % With IEEEtran.cls, global changes to this value DO affect
1936 % lists (but not IED lists).
1937 \itemsep            \z@
1938
1939 % \itemindent is the amount to indent the FIRST line of a list
1940 % item. It is auto set to zero within the \list environment. To alter
1941 % it, you have to do so when you call the \list.
1942 % However, the IEEE uses this for the theorem environment
1943 % There is an alternative value for this near \leftmargini below
1944 \itemindent         -1em
1945
1946 % \leftmargin, the spacing from the left margin of the main text to
1947 % the left of the main body of a list item is set by \list.
1948 % Hence this statement does nothing for lists.
1949 % But, quote and verse do use it for indention.
1950 \leftmargin         2em
1951
1952 % we retain this stuff from the older IEEEtran.cls so that \list
1953 % will work the same way as before. However, itemize, enumerate and
1954 % description (IED) could care less about what these are as they
1955 % all are overridden.
1956 \leftmargini        2em
1957 %\itemindent         2em  % Alternative values: sometimes used.
1958 %\leftmargini        0em
1959 \leftmarginii       1em
1960 \leftmarginiii    1.5em
1961 \leftmarginiv     1.5em
1962 \leftmarginv      1.0em
1963 \leftmarginvi     1.0em
1964 \labelsep         0.5em 
1965 \labelwidth         \z@
1966
1967
1968 % The old IEEEtran.cls behavior of \list is retained.
1969 % However, the new V1.3 IED list environments override all the
1970 % @list stuff (\@listX is called within \list for the
1971 % appropriate level just before the user's list_decl is called). 
1972 % \topsep is now 2pt as the IEEE puts a little extra space around
1973 % lists - used by those non-IED macros that depend on \list.
1974 % Note that \parsep and \itemsep are not redefined as in 
1975 % the sizexx.clo \@listX (which article.cls uses) so global changes
1976 % of these values DO affect \list
1977
1978 \def\@listi{\leftmargin\leftmargini \topsep 2pt plus 1pt minus 1pt}
1979 \let\@listI\@listi
1980 \def\@listii{\leftmargin\leftmarginii\labelwidth\leftmarginii%
1981     \advance\labelwidth-\labelsep \topsep 2pt}
1982 \def\@listiii{\leftmargin\leftmarginiii\labelwidth\leftmarginiii%
1983     \advance\labelwidth-\labelsep \topsep 2pt}
1984 \def\@listiv{\leftmargin\leftmarginiv\labelwidth\leftmarginiv%
1985     \advance\labelwidth-\labelsep \topsep 2pt}
1986 \def\@listv{\leftmargin\leftmarginv\labelwidth\leftmarginv%
1987     \advance\labelwidth-\labelsep \topsep 2pt}
1988 \def\@listvi{\leftmargin\leftmarginvi\labelwidth\leftmarginvi%
1989     \advance\labelwidth-\labelsep \topsep 2pt}
1990
1991
1992 % The IEEE uses 5) not 5.
1993 \def\labelenumi{\theenumi)}     \def\theenumi{\arabic{enumi}}
1994
1995 % The IEEE uses a) not (a)
1996 \def\labelenumii{\theenumii)}  \def\theenumii{\alph{enumii}}
1997
1998 % The IEEE uses iii) not iii.
1999 \def\labelenumiii{\theenumiii)} \def\theenumiii{\roman{enumiii}}
2000
2001 % The IEEE uses A) not A.
2002 \def\labelenumiv{\theenumiv)}   \def\theenumiv{\Alph{enumiv}}
2003
2004 % exactly the same as in article.cls
2005 \def\p@enumii{\theenumi}
2006 \def\p@enumiii{\theenumi(\theenumii)}
2007 \def\p@enumiv{\p@enumiii\theenumiii}
2008
2009 % itemized list label styles
2010 \def\labelitemi{$\scriptstyle\bullet$}
2011 \def\labelitemii{\textbf{--}}
2012 \def\labelitemiii{$\ast$}
2013 \def\labelitemiv{$\cdot$}
2014
2015
2016
2017 % **** V1.3 ENHANCEMENTS ****
2018 % Itemize, Enumerate and Description (IED) List Controls
2019 % ***************************
2020
2021
2022 % The IEEE seems to use at least two different values by
2023 % which ITEMIZED list labels are indented to the right
2024 % For The Journal of Lightwave Technology (JLT) and The Journal
2025 % on Selected Areas in Communications (JSAC), they tend to use
2026 % an indention equal to \parindent. For Transactions on Communications
2027 % they tend to indent ITEMIZED lists a little more--- 1.3\parindent.
2028 % We'll provide both values here for you so that you can choose 
2029 % which one you like in your document using a command such as:
2030 % setlength{\IEEEilabelindent}{\IEEEilabelindentB}
2031 \newdimen\IEEEilabelindentA
2032 \IEEEilabelindentA \parindent
2033
2034 \newdimen\IEEEilabelindentB
2035 \IEEEilabelindentB 1.3\parindent
2036 % However, we'll default to using \parindent
2037 % which makes more sense to me
2038 \newdimen\IEEEilabelindent
2039 \IEEEilabelindent \IEEEilabelindentA
2040
2041
2042 % This controls the default amount the enumerated list labels
2043 % are indented to the right.
2044 % Normally, this is the same as the paragraph indention
2045 \newdimen\IEEEelabelindent
2046 \IEEEelabelindent \parindent
2047
2048 % This controls the default amount the description list labels
2049 % are indented to the right.
2050 % Normally, this is the same as the paragraph indention
2051 \newdimen\IEEEdlabelindent
2052 \IEEEdlabelindent \parindent
2053
2054 % This is the value actually used within the IED lists.
2055 % The IED environments automatically set its value to
2056 % one of the three values above, so global changes do 
2057 % not have any effect
2058 \newdimen\IEEElabelindent
2059 \IEEElabelindent \parindent
2060
2061 % The actual amount labels will be indented is
2062 % \IEEElabelindent multiplied by the factor below
2063 % corresponding to the level of nesting depth
2064 % This provides a means by which the user can
2065 % alter the effective \IEEElabelindent for deeper
2066 % levels
2067 % There may not be such a thing as correct "standard IEEE"
2068 % values. What the IEEE actually does may depend on the specific
2069 % circumstances.
2070 % The first list level almost always has full indention.
2071 % The second levels I've seen have only 75% of the normal indentation
2072 % Three level or greater nestings are very rare. I am guessing
2073 % that they don't use any indentation.
2074 \def\IEEElabelindentfactori{1.0}   % almost always one
2075 \def\IEEElabelindentfactorii{0.75} % 0.0 or 1.0 may be used in some cases
2076 \def\IEEElabelindentfactoriii{0.0} % 0.75? 0.5? 0.0?
2077 \def\IEEElabelindentfactoriv{0.0}
2078 \def\IEEElabelindentfactorv{0.0}
2079 \def\IEEElabelindentfactorvi{0.0}
2080
2081 % value actually used within IED lists, it is auto
2082 % set to one of the 6 values above
2083 % global changes here have no effect
2084 \def\IEEElabelindentfactor{1.0}
2085
2086 % This controls the default spacing between the end of the IED
2087 % list labels and the list text, when normal text is used for
2088 % the labels.
2089 % compsoc uses a larger value here, but we'll set that later
2090 % in the class so that this code block area can be extracted
2091 % as-is for IEEEtrantools.sty
2092 \newdimen\IEEEiednormlabelsep
2093 \IEEEiednormlabelsep 0.6em
2094
2095 % This controls the default spacing between the end of the IED
2096 % list labels and the list text, when math symbols are used for
2097 % the labels (nomenclature lists). The IEEE usually increases the 
2098 % spacing in these cases
2099 \newdimen\IEEEiedmathlabelsep
2100 \IEEEiedmathlabelsep 1.2em
2101
2102 % This controls the extra vertical separation put above and
2103 % below each IED list. the IEEE usually puts a little extra spacing
2104 % around each list. However, this spacing is barely noticeable.
2105 % compsoc uses a larger value here, but we'll set that later
2106 % in the class so that this code block area can be extracted
2107 % as-is for IEEEtrantools.sty
2108 \newskip\IEEEiedtopsep
2109 \IEEEiedtopsep 2pt plus 1pt minus 1pt
2110
2111
2112 % This command is executed within each IED list environment
2113 % at the beginning of the list. You can use this to set the 
2114 % parameters for some/all your IED list(s) without disturbing 
2115 % global parameters that affect things other than lists.
2116 % i.e., renewcommand{\IEEEiedlistdecl}{\setlength{\labelsep}{5em}}
2117 % will alter the \labelsep for the next list(s) until 
2118 % \IEEEiedlistdecl is redefined. 
2119 \def\IEEEiedlistdecl{\relax}
2120
2121 % This command provides an easy way to set \leftmargin based
2122 % on the \labelwidth, \labelsep and the argument \IEEElabelindent
2123 % Usage: \IEEEcalcleftmargin{width-to-indent-the-label}
2124 % output is in the \leftmargin variable, i.e., effectively:
2125 % \leftmargin = argument + \labelwidth + \labelsep
2126 % Note controlled spacing here, shield end of lines with %
2127 \def\IEEEcalcleftmargin#1{\setlength{\leftmargin}{#1}%
2128 \addtolength{\leftmargin}{\labelwidth}%
2129 \addtolength{\leftmargin}{\labelsep}}
2130
2131 % This command provides an easy way to set \labelwidth to the
2132 % width of the given text. It is the same as
2133 % \settowidth{\labelwidth}{label-text}
2134 % and useful as a shorter alternative.
2135 % Typically used to set \labelwidth to be the width
2136 % of the longest label in the list
2137 \def\IEEEsetlabelwidth#1{\settowidth{\labelwidth}{#1}}
2138
2139 % When this command is executed, IED lists will use the 
2140 % IEEEiedmathlabelsep label separation rather than the normal
2141 % spacing. To have an effect, this command must be executed via
2142 % the \IEEEiedlistdecl or within the option of the IED list
2143 % environments.
2144 \def\IEEEusemathlabelsep{\setlength{\labelsep}{\IEEEiedmathlabelsep}}
2145
2146 % A flag which controls whether the IED lists automatically
2147 % calculate \leftmargin from \IEEElabelindent, \labelwidth and \labelsep
2148 % Useful if you want to specify your own \leftmargin
2149 % This flag must be set (\IEEEnocalcleftmargintrue or \IEEEnocalcleftmarginfalse) 
2150 % via the \IEEEiedlistdecl or within the option of the IED list
2151 % environments to have an effect.
2152 \newif\ifIEEEnocalcleftmargin
2153 \IEEEnocalcleftmarginfalse
2154
2155 % A flag which controls whether \IEEElabelindent is multiplied by
2156 % the \IEEElabelindentfactor for each list level.
2157 % This flag must be set via the \IEEEiedlistdecl or within the option 
2158 % of the IED list environments to have an effect.
2159 \newif\ifIEEEnolabelindentfactor
2160 \IEEEnolabelindentfactorfalse
2161
2162
2163 % internal variable to indicate type of IED label
2164 % justification
2165 % 0 - left; 1 - center; 2 - right
2166 \def\@IEEEiedjustify{0}
2167
2168
2169 % commands to allow the user to control IED
2170 % label justifications. Use these commands within
2171 % the IED environment option or in the \IEEEiedlistdecl
2172 % Note that changing the normal list justifications
2173 % is nonstandard and the IEEE may not like it if you do so!
2174 % I include these commands as they may be helpful to
2175 % those who are using these enhanced list controls for
2176 % other non-IEEE related LaTeX work.
2177 % itemize and enumerate automatically default to right
2178 % justification, description defaults to left.
2179 \def\IEEEiedlabeljustifyl{\def\@IEEEiedjustify{0}}%left
2180 \def\IEEEiedlabeljustifyc{\def\@IEEEiedjustify{1}}%center
2181 \def\IEEEiedlabeljustifyr{\def\@IEEEiedjustify{2}}%right
2182
2183
2184
2185
2186 % commands to save to and restore from the list parameter copies
2187 % this allows us to set all the list parameters within
2188 % the list_decl and prevent \list (and its \@list) 
2189 % from overriding any of our parameters
2190 % V1.6 use \edefs instead of dimen's to conserve dimen registers
2191 % Note controlled spacing here, shield end of lines with %
2192 \def\@IEEEsavelistparams{\edef\@IEEEiedtopsep{\the\topsep}%
2193 \edef\@IEEEiedlabelwidth{\the\labelwidth}%
2194 \edef\@IEEEiedlabelsep{\the\labelsep}%
2195 \edef\@IEEEiedleftmargin{\the\leftmargin}%
2196 \edef\@IEEEiedpartopsep{\the\partopsep}%
2197 \edef\@IEEEiedparsep{\the\parsep}%
2198 \edef\@IEEEieditemsep{\the\itemsep}%
2199 \edef\@IEEEiedrightmargin{\the\rightmargin}%
2200 \edef\@IEEEiedlistparindent{\the\listparindent}%
2201 \edef\@IEEEieditemindent{\the\itemindent}}
2202
2203 % Note controlled spacing here
2204 \def\@IEEErestorelistparams{\topsep\@IEEEiedtopsep\relax%
2205 \labelwidth\@IEEEiedlabelwidth\relax%
2206 \labelsep\@IEEEiedlabelsep\relax%
2207 \leftmargin\@IEEEiedleftmargin\relax%
2208 \partopsep\@IEEEiedpartopsep\relax%
2209 \parsep\@IEEEiedparsep\relax%
2210 \itemsep\@IEEEieditemsep\relax%
2211 \rightmargin\@IEEEiedrightmargin\relax%
2212 \listparindent\@IEEEiedlistparindent\relax%
2213 \itemindent\@IEEEieditemindent\relax}
2214
2215
2216 % v1.6b provide original LaTeX IED list environments
2217 % note that latex.ltx defines \itemize and \enumerate, but not \description
2218 % which must be created by the base classes
2219 % save original LaTeX itemize and enumerate
2220 \let\LaTeXitemize\itemize
2221 \let\endLaTeXitemize\enditemize
2222 \let\LaTeXenumerate\enumerate
2223 \let\endLaTeXenumerate\endenumerate
2224
2225 % provide original LaTeX description environment from article.cls
2226 \newenvironment{LaTeXdescription}
2227                {\list{}{\labelwidth\z@ \itemindent-\leftmargin
2228                         \let\makelabel\descriptionlabel}}
2229                {\endlist}
2230 \newcommand*\descriptionlabel[1]{\hspace\labelsep
2231                                  \normalfont\bfseries #1}
2232
2233
2234 % override LaTeX's default IED lists
2235 \def\itemize{\@IEEEitemize}
2236 \def\enditemize{\@endIEEEitemize}
2237 \def\enumerate{\@IEEEenumerate}
2238 \def\endenumerate{\@endIEEEenumerate}
2239 \def\description{\@IEEEdescription}
2240 \def\enddescription{\@endIEEEdescription}
2241
2242 % provide the user with aliases - may help those using packages that
2243 % override itemize, enumerate, or description
2244 \def\IEEEitemize{\@IEEEitemize}
2245 \def\endIEEEitemize{\@endIEEEitemize}
2246 \def\IEEEenumerate{\@IEEEenumerate}
2247 \def\endIEEEenumerate{\@endIEEEenumerate}
2248 \def\IEEEdescription{\@IEEEdescription}
2249 \def\endIEEEdescription{\@endIEEEdescription}
2250
2251
2252 % V1.6 we want to keep the IEEEtran IED list definitions as our own internal
2253 % commands so they are protected against redefinition
2254 \def\@IEEEitemize{\@ifnextchar[{\@@IEEEitemize}{\@@IEEEitemize[\relax]}}
2255 \def\@IEEEenumerate{\@ifnextchar[{\@@IEEEenumerate}{\@@IEEEenumerate[\relax]}}
2256 \def\@IEEEdescription{\@ifnextchar[{\@@IEEEdescription}{\@@IEEEdescription[\relax]}}
2257 \def\@endIEEEitemize{\endlist}
2258 \def\@endIEEEenumerate{\endlist}
2259 \def\@endIEEEdescription{\endlist}
2260
2261
2262 % DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS
2263 % AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS
2264 % IEEEtran itemized list MDS 1/2001
2265 % Note controlled spacing here, shield end of lines with %
2266 \def\@@IEEEitemize[#1]{%
2267                 \ifnum\@itemdepth>3\relax\@toodeep\else%
2268                 \ifnum\@listdepth>5\relax\@toodeep\else%
2269                 \advance\@itemdepth\@ne%
2270                 \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}%
2271                 % get the IEEElabelindentfactor for this level
2272                 \advance\@listdepth\@ne% we need to know what the level WILL be
2273                 \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}%
2274                 \advance\@listdepth-\@ne% undo our increment
2275                 \def\@IEEEiedjustify{2}% right justified labels are default
2276                 % set other defaults
2277                 \IEEEnocalcleftmarginfalse%
2278                 \IEEEnolabelindentfactorfalse%
2279                 \topsep\IEEEiedtopsep%
2280                 \IEEElabelindent\IEEEilabelindent%
2281                 \labelsep\IEEEiednormlabelsep%
2282                 \partopsep 0ex%
2283                 \parsep 0ex%
2284                 \itemsep 0ex%
2285                 \rightmargin 0em%
2286                 \listparindent 0em%
2287                 \itemindent 0em%
2288                 % calculate the label width
2289                 % the user can override this later if
2290                 % they specified a \labelwidth
2291                 \settowidth{\labelwidth}{\csname labelitem\romannumeral\the\@itemdepth\endcsname}%
2292                 \@IEEEsavelistparams% save our list parameters
2293                 \list{\csname\@itemitem\endcsname}{%
2294                 \@IEEErestorelistparams% override any list{} changes
2295                                        % to our globals
2296                 \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel
2297                 \IEEEiedlistdecl% let user alter parameters
2298                 #1\relax%
2299                 % If the user has requested not to use the
2300                 % IEEElabelindent factor, don't revise \IEEElabelindent
2301                 \ifIEEEnolabelindentfactor\relax%
2302                 \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent%
2303                 \fi%
2304                 % Unless the user has requested otherwise,
2305                 % calculate our left margin based
2306                 % on \IEEElabelindent, \labelwidth and
2307                 % \labelsep
2308                 \ifIEEEnocalcleftmargin\relax%
2309                 \else\IEEEcalcleftmargin{\IEEElabelindent}%
2310                 \fi}\fi\fi}%
2311
2312
2313 % DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS
2314 % AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS
2315 % IEEEtran enumerate list MDS 1/2001
2316 % Note controlled spacing here, shield end of lines with %
2317 \def\@@IEEEenumerate[#1]{%
2318                 \ifnum\@enumdepth>3\relax\@toodeep\else%
2319                 \ifnum\@listdepth>5\relax\@toodeep\else%
2320                 \advance\@enumdepth\@ne%
2321                 \edef\@enumctr{enum\romannumeral\the\@enumdepth}%
2322                 % get the IEEElabelindentfactor for this level
2323                 \advance\@listdepth\@ne% we need to know what the level WILL be
2324                 \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}%
2325                 \advance\@listdepth-\@ne% undo our increment
2326                 \def\@IEEEiedjustify{2}% right justified labels are default
2327                 % set other defaults
2328                 \IEEEnocalcleftmarginfalse%
2329                 \IEEEnolabelindentfactorfalse%
2330                 \topsep\IEEEiedtopsep%
2331                 \IEEElabelindent\IEEEelabelindent%
2332                 \labelsep\IEEEiednormlabelsep%
2333                 \partopsep 0ex%
2334                 \parsep 0ex%
2335                 \itemsep 0ex%
2336                 \rightmargin 0em%
2337                 \listparindent 0em%
2338                 \itemindent 0em%
2339                 % calculate the label width
2340                 % We'll set it to the width suitable for all labels using
2341                 % normalfont 1) to 9)
2342                 % The user can override this later
2343                 \settowidth{\labelwidth}{9)}%
2344                 \@IEEEsavelistparams% save our list parameters
2345                 \list{\csname label\@enumctr\endcsname}{\usecounter{\@enumctr}%
2346                 \@IEEErestorelistparams% override any list{} changes
2347                                        % to our globals
2348                 \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel
2349                 \IEEEiedlistdecl% let user alter parameters 
2350                 #1\relax%
2351                 % If the user has requested not to use the
2352                 % IEEElabelindent factor, don't revise \IEEElabelindent
2353                 \ifIEEEnolabelindentfactor\relax%
2354                 \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent%
2355                 \fi%
2356                 % Unless the user has requested otherwise,
2357                 % calculate our left margin based
2358                 % on \IEEElabelindent, \labelwidth and
2359                 % \labelsep
2360                 \ifIEEEnocalcleftmargin\relax%
2361                 \else\IEEEcalcleftmargin{\IEEElabelindent}%
2362                 \fi}\fi\fi}%
2363
2364
2365 % DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS
2366 % AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS
2367 % IEEEtran description list MDS 1/2001
2368 % Note controlled spacing here, shield end of lines with %
2369 \def\@@IEEEdescription[#1]{%
2370                 \ifnum\@listdepth>5\relax\@toodeep\else%
2371                 % get the IEEElabelindentfactor for this level
2372                 \advance\@listdepth\@ne% we need to know what the level WILL be
2373                 \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}%
2374                 \advance\@listdepth-\@ne% undo our increment
2375                 \def\@IEEEiedjustify{0}% left justified labels are default
2376                 % set other defaults
2377                 \IEEEnocalcleftmarginfalse%
2378                 \IEEEnolabelindentfactorfalse%
2379                 \topsep\IEEEiedtopsep% 
2380                 \IEEElabelindent\IEEEdlabelindent%
2381                 % assume normal labelsep
2382                 \labelsep\IEEEiednormlabelsep%
2383                 \partopsep 0ex%
2384                 \parsep 0ex%
2385                 \itemsep 0ex%
2386                 \rightmargin 0em%
2387                 \listparindent 0em%
2388                 \itemindent 0em%
2389                 % Bogus label width in case the user forgets
2390                 % to set it.
2391                 % TIP: If you want to see what a variable's width is you
2392                 % can use the TeX command \showthe\width-variable to 
2393                 % display it on the screen during compilation 
2394                 % (This might be helpful to know when you need to find out
2395                 % which label is the widest)
2396                 \settowidth{\labelwidth}{Hello}%
2397                 \@IEEEsavelistparams% save our list parameters
2398                 \list{}{\@IEEErestorelistparams% override any list{} changes
2399                                                % to our globals
2400                 \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel
2401                 \IEEEiedlistdecl% let user alter parameters 
2402                 #1\relax%
2403                 % If the user has requested not to use the
2404                 % labelindent factor, don't revise \IEEElabelindent
2405                 \ifIEEEnolabelindentfactor\relax%
2406                 \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent%
2407                 \fi%
2408                 % Unless the user has requested otherwise,
2409                 % calculate our left margin based
2410                 % on \IEEElabelindent, \labelwidth and
2411                 % \labelsep
2412                 \ifIEEEnocalcleftmargin\relax%
2413                 \else\IEEEcalcleftmargin{\IEEElabelindent}\relax%
2414                 \fi}\fi}
2415
2416 % v1.6b we use one makelabel that does justification as needed.
2417 \def\@IEEEiedmakelabel#1{\relax\if\@IEEEiedjustify 0\relax
2418 \makebox[\labelwidth][l]{\normalfont #1}\else
2419 \if\@IEEEiedjustify 1\relax
2420 \makebox[\labelwidth][c]{\normalfont #1}\else
2421 \makebox[\labelwidth][r]{\normalfont #1}\fi\fi}
2422
2423
2424 % compsoc uses a larger value for the normal labelsep
2425 % and also extra spacing above and below each list
2426 \ifCLASSOPTIONcompsoc
2427   \IEEEiednormlabelsep 1.2em
2428   \IEEEiedtopsep 6pt plus 3pt minus 3pt
2429 \fi
2430
2431
2432 % VERSE and QUOTE
2433 % V1.7 define environments with newenvironment
2434 \newenvironment{verse}{\let\\=\@centercr
2435     \list{}{\itemsep\z@ \itemindent -1.5em \listparindent \itemindent
2436     \rightmargin\leftmargin\advance\leftmargin 1.5em}\item\relax}
2437     {\endlist}
2438 \newenvironment{quotation}{\list{}{\listparindent 1.5em \itemindent\listparindent
2439     \rightmargin\leftmargin \parsep 0pt plus 1pt}\item\relax}
2440     {\endlist}
2441 \newenvironment{quote}{\list{}{\rightmargin\leftmargin}\item\relax}
2442     {\endlist}
2443
2444
2445 % \titlepage
2446 % provided only for backward compatibility. \maketitle is the correct
2447 % way to create the title page. 
2448 \def\titlepage{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn
2449     \else \newpage \fi \thispagestyle{empty}\c@page\z@}
2450 \def\endtitlepage{\if@restonecol\twocolumn \else \newpage \fi}
2451
2452 % standard values from article.cls
2453 \arraycolsep     5pt
2454 \arrayrulewidth .4pt
2455 \doublerulesep   2pt
2456
2457 \tabcolsep       6pt
2458 \tabbingsep      0.5em
2459
2460
2461 %% FOOTNOTES
2462 %
2463 %\skip\footins 10pt plus 4pt minus 2pt
2464 % V1.6 respond to changes in font size
2465 % space added above the footnotes (if present)
2466 \skip\footins 0.9\baselineskip  plus 0.4\baselineskip  minus 0.2\baselineskip
2467
2468 % V1.6, we need to make \footnotesep responsive to changes
2469 % in \baselineskip or strange spacings will result when in
2470 % draft mode. Here is a little LaTeX secret - \footnotesep
2471 % determines the height of an invisible strut that is placed
2472 % *above* the baseline of footnotes after the first. Since
2473 % LaTeX considers the space for characters to be 0.7\baselineskip
2474 % above the baseline and 0.3\baselineskip below it, we need to
2475 % use 0.7\baselineskip as a \footnotesep to maintain equal spacing
2476 % between all the lines of the footnotes. The IEEE often uses a tad
2477 % more, so use 0.8\baselineskip. This slightly larger value also helps
2478 % the text to clear the footnote marks. Note that \thanks in IEEEtran
2479 % uses its own value of \footnotesep which is set in \maketitle.
2480 {\footnotesize
2481 \global\footnotesep 0.8\baselineskip}
2482
2483
2484 \skip\@mpfootins = \skip\footins
2485 \fboxsep = 3pt
2486 \fboxrule = .4pt
2487 % V1.6 use 1em, then use LaTeX2e's \@makefnmark
2488 % Note that the IEEE normally *left* aligns the footnote marks, so we don't need
2489 % box resizing tricks here.
2490 \long\def\@makefntext#1{\parindent 1em\indent\hbox{\@makefnmark}#1}% V1.6 use 1em
2491 % V1.7 compsoc does not use superscipts for footnote marks
2492 \ifCLASSOPTIONcompsoc
2493 \def\@IEEEcompsocmakefnmark{\hbox{\normalfont\@thefnmark.\ }}
2494 \long\def\@makefntext#1{\parindent 1em\indent\hbox{\@IEEEcompsocmakefnmark}#1}
2495 \fi
2496
2497 % The IEEE does not use footnote rules
2498 \def\footnoterule{}
2499
2500 % V1.7 for compsoc, the IEEE uses a footnote rule only for \thanks. We devise a "one-shot"
2501 % system to implement this.
2502 \newif\if@IEEEenableoneshotfootnoterule
2503 \@IEEEenableoneshotfootnoterulefalse
2504 \ifCLASSOPTIONcompsoc
2505 \def\footnoterule{\relax\if@IEEEenableoneshotfootnoterule
2506 \kern-5pt
2507 \hbox to \columnwidth{\hfill\vrule width 0.5\columnwidth height 0.4pt\hfill}
2508 \kern4.6pt
2509 \global\@IEEEenableoneshotfootnoterulefalse
2510 \else
2511 \relax
2512 \fi}
2513 \fi
2514
2515 % V1.6 do not allow LaTeX to break a footnote across multiple pages
2516 \interfootnotelinepenalty=10000
2517
2518 % V1.6 discourage breaks within equations
2519 % Note that amsmath normally sets this to 10000,
2520 % but LaTeX2e normally uses 100.
2521 \interdisplaylinepenalty=2500
2522
2523 % default allows section depth up to /paragraph
2524 \setcounter{secnumdepth}{4}
2525
2526 % technotes do not allow /paragraph
2527 \ifCLASSOPTIONtechnote
2528    \setcounter{secnumdepth}{3}
2529 \fi
2530 % neither do compsoc conferences
2531 \@IEEEcompsocconfonly{\setcounter{secnumdepth}{3}}
2532
2533
2534 \newcounter{section}
2535 \newcounter{subsection}[section]
2536 \newcounter{subsubsection}[subsection]
2537 \newcounter{paragraph}[subsubsection]
2538
2539 % used only by IEEEtran's IEEEeqnarray as other packages may
2540 % have their own, different, implementations
2541 \newcounter{IEEEsubequation}[equation]
2542
2543 % as shown when called by user from \ref, \label and in table of contents
2544 \def\theequation{\arabic{equation}}                          % 1
2545 \def\theIEEEsubequation{\theequation\alph{IEEEsubequation}}  % 1a (used only by IEEEtran's IEEEeqnarray)
2546 \ifCLASSOPTIONcompsoc
2547 % compsoc is all arabic
2548 \def\thesection{\arabic{section}}                
2549 \def\thesubsection{\thesection.\arabic{subsection}}
2550 \def\thesubsubsection{\thesubsection.\arabic{subsubsection}}
2551 \def\theparagraph{\thesubsubsection.\arabic{paragraph}}
2552 \else
2553 \def\thesection{\Roman{section}}                             % I
2554 % V1.7, \mbox prevents breaks around - 
2555 \def\thesubsection{\mbox{\thesection-\Alph{subsection}}}     % I-A
2556 % V1.7 use I-A1 format used by the IEEE rather than I-A.1
2557 \def\thesubsubsection{\thesubsection\arabic{subsubsection}}  % I-A1
2558 \def\theparagraph{\thesubsubsection\alph{paragraph}}         % I-A1a
2559 \fi
2560
2561 % From Heiko Oberdiek. Because of the \mbox in \thesubsection, we need to
2562 % tell hyperref to disable the \mbox command when making PDF bookmarks.
2563 % This done already with hyperref.sty version 6.74o and later, but
2564 % it will not hurt to do it here again for users of older versions.
2565 \@ifundefined{pdfstringdefPreHook}{\let\pdfstringdefPreHook\@empty}{}%
2566 \g@addto@macro\pdfstringdefPreHook{\let\mbox\relax}
2567
2568
2569 % Main text forms (how shown in main text headings)
2570 % V1.6, using \thesection in \thesectiondis allows changes
2571 % in the former to automatically appear in the latter
2572 \ifCLASSOPTIONcompsoc
2573   \ifCLASSOPTIONconference% compsoc conference
2574     \def\thesectiondis{\thesection.}
2575     \def\thesubsectiondis{\thesectiondis\arabic{subsection}.}
2576     \def\thesubsubsectiondis{\thesubsectiondis\arabic{subsubsection}.}
2577     \def\theparagraphdis{\thesubsubsectiondis\arabic{paragraph}.}
2578   \else% compsoc not conferencs
2579     \def\thesectiondis{\thesection}
2580     \def\thesubsectiondis{\thesectiondis.\arabic{subsection}}
2581     \def\thesubsubsectiondis{\thesubsectiondis.\arabic{subsubsection}}
2582     \def\theparagraphdis{\thesubsubsectiondis.\arabic{paragraph}}
2583   \fi
2584 \else% not compsoc
2585   \def\thesectiondis{\thesection.}                   % I.
2586   \def\thesubsectiondis{\Alph{subsection}.}          % B.
2587   \def\thesubsubsectiondis{\arabic{subsubsection})}  % 3)
2588   \def\theparagraphdis{\alph{paragraph})}            % d)
2589 \fi
2590
2591 % just like LaTeX2e's \@eqnnum
2592 \def\theequationdis{{\normalfont \normalcolor (\theequation)}}% (1)
2593 % IEEEsubequation used only by IEEEtran's IEEEeqnarray
2594 \def\theIEEEsubequationdis{{\normalfont \normalcolor (\theIEEEsubequation)}}% (1a)
2595 % redirect LaTeX2e's equation number display and all that depend on
2596 % it, through IEEEtran's \theequationdis
2597 \def\@eqnnum{\theequationdis}
2598
2599
2600
2601 % V1.7 provide string macros as article.cls does
2602 \def\contentsname{Contents}
2603 \def\listfigurename{List of Figures}
2604 \def\listtablename{List of Tables}
2605 \def\refname{References}
2606 \def\indexname{Index}
2607 \def\figurename{Fig.}
2608 \def\tablename{TABLE}
2609 \@IEEEcompsocconfonly{\def\figurename{Figure}}
2610 \def\partname{Part}
2611 \def\appendixname{Appendix}
2612 \def\abstractname{Abstract}
2613 % IEEE specific names
2614 \def\IEEEkeywordsname{Index Terms}
2615 \def\IEEEproofname{Proof}
2616
2617
2618 % LIST OF FIGURES AND TABLES AND TABLE OF CONTENTS
2619 %
2620 \def\@pnumwidth{1.55em}
2621 \def\@tocrmarg{2.55em}
2622 \def\@dotsep{4.5}
2623 \setcounter{tocdepth}{3}
2624
2625 % adjusted some spacings here so that section numbers will not easily 
2626 % collide with the section titles. 
2627 % VIII; VIII-A; and VIII-A.1 are usually the worst offenders.
2628 % MDS 1/2001
2629 \def\tableofcontents{\section*{\contentsname}\@starttoc{toc}}
2630 \def\l@section#1#2{\addpenalty{\@secpenalty}\addvspace{1.0em plus 1pt}%
2631     \@tempdima 2.75em \begingroup \parindent \z@ \rightskip \@pnumwidth%
2632     \parfillskip-\@pnumwidth {\bfseries\leavevmode #1}\hfil\hbox to\@pnumwidth{\hss #2}\par%
2633     \endgroup}
2634 % argument format #1:level, #2:labelindent,#3:labelsep
2635 \def\l@subsection{\@dottedtocline{2}{2.75em}{3.75em}}
2636 \def\l@subsubsection{\@dottedtocline{3}{6.5em}{4.5em}}
2637 % must provide \l@ defs for ALL sublevels EVEN if tocdepth
2638 % is such as they will not appear in the table of contents
2639 % these defs are how TOC knows what level these things are!
2640 \def\l@paragraph{\@dottedtocline{4}{6.5em}{5.5em}}
2641 \def\l@subparagraph{\@dottedtocline{5}{6.5em}{6.5em}}
2642 \def\listoffigures{\section*{\listfigurename}\@starttoc{lof}}
2643 \def\l@figure{\@dottedtocline{1}{0em}{2.75em}}
2644 \def\listoftables{\section*{\listtablename}\@starttoc{lot}}
2645 \let\l@table\l@figure
2646
2647
2648 % Definitions for floats
2649 %
2650 % Normal Floats
2651 % V1.8 floatsep et al. revised down by 0.15\baselineskip
2652 % to account for the sideeffects of \topskip compensation
2653 \floatsep 0.85\baselineskip plus  0.2\baselineskip minus  0.2\baselineskip
2654 \textfloatsep 1.55\baselineskip plus  0.2\baselineskip minus  0.4\baselineskip
2655 \@fptop 0pt plus 1fil
2656 \@fpsep 0.75\baselineskip plus 2fil
2657 \@fpbot 0pt plus 1fil
2658 \def\topfraction{0.9}
2659 \def\bottomfraction{0.4}
2660 \def\floatpagefraction{0.8}
2661 % V1.7, let top floats approach 90% of page
2662 \def\textfraction{0.1}
2663
2664 % Double Column Floats
2665 \dblfloatsep 0.85\baselineskip plus  0.2\baselineskip minus  0.2\baselineskip
2666
2667 \dbltextfloatsep 1.55\baselineskip plus  0.2\baselineskip minus  0.4\baselineskip
2668 % Note that it would be nice if the rubber here actually worked in LaTeX2e.
2669 % There is a long standing limitation in LaTeX, first discovered (to the best
2670 % of my knowledge) by Alan Jeffrey in 1992. LaTeX ignores the stretchable
2671 % portion of \dbltextfloatsep, and as a result, double column figures can and
2672 % do result in an non-integer number of lines in the main text columns with
2673 % underfull vbox errors as a consequence. A post to comp.text.tex
2674 % by Donald Arseneau confirms that this had not yet been fixed in 1998.
2675 % IEEEtran V1.6 will fix this problem for you in the titles, but it doesn't
2676 % protect you from other double floats. Happy vspace'ing.
2677
2678 \@dblfptop 0pt plus 1fil
2679 \@dblfpsep 0.75\baselineskip plus 2fil
2680 \@dblfpbot 0pt plus 1fil
2681 \def\dbltopfraction{0.8}
2682 \def\dblfloatpagefraction{0.8}
2683 \setcounter{dbltopnumber}{4}
2684
2685 \intextsep 0.85\baselineskip plus 0.2\baselineskip minus  0.2\baselineskip
2686 \setcounter{topnumber}{2}
2687 \setcounter{bottomnumber}{2}
2688 \setcounter{totalnumber}{4}
2689
2690
2691
2692 % article class provides these, we should too.
2693 \newlength\abovecaptionskip
2694 \newlength\belowcaptionskip
2695 % but only \abovecaptionskip is used above figure captions and *below* table
2696 % captions
2697 \setlength\abovecaptionskip{0.5\baselineskip}
2698 % compsoc journals are a little more generous
2699 \ifCLASSOPTIONcompsoc\ifCLASSOPTIONjournal
2700   \setlength\abovecaptionskip{0.75\baselineskip}
2701 \fi\fi
2702 \setlength\belowcaptionskip{0pt}
2703 % V1.6 create hooks in case the caption spacing ever needs to be
2704 % overridden by a user
2705 \def\@IEEEfigurecaptionsepspace{\vskip\abovecaptionskip\relax}%
2706 \def\@IEEEtablecaptionsepspace{\vskip\abovecaptionskip\relax}%
2707
2708
2709 % 1.6b revise caption system so that \@makecaption uses two arguments
2710 % as with LaTeX2e. Otherwise, there will be problems when using hyperref.
2711 \def\@IEEEtablestring{table}
2712
2713
2714 % V1.8 compensate for \topskip so top of top figures align with tops of the first lines of main text
2715 % here we calculate a space equal to the amount \topskip exceeds the main text height
2716 % we hook in at \@floatboxreset
2717 \def\@IEEEfiguretopskipspace{\ifdim\prevdepth=-1000pt\relax
2718 \setlength{\@IEEEtrantmpdimenA}{1\topskip}\relax
2719 \addtolength{\@IEEEtrantmpdimenA}{-0.7\@IEEEnormalsizeunitybaselineskip}\relax
2720 \vspace*{\@IEEEtrantmpdimenA}\fi}
2721 % V1.8 compensate for \topskip at the top of top tables so caption text is on main text baseline
2722 % use a strut set on the caption baseline within \@makecaption
2723 \def\@IEEEtabletopskipstrut{\ifdim\prevdepth=-1000pt\rule{0pt}{\topskip}\fi}
2724 % the \ifdim\prevdepth checks are always expected to be true for IEEE style float caption ordering
2725 % because top of figure content and top of captions in tables is the first thing on the vertical
2726 % list of these floats
2727 % thanks to Donald Arseneau for his 2000/11/11 post "Re: caption hacking" with info on this topic.
2728
2729
2730 \ifCLASSOPTIONcompsoc
2731 % V1.7 compsoc \@makecaption
2732 \ifCLASSOPTIONconference% compsoc conference
2733 \long\def\@makecaption#1#2{%
2734 % test if is a for a figure or table
2735 \ifx\@captype\@IEEEtablestring%
2736 % if a table, do table caption
2737 \footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\footnotesize {#1.}\nobreakspace\scshape #2}\par\addvspace{0.5\baselineskip}\egroup%
2738 \@IEEEtablecaptionsepspace
2739 % if not a table, format it as a figure
2740 \else
2741 \@IEEEfigurecaptionsepspace
2742 \setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace #2}%
2743 \ifdim \wd\@tempboxa >\hsize%
2744 % if caption is longer than a line, let it wrap around
2745 \setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace}%
2746 \parbox[t]{\hsize}{\normalfont\footnotesize \noindent\unhbox\@tempboxa#2}%
2747 % if caption is shorter than a line, center
2748 \else%
2749 \hbox to\hsize{\normalfont\footnotesize\hfil\box\@tempboxa\hfil}%
2750 \fi\fi}
2751 %
2752 \else% nonconference compsoc
2753 \long\def\@makecaption#1#2{%
2754 % test if is a for a figure or table
2755 \ifx\@captype\@IEEEtablestring%
2756 % if a table, do table caption
2757 \footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\sffamily\footnotesize #1}\\{\normalfont\sffamily\footnotesize #2}\par\addvspace{0.5\baselineskip}\egroup%
2758 \@IEEEtablecaptionsepspace
2759 % if not a table, format it as a figure
2760 \else
2761 \@IEEEfigurecaptionsepspace
2762 \setbox\@tempboxa\hbox{\normalfont\sffamily\footnotesize {#1.}\nobreakspace #2}%
2763 \ifdim \wd\@tempboxa >\hsize%
2764 % if caption is longer than a line, let it wrap around
2765 \setbox\@tempboxa\hbox{\normalfont\sffamily\footnotesize {#1.}\nobreakspace}%
2766 \parbox[t]{\hsize}{\normalfont\sffamily\footnotesize \noindent\unhbox\@tempboxa#2}%
2767 % if caption is shorter than a line, left justify
2768 \else%
2769 \hbox to\hsize{\normalfont\sffamily\footnotesize\box\@tempboxa\hfil}%
2770 \fi\fi}
2771 \fi
2772 %
2773 \else% traditional noncompsoc \@makecaption
2774 \long\def\@makecaption#1#2{%
2775 % test if is a for a figure or table
2776 \ifx\@captype\@IEEEtablestring%
2777 % if a table, do table caption
2778 \footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\footnotesize #1}\\{\normalfont\footnotesize\scshape #2}\par\addvspace{0.5\baselineskip}\egroup%
2779 \@IEEEtablecaptionsepspace
2780 % if not a table, format it as a figure
2781 \else
2782 \@IEEEfigurecaptionsepspace
2783 % 3/2001 use footnotesize, not small; use two nonbreaking spaces, not one
2784 \setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace #2}%
2785 \ifdim \wd\@tempboxa >\hsize%
2786 % if caption is longer than a line, let it wrap around
2787 \setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace}%
2788 \parbox[t]{\hsize}{\normalfont\footnotesize\noindent\unhbox\@tempboxa#2}%
2789 % if caption is shorter than a line, center if conference, left justify otherwise
2790 \else%
2791 \ifCLASSOPTIONconference \hbox to\hsize{\normalfont\footnotesize\hfil\box\@tempboxa\hfil}%
2792 \else \hbox to\hsize{\normalfont\footnotesize\box\@tempboxa\hfil}%
2793 \fi\fi\fi}
2794 \fi
2795
2796
2797
2798 % V1.7 disable captions class option, do so in a way that retains operation of \label
2799 % within \caption
2800 \ifCLASSOPTIONcaptionsoff
2801 \long\def\@makecaption#1#2{\vspace*{2em}\footnotesize\bgroup\par\addvspace{0.5\baselineskip}\centering{\footnotesize #1}\par\addvspace{0.5\baselineskip}\egroup%
2802 \let\@IEEEtemporiglabeldefsave\label
2803 \let\@IEEEtemplabelargsave\relax
2804 \def\label##1{\gdef\@IEEEtemplabelargsave{##1}}%
2805 \setbox\@tempboxa\hbox{#2}%
2806 \let\label\@IEEEtemporiglabeldefsave
2807 \ifx\@IEEEtemplabelargsave\relax\else\label{\@IEEEtemplabelargsave}\fi}
2808 \fi
2809
2810
2811 % V1.7 define end environments with \def not \let so as to work OK with
2812 % preview-latex
2813 \newcounter{figure}
2814 \def\thefigure{\@arabic\c@figure}
2815 \def\fps@figure{tbp}
2816 \def\ftype@figure{1}
2817 \def\ext@figure{lof}
2818 \def\fnum@figure{\figurename\nobreakspace\thefigure}
2819 % V1.8 within figures add \@IEEEfiguretopskipspace compensation to LaTeX2e's \@floatboxreset
2820 \def\figure{\def\@floatboxreset{\reset@font\normalsize\@setminipage\@IEEEfiguretopskipspace}\@float{figure}}
2821 \def\endfigure{\end@float}
2822 % V1.8 also add \@IEEEfiguretopskipspace compensation to \figure*
2823 \@namedef{figure*}{\def\@floatboxreset{\reset@font\normalsize\@setminipage\@IEEEfiguretopskipspace}\@dblfloat{figure}}
2824 \@namedef{endfigure*}{\end@dblfloat}
2825
2826 \newcounter{table}
2827 \ifCLASSOPTIONcompsoc
2828 \def\thetable{\arabic{table}}
2829 \else
2830 \def\thetable{\@Roman\c@table}
2831 \fi
2832 \def\fps@table{tbp}
2833 \def\ftype@table{2}
2834 \def\ext@table{lot}
2835 \def\fnum@table{\tablename\nobreakspace\thetable}
2836 % V1.6 The IEEE uses 8pt text for tables
2837 % within tables alter LaTeX2e's \@floatboxreset to use \footnotesize
2838 \def\table{\def\@floatboxreset{\reset@font\footnotesize\@setminipage}\@float{table}}
2839 \def\endtable{\end@float}
2840 % v1.6b double column tables need to default to footnotesize as well.
2841 \@namedef{table*}{\def\@floatboxreset{\reset@font\footnotesize\@setminipage}\@dblfloat{table}}
2842 \@namedef{endtable*}{\end@dblfloat}
2843
2844
2845
2846
2847 %% -- Command Argument Scanning Support Functions --
2848 %% V1.8a 
2849
2850 % usage: \@IEEEstripouterbraces*{}
2851 % \@IEEEstripouterbraces fully expands its argument (which it then stores
2852 % in \@IEEEstripouterbracesarg) via \edef, then removes any outer enclosing
2853 % braces, and finally stores the result in the macro
2854 % \@IEEEstrippedouterbraces.
2855 %
2856 % For example:
2857 % \@IEEEstripouterbraces{{{{ab}c}}}
2858 % results in:
2859 %
2860 % \@IEEEstripouterbracesarg ==> a macro containing {{{ab}c}}
2861 % \@IEEEstrippedouterbraces ==> a macro containing {ab}c
2862 %
2863 % the *-star form,\@IEEEstripouterbraces*, does not expand the argument
2864 % contents during processing
2865 \def\@IEEEstripouterbraces{\@ifstar{\let\@IEEEstripouterbracesdef=\def\@@IEEEstripouterbraces}{\let\@IEEEstripouterbracesdef=\edef\@@IEEEstripouterbraces}}
2866
2867 \def\@@IEEEstripouterbraces#1{\@IEEEstripouterbracesdef\@IEEEstripouterbracesarg{#1}\relax
2868 % If the macro is unchanged after being acquired as a single delimited
2869 % argument, we know we have one sequence of tokens without any enclosing
2870 % braces. Loop until this is true.
2871 \loop
2872   \expandafter\@@@IEEEstripouterbraces\@IEEEstripouterbracesarg\@IEEEgeneralsequenceDELIMITER
2873 \ifx\@IEEEstrippedouterbraces\@IEEEstripouterbracesarg
2874 \else
2875   \let\@IEEEstripouterbracesarg\@IEEEstrippedouterbraces
2876 \repeat}
2877
2878 \def\@@@IEEEstripouterbraces#1\@IEEEgeneralsequenceDELIMITER{\def\@IEEEstrippedouterbraces{#1}}
2879
2880
2881
2882 % usage: \@IEEEextractgroup*{}
2883 % \@IEEEextractgroup fully expands its argument (which it then stores in
2884 % \@IEEEextractgrouparg) via \edef and then assigns the first "brace group"
2885 % of tokens to the macro \@IEEEextractedgroup.
2886 % The remaining groups, if any, are stored in the macro
2887 % \@IEEEextractedgroupremain. If the argument does not contain the requisite
2888 % groups, the respective macros will be defined to be empty.
2889 % There is an asymmetry in that \@IEEEextractedgroup is stripped of its first
2890 % outer grouping while \@IEEEextractedgroupremain retains even the outer
2891 % grouping (if present) that originally identified it as a group.
2892 %
2893 % For example:
2894 % \@IEEEextractgroup{{{ab}}{c{de}}}
2895 % results in:
2896 %
2897 % \@IEEEextractgrouparg       ==> a macro containing {{ab}}{c{de}}
2898 % \@IEEEextractedgroup        ==> a macro containing {ab}
2899 % \@IEEEextractedgroupremain  ==> a macro containing {c{de}}
2900 %
2901 % The *-star form, \@IEEEextractgroup*, does not expand its argument
2902 % contents during processing.
2903 \def\@IEEEextractgroup{\@ifstar{\let\@IEEEextractgroupdef=\def\@@IEEEextractgroup}{\let\@IEEEextractgroupdef=\edef\@@IEEEextractgroup}}
2904
2905 \def\@@IEEEextractgroup#1{\@IEEEextractgroupdef\@IEEEextractgrouparg{#1}\relax
2906 % trap the case of an empty extracted group as this would cause problems with
2907 % \@IEEEextractgroupremain's argument acquisition
2908 \ifx\@IEEEextractgrouparg\@empty
2909   \def\@IEEEextractedgroup{}\relax
2910   \def\@IEEEextractedgroupremain{}\relax
2911 \else
2912   % We have to use some dirty tricks here. We want to insert {} around
2913   % whatever remains after the first group so that TeX's argument scanner
2914   % will preserve any originally enclosing braces as well as provide an
2915   % empty argument to acquire even if there isn't a second group.
2916   % In this first of two dirty tricks, we put a } at the end of the structure
2917   % we are going to extract from. The \ifnum0=`{\fi keeps TeX happy to allow
2918   % what would otherwise be an unbalanced macro definition for
2919   % \@@IEEEextractgroup to be acceptable to it.
2920   \ifnum0=`{\fi\expandafter\@IEEEextractgroupremain\@IEEEextractgrouparg}\relax
2921 \fi}
2922
2923 % In the second part of the dirty tricks, we insert a leading { right after
2924 % the first group is acquired, but before the remainder is. Again, the
2925 % \ifnum0=`}\fi keeps TeX happy during definition time, but will disappear
2926 % during run time.
2927 \def\@IEEEextractgroupremain#1{\def\@IEEEextractedgroup{#1}\expandafter\@@IEEEextractgroupremain\expandafter{\ifnum0=`}\fi}
2928
2929 \def\@@IEEEextractgroupremain#1{\def\@IEEEextractedgroupremain{#1}}
2930
2931
2932
2933 % \@IEEEextracttoken relocated at top because margin setting commands rely on it
2934
2935
2936
2937 % usage: \@IEEEextracttokengroups*{}
2938 % \@IEEEextracttokengroups fully expands its argument (which it then stores
2939 % in \@IEEEextracttokengroupsarg) and then assigns the first "brace group" of
2940 % tokens (with the outermost braces removed) to the macro
2941 % \@IEEEextractedfirstgroup.
2942 % The meaning of the first nonbrace (but including the empty group) token
2943 % within this first group is assigned via \let to \@IEEEextractedfirsttoken
2944 % as well as stored in the macro \@IEEEextractedfirsttokenmacro. If a first
2945 % nonbrace token does not exist (or is an empty group), these will be \relax
2946 % and empty, respectively.  Tokens that would otherwise be discarded during
2947 % the acquisition of the first token in the first group are stored in
2948 % \@IEEEextractedfirsttokensdiscarded, however their original relative brace
2949 % nesting depths are not guaranteed to be preserved.
2950 % The first group within this first group is stored in the macro
2951 % \@IEEEextractedfirstfirstgroup.
2952 % Likewise for the next group after the first: \@IEEEextractednextgroup,
2953 % \@IEEEextractednextfirstgroup, \@IEEEextractednextgroupfirsttoken,
2954 % \@IEEEextractednextgroupfirsttokenmacro, and 
2955 % \@IEEEextractednextfirsttokensdiscarded.
2956 % All tokens/groups after the first group, including any enclosing braces,
2957 % are stored in the macro \@IEEEextractedafterfirstgroupremain which will
2958 % be empty if none exist.
2959 %
2960 % For example:
2961 % \@IEEEextracttokengroups{{{ab}{cd}}{{ef}g}}
2962 % will result in:
2963 %
2964 % \@IEEEextracttokengroupsarg             ==> a macro containing {{ab}{cd}}{{ef}g}
2965 % \@IEEEextractedfirstgroup               ==> a macro containing {ab}{cd}
2966 % \@IEEEextractedafterfirstgroupremain    ==> a macro containing {{ef}g}
2967 % \@IEEEextractedfirsttoken               ==> the letter a
2968 % \@IEEEextractedfirsttokenmacro          ==> a macro containing a
2969 % \@IEEEextractedfirsttokensdiscarded     ==> a macro containing bcd
2970 % \@IEEEextractedfirstfirstgroup          ==> a macro containing ab
2971 % \@IEEEextractednextgroup                ==> a macro containing {ef}g
2972 % \@IEEEextractednextfirsttoken           ==> the letter e
2973 % \@IEEEextractednextfirsttokenmacro      ==> a macro containing e
2974 % \@IEEEextractednextfirsttokensdiscarded ==> a macro containing fg
2975 % \@IEEEextractednextfirstgroup           ==> a macro containing ef
2976 %
2977 % If given an empty argument, \@IEEEextractedfirsttoken and
2978 % \@IEEEextractednextfirsttoken will be set to \relax
2979 % and all the macros will be empty.
2980 % the *-star form, \@IEEEextracttokengroups*, does not expand its argument
2981 % contents during processing.
2982 %
2983 % Depends on: \@IEEEextractgroup, \@IEEEextracttoken
2984 \def\@IEEEextracttokengroups{\@ifstar{\let\@IEEEextracttokengroupsdef=\def\@@IEEEextracttokengroups}{\let\@IEEEextracttokengroupsdef=\edef\@@IEEEextracttokengroups}}
2985 \def\@@IEEEextracttokengroups#1{\@IEEEextracttokengroupsdef\@IEEEextracttokengroupsarg{#1}\relax
2986 % begin extraction, these functions are safe with empty arguments
2987 % first group
2988 \expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextracttokengroupsarg}\relax
2989 \let\@IEEEextractedfirstgroup\@IEEEextractedgroup
2990 \let\@IEEEextractedafterfirstgroupremain\@IEEEextractedgroupremain
2991 \expandafter\@IEEEextracttoken\expandafter*\expandafter{\@IEEEextractedfirstgroup}\relax
2992 \let\@IEEEextractedfirsttoken\@IEEEextractedtoken
2993 \let\@IEEEextractedfirsttokenmacro\@IEEEextractedtokenmacro
2994 \let\@IEEEextractedfirsttokensdiscarded\@IEEEextractedtokensdiscarded
2995 % first first group
2996 \expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractedfirstgroup}\relax
2997 \let\@IEEEextractedfirstfirstgroup\@IEEEextractedgroup
2998 % next group
2999 \expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractedafterfirstgroupremain}\relax
3000 \let\@IEEEextractednextgroup\@IEEEextractedgroup
3001 \expandafter\@IEEEextracttoken\expandafter*\expandafter{\@IEEEextractednextgroup}\relax
3002 \let\@IEEEextractednextfirsttoken\@IEEEextractedtoken
3003 \let\@IEEEextractednextfirsttokenmacro\@IEEEextractedtokenmacro
3004 \let\@IEEEextractednextfirsttokensdiscarded\@IEEEextractedtokensdiscarded
3005 % next first group
3006 \expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractednextgroup}\relax
3007 \let\@IEEEextractednextfirstgroup\@IEEEextractedgroup}
3008
3009
3010 %% -- End of Command Argument Scanning Support Functions --
3011
3012
3013
3014
3015 %%
3016 %% START OF IEEEeqnarray DEFINITIONS
3017 %%
3018 %% Inspired by the concepts, examples, and previous works of LaTeX 
3019 %% coders and developers such as Donald Arseneau, Fred Bartlett, 
3020 %% David Carlisle, Tony Liu, Frank Mittelbach, Piet van Oostrum, 
3021 %% Roland Winkler and Mark Wooding.
3022 %% I don't make the claim that my work here is even near their calibre. ;)
3023
3024
3025 \newif\if@IEEEeqnarrayboxnojot% flag to indicate if the environment was called as the star form
3026 \@IEEEeqnarrayboxnojotfalse
3027
3028 \newif\if@advanceIEEEeqncolcnt% tracks if the environment should advance the col counter
3029 % allows a way to make an \IEEEeqnarraybox that can be used within an \IEEEeqnarray
3030 % used by IEEEeqnarraymulticol so that it can work properly in both
3031 \@advanceIEEEeqncolcnttrue
3032
3033 \newcount\@IEEEeqnnumcols % tracks how many IEEEeqnarray cols are defined
3034 \newcount\@IEEEeqncolcnt  % tracks how many IEEEeqnarray cols the user actually used
3035
3036
3037 % The default math style used by the columns
3038 \def\IEEEeqnarraymathstyle{\displaystyle}
3039 % The default text style used by the columns
3040 % default to using the current font
3041 \def\IEEEeqnarraytextstyle{\relax}
3042
3043 % like the iedlistdecl but for \IEEEeqnarray
3044 \def\IEEEeqnarraydecl{\relax}
3045 \def\IEEEeqnarrayboxdecl{\relax}
3046
3047
3048
3049 % V1.8 flags to indicate that equation numbering is to persist
3050 \newif\if@IEEEeqnumpersist%
3051 \@IEEEeqnumpersistfalse
3052 \newif\if@IEEEsubeqnumpersist%
3053 \@IEEEsubeqnumpersistfalse
3054 %
3055 % V1.8 flags to indicate if (sub)equation number of last line was preadvanced
3056 \newif\if@IEEEeqnumpreadv%
3057 \@IEEEeqnumpreadvfalse
3058 \newif\if@IEEEsubeqnumpreadv%
3059 \@IEEEsubeqnumpreadvfalse
3060
3061 \newcount\@IEEEsubeqnnumrollback% saves previous value of IEEEsubequation number in case we need to restore it
3062
3063 % \yesnumber is the opposite of \nonumber
3064 % a novel concept with the same def as the equationarray package
3065 % However, we give IEEE versions too since some LaTeX packages such as 
3066 % the MDWtools mathenv.sty redefine \nonumber to something else.
3067 % This command is intended for use in non-IEEEeqnarray math environments
3068 \providecommand{\yesnumber}{\global\@eqnswtrue}
3069
3070
3071 % IEEEyes/nonumber 
3072 % V1.8 add persistant * forms
3073 % These commands can alter the type of equation an IEEEeqnarray line is.
3074 \def\IEEEyesnumber{\@ifstar{\global\@IEEEeqnumpersisttrue\global\@IEEEsubeqnumpersistfalse\@IEEEyesnumber}{\@IEEEyesnumber}}
3075
3076 \def\@IEEEyesnumber{\global\@eqnswtrue
3077 \if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray
3078 \ifnum\c@IEEEsubequation>0\relax
3079    \stepcounter{equation}\setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax
3080    \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label
3081 \fi
3082 % even if we reached this eqn num via a preadv, it is legit now
3083 \global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse
3084 \fi}
3085
3086 \def\IEEEnonumber{\@ifstar{\global\@IEEEeqnumpersistfalse\global\@IEEEsubeqnumpersistfalse\global\@eqnswfalse}{\global\@eqnswfalse}}
3087
3088
3089 \def\IEEEyessubnumber{\@ifstar{\global\@IEEEsubeqnumpersisttrue\@IEEEyessubnumber}{\@IEEEyessubnumber}}
3090 %
3091 \def\@IEEEyessubnumber{\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray
3092   \ifnum\c@IEEEsubequation>0\relax% if it already is a subequation, we are good to go as-is
3093   \else% if we are a regular equation we have to watch out for two cases
3094     \if@IEEEeqnumpreadv% if this equation is the result of a preadvance, backout and bump the sub eqnnum
3095        \global\advance\c@equation\m@ne\global\c@IEEEsubequation=\@IEEEsubeqnnumrollback\addtocounter{IEEEsubequation}{1}\relax
3096     \else% non-preadvanced equations just need initialization of their sub eqnnum
3097        \setcounter{IEEEsubequation}{1}\relax
3098     \fi
3099   \fi% fi already is subequation
3100   \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax
3101   \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label
3102   \global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse% no longer a preadv anymore
3103   \global\@eqnswtrue
3104 \fi}
3105
3106
3107 \def\IEEEnosubnumber{\@ifstar{\global\@IEEEsubeqnumpersistfalse\@IEEEnosubnumber}{\@IEEEnosubnumber}}
3108 %
3109 \def\@IEEEnosubnumber{\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray
3110   \if@eqnsw % we do nothing unless we know we will display because we play with the counters here
3111     % if it currently is a subequation, bump up to the next equation number and turn off the subequation
3112     \ifnum\c@IEEEsubequation>0\relax\addtocounter{equation}{1}\setcounter{IEEEsubequation}{0}\relax
3113     \fi
3114     \global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse% no longer a preadv anymore
3115     \gdef\@currentlabel{\p@equation\theequation}\relax
3116     \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label
3117   \fi
3118 \fi}
3119
3120
3121
3122 % allows users to "push away" equations that get too close to the equation numbers
3123 \def\IEEEeqnarraynumspace{\hphantom{\ifnum\c@IEEEsubequation>0\relax\theIEEEsubequationdis\else\theequationdis\fi}}
3124
3125 % provides a way to span multiple columns within IEEEeqnarray environments
3126 % will consider \if@advanceIEEEeqncolcnt before globally advancing the
3127 % column counter - so as to work within \IEEEeqnarraybox
3128 % usage: \IEEEeqnarraymulticol{number cols. to span}{col type}{cell text}
3129 \long\def\IEEEeqnarraymulticol#1#2#3{\multispan{#1}\relax
3130 % check if column is defined for the precolumn definition
3131 % We have to be careful here because TeX scans for & even within an \iffalse
3132 % where it does not expand macros. So, if we used only one \ifx and a #3
3133 % appeared in the false branch and the user inserted another alignment
3134 % structure that uses & in the \IEEEeqnarraymulticol{}, TeX will not see that
3135 % there is an inner alignment in the false branch yet still will see any &
3136 % there and will think that they apply to the outer alignment resulting in an
3137 % incomplete \ifx error.
3138 % So, here we use separate checks for the pre and post parts in order to keep
3139 % the #3 outside of all conditionals.
3140 \relax\expandafter\ifx\csname @IEEEeqnarraycolDEF#2\endcsname\@IEEEeqnarraycolisdefined\relax
3141 \csname @IEEEeqnarraycolPRE#2\endcsname
3142 \else% if not, error and use default type
3143 \@IEEEclspkgerror{Invalid column type "#2" in \string\IEEEeqnarraymulticol.\MessageBreak
3144 Using a default centering column instead}%
3145 {You must define IEEEeqnarray column types before use.}%
3146 \csname @IEEEeqnarraycolPRE@IEEEdefault\endcsname
3147 \fi
3148 % The ten \relax are to help prevent misleading error messages in case a user
3149 % accidently inserted a macro that tries to acquire additional arguments.
3150 #3\relax\relax\relax\relax\relax\relax\relax\relax\relax\relax
3151 % check if column is defined for the postcolumn definition
3152 \expandafter\ifx\csname @IEEEeqnarraycolDEF#2\endcsname\@IEEEeqnarraycolisdefined\relax
3153 \csname @IEEEeqnarraycolPOST#2\endcsname
3154 \else% if not, use the default type
3155 \csname @IEEEeqnarraycolPOST@IEEEdefault\endcsname
3156 \fi
3157 % advance column counter only if the IEEEeqnarray environment wants it
3158 \if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by #1\relax\fi}
3159
3160 % like \omit, but maintains track of the column counter for \IEEEeqnarray
3161 \def\IEEEeqnarrayomit{\omit\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by 1\relax\fi}
3162
3163
3164 % provides a way to define a letter referenced column type
3165 % usage: \IEEEeqnarraydefcol{col. type letter/name}{pre insertion text}{post insertion text}
3166 \def\IEEEeqnarraydefcol#1#2#3{\expandafter\def\csname @IEEEeqnarraycolPRE#1\endcsname{#2}%
3167 \expandafter\def\csname @IEEEeqnarraycolPOST#1\endcsname{#3}%
3168 \expandafter\def\csname @IEEEeqnarraycolDEF#1\endcsname{1}}
3169
3170
3171 % provides a way to define a numerically referenced inter-column glue types
3172 % usage: \IEEEeqnarraydefcolsep{col. glue number}{glue definition}
3173 \def\IEEEeqnarraydefcolsep#1#2{\expandafter\def\csname @IEEEeqnarraycolSEP\romannumeral #1\endcsname{#2}%
3174 \expandafter\def\csname @IEEEeqnarraycolSEPDEF\romannumeral #1\endcsname{1}}
3175
3176
3177 \def\@IEEEeqnarraycolisdefined{1}% just a macro for 1, used for checking undefined column types
3178
3179
3180 % expands and appends the given argument to the \@IEEEtrantmptoksA token list
3181 % used to build up the \halign preamble
3182 \def\@IEEEappendtoksA#1{\edef\@@IEEEappendtoksA{\@IEEEtrantmptoksA={\the\@IEEEtrantmptoksA #1}}%
3183 \@@IEEEappendtoksA}
3184
3185 % also appends to \@IEEEtrantmptoksA, but does not expand the argument
3186 % uses \toks8 as a scratchpad register
3187 \def\@IEEEappendNOEXPANDtoksA#1{\toks8={#1}%
3188 \edef\@@IEEEappendNOEXPANDtoksA{\@IEEEtrantmptoksA={\the\@IEEEtrantmptoksA\the\toks8}}%
3189 \@@IEEEappendNOEXPANDtoksA}
3190
3191 % define some common column types for the user
3192 % math
3193 \IEEEeqnarraydefcol{l}{$\IEEEeqnarraymathstyle}{$\hfil}
3194 \IEEEeqnarraydefcol{c}{\hfil$\IEEEeqnarraymathstyle}{$\hfil}
3195 \IEEEeqnarraydefcol{r}{\hfil$\IEEEeqnarraymathstyle}{$}
3196 \IEEEeqnarraydefcol{L}{$\IEEEeqnarraymathstyle{}}{{}$\hfil}
3197 \IEEEeqnarraydefcol{C}{\hfil$\IEEEeqnarraymathstyle{}}{{}$\hfil}
3198 \IEEEeqnarraydefcol{R}{\hfil$\IEEEeqnarraymathstyle{}}{{}$}
3199 % text
3200 \IEEEeqnarraydefcol{s}{\IEEEeqnarraytextstyle}{\hfil}
3201 \IEEEeqnarraydefcol{t}{\hfil\IEEEeqnarraytextstyle}{\hfil}
3202 \IEEEeqnarraydefcol{u}{\hfil\IEEEeqnarraytextstyle}{}
3203
3204 % vertical rules
3205 \IEEEeqnarraydefcol{v}{}{\vrule width\arrayrulewidth}
3206 \IEEEeqnarraydefcol{vv}{\vrule width\arrayrulewidth\hfil}{\hfil\vrule width\arrayrulewidth}
3207 \IEEEeqnarraydefcol{V}{}{\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth}
3208 \IEEEeqnarraydefcol{VV}{\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth\hfil}%
3209 {\hfil\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth}
3210
3211 % horizontal rules
3212 \IEEEeqnarraydefcol{h}{}{\leaders\hrule height\arrayrulewidth\hfil}
3213 \IEEEeqnarraydefcol{H}{}{\leaders\vbox{\hrule width\arrayrulewidth\vskip\doublerulesep\hrule width\arrayrulewidth}\hfil}
3214
3215 % plain
3216 \IEEEeqnarraydefcol{x}{}{}
3217 \IEEEeqnarraydefcol{X}{$}{$}
3218
3219 % the default column type to use in the event a column type is not defined
3220 \IEEEeqnarraydefcol{@IEEEdefault}{\hfil$\IEEEeqnarraymathstyle}{$\hfil}
3221
3222
3223 % a zero tabskip (used for "-" col types)
3224 \def\@IEEEeqnarraycolSEPzero{0pt plus 0pt minus 0pt}
3225 % a centering tabskip (used for "+" col types)
3226 \def\@IEEEeqnarraycolSEPcenter{1000pt plus 0pt minus 1000pt}
3227
3228 % top level default tabskip glues for the start, end, and inter-column
3229 % may be reset within environments not always at the top level, e.g., \IEEEeqnarraybox
3230 \edef\@IEEEeqnarraycolSEPdefaultstart{\@IEEEeqnarraycolSEPcenter}% default start glue
3231 \edef\@IEEEeqnarraycolSEPdefaultend{\@IEEEeqnarraycolSEPcenter}% default end glue
3232 \edef\@IEEEeqnarraycolSEPdefaultmid{\@IEEEeqnarraycolSEPzero}% default inter-column glue
3233
3234
3235
3236 % creates a vertical rule that extends from the bottom to the top a a cell
3237 % Provided in case other packages redefine \vline some other way.
3238 % usage: \IEEEeqnarrayvrule[rule thickness]
3239 % If no argument is provided, \arrayrulewidth will be used for the rule thickness. 
3240 \newcommand\IEEEeqnarrayvrule[1][\arrayrulewidth]{\vrule\@width#1\relax}
3241
3242 % creates a blank separator row
3243 % usage: \IEEEeqnarrayseprow[separation length][font size commands]
3244 % default is \IEEEeqnarrayseprow[0.25\normalbaselineskip][\relax]
3245 % blank arguments inherit the default values
3246 % uses \skip5 as a scratch register - calls \@IEEEeqnarraystrutsize which uses more scratch registers
3247 \def\IEEEeqnarrayseprow{\relax\@ifnextchar[{\@IEEEeqnarrayseprow}{\@IEEEeqnarrayseprow[0.25\normalbaselineskip]}}
3248 \def\@IEEEeqnarrayseprow[#1]{\relax\@ifnextchar[{\@@IEEEeqnarrayseprow[#1]}{\@@IEEEeqnarrayseprow[#1][\relax]}}
3249 \def\@@IEEEeqnarrayseprow[#1][#2]{\def\@IEEEeqnarrayseprowARGONE{#1}%
3250 \ifx\@IEEEeqnarrayseprowARGONE\@empty%
3251 % get the skip value, based on the font commands
3252 % use skip5 because \IEEEeqnarraystrutsize uses \skip0, \skip2, \skip3
3253 % assign within a bogus box to confine the font changes
3254 {\setbox0=\hbox{#2\relax\global\skip5=0.25\normalbaselineskip}}%
3255 \else%
3256 {\setbox0=\hbox{#2\relax\global\skip5=#1}}%
3257 \fi%
3258 \@IEEEeqnarrayhoptolastcolumn\IEEEeqnarraystrutsize{\skip5}{0pt}[\relax]\relax}
3259
3260 % creates a blank separator row, but omits all the column templates
3261 % usage: \IEEEeqnarrayseprowcut[separation length][font size commands]
3262 % default is \IEEEeqnarrayseprowcut[0.25\normalbaselineskip][\relax]
3263 % blank arguments inherit the default values
3264 % uses \skip5 as a scratch register - calls \@IEEEeqnarraystrutsize which uses more scratch registers
3265 \def\IEEEeqnarrayseprowcut{\multispan{\@IEEEeqnnumcols}\relax% span all the cols
3266 % advance column counter only if the IEEEeqnarray environment wants it
3267 \if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi%
3268 \@ifnextchar[{\@IEEEeqnarrayseprowcut}{\@IEEEeqnarrayseprowcut[0.25\normalbaselineskip]}}
3269 \def\@IEEEeqnarrayseprowcut[#1]{\relax\@ifnextchar[{\@@IEEEeqnarrayseprowcut[#1]}{\@@IEEEeqnarrayseprowcut[#1][\relax]}}
3270 \def\@@IEEEeqnarrayseprowcut[#1][#2]{\def\@IEEEeqnarrayseprowARGONE{#1}%
3271 \ifx\@IEEEeqnarrayseprowARGONE\@empty%
3272 % get the skip value, based on the font commands
3273 % use skip5 because \IEEEeqnarraystrutsize uses \skip0, \skip2, \skip3
3274 % assign within a bogus box to confine the font changes
3275 {\setbox0=\hbox{#2\relax\global\skip5=0.25\normalbaselineskip}}%
3276 \else%
3277 {\setbox0=\hbox{#2\relax\global\skip5=#1}}%
3278 \fi%
3279 \IEEEeqnarraystrutsize{\skip5}{0pt}[\relax]\relax}
3280
3281
3282
3283 % draws a single rule across all the columns optional
3284 % argument determines the rule width, \arrayrulewidth is the default
3285 % updates column counter as needed and turns off struts
3286 % usage: \IEEEeqnarrayrulerow[rule line thickness]
3287 \def\IEEEeqnarrayrulerow{\multispan{\@IEEEeqnnumcols}\relax% span all the cols
3288 % advance column counter only if the IEEEeqnarray environment wants it
3289 \if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi%
3290 \@ifnextchar[{\@IEEEeqnarrayrulerow}{\@IEEEeqnarrayrulerow[\arrayrulewidth]}}
3291 \def\@IEEEeqnarrayrulerow[#1]{\leaders\hrule height#1\hfil\relax% put in our rule 
3292 % turn off any struts
3293 \IEEEeqnarraystrutsize{0pt}{0pt}[\relax]\relax}
3294
3295
3296 % draws a double rule by using a single rule row, a separator row, and then
3297 % another single rule row 
3298 % first optional argument determines the rule thicknesses, \arrayrulewidth is the default
3299 % second optional argument determines the rule spacing, \doublerulesep is the default
3300 % usage: \IEEEeqnarraydblrulerow[rule line thickness][rule spacing]
3301 \def\IEEEeqnarraydblrulerow{\multispan{\@IEEEeqnnumcols}\relax% span all the cols
3302 % advance column counter only if the IEEEeqnarray environment wants it
3303 \if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi%
3304 \@ifnextchar[{\@IEEEeqnarraydblrulerow}{\@IEEEeqnarraydblrulerow[\arrayrulewidth]}}
3305 \def\@IEEEeqnarraydblrulerow[#1]{\relax\@ifnextchar[{\@@IEEEeqnarraydblrulerow[#1]}%
3306 {\@@IEEEeqnarraydblrulerow[#1][\doublerulesep]}}
3307 \def\@@IEEEeqnarraydblrulerow[#1][#2]{\def\@IEEEeqnarraydblrulerowARG{#1}%
3308 % we allow the user to say \IEEEeqnarraydblrulerow[][]
3309 \ifx\@IEEEeqnarraydblrulerowARG\@empty%
3310 \@IEEEeqnarrayrulerow[\arrayrulewidth]%
3311 \else%
3312 \@IEEEeqnarrayrulerow[#1]\relax%
3313 \fi%
3314 \def\@IEEEeqnarraydblrulerowARG{#2}%
3315 \ifx\@IEEEeqnarraydblrulerowARG\@empty%
3316 \\\IEEEeqnarrayseprow[\doublerulesep][\relax]%
3317 \else%
3318 \\\IEEEeqnarrayseprow[#2][\relax]%
3319 \fi%
3320 \\\multispan{\@IEEEeqnnumcols}%
3321 % advance column counter only if the IEEEeqnarray environment wants it
3322 \if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi%
3323 \def\@IEEEeqnarraydblrulerowARG{#1}%
3324 \ifx\@IEEEeqnarraydblrulerowARG\@empty%
3325 \@IEEEeqnarrayrulerow[\arrayrulewidth]%
3326 \else%
3327 \@IEEEeqnarrayrulerow[#1]%
3328 \fi%
3329 }
3330
3331 % draws a double rule by using a single rule row, a separator (cutting) row, and then
3332 % another single rule row 
3333 % first optional argument determines the rule thicknesses, \arrayrulewidth is the default
3334 % second optional argument determines the rule spacing, \doublerulesep is the default
3335 % usage: \IEEEeqnarraydblrulerow[rule line thickness][rule spacing]
3336 \def\IEEEeqnarraydblrulerowcut{\multispan{\@IEEEeqnnumcols}\relax% span all the cols
3337 % advance column counter only if the IEEEeqnarray environment wants it
3338 \if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi%
3339 \@ifnextchar[{\@IEEEeqnarraydblrulerowcut}{\@IEEEeqnarraydblrulerowcut[\arrayrulewidth]}}
3340 \def\@IEEEeqnarraydblrulerowcut[#1]{\relax\@ifnextchar[{\@@IEEEeqnarraydblrulerowcut[#1]}%
3341 {\@@IEEEeqnarraydblrulerowcut[#1][\doublerulesep]}}
3342 \def\@@IEEEeqnarraydblrulerowcut[#1][#2]{\def\@IEEEeqnarraydblrulerowARG{#1}%
3343 % we allow the user to say \IEEEeqnarraydblrulerow[][]
3344 \ifx\@IEEEeqnarraydblrulerowARG\@empty%
3345 \@IEEEeqnarrayrulerow[\arrayrulewidth]%
3346 \else%
3347 \@IEEEeqnarrayrulerow[#1]%
3348 \fi%
3349 \def\@IEEEeqnarraydblrulerowARG{#2}%
3350 \ifx\@IEEEeqnarraydblrulerowARG\@empty%
3351 \\\IEEEeqnarrayseprowcut[\doublerulesep][\relax]%
3352 \else%
3353 \\\IEEEeqnarrayseprowcut[#2][\relax]%
3354 \fi%
3355 \\\multispan{\@IEEEeqnnumcols}%
3356 % advance column counter only if the IEEEeqnarray environment wants it
3357 \if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi%
3358 \def\@IEEEeqnarraydblrulerowARG{#1}%
3359 \ifx\@IEEEeqnarraydblrulerowARG\@empty%
3360 \@IEEEeqnarrayrulerow[\arrayrulewidth]%
3361 \else%
3362 \@IEEEeqnarrayrulerow[#1]%
3363 \fi%
3364 }
3365
3366
3367
3368 % inserts a full row's worth of &'s
3369 % relies on \@IEEEeqnnumcols to provide the correct number of columns
3370 % uses \@IEEEtrantmptoksA, \count0 as scratch registers
3371 \def\@IEEEeqnarrayhoptolastcolumn{\@IEEEtrantmptoksA={}\count0=1\relax%
3372 \loop% add cols if the user did not use them all
3373 \ifnum\count0<\@IEEEeqnnumcols\relax%
3374 \@IEEEappendtoksA{&}%
3375 \advance\count0 by 1\relax% update the col count
3376 \repeat%
3377 \the\@IEEEtrantmptoksA%execute the &'s
3378 }
3379
3380
3381
3382 \newif\if@IEEEeqnarrayISinner % flag to indicate if we are within the lines
3383 \@IEEEeqnarrayISinnerfalse    % of an IEEEeqnarray - after the IEEEeqnarraydecl
3384
3385 \edef\@IEEEeqnarrayTHEstrutheight{0pt} % height and depth of IEEEeqnarray struts
3386 \edef\@IEEEeqnarrayTHEstrutdepth{0pt}
3387
3388 \edef\@IEEEeqnarrayTHEmasterstrutheight{0pt} % default height and depth of
3389 \edef\@IEEEeqnarrayTHEmasterstrutdepth{0pt}  % struts within an IEEEeqnarray
3390
3391 \edef\@IEEEeqnarrayTHEmasterstrutHSAVE{0pt} % saved master strut height
3392 \edef\@IEEEeqnarrayTHEmasterstrutDSAVE{0pt} % and depth
3393
3394 \newif\if@IEEEeqnarrayusemasterstrut % flag to indicate that the master strut value
3395 \@IEEEeqnarrayusemasterstruttrue     % is to be used
3396
3397
3398
3399 % saves the strut height and depth of the master strut
3400 \def\@IEEEeqnarraymasterstrutsave{\relax%
3401 \expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax%
3402 \expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax%
3403 % remove stretchability
3404 \dimen0\skip0\relax%
3405 \dimen2\skip2\relax%
3406 % save values
3407 \edef\@IEEEeqnarrayTHEmasterstrutHSAVE{\the\dimen0}%
3408 \edef\@IEEEeqnarrayTHEmasterstrutDSAVE{\the\dimen2}}
3409
3410 % restores the strut height and depth of the master strut
3411 \def\@IEEEeqnarraymasterstrutrestore{\relax%
3412 \expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutHSAVE\relax%
3413 \expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutDSAVE\relax%
3414 % remove stretchability
3415 \dimen0\skip0\relax%
3416 \dimen2\skip2\relax%
3417 % restore values
3418 \edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}%
3419 \edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}}
3420
3421
3422 % globally restores the strut height and depth to the 
3423 % master values and sets the master strut flag to true
3424 \def\@IEEEeqnarraystrutreset{\relax%
3425 \expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax%
3426 \expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax%
3427 % remove stretchability
3428 \dimen0\skip0\relax%
3429 \dimen2\skip2\relax%
3430 % restore values
3431 \xdef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}%
3432 \xdef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}%
3433 \global\@IEEEeqnarrayusemasterstruttrue}
3434
3435
3436 % if the master strut is not to be used, make the current
3437 % values of \@IEEEeqnarrayTHEstrutheight, \@IEEEeqnarrayTHEstrutdepth
3438 % and the use master strut flag, global
3439 % this allows user strut commands issued in the last column to be carried
3440 % into the isolation/strut column
3441 \def\@IEEEeqnarrayglobalizestrutstatus{\relax%
3442 \if@IEEEeqnarrayusemasterstrut\else%
3443 \xdef\@IEEEeqnarrayTHEstrutheight{\@IEEEeqnarrayTHEstrutheight}%
3444 \xdef\@IEEEeqnarrayTHEstrutdepth{\@IEEEeqnarrayTHEstrutdepth}%
3445 \global\@IEEEeqnarrayusemasterstrutfalse%
3446 \fi}
3447
3448
3449
3450 % usage: \IEEEeqnarraystrutsize{height}{depth}[font size commands]
3451 % If called outside the lines of an IEEEeqnarray, sets the height
3452 % and depth of both the master and local struts. If called inside
3453 % an IEEEeqnarray line, sets the height and depth of the local strut
3454 % only and sets the flag to indicate the use of the local strut
3455 % values. If the height or depth is left blank, 0.7\normalbaselineskip
3456 % and 0.3\normalbaselineskip will be used, respectively.
3457 % The optional argument can be used to evaluate the lengths under
3458 % a different font size and styles. If none is specified, the current
3459 % font is used.
3460 % uses scratch registers \skip0, \skip2, \skip3, \dimen0, \dimen2
3461 \def\IEEEeqnarraystrutsize#1#2{\relax\@ifnextchar[{\@IEEEeqnarraystrutsize{#1}{#2}}{\@IEEEeqnarraystrutsize{#1}{#2}[\relax]}}
3462 \def\@IEEEeqnarraystrutsize#1#2[#3]{\def\@IEEEeqnarraystrutsizeARG{#1}%
3463 \ifx\@IEEEeqnarraystrutsizeARG\@empty%
3464 {\setbox0=\hbox{#3\relax\global\skip3=0.7\normalbaselineskip}}%
3465 \skip0=\skip3\relax%
3466 \else% arg one present
3467 {\setbox0=\hbox{#3\relax\global\skip3=#1\relax}}%
3468 \skip0=\skip3\relax%
3469 \fi% if null arg
3470 \def\@IEEEeqnarraystrutsizeARG{#2}%
3471 \ifx\@IEEEeqnarraystrutsizeARG\@empty%
3472 {\setbox0=\hbox{#3\relax\global\skip3=0.3\normalbaselineskip}}%
3473 \skip2=\skip3\relax%
3474 \else% arg two present
3475 {\setbox0=\hbox{#3\relax\global\skip3=#2\relax}}%
3476 \skip2=\skip3\relax%
3477 \fi% if null arg
3478 % remove stretchability, just to be safe
3479 \dimen0\skip0\relax%
3480 \dimen2\skip2\relax%
3481 % dimen0 = height, dimen2 = depth
3482 \if@IEEEeqnarrayISinner% inner does not touch master strut size
3483 \edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}%
3484 \edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}%
3485 \@IEEEeqnarrayusemasterstrutfalse% do not use master
3486 \else% outer, have to set master strut too
3487 \edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}%
3488 \edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}%
3489 \edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}%
3490 \edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}%
3491 \@IEEEeqnarrayusemasterstruttrue% use master strut
3492 \fi}
3493
3494
3495 % usage: \IEEEeqnarraystrutsizeadd{added height}{added depth}[font size commands]
3496 % If called outside the lines of an IEEEeqnarray, adds the given height
3497 % and depth to both the master and local struts.
3498 % If called inside an IEEEeqnarray line, adds the given height and depth
3499 % to the local strut only and sets the flag to indicate the use 
3500 % of the local strut values.
3501 % In both cases, if a height or depth is left blank, 0pt is used instead.
3502 % The optional argument can be used to evaluate the lengths under
3503 % a different font size and styles. If none is specified, the current
3504 % font is used.
3505 % uses scratch registers \skip0, \skip2, \skip3, \dimen0, \dimen2
3506 \def\IEEEeqnarraystrutsizeadd#1#2{\relax\@ifnextchar[{\@IEEEeqnarraystrutsizeadd{#1}{#2}}{\@IEEEeqnarraystrutsizeadd{#1}{#2}[\relax]}}
3507 \def\@IEEEeqnarraystrutsizeadd#1#2[#3]{\def\@IEEEeqnarraystrutsizearg{#1}%
3508 \ifx\@IEEEeqnarraystrutsizearg\@empty%
3509 \skip0=0pt\relax%
3510 \else% arg one present
3511 {\setbox0=\hbox{#3\relax\global\skip3=#1}}%
3512 \skip0=\skip3\relax%
3513 \fi% if null arg
3514 \def\@IEEEeqnarraystrutsizearg{#2}%
3515 \ifx\@IEEEeqnarraystrutsizearg\@empty%
3516 \skip2=0pt\relax%
3517 \else% arg two present
3518 {\setbox0=\hbox{#3\relax\global\skip3=#2}}%
3519 \skip2=\skip3\relax%
3520 \fi% if null arg
3521 % remove stretchability, just to be safe
3522 \dimen0\skip0\relax%
3523 \dimen2\skip2\relax%
3524 % dimen0 = height, dimen2 = depth
3525 \if@IEEEeqnarrayISinner% inner does not touch master strut size
3526 % get local strut size
3527 \expandafter\skip0=\@IEEEeqnarrayTHEstrutheight\relax%
3528 \expandafter\skip2=\@IEEEeqnarrayTHEstrutdepth\relax%
3529 % add it to the user supplied values
3530 \advance\dimen0 by \skip0\relax%
3531 \advance\dimen2 by \skip2\relax%
3532 % update the local strut size
3533 \edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}%
3534 \edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}%
3535 \@IEEEeqnarrayusemasterstrutfalse% do not use master
3536 \else% outer, have to set master strut too
3537 % get master strut size
3538 \expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax%
3539 \expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax%
3540 % add it to the user supplied values
3541 \advance\dimen0 by \skip0\relax%
3542 \advance\dimen2 by \skip2\relax%
3543 % update the local and master strut sizes
3544 \edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}%
3545 \edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}%
3546 \edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}%
3547 \edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}%
3548 \@IEEEeqnarrayusemasterstruttrue% use master strut
3549 \fi}
3550
3551
3552 % allow user a way to see the struts
3553 \newif\ifIEEEvisiblestruts
3554 \IEEEvisiblestrutsfalse
3555
3556 % inserts an invisible strut using the master or local strut values
3557 % uses scratch registers \skip0, \skip2, \dimen0, \dimen2
3558 \def\@IEEEeqnarrayinsertstrut{\relax%
3559 \if@IEEEeqnarrayusemasterstrut
3560 % get master strut size
3561 \expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax%
3562 \expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax%
3563 \else%
3564 % get local strut size
3565 \expandafter\skip0=\@IEEEeqnarrayTHEstrutheight\relax%
3566 \expandafter\skip2=\@IEEEeqnarrayTHEstrutdepth\relax%
3567 \fi%
3568 % remove stretchability, probably not needed
3569 \dimen0\skip0\relax%
3570 \dimen2\skip2\relax%
3571 % dimen0 = height, dimen2 = depth
3572 % allow user to see struts if desired
3573 \ifIEEEvisiblestruts%
3574 \vrule width0.2pt height\dimen0 depth\dimen2\relax%
3575 \else%
3576 \vrule width0pt height\dimen0 depth\dimen2\relax\fi}
3577
3578
3579 % creates an invisible strut, useable even outside \IEEEeqnarray
3580 % if \IEEEvisiblestrutstrue, the strut will be visible and 0.2pt wide. 
3581 % usage: \IEEEstrut[height][depth][font size commands]
3582 % default is \IEEEstrut[0.7\normalbaselineskip][0.3\normalbaselineskip][\relax]
3583 % blank arguments inherit the default values
3584 % uses \dimen0, \dimen2, \skip0, \skip2
3585 \def\IEEEstrut{\relax\@ifnextchar[{\@IEEEstrut}{\@IEEEstrut[0.7\normalbaselineskip]}}
3586 \def\@IEEEstrut[#1]{\relax\@ifnextchar[{\@@IEEEstrut[#1]}{\@@IEEEstrut[#1][0.3\normalbaselineskip]}}
3587 \def\@@IEEEstrut[#1][#2]{\relax\@ifnextchar[{\@@@IEEEstrut[#1][#2]}{\@@@IEEEstrut[#1][#2][\relax]}}
3588 \def\@@@IEEEstrut[#1][#2][#3]{\mbox{#3\relax%
3589 \def\@IEEEstrutARG{#1}%
3590 \ifx\@IEEEstrutARG\@empty%
3591 \skip0=0.7\normalbaselineskip\relax%
3592 \else%
3593 \skip0=#1\relax%
3594 \fi%
3595 \def\@IEEEstrutARG{#2}%
3596 \ifx\@IEEEstrutARG\@empty%
3597 \skip2=0.3\normalbaselineskip\relax%
3598 \else%
3599 \skip2=#2\relax%
3600 \fi%
3601 % remove stretchability, probably not needed
3602 \dimen0\skip0\relax%
3603 \dimen2\skip2\relax%
3604 \ifIEEEvisiblestruts%
3605 \vrule width0.2pt height\dimen0 depth\dimen2\relax%
3606 \else%
3607 \vrule width0.0pt height\dimen0 depth\dimen2\relax\fi}}
3608
3609
3610 % enables strut mode by setting a default strut size and then zeroing the
3611 % \baselineskip, \lineskip, \lineskiplimit and \jot
3612 \def\IEEEeqnarraystrutmode{\IEEEeqnarraystrutsize{0.7\normalbaselineskip}{0.3\normalbaselineskip}[\relax]%
3613 \baselineskip=0pt\lineskip=0pt\lineskiplimit=0pt\jot=0pt}
3614
3615
3616 % equation and subequation forms to use to setup hyperref's \@currentHref
3617 \def\@IEEEtheHrefequation{equation.\theHequation}
3618 \def\@IEEEtheHrefsubequation{equation.\theHequation\alph{IEEEsubequation}}
3619
3620
3621 \def\IEEEeqnarray{\@IEEEeqnumpersisttrue\@IEEEsubeqnumpersistfalse\@IEEEeqnarray}
3622 \def\endIEEEeqnarray{\end@IEEEeqnarray}
3623
3624 \@namedef{IEEEeqnarray*}{\@IEEEeqnumpersistfalse\@IEEEsubeqnumpersistfalse\@IEEEeqnarray}
3625 \@namedef{endIEEEeqnarray*}{\end@IEEEeqnarray}
3626
3627
3628 % \IEEEeqnarray is an enhanced \eqnarray. 
3629 % The star form defaults to not putting equation numbers at the end of each row.
3630 % usage: \IEEEeqnarray[decl]{cols}
3631 \def\@IEEEeqnarray{\relax\@ifnextchar[{\@@IEEEeqnarray}{\@@IEEEeqnarray[\relax]}}
3632 % We have to be careful here to normalize catcodes just before acquiring the
3633 % cols as that specification may contain punctuation which could be subject
3634 % to document catcode changes.
3635 \def\@@IEEEeqnarray[#1]{\begingroup\IEEEnormalcatcodes\@@@IEEEeqnarray[#1]}
3636 \def\@@@IEEEeqnarray[#1]#2{\endgroup
3637    % default to showing the equation number or not based on whether or not
3638    % the star form was involked
3639    \if@IEEEeqnumpersist\global\@eqnswtrue
3640    \else% not the star form
3641    \global\@eqnswfalse
3642    \fi% if star form
3643    % provide a basic hyperref \theHequation if this has not already been setup (hyperref not loaded, or no section counter)
3644    \@ifundefined{theHequation}{\def\theHequation{\arabic{equation}}}{}\relax
3645    % provide dummy hyperref commands in case hyperref is not loaded
3646    \providecommand{\Hy@raisedlink}[1]{}\relax
3647    \providecommand{\hyper@anchorstart}[1]{}\relax
3648    \providecommand{\hyper@anchorend}{}\relax
3649    \providecommand{\@currentHref}{}\relax
3650    \@IEEEeqnumpreadvfalse% reset eqnpreadv flag
3651    \@IEEEsubeqnumpreadvfalse% reset subeqnpreadv flag
3652    \@IEEEeqnarrayISinnerfalse% not yet within the lines of the halign
3653    \@IEEEeqnarraystrutsize{0pt}{0pt}[\relax]% turn off struts by default
3654    \@IEEEeqnarrayusemasterstruttrue% use master strut till user asks otherwise
3655    \IEEEvisiblestrutsfalse% diagnostic mode defaults to off
3656    % no extra space unless the user specifically requests it
3657    \lineskip=0pt\relax
3658    \lineskiplimit=0pt\relax
3659    \baselineskip=\normalbaselineskip\relax%
3660    \jot=\IEEEnormaljot\relax%
3661    \mathsurround\z@\relax% no extra spacing around math
3662    \@advanceIEEEeqncolcnttrue% advance the col counter for each col the user uses, 
3663                              % used in \IEEEeqnarraymulticol and in the preamble build
3664    %V1.8 Here we preadvance to the next equation number.
3665    % If the user later wants a continued subequation, we can roll back.
3666    \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation%
3667    \stepcounter{equation}\@IEEEeqnumpreadvtrue% advance equation counter before first line
3668    \setcounter{IEEEsubequation}{0}% no subequation yet
3669    \let\@IEEEcurrentlabelsave\@currentlabel% save current label as we later change it globally
3670    \let\@IEEEcurrentHrefsave\@currentHref% save current href label as we later change it globally
3671    \def\@currentlabel{\p@equation\theequation}% redefine the ref label
3672    \def\@currentHref{\@IEEEtheHrefequation}% setup hyperref label
3673    \IEEEeqnarraydecl\relax% allow a way for the user to make global overrides
3674    #1\relax% allow user to override defaults
3675    \let\\\@IEEEeqnarraycr% replace newline with one that can put in eqn. numbers
3676    \global\@IEEEeqncolcnt\z@% col. count = 0 for first line
3677    \@IEEEbuildpreamble{#2}\relax% build the preamble and put it into \@IEEEtrantmptoksA 
3678    % put in the column for the equation number
3679    \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi% col separator for those after the first
3680    \toks0={##}%
3681    % advance the \@IEEEeqncolcnt for the isolation col, this helps with error checking
3682    \@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}%
3683    % add the isolation column
3684    \@IEEEappendtoksA{\tabskip\z@skip\bgroup\the\toks0\egroup}%
3685    % advance the \@IEEEeqncolcnt for the equation number col, this helps with error checking
3686    \@IEEEappendtoksA{&\global\advance\@IEEEeqncolcnt by 1\relax}%
3687    % add the equation number col to the preamble
3688    \@IEEEappendtoksA{\tabskip\z@skip\hb@xt@\z@\bgroup\hss\the\toks0\egroup}%
3689    % note \@IEEEeqnnumcols does not count the equation col or isolation col
3690    % set the starting tabskip glue as determined by the preamble build
3691    \tabskip=\@IEEEBPstartglue\relax
3692    % begin the display alignment
3693    \@IEEEeqnarrayISinnertrue% commands are now within the lines
3694    $$\everycr{}\halign to\displaywidth\bgroup
3695    % "exspand" the preamble
3696    \span\the\@IEEEtrantmptoksA\cr}
3697
3698 % enter isolation/strut column (or the next column if the user did not use
3699 % every column), record the strut status, complete the columns, do the strut if needed,
3700 % restore counters (to backout any equation setup for a next line that was never used)
3701 % to their correct values and exit
3702 \def\end@IEEEeqnarray{\@IEEEeqnarrayglobalizestrutstatus&\@@IEEEeqnarraycr\egroup
3703 \if@IEEEsubeqnumpreadv\global\advance\c@IEEEsubequation\m@ne\fi
3704 \if@IEEEeqnumpreadv\global\advance\c@equation\m@ne\global\c@IEEEsubequation=\@IEEEsubeqnnumrollback\fi
3705 \global\let\@currentlabel\@IEEEcurrentlabelsave% restore current label
3706 \global\let\@currentHref\@IEEEcurrentHrefsave% restore current href label
3707 $$\@ignoretrue}
3708
3709
3710 % IEEEeqnarray uses a modifed \\ instead of the plain \cr to
3711 % end rows. This allows for things like \\*[vskip amount]
3712 % These "cr" macros are modified versions of those for LaTeX2e's eqnarray
3713 % the {\ifnum0=`} braces must be kept away from the last column to avoid
3714 % altering spacing of its math, so we use & to advance to the next column
3715 % as there is an isolation/strut column after the user's columns
3716 \def\@IEEEeqnarraycr{\@IEEEeqnarrayglobalizestrutstatus&% save strut status and advance to next column
3717    {\ifnum0=`}\fi
3718    \@ifstar{%
3719       \global\@eqpen\@M\@IEEEeqnarrayYCR
3720    }{%
3721       \global\@eqpen\interdisplaylinepenalty \@IEEEeqnarrayYCR
3722    }%
3723 }
3724
3725 \def\@IEEEeqnarrayYCR{\@testopt\@IEEEeqnarrayXCR\z@skip}
3726
3727 \def\@IEEEeqnarrayXCR[#1]{%
3728    \ifnum0=`{\fi}%
3729    \@@IEEEeqnarraycr
3730    \noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}}%
3731
3732 \def\@@IEEEeqnarraycr{\@IEEEtrantmptoksA={}% clear token register
3733     \advance\@IEEEeqncolcnt by -1\relax% adjust col count because of the isolation column
3734     \ifnum\@IEEEeqncolcnt>\@IEEEeqnnumcols\relax
3735     \@IEEEclspkgerror{Too many columns within the IEEEeqnarray\MessageBreak
3736                           environment}%
3737     {Use fewer \string &'s or put more columns in the IEEEeqnarray column\MessageBreak 
3738      specifications.}\relax%
3739     \else
3740     \loop% add cols if the user did not use them all
3741     \ifnum\@IEEEeqncolcnt<\@IEEEeqnnumcols\relax
3742     \@IEEEappendtoksA{&}%
3743     \advance\@IEEEeqncolcnt by 1\relax% update the col count
3744     \repeat
3745     % this number of &'s will take us the the isolation column
3746     \fi
3747     % execute the &'s
3748     \the\@IEEEtrantmptoksA%
3749     % handle the strut/isolation column
3750     \@IEEEeqnarrayinsertstrut% do the strut if needed
3751     \@IEEEeqnarraystrutreset% reset the strut system for next line or IEEEeqnarray
3752     &% and enter the equation number column
3753     \if@eqnsw% only if we display something
3754       \Hy@raisedlink{\hyper@anchorstart{\@currentHref}}% start a hyperref anchor
3755       \global\@IEEEeqnumpreadvfalse\relax% displaying an equation number means
3756       \global\@IEEEsubeqnumpreadvfalse\relax% the equation counters point to valid equations
3757       % V1.8 Here we setup the counters, currentlabel and status for what would be the *next*
3758       % equation line as would be the case under the current settings. However, there are two problems.
3759       % One problem is that there might not ever be a next line. The second problem is that the user
3760       % may later alter the meaning of a line with commands such as \IEEEyessubnumber. So, to handle
3761       % these cases we have to record the current values of the (sub)equation counters and revert back
3762       % to them if the next line is changed or never comes. The \if@IEEEeqnumpreadv, \if@IEEEsubeqnumpreadv
3763       % and \@IEEEsubeqnnumrollback stuff tracks this.
3764       % The logic to handle all this is surprisingly complex, but a nice feature of the approach here is
3765       % that the equation counters and labels remain valid for what the line would be unless a
3766       % \IEEEyessubnumber et al. later changes it. So, any hyperref links are always correct.
3767       \ifnum\c@IEEEsubequation>0\relax% handle subequation
3768          \theIEEEsubequationdis\relax
3769          \if@IEEEsubeqnumpersist% setup for default type of next line
3770             \stepcounter{IEEEsubequation}\global\@IEEEsubeqnumpreadvtrue\relax
3771             \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax
3772             \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label
3773          \else
3774              % if no subeqnum persist, go ahead and setup for a new equation number
3775              \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation
3776              \stepcounter{equation}\global\@IEEEeqnumpreadvtrue\relax
3777              \setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax
3778              \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label
3779          \fi
3780       \else% display a standard equation number
3781         \theequationdis\relax
3782         \setcounter{IEEEsubequation}{0}\relax% not really needed
3783         \if@IEEEsubeqnumpersist% setup for default type of next line
3784            % subequations that follow plain equations carry the same equation number e.g, 5, 5a rather than 5, 6a
3785            \stepcounter{IEEEsubequation}\global\@IEEEsubeqnumpreadvtrue\relax
3786            \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax
3787            \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label
3788          \else
3789              % if no subeqnum persist, go ahead and setup for a new equation number
3790              \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation
3791              \stepcounter{equation}\global\@IEEEeqnumpreadvtrue\relax
3792              \setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax
3793              \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label
3794          \fi
3795       \fi%
3796       \Hy@raisedlink{\hyper@anchorend}% end hyperref anchor
3797     \fi% fi only if we display something
3798     % reset the flags to indicate the default preferences of the display of equation numbers
3799     \if@IEEEeqnumpersist\global\@eqnswtrue\else\global\@eqnswfalse\fi
3800     \if@IEEEsubeqnumpersist\global\@eqnswtrue\fi% ditto for the subequation flag
3801     % reset the number of columns the user actually used
3802     \global\@IEEEeqncolcnt\z@\relax
3803     % the real end of the line
3804     \cr}
3805
3806
3807
3808
3809
3810 % \IEEEeqnarraybox is like \IEEEeqnarray except the box form puts everything
3811 % inside a vtop, vbox, or vcenter box depending on the letter in the second
3812 % optional argument (t,b,c). Vbox is the default. Unlike \IEEEeqnarray,
3813 % equation numbers are not displayed and \IEEEeqnarraybox can be nested.
3814 % \IEEEeqnarrayboxm is for math mode (like \array) and does not put the vbox
3815 % within an hbox.
3816 % \IEEEeqnarrayboxt is for text mode (like \tabular) and puts the vbox within
3817 % a \hbox{$ $} construct.
3818 % \IEEEeqnarraybox will auto detect whether to use \IEEEeqnarrayboxm or 
3819 % \IEEEeqnarrayboxt depending on the math mode.
3820 % The third optional argument specifies the width this box is to be set to -
3821 % natural width is the default.
3822 % The * forms do not add \jot line spacing
3823 % usage: \IEEEeqnarraybox[decl][pos][width]{cols}
3824 \def\IEEEeqnarrayboxm{\@IEEEeqnarrayboxnojotfalse\@IEEEeqnarrayboxHBOXSWfalse\@IEEEeqnarraybox}
3825 \def\endIEEEeqnarrayboxm{\end@IEEEeqnarraybox}
3826 \@namedef{IEEEeqnarrayboxm*}{\@IEEEeqnarrayboxnojottrue\@IEEEeqnarrayboxHBOXSWfalse\@IEEEeqnarraybox}
3827 \@namedef{endIEEEeqnarrayboxm*}{\end@IEEEeqnarraybox}
3828
3829 \def\IEEEeqnarrayboxt{\@IEEEeqnarrayboxnojotfalse\@IEEEeqnarrayboxHBOXSWtrue\@IEEEeqnarraybox}
3830 \def\endIEEEeqnarrayboxt{\end@IEEEeqnarraybox}
3831 \@namedef{IEEEeqnarrayboxt*}{\@IEEEeqnarrayboxnojottrue\@IEEEeqnarrayboxHBOXSWtrue\@IEEEeqnarraybox}
3832 \@namedef{endIEEEeqnarrayboxt*}{\end@IEEEeqnarraybox}
3833
3834 \def\IEEEeqnarraybox{\@IEEEeqnarrayboxnojotfalse\ifmmode\@IEEEeqnarrayboxHBOXSWfalse\else\@IEEEeqnarrayboxHBOXSWtrue\fi%
3835 \@IEEEeqnarraybox}
3836 \def\endIEEEeqnarraybox{\end@IEEEeqnarraybox}
3837
3838 \@namedef{IEEEeqnarraybox*}{\@IEEEeqnarrayboxnojottrue\ifmmode\@IEEEeqnarrayboxHBOXSWfalse\else\@IEEEeqnarrayboxHBOXSWtrue\fi%
3839 \@IEEEeqnarraybox}
3840 \@namedef{endIEEEeqnarraybox*}{\end@IEEEeqnarraybox}
3841
3842 % flag to indicate if the \IEEEeqnarraybox needs to put things into an hbox{$ $} 
3843 % for \vcenter in non-math mode
3844 \newif\if@IEEEeqnarrayboxHBOXSW%
3845 \@IEEEeqnarrayboxHBOXSWfalse
3846
3847 \def\@IEEEeqnarraybox{\relax\@ifnextchar[{\@@IEEEeqnarraybox}{\@@IEEEeqnarraybox[\relax]}}
3848 % We have to be careful here to normalize catcodes just before acquiring the
3849 % cols as that specification may contain punctuation which could be subject
3850 % to document catcode changes.
3851 \def\@@IEEEeqnarraybox[#1]{\relax\begingroup\IEEEnormalcatcodes\@ifnextchar[{\@@@IEEEeqnarraybox[#1]}{\@@@IEEEeqnarraybox[#1][b]}}
3852 \def\@@@IEEEeqnarraybox[#1][#2]{\relax\@ifnextchar[{\@@@@IEEEeqnarraybox[#1][#2]}{\@@@@IEEEeqnarraybox[#1][#2][\relax]}}
3853
3854 % #1 = decl; #2 = t,b,c; #3 = width, #4 = col specs
3855 \def\@@@@IEEEeqnarraybox[#1][#2][#3]#4{\endgroup\@IEEEeqnarrayISinnerfalse % not yet within the lines of the halign
3856    \@IEEEeqnarraymasterstrutsave% save current master strut values
3857    \@IEEEeqnarraystrutsize{0pt}{0pt}[\relax]% turn off struts by default
3858    \@IEEEeqnarrayusemasterstruttrue% use master strut till user asks otherwise
3859    \IEEEvisiblestrutsfalse% diagnostic mode defaults to off
3860    % no extra space unless the user specifically requests it
3861    \lineskip=0pt\relax%
3862    \lineskiplimit=0pt\relax%
3863    \baselineskip=\normalbaselineskip\relax%
3864    \jot=\IEEEnormaljot\relax%
3865    \mathsurround\z@\relax% no extra spacing around math
3866    % the default end glues are zero for an \IEEEeqnarraybox
3867    \edef\@IEEEeqnarraycolSEPdefaultstart{\@IEEEeqnarraycolSEPzero}% default start glue
3868    \edef\@IEEEeqnarraycolSEPdefaultend{\@IEEEeqnarraycolSEPzero}% default end glue
3869    \edef\@IEEEeqnarraycolSEPdefaultmid{\@IEEEeqnarraycolSEPzero}% default inter-column glue
3870    \@advanceIEEEeqncolcntfalse% do not advance the col counter for each col the user uses, 
3871                               % used in \IEEEeqnarraymulticol and in the preamble build
3872    \IEEEeqnarrayboxdecl\relax% allow a way for the user to make global overrides
3873    #1\relax% allow user to override defaults
3874    \let\\\@IEEEeqnarrayboxcr% replace newline with one that allows optional spacing
3875    \@IEEEbuildpreamble{#4}\relax% build the preamble and put it into \@IEEEtrantmptoksA
3876    % add an isolation column to the preamble to stop \\'s {} from getting into the last col
3877    \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi% col separator for those after the first
3878    \toks0={##}%
3879    % add the isolation column to the preamble
3880    \@IEEEappendtoksA{\tabskip\z@skip\bgroup\the\toks0\egroup}% 
3881    % set the starting tabskip glue as determined by the preamble build
3882    \tabskip=\@IEEEBPstartglue\relax
3883    % begin the alignment
3884    \everycr{}%
3885    % use only the very first token to determine the positioning
3886    \@IEEEextracttoken{#2}\relax
3887    \ifx\@IEEEextractedtokensdiscarded\@empty\else
3888      \typeout{** WARNING: IEEEeqnarraybox position specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax
3889    \fi
3890    % \@IEEEextractedtoken has the first token, the rest are ignored
3891    % if we need to put things into and hbox and go into math mode, do so now
3892    \if@IEEEeqnarrayboxHBOXSW \leavevmode \hbox \bgroup $\fi%
3893    % use the appropriate vbox type
3894    \if\@IEEEextractedtoken t\relax\vtop\else\if\@IEEEextractedtoken c\relax%
3895    \vcenter\else\vbox\fi\fi\bgroup%
3896    \@IEEEeqnarrayISinnertrue% commands are now within the lines
3897    \ifx#3\relax\halign\else\halign to #3\relax\fi%
3898    \bgroup
3899    % "exspand" the preamble
3900    \span\the\@IEEEtrantmptoksA\cr}
3901
3902 % carry strut status and enter the isolation/strut column, 
3903 % exit from math mode if needed, and exit
3904 \def\end@IEEEeqnarraybox{\@IEEEeqnarrayglobalizestrutstatus% carry strut status
3905 &% enter isolation/strut column
3906 \@IEEEeqnarrayinsertstrut% do strut if needed
3907 \@IEEEeqnarraymasterstrutrestore% restore the previous master strut values
3908 % reset the strut system for next IEEEeqnarray
3909 % (sets local strut values back to previous master strut values)
3910 \@IEEEeqnarraystrutreset%
3911 % ensure last line, exit from halign, close vbox
3912 \crcr\egroup\egroup%
3913 % exit from math mode and close hbox if needed
3914 \if@IEEEeqnarrayboxHBOXSW $\egroup\fi}
3915
3916
3917
3918 % IEEEeqnarraybox uses a modifed \\ instead of the plain \cr to
3919 % end rows. This allows for things like \\[vskip amount]
3920 % This "cr" macros are modified versions those for LaTeX2e's eqnarray
3921 % For IEEEeqnarraybox, \\* is the same as \\
3922 % the {\ifnum0=`} braces must be kept away from the last column to avoid
3923 % altering spacing of its math, so we use & to advance to the isolation/strut column
3924 % carry strut status into isolation/strut column
3925 \def\@IEEEeqnarrayboxcr{\@IEEEeqnarrayglobalizestrutstatus% carry strut status
3926 &% enter isolation/strut column
3927 \@IEEEeqnarrayinsertstrut% do strut if needed
3928 % reset the strut system for next line or IEEEeqnarray
3929 \@IEEEeqnarraystrutreset%
3930 {\ifnum0=`}\fi%
3931 \@ifstar{\@IEEEeqnarrayboxYCR}{\@IEEEeqnarrayboxYCR}}
3932
3933 % test and setup the optional argument to \\[]
3934 \def\@IEEEeqnarrayboxYCR{\@testopt\@IEEEeqnarrayboxXCR\z@skip}
3935
3936 % IEEEeqnarraybox does not automatically increase line spacing by \jot
3937 \def\@IEEEeqnarrayboxXCR[#1]{\ifnum0=`{\fi}%
3938 \cr\noalign{\if@IEEEeqnarrayboxnojot\else\vskip\jot\fi\vskip#1\relax}}
3939
3940
3941
3942 % usage: \@IEEEbuildpreamble{column specifiers}
3943 % starts the halign preamble build 
3944 % the assembled preamble is put in \@IEEEtrantmptoksA
3945 \def\@IEEEbuildpreamble#1{\@IEEEtrantmptoksA={}% clear token register
3946 \let\@IEEEBPcurtype=u%current column type is not yet known
3947 \let\@IEEEBPprevtype=s%the previous column type was the start
3948 \let\@IEEEBPnexttype=u%next column type is not yet known
3949 % ensure these are valid
3950 \def\@IEEEBPcurglue={0pt plus 0pt minus 0pt}%
3951 \def\@IEEEBPcurcolname{@IEEEdefault}% name of current column definition
3952 % currently acquired numerically referenced glue
3953 % use a name that is easier to remember
3954 \let\@IEEEBPcurnum=\@IEEEtrantmpcountA%
3955 \@IEEEBPcurnum=0%
3956 % tracks number of columns in the preamble
3957 \@IEEEeqnnumcols=0%
3958 % record the default end glues
3959 \edef\@IEEEBPstartglue{\@IEEEeqnarraycolSEPdefaultstart}%
3960 \edef\@IEEEBPendglue{\@IEEEeqnarraycolSEPdefaultend}%
3961 \edef\@IEEEedefMACRO{#1}\relax% fully expand the preamble to support macro containers
3962 % now parse the user's column specifications
3963 % \ignorespaces is used as a delimiter, need at least one trailing \relax because
3964 % \@@IEEEbuildpreamble looks into the future 
3965 \expandafter\@@IEEEbuildpreamble\@IEEEedefMACRO\ignorespaces\relax\relax}
3966
3967
3968 % usage: \@@IEEEbuildpreamble{current column}{next column}
3969 % parses and builds the halign preamble
3970 \def\@@IEEEbuildpreamble#1#2{\let\@@nextIEEEbuildpreamble=\@@IEEEbuildpreamble%
3971 % use only the very first token to check the end
3972 \@IEEEextracttokengroups{#1}\relax
3973 \ifx\@IEEEextractedfirsttoken\ignorespaces\let\@@nextIEEEbuildpreamble=\@@IEEEfinishpreamble\else%
3974 % identify current and next token type
3975 \@IEEEgetcoltype{#1}{\@IEEEBPcurtype}{1}% current, error on invalid
3976 \@IEEEgetcoltype{#2}{\@IEEEBPnexttype}{0}% next, no error on invalid next
3977 % if curtype is a glue, get the glue def
3978 \if\@IEEEBPcurtype g\@IEEEgetcurglue{#1}{\@IEEEBPcurglue}\fi%
3979 % if curtype is a column, get the column def and set the current column name
3980 \if\@IEEEBPcurtype c\@IEEEgetcurcol{#1}\fi%
3981 % if curtype is a numeral, acquire the user defined glue
3982 \if\@IEEEBPcurtype n\@IEEEprocessNcol{#1}\fi%
3983 % process the acquired glue 
3984 \if\@IEEEBPcurtype g\@IEEEprocessGcol\fi%
3985 % process the acquired col 
3986 \if\@IEEEBPcurtype c\@IEEEprocessCcol\fi%
3987 % ready prevtype for next col spec.
3988 \let\@IEEEBPprevtype=\@IEEEBPcurtype%
3989 % be sure and put back the future token(s) as a group
3990 \fi\@@nextIEEEbuildpreamble{#2}}
3991
3992
3993 % usage: \@@IEEEfinishpreamble{discarded}
3994 % executed just after preamble build is completed
3995 % warn about zero cols, and if prevtype type = u, put in end tabskip glue
3996 % argument is not used
3997 \def\@@IEEEfinishpreamble#1{\ifnum\@IEEEeqnnumcols<1\relax
3998 \@IEEEclspkgerror{No column specifiers declared for IEEEeqnarray}%
3999 {At least one column type must be declared for each IEEEeqnarray.}%
4000 \fi%num cols less than 1
4001 %if last type undefined, set default end tabskip glue
4002 \if\@IEEEBPprevtype u\@IEEEappendtoksA{\tabskip=\@IEEEBPendglue}\fi}
4003
4004
4005 % usage: \@IEEEgetcoltype{col specifier}{\output}{error more}
4006 % Identify and return the column specifier's type code in the given
4007 % \output macro:
4008 % n = number
4009 % g = glue (any other char in catagory 12)
4010 % c = letter
4011 % e = \ignorespaces (end of sequence)
4012 % u = undefined
4013 % error mode: 0 = no error message, 1 = error on invalid char
4014 \def\@IEEEgetcoltype#1#2#3{%
4015 % use only the very first token to determine the type
4016 \@IEEEextracttoken{#1}\relax
4017 % \@IEEEextractedtoken has the first token, the rest are discarded
4018 \let#2=u\relax% assume invalid until know otherwise
4019 \ifx\@IEEEextractedtoken\ignorespaces\let#2=e\else
4020 \ifcat\@IEEEextractedtoken\relax\else% screen out control sequences
4021 \if0\@IEEEextractedtoken\let#2=n\else
4022 \if1\@IEEEextractedtoken\let#2=n\else
4023 \if2\@IEEEextractedtoken\let#2=n\else
4024 \if3\@IEEEextractedtoken\let#2=n\else
4025 \if4\@IEEEextractedtoken\let#2=n\else
4026 \if5\@IEEEextractedtoken\let#2=n\else
4027 \if6\@IEEEextractedtoken\let#2=n\else
4028 \if7\@IEEEextractedtoken\let#2=n\else
4029 \if8\@IEEEextractedtoken\let#2=n\else
4030 \if9\@IEEEextractedtoken\let#2=n\else
4031 \ifcat,\@IEEEextractedtoken\let#2=g\relax
4032 \else\ifcat a\@IEEEextractedtoken\let#2=c\relax\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
4033 \if#2u\relax
4034 \if0\noexpand#3\relax\else\@IEEEclspkgerror{Invalid character in column specifications}%
4035 {Only letters, numerals and certain other symbols are allowed \MessageBreak
4036 as IEEEeqnarray column specifiers.}\fi\fi}
4037
4038
4039 % usage: \@IEEEgetcurcol{col specifier}
4040 % verify the letter referenced column exists
4041 % and return its name in \@IEEEBPcurcolname
4042 % if column specifier is invalid, use the default column @IEEEdefault
4043 \def\@IEEEgetcurcol#1{\expandafter\ifx\csname @IEEEeqnarraycolDEF#1\endcsname\@IEEEeqnarraycolisdefined%
4044 \def\@IEEEBPcurcolname{#1}\else% invalid column name
4045 \@IEEEclspkgerror{Invalid column type "#1" in column specifications.\MessageBreak
4046 Using a default centering column instead}%
4047 {You must define IEEEeqnarray column types before use.}%
4048 \def\@IEEEBPcurcolname{@IEEEdefault}\fi}
4049
4050
4051 % usage: \@IEEEgetcurglue{glue specifier}{\output}
4052 % identify the predefined (punctuation) glue value
4053 % and return it in the given output macro
4054 \def\@IEEEgetcurglue#1#2{%
4055 % ! = \! (neg small)  -0.16667em (-3/18 em)
4056 % , = \, (small)       0.16667em ( 3/18 em)
4057 % : = \: (med)         0.22222em ( 4/18 em)
4058 % ; = \; (large)       0.27778em ( 5/18 em)
4059 % ' = \quad            1em
4060 % " = \qquad           2em
4061 % . = 0.5\arraycolsep
4062 % / = \arraycolsep
4063 % ? = 2\arraycolsep
4064 % * = 1fil
4065 % + = \@IEEEeqnarraycolSEPcenter
4066 % - = \@IEEEeqnarraycolSEPzero
4067 % Note that all em values are referenced to the math font (textfont2) fontdimen6
4068 % value for 1em.
4069
4070 % use only the very first token to determine the type
4071 \@IEEEextracttoken{#1}\relax
4072 \ifx\@IEEEextractedtokensdiscarded\@empty\else
4073   \typeout{** WARNING: IEEEeqnarray predefined inter-column glue type specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax
4074 \fi
4075 % get the math font 1em value
4076 % LaTeX2e's NFSS2 does not preload the fonts, but \IEEEeqnarray needs
4077 % to gain access to the math (\textfont2) font's spacing parameters.
4078 % So we create a bogus box here that uses the math font to ensure
4079 % that \textfont2 is loaded and ready. If this is not done,
4080 % the \textfont2 stuff here may not work.
4081 % Thanks to Bernd Raichle for his 1997 post on this topic.
4082 {\setbox0=\hbox{$\displaystyle\relax$}}%
4083 % fontdimen6 has the width of 1em (a quad).
4084 \@IEEEtrantmpdimenA=\fontdimen6\textfont2\relax%
4085 % identify the glue value based on the first token
4086 % we discard anything after the first
4087 \if!\@IEEEextractedtoken\@IEEEtrantmpdimenA=-0.16667\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else
4088 \if,\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.16667\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else
4089 \if:\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.22222\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else
4090 \if;\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.27778\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else
4091 \if'\@IEEEextractedtoken\@IEEEtrantmpdimenA=1\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else
4092 \if"\@IEEEextractedtoken\@IEEEtrantmpdimenA=2\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else
4093 \if.\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.5\arraycolsep\edef#2{\the\@IEEEtrantmpdimenA}\else
4094 \if/\@IEEEextractedtoken\edef#2{\the\arraycolsep}\else
4095 \if?\@IEEEextractedtoken\@IEEEtrantmpdimenA=2\arraycolsep\edef#2{\the\@IEEEtrantmpdimenA}\else
4096 \if *\@IEEEextractedtoken\edef#2{0pt plus 1fil minus 0pt}\else
4097 \if+\@IEEEextractedtoken\edef#2{\@IEEEeqnarraycolSEPcenter}\else
4098 \if-\@IEEEextractedtoken\edef#2{\@IEEEeqnarraycolSEPzero}\else
4099 \edef#2{\@IEEEeqnarraycolSEPzero}%
4100 \@IEEEclspkgerror{Invalid predefined inter-column glue type "#1" in\MessageBreak
4101 column specifications. Using a default value of\MessageBreak
4102 0pt instead}%
4103 {Only !,:;'"./?*+ and - are valid predefined glue types in the\MessageBreak 
4104 IEEEeqnarray column specifications.}\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
4105
4106
4107 % usage: \@IEEEprocessNcol{digit}
4108 % process a numerical digit from the column specification
4109 % and look up the corresponding user defined glue value
4110 % can transform current type from n to g or a as the user defined glue is acquired
4111 \def\@IEEEprocessNcol#1{\if\@IEEEBPprevtype g%
4112 \@IEEEclspkgerror{Back-to-back inter-column glue specifiers in column\MessageBreak
4113 specifications. Ignoring consecutive glue specifiers\MessageBreak
4114 after the first}%
4115 {You cannot have two or more glue types next to each other\MessageBreak 
4116 in the IEEEeqnarray column specifications.}%
4117 \let\@IEEEBPcurtype=a% abort this glue, future digits will be discarded
4118 \@IEEEBPcurnum=0\relax%
4119 \else% if we previously aborted a glue
4120 \if\@IEEEBPprevtype a\@IEEEBPcurnum=0\let\@IEEEBPcurtype=a%maintain digit abortion
4121 \else%acquire this number
4122 % save the previous type before the numerical digits started
4123 \if\@IEEEBPprevtype n\else\let\@IEEEBPprevsavedtype=\@IEEEBPprevtype\fi%
4124 \multiply\@IEEEBPcurnum by 10\relax%
4125 \advance\@IEEEBPcurnum by #1\relax% add in number, \relax is needed to stop TeX's number scan
4126 \if\@IEEEBPnexttype n\else%close acquisition
4127 \expandafter\ifx\csname @IEEEeqnarraycolSEPDEF\expandafter\romannumeral\number\@IEEEBPcurnum\endcsname\@IEEEeqnarraycolisdefined%
4128 \edef\@IEEEBPcurglue{\csname @IEEEeqnarraycolSEP\expandafter\romannumeral\number\@IEEEBPcurnum\endcsname}%
4129 \else%user glue not defined
4130 \@IEEEclspkgerror{Invalid user defined inter-column glue type "\number\@IEEEBPcurnum" in\MessageBreak
4131 column specifications. Using a default value of\MessageBreak
4132 0pt instead}%
4133 {You must define all IEEEeqnarray numerical inter-column glue types via\MessageBreak
4134 \string\IEEEeqnarraydefcolsep \space before they are used in column specifications.}%
4135 \edef\@IEEEBPcurglue{\@IEEEeqnarraycolSEPzero}%
4136 \fi% glue defined or not
4137 \let\@IEEEBPcurtype=g% change the type to reflect the acquired glue
4138 \let\@IEEEBPprevtype=\@IEEEBPprevsavedtype% restore the prev type before this number glue
4139 \@IEEEBPcurnum=0\relax%ready for next acquisition
4140 \fi%close acquisition, get glue
4141 \fi%discard or acquire number
4142 \fi%prevtype glue or not
4143 }
4144
4145
4146 % process an acquired glue
4147 % add any acquired column/glue pair to the preamble
4148 \def\@IEEEprocessGcol{\if\@IEEEBPprevtype a\let\@IEEEBPcurtype=a%maintain previous glue abortions
4149 \else
4150 % if this is the start glue, save it, but do nothing else 
4151 % as this is not used in the preamble, but before
4152 \if\@IEEEBPprevtype s\edef\@IEEEBPstartglue{\@IEEEBPcurglue}%
4153 \else%not the start glue
4154 \if\@IEEEBPprevtype g%ignore if back to back glues
4155 \@IEEEclspkgerror{Back-to-back inter-column glue specifiers in column\MessageBreak
4156 specifications. Ignoring consecutive glue specifiers\MessageBreak
4157 after the first}%
4158 {You cannot have two or more glue types next to each other\MessageBreak 
4159 in the IEEEeqnarray column specifications.}%
4160 \let\@IEEEBPcurtype=a% abort this glue
4161 \else% not a back to back glue
4162 \if\@IEEEBPprevtype c\relax% if the previoustype was a col, add column/glue pair to preamble
4163 \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi
4164 \toks0={##}%
4165 % make preamble advance col counter if this environment needs this
4166 \if@advanceIEEEeqncolcnt\@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}\fi
4167 % insert the column defintion into the preamble, being careful not to expand
4168 % the column definition
4169 \@IEEEappendtoksA{\tabskip=\@IEEEBPcurglue}%
4170 \@IEEEappendNOEXPANDtoksA{\begingroup\csname @IEEEeqnarraycolPRE}%
4171 \@IEEEappendtoksA{\@IEEEBPcurcolname}%
4172 \@IEEEappendNOEXPANDtoksA{\endcsname}%
4173 \@IEEEappendtoksA{\the\toks0}%
4174 \@IEEEappendNOEXPANDtoksA{\relax\relax\relax\relax\relax%
4175 \relax\relax\relax\relax\relax\csname @IEEEeqnarraycolPOST}%
4176 \@IEEEappendtoksA{\@IEEEBPcurcolname}%
4177 \@IEEEappendNOEXPANDtoksA{\endcsname\relax\relax\relax\relax\relax%
4178 \relax\relax\relax\relax\relax\endgroup}%
4179 \advance\@IEEEeqnnumcols by 1\relax%one more column in the preamble
4180 \else% error: non-start glue with no pending column
4181 \@IEEEclspkgerror{Inter-column glue specifier without a prior column\MessageBreak
4182 type in the column specifications. Ignoring this glue\MessageBreak 
4183 specifier}%
4184 {Except for the first and last positions, glue can be placed only\MessageBreak
4185 between column types.}%
4186 \let\@IEEEBPcurtype=a% abort this glue
4187 \fi% previous was a column
4188 \fi% back-to-back glues
4189 \fi% is start column glue
4190 \fi% prev type not a
4191 }
4192
4193
4194 % process an acquired letter referenced column and, if necessary, add it to the preamble
4195 \def\@IEEEprocessCcol{\if\@IEEEBPnexttype g\else
4196 \if\@IEEEBPnexttype n\else
4197 % we have a column followed by something other than a glue (or numeral glue)
4198 % so we must add this column to the preamble now
4199 \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi%col separator for those after the first
4200 \if\@IEEEBPnexttype e\@IEEEappendtoksA{\tabskip=\@IEEEBPendglue\relax}\else%put in end glue
4201 \@IEEEappendtoksA{\tabskip=\@IEEEeqnarraycolSEPdefaultmid\relax}\fi% or default mid glue
4202 \toks0={##}%
4203 % make preamble advance col counter if this environment needs this
4204 \if@advanceIEEEeqncolcnt\@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}\fi
4205 % insert the column definition into the preamble, being careful not to expand
4206 % the column definition
4207 \@IEEEappendNOEXPANDtoksA{\begingroup\csname @IEEEeqnarraycolPRE}%
4208 \@IEEEappendtoksA{\@IEEEBPcurcolname}%
4209 \@IEEEappendNOEXPANDtoksA{\endcsname}%
4210 \@IEEEappendtoksA{\the\toks0}%
4211 \@IEEEappendNOEXPANDtoksA{\relax\relax\relax\relax\relax%
4212 \relax\relax\relax\relax\relax\csname @IEEEeqnarraycolPOST}%
4213 \@IEEEappendtoksA{\@IEEEBPcurcolname}%
4214 \@IEEEappendNOEXPANDtoksA{\endcsname\relax\relax\relax\relax\relax%
4215 \relax\relax\relax\relax\relax\endgroup}%
4216 \advance\@IEEEeqnnumcols by 1\relax%one more column in the preamble
4217 \fi%next type not numeral
4218 \fi%next type not glue
4219 }
4220
4221
4222 %%
4223 %% END OF IEEEeqnarray DEFINITIONS
4224 %%
4225
4226
4227
4228
4229
4230 % set up the running headers and footers
4231 %
4232 % header and footer font and size specifications
4233 \def\@IEEEheaderstyle{\normalfont\scriptsize}
4234 \def\@IEEEfooterstyle{\normalfont\scriptsize}
4235 %
4236 % compsoc uses sans-serif headers and footers
4237 \ifCLASSOPTIONcompsoc
4238   \def\@IEEEheaderstyle{\normalfont\sffamily\scriptsize}
4239   \def\@IEEEfooterstyle{\normalfont\sffamily\scriptsize}
4240 \fi
4241
4242
4243 % standard page style, ps@headings
4244 \def\ps@headings{% default to standard twoside headers, no footers
4245 % will change later if the mode requires otherwise
4246 \def\@oddhead{\hbox{}\@IEEEheaderstyle\rightmark\hfil\thepage}\relax
4247 \def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax
4248 \let\@oddfoot\@empty
4249 \let\@evenfoot\@empty
4250 \ifCLASSOPTIONtechnote
4251   % technote twoside
4252   \def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax
4253   \def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax
4254 \fi
4255 \ifCLASSOPTIONdraftcls
4256   % draft footers
4257   \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax
4258   \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax
4259 \fi
4260 % oneside
4261 \if@twoside\else
4262   % standard one side headers
4263   \def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax
4264   \let\@evenhead\@empty
4265   \ifCLASSOPTIONdraftcls
4266     % oneside draft footers
4267     \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax
4268     \let\@evenfoot\@empty
4269   \fi
4270 \fi
4271 % turn off headers for conferences
4272 \ifCLASSOPTIONconference
4273   \let\@oddhead\@empty
4274   \let\@evenhead\@empty
4275 \fi
4276 % turn off footers for draftclsnofoot
4277 \ifCLASSOPTIONdraftclsnofoot
4278   \let\@oddfoot\@empty
4279   \let\@evenfoot\@empty
4280 \fi}
4281
4282
4283 % title page style, ps@IEEEtitlepagestyle
4284 \def\ps@IEEEtitlepagestyle{% default title page headers, no footers
4285 \def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax
4286 \def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax
4287 \let\@oddfoot\@empty
4288 \let\@evenfoot\@empty
4289 % will change later if the mode requires otherwise
4290 \ifCLASSOPTIONdraftcls
4291   % draft footers
4292   \ifCLASSOPTIONdraftclsnofoot\else
4293     % but only if not draftclsnofoot
4294     \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax
4295     \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax
4296   \fi
4297 \else
4298   % all nondraft mode footers
4299   \if@IEEEusingpubid
4300     % for title pages that are using a pubid
4301     % do not repeat pubid on the title page if using a peer review cover page
4302     \ifCLASSOPTIONpeerreview\else
4303       % for noncompsoc papers, the pubid uses footnotesize and
4304       % is at the same vertical position as where the last baseline would normally be
4305       \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax
4306       \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax
4307       \ifCLASSOPTIONcompsoc
4308         % for compsoc papers, the pubid is at the same vertical position as the normal footer
4309         \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax
4310         \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax
4311       \fi
4312     \fi
4313   \fi
4314 \fi
4315 % turn off headers for conferences
4316 \ifCLASSOPTIONconference
4317   \let\@oddhead\@empty
4318   \let\@evenhead\@empty
4319 \fi}
4320
4321
4322 % peer review cover page style, ps@IEEEpeerreviewcoverpagestyle
4323 \def\ps@IEEEpeerreviewcoverpagestyle{% default peer review cover no headers, no footers
4324 \let\@oddhead\@empty
4325 \let\@evenhead\@empty
4326 \let\@oddfoot\@empty
4327 \let\@evenfoot\@empty
4328 % will change later if the mode requires otherwise
4329 \ifCLASSOPTIONdraftcls
4330   % draft footers
4331   \ifCLASSOPTIONdraftclsnofoot\else
4332     % but only if not draftclsnofoot
4333     \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax
4334     \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax
4335   \fi
4336 \else
4337   % all nondraft mode footers
4338   \if@IEEEusingpubid
4339     % for peer review cover pages that are using a pubid
4340     % for noncompsoc papers, the pubid uses footnotesize and
4341     % is at the same vertical position as where the last baseline would normally be
4342     \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax
4343     \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax
4344     \ifCLASSOPTIONcompsoc
4345       % for compsoc papers, the pubid is at the same vertical position as the normal footer
4346       \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax
4347       \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax
4348     \fi
4349   \fi
4350 \fi}
4351
4352
4353
4354 %% Defines the command for putting the header.
4355 %% Note that all the text is forced into uppercase, if you have some text
4356 %% that needs to be in lower case, for instance et. al., then either manually
4357 %% set \leftmark and \rightmark or use \MakeLowercase{et. al.} within the
4358 %% arguments to \markboth.
4359 %% V1.7b add \protect to work with Babel
4360 \def\markboth#1#2{\def\leftmark{\MakeUppercase{\protect#1}}%
4361 \def\rightmark{\MakeUppercase{\protect#2}}}
4362
4363 \def\today{\ifcase\month\or
4364     January\or February\or March\or April\or May\or June\or
4365     July\or August\or September\or October\or November\or December\fi
4366     \space\number\day, \number\year}
4367
4368
4369
4370
4371 %% CITATION AND BIBLIOGRAPHY COMMANDS
4372 %% 
4373 %% V1.6 no longer supports the older, nonstandard \shortcite and \citename setup stuff
4374
4375
4376 % Modify Latex2e \@citex to separate citations with "], ["
4377 \def\@citex[#1]#2{%
4378   \let\@citea\@empty
4379   \@cite{\@for\@citeb:=#2\do
4380     {\@citea\def\@citea{], [}%
4381      \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
4382      \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
4383      \@ifundefined{b@\@citeb}{\mbox{\reset@font\bfseries ?}%
4384        \G@refundefinedtrue
4385        \@latex@warning
4386          {Citation `\@citeb' on page \thepage \space undefined}}%
4387        {\hbox{\csname b@\@citeb\endcsname}}}}{#1}}
4388
4389 % V1.6 we create hooks for the optional use of Donald Arseneau's
4390 % cite.sty package. cite.sty is "smart" and will notice that the
4391 % following format controls are already defined and will not
4392 % redefine them. The result will be the proper sorting of the
4393 % citation numbers and auto detection of 3 or more entry "ranges" -
4394 % all in IEEE style:  [1], [2], [5]--[7], [12]
4395 % This also allows for an optional note, i.e., \cite[mynote]{..}.
4396 % If the \cite with note has more than one reference, the note will
4397 % be applied to the last of the listed references. It is generally
4398 % desired that if a note is given, only one reference is listed in
4399 % that \cite.
4400 % Thanks to Mr. Arseneau for providing the required format arguments
4401 % to produce the IEEE style.
4402 \def\citepunct{], [}
4403 \def\citedash{]--[}
4404
4405 % V1.7 default to using same font for urls made by url.sty
4406 \AtBeginDocument{\csname url@samestyle\endcsname}
4407
4408 % V1.6 class files should always provide these
4409 \def\newblock{\hskip .11em\@plus.33em\@minus.07em}
4410 \let\@openbib@code\@empty
4411 % V1.8b article.cls is now providing these too
4412 % we do not use \@mkboth, nor alter the page style
4413 \newenvironment{theindex}
4414                {\if@twocolumn
4415                   \@restonecolfalse
4416                 \else
4417                   \@restonecoltrue
4418                 \fi
4419                 \twocolumn[\section*{\indexname}]%
4420                 \parindent\z@
4421                 \parskip\z@ \@plus .3\p@\relax
4422                 \columnseprule \z@
4423                 \columnsep 35\p@
4424                 \let\item\@idxitem}
4425                {\if@restonecol\onecolumn\else\clearpage\fi}
4426 \newcommand\@idxitem{\par\hangindent 40\p@}
4427 \newcommand\subitem{\@idxitem \hspace*{20\p@}}
4428 \newcommand\subsubitem{\@idxitem \hspace*{30\p@}}
4429 \newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax}
4430
4431
4432
4433 % Provide support for the control entries of IEEEtran.bst V1.00 and later.
4434 % V1.7 optional argument allows for a different aux file to be specified in
4435 % order to handle multiple bibliographies. For example, with multibib.sty:
4436 % \newcites{sec}{Secondary Literature}
4437 % \bstctlcite[@auxoutsec]{BSTcontrolhak}
4438 \def\bstctlcite{\@ifnextchar[{\@bstctlcite}{\@bstctlcite[@auxout]}}
4439 \def\@bstctlcite[#1]#2{\@bsphack
4440   \@for\@citeb:=#2\do{%
4441     \edef\@citeb{\expandafter\@firstofone\@citeb}%
4442     \if@filesw\immediate\write\csname #1\endcsname{\string\citation{\@citeb}}\fi}%
4443   \@esphack}
4444
4445 % \IEEEnoauxwrite{} allows for citations that do not add to or affect
4446 % the order of the existing citation list. Can be useful for \cite
4447 % within \thanks{}.
4448 \DeclareRobustCommand{\IEEEnoauxwrite}[1]{\relax
4449 \if@filesw
4450 \@fileswfalse
4451 #1\relax\relax\relax\relax\relax
4452 \@fileswtrue
4453 \else
4454 #1\relax\relax\relax\relax\relax
4455 \fi}
4456
4457 % V1.6 provide a way for a user to execute a command just before 
4458 % a given reference number - used to insert a \newpage to balance
4459 % the columns on the last page
4460 \edef\@IEEEtriggerrefnum{0}   % the default of zero means that
4461                               % the command is not executed
4462 \def\@IEEEtriggercmd{\newpage}
4463
4464 % allow the user to alter the triggered command
4465 \long\def\IEEEtriggercmd#1{\long\def\@IEEEtriggercmd{#1}}
4466
4467 % allow user a way to specify the reference number just before the
4468 % command is executed
4469 \def\IEEEtriggeratref#1{\@IEEEtrantmpcountA=#1%
4470 \edef\@IEEEtriggerrefnum{\the\@IEEEtrantmpcountA}}%
4471
4472 % trigger command at the given reference
4473 \def\@IEEEbibitemprefix{\@IEEEtrantmpcountA=\@IEEEtriggerrefnum\relax%
4474 \advance\@IEEEtrantmpcountA by -1\relax%
4475 \ifnum\c@enumiv=\@IEEEtrantmpcountA\relax\@IEEEtriggercmd\relax\fi}
4476
4477
4478 \def\@biblabel#1{[#1]}
4479
4480 % compsoc journals and conferences left align the reference numbers
4481 \@IEEEcompsoconly{\def\@biblabel#1{[#1]\hfill}}
4482
4483 % controls bib item spacing
4484 \def\IEEEbibitemsep{0pt plus .5pt}
4485
4486 \@IEEEcompsocconfonly{\def\IEEEbibitemsep{0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}}
4487
4488
4489 \def\thebibliography#1{\section*{\refname}%
4490     \addcontentsline{toc}{section}{\refname}%
4491     % V1.6 add some rubber space here and provide a command trigger
4492     \footnotesize\vskip 0.3\baselineskip plus 0.1\baselineskip minus 0.1\baselineskip%
4493     \list{\@biblabel{\@arabic\c@enumiv}}%
4494     {\settowidth\labelwidth{\@biblabel{#1}}%
4495     \leftmargin\labelwidth
4496     \advance\leftmargin\labelsep\relax
4497     \itemsep \IEEEbibitemsep\relax
4498     \usecounter{enumiv}%
4499     \let\p@enumiv\@empty
4500     \renewcommand\theenumiv{\@arabic\c@enumiv}}%
4501     \let\@IEEElatexbibitem\bibitem%
4502     \def\bibitem{\@IEEEbibitemprefix\@IEEElatexbibitem}%
4503 \def\newblock{\hskip .11em plus .33em minus .07em}%
4504 % originally:
4505 %   \sloppy\clubpenalty4000\widowpenalty4000%
4506 % by adding the \interlinepenalty here, we make it more
4507 % difficult, but not impossible, for LaTeX to break within a reference.
4508 % The IEEE almost never breaks a reference (but they do it more often with
4509 % technotes). You may get an underfull vbox warning around the bibliography, 
4510 % but the final result will be much more like what the IEEE will publish. 
4511 % MDS 11/2000
4512 \ifCLASSOPTIONtechnote\sloppy\clubpenalty4000\widowpenalty4000\interlinepenalty100%
4513 \else\sloppy\clubpenalty4000\widowpenalty4000\interlinepenalty500\fi%
4514     \sfcode`\.=1000\relax}
4515 \let\endthebibliography=\endlist
4516
4517
4518
4519
4520 % TITLE PAGE COMMANDS
4521
4522
4523 % \IEEEmembership is used to produce the sublargesize italic font used to indicate author 
4524 % IEEE membership. compsoc uses a large size sans slant font
4525 \def\IEEEmembership#1{{\@IEEEnotcompsoconly{\sublargesize}\normalfont\@IEEEcompsoconly{\sffamily}\textit{#1}}}
4526  
4527
4528 % \IEEEauthorrefmark{} produces a footnote type symbol to indicate author affiliation.
4529 % When given an argument of 1 to 9, \IEEEauthorrefmark{} follows the standard LaTeX footnote
4530 % symbol sequence convention. However, for arguments 10 and above, \IEEEauthorrefmark{} 
4531 % reverts to using lower case roman numerals, so it cannot overflow. Do note that you 
4532 % cannot use \footnotemark[] in place of \IEEEauthorrefmark{} within \author as the footnote
4533 % symbols will have been turned off to prevent \thanks from creating footnote marks.
4534 % \IEEEauthorrefmark{} produces a symbol that appears to LaTeX as having zero vertical
4535 % height - this allows for a more compact line packing, but the user must ensure that
4536 % the interline spacing is large enough to prevent \IEEEauthorrefmark{} from colliding
4537 % with the text above.
4538 % V1.7 make this a robust command
4539 % V1.8 transmag uses an arabic author affiliation symbol
4540 \ifCLASSOPTIONtransmag
4541 \DeclareRobustCommand*{\IEEEauthorrefmark}[1]{\raisebox{0pt}[0pt][0pt]{\textsuperscript{\footnotesize #1}}}
4542 \else
4543 \DeclareRobustCommand*{\IEEEauthorrefmark}[1]{\raisebox{0pt}[0pt][0pt]{\textsuperscript{\footnotesize\ensuremath{\ifcase#1\or *\or \dagger\or \ddagger\or%
4544     \mathsection\or \mathparagraph\or \|\or **\or \dagger\dagger%
4545     \or \ddagger\ddagger \else\textsuperscript{\expandafter\romannumeral#1}\fi}}}}
4546 \fi
4547
4548
4549 % FONT CONTROLS AND SPACINGS FOR CONFERENCE MODE AUTHOR NAME AND AFFILIATION BLOCKS
4550
4551 % The default font styles for the author name and affiliation blocks (confmode)
4552 \def\@IEEEauthorblockNstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\sublargesize}
4553 \def\@IEEEauthorblockAstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\@IEEEcompsocconfonly{\itshape}\normalsize}
4554 % The default if the user does not use an author block
4555 \def\@IEEEauthordefaulttextstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\sublargesize}
4556
4557 % adjustment spacing from title (or special paper notice) to author name blocks (confmode)
4558 % can be negative
4559 \def\@IEEEauthorblockconfadjspace{-0.25em}
4560 % compsoc conferences need more space here
4561 \@IEEEcompsocconfonly{\def\@IEEEauthorblockconfadjspace{0.75\@IEEEnormalsizeunitybaselineskip}}
4562
4563 % spacing between name and affiliation blocks (confmode)
4564 % This can be negative.
4565 % The IEEE doesn't want any added spacing here, but I will leave these
4566 % controls in place in case they ever change their mind.
4567 % Personally, I like 0.75ex.
4568 %\def\@IEEEauthorblockNtopspace{0.75ex}
4569 %\def\@IEEEauthorblockAtopspace{0.75ex}
4570 \def\@IEEEauthorblockNtopspace{0.0ex}
4571 \def\@IEEEauthorblockAtopspace{0.0ex}
4572 \ifCLASSOPTIONtransmag
4573 % transmag uses one line of space above first affiliation block
4574 \def\@IEEEauthorblockAtopspace{1\@IEEEnormalsizeunitybaselineskip}
4575 \fi
4576
4577 % baseline spacing within name and affiliation blocks (confmode)
4578 % must be positive, spacings below certain values will make 
4579 % the position of line of text sensitive to the contents of the
4580 % line above it i.e., whether or not the prior line has descenders, 
4581 % subscripts, etc. For this reason it is a good idea to keep
4582 % these above 2.6ex
4583 \def\@IEEEauthorblockNinterlinespace{2.6ex}
4584 \def\@IEEEauthorblockAinterlinespace{2.75ex}
4585
4586 % This tracks the required strut size.
4587 % See the \@IEEEauthorhalign command for the actual default value used.
4588 \def\@IEEEauthorblockXinterlinespace{2.7ex}
4589
4590 % variables to retain font size and style across groups
4591 % values given here have no effect as they will be overwritten later
4592 \gdef\@IEEESAVESTATEfontsize{10}
4593 \gdef\@IEEESAVESTATEfontbaselineskip{12}
4594 \gdef\@IEEESAVESTATEfontencoding{OT1}
4595 \gdef\@IEEESAVESTATEfontfamily{ptm}
4596 \gdef\@IEEESAVESTATEfontseries{m}
4597 \gdef\@IEEESAVESTATEfontshape{n}
4598
4599 % saves the current font attributes
4600 \def\@IEEEcurfontSAVE{\global\let\@IEEESAVESTATEfontsize\f@size%
4601 \global\let\@IEEESAVESTATEfontbaselineskip\f@baselineskip%
4602 \global\let\@IEEESAVESTATEfontencoding\f@encoding%
4603 \global\let\@IEEESAVESTATEfontfamily\f@family%
4604 \global\let\@IEEESAVESTATEfontseries\f@series%
4605 \global\let\@IEEESAVESTATEfontshape\f@shape}
4606
4607 % restores the saved font attributes
4608 \def\@IEEEcurfontRESTORE{\fontsize{\@IEEESAVESTATEfontsize}{\@IEEESAVESTATEfontbaselineskip}%
4609 \fontencoding{\@IEEESAVESTATEfontencoding}%
4610 \fontfamily{\@IEEESAVESTATEfontfamily}%
4611 \fontseries{\@IEEESAVESTATEfontseries}%
4612 \fontshape{\@IEEESAVESTATEfontshape}%
4613 \selectfont}
4614
4615
4616 % variable to indicate if the current block is the first block in the column
4617 \newif\if@IEEEprevauthorblockincol   \@IEEEprevauthorblockincolfalse
4618
4619
4620 % the command places a strut with height and depth = \@IEEEauthorblockXinterlinespace
4621 % we use this technique to have complete manual control over the spacing of the lines
4622 % within the halign environment.
4623 % We set the below baseline portion at 30%, the above
4624 % baseline portion at 70% of the total length.
4625 % Responds to changes in the document's \baselinestretch
4626 \def\@IEEEauthorstrutrule{\@IEEEtrantmpdimenA\@IEEEauthorblockXinterlinespace%
4627 \@IEEEtrantmpdimenA=\baselinestretch\@IEEEtrantmpdimenA%
4628 \rule[-0.3\@IEEEtrantmpdimenA]{0pt}{\@IEEEtrantmpdimenA}}
4629
4630
4631 % blocks to hold the authors' names and affilations. 
4632 % Makes formatting easy for conferences
4633 %
4634 % use real definitions in conference mode
4635 % name block
4636 \def\IEEEauthorblockN#1{\relax\@IEEEauthorblockNstyle% set the default text style
4637 \gdef\@IEEEauthorblockXinterlinespace{0pt}% disable strut for spacer row
4638 % the \expandafter hides the \cr in conditional tex, see the array.sty docs
4639 % for details, probably not needed here as the \cr is in a macro
4640 % do a spacer row if needed
4641 \if@IEEEprevauthorblockincol\expandafter\@IEEEauthorblockNtopspaceline\fi
4642 \global\@IEEEprevauthorblockincoltrue% we now have a block in this column
4643 %restore the correct strut value
4644 \gdef\@IEEEauthorblockXinterlinespace{\@IEEEauthorblockNinterlinespace}%
4645 % input the author names
4646 #1%
4647 % end the row if the user did not already
4648 \crcr}
4649 % spacer row for names
4650 \def\@IEEEauthorblockNtopspaceline{\cr\noalign{\vskip\@IEEEauthorblockNtopspace}}
4651 %
4652 % affiliation block
4653 \def\IEEEauthorblockA#1{\relax\@IEEEauthorblockAstyle% set the default text style
4654 \gdef\@IEEEauthorblockXinterlinespace{0pt}%disable strut for spacer row
4655 % the \expandafter hides the \cr in conditional tex, see the array.sty docs
4656 % for details, probably not needed here as the \cr is in a macro
4657 % do a spacer row if needed
4658 \if@IEEEprevauthorblockincol\expandafter\@IEEEauthorblockAtopspaceline\fi
4659 \global\@IEEEprevauthorblockincoltrue% we now have a block in this column
4660 %restore the correct strut value
4661 \gdef\@IEEEauthorblockXinterlinespace{\@IEEEauthorblockAinterlinespace}%
4662 % input the author affiliations
4663 #1%
4664 % end the row if the user did not already
4665 \crcr
4666 % V1.8 transmag does not use any additional affiliation spacing after the first author
4667 \ifCLASSOPTIONtransmag\gdef\@IEEEauthorblockAtopspace{0pt}\fi}
4668
4669 % spacer row for affiliations
4670 \def\@IEEEauthorblockAtopspaceline{\cr\noalign{\vskip\@IEEEauthorblockAtopspace}}
4671
4672
4673 % allow papers to compile even if author blocks are used in modes other
4674 % than conference or peerreviewca. For such cases, we provide dummy blocks.
4675 \ifCLASSOPTIONconference
4676 \else
4677    \ifCLASSOPTIONpeerreviewca\else
4678       % not conference, peerreviewca or transmag mode
4679       \ifCLASSOPTIONtransmag\else
4680          \def\IEEEauthorblockN#1{#1}%
4681          \def\IEEEauthorblockA#1{#1}%
4682       \fi
4683    \fi
4684 \fi
4685
4686
4687
4688 % we provide our own halign so as not to have to depend on tabular
4689 \def\@IEEEauthorhalign{\@IEEEauthordefaulttextstyle% default text style
4690    \lineskip=0pt\relax% disable line spacing
4691    \lineskiplimit=0pt\relax%
4692    \baselineskip=0pt\relax%
4693    \@IEEEcurfontSAVE% save the current font
4694    \mathsurround\z@\relax% no extra spacing around math
4695    \let\\\@IEEEauthorhaligncr% replace newline with halign friendly one
4696    \tabskip=0pt\relax% no column spacing
4697    \everycr{}% ensure no problems here
4698    \@IEEEprevauthorblockincolfalse% no author blocks yet
4699    \def\@IEEEauthorblockXinterlinespace{2.7ex}% default interline space
4700    \vtop\bgroup%vtop box
4701    \halign\bgroup&\relax\hfil\@IEEEcurfontRESTORE\relax ##\relax
4702    \hfil\@IEEEcurfontSAVE\@IEEEauthorstrutrule\cr}
4703
4704 % ensure last line, exit from halign, close vbox
4705 \def\end@IEEEauthorhalign{\crcr\egroup\egroup}
4706
4707 % handle bogus star form
4708 \def\@IEEEauthorhaligncr{{\ifnum0=`}\fi\@ifstar{\@@IEEEauthorhaligncr}{\@@IEEEauthorhaligncr}}
4709
4710 % test and setup the optional argument to \\[]
4711 \def\@@IEEEauthorhaligncr{\@testopt\@@@IEEEauthorhaligncr\z@skip}
4712
4713 % end the line and do the optional spacer
4714 \def\@@@IEEEauthorhaligncr[#1]{\ifnum0=`{\fi}\cr\noalign{\vskip#1\relax}}
4715
4716
4717
4718 % flag to prevent multiple \and warning messages
4719 \newif\if@IEEEWARNand
4720 \@IEEEWARNandtrue
4721
4722 % if in conference or peerreviewca modes, we support the use of \and as \author is a
4723 % tabular environment, otherwise we warn the user that \and is invalid
4724 % outside of conference or peerreviewca modes.
4725 \def\and{\relax} % provide a bogus \and that we will then override
4726
4727 \renewcommand{\and}[1][\relax]{\if@IEEEWARNand\typeout{** WARNING: \noexpand\and is valid only
4728                                when in conference or peerreviewca}\typeout{modes (line \the\inputlineno).}\fi\global\@IEEEWARNandfalse}
4729
4730 \ifCLASSOPTIONconference%
4731 \renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}%
4732 \fi
4733 \ifCLASSOPTIONpeerreviewca
4734 \renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}%
4735 \fi
4736 % V1.8 transmag uses conference author format
4737 \ifCLASSOPTIONtransmag
4738 \renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}%
4739 \fi
4740
4741 % page clearing command
4742 % based on LaTeX2e's \cleardoublepage, but allows different page styles
4743 % for the inserted blank pages
4744 \def\@IEEEcleardoublepage#1{\clearpage\if@twoside\ifodd\c@page\else
4745 \hbox{}\thispagestyle{#1}\newpage\if@twocolumn\hbox{}\thispagestyle{#1}\newpage\fi\fi\fi}
4746
4747 % V1.8b hooks to allow adjustment of space above title
4748 \def\IEEEtitletopspace{0.5\baselineskip}
4749 % an added extra amount to allow for adjustment/offset
4750 \def\IEEEtitletopspaceextra{0pt}
4751
4752 % user command to invoke the title page
4753 \def\maketitle{\par%
4754   \begingroup%
4755   \normalfont%
4756   \def\thefootnote{}%  the \thanks{} mark type is empty
4757   \def\footnotemark{}% and kill space from \thanks within author
4758   \let\@makefnmark\relax% V1.7, must *really* kill footnotemark to remove all \textsuperscript spacing as well.
4759   \footnotesize%       equal spacing between thanks lines
4760   \footnotesep 0.7\baselineskip%see global setting of \footnotesep for more info
4761   % V1.7 disable \thanks note indention for compsoc
4762   \@IEEEcompsoconly{\long\def\@makefntext##1{\parindent 1em\noindent\hbox{\@makefnmark}##1}}%
4763   \normalsize%
4764   \ifCLASSOPTIONpeerreview
4765      \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext%
4766      \thispagestyle{IEEEpeerreviewcoverpagestyle}\@thanks%
4767   \else
4768      \if@twocolumn%
4769         \ifCLASSOPTIONtechnote%
4770            \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext%
4771         \else
4772            \twocolumn[{\IEEEquantizevspace{\@maketitle}[\IEEEquantizedisabletitlecmds]{0pt}[-\topskip]{\baselineskip}{\@IEEENORMtitlevspace}{\@IEEEMINtitlevspace}\@IEEEaftertitletext}]%
4773         \fi
4774      \else
4775         \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext%
4776      \fi
4777      \thispagestyle{IEEEtitlepagestyle}\@thanks%
4778   \fi
4779   % pullup page for pubid if used.
4780   \if@IEEEusingpubid
4781      \enlargethispage{-\@IEEEpubidpullup}%
4782   \fi 
4783   \endgroup
4784   \setcounter{footnote}{0}\let\maketitle\relax\let\@maketitle\relax
4785   \gdef\@thanks{}%
4786   % v1.6b do not clear these as we will need the title again for peer review papers
4787   % \gdef\@author{}\gdef\@title{}%
4788   \let\thanks\relax}
4789
4790
4791 % V1.8 parbox to format \@IEEEtitleabstractindextext
4792 \long\def\@IEEEtitleabstractindextextbox#1{\parbox{1\textwidth}{#1}}
4793 % V1.8 compsoc is partial width
4794 \ifCLASSOPTIONcompsoc
4795 % comparison with proofs suggests it's in the range of 92.1-92.3%
4796 \long\def\@IEEEtitleabstractindextextbox#1{\parbox{0.922\textwidth}{\@IEEEcompsocnotconfonly{\rightskip\@flushglue\leftskip\z@skip}#1}}
4797 \fi
4798
4799 % formats the Title, authors names, affiliations and special paper notice
4800 % THIS IS A CONTROLLED SPACING COMMAND! Do not allow blank lines or unintentional
4801 % spaces to enter the definition - use % at the end of each line
4802 \def\@maketitle{\newpage
4803 \bgroup\par\vskip\IEEEtitletopspace\vskip\IEEEtitletopspaceextra\centering%
4804 \ifCLASSOPTIONtechnote% technotes, V1.8a abstract and index terms are not treated differently for compsoc technotes
4805    {\bfseries\large\@IEEEcompsoconly{\Large\sffamily}\@title\par}\vskip 1.3em{\lineskip .5em\@IEEEcompsoconly{\large\sffamily}\@author
4806    \@IEEEspecialpapernotice\par}\relax
4807 \else% not a technote
4808    \vskip0.2em{\Huge\ifCLASSOPTIONtransmag\bfseries\LARGE\fi\@IEEEcompsoconly{\sffamily}\@IEEEcompsocconfonly{\normalfont\normalsize\vskip 2\@IEEEnormalsizeunitybaselineskip
4809    \bfseries\Large}\@IEEEcompsocnotconfonly{\vskip 0.75\@IEEEnormalsizeunitybaselineskip}\@title\par}\relax
4810    \@IEEEcompsocnotconfonly{\vskip 0.5\@IEEEnormalsizeunitybaselineskip}\vskip1.0em\par%
4811    % V1.6 handle \author differently if in conference mode
4812    \ifCLASSOPTIONconference%
4813       {\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace%
4814        \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par}\relax
4815    \else% peerreviewca, peerreview or journal
4816       \ifCLASSOPTIONpeerreviewca
4817          % peerreviewca handles author names just like conference mode
4818          {\@IEEEcompsoconly{\sffamily}\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace%
4819           \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par
4820           {\@IEEEcompsoconly{\vskip 1.5em\relax
4821            \@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\par\noindent\hfill
4822            \IEEEcompsocdiamondline\hfill\hbox{}\par}}}\relax
4823       \else% journal, peerreview or transmag
4824          \ifCLASSOPTIONtransmag
4825             % transmag also handles author names just like conference mode
4826             % it also uses \@IEEEtitleabstractindextex, but with one line less
4827             % space above, and one more below
4828            {\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace%
4829             \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par
4830            {\vspace{0.5\baselineskip}\relax\@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\vspace{-1\baselineskip}\par}}\relax
4831          \else% journal or peerreview
4832            {\lineskip.5em\@IEEEcompsoconly{\sffamily}\sublargesize\@author\@IEEEspecialpapernotice\par
4833            {\@IEEEcompsoconly{\vskip 1.5em\relax
4834             \@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\par\noindent\hfill
4835             \IEEEcompsocdiamondline\hfill\hbox{}\par}}}\relax
4836          \fi
4837       \fi
4838    \fi
4839 \fi\par\addvspace{0.5\baselineskip}\egroup}
4840
4841
4842 % V1.7 Computer Society "diamond line" which follows index terms for nonconference papers
4843 % V1.8a full width diamond line for single column use
4844 \def\@IEEEcompsocdiamondlinei{\vrule depth 0pt height 0.5pt width 4cm\nobreak\hspace{7.5pt}\nobreak
4845 \raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak
4846 \hspace{7.5pt}\nobreak\vrule depth 0pt height 0.5pt width 4cm\relax}
4847 % V1.8a narrower width diamond line for double column use
4848 \def\@IEEEcompsocdiamondlineii{\vrule depth 0pt height 0.5pt width 2.5cm\nobreak\hspace{7.5pt}\nobreak
4849 \raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak
4850 \hspace{7.5pt}\nobreak\vrule depth 0pt height 0.5pt width 2.5cm\relax}
4851 % V1.8a bare core without rules to base a last resort on for very narrow linewidths
4852 \def\@IEEEcompsocdiamondlineiii{\mbox{}\nobreak\hspace{7.5pt}\nobreak
4853 \raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak
4854 \hspace{7.5pt}\nobreak\mbox{}\relax}
4855
4856 % V1.8a allow \IEEEcompsocdiamondline to adjust for different linewidths.
4857 % Use \@IEEEcompsocdiamondlinei if its width is less than 0.66\linewidth (0.487 nominal for single column)
4858 % if not, fall back to \@IEEEcompsocdiamondlineii if its width is less than 0.75\linewidth (0.659 nominal for double column)
4859 % if all else fails, try to make a custom diamondline based on the abnormally narrow linewidth
4860 \def\IEEEcompsocdiamondline{\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlinei}\relax
4861 \ifdim\@IEEEtrantmpdimenA<0.66\linewidth\relax\@IEEEcompsocdiamondlinei\relax
4862 \else
4863 \settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlineii}\relax
4864 \ifdim\@IEEEtrantmpdimenA<0.75\linewidth\relax\@IEEEcompsocdiamondlineii\relax
4865 \else
4866 \settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlineiii}\relax
4867 \@IEEEtrantmpdimenB=\linewidth\relax
4868 \addtolength{\@IEEEtrantmpdimenB}{-1\@IEEEtrantmpdimenA}\relax
4869 \vrule depth 0pt height 0.5pt width 0.33\@IEEEtrantmpdimenB\@IEEEcompsocdiamondlineiii\vrule depth 0pt height 0.5pt width 0.33\@IEEEtrantmpdimenB\relax
4870 \fi\fi}
4871
4872
4873 % V1.7 standard LateX2e \thanks, but with \itshape under compsoc. Also make it a \long\def
4874 % We also need to trigger the one-shot footnote rule
4875 \def\@IEEEtriggeroneshotfootnoterule{\global\@IEEEenableoneshotfootnoteruletrue}
4876
4877
4878 \long\def\thanks#1{\footnotemark
4879     \protected@xdef\@thanks{\@thanks
4880         \protect\footnotetext[\the\c@footnote]{\@IEEEcompsoconly{\itshape
4881         \protect\@IEEEtriggeroneshotfootnoterule\relax}\ignorespaces#1}}}
4882 \let\@thanks\@empty
4883
4884
4885 % V1.7 allow \author to contain \par's. This is needed to allow \thanks to contain \par.
4886 \long\def\author#1{\gdef\@author{#1}}
4887
4888
4889 % in addition to setting up IEEEitemize, we need to remove a baselineskip space above and
4890 % below it because \list's \pars introduce blank lines because of the footnote struts.
4891 \def\@IEEEsetupcompsocitemizelist{\def\labelitemi{$\bullet$}%
4892 \setlength{\IEEElabelindent}{0pt}\setlength{\labelsep}{1.2em}\setlength{\parskip}{0pt}%
4893 \setlength{\partopsep}{0pt}\setlength{\topsep}{0.5\baselineskip}\vspace{-1\baselineskip}\relax}
4894
4895
4896 % flag for fake non-compsoc \IEEEcompsocthanksitem - prevents line break on very first item
4897 \newif\if@IEEEbreakcompsocthanksitem \@IEEEbreakcompsocthanksitemfalse
4898
4899 \ifCLASSOPTIONcompsoc
4900 % V1.7 compsoc bullet item \thanks
4901 % also, we need to redefine this to destroy the argument in \IEEEquantizevspace
4902 \long\def\IEEEcompsocitemizethanks#1{\relax\@IEEEbreakcompsocthanksitemfalse\footnotemark
4903     \protected@xdef\@thanks{\@thanks
4904         \protect\footnotetext[\the\c@footnote]{\itshape\protect\@IEEEtriggeroneshotfootnoterule
4905         {\let\IEEEiedlistdecl\relax\protect\begin{IEEEitemize}[\protect\@IEEEsetupcompsocitemizelist]\ignorespaces#1\relax
4906         \protect\end{IEEEitemize}}\protect\vspace{-1\baselineskip}}}}
4907 \DeclareRobustCommand*{\IEEEcompsocthanksitem}{\item}
4908 \else
4909 % non-compsoc, allow for dual compilation via rerouting to normal \thanks
4910 \long\def\IEEEcompsocitemizethanks#1{\thanks{#1}}
4911 % redirect to "pseudo-par" \hfil\break\indent after swallowing [] from \IEEEcompsocthanksitem[]
4912 \DeclareRobustCommand{\IEEEcompsocthanksitem}{\@ifnextchar [{\@IEEEthanksswallowoptionalarg}%
4913 {\@IEEEthanksswallowoptionalarg[\relax]}}
4914 % be sure and break only after first item, be sure and ignore spaces after optional argument
4915 \def\@IEEEthanksswallowoptionalarg[#1]{\relax\if@IEEEbreakcompsocthanksitem\hfil\break
4916 \indent\fi\@IEEEbreakcompsocthanksitemtrue\ignorespaces}
4917 \fi
4918
4919
4920 % V1.6b define the \IEEEpeerreviewmaketitle as needed
4921 \ifCLASSOPTIONpeerreview
4922 \def\IEEEpeerreviewmaketitle{\@IEEEcleardoublepage{empty}%
4923 \ifCLASSOPTIONtwocolumn
4924 \twocolumn[{\IEEEquantizevspace{\@IEEEpeerreviewmaketitle}[\IEEEquantizedisabletitlecmds]{0pt}[-\topskip]{\baselineskip}{\@IEEENORMtitlevspace}{\@IEEEMINtitlevspace}}]
4925 \else
4926 \newpage\@IEEEpeerreviewmaketitle\@IEEEstatictitlevskip
4927 \fi
4928 \thispagestyle{IEEEtitlepagestyle}}
4929 \else
4930 % \IEEEpeerreviewmaketitle does nothing if peer review option has not been selected
4931 \def\IEEEpeerreviewmaketitle{\relax}
4932 \fi
4933
4934 % peerreview formats the repeated title like the title in journal papers.
4935 \def\@IEEEpeerreviewmaketitle{\bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEcompsoconly{\sffamily}%
4936 \normalfont\normalsize\vskip0.2em{\Huge\@title\par}\vskip1.0em\par
4937 \par\addvspace{0.5\baselineskip}\egroup}
4938
4939
4940
4941 % V1.6 
4942 % this is a static rubber spacer between the title/authors and the main text
4943 % used for single column text, or when the title appears in the first column
4944 % of two column text (technotes). 
4945 \def\@IEEEstatictitlevskip{{\normalfont\normalsize
4946 % adjust spacing to next text
4947 % v1.6b handle peer review papers
4948 \ifCLASSOPTIONpeerreview
4949 % for peer review papers, the same value is used for both title pages
4950 % regardless of the other paper modes
4951    \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip
4952 \else
4953    \ifCLASSOPTIONconference% conference
4954       \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip%
4955    \else%
4956       \ifCLASSOPTIONtechnote% technote
4957          \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip%
4958       \else% journal uses more space
4959          \vskip 2.5\baselineskip plus 0.75\baselineskip minus 0.375\baselineskip%
4960       \fi
4961    \fi
4962 \fi}}
4963
4964
4965 % set the nominal and minimum values for the quantized title spacer
4966 % the quantization algorithm will not allow the spacer size to
4967 % become less than \@IEEEMINtitlevspace - instead it will be lengthened
4968 % default to journal values
4969 \def\@IEEENORMtitlevspace{2.5\baselineskip}
4970 \def\@IEEEMINtitlevspace{2\baselineskip}
4971 % conferences and technotes need tighter spacing
4972 \ifCLASSOPTIONconference% conference
4973   \def\@IEEENORMtitlevspace{1\baselineskip}
4974   \def\@IEEEMINtitlevspace{0.75\baselineskip}
4975 \fi
4976 \ifCLASSOPTIONtechnote% technote
4977   \def\@IEEENORMtitlevspace{1\baselineskip}
4978   \def\@IEEEMINtitlevspace{0.75\baselineskip}
4979 \fi
4980
4981
4982 % V1.8a
4983 \def\IEEEquantizevspace{\begingroup\@ifstar{\@IEEEquantizevspacestarformtrue\@IEEEquantizevspace}{\@IEEEquantizevspacestarformfalse\@IEEEquantizevspace}}
4984 % \IEEEquantizevspace[output dimen register]{object}[object decl]
4985 %                    {top baselineskip}
4986 %                    [offset][prevdepth][lineskip limit][lineskip]
4987 %                    {unit height}{nominal vspace}{minimum vspace}
4988 %
4989 % Calculates and creates the vspace needed to make the combined height with
4990 % the given object an integer multiple of the given unit height. This command
4991 % is more general than the older \@IEEEdynamictitlevspace it replaces.
4992 %
4993 % The star form has no effect at present, but is reserved for future use.
4994 %
4995 % If the optional argument [output dimen register] is given, the calculated
4996 % vspace height is stored in the given output dimen (or skip) register
4997 % and no other action is taken, otherwise the object followed by a vspace*
4998 % of the appropriate height is evaluated/output.
4999 %
5000 % The optional object decl (declarations) is code that is evaluated just
5001 % before the object's height is evaluated. Its intented purpose is to allow
5002 % for the alteration or disabling of code within the object during internal
5003 % height evaluation (e.g., \long\def\thanks#1{\relax} ).
5004 % This special code is not invoked if/when the object is rendered at the end.
5005 %
5006 % The nominal vspace is the target value of the added vspace and the minimum
5007 % vspace is the lower allowed limit. The vspacer will be the value that achieves
5008 % integral overall height, in terms of the given unit height, that is closest
5009 % to the nominal vspace and that is not less than the specified minimum vspace.
5010 %
5011 % The line spacing algorithm of TeX is somewhat involved and requires special
5012 % care with regard to the first line of a vertical list (which is indicated
5013 % when \prevdepth is -1000pt or less). top baselineskip specifies the
5014 % baselineskip or topskip used prior to the object. If the height of the
5015 % first line of the object is greater than the given top baselineskip, then
5016 % the top baselineskip is subtracted from the height of the first line and
5017 % that difference is considered along with the rest of the object height
5018 % (because the object will be shifted down by an amount = 
5019 % top line height - top baselineskip). Otherwise, the height of the first line
5020 % of the object is ignored as far as the calculations are concerned.
5021 % This algorithm is adequate for objects that appear at the top of a page
5022 % (e.g., titles) where \topskip spacing is used.
5023 %
5024 % However, as explained on page 78 of the TeXbook, interline spacing is more
5025 % complex when \baselineskip is being used (indicated by \prevdepth > 
5026 % -1000pt). The four optional parameters offset, prevdepth, lineskip limit and
5027 % lineskip are assumed to be equal to be 0pt, \prevdepth, \lineskiplimit and
5028 % \lineskip, respectively, if they are omitted.
5029 %
5030 % The prevdepth is the depth of the line before the object, the lineskip limit
5031 % specifies how close the top of the object can come to the bottom of the
5032 % previous line before \baselineskip is ignored and \lineskip is inserted
5033 % between the object and the line above it. Lineskip does not come into
5034 % play unless the first line of the object is high enough to "get too close"
5035 % (as specified by lineskiplimit) to the line before it. The the prevdepth,
5036 % lineskip limit, and lineskip optional parameters are not needed for the
5037 % first object/line on a page (i.e., prevdepth <= -1000pt) where the simplier
5038 % \topskip spacing rules are in effect.
5039 %
5040 % Offset is a manual adjustment that is added to the height calculations of
5041 % object irrespective of the value of \prevdepth. It is useful when the top
5042 % baselineskip will result in a noninteger unit height object placement even
5043 % if the object itself has integral height. e.g., a footnotesize baselineskip
5044 % is used before the object, thus an offset of, say -3pt, can be given as a
5045 % correction.
5046
5047 % Common combinations of these parameters include:
5048 %
5049 % top baselineskip:   (and default values for offset, prevdepth, etc.)
5050 % \topskip            % for objects that appear at the top of a page
5051 % \maxdimen           % always ignore the height of the top line
5052 % 0pt                 % always consider any positive height of the top line
5053 %
5054 % for objects to appear inline in normal text:
5055 % top baselineskip = \baselineskip
5056 %
5057 % set prevdepth = -1000pt and top baselineskip = 0pt to consider the
5058 % overall height of the object without any other external skip
5059 % consideration
5060
5061 \newif\if@IEEEquantizevspacestarform       % flag to indicate star form
5062 \newif\if@IEEEquantizevspaceuseoutdimenreg % flag to indicate output dimen register is to be used
5063 % Use our own private registers because the object could contain a
5064 % structure that uses the existing tmp scratch pad registers
5065 \newdimen\@IEEEquantizeheightA
5066 \newdimen\@IEEEquantizeheightB
5067 \newdimen\@IEEEquantizeheightC
5068 \newdimen\@IEEEquantizeprevdepth % need to save this early as can change
5069 \newcount\@IEEEquantizemultiple
5070 \newbox\@IEEEquantizeboxA
5071
5072
5073 \def\@IEEEquantizevspace{\@ifnextchar [{\@IEEEquantizevspaceuseoutdimenregtrue\@@IEEEquantizevspace}{\@IEEEquantizevspaceuseoutdimenregfalse\@@IEEEquantizevspace[]}}
5074
5075
5076 \long\def\@@IEEEquantizevspace[#1]#2{\relax
5077 % acquire and store
5078 % #1 optional output dimen register
5079 % #2 object
5080 \edef\@IEEEquantizeoutdimenreg{#1}\relax
5081 % allow for object specifications that contain parameters
5082 \@IEEEtrantmptoksA={#2}\relax
5083 \long\edef\@IEEEquantizeobject{\the\@IEEEtrantmptoksA}\relax
5084 \@ifnextchar [{\@@@IEEEquantizevspace}{\@@@IEEEquantizevspace[\relax]}}
5085
5086 \long\def\@@@IEEEquantizevspace[#1]#2{\relax
5087 % acquire and store
5088 % [#1] optional object decl, is \relax if not given by user
5089 % #2 top baselineskip
5090 % allow for object decl specifications that have parameters
5091 \@IEEEtrantmptoksA={#1}\relax
5092 \long\edef\@IEEEquantizeobjectdecl{\the\@IEEEtrantmptoksA}\relax
5093 \edef\@IEEEquantizetopbaselineskip{#2}\ivIEEEquantizevspace}
5094
5095 % acquire optional argument set and store
5096 % [offset][prevdepth][lineskip limit][lineskip]
5097 \def\ivIEEEquantizevspace{\@ifnextchar [{\@vIEEEquantizevspace}{\@vIEEEquantizevspace[0pt]}}
5098 \def\@vIEEEquantizevspace[#1]{\edef\@IEEEquantizeoffset{#1}\@ifnextchar [{\@viIEEEquantizevspace}{\@viIEEEquantizevspace[\prevdepth]}}
5099 \def\@viIEEEquantizevspace[#1]{\@IEEEquantizeprevdepth=#1\relax\@ifnextchar [{\@viiIEEEquantizevspace}{\@viiIEEEquantizevspace[\lineskiplimit]}}
5100 \def\@viiIEEEquantizevspace[#1]{\edef\@IEEEquantizelineskiplimit{#1}\@ifnextchar [{\@viiiIEEEquantizevspace}{\@viiiIEEEquantizevspace[\lineskip]}}
5101 \def\@viiiIEEEquantizevspace[#1]{\edef\@IEEEquantizelineskip{#1}\@ixIEEEquantizevspace}
5102
5103 % main routine
5104 \def\@ixIEEEquantizevspace#1#2#3{\relax
5105 \edef\@IEEEquantizeunitheight{#1}\relax
5106 \edef\@IEEEquantizenomvspace{#2}\relax
5107 \edef\@IEEEquantizeminvspace{#3}\relax
5108 % \@IEEEquantizeoutdimenreg
5109 % \@IEEEquantizeobject
5110 % \@IEEEquantizeobjectdecl
5111 % \@IEEEquantizetopbaselineskip
5112 % \@IEEEquantizeoffset
5113 % \@IEEEquantizeprevdepth
5114 % \@IEEEquantizelineskiplimit
5115 % \@IEEEquantizelineskip
5116 % \@IEEEquantizeunitheight
5117 % \@IEEEquantizenomvspace
5118 % \@IEEEquantizeminvspace
5119 % get overall height of object
5120 \setbox\@IEEEquantizeboxA\vbox{\begingroup\@IEEEquantizeobjectdecl\@IEEEquantizeobject\relax\endgroup}\relax
5121 \@IEEEquantizeheightA\ht\@IEEEquantizeboxA\relax
5122 % get height of first line of object
5123 \setbox\@IEEEquantizeboxA\vtop{\begingroup\@IEEEquantizeobjectdecl\@IEEEquantizeobject\relax\endgroup}\relax
5124 \@IEEEquantizeheightB\ht\@IEEEquantizeboxA\relax
5125 \ifdim\@IEEEquantizeprevdepth>-1000pt\relax % prevdepth > -1000pf means full baselineskip\lineskip rules in effect
5126 % lineskip spacing rule takes effect if height of top line > baselineskip - prevdepth - lineskiplimit, 
5127 % otherwise the baselineskip rule is in effect and the height of the first line does not matter at all.
5128 \@IEEEquantizeheightC=\@IEEEquantizetopbaselineskip\relax
5129 \advance\@IEEEquantizeheightC-\@IEEEquantizeprevdepth\relax
5130 \advance\@IEEEquantizeheightC-\@IEEEquantizelineskiplimit\relax % this works even though \@IEEEquantizelineskiplimit is a macro because TeX allows --10pt notation
5131 \ifdim\@IEEEquantizeheightB>\@IEEEquantizeheightC\relax
5132 % lineskip spacing rule is in effect i.e., the object is going to be shifted down relative to the
5133 % baselineskip set position by its top line height (already a part of the total height) + prevdepth + lineskip - baselineskip
5134 \advance\@IEEEquantizeheightA\@IEEEquantizeprevdepth\relax
5135 \advance\@IEEEquantizeheightA\@IEEEquantizelineskip\relax
5136 \advance\@IEEEquantizeheightA-\@IEEEquantizetopbaselineskip\relax
5137 \else
5138 % height of first line <= \@IEEEquantizetopbaselineskip - \@IEEEquantizeprevdepth - \@IEEEquantizelineskiplimit
5139 % standard baselineskip rules are in effect, so don't consider height of first line
5140 \advance\@IEEEquantizeheightA-\@IEEEquantizeheightB\relax
5141 \fi
5142 %
5143 \else % prevdepth <= -1000pt, simplier \topskip type rules in effect
5144 \ifdim\@IEEEquantizeheightB>\@IEEEquantizetopbaselineskip
5145 % height of top line (already included in the total height) in excess of
5146 % baselineskip is the amount it will be downshifted
5147 \advance\@IEEEquantizeheightA-\@IEEEquantizetopbaselineskip\relax
5148 \else
5149 % height of first line is irrelevant, remove it
5150 \advance\@IEEEquantizeheightA-\@IEEEquantizeheightB\relax
5151 \fi
5152 \fi % prevdepth <= -1000pt
5153 %
5154 % adjust height for any manual offset
5155 \advance\@IEEEquantizeheightA\@IEEEquantizeoffset\relax
5156 % add in nominal spacer
5157 \advance\@IEEEquantizeheightA\@IEEEquantizenomvspace\relax
5158 % check for nonzero unitheight
5159 \@IEEEquantizeheightB=\@IEEEquantizeunitheight\relax
5160 \ifnum\@IEEEquantizeheightB=0\relax
5161 \@IEEEclspkgerror{IEEEquantizevspace unit height cannot be zero. Assuming 10pt.}%
5162 {Division by zero is not allowed.}
5163 \@IEEEquantizeheightB=10pt\relax
5164 \fi
5165 % get integer number of lines
5166 \@IEEEquantizemultiple=\@IEEEquantizeheightA\relax
5167 \divide\@IEEEquantizemultiple\@IEEEquantizeheightB\relax
5168 % set A to contain the excess height over the \@IEEEquantizemultiple of lines
5169 % A = height - multiple*unitheight
5170 \@IEEEquantizeheightC\@IEEEquantizeheightB\relax
5171 \multiply\@IEEEquantizeheightC\@IEEEquantizemultiple\relax
5172 \advance\@IEEEquantizeheightA-\@IEEEquantizeheightC\relax
5173 % set B to contain the height short of \@IEEEquantizemultiple+1 of lines
5174 % B = unitheight - A
5175 \advance\@IEEEquantizeheightB-\@IEEEquantizeheightA\relax
5176 % choose A or B based on which is closer
5177 \@IEEEquantizeheightC\@IEEEquantizenomvspace\relax
5178 \ifdim\@IEEEquantizeheightA<\@IEEEquantizeheightB\relax
5179 % C = nomvspace - A, go with lower
5180 \advance\@IEEEquantizeheightC-\@IEEEquantizeheightA\relax
5181 \else
5182 % C = nomvspace + B, go with upper
5183 \advance\@IEEEquantizeheightC\@IEEEquantizeheightB\relax
5184 \fi
5185 % if violate lower bound, use next integer bound
5186 \ifdim\@IEEEquantizeheightC<\@IEEEquantizeminvspace\relax
5187 % A + B = unitheight
5188 \advance\@IEEEquantizeheightC\@IEEEquantizeheightA\relax
5189 \advance\@IEEEquantizeheightC\@IEEEquantizeheightB\relax
5190 \fi
5191 % export object and spacer outside of group
5192 \global\let\@IEEEquantizeobjectout\@IEEEquantizeobject\relax
5193 \global\@IEEEquantizeheightC\@IEEEquantizeheightC\relax
5194 \endgroup
5195 \if@IEEEquantizevspaceuseoutdimenreg
5196 \@IEEEquantizeoutdimenreg=\@IEEEquantizeheightC\relax
5197 \else
5198 \@IEEEquantizeobjectout\relax
5199 \vskip\@IEEEquantizeheightC\relax
5200 \fi}
5201
5202
5203 % user command to disable all global assignments, possible use within object decl
5204 \def\IEEEquantizedisableglobal{\let\global\relax
5205 \let\gdef\def
5206 \let\xdef\edef}
5207 % user command to allow for the disabling of \thanks and other commands, possible use within object decl
5208 \def\IEEEquantizedisabletitlecmds{\long\def\thanks##1{\relax}\relax
5209 \long\def\IEEEcompsocitemizethanks##1{\relax}\def\newpage{\relax}}
5210
5211
5212
5213
5214
5215 % V1.6
5216 % we allow the user access to the last part of the title area
5217 % useful in emergencies such as when a different spacing is needed
5218 % This text is NOT compensated for in the dynamic sizer.
5219 \let\@IEEEaftertitletext=\relax
5220 \long\def\IEEEaftertitletext#1{\def\@IEEEaftertitletext{#1}}
5221
5222
5223 % V1.7 provide a way for users to enter abstract and keywords
5224 % into the onecolumn title are. This text is compensated for
5225 % in the dynamic sizer.
5226 \let\@IEEEtitleabstractindextext=\relax
5227 \long\def\IEEEtitleabstractindextext#1{\def\@IEEEtitleabstractindextext{#1}}
5228
5229 % V1.7 provide a way for users to get the \@IEEEtitleabstractindextext if
5230 % not in compsoc or transmag journal mode - this way abstract and keywords
5231 % can still be placed in their conventional position if not in those modes.
5232 \def\IEEEdisplaynontitleabstractindextext{%
5233 % display for all conference formats
5234 \ifCLASSOPTIONconference\@IEEEtitleabstractindextext\relax
5235 \else% non-conferences
5236   % V1.8a display for all technotes
5237   \ifCLASSOPTIONtechnote\@IEEEtitleabstractindextext\relax
5238   % V1.8a add diamond line after abstract and index terms for compsoc technotes
5239   \@IEEEcompsoconly{\noindent\hfill\IEEEcompsocdiamondline\hfill\hbox{}\par}\relax
5240   \else % non-conferences and non-technotes
5241     \ifCLASSOPTIONcompsoc% display if not compsoc and not transmag
5242     \else
5243       \ifCLASSOPTIONtransmag
5244       \else% not compsoc journal nor transmag journal
5245          \@IEEEtitleabstractindextext\relax
5246       \fi
5247     \fi
5248   \fi
5249 \fi}
5250
5251
5252 % command to allow alteration of baselinestretch, but only if the current
5253 % baselineskip is unity. Used to tweak the compsoc abstract and keywords line spacing.
5254 \def\@IEEEtweakunitybaselinestretch#1{{\def\baselinestretch{1}\selectfont
5255 \global\@tempskipa\baselineskip}\ifnum\@tempskipa=\baselineskip%
5256 \def\baselinestretch{#1}\selectfont\fi\relax}
5257
5258
5259 % abstract and keywords are in \small, except 
5260 % for 9pt docs in which they are in \footnotesize
5261 % Because 9pt docs use an 8pt footnotesize, \small
5262 % becomes a rather awkward 8.5pt
5263 \def\@IEEEabskeysecsize{\small}
5264 \ifx\CLASSOPTIONpt\@IEEEptsizenine
5265  \def\@IEEEabskeysecsize{\footnotesize}
5266 \fi
5267
5268 % compsoc journals use \footnotesize, compsoc conferences use normalsize
5269 \@IEEEcompsoconly{\def\@IEEEabskeysecsize{\footnotesize}}
5270 \@IEEEcompsocconfonly{\def\@IEEEabskeysecsize{\small}}
5271
5272
5273 % V1.6 have abstract and keywords strip leading spaces, pars and newlines
5274 % so that spacing is more tightly controlled.
5275 \def\abstract{\normalfont
5276     \if@twocolumn
5277       \@IEEEabskeysecsize\bfseries\textit{\abstractname}---\relax
5278     \else
5279       \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize
5280     \fi\@IEEEgobbleleadPARNLSP}
5281 % V1.6 The IEEE wants only 1 pica from end of abstract to introduction heading when in 
5282 % conference mode (the heading already has this much above it)
5283 \def\endabstract{\relax\ifCLASSOPTIONconference\vspace{0ex}\else\vspace{1.34ex}\fi\par\if@twocolumn\else\endquotation\fi
5284     \normalfont\normalsize}
5285
5286 \def\IEEEkeywords{\normalfont
5287     \if@twocolumn
5288       \@IEEEabskeysecsize\bfseries\textit{\IEEEkeywordsname}---\relax
5289     \else
5290       \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize
5291     \fi\@IEEEgobbleleadPARNLSP}
5292 \def\endIEEEkeywords{\relax\ifCLASSOPTIONtechnote\vspace{1.34ex}\else\vspace{0.67ex}\fi
5293     \par\if@twocolumn\else\endquotation\fi%
5294     \normalfont\normalsize}
5295
5296 % V1.7 compsoc keywords index terms
5297 \ifCLASSOPTIONcompsoc
5298   \ifCLASSOPTIONconference% compsoc conference
5299 \def\abstract{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\bfseries
5300     \if@twocolumn
5301       \@IEEEabskeysecsize\noindent\textit{\abstractname}---\relax
5302     \else
5303       \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize%
5304     \fi\@IEEEgobbleleadPARNLSP}
5305 \def\IEEEkeywords{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\bfseries
5306     \if@twocolumn
5307       \@IEEEabskeysecsize\vskip 0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip\noindent
5308       \textit{\IEEEkeywordsname}---\relax
5309     \else
5310       \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize%
5311     \fi\@IEEEgobbleleadPARNLSP}
5312   \else% compsoc not conference
5313 \def\abstract{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\sffamily
5314     \if@twocolumn
5315       \@IEEEabskeysecsize\noindent\textbf{\abstractname}---\relax
5316     \else
5317       \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize%
5318     \fi\@IEEEgobbleleadPARNLSP}
5319 \def\IEEEkeywords{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\sffamily
5320     \if@twocolumn
5321       \@IEEEabskeysecsize\vskip 0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip\noindent
5322       \textbf{\IEEEkeywordsname}---\relax
5323     \else
5324       \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize%
5325     \fi\@IEEEgobbleleadPARNLSP}
5326   \fi
5327 \fi
5328
5329 % V1.8 transmag keywords index terms
5330 % no abstract name, use indentation
5331 \ifCLASSOPTIONtransmag
5332 \def\abstract{\normalfont\parindent 1em\relax
5333     \if@twocolumn
5334       \@IEEEabskeysecsize\bfseries\indent
5335     \else
5336       \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize
5337       \textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize
5338     \fi\@IEEEgobbleleadPARNLSP}
5339
5340 \def\IEEEkeywords{\normalfont\parindent 1em\relax
5341     \if@twocolumn
5342       \@IEEEabskeysecsize\vspace{1\baselineskip}\bfseries\indent\textit{\IEEEkeywordsname}---\relax
5343     \else
5344       \bgroup\par\vspace{1\baselineskip}\centering\@IEEEabskeysecsize
5345       \textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize
5346     \fi\@IEEEgobbleleadPARNLSP}
5347 \fi
5348
5349
5350
5351 % gobbles all leading \, \\ and \par, upon finding first token that
5352 % is not a \ , \\ or a \par, it ceases and returns that token
5353
5354 % used to strip leading \, \\ and \par from the input
5355 % so that such things in the beginning of an environment will not
5356 % affect the formatting of the text
5357 \long\def\@IEEEgobbleleadPARNLSP#1{\let\@IEEEswallowthistoken=0%
5358 \let\@IEEEgobbleleadPARNLSPtoken#1%
5359 \let\@IEEEgobbleleadPARtoken=\par%
5360 \let\@IEEEgobbleleadNLtoken=\\%
5361 \let\@IEEEgobbleleadSPtoken=\ %
5362 \def\@IEEEgobbleleadSPMACRO{\ }%
5363 \ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadPARtoken%
5364 \let\@IEEEswallowthistoken=1%
5365 \fi%
5366 \ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadNLtoken%
5367 \let\@IEEEswallowthistoken=1%
5368 \fi%
5369 \ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadSPtoken%
5370 \let\@IEEEswallowthistoken=1%
5371 \fi%
5372 % a control space will come in as a macro
5373 % when it is the last one on a line
5374 \ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadSPMACRO%
5375 \let\@IEEEswallowthistoken=1%
5376 \fi%
5377 % if we have to swallow this token, do so and taste the next one
5378 % else spit it out and stop gobbling
5379 \ifx\@IEEEswallowthistoken 1\let\@IEEEnextgobbleleadPARNLSP=\@IEEEgobbleleadPARNLSP\else%
5380 \let\@IEEEnextgobbleleadPARNLSP=#1\fi%
5381 \@IEEEnextgobbleleadPARNLSP}%
5382
5383
5384
5385
5386 % TITLING OF SECTIONS
5387 \def\@IEEEsectpunct{:\ \,}  % Punctuation after run-in section heading  (headings which are
5388                             % part of the paragraphs), need little bit more than a single space
5389                             % spacing from section number to title
5390 % compsoc conferences use regular period/space punctuation
5391 \ifCLASSOPTIONcompsoc
5392 \ifCLASSOPTIONconference
5393 \def\@IEEEsectpunct{.\ }
5394 \fi\fi
5395
5396
5397 \def\@seccntformat#1{\csname the#1dis\endcsname\hskip 0.5em\relax}
5398
5399 \ifCLASSOPTIONcompsoc
5400 % compsoc journals need extra spacing
5401 \ifCLASSOPTIONconference\else
5402 \def\@seccntformat#1{\csname the#1dis\endcsname\hskip 1em\relax}
5403 \fi\fi
5404
5405 %v1.7 put {} after #6 to allow for some types of user font control
5406 %and use \@@par rather than \par
5407 \def\@sect#1#2#3#4#5#6[#7]#8{%
5408   \ifnum #2>\c@secnumdepth
5409      \let\@svsec\@empty
5410   \else
5411      \refstepcounter{#1}%
5412      % load section label and spacer into \@svsec
5413      \protected@edef\@svsec{\@seccntformat{#1}\relax}%
5414   \fi%
5415   \@tempskipa #5\relax
5416   \ifdim \@tempskipa>\z@% tempskipa determines whether is treated as a high
5417      \begingroup #6{\relax% or low level heading
5418       \noindent % subsections are NOT indented
5419        % print top level headings. \@svsec is label, #8 is heading title
5420        % The IEEE does not block indent the section title text, it flows like normal
5421        {\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\@@par}}%
5422      \endgroup
5423      \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth\relax\else
5424                \protect\numberline{\csname the#1\endcsname}\fi#7}%
5425   \else % printout low level headings
5426      % svsechd seems to swallow the trailing space, protect it with \mbox{}
5427      % got rid of sectionmark stuff
5428      \def\@svsechd{#6{\hskip #3\relax\@svsec #8\@IEEEsectpunct\mbox{}}%
5429      \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth\relax\else
5430                \protect\numberline{\csname the#1\endcsname}\fi#7}}%
5431   \fi%skip down
5432   \@xsect{#5}}
5433
5434
5435 % section* handler
5436 %v1.7 put {} after #4 to allow for some types of user font control
5437 %and use \@@par rather than \par
5438 \def\@ssect#1#2#3#4#5{\@tempskipa #3\relax
5439   \ifdim \@tempskipa>\z@
5440      %\begingroup #4\@hangfrom{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup
5441      % The IEEE does not block indent the section title text, it flows like normal
5442      \begingroup \noindent #4{\relax{\hskip #1}{\interlinepenalty \@M #5\@@par}}\endgroup
5443   % svsechd swallows the trailing space, protect it with \mbox{}
5444   \else \def\@svsechd{#4{\hskip #1\relax #5\@IEEEsectpunct\mbox{}}}\fi
5445   \@xsect{#3}}
5446
5447
5448 %% SECTION heading spacing and font
5449 %%
5450 % arguments are: #1 - sectiontype name
5451 % (for \@sect)   #2 - section level
5452 %                #3 - section heading indent
5453 %                #4 - top separation (absolute value used, neg indicates not to indent main text)
5454 %                     If negative, make stretch parts negative too!
5455 %                #5 - (absolute value used) positive: bottom separation after heading,
5456 %                      negative: amount to indent main text after heading
5457 %                Both #4 and #5 negative means to indent main text and use negative top separation
5458 %                #6 - font control
5459 % You've got to have \normalfont\normalsize in the font specs below to prevent
5460 % trouble when you do something like:
5461 % \section{Note}{\ttfamily TT-TEXT} is known to ... 
5462 % The IEEE sometimes REALLY stretches the area before a section
5463 % heading by up to about 0.5in. However, it may not be a good
5464 % idea to let LaTeX have quite this much rubber.
5465 \ifCLASSOPTIONconference%
5466 % The IEEE wants section heading spacing to decrease for conference mode
5467 \def\section{\@startsection{section}{1}{\z@}{1.5ex plus 1.5ex minus 0.5ex}%
5468 {0.7ex plus 1ex minus 0ex}{\normalfont\normalsize\centering\scshape}}%
5469 \def\subsection{\@startsection{subsection}{2}{\z@}{1.5ex plus 1.5ex minus 0.5ex}%
5470 {0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}%
5471 \else % for journals
5472 \def\section{\@startsection{section}{1}{\z@}{3.0ex plus 1.5ex minus 1.5ex}% V1.6 3.0ex from 3.5ex
5473 {0.7ex plus 1ex minus 0ex}{\normalfont\normalsize\centering\scshape}}%
5474 \def\subsection{\@startsection{subsection}{2}{\z@}{3.5ex plus 1.5ex minus 1.5ex}%
5475 {0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}%
5476 \fi
5477
5478 % for both journals and conferences
5479 % decided to put in a little rubber above the section, might help somebody
5480 \def\subsubsection{\@startsection{subsubsection}{3}{\parindent}{0ex plus 0.1ex minus 0.1ex}%
5481 {0ex}{\normalfont\normalsize\itshape}}%
5482 \def\paragraph{\@startsection{paragraph}{4}{2\parindent}{0ex plus 0.1ex minus 0.1ex}%
5483 {0ex}{\normalfont\normalsize\itshape}}%
5484
5485
5486 % compsoc
5487 \ifCLASSOPTIONcompsoc
5488 \ifCLASSOPTIONconference
5489 % compsoc conference
5490 \def\section{\@startsection{section}{1}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}%
5491 {1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}{\normalfont\large\bfseries}}%
5492 \def\subsection{\@startsection{subsection}{2}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}%
5493 {1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}{\normalfont\sublargesize\bfseries}}%
5494 \def\subsubsection{\@startsection{subsubsection}{3}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}%
5495 {0ex}{\normalfont\normalsize\bfseries}}%
5496 \def\paragraph{\@startsection{paragraph}{4}{2\parindent}{0ex plus 0.1ex minus 0.1ex}%
5497 {0ex}{\normalfont\normalsize}}%
5498 \else% compsoc journals
5499 % use negative top separation as compsoc journals do not indent paragraphs after section titles
5500 \def\section{\@startsection{section}{1}{\z@}{-3.5ex plus -2ex minus -1.5ex}%
5501 {0.7ex plus 1ex minus 0ex}{\normalfont\sublargesize\sffamily\bfseries\scshape}}%
5502 % Note that subsection and smaller may not be correct for the Computer Society,
5503 % I have to look up an example.
5504 \def\subsection{\@startsection{subsection}{2}{\z@}{-3.5ex plus -1.5ex minus -1.5ex}%
5505 {0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\sffamily\bfseries}}%
5506 \def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.5ex plus -1ex minus -1ex}%
5507 {0.5ex plus 0.5ex minus 0ex}{\normalfont\normalsize\sffamily\itshape}}%
5508 \def\paragraph{\@startsection{paragraph}{4}{2\parindent}{-0ex plus -0.1ex minus -0.1ex}%
5509 {0ex}{\normalfont\normalsize}}%
5510 \fi\fi
5511
5512 % transmag
5513 \ifCLASSOPTIONtransmag
5514 \def\subsection{\@startsection{subsection}{2}{0.75\parindent}{3.5ex plus 1.5ex minus 1.5ex}%
5515 {0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}%
5516 \def\subsubsection{\@startsection{subsubsection}{3}{1.25\parindent}{0.1ex plus 0.1ex minus 0.1ex}%
5517 {0.1ex}{\normalfont\normalsize\itshape}}%
5518 \fi
5519
5520
5521 % V1.8a provide for a raised line Introduction section for use with Computer
5522 % Society papers. We have to remove any spacing glue after the section
5523 % heading and then remove the blank line for the new paragraph after it.
5524 % LaTeX's section handler alters \everypar and we need to propogate those
5525 % changes outside of the \parbox lest there be spacing problems at the top
5526 % of the next section.
5527 \def\IEEEraisesectionheading#1{\noindent\raisebox{1.5\baselineskip}[0pt][0pt]{\parbox[b]{\columnwidth}{#1\unskip\global\everypar=\everypar}}\vspace{-1\baselineskip}\vspace{-\parskip}\par}
5528
5529
5530
5531 %% ENVIRONMENTS
5532 % "box" symbols at end of proofs
5533 \def\IEEEQEDclosed{\mbox{\rule[0pt]{1.3ex}{1.3ex}}} % for a filled box
5534 % V1.6 some journals use an open box instead that will just fit around a closed one
5535 \def\IEEEQEDopen{{\setlength{\fboxsep}{0pt}\setlength{\fboxrule}{0.2pt}\fbox{\rule[0pt]{0pt}{1.3ex}\rule[0pt]{1.3ex}{0pt}}}}
5536 \ifCLASSOPTIONcompsoc
5537 \def\IEEEQED{\IEEEQEDopen}   % default to open for compsoc
5538 \else
5539 \def\IEEEQED{\IEEEQEDclosed} % otherwise default to closed
5540 \fi
5541
5542 %V1.8 flag to indicate if QED symbol is to be shown
5543 \newif\if@IEEEQEDshow  \@IEEEQEDshowtrue
5544 \def\IEEEproofindentspace{2\parindent}% V1.8 allow user to change indentation amount if desired
5545 % v1.7 name change to avoid namespace collision with amsthm. Also add support
5546 % for an optional argument.
5547 \def\IEEEproof{\@ifnextchar[{\@IEEEproof}{\@IEEEproof[\IEEEproofname]}}
5548 \def\@IEEEproof[#1]{\@IEEEQEDshowtrue\par\noindent\hspace{\IEEEproofindentspace}{\itshape #1: }}
5549 \def\endIEEEproof{\if@IEEEQEDshow\hspace*{\fill}\nobreakspace\IEEEQED\fi\par}
5550 % qedhere for equation environments, similar to AMS \qedhere
5551 \def\IEEEQEDhereeqn{\global\@IEEEQEDshowfalse\eqno\let\eqno\relax\let\leqno\relax
5552                     \let\veqno\relax\hbox{\IEEEQED}}
5553 % IEEE style qedhere for IEEEeqnarray and other environments
5554 \def\IEEEQEDhere{\global\@IEEEQEDshowfalse\IEEEQED}
5555 % command to disable QED at end of IEEEproof
5556 \def\IEEEQEDoff{\global\@IEEEQEDshowfalse}
5557
5558
5559 %\itemindent is set to \z@ by list, so define new temporary variable
5560 \newdimen\@IEEEtmpitemindent
5561
5562 \ifCLASSOPTIONcompsoc
5563 % V1.8a compsoc uses bold theorem titles, a period instead of a colon, vertical spacing, and hanging indentation
5564 % V1.8 allow long theorem names to break across lines.
5565 % Thanks to Miquel Payaro for reporting this.
5566 \def\@begintheorem#1#2{\@IEEEtmpitemindent\itemindent\relax
5567     \topsep 0.2\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip
5568     \rmfamily\trivlist\hangindent\parindent%
5569     \item[]\textit{\bfseries\noindent #1\ #2.} \itemindent\@IEEEtmpitemindent\relax}
5570 \def\@opargbegintheorem#1#2#3{\@IEEEtmpitemindent\itemindent\relax
5571 \topsep 0.2\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip
5572 \rmfamily\trivlist\hangindent\parindent%
5573 % V1.6 The IEEE is back to using () around theorem names which are also in italics
5574 % Thanks to Christian Peel for reporting this.
5575     \item[]\textit{\bfseries\noindent #1\ #2\ (#3).} \itemindent\@IEEEtmpitemindent\relax}
5576 % V1.7 remove bogus \unskip that caused equations in theorems to collide with
5577 % lines below.
5578 \def\@endtheorem{\endtrivlist\vskip 0.25\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip}
5579 \else
5580 %
5581 % noncompsoc
5582
5583 % V1.8 allow long theorem names to break across lines.
5584 % Thanks to Miquel Payaro for reporting this.
5585 \def\@begintheorem#1#2{\@IEEEtmpitemindent\itemindent\relax\topsep 0pt\rmfamily\trivlist%
5586     \item[]\textit{\indent #1\ #2:} \itemindent\@IEEEtmpitemindent\relax}
5587 \def\@opargbegintheorem#1#2#3{\@IEEEtmpitemindent\itemindent\relax\topsep 0pt\rmfamily \trivlist%
5588 % V1.6 The IEEE is back to using () around theorem names which are also in italics
5589 % Thanks to Christian Peel for reporting this.
5590     \item[]\textit{\indent #1\ #2\ (#3):} \itemindent\@IEEEtmpitemindent\relax}
5591 % V1.7 remove bogus \unskip that caused equations in theorems to collide with
5592 % lines below.
5593 \def\@endtheorem{\endtrivlist}
5594 \fi
5595
5596
5597
5598 % V1.6
5599 % display command for the section the theorem is in - so that \thesection
5600 % is not used as this will be in Roman numerals when we want arabic.
5601 % LaTeX2e uses \def\@thmcounter#1{\noexpand\arabic{#1}} for the theorem number
5602 % (second part) display and \def\@thmcountersep{.} as a separator.
5603 % V1.7 intercept calls to the section counter and reroute to \@IEEEthmcounterinsection
5604 % to allow \appendix(ices} to override as needed.
5605 %
5606 % special handler for sections, allows appendix(ices) to override
5607 \gdef\@IEEEthmcounterinsection#1{\arabic{#1}}
5608 % string macro
5609 \edef\@IEEEstringsection{section}
5610
5611 % redefine the #1#2[#3] form of newtheorem to use a hook to \@IEEEthmcounterinsection
5612 % if section in_counter is used
5613 \def\@xnthm#1#2[#3]{%
5614   \expandafter\@ifdefinable\csname #1\endcsname
5615     {\@definecounter{#1}\@newctr{#1}[#3]%
5616      \edef\@IEEEstringtmp{#3}
5617      \ifx\@IEEEstringtmp\@IEEEstringsection
5618      \expandafter\xdef\csname the#1\endcsname{%
5619      \noexpand\@IEEEthmcounterinsection{#3}\@thmcountersep
5620           \@thmcounter{#1}}%
5621      \else
5622      \expandafter\xdef\csname the#1\endcsname{%
5623        \expandafter\noexpand\csname the#3\endcsname \@thmcountersep
5624           \@thmcounter{#1}}%
5625      \fi
5626      \global\@namedef{#1}{\@thm{#1}{#2}}%
5627      \global\@namedef{end#1}{\@endtheorem}}}
5628
5629
5630
5631 %% SET UP THE DEFAULT PAGESTYLE
5632 \pagestyle{headings}
5633 \pagenumbering{arabic}
5634
5635 % normally the page counter starts at 1
5636 \setcounter{page}{1}
5637 % however, for peerreview the cover sheet is page 0 or page -1
5638 % (for duplex printing)
5639 \ifCLASSOPTIONpeerreview
5640    \if@twoside
5641       \setcounter{page}{-1}
5642    \else
5643       \setcounter{page}{0}
5644    \fi
5645 \fi
5646
5647 % standard book class behavior - let bottom line float up and down as
5648 % needed when single sided
5649 \ifCLASSOPTIONtwoside\else\raggedbottom\fi
5650 % if two column - turn on twocolumn, allow word spacings to stretch more and
5651 % enforce a rigid position for the last lines
5652 \ifCLASSOPTIONtwocolumn
5653 % the peer review option delays invoking twocolumn
5654    \ifCLASSOPTIONpeerreview\else
5655       \twocolumn
5656    \fi
5657 \sloppy 
5658 \flushbottom
5659 \fi
5660
5661
5662
5663
5664 % \APPENDIX and \APPENDICES definitions
5665
5666 % This is the \@ifmtarg command from the LaTeX ifmtarg package
5667 % by Peter Wilson (CUA) and Donald Arseneau
5668 % \@ifmtarg is used to determine if an argument to a command
5669 % is present or not.
5670 % For instance:
5671 % \@ifmtarg{#1}{\typeout{empty}}{\typeout{has something}}
5672 % \@ifmtarg is used with our redefined \section command if
5673 % \appendices is invoked.
5674 % The command \section will behave slightly differently depending
5675 % on whether the user specifies a title: 
5676 % \section{My appendix title}
5677 % or not:
5678 % \section{}
5679 % This way, we can eliminate the blank lines where the title
5680 % would be, and the unneeded : after Appendix in the table of
5681 % contents 
5682 \begingroup
5683 \catcode`\Q=3
5684 \long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil}
5685 \long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4}
5686 \endgroup
5687 % end of \@ifmtarg defs
5688
5689
5690 % V1.7
5691 % command that allows the one time saving of the original definition
5692 % of section to \@IEEEappendixsavesection for \appendix or \appendices 
5693 % we don't save \section here as it may be redefined later by other
5694 % packages (hyperref.sty, etc.)
5695 \def\@IEEEsaveoriginalsectiononce{\let\@IEEEappendixsavesection\section
5696 \let\@IEEEsaveoriginalsectiononce\relax}
5697
5698 % neat trick to grab and process the argument from \section{argument}
5699 % we process differently if the user invoked \section{} with no
5700 % argument (title)
5701 % note we reroute the call to the old \section*
5702 \def\@IEEEprocessthesectionargument#1{%
5703 \@ifmtarg{#1}{%
5704 \@IEEEappendixsavesection*{\appendixname\nobreakspace\thesectiondis}%
5705 \addcontentsline{toc}{section}{\appendixname\nobreakspace\thesection}}{%
5706 \@IEEEappendixsavesection*{\appendixname\nobreakspace\thesectiondis\\* #1}%
5707 \addcontentsline{toc}{section}{\appendixname\nobreakspace\thesection: #1}}}
5708
5709 % we use this if the user calls \section{} after
5710 % \appendix-- which has no meaning. So, we ignore the
5711 % command and its argument. Then, warn the user.
5712 \def\@IEEEdestroythesectionargument#1{\typeout{** WARNING: Ignoring useless
5713 \protect\section\space in Appendix (line \the\inputlineno).}}
5714
5715
5716 % remember \thesection forms will be displayed in \ref calls
5717 % and in the Table of Contents.
5718 % The \sectiondis form is used in the actual heading itself
5719
5720 % appendix command for one single appendix
5721 % normally has no heading. However, if you want a 
5722 % heading, you can do so via the optional argument:
5723 % \appendix[Optional Heading]
5724 \def\appendix{\relax}
5725 \renewcommand{\appendix}[1][]{\@IEEEsaveoriginalsectiononce\par
5726     % v1.6 keep hyperref's identifiers unique
5727     \gdef\theHsection{Appendix.A}%
5728     % v1.6 adjust hyperref's string name for the section
5729     \xdef\Hy@chapapp{appendix}%
5730     \setcounter{section}{0}%
5731     \setcounter{subsection}{0}%
5732     \setcounter{subsubsection}{0}%
5733     \setcounter{paragraph}{0}%
5734     \gdef\thesection{A}%
5735     \gdef\thesectiondis{}% 
5736     \gdef\thesubsection{\Alph{subsection}}%
5737     \gdef\@IEEEthmcounterinsection##1{A}
5738     \refstepcounter{section}% update the \ref counter
5739     \@ifmtarg{#1}{\@IEEEappendixsavesection*{\appendixname}%
5740                   \addcontentsline{toc}{section}{\appendixname}}{%
5741              \@IEEEappendixsavesection*{\appendixname\nobreakspace\\* #1}%
5742              \addcontentsline{toc}{section}{\appendixname: #1}}%
5743     % redefine \section command for appendix
5744     % leave \section* as is
5745     \def\section{\@ifstar{\@IEEEappendixsavesection*}{%
5746                     \@IEEEdestroythesectionargument}}% throw out the argument
5747                                                      % of the normal form
5748 }
5749
5750
5751
5752 % appendices command for multiple appendices
5753 % user then calls \section with an argument (possibly empty) to
5754 % declare the individual appendices
5755 \def\appendices{\@IEEEsaveoriginalsectiononce\par
5756     % v1.6 keep hyperref's identifiers unique
5757     \gdef\theHsection{Appendix.\Alph{section}}%
5758     % v1.6 adjust hyperref's string name for the section
5759     \xdef\Hy@chapapp{appendix}%
5760     \setcounter{section}{-1}% we want \refstepcounter to use section 0
5761     \setcounter{subsection}{0}%
5762     \setcounter{subsubsection}{0}%
5763     \setcounter{paragraph}{0}%
5764     \ifCLASSOPTIONromanappendices%
5765     \gdef\thesection{\Roman{section}}%
5766     \gdef\thesectiondis{\Roman{section}}%
5767     \@IEEEcompsocconfonly{\gdef\thesectiondis{\Roman{section}.}}%
5768     \gdef\@IEEEthmcounterinsection##1{A\arabic{##1}}
5769     \else%
5770     \gdef\thesection{\Alph{section}}%
5771     \gdef\thesectiondis{\Alph{section}}%
5772     \@IEEEcompsocconfonly{\gdef\thesectiondis{\Alph{section}.}}%
5773     \gdef\@IEEEthmcounterinsection##1{\Alph{##1}}
5774     \fi%
5775     \refstepcounter{section}% update the \ref counter
5776     \setcounter{section}{0}% NEXT \section will be the FIRST appendix
5777     % redefine \section command for appendices
5778     % leave \section* as is
5779     \def\section{\@ifstar{\@IEEEappendixsavesection*}{% process the *-form
5780                     \refstepcounter{section}% or is a new section so,
5781                     \@IEEEprocessthesectionargument}}% process the argument 
5782                                                  % of the normal form
5783 }
5784
5785
5786
5787 % V1.7 compoc uses nonbold drop cap and small caps word style
5788 \ifCLASSOPTIONcompsoc
5789   \def\IEEEPARstartFONTSTYLE{\mdseries}
5790   \def\IEEEPARstartWORDFONTSTYLE{\scshape}
5791   \def\IEEEPARstartWORDCAPSTYLE{\relax}
5792 \fi
5793 %
5794 %
5795 % \IEEEPARstart
5796 % Definition for the big two line drop cap letter at the beginning of the
5797 % first paragraph of journal papers. The first argument is the first letter
5798 % of the first word, the second argument is the remaining letters of the
5799 % first word which will be rendered in upper case.
5800 % In V1.6 this has been completely rewritten to:
5801
5802 % 1. no longer have problems when the user begins an environment
5803 %    within the paragraph that uses \IEEEPARstart.
5804 % 2. auto-detect and use the current font family
5805 % 3. revise handling of the space at the end of the first word so that
5806 %    interword glue will now work as normal.
5807 % 4. produce correctly aligned edges for the (two) indented lines.
5808
5809 % We generalize things via control macros - playing with these is fun too.
5810
5811 % V1.7 added more control macros to make it easy for IEEEtrantools.sty users
5812 % to change the font style.
5813
5814 % the number of lines that are indented to clear it
5815 % may need to increase if using decenders
5816 \providecommand{\IEEEPARstartDROPLINES}{2}
5817 % minimum number of lines left on a page to allow a \@IEEEPARstart
5818 % Does not take into consideration rubber shrink, so it tends to
5819 % be overly cautious
5820 \providecommand{\IEEEPARstartMINPAGELINES}{2}
5821 % V1.7 the height of the drop cap is adjusted to match the height of this text
5822 % in the current font (when \IEEEPARstart is called).
5823 \providecommand{\IEEEPARstartHEIGHTTEXT}{T}
5824 % the depth the letter is lowered below the baseline
5825 % the height (and size) of the letter is determined by the sum
5826 % of this value and the height of the \IEEEPARstartHEIGHTTEXT in the current
5827 % font. It is a good idea to set this value in terms of the baselineskip
5828 % so that it can respond to changes therein.
5829 \providecommand{\IEEEPARstartDROPDEPTH}{1.1\baselineskip}
5830 % V1.7 the font the drop cap will be rendered in,
5831 % can take zero or one argument.
5832 \providecommand{\IEEEPARstartFONTSTYLE}{\bfseries}
5833 % V1.7 any additional, non-font related commands needed to modify
5834 % the drop cap letter, can take zero or one argument.
5835 \providecommand{\IEEEPARstartCAPSTYLE}{\MakeUppercase}
5836 % V1.7 the font that will be used to render the rest of the word,
5837 % can take zero or one argument.
5838 \providecommand{\IEEEPARstartWORDFONTSTYLE}{\relax}
5839 % V1.7 any additional, non-font related commands needed to modify
5840 % the rest of the word, can take zero or one argument.
5841 \providecommand{\IEEEPARstartWORDCAPSTYLE}{\MakeUppercase}
5842 % This is the horizontal separation distance from the drop letter to the main text.
5843 % Lengths that depend on the font (e.g., ex, em, etc.) will be referenced
5844 % to the font that is active when \IEEEPARstart is called. 
5845 \providecommand{\IEEEPARstartSEP}{0.15em}
5846 % V1.7 horizontal offset applied to the left of the drop cap.
5847 \providecommand{\IEEEPARstartHOFFSET}{0em}
5848 % V1.7 Italic correction command applied at the end of the drop cap.
5849 \providecommand{\IEEEPARstartITLCORRECT}{\/}
5850
5851 % width of the letter output, set globally. Can be used in \IEEEPARstartSEP
5852 % or \IEEEPARstartHOFFSET, but not the height lengths.
5853 \newdimen\IEEEPARstartletwidth
5854 \IEEEPARstartletwidth 0pt\relax
5855
5856 % definition of \IEEEPARstart
5857 % THIS IS A CONTROLLED SPACING AREA, DO NOT ALLOW SPACES WITHIN THESE LINES
5858
5859 % The token \@IEEEPARstartfont will be globally defined after the first use
5860 % of \IEEEPARstart and will be a font command which creates the big letter
5861 % The first argument is the first letter of the first word and the second
5862 % argument is the rest of the first word(s).
5863 \def\IEEEPARstart#1#2{\par{%
5864 % if this page does not have enough space, break it and lets start
5865 % on a new one
5866 \@IEEEtranneedspace{\IEEEPARstartMINPAGELINES\baselineskip}{\relax}%
5867 % V1.7 move this up here in case user uses \textbf for \IEEEPARstartFONTSTYLE
5868 % which uses command \leavevmode which causes an unwanted \indent to be issued
5869 \noindent
5870 % calculate the desired height of the big letter
5871 % it extends from the top of \IEEEPARstartHEIGHTTEXT in the current font
5872 % down to \IEEEPARstartDROPDEPTH below the current baseline
5873 \settoheight{\@IEEEtrantmpdimenA}{\IEEEPARstartHEIGHTTEXT}%
5874 \addtolength{\@IEEEtrantmpdimenA}{\IEEEPARstartDROPDEPTH}%
5875 % extract the name of the current font in bold
5876 % and place it in \@IEEEPARstartFONTNAME
5877 \def\@IEEEPARstartGETFIRSTWORD##1 ##2\relax{##1}%
5878 {\IEEEPARstartFONTSTYLE{\selectfont\edef\@IEEEPARstartFONTNAMESPACE{\fontname\font\space}%
5879 \xdef\@IEEEPARstartFONTNAME{\expandafter\@IEEEPARstartGETFIRSTWORD\@IEEEPARstartFONTNAMESPACE\relax}}}%
5880 % define a font based on this name with a point size equal to the desired
5881 % height of the drop letter
5882 \font\@IEEEPARstartsubfont\@IEEEPARstartFONTNAME\space at \@IEEEtrantmpdimenA\relax%
5883 % save this value as a counter (integer) value (sp points)
5884 \@IEEEtrantmpcountA=\@IEEEtrantmpdimenA%
5885 % now get the height of the actual letter produced by this font size
5886 \settoheight{\@IEEEtrantmpdimenB}{\@IEEEPARstartsubfont\IEEEPARstartCAPSTYLE{#1}}%
5887 % If something bogus happens like the first argument is empty or the
5888 % current font is strange, do not allow a zero height.
5889 \ifdim\@IEEEtrantmpdimenB=0pt\relax%
5890 \typeout{** WARNING: IEEEPARstart drop letter has zero height! (line \the\inputlineno)}%
5891 \typeout{ Forcing the drop letter font size to 10pt.}%
5892 \@IEEEtrantmpdimenB=10pt%
5893 \fi%
5894 % and store it as a counter
5895 \@IEEEtrantmpcountB=\@IEEEtrantmpdimenB%
5896 % Since a font size doesn't exactly correspond to the height of the capital
5897 % letters in that font, the actual height of the letter, \@IEEEtrantmpcountB,
5898 % will be less than that desired, \@IEEEtrantmpcountA
5899 % we need to raise the font size, \@IEEEtrantmpdimenA 
5900 % by \@IEEEtrantmpcountA / \@IEEEtrantmpcountB
5901 % But, TeX doesn't have floating point division, so we have to use integer
5902 % division. Hence the use of the counters.
5903 % We need to reduce the denominator so that the loss of the remainder will
5904 % have minimal affect on the accuracy of the result
5905 \divide\@IEEEtrantmpcountB by 200%
5906 \divide\@IEEEtrantmpcountA by \@IEEEtrantmpcountB%
5907 % Then reequalize things when we use TeX's ability to multiply by
5908 % floating point values
5909 \@IEEEtrantmpdimenB=0.005\@IEEEtrantmpdimenA%
5910 \multiply\@IEEEtrantmpdimenB by \@IEEEtrantmpcountA%
5911 % \@IEEEPARstartfont is globaly set to the calculated font of the big letter
5912 % We need to carry this out of the local calculation area to to create the
5913 % big letter.
5914 \global\font\@IEEEPARstartfont\@IEEEPARstartFONTNAME\space at \@IEEEtrantmpdimenB%
5915 % Now set \@IEEEtrantmpdimenA to the width of the big letter
5916 % We need to carry this out of the local calculation area to set the
5917 % hanging indent
5918 \settowidth{\global\@IEEEtrantmpdimenA}{\@IEEEPARstartfont
5919 \IEEEPARstartCAPSTYLE{#1\IEEEPARstartITLCORRECT}}}%
5920 % end of the isolated calculation environment
5921 \global\IEEEPARstartletwidth\@IEEEtrantmpdimenA\relax%
5922 % add in the extra clearance we want
5923 \advance\@IEEEtrantmpdimenA by \IEEEPARstartSEP\relax%
5924 % add in the optional offset
5925 \advance\@IEEEtrantmpdimenA by \IEEEPARstartHOFFSET\relax%
5926 % V1.7 don't allow negative offsets to produce negative hanging indents
5927 \@IEEEtrantmpdimenB\@IEEEtrantmpdimenA
5928 \ifnum\@IEEEtrantmpdimenB < 0 \@IEEEtrantmpdimenB 0pt\fi
5929 % \@IEEEtrantmpdimenA has the width of the big letter plus the
5930 % separation space and \@IEEEPARstartfont is the font we need to use
5931 % Now, we make the letter and issue the hanging indent command
5932 % The letter is placed in a box of zero width and height so that other
5933 % text won't be displaced by it.
5934 \hangindent\@IEEEtrantmpdimenB\hangafter=-\IEEEPARstartDROPLINES%
5935 \makebox[0pt][l]{\hspace{-\@IEEEtrantmpdimenA}%
5936 \raisebox{-\IEEEPARstartDROPDEPTH}[0pt][0pt]{\hspace{\IEEEPARstartHOFFSET}%
5937 \@IEEEPARstartfont\IEEEPARstartCAPSTYLE{#1\IEEEPARstartITLCORRECT}%
5938 \hspace{\IEEEPARstartSEP}}}%
5939 {\IEEEPARstartWORDFONTSTYLE{\IEEEPARstartWORDCAPSTYLE{\selectfont#2}}}}
5940
5941
5942
5943
5944 % determines if the space remaining on a given page is equal to or greater
5945 % than the specified space of argument one
5946 % if not, execute argument two (only if the remaining space is greater than zero)
5947 % and issue a \newpage
5948
5949 % example: \@IEEEtranneedspace{2in}{\vfill}
5950
5951 % Does not take into consideration rubber shrinkage, so it tends to
5952 % be overly cautious
5953 % Based on an example posted by Donald Arseneau
5954 % Note this macro uses \@IEEEtrantmpdimenB internally for calculations,
5955 % so DO NOT PASS \@IEEEtrantmpdimenB to this routine
5956 % if you need a dimen register, import with \@IEEEtrantmpdimenA instead
5957 \def\@IEEEtranneedspace#1#2{\penalty-100\begingroup%shield temp variable
5958 \@IEEEtrantmpdimenB\pagegoal\advance\@IEEEtrantmpdimenB-\pagetotal% space left
5959 \ifdim #1>\@IEEEtrantmpdimenB\relax% not enough space left
5960 \ifdim\@IEEEtrantmpdimenB>\z@\relax #2\fi%
5961 \newpage%
5962 \fi\endgroup}
5963
5964
5965
5966 % IEEEbiography ENVIRONMENT
5967 % Allows user to enter biography leaving place for picture (adapts to font size)
5968 % As of V1.5, a new optional argument allows you to have a real graphic!
5969 % V1.5 and later also fixes the "colliding biographies" which could happen when a 
5970 % biography's text was shorter than the space for the photo.
5971 % MDS 7/2001
5972 % V1.6 prevent multiple biographies from making multiple TOC entries
5973 \newif\if@IEEEbiographyTOCentrynotmade
5974 \global\@IEEEbiographyTOCentrynotmadetrue
5975
5976 % biography counter so hyperref can jump directly to the biographies
5977 % and not just the previous section
5978 \newcounter{IEEEbiography}
5979 \setcounter{IEEEbiography}{0}
5980
5981 % photo area size
5982 \def\@IEEEBIOphotowidth{1.0in}    % width of the biography photo area
5983 \def\@IEEEBIOphotodepth{1.25in}   % depth (height) of the biography photo area
5984 % area cleared for photo
5985 \def\@IEEEBIOhangwidth{1.14in}    % width cleared for the biography photo area
5986 \def\@IEEEBIOhangdepth{1.25in}    % depth cleared for the biography photo area
5987                                   % actual depth will be a multiple of 
5988                                   % \baselineskip, rounded up
5989 \def\@IEEEBIOskipN{4\baselineskip}% nominal value of the vskip above the biography
5990
5991 \newenvironment{IEEEbiography}[2][]{\normalfont\@IEEEcompsoconly{\sffamily}\footnotesize%
5992 \unitlength 1in\parskip=0pt\par\parindent 1em\interlinepenalty500%
5993 % we need enough space to support the hanging indent
5994 % the nominal value of the spacer
5995 % and one extra line for good measure
5996 \@IEEEtrantmpdimenA=\@IEEEBIOhangdepth%
5997 \advance\@IEEEtrantmpdimenA by \@IEEEBIOskipN%
5998 \advance\@IEEEtrantmpdimenA by 1\baselineskip%
5999 % if this page does not have enough space, break it and lets start
6000 % with a new one
6001 \@IEEEtranneedspace{\@IEEEtrantmpdimenA}{\relax}%
6002 % nominal spacer can strech, not shrink use 1fil so user can out stretch with \vfill
6003 \vskip \@IEEEBIOskipN plus 1fil minus 0\baselineskip%
6004 % the default box for where the photo goes
6005 \def\@IEEEtempbiographybox{{\setlength{\fboxsep}{0pt}\framebox{%
6006 \begin{minipage}[b][\@IEEEBIOphotodepth][c]{\@IEEEBIOphotowidth}\centering PLACE\\ PHOTO\\ HERE \end{minipage}}}}%
6007 %
6008 % detect if the optional argument was supplied, this requires the
6009 % \@ifmtarg command as defined in the appendix section above
6010 % and if so, override the default box with what they want
6011 \@ifmtarg{#1}{\relax}{\def\@IEEEtempbiographybox{\mbox{\begin{minipage}[b][\@IEEEBIOphotodepth][c]{\@IEEEBIOphotowidth}%
6012 \centering%
6013 #1%
6014 \end{minipage}}}}% end if optional argument supplied
6015 % Make an entry into the table of contents only if we have not done so before
6016 \if@IEEEbiographyTOCentrynotmade%
6017 % link labels to the biography counter so hyperref will jump
6018 % to the biography, not the previous section
6019 \setcounter{IEEEbiography}{-1}%
6020 \refstepcounter{IEEEbiography}%
6021 \addcontentsline{toc}{section}{Biographies}%
6022 \global\@IEEEbiographyTOCentrynotmadefalse%
6023 \fi%
6024 % one more biography
6025 \refstepcounter{IEEEbiography}%
6026 % Make an entry for this name into the table of contents 
6027 \addcontentsline{toc}{subsection}{#2}%
6028 % V1.6 properly handle if a new paragraph should occur while the
6029 % hanging indent is still active. Do this by redefining \par so
6030 % that it will not start a new paragraph. (But it will appear to the
6031 % user as if it did.) Also, strip any leading pars, newlines, or spaces.
6032 \let\@IEEEBIOORGparCMD=\par% save the original \par command
6033 \edef\par{\hfil\break\indent}% the new \par will not be a "real" \par
6034 \settoheight{\@IEEEtrantmpdimenA}{\@IEEEtempbiographybox}% get height of biography box
6035 \@IEEEtrantmpdimenB=\@IEEEBIOhangdepth%
6036 \@IEEEtrantmpcountA=\@IEEEtrantmpdimenB% countA has the hang depth
6037 \divide\@IEEEtrantmpcountA by \baselineskip%  calculates lines needed to produce the hang depth
6038 \advance\@IEEEtrantmpcountA by 1% ensure we overestimate
6039 % set the hanging indent
6040 \hangindent\@IEEEBIOhangwidth%
6041 \hangafter-\@IEEEtrantmpcountA%
6042 % reference the top of the photo area to the top of a capital T
6043 \settoheight{\@IEEEtrantmpdimenB}{\mbox{T}}%
6044 % set the photo box, give it zero width and height so as not to disturb anything
6045 \noindent\makebox[0pt][l]{\hspace{-\@IEEEBIOhangwidth}\raisebox{\@IEEEtrantmpdimenB}[0pt][0pt]{%
6046 \raisebox{-\@IEEEBIOphotodepth}[0pt][0pt]{\@IEEEtempbiographybox}}}%
6047 % now place the author name and begin the bio text
6048 \noindent\textbf{#2\ }\@IEEEgobbleleadPARNLSP}{\relax\let\par=\@IEEEBIOORGparCMD\par%
6049 % 7/2001 V1.5 detect when the biography text is shorter than the photo area
6050 % and pad the unused area - preventing a collision from the next biography entry
6051 % MDS
6052 \ifnum \prevgraf <\@IEEEtrantmpcountA\relax% detect when the biography text is shorter than the photo
6053     \advance\@IEEEtrantmpcountA by -\prevgraf% calculate how many lines we need to pad
6054     \advance\@IEEEtrantmpcountA by -1\relax% we compensate for the fact that we indented an extra line
6055     \@IEEEtrantmpdimenA=\baselineskip% calculate the length of the padding
6056     \multiply\@IEEEtrantmpdimenA by \@IEEEtrantmpcountA%
6057     \noindent\rule{0pt}{\@IEEEtrantmpdimenA}% insert an invisible support strut
6058 \fi%
6059 \par\normalfont}
6060
6061
6062
6063 % V1.6
6064 % added biography without a photo environment
6065 \newenvironment{IEEEbiographynophoto}[1]{%
6066 % Make an entry into the table of contents only if we have not done so before
6067 \if@IEEEbiographyTOCentrynotmade%
6068 % link labels to the biography counter so hyperref will jump
6069 % to the biography, not the previous section
6070 \setcounter{IEEEbiography}{-1}%
6071 \refstepcounter{IEEEbiography}%
6072 \addcontentsline{toc}{section}{Biographies}%
6073 \global\@IEEEbiographyTOCentrynotmadefalse%
6074 \fi%
6075 % one more biography
6076 \refstepcounter{IEEEbiography}%
6077 % Make an entry for this name into the table of contents 
6078 \addcontentsline{toc}{subsection}{#1}%
6079 \normalfont\@IEEEcompsoconly{\sffamily}\footnotesize\interlinepenalty500%
6080 \vskip 4\baselineskip plus 1fil minus 0\baselineskip%
6081 \parskip=0pt\par%
6082 \noindent\textbf{#1\ }\@IEEEgobbleleadPARNLSP}{\relax\par\normalfont}
6083
6084
6085 % provide the user with some old font commands
6086 % got this from article.cls
6087 \DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
6088 \DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
6089 \DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
6090 \DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
6091 \DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
6092 \DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
6093 \DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
6094 \DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal}
6095 \DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal}
6096
6097
6098 % SPECIAL PAPER NOTICE COMMANDS
6099
6100 % holds the special notice text
6101 \def\@IEEEspecialpapernotice{\relax}
6102  
6103 % for special papers, like invited papers, the user can do:
6104 % \IEEEspecialpapernotice{(Invited Paper)} before \maketitle
6105 \def\IEEEspecialpapernotice#1{\ifCLASSOPTIONconference%
6106 \def\@IEEEspecialpapernotice{{\sublargesize\textit{#1}\vspace*{1em}}}%
6107 \else%
6108 \def\@IEEEspecialpapernotice{{\\*[1.5ex]\sublargesize\textit{#1}}\vspace*{-2ex}}%
6109 \fi}
6110
6111
6112
6113
6114 % PUBLISHER ID COMMANDS
6115 % to insert a publisher's ID footer
6116 % V1.6 \IEEEpubid has been changed so that the change in page size and style
6117 % occurs in \maketitle. \IEEEpubid must now be issued prior to \maketitle
6118 % use \IEEEpubidadjcol as before - in the second column of the title page
6119 % These changes allow \maketitle to take the reduced page height into
6120 % consideration when dynamically setting the space between the author 
6121 % names and the maintext.
6122 %
6123 % the amount the main text is pulled up to make room for the
6124 % publisher's ID footer
6125 % The IEEE uses about 1.3\baselineskip for journals, 
6126 % dynamic title spacing will clean up the fraction
6127 \def\@IEEEpubidpullup{1.3\baselineskip}
6128 \ifCLASSOPTIONtechnote
6129 % for technotes it must be an integer of baselineskip as there can be no
6130 % dynamic title spacing for two column mode technotes (the title is in the
6131 % in first column) and we should maintain an integer number of lines in the
6132 % second column
6133 % There are some examples (such as older issues of "Transactions on
6134 % Information Theory") in which the IEEE really pulls the text off the ID for
6135 % technotes - about 0.55in (or 4\baselineskip). We'll use 2\baselineskip
6136 % and call it even.
6137 \def\@IEEEpubidpullup{2\baselineskip}
6138 \fi
6139
6140 % V1.7 compsoc does not use a pullup
6141 \ifCLASSOPTIONcompsoc
6142 \def\@IEEEpubidpullup{0pt}
6143 \fi
6144
6145 % holds the ID text
6146 \def\@IEEEpubid{\relax}
6147
6148 % flag so \maketitle can tell if \IEEEpubid was called
6149 \newif\if@IEEEusingpubid
6150 \global\@IEEEusingpubidfalse
6151 % issue this command in the page to have the ID at the bottom
6152 % V1.6 use before \maketitle
6153 \def\IEEEpubid#1{\def\@IEEEpubid{#1}\global\@IEEEusingpubidtrue}
6154
6155
6156 % command which will pull up (shorten) the column it is executed in
6157 % to make room for the publisher ID. Place in the second column of
6158 % the title page when using \IEEEpubid
6159 % Is smart enough not to do anything when in single column text or
6160 % if the user hasn't called \IEEEpubid
6161 % currently needed in for the second column of a page with the
6162 % publisher ID. If not needed in future releases, please provide this
6163 % command and define it as \relax for backward compatibility
6164 % v1.6b do not allow command to operate if the peer review option has been 
6165 % selected because \IEEEpubidadjcol will not be on the cover page.
6166 % V1.7 do nothing if compsoc
6167 \def\IEEEpubidadjcol{\ifCLASSOPTIONcompsoc\else\ifCLASSOPTIONpeerreview\else
6168 \if@twocolumn\if@IEEEusingpubid\enlargethispage{-\@IEEEpubidpullup}\fi\fi\fi\fi}
6169
6170 % Special thanks to Peter Wilson, Daniel Luecking, and the other
6171 % gurus at comp.text.tex, for helping me to understand how best to
6172 % implement the IEEEpubid command in LaTeX.
6173
6174
6175
6176 %% Lockout some commands under various conditions
6177
6178 % general purpose bit bucket
6179 \newsavebox{\@IEEEtranrubishbin}
6180
6181 % flags to prevent multiple warning messages
6182 \newif\if@IEEEWARNthanks
6183 \newif\if@IEEEWARNIEEEPARstart
6184 \newif\if@IEEEWARNIEEEbiography
6185 \newif\if@IEEEWARNIEEEbiographynophoto
6186 \newif\if@IEEEWARNIEEEpubid
6187 \newif\if@IEEEWARNIEEEpubidadjcol
6188 \newif\if@IEEEWARNIEEEmembership
6189 \newif\if@IEEEWARNIEEEaftertitletext
6190 \@IEEEWARNthankstrue
6191 \@IEEEWARNIEEEPARstarttrue
6192 \@IEEEWARNIEEEbiographytrue
6193 \@IEEEWARNIEEEbiographynophototrue
6194 \@IEEEWARNIEEEpubidtrue
6195 \@IEEEWARNIEEEpubidadjcoltrue
6196 \@IEEEWARNIEEEmembershiptrue
6197 \@IEEEWARNIEEEaftertitletexttrue
6198
6199
6200 %% Lockout some commands when in various modes, but allow them to be restored if needed
6201 %%
6202 % save commands which might be locked out
6203 % so that the user can later restore them if needed
6204 \let\@IEEESAVECMDthanks\thanks
6205 \let\@IEEESAVECMDIEEEPARstart\IEEEPARstart
6206 \let\@IEEESAVECMDIEEEbiography\IEEEbiography
6207 \let\@IEEESAVECMDendIEEEbiography\endIEEEbiography
6208 \let\@IEEESAVECMDIEEEbiographynophoto\IEEEbiographynophoto
6209 \let\@IEEESAVECMDendIEEEbiographynophoto\endIEEEbiographynophoto
6210 \let\@IEEESAVECMDIEEEpubid\IEEEpubid
6211 \let\@IEEESAVECMDIEEEpubidadjcol\IEEEpubidadjcol
6212 \let\@IEEESAVECMDIEEEmembership\IEEEmembership
6213 \let\@IEEESAVECMDIEEEaftertitletext\IEEEaftertitletext
6214
6215
6216 % disable \IEEEPARstart when in draft mode
6217 % This may have originally been done because the pre-V1.6 drop letter
6218 % algorithm had problems with a non-unity baselinestretch
6219 % At any rate, it seems too formal to have a drop letter in a draft
6220 % paper.
6221 \ifCLASSOPTIONdraftcls
6222 \def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** ATTENTION: \noexpand\IEEEPARstart
6223  is disabled in draft mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse}
6224 \fi
6225 % and for technotes
6226 \ifCLASSOPTIONtechnote
6227 \def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** WARNING: \noexpand\IEEEPARstart
6228  is locked out for technotes (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse}
6229 \fi
6230
6231
6232 % lockout unneeded commands when in conference mode
6233 \ifCLASSOPTIONconference
6234 % when locked out, \thanks, \IEEEbiography, \IEEEbiographynophoto, \IEEEpubid,
6235 % \IEEEmembership and \IEEEaftertitletext will all swallow their given text. 
6236 % \IEEEPARstart will output a normal character instead
6237 % warn the user about these commands only once to prevent the console screen
6238 % from filling up with redundant messages
6239 \def\thanks#1{\if@IEEEWARNthanks\typeout{** WARNING: \noexpand\thanks
6240  is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNthanksfalse}
6241 \def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** WARNING: \noexpand\IEEEPARstart
6242  is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse}
6243
6244
6245 % LaTeX treats environments and commands with optional arguments differently.
6246 % the actual ("internal") command is stored as \\commandname 
6247 % (accessed via \csname\string\commandname\endcsname )
6248 % the "external" command \commandname is a macro with code to determine
6249 % whether or not the optional argument is presented and to provide the 
6250 % default if it is absent. So, in order to save and restore such a command
6251 % we would have to save and restore \\commandname as well. But, if LaTeX
6252 % ever changes the way it names the internal names, the trick would break.
6253 % Instead let us just define a new environment so that the internal
6254 % name can be left undisturbed.
6255 \newenvironment{@IEEEbogusbiography}[2][]{\if@IEEEWARNIEEEbiography\typeout{** WARNING: \noexpand\IEEEbiography
6256  is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEbiographyfalse%
6257 \setbox\@IEEEtranrubishbin\vbox\bgroup}{\egroup\relax}
6258 % and make biography point to our bogus biography
6259 \let\IEEEbiography=\@IEEEbogusbiography
6260 \let\endIEEEbiography=\end@IEEEbogusbiography
6261
6262 \renewenvironment{IEEEbiographynophoto}[1]{\if@IEEEWARNIEEEbiographynophoto\typeout{** WARNING: \noexpand\IEEEbiographynophoto
6263  is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEbiographynophotofalse%
6264 \setbox\@IEEEtranrubishbin\vbox\bgroup}{\egroup\relax}
6265
6266 \def\IEEEpubid#1{\if@IEEEWARNIEEEpubid\typeout{** WARNING: \noexpand\IEEEpubid 
6267  is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEpubidfalse}
6268 \def\IEEEpubidadjcol{\if@IEEEWARNIEEEpubidadjcol\typeout{** WARNING: \noexpand\IEEEpubidadjcol
6269  is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEpubidadjcolfalse}
6270 \def\IEEEmembership#1{\if@IEEEWARNIEEEmembership\typeout{** WARNING: \noexpand\IEEEmembership
6271  is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEmembershipfalse}
6272 \def\IEEEaftertitletext#1{\if@IEEEWARNIEEEaftertitletext\typeout{** WARNING: \noexpand\IEEEaftertitletext
6273  is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEaftertitletextfalse}
6274 \fi
6275
6276
6277 % provide a way to restore the commands that are locked out
6278 \def\IEEEoverridecommandlockouts{%
6279 \typeout{** ATTENTION: Overriding command lockouts (line \the\inputlineno).}%
6280 \let\thanks\@IEEESAVECMDthanks%
6281 \let\IEEEPARstart\@IEEESAVECMDIEEEPARstart%
6282 \let\IEEEbiography\@IEEESAVECMDIEEEbiography%
6283 \let\endIEEEbiography\@IEEESAVECMDendIEEEbiography%
6284 \let\IEEEbiographynophoto\@IEEESAVECMDIEEEbiographynophoto%
6285 \let\endIEEEbiographynophoto\@IEEESAVECMDendIEEEbiographynophoto%
6286 \let\IEEEpubid\@IEEESAVECMDIEEEpubid%
6287 \let\IEEEpubidadjcol\@IEEESAVECMDIEEEpubidadjcol%
6288 \let\IEEEmembership\@IEEESAVECMDIEEEmembership%
6289 \let\IEEEaftertitletext\@IEEESAVECMDIEEEaftertitletext}
6290
6291
6292
6293 % need a backslash character for typeout output
6294 {\catcode`\|=0 \catcode`\\=12
6295 |xdef|@IEEEbackslash{\}}
6296
6297
6298 % hook to allow easy disabling of all legacy warnings
6299 \def\@IEEElegacywarn#1#2{\typeout{** ATTENTION: \@IEEEbackslash #1 is deprecated (line \the\inputlineno).
6300 Use \@IEEEbackslash #2 instead.}}
6301
6302
6303 % provide some legacy IEEEtran commands
6304 \def\IEEEcompsoctitleabstractindextext{\@IEEElegacywarn{IEEEcompsoctitleabstractindextext}{IEEEtitleabstractindextext}\IEEEtitleabstractindextext}
6305 \def\IEEEdisplaynotcompsoctitleabstractindextext{\@IEEElegacywarn{IEEEdisplaynotcompsoctitleabstractindextext}{IEEEdisplaynontitleabstractindextext}\IEEEdisplaynontitleabstractindextext}
6306 % provide some legacy IEEEtran environments
6307
6308
6309 % V1.8a no more support for these legacy commands
6310 %\def\authorblockA{\@IEEElegacywarn{authorblockA}{IEEEauthorblockA}\IEEEauthorblockA}
6311 %\def\authorblockN{\@IEEElegacywarn{authorblockN}{IEEEauthorblockN}\IEEEauthorblockN}
6312 %\def\authorrefmark{\@IEEElegacywarn{authorrefmark}{IEEEauthorrefmark}\IEEEauthorrefmark}
6313 %\def\PARstart{\@IEEElegacywarn{PARstart}{IEEEPARstart}\IEEEPARstart}
6314 %\def\pubid{\@IEEElegacywarn{pubid}{IEEEpubid}\IEEEpubid}
6315 %\def\pubidadjcol{\@IEEElegacywarn{pubidadjcol}{IEEEpubidadjcol}\IEEEpubidadjcol}
6316 %\def\specialpapernotice{\@IEEElegacywarn{specialpapernotice}{IEEEspecialpapernotice}\IEEEspecialpapernotice}
6317 % and environments
6318 %\def\keywords{\@IEEElegacywarn{keywords}{IEEEkeywords}\IEEEkeywords}
6319 %\def\endkeywords{\endIEEEkeywords}
6320 % V1.8 no more support for legacy IED list commands
6321 %\let\labelindent\IEEElabelindent
6322 %\def\calcleftmargin{\@IEEElegacywarn{calcleftmargin}{IEEEcalcleftmargin}\IEEEcalcleftmargin}
6323 %\def\setlabelwidth{\@IEEElegacywarn{setlabelwidth}{IEEEsetlabelwidth}\IEEEsetlabelwidth}
6324 %\def\usemathlabelsep{\@IEEElegacywarn{usemathlabelsep}{IEEEusemathlabelsep}\IEEEusemathlabelsep}
6325 %\def\iedlabeljustifyc{\@IEEElegacywarn{iedlabeljustifyc}{IEEEiedlabeljustifyc}\IEEEiedlabeljustifyc}
6326 %\def\iedlabeljustifyl{\@IEEElegacywarn{iedlabeljustifyl}{IEEEiedlabeljustifyl}\IEEEiedlabeljustifyl}
6327 %\def\iedlabeljustifyr{\@IEEElegacywarn{iedlabeljustifyr}{IEEEiedlabeljustifyr}\IEEEiedlabeljustifyr}
6328 % V1.8 no more support for QED and proof stuff
6329 %\def\QED{\@IEEElegacywarn{QED}{IEEEQED}\IEEEQED}
6330 %\def\QEDclosed{\@IEEElegacywarn{QEDclosed}{IEEEQEDclosed}\IEEEQEDclosed}
6331 %\def\QEDopen{\@IEEElegacywarn{QEDopen}{IEEEQEDopen}\IEEEQEDopen}
6332 %\AtBeginDocument{\def\proof{\@IEEElegacywarn{proof}{IEEEproof}\IEEEproof}\def\endproof{\endIEEEproof}}
6333 % V1.8 no longer support biography or biographynophoto
6334 %\def\biography{\@IEEElegacywarn{biography}{IEEEbiography}\IEEEbiography}
6335 %\def\biographynophoto{\@IEEElegacywarn{biographynophoto}{IEEEbiographynophoto}\IEEEbiographynophoto}
6336 %\def\endbiography{\endIEEEbiography}
6337 %\def\endbiographynophoto{\endIEEEbiographynophoto}
6338 % V1.7 and later no longer supports \overrideIEEEmargins
6339 %\def\overrideIEEEmargins{%
6340 %\typeout{** WARNING: \string\overrideIEEEmargins \space no longer supported (line \the\inputlineno).}%
6341 %\typeout{** Use the \string\CLASSINPUTinnersidemargin, \string\CLASSINPUToutersidemargin \space controls instead.}}
6342
6343 \endinput
6344
6345 %%%%%%%%%%%%%%%%%%%%%%%%%%%%% End of IEEEtran.cls  %%%%%%%%%%%%%%%%%%%%%%%%%%%%
6346 % That's all folks!
6347