From baab2e76c0a2512662f2f4e1fc3eeae5cc24c00e Mon Sep 17 00:00:00 2001 From: Florian Obser Date: Fri, 14 Jun 2024 18:44:55 +0200 Subject: [PATCH] add asiabsdcon paper --- asiabsdcon2023/IEEEtran.cls | 6347 ++++++++++++++++++++++ asiabsdcon2023/asiabsdcon_2023_final.pdf | Bin 0 -> 113299 bytes asiabsdcon2023/asiabsdcon_2023_final.tex | 686 +++ index.org | 1 + 4 files changed, 7034 insertions(+) create mode 100644 asiabsdcon2023/IEEEtran.cls create mode 100644 asiabsdcon2023/asiabsdcon_2023_final.pdf create mode 100644 asiabsdcon2023/asiabsdcon_2023_final.tex diff --git a/asiabsdcon2023/IEEEtran.cls b/asiabsdcon2023/IEEEtran.cls new file mode 100644 index 0000000..905a10c --- /dev/null +++ b/asiabsdcon2023/IEEEtran.cls @@ -0,0 +1,6347 @@ +%% +%% IEEEtran.cls 2015/08/26 version V1.8b +%% +%% This is the IEEEtran LaTeX class for authors of the Institute of +%% Electrical and Electronics Engineers (IEEE) Transactions journals and +%% conferences. +%% +%% Support sites: +%% http://www.michaelshell.org/tex/ieeetran/ +%% http://www.ctan.org/pkg/ieeetran +%% and +%% http://www.ieee.org/ +%% +%% Based on the original 1993 IEEEtran.cls, but with many bug fixes +%% and enhancements (from both JVH and MDS) over the 1996/7 version. +%% +%% +%% Contributors: +%% Gerry Murray (1993), Silvano Balemi (1993), +%% Jon Dixon (1996), Peter N"uchter (1996), +%% Juergen von Hagen (2000), and Michael Shell (2001-2014) +%% +%% +%% Copyright (c) 1993-2000 by Gerry Murray, Silvano Balemi, +%% Jon Dixon, Peter N"uchter, +%% Juergen von Hagen +%% and +%% Copyright (c) 2001-2015 by Michael Shell +%% +%% Current maintainer (V1.3 to V1.8b): Michael Shell +%% See: +%% http://www.michaelshell.org/ +%% for current contact information. +%% +%% Special thanks to Peter Wilson (CUA) and Donald Arseneau +%% for allowing the inclusion of the \@ifmtarg command +%% from their ifmtarg LaTeX package. +%% +%%************************************************************************* +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall the IEEE or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE. +%% +%% This work is distributed under the LaTeX Project Public License (LPPL) +%% ( http://www.latex-project.org/ ) version 1.3, and may be freely used, +%% distributed and modified. A copy of the LPPL, version 1.3, is included +%% in the base LaTeX documentation of all distributions of LaTeX released +%% 2003/12/01 or later. +%% Retain all contribution notices and credits. +%% ** Modified files should be clearly indicated as such, including ** +%% ** renaming them and changing author support contact information. ** +%% +%% File list of work: IEEEtran.cls, IEEEtran_HOWTO.pdf, bare_adv.tex, +%% bare_conf.tex, bare_jrnl.tex, bare_conf_compsoc.tex, +%% bare_jrnl_compsoc.tex +%% +%% Major changes to the user interface should be indicated by an +%% increase in the version numbers. If a version is a beta, it will +%% be indicated with a BETA suffix, i.e., 1.4 BETA. +%% Small changes can be indicated by appending letters to the version +%% such as "IEEEtran_v14a.cls". +%% In all cases, \Providesclass, any \typeout messages to the user, +%% \IEEEtransversionmajor and \IEEEtransversionminor must reflect the +%% correct version information. +%% The changes should also be documented via source comments. +%%************************************************************************* +%% +% +% Available class options +% e.g., \documentclass[10pt,conference]{IEEEtran} +% +% *** choose only one from each category *** +% +% 9pt, 10pt, 11pt, 12pt +% Sets normal font size. The default is 10pt. +% +% conference, journal, technote, peerreview, peerreviewca +% determines format mode - conference papers, journal papers, +% correspondence papers (technotes), or peer review papers. The user +% should also select 9pt when using technote. peerreview is like +% journal mode, but provides for a single-column "cover" title page for +% anonymous peer review. The paper title (without the author names) is +% repeated at the top of the page after the cover page. For peer review +% papers, the \IEEEpeerreviewmaketitle command must be executed (will +% automatically be ignored for non-peerreview modes) at the place the +% cover page is to end, usually just after the abstract (keywords are +% not normally used with peer review papers). peerreviewca is like +% peerreview, but allows the author names to be entered and formatted +% as with conference mode so that author affiliation and contact +% information can be easily seen on the cover page. +% The default is journal. +% +% draft, draftcls, draftclsnofoot, final +% determines if paper is formatted as a widely spaced draft (for +% handwritten editor comments) or as a properly typeset final version. +% draftcls restricts draft mode to the class file while all other LaTeX +% packages (i.e., \usepackage{graphicx}) will behave as final - allows +% for a draft paper with visible figures, etc. draftclsnofoot is like +% draftcls, but does not display the date and the word "DRAFT" at the foot +% of the pages. If using one of the draft modes, the user will probably +% also want to select onecolumn. +% The default is final. +% +% letterpaper, a4paper, cspaper +% determines paper size: 8.5in X 11in, 210mm X 297mm or 7.875in X 10.75in. +% Changing the paper size in the standard journal and conference modes +% will not alter the typesetting of the document - only the margins will +% be affected. In particular, documents using the a4paper option will +% have reduced side margins (A4 is narrower than US letter) and a longer +% bottom margin (A4 is longer than US letter). For both cases, the top +% margins will be the same and the text will be horizontally centered. +% For the compsoc conference and draft modes, it is the margins that will +% remain constant, and thus the text area size will vary, with changes in +% the paper size. +% The cspaper option is the special ``trim'' paper size (7.875in x 10.75in) +% used in the actual publication of Computer Society journals. Under +% compsoc journal mode, this option does not alter the typesetting of the +% document. Authors should invoke the cspaper option only if requested to +% do so by the editors of the specific journal they are submitting to. +% For final submission to the IEEE, authors should generally use US letter +% (8.5 X 11in) paper unless otherwise instructed. Note that authors should +% ensure that all post-processing (ps, pdf, etc.) uses the same paper +% specificiation as the .tex document. Problems here are by far the number +% one reason for incorrect margins. IEEEtran will automatically set the +% default paper size under pdflatex (without requiring any change to +% pdftex.cfg), so this issue is more important to dvips users. Fix +% config.ps, config.pdf, or ~/.dvipsrc for dvips, or use the +% dvips -t papersize option instead as needed. For the cspaper option, +% the corresponding dvips paper name is "ieeecs". +% See the testflow documentation +% http://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/testflow +% for more details on dvips paper size configuration. +% The default is letterpaper. +% +% oneside, twoside +% determines if layout follows single sided or two sided (duplex) +% printing. The only notable change is with the headings at the top of +% the pages. +% The default is oneside. +% +% onecolumn, twocolumn +% determines if text is organized into one or two columns per page. One +% column mode is usually used only with draft papers. +% The default is twocolumn. +% +% comsoc, compsoc, transmag +% Use the format of the IEEE Communications Society, IEEE Computer Society +% or IEEE Transactions on Magnetics, respectively. +% +% romanappendices +% Use the "Appendix I" convention when numbering appendices. IEEEtran.cls +% now defaults to Alpha "Appendix A" convention - the opposite of what +% v1.6b and earlier did. +% +% captionsoff +% disables the display of the figure/table captions. Some IEEE journals +% request that captions be removed and figures/tables be put on pages +% of their own at the end of an initial paper submission. The endfloat +% package can be used with this class option to achieve this format. +% +% nofonttune +% turns off tuning of the font interword spacing. Maybe useful to those +% not using the standard Times fonts or for those who have already "tuned" +% their fonts. +% The default is to enable IEEEtran to tune font parameters. +% +% +%---------- +% Available CLASSINPUTs provided (all are macros unless otherwise noted): +% \CLASSINPUTbaselinestretch +% \CLASSINPUTinnersidemargin +% \CLASSINPUToutersidemargin +% \CLASSINPUTtoptextmargin +% \CLASSINPUTbottomtextmargin +% +% Available CLASSINFOs provided: +% \ifCLASSINFOpdf (TeX if conditional) +% \CLASSINFOpaperwidth (macro) +% \CLASSINFOpaperheight (macro) +% \CLASSINFOnormalsizebaselineskip (length) +% \CLASSINFOnormalsizeunitybaselineskip (length) +% +% Available CLASSOPTIONs provided: +% all class option flags (TeX if conditionals) unless otherwise noted, +% e.g., \ifCLASSOPTIONcaptionsoff +% point size options provided as a single macro: +% \CLASSOPTIONpt +% which will be defined as 9, 10, 11, or 12 depending on the document's +% normalsize point size. +% also, class option peerreviewca implies the use of class option peerreview +% and classoption draft implies the use of class option draftcls + + + + + +\ProvidesClass{IEEEtran}[2015/08/26 V1.8b by Michael Shell] +\typeout{-- See the "IEEEtran_HOWTO" manual for usage information.} +\typeout{-- http://www.michaelshell.org/tex/ieeetran/} +\NeedsTeXFormat{LaTeX2e} + +% IEEEtran.cls version numbers, provided as of V1.3 +% These values serve as a way a .tex file can +% determine if the new features are provided. +% The version number of this IEEEtrans.cls can be obtained from +% these values. i.e., V1.4 +% KEEP THESE AS INTEGERS! i.e., NO {4a} or anything like that- +% (no need to enumerate "a" minor changes here) +\def\IEEEtransversionmajor{1} +\def\IEEEtransversionminor{8} + + +% hook to allow easy changeover to IEEEtran.cls/tools.sty error reporting +\def\@IEEEclspkgerror{\ClassError{IEEEtran}} + + +% These do nothing, but provide them like in article.cls +\newif\if@restonecol +\newif\if@titlepage + + +% class option conditionals +\newif\ifCLASSOPTIONonecolumn \CLASSOPTIONonecolumnfalse +\newif\ifCLASSOPTIONtwocolumn \CLASSOPTIONtwocolumntrue + +\newif\ifCLASSOPTIONoneside \CLASSOPTIONonesidetrue +\newif\ifCLASSOPTIONtwoside \CLASSOPTIONtwosidefalse + +\newif\ifCLASSOPTIONfinal \CLASSOPTIONfinaltrue +\newif\ifCLASSOPTIONdraft \CLASSOPTIONdraftfalse +\newif\ifCLASSOPTIONdraftcls \CLASSOPTIONdraftclsfalse +\newif\ifCLASSOPTIONdraftclsnofoot \CLASSOPTIONdraftclsnofootfalse + +\newif\ifCLASSOPTIONpeerreview \CLASSOPTIONpeerreviewfalse +\newif\ifCLASSOPTIONpeerreviewca \CLASSOPTIONpeerreviewcafalse + +\newif\ifCLASSOPTIONjournal \CLASSOPTIONjournaltrue +\newif\ifCLASSOPTIONconference \CLASSOPTIONconferencefalse +\newif\ifCLASSOPTIONtechnote \CLASSOPTIONtechnotefalse + +\newif\ifCLASSOPTIONnofonttune \CLASSOPTIONnofonttunefalse + +\newif\ifCLASSOPTIONcaptionsoff \CLASSOPTIONcaptionsofffalse + +\newif\ifCLASSOPTIONcomsoc \CLASSOPTIONcomsocfalse +\newif\ifCLASSOPTIONcompsoc \CLASSOPTIONcompsocfalse +\newif\ifCLASSOPTIONtransmag \CLASSOPTIONtransmagfalse + +\newif\ifCLASSOPTIONromanappendices \CLASSOPTIONromanappendicesfalse + + +% class info conditionals + +% indicates if pdf (via pdflatex) output +\newif\ifCLASSINFOpdf \CLASSINFOpdffalse + + +% V1.6b internal flag to show if using a4paper +\newif\if@IEEEusingAfourpaper \@IEEEusingAfourpaperfalse +% V1.6b internal flag to show if using cspaper +\newif\if@IEEEusingcspaper \@IEEEusingcspaperfalse + + +% IEEEtran class scratch pad registers +% dimen +\newdimen\@IEEEtrantmpdimenA +\newdimen\@IEEEtrantmpdimenB +\newdimen\@IEEEtrantmpdimenC +% count +\newcount\@IEEEtrantmpcountA +\newcount\@IEEEtrantmpcountB +\newcount\@IEEEtrantmpcountC +% token list +\newtoks\@IEEEtrantmptoksA + +% we use \CLASSOPTIONpt so that we can ID the point size (even for 9pt docs) +% as well as LaTeX's \@ptsize to retain some compatability with some +% external packages +\def\@ptsize{0} +% LaTeX does not support 9pt, so we set \@ptsize to 0 - same as that of 10pt +\DeclareOption{9pt}{\def\CLASSOPTIONpt{9}\def\@ptsize{0}} +\DeclareOption{10pt}{\def\CLASSOPTIONpt{10}\def\@ptsize{0}} +\DeclareOption{11pt}{\def\CLASSOPTIONpt{11}\def\@ptsize{1}} +\DeclareOption{12pt}{\def\CLASSOPTIONpt{12}\def\@ptsize{2}} + + + +\DeclareOption{letterpaper}{\setlength{\paperwidth}{8.5in}% + \setlength{\paperheight}{11in}% + \@IEEEusingAfourpaperfalse + \@IEEEusingcspaperfalse + \def\CLASSOPTIONpaper{letter}% + \def\CLASSINFOpaperwidth{8.5in}% + \def\CLASSINFOpaperheight{11in}} + + +\DeclareOption{a4paper}{\setlength{\paperwidth}{210mm}% + \setlength{\paperheight}{297mm}% + \@IEEEusingAfourpapertrue + \@IEEEusingcspaperfalse + \def\CLASSOPTIONpaper{a4}% + \def\CLASSINFOpaperwidth{210mm}% + \def\CLASSINFOpaperheight{297mm}} + +% special paper option for compsoc journals +\DeclareOption{cspaper}{\setlength{\paperwidth}{7.875in}% + \setlength{\paperheight}{10.75in}% + \@IEEEusingcspapertrue + \@IEEEusingAfourpaperfalse + \def\CLASSOPTIONpaper{ieeecs}% + \def\CLASSINFOpaperwidth{7.875in}% + \def\CLASSINFOpaperheight{10.75in}} + +\DeclareOption{oneside}{\@twosidefalse\@mparswitchfalse + \CLASSOPTIONonesidetrue\CLASSOPTIONtwosidefalse} +\DeclareOption{twoside}{\@twosidetrue\@mparswitchtrue + \CLASSOPTIONtwosidetrue\CLASSOPTIONonesidefalse} + +\DeclareOption{onecolumn}{\CLASSOPTIONonecolumntrue\CLASSOPTIONtwocolumnfalse} +\DeclareOption{twocolumn}{\CLASSOPTIONtwocolumntrue\CLASSOPTIONonecolumnfalse} + +% If the user selects draft, then this class AND any packages +% will go into draft mode. +\DeclareOption{draft}{\CLASSOPTIONdrafttrue\CLASSOPTIONdraftclstrue + \CLASSOPTIONdraftclsnofootfalse} +% draftcls is for a draft mode which will not affect any packages +% used by the document. +\DeclareOption{draftcls}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclstrue + \CLASSOPTIONdraftclsnofootfalse} +% draftclsnofoot is like draftcls, but without the footer. +\DeclareOption{draftclsnofoot}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclstrue + \CLASSOPTIONdraftclsnofoottrue} +\DeclareOption{final}{\CLASSOPTIONdraftfalse\CLASSOPTIONdraftclsfalse + \CLASSOPTIONdraftclsnofootfalse} + +\DeclareOption{journal}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournaltrue\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse} + +\DeclareOption{conference}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencetrue\CLASSOPTIONtechnotefalse} + +\DeclareOption{technote}{\CLASSOPTIONpeerreviewfalse\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotetrue} + +\DeclareOption{peerreview}{\CLASSOPTIONpeerreviewtrue\CLASSOPTIONpeerreviewcafalse + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse} + +\DeclareOption{peerreviewca}{\CLASSOPTIONpeerreviewtrue\CLASSOPTIONpeerreviewcatrue + \CLASSOPTIONjournalfalse\CLASSOPTIONconferencefalse\CLASSOPTIONtechnotefalse} + +\DeclareOption{nofonttune}{\CLASSOPTIONnofonttunetrue} + +\DeclareOption{captionsoff}{\CLASSOPTIONcaptionsofftrue} + +\DeclareOption{comsoc}{\CLASSOPTIONcomsoctrue\CLASSOPTIONcompsocfalse\CLASSOPTIONtransmagfalse} + +\DeclareOption{compsoc}{\CLASSOPTIONcomsocfalse\CLASSOPTIONcompsoctrue\CLASSOPTIONtransmagfalse} + +\DeclareOption{transmag}{\CLASSOPTIONtransmagtrue\CLASSOPTIONcomsocfalse\CLASSOPTIONcompsocfalse} + +\DeclareOption{romanappendices}{\CLASSOPTIONromanappendicestrue} + + +% default to US letter paper, 10pt, twocolumn, one sided, final, journal +\ExecuteOptions{letterpaper,10pt,twocolumn,oneside,final,journal} +% overrride these defaults per user requests +\ProcessOptions + + + +%% -- Command Argument Scanning Support Functions -- + +% Sets the category codes for punctuation to their normal values. +% For local use with argument scanning. +\def\IEEEnormalcatcodespunct{\catcode`\!=12 \catcode`\,=12 \catcode`\:=12 +\catcode`\;=12 \catcode`\`=12 \catcode`\'=12 \catcode`\"=12 \catcode`\.=12 +\catcode`\/=12 \catcode`\?=12 \catcode`\*=12 \catcode`\+=12 \catcode`\-=12 +\catcode`\<=12 \catcode`\>=12 \catcode`\(=12 \catcode`\)=12 \catcode`\[=12 +\catcode`\]=12 \catcode`\==12 \catcode`\|=12} +% Sets the category codes for numbers to their normal values. +% For local use with argument scanning. +\def\IEEEnormalcatcodesnum{\catcode`\0=12 \catcode`\1=12 \catcode`\2=12 +\catcode`\3=12 \catcode`\4=12 \catcode`\5=12 \catcode`\6=12 \catcode`\7=12 +\catcode`\8=12 \catcode`\9=12} +% combined action of \IEEEnormalcatcodespunct and \IEEEnormalcatcodesnum +\def\IEEEnormalcatcodes{\IEEEnormalcatcodespunct\IEEEnormalcatcodesnum} + + +% usage: \@IEEEextracttoken*{} +% \@IEEEextracttoken fully expands its argument (which it then stores in +% \@IEEEextracttokenarg) via \edef and then the meaning of the first +% nonbrace (but including the empty group) token found is assigned via \let +% to \@IEEEextractedtoken as well as stored in the macro +% \@IEEEextractedtokenmacro. Tokens that would otherwise be discarded during +% the acquisition of the first are stored in \@IEEEextractedtokensdiscarded, +% however their original relative brace nesting depths are not guaranteed to +% be preserved. +% If the argument is empty, or if a first nonbrace token does not exist (or +% is an empty group), \@IEEEextractedtoken will be \relax and +% \@IEEEextractedtokenmacro and \@IEEEextractedtokensdiscarded will be empty. +% +% For example: +% \@IEEEextracttoken{{{ab}{cd}}{{ef}g}} +% results in: +% +% \@IEEEextracttokenarg ==> a macro containing {{ab}{cd}}{{ef}g} +% \@IEEEextractedtoken ==> the letter a +% \@IEEEextractedtokenmacro ==> a macro containing a +% \@IEEEextractedtokensdiscarded ==> a macro containing bcd{ef}g +% +% the *-star form, \@IEEEextracttoken*, does not expand its argument +% contents during processing. +\def\@IEEEextracttoken{\@ifstar{\let\@IEEEextracttokendef=\def\@@IEEEextracttoken}{\let\@IEEEextracttokendef=\edef\@@IEEEextracttoken}} + +\def\@@IEEEextracttoken#1{\@IEEEextracttokendef\@IEEEextracttokenarg{#1}\relax +\def\@IEEEextractedtokensdiscarded{}\relax % initialize to empty +% if the macro is unchanged after being acquired as a single undelimited argument +% with anything after it being stripped off as a delimited argument +% we know we have one token without any enclosing braces. loop until this is true. +\let\@IEEEextracttokencurgroup\@IEEEextracttokenarg +\loop + % trap case of an empty argument as this would cause a problem with + % \@@@IEEEextracttoken's first (nondelimited) argument acquisition + \ifx\@IEEEextracttokencurgroup\@empty + \def\@IEEEextractedtokenmacro{}\relax + \else + \expandafter\@@@IEEEextracttoken\@IEEEextracttokencurgroup\@IEEEgeneralsequenceDELIMITER\relax + \fi + \ifx\@IEEEextractedtokenmacro\@IEEEextracttokencurgroup + \else + \let\@IEEEextracttokencurgroup=\@IEEEextractedtokenmacro +\repeat +% we can safely do a \let= here because there should be at most one token +% the relax is needed to handle the case of no token found +\expandafter\let\expandafter\@IEEEextractedtoken\@IEEEextractedtokenmacro\relax} + +\def\@@@IEEEextracttoken#1#2\@IEEEgeneralsequenceDELIMITER{\def\@IEEEextractedtokenmacro{#1}\relax +\def\@@IEEEextractedtokensdiscarded{#2}\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter +\@IEEEextractedtokensdiscarded\expandafter\expandafter\expandafter +{\expandafter\@@IEEEextractedtokensdiscarded\@IEEEextractedtokensdiscarded}} +%% +%% -- End of Command Argument Scanning Support Functions -- + + + +% Computer Society conditional execution command +\long\def\@IEEEcompsoconly#1{\relax\ifCLASSOPTIONcompsoc\relax#1\relax\fi\relax} +% inverse +\long\def\@IEEEnotcompsoconly#1{\relax\ifCLASSOPTIONcompsoc\else\relax#1\relax\fi\relax} +% compsoc conference +\long\def\@IEEEcompsocconfonly#1{\relax\ifCLASSOPTIONcompsoc\ifCLASSOPTIONconference\relax#1\relax\fi\fi\relax} +% compsoc not conference +\long\def\@IEEEcompsocnotconfonly#1{\relax\ifCLASSOPTIONcompsoc\ifCLASSOPTIONconference\else\relax#1\relax\fi\fi\relax} + + +% comsoc verify that newtxmath, mtpro2, mt11p or mathtime has been loaded +\def\@IEEEcomsocverifymathfont{\typeout{-- Verifying Times compatible math font.}\relax + \@ifpackageloaded{newtxmath}{\typeout{-- newtxmath loaded, OK.}}{\@@IEEEcomsocverifymathfont}} +\def\@@IEEEcomsocverifymathfont{\@ifpackageloaded{mtpro2}{\typeout{-- mtpro2 loaded, OK.}}{\@@@IEEEcomsocverifymathfont}} +\def\@@@IEEEcomsocverifymathfont{\@ifpackageloaded{mt11p}{\typeout{-- mt11p2 loaded, OK.}}{\@@@@IEEEcomsocverifymathfont}} +\def\@@@@IEEEcomsocverifymathfont{\@ifpackageloaded{mathtime}{\typeout{-- mathtime loaded, OK.}}{\@IEEEcomsocenforcemathfont}} + +% comsoc, if a Times math font was not loaded by user, enforce it +\def\@IEEEcomsocenforcemathfont{\typeout{** Times compatible math font not found, forcing.}\relax +\IfFileExists{newtxmath.sty}{\typeout{-- Found newtxmath, loading.}\RequirePackage{newtxmath}}{\@@IEEEcomsocenforcemathfont}} +\def\@@IEEEcomsocenforcemathfont{\IfFileExists{mtpro2.sty}{\typeout{-- Found mtpro2, loading.}\RequirePackage{mtpro2}}{\@@@IEEEcomsocenforcemathfont}} +\def\@@@IEEEcomsocenforcemathfont{\IfFileExists{mt11p.sty}{\typeout{-- Found mt11p, loading.}\RequirePackage{mt11p}}{\@@@@IEEEcomsocenforcemathfont}} +\def\@@@@IEEEcomsocenforcemathfont{\IfFileExists{mathtime.sty}{\typeout{-- Found mathtime, loading.}\RequirePackage{mathtime}}{\@@@@@IEEEcomsocenforcemathfont}} +% if no acceptable Times math font package found, error with newtxmath requirement +\def\@@@@@IEEEcomsocenforcemathfont{\typeout{** No Times compatible math font package found. newtxmath is required.}\RequirePackage{newtxmath}} + + +\ifCLASSOPTIONcomsoc + % ensure that if newtxmath is used, the cmintegrals option is also invoked + \PassOptionsToPackage{cmintegrals}{newtxmath} + % comsoc requires a Times like math font + % ensure this requirement is satisfied at document start + \AtBeginDocument{\@IEEEcomsocverifymathfont} +\fi + + + +% The IEEE uses Times Roman font, so we'll default to Times. +% These three commands make up the entire times.sty package. +\renewcommand{\sfdefault}{phv} +\renewcommand{\rmdefault}{ptm} +\renewcommand{\ttdefault}{pcr} + +% V1.7 compsoc nonconference papers, use Palatino/Palladio as the main text font, +% not Times Roman. +\@IEEEcompsocnotconfonly{\renewcommand{\rmdefault}{ppl}} + +% enable the selected main text font +\normalfont\selectfont + + +\ifCLASSOPTIONcomsoc + \typeout{-- Using IEEE Communications Society mode.} +\fi + +\ifCLASSOPTIONcompsoc + \typeout{-- Using IEEE Computer Society mode.} +\fi + + +% V1.7 conference notice message hook +\def\@IEEEconsolenoticeconference{\typeout{}% +\typeout{** Conference Paper **}% +\typeout{Before submitting the final camera ready copy, remember to:}% +\typeout{}% +\typeout{ 1. Manually equalize the lengths of two columns on the last page}% +\typeout{ of your paper;}% +\typeout{}% +\typeout{ 2. Ensure that any PostScript and/or PDF output post-processing}% +\typeout{ uses only Type 1 fonts and that every step in the generation}% +\typeout{ process uses the appropriate paper size.}% +\typeout{}} + + +% we can send console reminder messages to the user here +\AtEndDocument{\ifCLASSOPTIONconference\@IEEEconsolenoticeconference\fi} + + +% warn about the use of single column other than for draft mode +\ifCLASSOPTIONtwocolumn\else% + \ifCLASSOPTIONdraftcls\else% + \typeout{** ATTENTION: Single column mode is not typically used with IEEE publications.}% + \fi% +\fi + + +% V1.7 improved paper size setting code. +% Set pdfpage and dvips paper sizes. Conditional tests are similar to that +% of ifpdf.sty. Retain within {} to ensure tested macros are never altered, +% even if only effect is to set them to \relax. +% if \pdfoutput is undefined or equal to relax, output a dvips special +{\@ifundefined{pdfoutput}{\AtBeginDvi{\special{papersize=\CLASSINFOpaperwidth,\CLASSINFOpaperheight}}}{% +% pdfoutput is defined and not equal to \relax +% check for pdfpageheight existence just in case someone sets pdfoutput +% under non-pdflatex. If exists, set them regardless of value of \pdfoutput. +\@ifundefined{pdfpageheight}{\relax}{\global\pdfpagewidth\paperwidth +\global\pdfpageheight\paperheight}% +% if using \pdfoutput=0 under pdflatex, send dvips papersize special +\ifcase\pdfoutput +\AtBeginDvi{\special{papersize=\CLASSINFOpaperwidth,\CLASSINFOpaperheight}}% +\else +% we are using pdf output, set CLASSINFOpdf flag +\global\CLASSINFOpdftrue +\fi}} + +% let the user know the selected papersize +\typeout{-- Using \CLASSINFOpaperwidth\space x \CLASSINFOpaperheight\space +(\CLASSOPTIONpaper)\space paper.} + +\ifCLASSINFOpdf +\typeout{-- Using PDF output.} +\else +\typeout{-- Using DVI output.} +\fi + + +% The idea hinted here is for LaTeX to generate markleft{} and markright{} +% automatically for you after you enter \author{}, \journal{}, +% \journaldate{}, journalvol{}, \journalnum{}, etc. +% However, there may be some backward compatibility issues here as +% well as some special applications for IEEEtran.cls and special issues +% that may require the flexible \markleft{}, \markright{} and/or \markboth{}. +% We'll leave this as an open future suggestion. +%\newcommand{\journal}[1]{\def\@journal{#1}} +%\def\@journal{} + + + +% pointsize values +% used with ifx to determine the document's normal size +\def\@IEEEptsizenine{9} +\def\@IEEEptsizeten{10} +\def\@IEEEptsizeeleven{11} +\def\@IEEEptsizetwelve{12} + + + +% FONT DEFINITIONS (No sizexx.clo file needed) +% V1.6 revised font sizes, displayskip values and +% revised normalsize baselineskip to reduce underfull vbox problems +% on the 58pc = 696pt = 9.5in text height we want +% normalsize #lines/column baselineskip (aka leading) +% 9pt 63 11.0476pt (truncated down) +% 10pt 58 12pt (exact) +% 11pt 52 13.3846pt (truncated down) +% 12pt 50 13.92pt (exact) +% + +% we need to store the nominal baselineskip for the given font size +% in case baselinestretch ever changes. +% this is a dimen, so it will not hold stretch or shrink +\newdimen\@IEEEnormalsizeunitybaselineskip +\@IEEEnormalsizeunitybaselineskip\baselineskip + + + +%% ******* WARNING! ******* +%% +%% Authors should not alter font sizes, baselineskip ("leading"), +%% margins or other spacing values in an attempt to squeeze more +%% material on each page. +%% +%% The IEEE's own typesetting software will restore the correct +%% values when re-typesetting/proofing the submitted document, +%% possibly resulting in unexpected article over length charges. +%% +%% ******* WARNING! ******* + + +% 9pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\typeout{-- This is a 9 point document.} +\def\normalsize{\@setfontsize{\normalsize}{9}{11.0476pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11.0476pt} +\normalsize +\abovedisplayskip 1.5ex plus 3pt minus 1pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 3pt +\belowdisplayshortskip 1.5ex plus 3pt minus 1pt +\def\small{\@setfontsize{\small}{8.5}{10pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{8}{9pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{7}{8pt}} +\def\tiny{\@setfontsize{\tiny}{5}{6pt}} +% sublargesize is the same as large - 10pt +\def\sublargesize{\@setfontsize{\sublargesize}{10}{12pt}} +\def\large{\@setfontsize{\large}{10}{12pt}} +\def\Large{\@setfontsize{\Large}{12}{14pt}} +\def\LARGE{\@setfontsize{\LARGE}{14}{17pt}} +\def\huge{\@setfontsize{\huge}{17}{20pt}} +\def\Huge{\@setfontsize{\Huge}{20}{24pt}} +\fi +% +% 10pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizeten +\typeout{-- This is a 10 point document.} +\def\normalsize{\@setfontsize{\normalsize}{10}{12.00pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{12pt} +\normalsize +\abovedisplayskip 1.5ex plus 4pt minus 2pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4pt +\belowdisplayshortskip 1.5ex plus 4pt minus 2pt +\def\small{\@setfontsize{\small}{9}{10pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{8}{9pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{7}{8pt}} +\def\tiny{\@setfontsize{\tiny}{5}{6pt}} +% sublargesize is a tad smaller than large - 11pt +\def\sublargesize{\@setfontsize{\sublargesize}{11}{13.4pt}} +\def\large{\@setfontsize{\large}{12}{14pt}} +\def\Large{\@setfontsize{\Large}{14}{17pt}} +\def\LARGE{\@setfontsize{\LARGE}{17}{20pt}} +\def\huge{\@setfontsize{\huge}{20}{24pt}} +\def\Huge{\@setfontsize{\Huge}{24}{28pt}} +\fi +% +% 11pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\typeout{-- This is an 11 point document.} +\def\normalsize{\@setfontsize{\normalsize}{11}{13.3846pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.3846pt} +\normalsize +\abovedisplayskip 1.5ex plus 5pt minus 3pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5pt +\belowdisplayshortskip 1.5ex plus 5pt minus 3pt +\def\small{\@setfontsize{\small}{10}{12pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{9}{10.5pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{8}{9pt}} +\def\tiny{\@setfontsize{\tiny}{6}{7pt}} +% sublargesize is the same as large - 12pt +\def\sublargesize{\@setfontsize{\sublargesize}{12}{14pt}} +\def\large{\@setfontsize{\large}{12}{14pt}} +\def\Large{\@setfontsize{\Large}{14}{17pt}} +\def\LARGE{\@setfontsize{\LARGE}{17}{20pt}} +\def\huge{\@setfontsize{\huge}{20}{24pt}} +\def\Huge{\@setfontsize{\Huge}{24}{28pt}} +\fi +% +% 12pt option defaults +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\typeout{-- This is a 12 point document.} +\def\normalsize{\@setfontsize{\normalsize}{12}{13.92pt}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.92pt} +\normalsize +\abovedisplayskip 1.5ex plus 6pt minus 4pt +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6pt +\belowdisplayshortskip 1.5ex plus 6pt minus 4pt +\def\small{\@setfontsize{\small}{10}{12pt}} +\def\footnotesize{\@setfontsize{\footnotesize}{9}{10.5pt}} +\def\scriptsize{\@setfontsize{\scriptsize}{8}{9pt}} +\def\tiny{\@setfontsize{\tiny}{6}{7pt}} +% sublargesize is the same as large - 14pt +\def\sublargesize{\@setfontsize{\sublargesize}{14}{17pt}} +\def\large{\@setfontsize{\large}{14}{17pt}} +\def\Large{\@setfontsize{\Large}{17}{20pt}} +\def\LARGE{\@setfontsize{\LARGE}{20}{24pt}} +\def\huge{\@setfontsize{\huge}{22}{26pt}} +\def\Huge{\@setfontsize{\Huge}{24}{28pt}} +\fi + + + +% V1.8a compsoc font sizes +% compsoc font sizes use bp "Postscript" point units (1/72in) +% rather than the traditional pt (1/72.27) +\ifCLASSOPTIONcompsoc +% -- compsoc defaults -- +% ** will override some of these values later ** +% 9pt +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\def\normalsize{\@setfontsize{\normalsize}{9bp}{11bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11bp} +\normalsize +\abovedisplayskip 1.5ex plus 3bp minus 1bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0bp plus 3bp +\belowdisplayshortskip 1.5ex plus 3bp minus 1bp +\def\small{\@setfontsize{\small}{8.5bp}{10bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{8bp}{9bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{7bp}{8bp}} +\def\tiny{\@setfontsize{\tiny}{5bp}{6bp}} +% sublargesize is the same as large - 10bp +\def\sublargesize{\@setfontsize{\sublargesize}{10bp}{12bp}} +\def\large{\@setfontsize{\large}{10bp}{12bp}} +\def\Large{\@setfontsize{\Large}{12bp}{14bp}} +\def\LARGE{\@setfontsize{\LARGE}{14bp}{17bp}} +\def\huge{\@setfontsize{\huge}{17bp}{20bp}} +\def\Huge{\@setfontsize{\Huge}{20bp}{24bp}} +\fi +% +% 10pt +\ifx\CLASSOPTIONpt\@IEEEptsizeten +\def\normalsize{\@setfontsize{\normalsize}{10bp}{12bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{12bp} +\normalsize +\abovedisplayskip 1.5ex plus 4bp minus 2bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4bp +\belowdisplayshortskip 1.5ex plus 4bp minus 2bp +\def\small{\@setfontsize{\small}{9bp}{10bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{8bp}{9bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{7bp}{8bp}} +\def\tiny{\@setfontsize{\tiny}{5bp}{6bp}} +% sublargesize is a tad smaller than large - 11bp +\def\sublargesize{\@setfontsize{\sublargesize}{11bp}{13.5bp}} +\def\large{\@setfontsize{\large}{12bp}{14bp}} +\def\Large{\@setfontsize{\Large}{14bp}{17bp}} +\def\LARGE{\@setfontsize{\LARGE}{17bp}{20bp}} +\def\huge{\@setfontsize{\huge}{20bp}{24bp}} +\def\Huge{\@setfontsize{\Huge}{24bp}{28bp}} +\fi +% +% 11pt +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\def\normalsize{\@setfontsize{\normalsize}{11bp}{13.5bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.5bp} +\normalsize +\abovedisplayskip 1.5ex plus 5bp minus 3bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5bp +\belowdisplayshortskip 1.5ex plus 5bp minus 3bp +\def\small{\@setfontsize{\small}{10bp}{12bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{9bp}{10.5bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{8bp}{9bp}} +\def\tiny{\@setfontsize{\tiny}{6bp}{7bp}} +% sublargesize is the same as large - 12bp +\def\sublargesize{\@setfontsize{\sublargesize}{12bp}{14bp}} +\def\large{\@setfontsize{\large}{12bp}{14bp}} +\def\Large{\@setfontsize{\Large}{14bp}{17bp}} +\def\LARGE{\@setfontsize{\LARGE}{17bp}{20bp}} +\def\huge{\@setfontsize{\huge}{20bp}{24bp}} +\def\Huge{\@setfontsize{\Huge}{24bp}{28bp}} +\fi +% +% 12pt +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\def\normalsize{\@setfontsize{\normalsize}{12bp}{14bp}}% +\setlength{\@IEEEnormalsizeunitybaselineskip}{14bp}% +\normalsize +\abovedisplayskip 1.5ex plus 6bp minus 4bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6bp +\belowdisplayshortskip 1.5ex plus 6bp minus 4bp +\def\small{\@setfontsize{\small}{10bp}{12bp}} +\def\footnotesize{\@setfontsize{\footnotesize}{9bp}{10.5bp}} +\def\scriptsize{\@setfontsize{\scriptsize}{8bp}{9bp}} +\def\tiny{\@setfontsize{\tiny}{6bp}{7bp}} +% sublargesize is the same as large - 14bp +\def\sublargesize{\@setfontsize{\sublargesize}{14bp}{17bp}} +\def\large{\@setfontsize{\large}{14bp}{17bp}} +\def\Large{\@setfontsize{\Large}{17bp}{20bp}} +\def\LARGE{\@setfontsize{\LARGE}{20bp}{24bp}} +\def\huge{\@setfontsize{\huge}{22bp}{26bp}} +\def\Huge{\@setfontsize{\Huge}{24bp}{28bp}} +\fi +% +% -- override defaults: compsoc journals use special normalsizes -- +\ifCLASSOPTIONconference +% +% compsoc conferences +% 9pt +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\def\normalsize{\@setfontsize{\normalsize}{9bp}{10.8bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{10.8bp} +\normalsize +\abovedisplayskip 1.5ex plus 3bp minus 1bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0bp plus 3bp +\belowdisplayshortskip 1.5ex plus 3bp minus 1bp +\fi +% 10pt +\ifx\CLASSOPTIONpt\@IEEEptsizeten +\def\normalsize{\@setfontsize{\normalsize}{10bp}{11.2bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11.2bp} +\normalsize +\abovedisplayskip 1.5ex plus 4bp minus 2bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4bp +\belowdisplayshortskip 1.5ex plus 4bp minus 2bp +\fi +% 11pt +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\def\normalsize{\@setfontsize{\normalsize}{11bp}{13.2bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.2bp} +\normalsize +\abovedisplayskip 1.5ex plus 5bp minus 3bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5bp +\belowdisplayshortskip 1.5ex plus 5bp minus 3bp +\fi +% 12pt +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\def\normalsize{\@setfontsize{\normalsize}{12bp}{14.4bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{14.4bp} +\normalsize +\abovedisplayskip 1.5ex plus 6bp minus 4bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6bp +\belowdisplayshortskip 1.5ex plus 6bp minus 4bp +\fi +% +% compsoc nonconferences +\else +% 9pt +\ifx\CLASSOPTIONpt\@IEEEptsizenine +\def\normalsize{\@setfontsize{\normalsize}{9bp}{10.8bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{10.8bp} +\normalsize +\abovedisplayskip 1.5ex plus 3bp minus 1bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0bp plus 3bp +\belowdisplayshortskip 1.5ex plus 3bp minus 1bp +\fi +% 10pt +\ifx\CLASSOPTIONpt\@IEEEptsizeten +% the official spec is 9.5bp with 11.4bp leading for 10pt, +% but measurements of proofs suggest upto 11.723bp leading +% here we'll use 11.54bp which gives 61 lines per column +% with the standard compsoc margins +\def\normalsize{\@setfontsize{\normalsize}{9.5bp}{11.54bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{11.54bp} +\normalsize +\abovedisplayskip 1.5ex plus 4bp minus 2bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 4bp +\belowdisplayshortskip 1.5ex plus 4bp minus 2bp +\fi +% 11pt +\ifx\CLASSOPTIONpt\@IEEEptsizeeleven +\def\normalsize{\@setfontsize{\normalsize}{11bp}{13.2bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{13.2bp} +\normalsize +\abovedisplayskip 1.5ex plus 5bp minus 3bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 5bp +\belowdisplayshortskip 1.5ex plus 5bp minus 3bp +\fi +% 12pt +\ifx\CLASSOPTIONpt\@IEEEptsizetwelve +\def\normalsize{\@setfontsize{\normalsize}{12bp}{14.4bp}} +\setlength{\@IEEEnormalsizeunitybaselineskip}{14.4bp} +\normalsize +\abovedisplayskip 1.5ex plus 6bp minus 4bp +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip 0pt plus 6bp +\belowdisplayshortskip 1.5ex plus 6bp minus 4bp +\fi +\fi\fi + + + + +% V1.6 The Computer Modern Fonts will issue a substitution warning for +% 24pt titles (24.88pt is used instead, but the default and correct +% Times font will scale exactly as needed) increase the substitution +% tolerance to turn off this warning. +% +% V1.8a, the compsoc bp font sizes can also cause bogus font substitution +% warnings with footnote or scriptsize math and the $\bullet$ itemized +% list of \IEEEcompsocitemizethanks. So, increase this to 1.5pt or more. +\def\fontsubfuzz{1.7bp} + + +% warn the user in case they forget to use the 9pt option with +% technote +\ifCLASSOPTIONtechnote% + \ifx\CLASSOPTIONpt\@IEEEptsizenine\else% + \typeout{** ATTENTION: Technotes are normally 9pt documents.}% + \fi% +\fi + + +% V1.7 +% Improved \textunderscore to provide a much better fake _ when used with +% OT1 encoding. Under OT1, detect use of pcr or cmtt \ttfamily and use +% available true _ glyph for those two typewriter fonts. +\def\@IEEEstringptm{ptm} % Times Roman family +\def\@IEEEstringppl{ppl} % Palatino Roman family +\def\@IEEEstringphv{phv} % Helvetica Sans Serif family +\def\@IEEEstringpcr{pcr} % Courier typewriter family +\def\@IEEEstringcmtt{cmtt} % Computer Modern typewriter family +\DeclareTextCommandDefault{\textunderscore}{\leavevmode +\ifx\f@family\@IEEEstringpcr\string_\else +\ifx\f@family\@IEEEstringcmtt\string_\else +\ifx\f@family\@IEEEstringptm\kern 0em\vbox{\hrule\@width 0.5em\@height 0.5pt\kern -0.3ex}\else +\ifx\f@family\@IEEEstringppl\kern 0em\vbox{\hrule\@width 0.5em\@height 0.5pt\kern -0.3ex}\else +\ifx\f@family\@IEEEstringphv\kern -0.03em\vbox{\hrule\@width 0.62em\@height 0.52pt\kern -0.33ex}\kern -0.03em\else +\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} + + + + +% set the default \baselinestretch +\def\baselinestretch{1} +\ifCLASSOPTIONdraftcls + \def\baselinestretch{1.5}% default baselinestretch for draft modes +\fi + + +% process CLASSINPUT baselinestretch +\ifx\CLASSINPUTbaselinestretch\@IEEEundefined +\else + \edef\baselinestretch{\CLASSINPUTbaselinestretch} % user CLASSINPUT override + \typeout{** ATTENTION: Overriding \string\baselinestretch\space to + \baselinestretch\space via \string\CLASSINPUT.} +\fi + +\small\normalsize % make \baselinestretch take affect + + + + +% store the normalsize baselineskip +\newdimen\CLASSINFOnormalsizebaselineskip +\CLASSINFOnormalsizebaselineskip=\baselineskip\relax +% and the normalsize unity (baselinestretch=1) baselineskip +% we could save a register by giving the user access to +% \@IEEEnormalsizeunitybaselineskip. However, let's protect +% its read only internal status +\newdimen\CLASSINFOnormalsizeunitybaselineskip +\CLASSINFOnormalsizeunitybaselineskip=\@IEEEnormalsizeunitybaselineskip\relax +% store the nominal value of jot +\newdimen\IEEEnormaljot +\IEEEnormaljot=0.25\baselineskip\relax + +% set \jot +\jot=\IEEEnormaljot\relax + + + + +% V1.6, we are now going to fine tune the interword spacing +% The default interword glue for Times under TeX appears to use a +% nominal interword spacing of 25% (relative to the font size, i.e., 1em) +% a maximum of 40% and a minimum of 19%. +% For example, 10pt text uses an interword glue of: +% +% 2.5pt plus 1.49998pt minus 0.59998pt +% +% However, the IEEE allows for a more generous range which reduces the need +% for hyphenation, especially for two column text. Furthermore, the IEEE +% tends to use a little bit more nominal space between the words. +% The IEEE's interword spacing percentages appear to be: +% 35% nominal +% 23% minimum +% 50% maximum +% (They may even be using a tad more for the largest fonts such as 24pt.) +% +% for bold text, the IEEE increases the spacing a little more: +% 37.5% nominal +% 23% minimum +% 55% maximum + +% here are the interword spacing ratios we'll use +% for medium (normal weight) +\def\@IEEEinterspaceratioM{0.35} +\def\@IEEEinterspaceMINratioM{0.23} +\def\@IEEEinterspaceMAXratioM{0.50} + +% for bold +\def\@IEEEinterspaceratioB{0.375} +\def\@IEEEinterspaceMINratioB{0.23} +\def\@IEEEinterspaceMAXratioB{0.55} + + +% compsoc nonconference papers use Palatino, +% tweak settings to better match the proofs +\ifCLASSOPTIONcompsoc +\ifCLASSOPTIONconference\else +% for medium (normal weight) +\def\@IEEEinterspaceratioM{0.28} +\def\@IEEEinterspaceMINratioM{0.21} +\def\@IEEEinterspaceMAXratioM{0.47} +% for bold +\def\@IEEEinterspaceratioB{0.305} +\def\@IEEEinterspaceMINratioB{0.21} +\def\@IEEEinterspaceMAXratioB{0.52} +\fi\fi + + +% command to revise the interword spacing for the current font under TeX: +% \fontdimen2 = nominal interword space +% \fontdimen3 = interword stretch +% \fontdimen4 = interword shrink +% since all changes to the \fontdimen are global, we can enclose these commands +% in braces to confine any font attribute or length changes +\def\@@@IEEEsetfontdimens#1#2#3{{% +\setlength{\@IEEEtrantmpdimenB}{\f@size pt}% grab the font size in pt, could use 1em instead. +\setlength{\@IEEEtrantmpdimenA}{#1\@IEEEtrantmpdimenB}% +\fontdimen2\font=\@IEEEtrantmpdimenA\relax +\addtolength{\@IEEEtrantmpdimenA}{-#2\@IEEEtrantmpdimenB}% +\fontdimen3\font=-\@IEEEtrantmpdimenA\relax +\setlength{\@IEEEtrantmpdimenA}{#1\@IEEEtrantmpdimenB}% +\addtolength{\@IEEEtrantmpdimenA}{-#3\@IEEEtrantmpdimenB}% +\fontdimen4\font=\@IEEEtrantmpdimenA\relax}} + +% revise the interword spacing for each font weight +\def\@@IEEEsetfontdimens{{% +\mdseries +\@@@IEEEsetfontdimens{\@IEEEinterspaceratioM}{\@IEEEinterspaceMAXratioM}{\@IEEEinterspaceMINratioM}% +\bfseries +\@@@IEEEsetfontdimens{\@IEEEinterspaceratioB}{\@IEEEinterspaceMAXratioB}{\@IEEEinterspaceMINratioB}% +}} + +% revise the interword spacing for each font shape +% \slshape is not often used for IEEE work and is not altered here. The \scshape caps are +% already a tad too large in the free LaTeX fonts (as compared to what the IEEE uses) so we +% won't alter these either. +\def\@IEEEsetfontdimens{{% +\normalfont +\@@IEEEsetfontdimens +\normalfont\itshape +\@@IEEEsetfontdimens +}} + +% command to revise the interword spacing for each font size (and shape +% and weight). Only the \rmfamily is done here as \ttfamily uses a +% fixed spacing and \sffamily is not used as the main text of IEEE papers. +\def\@IEEEtunefonts{{\selectfont\rmfamily +\tiny\@IEEEsetfontdimens +\scriptsize\@IEEEsetfontdimens +\footnotesize\@IEEEsetfontdimens +\small\@IEEEsetfontdimens +\normalsize\@IEEEsetfontdimens +\sublargesize\@IEEEsetfontdimens +\large\@IEEEsetfontdimens +\LARGE\@IEEEsetfontdimens +\huge\@IEEEsetfontdimens +\Huge\@IEEEsetfontdimens}} + +% if the nofonttune class option is not given, revise the interword spacing +% now - in case IEEEtran makes any default length measurements, and make +% sure all the default fonts are loaded +\ifCLASSOPTIONnofonttune\else +\@IEEEtunefonts +\fi + +% and again at the start of the document in case the user loaded different fonts +\AtBeginDocument{\ifCLASSOPTIONnofonttune\else\@IEEEtunefonts\fi} + + + + + +% -- V1.8a page setup commands -- + +% The default sample text for calculating margins +% Note that IEEE publications use \scriptsize for headers and footers. +\def\IEEEdefaultsampletext{\normalfont\normalsize gT} +\def\IEEEdefaultheadersampletext{\normalfont\scriptsize T}% IEEE headers default to uppercase +\def\IEEEdefaultfootersampletext{\normalfont\scriptsize gT} + + + +% usage: \IEEEsettextwidth{inner margin}{outer margin} +% Sets \textwidth to allow the specified inner and outer margins +% for the current \paperwidth. +\def\IEEEsettextwidth#1#2{\@IEEEtrantmpdimenA\paperwidth +\@IEEEtrantmpdimenB#1\relax +\advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\@IEEEtrantmpdimenB#2\relax +\advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\textwidth\@IEEEtrantmpdimenA} + + + +% usage: \IEEEsetsidemargin{mode: i, o, c, a}{margin/offset} +% Sets \oddsidemargin and \evensidemargin to yield the specified margin +% of the given mode. +% The available modes are: +% i = inner margin +% o = outer margin +% c = centered, with the given offset +% a = adjust the margins using the given offset +% For the offsets, positive values increase the inner margin. +% \textwidth should be set properly for the given margins before calling this +% function. +\def\IEEEsetsidemargin#1#2{\@IEEEtrantmpdimenA #2\relax +\@IEEEextracttoken{#1}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsetsidemargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `i'}{Valid modes for \string\IEEEsetsidemargin\space are: i, o, c and a.}\relax + \let\@IEEEextractedtoken=i\relax + \def\@IEEEextractedtokenmacro{i}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsetsidemargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + \advance\oddsidemargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken c\relax + \oddsidemargin\paperwidth + \advance\oddsidemargin by -\textwidth + \divide\oddsidemargin by 2\relax + \advance\oddsidemargin by -1in\relax + \advance\oddsidemargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken o\relax + \oddsidemargin\paperwidth + \advance\oddsidemargin by -\textwidth + \advance\oddsidemargin by -\@IEEEtrantmpdimenA + \advance\oddsidemargin by -1in\relax +\else + \if\@IEEEextractedtoken i\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetsidemargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `i'}% + {Valid modes for \string\IEEEsetsidemargin\space are: i, o, c and a.}% + \fi + \oddsidemargin\@IEEEtrantmpdimenA + \advance\oddsidemargin by -1in\relax +\fi\fi\fi +% odd and even side margins both mean "inner" for single sided pages +\evensidemargin\oddsidemargin +% but are mirrors of each other when twosided is in effect +\if@twoside + \evensidemargin\paperwidth + \advance\evensidemargin by -\textwidth + \advance\evensidemargin by -\oddsidemargin + % have to compensate for both the builtin 1in LaTex offset + % and the fact we already subtracted this offset from \oddsidemargin + \advance\evensidemargin -2in\relax +\fi} + + + +% usage: \IEEEsettextheight[sample text]{top text margin}{bottom text margin} +% Sets \textheight based on the specified top margin and bottom margin. +% Takes into consideration \paperheight, \topskip, and (by default) the +% the actual height and depth of the \IEEEdefaultsampletext text. +\def\IEEEsettextheight{\@ifnextchar [{\@IEEEsettextheight}{\@IEEEsettextheight[\IEEEdefaultsampletext]}} +\def\@IEEEsettextheight[#1]#2#3{\textheight\paperheight\relax + \@IEEEtrantmpdimenA #2\relax + \advance \textheight by -\@IEEEtrantmpdimenA% subtract top margin + \@IEEEtrantmpdimenA #3\relax + \advance \textheight by -\@IEEEtrantmpdimenA% subtract bottom margin + \advance \textheight by \topskip% add \topskip + % subtract off everything above the top, and below the bottom, baselines + \settoheight{\@IEEEtrantmpdimenA}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance \textheight by -\@IEEEtrantmpdimenA + \settodepth{\@IEEEtrantmpdimenA}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance \textheight by -\@IEEEtrantmpdimenA} + + + +\newdimen\IEEEquantizedlength +\IEEEquantizedlength 0sp\relax +\newdimen\IEEEquantizedlengthdiff +\IEEEquantizedlengthdiff 0sp\relax +\def\IEEEquantizedlengthint{0} + +% usage: \IEEEquantizelength{mode: d, c, i}{base unit}{length} +% Sets the length \IEEEquantizedlength to be an integer multiple of the given +% (nonzero) base unit such that \IEEEquantizedlength approximates the given +% length. +% \IEEEquantizedlengthdiff is a length equal to the difference between the +% \IEEEquantizedlength and the given length. +% \IEEEquantizedlengthint is a macro containing the integer number of base units +% in \IEEEquantizedlength. +% i.e., \IEEEquantizedlength = \IEEEquantizedlengthint * base unit +% The mode determines how \IEEEquantizedlength is quantized: +% d = always decrease (always round down \IEEEquantizeint) +% c = use the closest match +% i = always increase (always round up \IEEEquantizeint) +% In anycase, if the given length is already quantized, +% \IEEEquantizedlengthdiff will be set to zero. +\def\IEEEquantizelength#1#2#3{\begingroup +% work in isolation so as not to externally disturb the \@IEEEtrantmp +% variables +% load the argument values indirectly via \IEEEquantizedlengthdiff +% in case the user refers to our \@IEEEtrantmpdimenX, \IEEEquantizedlength, +% etc. in the arguments. we also will work with these as counters, +% i.e., in sp units +% A has the base unit +\IEEEquantizedlengthdiff #2\relax\relax\relax\relax +\@IEEEtrantmpcountA\IEEEquantizedlengthdiff +% B has the input length +\IEEEquantizedlengthdiff #3\relax\relax\relax\relax +\@IEEEtrantmpcountB\IEEEquantizedlengthdiff +\@IEEEtrantmpdimenA\the\@IEEEtrantmpcountA sp\relax +\@IEEEtrantmpdimenB\the\@IEEEtrantmpcountB sp\relax +% \@IEEEtrantmpcountC will have the quantized int +% \IEEEquantizedlength will have the quantized length +% \@IEEEtrantmpdimenC will have the quantized diff +% initialize them to zero as this is what will be +% exported if an error occurs +\@IEEEtrantmpcountC 0\relax +\IEEEquantizedlength 0sp\relax +\@IEEEtrantmpdimenC 0sp\relax +% extract mode +\@IEEEextracttoken{#1}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak + Defaulting to `d'}{Valid modes for \string\IEEEquantizelength\space are: d, c and i.}\relax + \let\@IEEEextractedtoken=d\relax + \def\@IEEEextractedtokenmacro{d}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEquantizelength\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% check for base unit is zero error +\ifnum\@IEEEtrantmpcountA=0\relax +\@IEEEclspkgerror{Base unit is zero in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak + \string\IEEEquantizedlength\space and \string\IEEEquantizedlengthdiff\space are set to zero}{Division by zero is not allowed.}\relax +\else% base unit is nonzero + % \@IEEEtrantmpcountC carries the number of integer units + % in the quantized length (integer length \ base) + \@IEEEtrantmpcountC\@IEEEtrantmpcountB\relax + \divide\@IEEEtrantmpcountC by \@IEEEtrantmpcountA\relax + % \IEEEquantizedlength has the (rounded down) quantized length + % = base * int + \IEEEquantizedlength\@IEEEtrantmpdimenA\relax + \multiply\IEEEquantizedlength by \@IEEEtrantmpcountC\relax + % \@IEEEtrantmpdimenC has the difference + % = quantized length - length + \@IEEEtrantmpdimenC\IEEEquantizedlength\relax + \advance\@IEEEtrantmpdimenC by -\@IEEEtrantmpdimenB\relax + % trap special case of length being already quantized + % to avoid a roundup under i option + \ifdim\@IEEEtrantmpdimenC=0sp\relax + \else % length not is already quantized + % set dimenA to carry the upper quantized (absolute value) difference: + % quantizedlength + base - length + \advance\@IEEEtrantmpdimenA by \IEEEquantizedlength\relax + \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB\relax + % set dimenB to carry the lower quantized (absolute value) difference: + % length - quantizedlength + \advance\@IEEEtrantmpdimenB by -\IEEEquantizedlength\relax + % handle each mode + \if\@IEEEextractedtoken c\relax + % compare upper and lower amounts, select upper if lower > upper + \ifdim\@IEEEtrantmpdimenB>\@IEEEtrantmpdimenA\relax + % use upper + \advance\IEEEquantizedlength by \the\@IEEEtrantmpcountA sp\relax + \advance\@IEEEtrantmpcountC by 1\relax + \@IEEEtrantmpdimenC\@IEEEtrantmpdimenA + \else% <=. uselower + % no need to do anything for lower, use output values already setup + \fi + \else% not mode c + \if\@IEEEextractedtoken i\relax + % always round up under i mode + \advance\IEEEquantizedlength by \the\@IEEEtrantmpcountA sp\relax + \advance\@IEEEtrantmpcountC by 1\relax + \@IEEEtrantmpdimenC\@IEEEtrantmpdimenA + \else + \if\@IEEEextractedtoken d\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEquantizelength\space (line \the\inputlineno).\MessageBreak + Defaulting to `d'}% + {Valid modes for \string\IEEEquantizelength\space are: d, c, and i.}\relax + \fi % if d + % no need to do anything for d, use output values already setup + \fi\fi % if i, c + \fi % if length is already quantized +\fi% if base unit is zero +% globally assign the results to macros we use here to escape the enclosing +% group without needing to call \global on any of the \@IEEEtrantmp variables. +% \@IEEEtrantmpcountC has the quantized int +% \IEEEquantizedlength has the quantized length +% \@IEEEtrantmpdimenC has the quantized diff +\xdef\@IEEEquantizedlengthintmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\IEEEquantizedlength\relax +\xdef\@IEEEquantizedlengthmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\@IEEEtrantmpdimenC\relax +\xdef\@IEEEquantizedlengthdiffmacro{\the\@IEEEtrantmpcountC}\relax +\endgroup +% locally assign the outputs here from the macros +\expandafter\IEEEquantizedlength\@IEEEquantizedlengthmacro sp\relax +\expandafter\IEEEquantizedlengthdiff\@IEEEquantizedlengthdiffmacro sp\relax +\edef\IEEEquantizedlengthint{\@IEEEquantizedlengthintmacro}\relax} + + + +\newdimen\IEEEquantizedtextheightdiff +\IEEEquantizedtextheightdiff 0sp\relax + +% usage: \IEEEquantizetextheight[base unit]{mode: d, c, i} +% Sets \textheight to be an integer multiple of the current \baselineskip +% (or the optionally specified base unit) plus the first (\topskip) line. +% \IEEEquantizedtextheightdiff is a length equal to the difference between +% the new quantized and original \textheight. +% \IEEEquantizedtextheightlpc is a macro containing the integer number of +% lines per column under the quantized \textheight. i.e., +% \textheight = \IEEEquantizedtextheightlpc * \baselineskip + \topskip +% The mode determines how \textheight is quantized: +% d = always decrease (always round down the number of lines per column) +% c = use the closest match +% i = always increase (always round up the number of lines per column) +% In anycase, if \textheight is already quantized, it will remain unchanged, +% and \IEEEquantizedtextheightdiff will be set to zero. +% Depends on: \IEEEquantizelength +\def\IEEEquantizetextheight{\@ifnextchar [{\@IEEEquantizetextheight}{\@IEEEquantizetextheight[\baselineskip]}} +\def\@IEEEquantizetextheight[#1]#2{\begingroup +% use our \IEEEquantizedtextheightdiff as a scratch pad +% we need to subtract off \topskip before quantization +\IEEEquantizedtextheightdiff\textheight +\advance\IEEEquantizedtextheightdiff by -\topskip\relax +\IEEEquantizelength{#2}{#1}{\IEEEquantizedtextheightdiff} +% add back \topskip line +\advance\IEEEquantizedlength by \topskip +\@IEEEtrantmpcountC\IEEEquantizedlengthint\relax +\advance\@IEEEtrantmpcountC by 1\relax +% globally assign the results to macros we use here to escape the enclosing +% group without needing to call \global on any of the \@IEEEtrantmp variables. +\xdef\@IEEEquantizedtextheightlpcmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\IEEEquantizedlength\relax +\xdef\@IEEEquantizedtextheightmacro{\the\@IEEEtrantmpcountC}\relax +\@IEEEtrantmpcountC\IEEEquantizedlengthdiff\relax +\xdef\@IEEEquantizedtextheightdiffmacro{\the\@IEEEtrantmpcountC}\relax +\endgroup +% locally assign the outputs here from the macros +\textheight\@IEEEquantizedtextheightmacro sp\relax +\IEEEquantizedtextheightdiff\@IEEEquantizedtextheightdiffmacro sp\relax +\edef\IEEEquantizedtextheightlpc{\@IEEEquantizedtextheightlpcmacro}} + + + +% usage: \IEEEsettopmargin[sample text]{mode: t, b, c, a, q}{margin/offset} +% Sets \topmargin based on the specified vertical margin. +% Takes into consideration the base 1in offset, \headheight, \headsep, +% \topskip, and (by default) the the actual height (or, for the bottom, depth) +% of the \IEEEdefaultsampletext text. +% The available modes are: +% t = top margin +% b = bottom margin +% c = vertically centered, with the given offset +% a = adjust the vertical margins using the given offset +% q = adjust the margins using \IEEEquantizedtextheightdiff and the given offset +% For the offsets, positive values increase the top margin. +% \headheight, \headsep, \topskip and \textheight should be set properly for the +% given margins before calling this function. +\def\IEEEsettopmargin{\@ifnextchar [{\@IEEEsettopmargin}{\@IEEEsettopmargin[\IEEEdefaultsampletext]}} +\def\@IEEEsettopmargin[#1]#2#3{\@IEEEtrantmpdimenA #3\relax +\@IEEEextracttoken{#2}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsettopmargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}{Valid modes for \string\IEEEsettopmargin\space are: t, b, c, a and q.}\relax + \let\@IEEEextractedtoken=t\relax + \def\@IEEEextractedtokenmacro{t}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsettopmargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + \advance\topmargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken q\relax + % we need to adjust by half the \IEEEquantizedtextheightdiff value + \@IEEEtrantmpdimenB\IEEEquantizedtextheightdiff\relax + \divide\@IEEEtrantmpdimenB by 2\relax + % a positive \IEEEquantizedtextheightdiff means we need to reduce \topmargin + % because \textheight has been lenghtened + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \advance\topmargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken c\relax + \topmargin\paperheight + \advance\topmargin by -\textheight + % \textheight includes \topskip, but we should not count topskip whitespace here, backout + \advance \topmargin by \topskip + \settoheight{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \settodepth{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \divide\topmargin by 2\relax + \advance\topmargin by \@IEEEtrantmpdimenA\relax +\else +\if\@IEEEextractedtoken b\relax + \topmargin\paperheight + \advance\topmargin by -\textheight + % \textheight includes \topskip, but we should not count topskip whitespace here, backout + \advance \topmargin by \topskip + \settodepth{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by -\@IEEEtrantmpdimenB\relax + \advance\topmargin by -\@IEEEtrantmpdimenA\relax +\else + \if\@IEEEextractedtoken t\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsettopmargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}% + {Valid modes for \string\IEEEsettopmargin\space are: t, b, c, a and q.}\relax + \fi + \topmargin\@IEEEtrantmpdimenA\relax + \settoheight{\@IEEEtrantmpdimenB}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\topmargin by \@IEEEtrantmpdimenB\relax +\fi\fi % if t, b, c +% convert desired top margin into actual \topmargin +% this is not done for the q or a modes because they are only adjustments +\advance \topmargin by -\topskip +\advance \topmargin by -1in +\advance \topmargin by -\headheight +\advance \topmargin by -\headsep +\fi\fi % if q, a +} + + + +% usage: \IEEEsetheadermargin[header sample][text sample]{mode: t, b, c, a}{margin/offset} +% Differentially adjusts \topmargin and \headsep (such that their sum is unchanged) +% based on the specified header margin. +% Takes into consideration the base 1in offset, \headheight, \topskip, and (by default) +% the actual height (or depth) of the \IEEEdefaultheadersampletext and +% \IEEEdefaultsampletext text. +% The available modes are: +% t = top margin (top of the header text to the top of the page) +% b = bottom margin (bottom of the header text to the top of the main text) +% c = vertically centered between the main text and the top of the page, +% with the given offset +% a = adjust the vertical position using the given offset +% For the offsets, positive values move the header downward. +% \headheight, \headsep, \topskip and \topmargin should be set properly before +% calling this function. +\def\IEEEsetheadermargin{\@ifnextchar [{\@IEEEsetheadermargin}{\@IEEEsetheadermargin[\IEEEdefaultheadersampletext]}} +\def\@IEEEsetheadermargin[#1]{\@ifnextchar [{\@@IEEEsetheadermargin[#1]}{\@@IEEEsetheadermargin[#1][\IEEEdefaultsampletext]}} +\def\@@IEEEsetheadermargin[#1][#2]#3#4{\@IEEEtrantmpdimenA #4\relax +\@IEEEextracttoken{#3}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsetheadermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}{Valid modes for \string\IEEEsetheadermargin\space are: t, b, c, and a.}\relax + \let\@IEEEextractedtoken=t\relax + \def\@IEEEextractedtokenmacro{t}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsetheadermargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + % No need to do anything here and can pass through the adjustment + % value as is. The end adjustment of \topmargin and \headsep will + % do all that is needed +\else +\if\@IEEEextractedtoken c\relax + % get the bottom margin + \@IEEEtrantmpdimenB\headsep\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + \advance\@IEEEtrantmpdimenB by \topskip + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual header bottom margin + % subtract from it the top header margin + \advance\@IEEEtrantmpdimenB -1in\relax % take into consideration the system 1in offset of the top margin + \advance\@IEEEtrantmpdimenB by -\topmargin + \advance\@IEEEtrantmpdimenB by -\headheight + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the difference between the bottom and top margins + % we need to adjust by half this amount to center the header + \divide\@IEEEtrantmpdimenB by 2\relax + % and add to offset + \advance\@IEEEtrantmpdimenA by \@IEEEtrantmpdimenB +\else +\if\@IEEEextractedtoken b\relax + \@IEEEtrantmpdimenB\headsep\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + \advance\@IEEEtrantmpdimenB by \topskip + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual header bottom margin + % get the difference between the actual and the desired + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenA + \@IEEEtrantmpdimenA\@IEEEtrantmpdimenB +\else + \if\@IEEEextractedtoken t\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetheadermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}% + {Valid modes for \string\IEEEsetheadermargin\space are: t, b, c and a.}\relax + \fi + \@IEEEtrantmpdimenB 1in\relax % take into consideration the system 1in offset of the top margin + \advance\@IEEEtrantmpdimenB by \topmargin + \advance\@IEEEtrantmpdimenB by \headheight + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual header top margin + % get the difference between the desired and the actual + \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\fi\fi % if t, b, c +\fi % if a +% advance \topmargin by the needed amount and reduce \headsep by the same +% so as not to disturb the location of the main text +\advance\topmargin by \@IEEEtrantmpdimenA\relax +\advance\headsep by -\@IEEEtrantmpdimenA\relax +} + + + +% usage: \IEEEsetfootermargin[footer sample][text sample]{mode: t, b, c, a}{margin/offset} +% Adjusts \footskip based on the specified footer margin. +% Takes into consideration the base 1in offset, \paperheight, \headheight, +% \headsep, \textheight and (by default) the actual height (or depth) of the +% \IEEEdefaultfootersampletext and \IEEEdefaultsampletext text. +% The available modes are: +% t = top margin (top of the footer text to the bottom of the main text) +% b = bottom margin (bottom of the footer text to the bottom of page) +% c = vertically centered between the main text and the bottom of the page, +% with the given offset +% a = adjust the vertical position using the given offset +% For the offsets, positive values move the footer downward. +% \headheight, \headsep, \topskip, \topmargin, and \textheight should be set +% properly before calling this function. +\def\IEEEsetfootermargin{\@ifnextchar [{\@IEEEsetfootermargin}{\@IEEEsetfootermargin[\IEEEdefaultfootersampletext]}} +\def\@IEEEsetfootermargin[#1]{\@ifnextchar [{\@@IEEEsetfootermargin[#1]}{\@@IEEEsetfootermargin[#1][\IEEEdefaultsampletext]}} +\def\@@IEEEsetfootermargin[#1][#2]#3#4{\@IEEEtrantmpdimenA #4\relax +\@IEEEextracttoken{#3}\relax +% check for mode errors +\ifx\@IEEEextractedtokenmacro\@empty + \@IEEEclspkgerror{Empty mode type in \string\IEEEsetfootermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}{Valid modes for \string\IEEEsetfootermargin\space are: t, b, c, and a.}\relax + \let\@IEEEextractedtoken=t\relax + \def\@IEEEextractedtokenmacro{t}\relax +\else + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: \string\IEEEsetfootermargin\space mode specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi +\fi +% handle each mode +\if\@IEEEextractedtoken a\relax + % No need to do anything here and can pass through the adjustment + % value as is. The end adjustment of \footskip will do all that + % is needed +\else +\if\@IEEEextractedtoken c\relax + % calculate the bottom margin + \@IEEEtrantmpdimenB 1in\relax % system 1in offset + \advance\@IEEEtrantmpdimenB\topmargin\relax + \advance\@IEEEtrantmpdimenB\headheight\relax + \advance\@IEEEtrantmpdimenB\headsep\relax + \advance\@IEEEtrantmpdimenB\textheight\relax + \advance\@IEEEtrantmpdimenB\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenC by \@IEEEtrantmpdimenB + \@IEEEtrantmpdimenB\paperheight + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual footer bottom margin + % now subtract off the footer top margin + \advance\@IEEEtrantmpdimenB -\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by \@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the difference between the bottom + % and top footer margins + % our adjustment must be half this value to center the footer + \divide\@IEEEtrantmpdimenB by 2\relax + % add to the offset + \advance\@IEEEtrantmpdimenA by \@IEEEtrantmpdimenB +\else +\if\@IEEEextractedtoken b\relax + % calculate the bottom margin + \@IEEEtrantmpdimenB 1in\relax % system 1in offset + \advance\@IEEEtrantmpdimenB\topmargin\relax + \advance\@IEEEtrantmpdimenB\headheight\relax + \advance\@IEEEtrantmpdimenB\headsep\relax + \advance\@IEEEtrantmpdimenB\textheight\relax + \advance\@IEEEtrantmpdimenB\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenC by \@IEEEtrantmpdimenB + \@IEEEtrantmpdimenB\paperheight + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual footer bottom margin + % get the difference between the actual and the desired + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenA + \@IEEEtrantmpdimenA\@IEEEtrantmpdimenB +\else + \if\@IEEEextractedtoken t\relax + \else + \@IEEEclspkgerror{Unknown mode type `\@IEEEextractedtokenmacro' in \string\IEEEsetfootermargin\space (line \the\inputlineno).\MessageBreak + Defaulting to `t'}% + {Valid modes for \string\IEEEsetfootermargin\space are: t, b, c and a.}\relax + \fi + \@IEEEtrantmpdimenB\footskip\relax + \settodepth{\@IEEEtrantmpdimenC}{\begingroup #2\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + \settoheight{\@IEEEtrantmpdimenC}{\begingroup #1\relax\relax\relax\endgroup}\relax + \advance\@IEEEtrantmpdimenB by -\@IEEEtrantmpdimenC + % at this point \@IEEEtrantmpdimenB has the actual footer top margin + % get the difference between the desired and the actual + \advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpdimenB +\fi\fi % if t, b, c +\fi % if a +% advance \footskip by the needed amount +\advance\footskip by \@IEEEtrantmpdimenA\relax +} + +% -- End V1.8a page setup commands -- + + + + + +% V1.6 +% LaTeX is a little to quick to use hyphenations +% So, we increase the penalty for their use and raise +% the badness level that triggers an underfull hbox +% warning. The author may still have to tweak things, +% but the appearance will be much better "right out +% of the box" than that under V1.5 and prior. +% TeX default is 50 +\hyphenpenalty=750 +\ifCLASSOPTIONcompsoc +\hyphenpenalty 500 +\fi +% If we didn't adjust the interword spacing, 2200 might be better. +% The TeX default is 1000 +\hbadness=1350 +% The IEEE does not use extra spacing after punctuation +\frenchspacing + +% V1.7 increase this a tad to discourage equation breaks +\binoppenalty=1000 % default 700 +\relpenalty=800 % default 500 + +% v1.8a increase these to discourage widows and orphans +\clubpenalty=1000 % default 150 +\widowpenalty=1000 % default 150 +\displaywidowpenalty=1000 % default 50 + + +% margin note stuff +\marginparsep 10pt +\marginparwidth 20pt +\marginparpush 25pt + + +% if things get too close, go ahead and let them touch +\lineskip 0pt +\normallineskip 0pt +\lineskiplimit 0pt +\normallineskiplimit 0pt + +% The distance from the lower edge of the text body to the +% footline +\footskip 0.4in + +% normally zero, should be relative to font height. +% put in a little rubber to help stop some bad breaks (underfull vboxes) +\parskip 0ex plus 0.2ex minus 0.1ex + +\parindent 1.0em +\ifCLASSOPTIONcompsoc + \parindent 1.5em +\fi + +\headheight 12pt +\headsep 18pt +% use the normal font baselineskip +% so that \topskip is unaffected by changes in \baselinestretch +\topskip=\@IEEEnormalsizeunitybaselineskip + + +% V1.8 \maxdepth defaults to 4pt, but should be font size dependent +\maxdepth=0.5\@IEEEnormalsizeunitybaselineskip +\textheight 58pc % 9.63in, 696pt + +% set the default top margin to 58pt +% which results in a \topmargin of -49.59pt for 10pt documents +\IEEEsettopmargin{t}{58pt} +% tweak textheight to a perfect integer number of lines/column. +% standard is: 9pt/63 lpc; 10pt/58 lpc; 11pt/52 lpc; 12pt/50 lpc +\IEEEquantizetextheight{c} +% tweak top margin so that the error is shared equally at the top and bottom +\IEEEsettopmargin{q}{0sp} + + +\columnsep 1pc +\textwidth 43pc % 2 x 21pc + 1pc = 43pc + +% set the default side margins to center the text +\IEEEsetsidemargin{c}{0pt} + + +% adjust margins for default conference mode +\ifCLASSOPTIONconference + \textheight 9.25in % The standard for conferences (668.4975pt) + \IEEEsettopmargin{t}{0.75in} + % tweak textheight to a perfect integer number of lines/page. + % standard is: 9pt/61 lpc; 10pt/56 lpc; 11pt/50 lpc; 12pt/48 lpc + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} +\fi + + +% compsoc text sizes, margins and spacings +\ifCLASSOPTIONcompsoc + \columnsep 12bp + % CS specs for \textwdith are 6.875in + % \textwidth 6.875in + % however, measurements from proofs show they are using 3.5in columns + \textwidth 7in + \advance\textwidth by \columnsep + % set the side margins to center the text + \IEEEsetsidemargin{c}{0pt} + % top/bottom margins to center + % could just set \textheight to 9.75in for all the different paper sizes + % and then quantize, but we'll do it the long way here to allow for easy + % future per-paper size adjustments + \IEEEsettextheight{0.625in}{0.625in}% 11in - 2 * 0.625in = 9.75in is the standard text height for compsoc journals + \IEEEsettopmargin{t}{0.625in} + \if@IEEEusingcspaper + \IEEEsettextheight{0.5in}{0.5in}% 10.75in - 2 * 0.5in = 9.75in + \IEEEsettopmargin{t}{0.5in} + \fi + \if@IEEEusingAfourpaper + \IEEEsettextheight{24.675mm}{24.675mm}% 297mm - 2 * 24.675mm = 247.650mm (9.75in) + \IEEEsettopmargin{t}{24.675mm} + \fi + % tweak textheight to a perfect integer number of lines/page. + % standard is: 9pt/65 lpc; 10pt/61 lpc; 11pt/53 lpc; 12pt/49 lpc + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} + +% compsoc conference + \ifCLASSOPTIONconference + % compsoc conference use a larger value for columnsep + \columnsep 0.25in + \IEEEsettextwidth{0.75in}{0.75in} + % set the side margins to center the text (0.75in for letterpaper) + \IEEEsetsidemargin{c}{0pt} + % compsoc conferences want 1in top and bottom margin + \IEEEsettextheight{1in}{1in} + \IEEEsettopmargin{t}{1in} + % tweak textheight to a perfect integer number of lines/page. + % standard is: 9pt/58 lpc; 10pt/53 lpc; 11pt/48 lpc; 12pt/46 lpc + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} + \fi +\fi + + + +% draft mode settings override that of all other modes +% provides a nice 1in margin all around the paper and extra +% space between the lines for editor's comments +\ifCLASSOPTIONdraftcls + % we want 1in side margins regardless of paper type + \IEEEsettextwidth{1in}{1in} + \IEEEsetsidemargin{c}{0pt} + % want 1in top and bottom margins + \IEEEsettextheight{1in}{1in} + \IEEEsettopmargin{t}{1in} + % digitize textheight to be an integer number of lines. + % this may cause the top and bottom margins to be off a tad + \IEEEquantizetextheight{c} + % tweak top margin so that the error is shared equally at the top and bottom + \IEEEsettopmargin{q}{0sp} +\fi + + + +% process CLASSINPUT inner/outer margin +% if inner margin defined, but outer margin not, set outer to inner. +\ifx\CLASSINPUTinnersidemargin\@IEEEundefined +\else + \ifx\CLASSINPUToutersidemargin\@IEEEundefined + \edef\CLASSINPUToutersidemargin{\CLASSINPUTinnersidemargin} + \fi +\fi + +\ifx\CLASSINPUToutersidemargin\@IEEEundefined +\else + % if outer margin defined, but inner margin not, set inner to outer. + \ifx\CLASSINPUTinnersidemargin\@IEEEundefined + \edef\CLASSINPUTinnersidemargin{\CLASSINPUToutersidemargin} + \fi + \IEEEsettextwidth{\CLASSINPUTinnersidemargin}{\CLASSINPUToutersidemargin} + \IEEEsetsidemargin{i}{\CLASSINPUTinnersidemargin} + \typeout{** ATTENTION: Overriding inner side margin to \CLASSINPUTinnersidemargin\space and + outer side margin to \CLASSINPUToutersidemargin\space via \string\CLASSINPUT.} +\fi + + + +% process CLASSINPUT top/bottom text margin +% if toptext margin defined, but bottomtext margin not, set bottomtext to toptext margin +\ifx\CLASSINPUTtoptextmargin\@IEEEundefined +\else + \ifx\CLASSINPUTbottomtextmargin\@IEEEundefined + \edef\CLASSINPUTbottomtextmargin{\CLASSINPUTtoptextmargin} + \fi +\fi + +\ifx\CLASSINPUTbottomtextmargin\@IEEEundefined +\else + % if bottomtext margin defined, but toptext margin not, set toptext to bottomtext margin + \ifx\CLASSINPUTtoptextmargin\@IEEEundefined + \edef\CLASSINPUTtoptextmargin{\CLASSINPUTbottomtextmargin} + \fi + \IEEEsettextheight{\CLASSINPUTtoptextmargin}{\CLASSINPUTbottomtextmargin} + \IEEEsettopmargin{t}{\CLASSINPUTtoptextmargin} + \typeout{** ATTENTION: Overriding top text margin to \CLASSINPUTtoptextmargin\space and + bottom text margin to \CLASSINPUTbottomtextmargin\space via \string\CLASSINPUT.} +\fi + + + +% default to center header and footer text in the margins +\IEEEsetheadermargin{c}{0pt} +\IEEEsetfootermargin{c}{0pt} + +% adjust header and footer positions for compsoc journals +\ifCLASSOPTIONcompsoc + \ifCLASSOPTIONjournal + \IEEEsetheadermargin{b}{\@IEEEnormalsizeunitybaselineskip} + \IEEEsetfootermargin{t}{\@IEEEnormalsizeunitybaselineskip} + \fi +\fi + + +% V1.8a display lines per column info message on user's console +\def\IEEEdisplayinfolinespercolumn{\@IEEEtrantmpdimenA=\textheight +% topskip represents only one line even if > baselineskip +\advance\@IEEEtrantmpdimenA by -1\topskip +\@IEEEtrantmpcountA=\@IEEEtrantmpdimenA +\@IEEEtrantmpcountB=\@IEEEtrantmpdimenA +\divide\@IEEEtrantmpcountB by \baselineskip +% need to add one line to include topskip (first) line +\advance\@IEEEtrantmpcountB by 1 +% save lines per column value as text +\edef\@IEEEnumlinespercolumninfotxt{\the\@IEEEtrantmpcountB} +% backout topskip advance to allow direct \@IEEEtrantmpcountA comparison +\advance\@IEEEtrantmpcountB by -1 +% restore value as text height (without topskip) rather than just as number of lines +\multiply\@IEEEtrantmpcountB by \baselineskip +% is the column height an integer number of lines per column? +\ifnum\@IEEEtrantmpcountA=\@IEEEtrantmpcountB +\edef\@IEEEnumlinespercolumnexactinfotxt{exact} +\else +\@IEEEtrantmpdimenA\@IEEEtrantmpcountA sp\relax +\advance\@IEEEtrantmpdimenA by -\@IEEEtrantmpcountB sp\relax +\edef\@IEEEnumlinespercolumnexactinfotxt{approximate, difference = \the\@IEEEtrantmpdimenA} +\fi +\typeout{-- Lines per column: \@IEEEnumlinespercolumninfotxt\space (\@IEEEnumlinespercolumnexactinfotxt).}} +% delay execution till start of document to allow for user changes +\AtBeginDocument{\IEEEdisplayinfolinespercolumn} + + + +% LIST SPACING CONTROLS + +% Controls the amount of EXTRA spacing +% above and below \trivlist +% Both \list and IED lists override this. +% However, \trivlist will use this as will most +% things built from \trivlist like the \center +% environment. +\topsep 0.5\baselineskip + +% Controls the additional spacing around lists preceded +% or followed by blank lines. the IEEE does not increase +% spacing before or after paragraphs so it is set to zero. +% \z@ is the same as zero, but faster. +\partopsep \z@ + +% Controls the spacing between paragraphs in lists. +% The IEEE does not increase spacing before or after paragraphs +% so this is also zero. +% With IEEEtran.cls, global changes to +% this value DO affect lists (but not IED lists). +\parsep \z@ + +% Controls the extra spacing between list items. +% The IEEE does not put extra spacing between items. +% With IEEEtran.cls, global changes to this value DO affect +% lists (but not IED lists). +\itemsep \z@ + +% \itemindent is the amount to indent the FIRST line of a list +% item. It is auto set to zero within the \list environment. To alter +% it, you have to do so when you call the \list. +% However, the IEEE uses this for the theorem environment +% There is an alternative value for this near \leftmargini below +\itemindent -1em + +% \leftmargin, the spacing from the left margin of the main text to +% the left of the main body of a list item is set by \list. +% Hence this statement does nothing for lists. +% But, quote and verse do use it for indention. +\leftmargin 2em + +% we retain this stuff from the older IEEEtran.cls so that \list +% will work the same way as before. However, itemize, enumerate and +% description (IED) could care less about what these are as they +% all are overridden. +\leftmargini 2em +%\itemindent 2em % Alternative values: sometimes used. +%\leftmargini 0em +\leftmarginii 1em +\leftmarginiii 1.5em +\leftmarginiv 1.5em +\leftmarginv 1.0em +\leftmarginvi 1.0em +\labelsep 0.5em +\labelwidth \z@ + + +% The old IEEEtran.cls behavior of \list is retained. +% However, the new V1.3 IED list environments override all the +% @list stuff (\@listX is called within \list for the +% appropriate level just before the user's list_decl is called). +% \topsep is now 2pt as the IEEE puts a little extra space around +% lists - used by those non-IED macros that depend on \list. +% Note that \parsep and \itemsep are not redefined as in +% the sizexx.clo \@listX (which article.cls uses) so global changes +% of these values DO affect \list +% +\def\@listi{\leftmargin\leftmargini \topsep 2pt plus 1pt minus 1pt} +\let\@listI\@listi +\def\@listii{\leftmargin\leftmarginii\labelwidth\leftmarginii% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listiii{\leftmargin\leftmarginiii\labelwidth\leftmarginiii% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listiv{\leftmargin\leftmarginiv\labelwidth\leftmarginiv% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listv{\leftmargin\leftmarginv\labelwidth\leftmarginv% + \advance\labelwidth-\labelsep \topsep 2pt} +\def\@listvi{\leftmargin\leftmarginvi\labelwidth\leftmarginvi% + \advance\labelwidth-\labelsep \topsep 2pt} + + +% The IEEE uses 5) not 5. +\def\labelenumi{\theenumi)} \def\theenumi{\arabic{enumi}} + +% The IEEE uses a) not (a) +\def\labelenumii{\theenumii)} \def\theenumii{\alph{enumii}} + +% The IEEE uses iii) not iii. +\def\labelenumiii{\theenumiii)} \def\theenumiii{\roman{enumiii}} + +% The IEEE uses A) not A. +\def\labelenumiv{\theenumiv)} \def\theenumiv{\Alph{enumiv}} + +% exactly the same as in article.cls +\def\p@enumii{\theenumi} +\def\p@enumiii{\theenumi(\theenumii)} +\def\p@enumiv{\p@enumiii\theenumiii} + +% itemized list label styles +\def\labelitemi{$\scriptstyle\bullet$} +\def\labelitemii{\textbf{--}} +\def\labelitemiii{$\ast$} +\def\labelitemiv{$\cdot$} + + + +% **** V1.3 ENHANCEMENTS **** +% Itemize, Enumerate and Description (IED) List Controls +% *************************** +% +% +% The IEEE seems to use at least two different values by +% which ITEMIZED list labels are indented to the right +% For The Journal of Lightwave Technology (JLT) and The Journal +% on Selected Areas in Communications (JSAC), they tend to use +% an indention equal to \parindent. For Transactions on Communications +% they tend to indent ITEMIZED lists a little more--- 1.3\parindent. +% We'll provide both values here for you so that you can choose +% which one you like in your document using a command such as: +% setlength{\IEEEilabelindent}{\IEEEilabelindentB} +\newdimen\IEEEilabelindentA +\IEEEilabelindentA \parindent + +\newdimen\IEEEilabelindentB +\IEEEilabelindentB 1.3\parindent +% However, we'll default to using \parindent +% which makes more sense to me +\newdimen\IEEEilabelindent +\IEEEilabelindent \IEEEilabelindentA + + +% This controls the default amount the enumerated list labels +% are indented to the right. +% Normally, this is the same as the paragraph indention +\newdimen\IEEEelabelindent +\IEEEelabelindent \parindent + +% This controls the default amount the description list labels +% are indented to the right. +% Normally, this is the same as the paragraph indention +\newdimen\IEEEdlabelindent +\IEEEdlabelindent \parindent + +% This is the value actually used within the IED lists. +% The IED environments automatically set its value to +% one of the three values above, so global changes do +% not have any effect +\newdimen\IEEElabelindent +\IEEElabelindent \parindent + +% The actual amount labels will be indented is +% \IEEElabelindent multiplied by the factor below +% corresponding to the level of nesting depth +% This provides a means by which the user can +% alter the effective \IEEElabelindent for deeper +% levels +% There may not be such a thing as correct "standard IEEE" +% values. What the IEEE actually does may depend on the specific +% circumstances. +% The first list level almost always has full indention. +% The second levels I've seen have only 75% of the normal indentation +% Three level or greater nestings are very rare. I am guessing +% that they don't use any indentation. +\def\IEEElabelindentfactori{1.0} % almost always one +\def\IEEElabelindentfactorii{0.75} % 0.0 or 1.0 may be used in some cases +\def\IEEElabelindentfactoriii{0.0} % 0.75? 0.5? 0.0? +\def\IEEElabelindentfactoriv{0.0} +\def\IEEElabelindentfactorv{0.0} +\def\IEEElabelindentfactorvi{0.0} + +% value actually used within IED lists, it is auto +% set to one of the 6 values above +% global changes here have no effect +\def\IEEElabelindentfactor{1.0} + +% This controls the default spacing between the end of the IED +% list labels and the list text, when normal text is used for +% the labels. +% compsoc uses a larger value here, but we'll set that later +% in the class so that this code block area can be extracted +% as-is for IEEEtrantools.sty +\newdimen\IEEEiednormlabelsep +\IEEEiednormlabelsep 0.6em + +% This controls the default spacing between the end of the IED +% list labels and the list text, when math symbols are used for +% the labels (nomenclature lists). The IEEE usually increases the +% spacing in these cases +\newdimen\IEEEiedmathlabelsep +\IEEEiedmathlabelsep 1.2em + +% This controls the extra vertical separation put above and +% below each IED list. the IEEE usually puts a little extra spacing +% around each list. However, this spacing is barely noticeable. +% compsoc uses a larger value here, but we'll set that later +% in the class so that this code block area can be extracted +% as-is for IEEEtrantools.sty +\newskip\IEEEiedtopsep +\IEEEiedtopsep 2pt plus 1pt minus 1pt + + +% This command is executed within each IED list environment +% at the beginning of the list. You can use this to set the +% parameters for some/all your IED list(s) without disturbing +% global parameters that affect things other than lists. +% i.e., renewcommand{\IEEEiedlistdecl}{\setlength{\labelsep}{5em}} +% will alter the \labelsep for the next list(s) until +% \IEEEiedlistdecl is redefined. +\def\IEEEiedlistdecl{\relax} + +% This command provides an easy way to set \leftmargin based +% on the \labelwidth, \labelsep and the argument \IEEElabelindent +% Usage: \IEEEcalcleftmargin{width-to-indent-the-label} +% output is in the \leftmargin variable, i.e., effectively: +% \leftmargin = argument + \labelwidth + \labelsep +% Note controlled spacing here, shield end of lines with % +\def\IEEEcalcleftmargin#1{\setlength{\leftmargin}{#1}% +\addtolength{\leftmargin}{\labelwidth}% +\addtolength{\leftmargin}{\labelsep}} + +% This command provides an easy way to set \labelwidth to the +% width of the given text. It is the same as +% \settowidth{\labelwidth}{label-text} +% and useful as a shorter alternative. +% Typically used to set \labelwidth to be the width +% of the longest label in the list +\def\IEEEsetlabelwidth#1{\settowidth{\labelwidth}{#1}} + +% When this command is executed, IED lists will use the +% IEEEiedmathlabelsep label separation rather than the normal +% spacing. To have an effect, this command must be executed via +% the \IEEEiedlistdecl or within the option of the IED list +% environments. +\def\IEEEusemathlabelsep{\setlength{\labelsep}{\IEEEiedmathlabelsep}} + +% A flag which controls whether the IED lists automatically +% calculate \leftmargin from \IEEElabelindent, \labelwidth and \labelsep +% Useful if you want to specify your own \leftmargin +% This flag must be set (\IEEEnocalcleftmargintrue or \IEEEnocalcleftmarginfalse) +% via the \IEEEiedlistdecl or within the option of the IED list +% environments to have an effect. +\newif\ifIEEEnocalcleftmargin +\IEEEnocalcleftmarginfalse + +% A flag which controls whether \IEEElabelindent is multiplied by +% the \IEEElabelindentfactor for each list level. +% This flag must be set via the \IEEEiedlistdecl or within the option +% of the IED list environments to have an effect. +\newif\ifIEEEnolabelindentfactor +\IEEEnolabelindentfactorfalse + + +% internal variable to indicate type of IED label +% justification +% 0 - left; 1 - center; 2 - right +\def\@IEEEiedjustify{0} + + +% commands to allow the user to control IED +% label justifications. Use these commands within +% the IED environment option or in the \IEEEiedlistdecl +% Note that changing the normal list justifications +% is nonstandard and the IEEE may not like it if you do so! +% I include these commands as they may be helpful to +% those who are using these enhanced list controls for +% other non-IEEE related LaTeX work. +% itemize and enumerate automatically default to right +% justification, description defaults to left. +\def\IEEEiedlabeljustifyl{\def\@IEEEiedjustify{0}}%left +\def\IEEEiedlabeljustifyc{\def\@IEEEiedjustify{1}}%center +\def\IEEEiedlabeljustifyr{\def\@IEEEiedjustify{2}}%right + + + + +% commands to save to and restore from the list parameter copies +% this allows us to set all the list parameters within +% the list_decl and prevent \list (and its \@list) +% from overriding any of our parameters +% V1.6 use \edefs instead of dimen's to conserve dimen registers +% Note controlled spacing here, shield end of lines with % +\def\@IEEEsavelistparams{\edef\@IEEEiedtopsep{\the\topsep}% +\edef\@IEEEiedlabelwidth{\the\labelwidth}% +\edef\@IEEEiedlabelsep{\the\labelsep}% +\edef\@IEEEiedleftmargin{\the\leftmargin}% +\edef\@IEEEiedpartopsep{\the\partopsep}% +\edef\@IEEEiedparsep{\the\parsep}% +\edef\@IEEEieditemsep{\the\itemsep}% +\edef\@IEEEiedrightmargin{\the\rightmargin}% +\edef\@IEEEiedlistparindent{\the\listparindent}% +\edef\@IEEEieditemindent{\the\itemindent}} + +% Note controlled spacing here +\def\@IEEErestorelistparams{\topsep\@IEEEiedtopsep\relax% +\labelwidth\@IEEEiedlabelwidth\relax% +\labelsep\@IEEEiedlabelsep\relax% +\leftmargin\@IEEEiedleftmargin\relax% +\partopsep\@IEEEiedpartopsep\relax% +\parsep\@IEEEiedparsep\relax% +\itemsep\@IEEEieditemsep\relax% +\rightmargin\@IEEEiedrightmargin\relax% +\listparindent\@IEEEiedlistparindent\relax% +\itemindent\@IEEEieditemindent\relax} + + +% v1.6b provide original LaTeX IED list environments +% note that latex.ltx defines \itemize and \enumerate, but not \description +% which must be created by the base classes +% save original LaTeX itemize and enumerate +\let\LaTeXitemize\itemize +\let\endLaTeXitemize\enditemize +\let\LaTeXenumerate\enumerate +\let\endLaTeXenumerate\endenumerate + +% provide original LaTeX description environment from article.cls +\newenvironment{LaTeXdescription} + {\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +\newcommand*\descriptionlabel[1]{\hspace\labelsep + \normalfont\bfseries #1} + + +% override LaTeX's default IED lists +\def\itemize{\@IEEEitemize} +\def\enditemize{\@endIEEEitemize} +\def\enumerate{\@IEEEenumerate} +\def\endenumerate{\@endIEEEenumerate} +\def\description{\@IEEEdescription} +\def\enddescription{\@endIEEEdescription} + +% provide the user with aliases - may help those using packages that +% override itemize, enumerate, or description +\def\IEEEitemize{\@IEEEitemize} +\def\endIEEEitemize{\@endIEEEitemize} +\def\IEEEenumerate{\@IEEEenumerate} +\def\endIEEEenumerate{\@endIEEEenumerate} +\def\IEEEdescription{\@IEEEdescription} +\def\endIEEEdescription{\@endIEEEdescription} + + +% V1.6 we want to keep the IEEEtran IED list definitions as our own internal +% commands so they are protected against redefinition +\def\@IEEEitemize{\@ifnextchar[{\@@IEEEitemize}{\@@IEEEitemize[\relax]}} +\def\@IEEEenumerate{\@ifnextchar[{\@@IEEEenumerate}{\@@IEEEenumerate[\relax]}} +\def\@IEEEdescription{\@ifnextchar[{\@@IEEEdescription}{\@@IEEEdescription[\relax]}} +\def\@endIEEEitemize{\endlist} +\def\@endIEEEenumerate{\endlist} +\def\@endIEEEdescription{\endlist} + + +% DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS +% AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS +% IEEEtran itemized list MDS 1/2001 +% Note controlled spacing here, shield end of lines with % +\def\@@IEEEitemize[#1]{% + \ifnum\@itemdepth>3\relax\@toodeep\else% + \ifnum\@listdepth>5\relax\@toodeep\else% + \advance\@itemdepth\@ne% + \edef\@itemitem{labelitem\romannumeral\the\@itemdepth}% + % get the IEEElabelindentfactor for this level + \advance\@listdepth\@ne% we need to know what the level WILL be + \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}% + \advance\@listdepth-\@ne% undo our increment + \def\@IEEEiedjustify{2}% right justified labels are default + % set other defaults + \IEEEnocalcleftmarginfalse% + \IEEEnolabelindentfactorfalse% + \topsep\IEEEiedtopsep% + \IEEElabelindent\IEEEilabelindent% + \labelsep\IEEEiednormlabelsep% + \partopsep 0ex% + \parsep 0ex% + \itemsep 0ex% + \rightmargin 0em% + \listparindent 0em% + \itemindent 0em% + % calculate the label width + % the user can override this later if + % they specified a \labelwidth + \settowidth{\labelwidth}{\csname labelitem\romannumeral\the\@itemdepth\endcsname}% + \@IEEEsavelistparams% save our list parameters + \list{\csname\@itemitem\endcsname}{% + \@IEEErestorelistparams% override any list{} changes + % to our globals + \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel + \IEEEiedlistdecl% let user alter parameters + #1\relax% + % If the user has requested not to use the + % IEEElabelindent factor, don't revise \IEEElabelindent + \ifIEEEnolabelindentfactor\relax% + \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent% + \fi% + % Unless the user has requested otherwise, + % calculate our left margin based + % on \IEEElabelindent, \labelwidth and + % \labelsep + \ifIEEEnocalcleftmargin\relax% + \else\IEEEcalcleftmargin{\IEEElabelindent}% + \fi}\fi\fi}% + + +% DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS +% AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS +% IEEEtran enumerate list MDS 1/2001 +% Note controlled spacing here, shield end of lines with % +\def\@@IEEEenumerate[#1]{% + \ifnum\@enumdepth>3\relax\@toodeep\else% + \ifnum\@listdepth>5\relax\@toodeep\else% + \advance\@enumdepth\@ne% + \edef\@enumctr{enum\romannumeral\the\@enumdepth}% + % get the IEEElabelindentfactor for this level + \advance\@listdepth\@ne% we need to know what the level WILL be + \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}% + \advance\@listdepth-\@ne% undo our increment + \def\@IEEEiedjustify{2}% right justified labels are default + % set other defaults + \IEEEnocalcleftmarginfalse% + \IEEEnolabelindentfactorfalse% + \topsep\IEEEiedtopsep% + \IEEElabelindent\IEEEelabelindent% + \labelsep\IEEEiednormlabelsep% + \partopsep 0ex% + \parsep 0ex% + \itemsep 0ex% + \rightmargin 0em% + \listparindent 0em% + \itemindent 0em% + % calculate the label width + % We'll set it to the width suitable for all labels using + % normalfont 1) to 9) + % The user can override this later + \settowidth{\labelwidth}{9)}% + \@IEEEsavelistparams% save our list parameters + \list{\csname label\@enumctr\endcsname}{\usecounter{\@enumctr}% + \@IEEErestorelistparams% override any list{} changes + % to our globals + \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel + \IEEEiedlistdecl% let user alter parameters + #1\relax% + % If the user has requested not to use the + % IEEElabelindent factor, don't revise \IEEElabelindent + \ifIEEEnolabelindentfactor\relax% + \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent% + \fi% + % Unless the user has requested otherwise, + % calculate our left margin based + % on \IEEElabelindent, \labelwidth and + % \labelsep + \ifIEEEnocalcleftmargin\relax% + \else\IEEEcalcleftmargin{\IEEElabelindent}% + \fi}\fi\fi}% + + +% DO NOT ALLOW BLANK LINES TO BE IN THESE IED ENVIRONMENTS +% AS THIS WILL FORCE NEW PARAGRAPHS AFTER THE IED LISTS +% IEEEtran description list MDS 1/2001 +% Note controlled spacing here, shield end of lines with % +\def\@@IEEEdescription[#1]{% + \ifnum\@listdepth>5\relax\@toodeep\else% + % get the IEEElabelindentfactor for this level + \advance\@listdepth\@ne% we need to know what the level WILL be + \edef\IEEElabelindentfactor{\csname IEEElabelindentfactor\romannumeral\the\@listdepth\endcsname}% + \advance\@listdepth-\@ne% undo our increment + \def\@IEEEiedjustify{0}% left justified labels are default + % set other defaults + \IEEEnocalcleftmarginfalse% + \IEEEnolabelindentfactorfalse% + \topsep\IEEEiedtopsep% + \IEEElabelindent\IEEEdlabelindent% + % assume normal labelsep + \labelsep\IEEEiednormlabelsep% + \partopsep 0ex% + \parsep 0ex% + \itemsep 0ex% + \rightmargin 0em% + \listparindent 0em% + \itemindent 0em% + % Bogus label width in case the user forgets + % to set it. + % TIP: If you want to see what a variable's width is you + % can use the TeX command \showthe\width-variable to + % display it on the screen during compilation + % (This might be helpful to know when you need to find out + % which label is the widest) + \settowidth{\labelwidth}{Hello}% + \@IEEEsavelistparams% save our list parameters + \list{}{\@IEEErestorelistparams% override any list{} changes + % to our globals + \let\makelabel\@IEEEiedmakelabel% v1.6b setup \makelabel + \IEEEiedlistdecl% let user alter parameters + #1\relax% + % If the user has requested not to use the + % labelindent factor, don't revise \IEEElabelindent + \ifIEEEnolabelindentfactor\relax% + \else\IEEElabelindent=\IEEElabelindentfactor\IEEElabelindent% + \fi% + % Unless the user has requested otherwise, + % calculate our left margin based + % on \IEEElabelindent, \labelwidth and + % \labelsep + \ifIEEEnocalcleftmargin\relax% + \else\IEEEcalcleftmargin{\IEEElabelindent}\relax% + \fi}\fi} + +% v1.6b we use one makelabel that does justification as needed. +\def\@IEEEiedmakelabel#1{\relax\if\@IEEEiedjustify 0\relax +\makebox[\labelwidth][l]{\normalfont #1}\else +\if\@IEEEiedjustify 1\relax +\makebox[\labelwidth][c]{\normalfont #1}\else +\makebox[\labelwidth][r]{\normalfont #1}\fi\fi} + + +% compsoc uses a larger value for the normal labelsep +% and also extra spacing above and below each list +\ifCLASSOPTIONcompsoc + \IEEEiednormlabelsep 1.2em + \IEEEiedtopsep 6pt plus 3pt minus 3pt +\fi + + +% VERSE and QUOTE +% V1.7 define environments with newenvironment +\newenvironment{verse}{\let\\=\@centercr + \list{}{\itemsep\z@ \itemindent -1.5em \listparindent \itemindent + \rightmargin\leftmargin\advance\leftmargin 1.5em}\item\relax} + {\endlist} +\newenvironment{quotation}{\list{}{\listparindent 1.5em \itemindent\listparindent + \rightmargin\leftmargin \parsep 0pt plus 1pt}\item\relax} + {\endlist} +\newenvironment{quote}{\list{}{\rightmargin\leftmargin}\item\relax} + {\endlist} + + +% \titlepage +% provided only for backward compatibility. \maketitle is the correct +% way to create the title page. +\def\titlepage{\@restonecolfalse\if@twocolumn\@restonecoltrue\onecolumn + \else \newpage \fi \thispagestyle{empty}\c@page\z@} +\def\endtitlepage{\if@restonecol\twocolumn \else \newpage \fi} + +% standard values from article.cls +\arraycolsep 5pt +\arrayrulewidth .4pt +\doublerulesep 2pt + +\tabcolsep 6pt +\tabbingsep 0.5em + + +%% FOOTNOTES +% +%\skip\footins 10pt plus 4pt minus 2pt +% V1.6 respond to changes in font size +% space added above the footnotes (if present) +\skip\footins 0.9\baselineskip plus 0.4\baselineskip minus 0.2\baselineskip + +% V1.6, we need to make \footnotesep responsive to changes +% in \baselineskip or strange spacings will result when in +% draft mode. Here is a little LaTeX secret - \footnotesep +% determines the height of an invisible strut that is placed +% *above* the baseline of footnotes after the first. Since +% LaTeX considers the space for characters to be 0.7\baselineskip +% above the baseline and 0.3\baselineskip below it, we need to +% use 0.7\baselineskip as a \footnotesep to maintain equal spacing +% between all the lines of the footnotes. The IEEE often uses a tad +% more, so use 0.8\baselineskip. This slightly larger value also helps +% the text to clear the footnote marks. Note that \thanks in IEEEtran +% uses its own value of \footnotesep which is set in \maketitle. +{\footnotesize +\global\footnotesep 0.8\baselineskip} + + +\skip\@mpfootins = \skip\footins +\fboxsep = 3pt +\fboxrule = .4pt +% V1.6 use 1em, then use LaTeX2e's \@makefnmark +% Note that the IEEE normally *left* aligns the footnote marks, so we don't need +% box resizing tricks here. +\long\def\@makefntext#1{\parindent 1em\indent\hbox{\@makefnmark}#1}% V1.6 use 1em +% V1.7 compsoc does not use superscipts for footnote marks +\ifCLASSOPTIONcompsoc +\def\@IEEEcompsocmakefnmark{\hbox{\normalfont\@thefnmark.\ }} +\long\def\@makefntext#1{\parindent 1em\indent\hbox{\@IEEEcompsocmakefnmark}#1} +\fi + +% The IEEE does not use footnote rules +\def\footnoterule{} + +% V1.7 for compsoc, the IEEE uses a footnote rule only for \thanks. We devise a "one-shot" +% system to implement this. +\newif\if@IEEEenableoneshotfootnoterule +\@IEEEenableoneshotfootnoterulefalse +\ifCLASSOPTIONcompsoc +\def\footnoterule{\relax\if@IEEEenableoneshotfootnoterule +\kern-5pt +\hbox to \columnwidth{\hfill\vrule width 0.5\columnwidth height 0.4pt\hfill} +\kern4.6pt +\global\@IEEEenableoneshotfootnoterulefalse +\else +\relax +\fi} +\fi + +% V1.6 do not allow LaTeX to break a footnote across multiple pages +\interfootnotelinepenalty=10000 + +% V1.6 discourage breaks within equations +% Note that amsmath normally sets this to 10000, +% but LaTeX2e normally uses 100. +\interdisplaylinepenalty=2500 + +% default allows section depth up to /paragraph +\setcounter{secnumdepth}{4} + +% technotes do not allow /paragraph +\ifCLASSOPTIONtechnote + \setcounter{secnumdepth}{3} +\fi +% neither do compsoc conferences +\@IEEEcompsocconfonly{\setcounter{secnumdepth}{3}} + + +\newcounter{section} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] + +% used only by IEEEtran's IEEEeqnarray as other packages may +% have their own, different, implementations +\newcounter{IEEEsubequation}[equation] + +% as shown when called by user from \ref, \label and in table of contents +\def\theequation{\arabic{equation}} % 1 +\def\theIEEEsubequation{\theequation\alph{IEEEsubequation}} % 1a (used only by IEEEtran's IEEEeqnarray) +\ifCLASSOPTIONcompsoc +% compsoc is all arabic +\def\thesection{\arabic{section}} +\def\thesubsection{\thesection.\arabic{subsection}} +\def\thesubsubsection{\thesubsection.\arabic{subsubsection}} +\def\theparagraph{\thesubsubsection.\arabic{paragraph}} +\else +\def\thesection{\Roman{section}} % I +% V1.7, \mbox prevents breaks around - +\def\thesubsection{\mbox{\thesection-\Alph{subsection}}} % I-A +% V1.7 use I-A1 format used by the IEEE rather than I-A.1 +\def\thesubsubsection{\thesubsection\arabic{subsubsection}} % I-A1 +\def\theparagraph{\thesubsubsection\alph{paragraph}} % I-A1a +\fi + +% From Heiko Oberdiek. Because of the \mbox in \thesubsection, we need to +% tell hyperref to disable the \mbox command when making PDF bookmarks. +% This done already with hyperref.sty version 6.74o and later, but +% it will not hurt to do it here again for users of older versions. +\@ifundefined{pdfstringdefPreHook}{\let\pdfstringdefPreHook\@empty}{}% +\g@addto@macro\pdfstringdefPreHook{\let\mbox\relax} + + +% Main text forms (how shown in main text headings) +% V1.6, using \thesection in \thesectiondis allows changes +% in the former to automatically appear in the latter +\ifCLASSOPTIONcompsoc + \ifCLASSOPTIONconference% compsoc conference + \def\thesectiondis{\thesection.} + \def\thesubsectiondis{\thesectiondis\arabic{subsection}.} + \def\thesubsubsectiondis{\thesubsectiondis\arabic{subsubsection}.} + \def\theparagraphdis{\thesubsubsectiondis\arabic{paragraph}.} + \else% compsoc not conferencs + \def\thesectiondis{\thesection} + \def\thesubsectiondis{\thesectiondis.\arabic{subsection}} + \def\thesubsubsectiondis{\thesubsectiondis.\arabic{subsubsection}} + \def\theparagraphdis{\thesubsubsectiondis.\arabic{paragraph}} + \fi +\else% not compsoc + \def\thesectiondis{\thesection.} % I. + \def\thesubsectiondis{\Alph{subsection}.} % B. + \def\thesubsubsectiondis{\arabic{subsubsection})} % 3) + \def\theparagraphdis{\alph{paragraph})} % d) +\fi + +% just like LaTeX2e's \@eqnnum +\def\theequationdis{{\normalfont \normalcolor (\theequation)}}% (1) +% IEEEsubequation used only by IEEEtran's IEEEeqnarray +\def\theIEEEsubequationdis{{\normalfont \normalcolor (\theIEEEsubequation)}}% (1a) +% redirect LaTeX2e's equation number display and all that depend on +% it, through IEEEtran's \theequationdis +\def\@eqnnum{\theequationdis} + + + +% V1.7 provide string macros as article.cls does +\def\contentsname{Contents} +\def\listfigurename{List of Figures} +\def\listtablename{List of Tables} +\def\refname{References} +\def\indexname{Index} +\def\figurename{Fig.} +\def\tablename{TABLE} +\@IEEEcompsocconfonly{\def\figurename{Figure}} +\def\partname{Part} +\def\appendixname{Appendix} +\def\abstractname{Abstract} +% IEEE specific names +\def\IEEEkeywordsname{Index Terms} +\def\IEEEproofname{Proof} + + +% LIST OF FIGURES AND TABLES AND TABLE OF CONTENTS +% +\def\@pnumwidth{1.55em} +\def\@tocrmarg{2.55em} +\def\@dotsep{4.5} +\setcounter{tocdepth}{3} + +% adjusted some spacings here so that section numbers will not easily +% collide with the section titles. +% VIII; VIII-A; and VIII-A.1 are usually the worst offenders. +% MDS 1/2001 +\def\tableofcontents{\section*{\contentsname}\@starttoc{toc}} +\def\l@section#1#2{\addpenalty{\@secpenalty}\addvspace{1.0em plus 1pt}% + \@tempdima 2.75em \begingroup \parindent \z@ \rightskip \@pnumwidth% + \parfillskip-\@pnumwidth {\bfseries\leavevmode #1}\hfil\hbox to\@pnumwidth{\hss #2}\par% + \endgroup} +% argument format #1:level, #2:labelindent,#3:labelsep +\def\l@subsection{\@dottedtocline{2}{2.75em}{3.75em}} +\def\l@subsubsection{\@dottedtocline{3}{6.5em}{4.5em}} +% must provide \l@ defs for ALL sublevels EVEN if tocdepth +% is such as they will not appear in the table of contents +% these defs are how TOC knows what level these things are! +\def\l@paragraph{\@dottedtocline{4}{6.5em}{5.5em}} +\def\l@subparagraph{\@dottedtocline{5}{6.5em}{6.5em}} +\def\listoffigures{\section*{\listfigurename}\@starttoc{lof}} +\def\l@figure{\@dottedtocline{1}{0em}{2.75em}} +\def\listoftables{\section*{\listtablename}\@starttoc{lot}} +\let\l@table\l@figure + + +% Definitions for floats +% +% Normal Floats +% V1.8 floatsep et al. revised down by 0.15\baselineskip +% to account for the sideeffects of \topskip compensation +\floatsep 0.85\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip +\textfloatsep 1.55\baselineskip plus 0.2\baselineskip minus 0.4\baselineskip +\@fptop 0pt plus 1fil +\@fpsep 0.75\baselineskip plus 2fil +\@fpbot 0pt plus 1fil +\def\topfraction{0.9} +\def\bottomfraction{0.4} +\def\floatpagefraction{0.8} +% V1.7, let top floats approach 90% of page +\def\textfraction{0.1} + +% Double Column Floats +\dblfloatsep 0.85\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip + +\dbltextfloatsep 1.55\baselineskip plus 0.2\baselineskip minus 0.4\baselineskip +% Note that it would be nice if the rubber here actually worked in LaTeX2e. +% There is a long standing limitation in LaTeX, first discovered (to the best +% of my knowledge) by Alan Jeffrey in 1992. LaTeX ignores the stretchable +% portion of \dbltextfloatsep, and as a result, double column figures can and +% do result in an non-integer number of lines in the main text columns with +% underfull vbox errors as a consequence. A post to comp.text.tex +% by Donald Arseneau confirms that this had not yet been fixed in 1998. +% IEEEtran V1.6 will fix this problem for you in the titles, but it doesn't +% protect you from other double floats. Happy vspace'ing. + +\@dblfptop 0pt plus 1fil +\@dblfpsep 0.75\baselineskip plus 2fil +\@dblfpbot 0pt plus 1fil +\def\dbltopfraction{0.8} +\def\dblfloatpagefraction{0.8} +\setcounter{dbltopnumber}{4} + +\intextsep 0.85\baselineskip plus 0.2\baselineskip minus 0.2\baselineskip +\setcounter{topnumber}{2} +\setcounter{bottomnumber}{2} +\setcounter{totalnumber}{4} + + + +% article class provides these, we should too. +\newlength\abovecaptionskip +\newlength\belowcaptionskip +% but only \abovecaptionskip is used above figure captions and *below* table +% captions +\setlength\abovecaptionskip{0.5\baselineskip} +% compsoc journals are a little more generous +\ifCLASSOPTIONcompsoc\ifCLASSOPTIONjournal + \setlength\abovecaptionskip{0.75\baselineskip} +\fi\fi +\setlength\belowcaptionskip{0pt} +% V1.6 create hooks in case the caption spacing ever needs to be +% overridden by a user +\def\@IEEEfigurecaptionsepspace{\vskip\abovecaptionskip\relax}% +\def\@IEEEtablecaptionsepspace{\vskip\abovecaptionskip\relax}% + + +% 1.6b revise caption system so that \@makecaption uses two arguments +% as with LaTeX2e. Otherwise, there will be problems when using hyperref. +\def\@IEEEtablestring{table} + + +% V1.8 compensate for \topskip so top of top figures align with tops of the first lines of main text +% here we calculate a space equal to the amount \topskip exceeds the main text height +% we hook in at \@floatboxreset +\def\@IEEEfiguretopskipspace{\ifdim\prevdepth=-1000pt\relax +\setlength{\@IEEEtrantmpdimenA}{1\topskip}\relax +\addtolength{\@IEEEtrantmpdimenA}{-0.7\@IEEEnormalsizeunitybaselineskip}\relax +\vspace*{\@IEEEtrantmpdimenA}\fi} +% V1.8 compensate for \topskip at the top of top tables so caption text is on main text baseline +% use a strut set on the caption baseline within \@makecaption +\def\@IEEEtabletopskipstrut{\ifdim\prevdepth=-1000pt\rule{0pt}{\topskip}\fi} +% the \ifdim\prevdepth checks are always expected to be true for IEEE style float caption ordering +% because top of figure content and top of captions in tables is the first thing on the vertical +% list of these floats +% thanks to Donald Arseneau for his 2000/11/11 post "Re: caption hacking" with info on this topic. + + +\ifCLASSOPTIONcompsoc +% V1.7 compsoc \@makecaption +\ifCLASSOPTIONconference% compsoc conference +\long\def\@makecaption#1#2{% +% test if is a for a figure or table +\ifx\@captype\@IEEEtablestring% +% if a table, do table caption +\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\footnotesize {#1.}\nobreakspace\scshape #2}\par\addvspace{0.5\baselineskip}\egroup% +\@IEEEtablecaptionsepspace +% if not a table, format it as a figure +\else +\@IEEEfigurecaptionsepspace +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace #2}% +\ifdim \wd\@tempboxa >\hsize% +% if caption is longer than a line, let it wrap around +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace}% +\parbox[t]{\hsize}{\normalfont\footnotesize \noindent\unhbox\@tempboxa#2}% +% if caption is shorter than a line, center +\else% +\hbox to\hsize{\normalfont\footnotesize\hfil\box\@tempboxa\hfil}% +\fi\fi} +% +\else% nonconference compsoc +\long\def\@makecaption#1#2{% +% test if is a for a figure or table +\ifx\@captype\@IEEEtablestring% +% if a table, do table caption +\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\sffamily\footnotesize #1}\\{\normalfont\sffamily\footnotesize #2}\par\addvspace{0.5\baselineskip}\egroup% +\@IEEEtablecaptionsepspace +% if not a table, format it as a figure +\else +\@IEEEfigurecaptionsepspace +\setbox\@tempboxa\hbox{\normalfont\sffamily\footnotesize {#1.}\nobreakspace #2}% +\ifdim \wd\@tempboxa >\hsize% +% if caption is longer than a line, let it wrap around +\setbox\@tempboxa\hbox{\normalfont\sffamily\footnotesize {#1.}\nobreakspace}% +\parbox[t]{\hsize}{\normalfont\sffamily\footnotesize \noindent\unhbox\@tempboxa#2}% +% if caption is shorter than a line, left justify +\else% +\hbox to\hsize{\normalfont\sffamily\footnotesize\box\@tempboxa\hfil}% +\fi\fi} +\fi +% +\else% traditional noncompsoc \@makecaption +\long\def\@makecaption#1#2{% +% test if is a for a figure or table +\ifx\@captype\@IEEEtablestring% +% if a table, do table caption +\footnotesize\bgroup\par\centering\@IEEEtabletopskipstrut{\normalfont\footnotesize #1}\\{\normalfont\footnotesize\scshape #2}\par\addvspace{0.5\baselineskip}\egroup% +\@IEEEtablecaptionsepspace +% if not a table, format it as a figure +\else +\@IEEEfigurecaptionsepspace +% 3/2001 use footnotesize, not small; use two nonbreaking spaces, not one +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace #2}% +\ifdim \wd\@tempboxa >\hsize% +% if caption is longer than a line, let it wrap around +\setbox\@tempboxa\hbox{\normalfont\footnotesize {#1.}\nobreakspace\nobreakspace}% +\parbox[t]{\hsize}{\normalfont\footnotesize\noindent\unhbox\@tempboxa#2}% +% if caption is shorter than a line, center if conference, left justify otherwise +\else% +\ifCLASSOPTIONconference \hbox to\hsize{\normalfont\footnotesize\hfil\box\@tempboxa\hfil}% +\else \hbox to\hsize{\normalfont\footnotesize\box\@tempboxa\hfil}% +\fi\fi\fi} +\fi + + + +% V1.7 disable captions class option, do so in a way that retains operation of \label +% within \caption +\ifCLASSOPTIONcaptionsoff +\long\def\@makecaption#1#2{\vspace*{2em}\footnotesize\bgroup\par\addvspace{0.5\baselineskip}\centering{\footnotesize #1}\par\addvspace{0.5\baselineskip}\egroup% +\let\@IEEEtemporiglabeldefsave\label +\let\@IEEEtemplabelargsave\relax +\def\label##1{\gdef\@IEEEtemplabelargsave{##1}}% +\setbox\@tempboxa\hbox{#2}% +\let\label\@IEEEtemporiglabeldefsave +\ifx\@IEEEtemplabelargsave\relax\else\label{\@IEEEtemplabelargsave}\fi} +\fi + + +% V1.7 define end environments with \def not \let so as to work OK with +% preview-latex +\newcounter{figure} +\def\thefigure{\@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename\nobreakspace\thefigure} +% V1.8 within figures add \@IEEEfiguretopskipspace compensation to LaTeX2e's \@floatboxreset +\def\figure{\def\@floatboxreset{\reset@font\normalsize\@setminipage\@IEEEfiguretopskipspace}\@float{figure}} +\def\endfigure{\end@float} +% V1.8 also add \@IEEEfiguretopskipspace compensation to \figure* +\@namedef{figure*}{\def\@floatboxreset{\reset@font\normalsize\@setminipage\@IEEEfiguretopskipspace}\@dblfloat{figure}} +\@namedef{endfigure*}{\end@dblfloat} + +\newcounter{table} +\ifCLASSOPTIONcompsoc +\def\thetable{\arabic{table}} +\else +\def\thetable{\@Roman\c@table} +\fi +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename\nobreakspace\thetable} +% V1.6 The IEEE uses 8pt text for tables +% within tables alter LaTeX2e's \@floatboxreset to use \footnotesize +\def\table{\def\@floatboxreset{\reset@font\footnotesize\@setminipage}\@float{table}} +\def\endtable{\end@float} +% v1.6b double column tables need to default to footnotesize as well. +\@namedef{table*}{\def\@floatboxreset{\reset@font\footnotesize\@setminipage}\@dblfloat{table}} +\@namedef{endtable*}{\end@dblfloat} + + + + +%% -- Command Argument Scanning Support Functions -- +%% V1.8a + +% usage: \@IEEEstripouterbraces*{} +% \@IEEEstripouterbraces fully expands its argument (which it then stores +% in \@IEEEstripouterbracesarg) via \edef, then removes any outer enclosing +% braces, and finally stores the result in the macro +% \@IEEEstrippedouterbraces. +% +% For example: +% \@IEEEstripouterbraces{{{{ab}c}}} +% results in: +% +% \@IEEEstripouterbracesarg ==> a macro containing {{{ab}c}} +% \@IEEEstrippedouterbraces ==> a macro containing {ab}c +% +% the *-star form,\@IEEEstripouterbraces*, does not expand the argument +% contents during processing +\def\@IEEEstripouterbraces{\@ifstar{\let\@IEEEstripouterbracesdef=\def\@@IEEEstripouterbraces}{\let\@IEEEstripouterbracesdef=\edef\@@IEEEstripouterbraces}} + +\def\@@IEEEstripouterbraces#1{\@IEEEstripouterbracesdef\@IEEEstripouterbracesarg{#1}\relax +% If the macro is unchanged after being acquired as a single delimited +% argument, we know we have one sequence of tokens without any enclosing +% braces. Loop until this is true. +\loop + \expandafter\@@@IEEEstripouterbraces\@IEEEstripouterbracesarg\@IEEEgeneralsequenceDELIMITER +\ifx\@IEEEstrippedouterbraces\@IEEEstripouterbracesarg +\else + \let\@IEEEstripouterbracesarg\@IEEEstrippedouterbraces +\repeat} + +\def\@@@IEEEstripouterbraces#1\@IEEEgeneralsequenceDELIMITER{\def\@IEEEstrippedouterbraces{#1}} + + + +% usage: \@IEEEextractgroup*{} +% \@IEEEextractgroup fully expands its argument (which it then stores in +% \@IEEEextractgrouparg) via \edef and then assigns the first "brace group" +% of tokens to the macro \@IEEEextractedgroup. +% The remaining groups, if any, are stored in the macro +% \@IEEEextractedgroupremain. If the argument does not contain the requisite +% groups, the respective macros will be defined to be empty. +% There is an asymmetry in that \@IEEEextractedgroup is stripped of its first +% outer grouping while \@IEEEextractedgroupremain retains even the outer +% grouping (if present) that originally identified it as a group. +% +% For example: +% \@IEEEextractgroup{{{ab}}{c{de}}} +% results in: +% +% \@IEEEextractgrouparg ==> a macro containing {{ab}}{c{de}} +% \@IEEEextractedgroup ==> a macro containing {ab} +% \@IEEEextractedgroupremain ==> a macro containing {c{de}} +% +% The *-star form, \@IEEEextractgroup*, does not expand its argument +% contents during processing. +\def\@IEEEextractgroup{\@ifstar{\let\@IEEEextractgroupdef=\def\@@IEEEextractgroup}{\let\@IEEEextractgroupdef=\edef\@@IEEEextractgroup}} + +\def\@@IEEEextractgroup#1{\@IEEEextractgroupdef\@IEEEextractgrouparg{#1}\relax +% trap the case of an empty extracted group as this would cause problems with +% \@IEEEextractgroupremain's argument acquisition +\ifx\@IEEEextractgrouparg\@empty + \def\@IEEEextractedgroup{}\relax + \def\@IEEEextractedgroupremain{}\relax +\else + % We have to use some dirty tricks here. We want to insert {} around + % whatever remains after the first group so that TeX's argument scanner + % will preserve any originally enclosing braces as well as provide an + % empty argument to acquire even if there isn't a second group. + % In this first of two dirty tricks, we put a } at the end of the structure + % we are going to extract from. The \ifnum0=`{\fi keeps TeX happy to allow + % what would otherwise be an unbalanced macro definition for + % \@@IEEEextractgroup to be acceptable to it. + \ifnum0=`{\fi\expandafter\@IEEEextractgroupremain\@IEEEextractgrouparg}\relax +\fi} + +% In the second part of the dirty tricks, we insert a leading { right after +% the first group is acquired, but before the remainder is. Again, the +% \ifnum0=`}\fi keeps TeX happy during definition time, but will disappear +% during run time. +\def\@IEEEextractgroupremain#1{\def\@IEEEextractedgroup{#1}\expandafter\@@IEEEextractgroupremain\expandafter{\ifnum0=`}\fi} + +\def\@@IEEEextractgroupremain#1{\def\@IEEEextractedgroupremain{#1}} + + + +% \@IEEEextracttoken relocated at top because margin setting commands rely on it + + + +% usage: \@IEEEextracttokengroups*{} +% \@IEEEextracttokengroups fully expands its argument (which it then stores +% in \@IEEEextracttokengroupsarg) and then assigns the first "brace group" of +% tokens (with the outermost braces removed) to the macro +% \@IEEEextractedfirstgroup. +% The meaning of the first nonbrace (but including the empty group) token +% within this first group is assigned via \let to \@IEEEextractedfirsttoken +% as well as stored in the macro \@IEEEextractedfirsttokenmacro. If a first +% nonbrace token does not exist (or is an empty group), these will be \relax +% and empty, respectively. Tokens that would otherwise be discarded during +% the acquisition of the first token in the first group are stored in +% \@IEEEextractedfirsttokensdiscarded, however their original relative brace +% nesting depths are not guaranteed to be preserved. +% The first group within this first group is stored in the macro +% \@IEEEextractedfirstfirstgroup. +% Likewise for the next group after the first: \@IEEEextractednextgroup, +% \@IEEEextractednextfirstgroup, \@IEEEextractednextgroupfirsttoken, +% \@IEEEextractednextgroupfirsttokenmacro, and +% \@IEEEextractednextfirsttokensdiscarded. +% All tokens/groups after the first group, including any enclosing braces, +% are stored in the macro \@IEEEextractedafterfirstgroupremain which will +% be empty if none exist. +% +% For example: +% \@IEEEextracttokengroups{{{ab}{cd}}{{ef}g}} +% will result in: +% +% \@IEEEextracttokengroupsarg ==> a macro containing {{ab}{cd}}{{ef}g} +% \@IEEEextractedfirstgroup ==> a macro containing {ab}{cd} +% \@IEEEextractedafterfirstgroupremain ==> a macro containing {{ef}g} +% \@IEEEextractedfirsttoken ==> the letter a +% \@IEEEextractedfirsttokenmacro ==> a macro containing a +% \@IEEEextractedfirsttokensdiscarded ==> a macro containing bcd +% \@IEEEextractedfirstfirstgroup ==> a macro containing ab +% \@IEEEextractednextgroup ==> a macro containing {ef}g +% \@IEEEextractednextfirsttoken ==> the letter e +% \@IEEEextractednextfirsttokenmacro ==> a macro containing e +% \@IEEEextractednextfirsttokensdiscarded ==> a macro containing fg +% \@IEEEextractednextfirstgroup ==> a macro containing ef +% +% If given an empty argument, \@IEEEextractedfirsttoken and +% \@IEEEextractednextfirsttoken will be set to \relax +% and all the macros will be empty. +% the *-star form, \@IEEEextracttokengroups*, does not expand its argument +% contents during processing. +% +% Depends on: \@IEEEextractgroup, \@IEEEextracttoken +\def\@IEEEextracttokengroups{\@ifstar{\let\@IEEEextracttokengroupsdef=\def\@@IEEEextracttokengroups}{\let\@IEEEextracttokengroupsdef=\edef\@@IEEEextracttokengroups}} +\def\@@IEEEextracttokengroups#1{\@IEEEextracttokengroupsdef\@IEEEextracttokengroupsarg{#1}\relax +% begin extraction, these functions are safe with empty arguments +% first group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextracttokengroupsarg}\relax +\let\@IEEEextractedfirstgroup\@IEEEextractedgroup +\let\@IEEEextractedafterfirstgroupremain\@IEEEextractedgroupremain +\expandafter\@IEEEextracttoken\expandafter*\expandafter{\@IEEEextractedfirstgroup}\relax +\let\@IEEEextractedfirsttoken\@IEEEextractedtoken +\let\@IEEEextractedfirsttokenmacro\@IEEEextractedtokenmacro +\let\@IEEEextractedfirsttokensdiscarded\@IEEEextractedtokensdiscarded +% first first group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractedfirstgroup}\relax +\let\@IEEEextractedfirstfirstgroup\@IEEEextractedgroup +% next group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractedafterfirstgroupremain}\relax +\let\@IEEEextractednextgroup\@IEEEextractedgroup +\expandafter\@IEEEextracttoken\expandafter*\expandafter{\@IEEEextractednextgroup}\relax +\let\@IEEEextractednextfirsttoken\@IEEEextractedtoken +\let\@IEEEextractednextfirsttokenmacro\@IEEEextractedtokenmacro +\let\@IEEEextractednextfirsttokensdiscarded\@IEEEextractedtokensdiscarded +% next first group +\expandafter\@IEEEextractgroup\expandafter*\expandafter{\@IEEEextractednextgroup}\relax +\let\@IEEEextractednextfirstgroup\@IEEEextractedgroup} + + +%% -- End of Command Argument Scanning Support Functions -- + + + + +%% +%% START OF IEEEeqnarray DEFINITIONS +%% +%% Inspired by the concepts, examples, and previous works of LaTeX +%% coders and developers such as Donald Arseneau, Fred Bartlett, +%% David Carlisle, Tony Liu, Frank Mittelbach, Piet van Oostrum, +%% Roland Winkler and Mark Wooding. +%% I don't make the claim that my work here is even near their calibre. ;) + + +\newif\if@IEEEeqnarrayboxnojot% flag to indicate if the environment was called as the star form +\@IEEEeqnarrayboxnojotfalse + +\newif\if@advanceIEEEeqncolcnt% tracks if the environment should advance the col counter +% allows a way to make an \IEEEeqnarraybox that can be used within an \IEEEeqnarray +% used by IEEEeqnarraymulticol so that it can work properly in both +\@advanceIEEEeqncolcnttrue + +\newcount\@IEEEeqnnumcols % tracks how many IEEEeqnarray cols are defined +\newcount\@IEEEeqncolcnt % tracks how many IEEEeqnarray cols the user actually used + + +% The default math style used by the columns +\def\IEEEeqnarraymathstyle{\displaystyle} +% The default text style used by the columns +% default to using the current font +\def\IEEEeqnarraytextstyle{\relax} + +% like the iedlistdecl but for \IEEEeqnarray +\def\IEEEeqnarraydecl{\relax} +\def\IEEEeqnarrayboxdecl{\relax} + + + +% V1.8 flags to indicate that equation numbering is to persist +\newif\if@IEEEeqnumpersist% +\@IEEEeqnumpersistfalse +\newif\if@IEEEsubeqnumpersist% +\@IEEEsubeqnumpersistfalse +% +% V1.8 flags to indicate if (sub)equation number of last line was preadvanced +\newif\if@IEEEeqnumpreadv% +\@IEEEeqnumpreadvfalse +\newif\if@IEEEsubeqnumpreadv% +\@IEEEsubeqnumpreadvfalse + +\newcount\@IEEEsubeqnnumrollback% saves previous value of IEEEsubequation number in case we need to restore it + +% \yesnumber is the opposite of \nonumber +% a novel concept with the same def as the equationarray package +% However, we give IEEE versions too since some LaTeX packages such as +% the MDWtools mathenv.sty redefine \nonumber to something else. +% This command is intended for use in non-IEEEeqnarray math environments +\providecommand{\yesnumber}{\global\@eqnswtrue} + + +% IEEEyes/nonumber +% V1.8 add persistant * forms +% These commands can alter the type of equation an IEEEeqnarray line is. +\def\IEEEyesnumber{\@ifstar{\global\@IEEEeqnumpersisttrue\global\@IEEEsubeqnumpersistfalse\@IEEEyesnumber}{\@IEEEyesnumber}} + +\def\@IEEEyesnumber{\global\@eqnswtrue +\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray +\ifnum\c@IEEEsubequation>0\relax + \stepcounter{equation}\setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label +\fi +% even if we reached this eqn num via a preadv, it is legit now +\global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse +\fi} + +\def\IEEEnonumber{\@ifstar{\global\@IEEEeqnumpersistfalse\global\@IEEEsubeqnumpersistfalse\global\@eqnswfalse}{\global\@eqnswfalse}} + + +\def\IEEEyessubnumber{\@ifstar{\global\@IEEEsubeqnumpersisttrue\@IEEEyessubnumber}{\@IEEEyessubnumber}} +% +\def\@IEEEyessubnumber{\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray + \ifnum\c@IEEEsubequation>0\relax% if it already is a subequation, we are good to go as-is + \else% if we are a regular equation we have to watch out for two cases + \if@IEEEeqnumpreadv% if this equation is the result of a preadvance, backout and bump the sub eqnnum + \global\advance\c@equation\m@ne\global\c@IEEEsubequation=\@IEEEsubeqnnumrollback\addtocounter{IEEEsubequation}{1}\relax + \else% non-preadvanced equations just need initialization of their sub eqnnum + \setcounter{IEEEsubequation}{1}\relax + \fi + \fi% fi already is subequation + \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax + \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label + \global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse% no longer a preadv anymore + \global\@eqnswtrue +\fi} + + +\def\IEEEnosubnumber{\@ifstar{\global\@IEEEsubeqnumpersistfalse\@IEEEnosubnumber}{\@IEEEnosubnumber}} +% +\def\@IEEEnosubnumber{\if@IEEEeqnarrayISinner% alter counters and label only inside an IEEEeqnarray + \if@eqnsw % we do nothing unless we know we will display because we play with the counters here + % if it currently is a subequation, bump up to the next equation number and turn off the subequation + \ifnum\c@IEEEsubequation>0\relax\addtocounter{equation}{1}\setcounter{IEEEsubequation}{0}\relax + \fi + \global\@IEEEeqnumpreadvfalse\global\@IEEEsubeqnumpreadvfalse% no longer a preadv anymore + \gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \fi +\fi} + + + +% allows users to "push away" equations that get too close to the equation numbers +\def\IEEEeqnarraynumspace{\hphantom{\ifnum\c@IEEEsubequation>0\relax\theIEEEsubequationdis\else\theequationdis\fi}} + +% provides a way to span multiple columns within IEEEeqnarray environments +% will consider \if@advanceIEEEeqncolcnt before globally advancing the +% column counter - so as to work within \IEEEeqnarraybox +% usage: \IEEEeqnarraymulticol{number cols. to span}{col type}{cell text} +\long\def\IEEEeqnarraymulticol#1#2#3{\multispan{#1}\relax +% check if column is defined for the precolumn definition +% We have to be careful here because TeX scans for & even within an \iffalse +% where it does not expand macros. So, if we used only one \ifx and a #3 +% appeared in the false branch and the user inserted another alignment +% structure that uses & in the \IEEEeqnarraymulticol{}, TeX will not see that +% there is an inner alignment in the false branch yet still will see any & +% there and will think that they apply to the outer alignment resulting in an +% incomplete \ifx error. +% So, here we use separate checks for the pre and post parts in order to keep +% the #3 outside of all conditionals. +\relax\expandafter\ifx\csname @IEEEeqnarraycolDEF#2\endcsname\@IEEEeqnarraycolisdefined\relax +\csname @IEEEeqnarraycolPRE#2\endcsname +\else% if not, error and use default type +\@IEEEclspkgerror{Invalid column type "#2" in \string\IEEEeqnarraymulticol.\MessageBreak +Using a default centering column instead}% +{You must define IEEEeqnarray column types before use.}% +\csname @IEEEeqnarraycolPRE@IEEEdefault\endcsname +\fi +% The ten \relax are to help prevent misleading error messages in case a user +% accidently inserted a macro that tries to acquire additional arguments. +#3\relax\relax\relax\relax\relax\relax\relax\relax\relax\relax +% check if column is defined for the postcolumn definition +\expandafter\ifx\csname @IEEEeqnarraycolDEF#2\endcsname\@IEEEeqnarraycolisdefined\relax +\csname @IEEEeqnarraycolPOST#2\endcsname +\else% if not, use the default type +\csname @IEEEeqnarraycolPOST@IEEEdefault\endcsname +\fi +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by #1\relax\fi} + +% like \omit, but maintains track of the column counter for \IEEEeqnarray +\def\IEEEeqnarrayomit{\omit\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by 1\relax\fi} + + +% provides a way to define a letter referenced column type +% usage: \IEEEeqnarraydefcol{col. type letter/name}{pre insertion text}{post insertion text} +\def\IEEEeqnarraydefcol#1#2#3{\expandafter\def\csname @IEEEeqnarraycolPRE#1\endcsname{#2}% +\expandafter\def\csname @IEEEeqnarraycolPOST#1\endcsname{#3}% +\expandafter\def\csname @IEEEeqnarraycolDEF#1\endcsname{1}} + + +% provides a way to define a numerically referenced inter-column glue types +% usage: \IEEEeqnarraydefcolsep{col. glue number}{glue definition} +\def\IEEEeqnarraydefcolsep#1#2{\expandafter\def\csname @IEEEeqnarraycolSEP\romannumeral #1\endcsname{#2}% +\expandafter\def\csname @IEEEeqnarraycolSEPDEF\romannumeral #1\endcsname{1}} + + +\def\@IEEEeqnarraycolisdefined{1}% just a macro for 1, used for checking undefined column types + + +% expands and appends the given argument to the \@IEEEtrantmptoksA token list +% used to build up the \halign preamble +\def\@IEEEappendtoksA#1{\edef\@@IEEEappendtoksA{\@IEEEtrantmptoksA={\the\@IEEEtrantmptoksA #1}}% +\@@IEEEappendtoksA} + +% also appends to \@IEEEtrantmptoksA, but does not expand the argument +% uses \toks8 as a scratchpad register +\def\@IEEEappendNOEXPANDtoksA#1{\toks8={#1}% +\edef\@@IEEEappendNOEXPANDtoksA{\@IEEEtrantmptoksA={\the\@IEEEtrantmptoksA\the\toks8}}% +\@@IEEEappendNOEXPANDtoksA} + +% define some common column types for the user +% math +\IEEEeqnarraydefcol{l}{$\IEEEeqnarraymathstyle}{$\hfil} +\IEEEeqnarraydefcol{c}{\hfil$\IEEEeqnarraymathstyle}{$\hfil} +\IEEEeqnarraydefcol{r}{\hfil$\IEEEeqnarraymathstyle}{$} +\IEEEeqnarraydefcol{L}{$\IEEEeqnarraymathstyle{}}{{}$\hfil} +\IEEEeqnarraydefcol{C}{\hfil$\IEEEeqnarraymathstyle{}}{{}$\hfil} +\IEEEeqnarraydefcol{R}{\hfil$\IEEEeqnarraymathstyle{}}{{}$} +% text +\IEEEeqnarraydefcol{s}{\IEEEeqnarraytextstyle}{\hfil} +\IEEEeqnarraydefcol{t}{\hfil\IEEEeqnarraytextstyle}{\hfil} +\IEEEeqnarraydefcol{u}{\hfil\IEEEeqnarraytextstyle}{} + +% vertical rules +\IEEEeqnarraydefcol{v}{}{\vrule width\arrayrulewidth} +\IEEEeqnarraydefcol{vv}{\vrule width\arrayrulewidth\hfil}{\hfil\vrule width\arrayrulewidth} +\IEEEeqnarraydefcol{V}{}{\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth} +\IEEEeqnarraydefcol{VV}{\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth\hfil}% +{\hfil\vrule width\arrayrulewidth\hskip\doublerulesep\vrule width\arrayrulewidth} + +% horizontal rules +\IEEEeqnarraydefcol{h}{}{\leaders\hrule height\arrayrulewidth\hfil} +\IEEEeqnarraydefcol{H}{}{\leaders\vbox{\hrule width\arrayrulewidth\vskip\doublerulesep\hrule width\arrayrulewidth}\hfil} + +% plain +\IEEEeqnarraydefcol{x}{}{} +\IEEEeqnarraydefcol{X}{$}{$} + +% the default column type to use in the event a column type is not defined +\IEEEeqnarraydefcol{@IEEEdefault}{\hfil$\IEEEeqnarraymathstyle}{$\hfil} + + +% a zero tabskip (used for "-" col types) +\def\@IEEEeqnarraycolSEPzero{0pt plus 0pt minus 0pt} +% a centering tabskip (used for "+" col types) +\def\@IEEEeqnarraycolSEPcenter{1000pt plus 0pt minus 1000pt} + +% top level default tabskip glues for the start, end, and inter-column +% may be reset within environments not always at the top level, e.g., \IEEEeqnarraybox +\edef\@IEEEeqnarraycolSEPdefaultstart{\@IEEEeqnarraycolSEPcenter}% default start glue +\edef\@IEEEeqnarraycolSEPdefaultend{\@IEEEeqnarraycolSEPcenter}% default end glue +\edef\@IEEEeqnarraycolSEPdefaultmid{\@IEEEeqnarraycolSEPzero}% default inter-column glue + + + +% creates a vertical rule that extends from the bottom to the top a a cell +% Provided in case other packages redefine \vline some other way. +% usage: \IEEEeqnarrayvrule[rule thickness] +% If no argument is provided, \arrayrulewidth will be used for the rule thickness. +\newcommand\IEEEeqnarrayvrule[1][\arrayrulewidth]{\vrule\@width#1\relax} + +% creates a blank separator row +% usage: \IEEEeqnarrayseprow[separation length][font size commands] +% default is \IEEEeqnarrayseprow[0.25\normalbaselineskip][\relax] +% blank arguments inherit the default values +% uses \skip5 as a scratch register - calls \@IEEEeqnarraystrutsize which uses more scratch registers +\def\IEEEeqnarrayseprow{\relax\@ifnextchar[{\@IEEEeqnarrayseprow}{\@IEEEeqnarrayseprow[0.25\normalbaselineskip]}} +\def\@IEEEeqnarrayseprow[#1]{\relax\@ifnextchar[{\@@IEEEeqnarrayseprow[#1]}{\@@IEEEeqnarrayseprow[#1][\relax]}} +\def\@@IEEEeqnarrayseprow[#1][#2]{\def\@IEEEeqnarrayseprowARGONE{#1}% +\ifx\@IEEEeqnarrayseprowARGONE\@empty% +% get the skip value, based on the font commands +% use skip5 because \IEEEeqnarraystrutsize uses \skip0, \skip2, \skip3 +% assign within a bogus box to confine the font changes +{\setbox0=\hbox{#2\relax\global\skip5=0.25\normalbaselineskip}}% +\else% +{\setbox0=\hbox{#2\relax\global\skip5=#1}}% +\fi% +\@IEEEeqnarrayhoptolastcolumn\IEEEeqnarraystrutsize{\skip5}{0pt}[\relax]\relax} + +% creates a blank separator row, but omits all the column templates +% usage: \IEEEeqnarrayseprowcut[separation length][font size commands] +% default is \IEEEeqnarrayseprowcut[0.25\normalbaselineskip][\relax] +% blank arguments inherit the default values +% uses \skip5 as a scratch register - calls \@IEEEeqnarraystrutsize which uses more scratch registers +\def\IEEEeqnarrayseprowcut{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarrayseprowcut}{\@IEEEeqnarrayseprowcut[0.25\normalbaselineskip]}} +\def\@IEEEeqnarrayseprowcut[#1]{\relax\@ifnextchar[{\@@IEEEeqnarrayseprowcut[#1]}{\@@IEEEeqnarrayseprowcut[#1][\relax]}} +\def\@@IEEEeqnarrayseprowcut[#1][#2]{\def\@IEEEeqnarrayseprowARGONE{#1}% +\ifx\@IEEEeqnarrayseprowARGONE\@empty% +% get the skip value, based on the font commands +% use skip5 because \IEEEeqnarraystrutsize uses \skip0, \skip2, \skip3 +% assign within a bogus box to confine the font changes +{\setbox0=\hbox{#2\relax\global\skip5=0.25\normalbaselineskip}}% +\else% +{\setbox0=\hbox{#2\relax\global\skip5=#1}}% +\fi% +\IEEEeqnarraystrutsize{\skip5}{0pt}[\relax]\relax} + + + +% draws a single rule across all the columns optional +% argument determines the rule width, \arrayrulewidth is the default +% updates column counter as needed and turns off struts +% usage: \IEEEeqnarrayrulerow[rule line thickness] +\def\IEEEeqnarrayrulerow{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarrayrulerow}{\@IEEEeqnarrayrulerow[\arrayrulewidth]}} +\def\@IEEEeqnarrayrulerow[#1]{\leaders\hrule height#1\hfil\relax% put in our rule +% turn off any struts +\IEEEeqnarraystrutsize{0pt}{0pt}[\relax]\relax} + + +% draws a double rule by using a single rule row, a separator row, and then +% another single rule row +% first optional argument determines the rule thicknesses, \arrayrulewidth is the default +% second optional argument determines the rule spacing, \doublerulesep is the default +% usage: \IEEEeqnarraydblrulerow[rule line thickness][rule spacing] +\def\IEEEeqnarraydblrulerow{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarraydblrulerow}{\@IEEEeqnarraydblrulerow[\arrayrulewidth]}} +\def\@IEEEeqnarraydblrulerow[#1]{\relax\@ifnextchar[{\@@IEEEeqnarraydblrulerow[#1]}% +{\@@IEEEeqnarraydblrulerow[#1][\doublerulesep]}} +\def\@@IEEEeqnarraydblrulerow[#1][#2]{\def\@IEEEeqnarraydblrulerowARG{#1}% +% we allow the user to say \IEEEeqnarraydblrulerow[][] +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]\relax% +\fi% +\def\@IEEEeqnarraydblrulerowARG{#2}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\\\IEEEeqnarrayseprow[\doublerulesep][\relax]% +\else% +\\\IEEEeqnarrayseprow[#2][\relax]% +\fi% +\\\multispan{\@IEEEeqnnumcols}% +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\def\@IEEEeqnarraydblrulerowARG{#1}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]% +\fi% +} + +% draws a double rule by using a single rule row, a separator (cutting) row, and then +% another single rule row +% first optional argument determines the rule thicknesses, \arrayrulewidth is the default +% second optional argument determines the rule spacing, \doublerulesep is the default +% usage: \IEEEeqnarraydblrulerow[rule line thickness][rule spacing] +\def\IEEEeqnarraydblrulerowcut{\multispan{\@IEEEeqnnumcols}\relax% span all the cols +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\@ifnextchar[{\@IEEEeqnarraydblrulerowcut}{\@IEEEeqnarraydblrulerowcut[\arrayrulewidth]}} +\def\@IEEEeqnarraydblrulerowcut[#1]{\relax\@ifnextchar[{\@@IEEEeqnarraydblrulerowcut[#1]}% +{\@@IEEEeqnarraydblrulerowcut[#1][\doublerulesep]}} +\def\@@IEEEeqnarraydblrulerowcut[#1][#2]{\def\@IEEEeqnarraydblrulerowARG{#1}% +% we allow the user to say \IEEEeqnarraydblrulerow[][] +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]% +\fi% +\def\@IEEEeqnarraydblrulerowARG{#2}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\\\IEEEeqnarrayseprowcut[\doublerulesep][\relax]% +\else% +\\\IEEEeqnarrayseprowcut[#2][\relax]% +\fi% +\\\multispan{\@IEEEeqnnumcols}% +% advance column counter only if the IEEEeqnarray environment wants it +\if@advanceIEEEeqncolcnt\global\advance\@IEEEeqncolcnt by \@IEEEeqnnumcols\relax\fi% +\def\@IEEEeqnarraydblrulerowARG{#1}% +\ifx\@IEEEeqnarraydblrulerowARG\@empty% +\@IEEEeqnarrayrulerow[\arrayrulewidth]% +\else% +\@IEEEeqnarrayrulerow[#1]% +\fi% +} + + + +% inserts a full row's worth of &'s +% relies on \@IEEEeqnnumcols to provide the correct number of columns +% uses \@IEEEtrantmptoksA, \count0 as scratch registers +\def\@IEEEeqnarrayhoptolastcolumn{\@IEEEtrantmptoksA={}\count0=1\relax% +\loop% add cols if the user did not use them all +\ifnum\count0<\@IEEEeqnnumcols\relax% +\@IEEEappendtoksA{&}% +\advance\count0 by 1\relax% update the col count +\repeat% +\the\@IEEEtrantmptoksA%execute the &'s +} + + + +\newif\if@IEEEeqnarrayISinner % flag to indicate if we are within the lines +\@IEEEeqnarrayISinnerfalse % of an IEEEeqnarray - after the IEEEeqnarraydecl + +\edef\@IEEEeqnarrayTHEstrutheight{0pt} % height and depth of IEEEeqnarray struts +\edef\@IEEEeqnarrayTHEstrutdepth{0pt} + +\edef\@IEEEeqnarrayTHEmasterstrutheight{0pt} % default height and depth of +\edef\@IEEEeqnarrayTHEmasterstrutdepth{0pt} % struts within an IEEEeqnarray + +\edef\@IEEEeqnarrayTHEmasterstrutHSAVE{0pt} % saved master strut height +\edef\@IEEEeqnarrayTHEmasterstrutDSAVE{0pt} % and depth + +\newif\if@IEEEeqnarrayusemasterstrut % flag to indicate that the master strut value +\@IEEEeqnarrayusemasterstruttrue % is to be used + + + +% saves the strut height and depth of the master strut +\def\@IEEEeqnarraymasterstrutsave{\relax% +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +% remove stretchability +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% save values +\edef\@IEEEeqnarrayTHEmasterstrutHSAVE{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutDSAVE{\the\dimen2}} + +% restores the strut height and depth of the master strut +\def\@IEEEeqnarraymasterstrutrestore{\relax% +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutHSAVE\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutDSAVE\relax% +% remove stretchability +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% restore values +\edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}} + + +% globally restores the strut height and depth to the +% master values and sets the master strut flag to true +\def\@IEEEeqnarraystrutreset{\relax% +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +% remove stretchability +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% restore values +\xdef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\xdef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\global\@IEEEeqnarrayusemasterstruttrue} + + +% if the master strut is not to be used, make the current +% values of \@IEEEeqnarrayTHEstrutheight, \@IEEEeqnarrayTHEstrutdepth +% and the use master strut flag, global +% this allows user strut commands issued in the last column to be carried +% into the isolation/strut column +\def\@IEEEeqnarrayglobalizestrutstatus{\relax% +\if@IEEEeqnarrayusemasterstrut\else% +\xdef\@IEEEeqnarrayTHEstrutheight{\@IEEEeqnarrayTHEstrutheight}% +\xdef\@IEEEeqnarrayTHEstrutdepth{\@IEEEeqnarrayTHEstrutdepth}% +\global\@IEEEeqnarrayusemasterstrutfalse% +\fi} + + + +% usage: \IEEEeqnarraystrutsize{height}{depth}[font size commands] +% If called outside the lines of an IEEEeqnarray, sets the height +% and depth of both the master and local struts. If called inside +% an IEEEeqnarray line, sets the height and depth of the local strut +% only and sets the flag to indicate the use of the local strut +% values. If the height or depth is left blank, 0.7\normalbaselineskip +% and 0.3\normalbaselineskip will be used, respectively. +% The optional argument can be used to evaluate the lengths under +% a different font size and styles. If none is specified, the current +% font is used. +% uses scratch registers \skip0, \skip2, \skip3, \dimen0, \dimen2 +\def\IEEEeqnarraystrutsize#1#2{\relax\@ifnextchar[{\@IEEEeqnarraystrutsize{#1}{#2}}{\@IEEEeqnarraystrutsize{#1}{#2}[\relax]}} +\def\@IEEEeqnarraystrutsize#1#2[#3]{\def\@IEEEeqnarraystrutsizeARG{#1}% +\ifx\@IEEEeqnarraystrutsizeARG\@empty% +{\setbox0=\hbox{#3\relax\global\skip3=0.7\normalbaselineskip}}% +\skip0=\skip3\relax% +\else% arg one present +{\setbox0=\hbox{#3\relax\global\skip3=#1\relax}}% +\skip0=\skip3\relax% +\fi% if null arg +\def\@IEEEeqnarraystrutsizeARG{#2}% +\ifx\@IEEEeqnarraystrutsizeARG\@empty% +{\setbox0=\hbox{#3\relax\global\skip3=0.3\normalbaselineskip}}% +\skip2=\skip3\relax% +\else% arg two present +{\setbox0=\hbox{#3\relax\global\skip3=#2\relax}}% +\skip2=\skip3\relax% +\fi% if null arg +% remove stretchability, just to be safe +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% dimen0 = height, dimen2 = depth +\if@IEEEeqnarrayISinner% inner does not touch master strut size +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstrutfalse% do not use master +\else% outer, have to set master strut too +\edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}% +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstruttrue% use master strut +\fi} + + +% usage: \IEEEeqnarraystrutsizeadd{added height}{added depth}[font size commands] +% If called outside the lines of an IEEEeqnarray, adds the given height +% and depth to both the master and local struts. +% If called inside an IEEEeqnarray line, adds the given height and depth +% to the local strut only and sets the flag to indicate the use +% of the local strut values. +% In both cases, if a height or depth is left blank, 0pt is used instead. +% The optional argument can be used to evaluate the lengths under +% a different font size and styles. If none is specified, the current +% font is used. +% uses scratch registers \skip0, \skip2, \skip3, \dimen0, \dimen2 +\def\IEEEeqnarraystrutsizeadd#1#2{\relax\@ifnextchar[{\@IEEEeqnarraystrutsizeadd{#1}{#2}}{\@IEEEeqnarraystrutsizeadd{#1}{#2}[\relax]}} +\def\@IEEEeqnarraystrutsizeadd#1#2[#3]{\def\@IEEEeqnarraystrutsizearg{#1}% +\ifx\@IEEEeqnarraystrutsizearg\@empty% +\skip0=0pt\relax% +\else% arg one present +{\setbox0=\hbox{#3\relax\global\skip3=#1}}% +\skip0=\skip3\relax% +\fi% if null arg +\def\@IEEEeqnarraystrutsizearg{#2}% +\ifx\@IEEEeqnarraystrutsizearg\@empty% +\skip2=0pt\relax% +\else% arg two present +{\setbox0=\hbox{#3\relax\global\skip3=#2}}% +\skip2=\skip3\relax% +\fi% if null arg +% remove stretchability, just to be safe +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% dimen0 = height, dimen2 = depth +\if@IEEEeqnarrayISinner% inner does not touch master strut size +% get local strut size +\expandafter\skip0=\@IEEEeqnarrayTHEstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEstrutdepth\relax% +% add it to the user supplied values +\advance\dimen0 by \skip0\relax% +\advance\dimen2 by \skip2\relax% +% update the local strut size +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstrutfalse% do not use master +\else% outer, have to set master strut too +% get master strut size +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +% add it to the user supplied values +\advance\dimen0 by \skip0\relax% +\advance\dimen2 by \skip2\relax% +% update the local and master strut sizes +\edef\@IEEEeqnarrayTHEmasterstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEmasterstrutdepth{\the\dimen2}% +\edef\@IEEEeqnarrayTHEstrutheight{\the\dimen0}% +\edef\@IEEEeqnarrayTHEstrutdepth{\the\dimen2}% +\@IEEEeqnarrayusemasterstruttrue% use master strut +\fi} + + +% allow user a way to see the struts +\newif\ifIEEEvisiblestruts +\IEEEvisiblestrutsfalse + +% inserts an invisible strut using the master or local strut values +% uses scratch registers \skip0, \skip2, \dimen0, \dimen2 +\def\@IEEEeqnarrayinsertstrut{\relax% +\if@IEEEeqnarrayusemasterstrut +% get master strut size +\expandafter\skip0=\@IEEEeqnarrayTHEmasterstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEmasterstrutdepth\relax% +\else% +% get local strut size +\expandafter\skip0=\@IEEEeqnarrayTHEstrutheight\relax% +\expandafter\skip2=\@IEEEeqnarrayTHEstrutdepth\relax% +\fi% +% remove stretchability, probably not needed +\dimen0\skip0\relax% +\dimen2\skip2\relax% +% dimen0 = height, dimen2 = depth +% allow user to see struts if desired +\ifIEEEvisiblestruts% +\vrule width0.2pt height\dimen0 depth\dimen2\relax% +\else% +\vrule width0pt height\dimen0 depth\dimen2\relax\fi} + + +% creates an invisible strut, useable even outside \IEEEeqnarray +% if \IEEEvisiblestrutstrue, the strut will be visible and 0.2pt wide. +% usage: \IEEEstrut[height][depth][font size commands] +% default is \IEEEstrut[0.7\normalbaselineskip][0.3\normalbaselineskip][\relax] +% blank arguments inherit the default values +% uses \dimen0, \dimen2, \skip0, \skip2 +\def\IEEEstrut{\relax\@ifnextchar[{\@IEEEstrut}{\@IEEEstrut[0.7\normalbaselineskip]}} +\def\@IEEEstrut[#1]{\relax\@ifnextchar[{\@@IEEEstrut[#1]}{\@@IEEEstrut[#1][0.3\normalbaselineskip]}} +\def\@@IEEEstrut[#1][#2]{\relax\@ifnextchar[{\@@@IEEEstrut[#1][#2]}{\@@@IEEEstrut[#1][#2][\relax]}} +\def\@@@IEEEstrut[#1][#2][#3]{\mbox{#3\relax% +\def\@IEEEstrutARG{#1}% +\ifx\@IEEEstrutARG\@empty% +\skip0=0.7\normalbaselineskip\relax% +\else% +\skip0=#1\relax% +\fi% +\def\@IEEEstrutARG{#2}% +\ifx\@IEEEstrutARG\@empty% +\skip2=0.3\normalbaselineskip\relax% +\else% +\skip2=#2\relax% +\fi% +% remove stretchability, probably not needed +\dimen0\skip0\relax% +\dimen2\skip2\relax% +\ifIEEEvisiblestruts% +\vrule width0.2pt height\dimen0 depth\dimen2\relax% +\else% +\vrule width0.0pt height\dimen0 depth\dimen2\relax\fi}} + + +% enables strut mode by setting a default strut size and then zeroing the +% \baselineskip, \lineskip, \lineskiplimit and \jot +\def\IEEEeqnarraystrutmode{\IEEEeqnarraystrutsize{0.7\normalbaselineskip}{0.3\normalbaselineskip}[\relax]% +\baselineskip=0pt\lineskip=0pt\lineskiplimit=0pt\jot=0pt} + + +% equation and subequation forms to use to setup hyperref's \@currentHref +\def\@IEEEtheHrefequation{equation.\theHequation} +\def\@IEEEtheHrefsubequation{equation.\theHequation\alph{IEEEsubequation}} + + +\def\IEEEeqnarray{\@IEEEeqnumpersisttrue\@IEEEsubeqnumpersistfalse\@IEEEeqnarray} +\def\endIEEEeqnarray{\end@IEEEeqnarray} + +\@namedef{IEEEeqnarray*}{\@IEEEeqnumpersistfalse\@IEEEsubeqnumpersistfalse\@IEEEeqnarray} +\@namedef{endIEEEeqnarray*}{\end@IEEEeqnarray} + + +% \IEEEeqnarray is an enhanced \eqnarray. +% The star form defaults to not putting equation numbers at the end of each row. +% usage: \IEEEeqnarray[decl]{cols} +\def\@IEEEeqnarray{\relax\@ifnextchar[{\@@IEEEeqnarray}{\@@IEEEeqnarray[\relax]}} +% We have to be careful here to normalize catcodes just before acquiring the +% cols as that specification may contain punctuation which could be subject +% to document catcode changes. +\def\@@IEEEeqnarray[#1]{\begingroup\IEEEnormalcatcodes\@@@IEEEeqnarray[#1]} +\def\@@@IEEEeqnarray[#1]#2{\endgroup + % default to showing the equation number or not based on whether or not + % the star form was involked + \if@IEEEeqnumpersist\global\@eqnswtrue + \else% not the star form + \global\@eqnswfalse + \fi% if star form + % provide a basic hyperref \theHequation if this has not already been setup (hyperref not loaded, or no section counter) + \@ifundefined{theHequation}{\def\theHequation{\arabic{equation}}}{}\relax + % provide dummy hyperref commands in case hyperref is not loaded + \providecommand{\Hy@raisedlink}[1]{}\relax + \providecommand{\hyper@anchorstart}[1]{}\relax + \providecommand{\hyper@anchorend}{}\relax + \providecommand{\@currentHref}{}\relax + \@IEEEeqnumpreadvfalse% reset eqnpreadv flag + \@IEEEsubeqnumpreadvfalse% reset subeqnpreadv flag + \@IEEEeqnarrayISinnerfalse% not yet within the lines of the halign + \@IEEEeqnarraystrutsize{0pt}{0pt}[\relax]% turn off struts by default + \@IEEEeqnarrayusemasterstruttrue% use master strut till user asks otherwise + \IEEEvisiblestrutsfalse% diagnostic mode defaults to off + % no extra space unless the user specifically requests it + \lineskip=0pt\relax + \lineskiplimit=0pt\relax + \baselineskip=\normalbaselineskip\relax% + \jot=\IEEEnormaljot\relax% + \mathsurround\z@\relax% no extra spacing around math + \@advanceIEEEeqncolcnttrue% advance the col counter for each col the user uses, + % used in \IEEEeqnarraymulticol and in the preamble build + %V1.8 Here we preadvance to the next equation number. + % If the user later wants a continued subequation, we can roll back. + \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation% + \stepcounter{equation}\@IEEEeqnumpreadvtrue% advance equation counter before first line + \setcounter{IEEEsubequation}{0}% no subequation yet + \let\@IEEEcurrentlabelsave\@currentlabel% save current label as we later change it globally + \let\@IEEEcurrentHrefsave\@currentHref% save current href label as we later change it globally + \def\@currentlabel{\p@equation\theequation}% redefine the ref label + \def\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \IEEEeqnarraydecl\relax% allow a way for the user to make global overrides + #1\relax% allow user to override defaults + \let\\\@IEEEeqnarraycr% replace newline with one that can put in eqn. numbers + \global\@IEEEeqncolcnt\z@% col. count = 0 for first line + \@IEEEbuildpreamble{#2}\relax% build the preamble and put it into \@IEEEtrantmptoksA + % put in the column for the equation number + \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi% col separator for those after the first + \toks0={##}% + % advance the \@IEEEeqncolcnt for the isolation col, this helps with error checking + \@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}% + % add the isolation column + \@IEEEappendtoksA{\tabskip\z@skip\bgroup\the\toks0\egroup}% + % advance the \@IEEEeqncolcnt for the equation number col, this helps with error checking + \@IEEEappendtoksA{&\global\advance\@IEEEeqncolcnt by 1\relax}% + % add the equation number col to the preamble + \@IEEEappendtoksA{\tabskip\z@skip\hb@xt@\z@\bgroup\hss\the\toks0\egroup}% + % note \@IEEEeqnnumcols does not count the equation col or isolation col + % set the starting tabskip glue as determined by the preamble build + \tabskip=\@IEEEBPstartglue\relax + % begin the display alignment + \@IEEEeqnarrayISinnertrue% commands are now within the lines + $$\everycr{}\halign to\displaywidth\bgroup + % "exspand" the preamble + \span\the\@IEEEtrantmptoksA\cr} + +% enter isolation/strut column (or the next column if the user did not use +% every column), record the strut status, complete the columns, do the strut if needed, +% restore counters (to backout any equation setup for a next line that was never used) +% to their correct values and exit +\def\end@IEEEeqnarray{\@IEEEeqnarrayglobalizestrutstatus&\@@IEEEeqnarraycr\egroup +\if@IEEEsubeqnumpreadv\global\advance\c@IEEEsubequation\m@ne\fi +\if@IEEEeqnumpreadv\global\advance\c@equation\m@ne\global\c@IEEEsubequation=\@IEEEsubeqnnumrollback\fi +\global\let\@currentlabel\@IEEEcurrentlabelsave% restore current label +\global\let\@currentHref\@IEEEcurrentHrefsave% restore current href label +$$\@ignoretrue} + + +% IEEEeqnarray uses a modifed \\ instead of the plain \cr to +% end rows. This allows for things like \\*[vskip amount] +% These "cr" macros are modified versions of those for LaTeX2e's eqnarray +% the {\ifnum0=`} braces must be kept away from the last column to avoid +% altering spacing of its math, so we use & to advance to the next column +% as there is an isolation/strut column after the user's columns +\def\@IEEEeqnarraycr{\@IEEEeqnarrayglobalizestrutstatus&% save strut status and advance to next column + {\ifnum0=`}\fi + \@ifstar{% + \global\@eqpen\@M\@IEEEeqnarrayYCR + }{% + \global\@eqpen\interdisplaylinepenalty \@IEEEeqnarrayYCR + }% +} + +\def\@IEEEeqnarrayYCR{\@testopt\@IEEEeqnarrayXCR\z@skip} + +\def\@IEEEeqnarrayXCR[#1]{% + \ifnum0=`{\fi}% + \@@IEEEeqnarraycr + \noalign{\penalty\@eqpen\vskip\jot\vskip #1\relax}}% + +\def\@@IEEEeqnarraycr{\@IEEEtrantmptoksA={}% clear token register + \advance\@IEEEeqncolcnt by -1\relax% adjust col count because of the isolation column + \ifnum\@IEEEeqncolcnt>\@IEEEeqnnumcols\relax + \@IEEEclspkgerror{Too many columns within the IEEEeqnarray\MessageBreak + environment}% + {Use fewer \string &'s or put more columns in the IEEEeqnarray column\MessageBreak + specifications.}\relax% + \else + \loop% add cols if the user did not use them all + \ifnum\@IEEEeqncolcnt<\@IEEEeqnnumcols\relax + \@IEEEappendtoksA{&}% + \advance\@IEEEeqncolcnt by 1\relax% update the col count + \repeat + % this number of &'s will take us the the isolation column + \fi + % execute the &'s + \the\@IEEEtrantmptoksA% + % handle the strut/isolation column + \@IEEEeqnarrayinsertstrut% do the strut if needed + \@IEEEeqnarraystrutreset% reset the strut system for next line or IEEEeqnarray + &% and enter the equation number column + \if@eqnsw% only if we display something + \Hy@raisedlink{\hyper@anchorstart{\@currentHref}}% start a hyperref anchor + \global\@IEEEeqnumpreadvfalse\relax% displaying an equation number means + \global\@IEEEsubeqnumpreadvfalse\relax% the equation counters point to valid equations + % V1.8 Here we setup the counters, currentlabel and status for what would be the *next* + % equation line as would be the case under the current settings. However, there are two problems. + % One problem is that there might not ever be a next line. The second problem is that the user + % may later alter the meaning of a line with commands such as \IEEEyessubnumber. So, to handle + % these cases we have to record the current values of the (sub)equation counters and revert back + % to them if the next line is changed or never comes. The \if@IEEEeqnumpreadv, \if@IEEEsubeqnumpreadv + % and \@IEEEsubeqnnumrollback stuff tracks this. + % The logic to handle all this is surprisingly complex, but a nice feature of the approach here is + % that the equation counters and labels remain valid for what the line would be unless a + % \IEEEyessubnumber et al. later changes it. So, any hyperref links are always correct. + \ifnum\c@IEEEsubequation>0\relax% handle subequation + \theIEEEsubequationdis\relax + \if@IEEEsubeqnumpersist% setup for default type of next line + \stepcounter{IEEEsubequation}\global\@IEEEsubeqnumpreadvtrue\relax + \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax + \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label + \else + % if no subeqnum persist, go ahead and setup for a new equation number + \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation + \stepcounter{equation}\global\@IEEEeqnumpreadvtrue\relax + \setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \fi + \else% display a standard equation number + \theequationdis\relax + \setcounter{IEEEsubequation}{0}\relax% not really needed + \if@IEEEsubeqnumpersist% setup for default type of next line + % subequations that follow plain equations carry the same equation number e.g, 5, 5a rather than 5, 6a + \stepcounter{IEEEsubequation}\global\@IEEEsubeqnumpreadvtrue\relax + \gdef\@currentlabel{\p@IEEEsubequation\theIEEEsubequation}\relax + \gdef\@currentHref{\@IEEEtheHrefsubequation}% setup hyperref label + \else + % if no subeqnum persist, go ahead and setup for a new equation number + \global\@IEEEsubeqnnumrollback=\c@IEEEsubequation + \stepcounter{equation}\global\@IEEEeqnumpreadvtrue\relax + \setcounter{IEEEsubequation}{0}\gdef\@currentlabel{\p@equation\theequation}\relax + \gdef\@currentHref{\@IEEEtheHrefequation}% setup hyperref label + \fi + \fi% + \Hy@raisedlink{\hyper@anchorend}% end hyperref anchor + \fi% fi only if we display something + % reset the flags to indicate the default preferences of the display of equation numbers + \if@IEEEeqnumpersist\global\@eqnswtrue\else\global\@eqnswfalse\fi + \if@IEEEsubeqnumpersist\global\@eqnswtrue\fi% ditto for the subequation flag + % reset the number of columns the user actually used + \global\@IEEEeqncolcnt\z@\relax + % the real end of the line + \cr} + + + + + +% \IEEEeqnarraybox is like \IEEEeqnarray except the box form puts everything +% inside a vtop, vbox, or vcenter box depending on the letter in the second +% optional argument (t,b,c). Vbox is the default. Unlike \IEEEeqnarray, +% equation numbers are not displayed and \IEEEeqnarraybox can be nested. +% \IEEEeqnarrayboxm is for math mode (like \array) and does not put the vbox +% within an hbox. +% \IEEEeqnarrayboxt is for text mode (like \tabular) and puts the vbox within +% a \hbox{$ $} construct. +% \IEEEeqnarraybox will auto detect whether to use \IEEEeqnarrayboxm or +% \IEEEeqnarrayboxt depending on the math mode. +% The third optional argument specifies the width this box is to be set to - +% natural width is the default. +% The * forms do not add \jot line spacing +% usage: \IEEEeqnarraybox[decl][pos][width]{cols} +\def\IEEEeqnarrayboxm{\@IEEEeqnarrayboxnojotfalse\@IEEEeqnarrayboxHBOXSWfalse\@IEEEeqnarraybox} +\def\endIEEEeqnarrayboxm{\end@IEEEeqnarraybox} +\@namedef{IEEEeqnarrayboxm*}{\@IEEEeqnarrayboxnojottrue\@IEEEeqnarrayboxHBOXSWfalse\@IEEEeqnarraybox} +\@namedef{endIEEEeqnarrayboxm*}{\end@IEEEeqnarraybox} + +\def\IEEEeqnarrayboxt{\@IEEEeqnarrayboxnojotfalse\@IEEEeqnarrayboxHBOXSWtrue\@IEEEeqnarraybox} +\def\endIEEEeqnarrayboxt{\end@IEEEeqnarraybox} +\@namedef{IEEEeqnarrayboxt*}{\@IEEEeqnarrayboxnojottrue\@IEEEeqnarrayboxHBOXSWtrue\@IEEEeqnarraybox} +\@namedef{endIEEEeqnarrayboxt*}{\end@IEEEeqnarraybox} + +\def\IEEEeqnarraybox{\@IEEEeqnarrayboxnojotfalse\ifmmode\@IEEEeqnarrayboxHBOXSWfalse\else\@IEEEeqnarrayboxHBOXSWtrue\fi% +\@IEEEeqnarraybox} +\def\endIEEEeqnarraybox{\end@IEEEeqnarraybox} + +\@namedef{IEEEeqnarraybox*}{\@IEEEeqnarrayboxnojottrue\ifmmode\@IEEEeqnarrayboxHBOXSWfalse\else\@IEEEeqnarrayboxHBOXSWtrue\fi% +\@IEEEeqnarraybox} +\@namedef{endIEEEeqnarraybox*}{\end@IEEEeqnarraybox} + +% flag to indicate if the \IEEEeqnarraybox needs to put things into an hbox{$ $} +% for \vcenter in non-math mode +\newif\if@IEEEeqnarrayboxHBOXSW% +\@IEEEeqnarrayboxHBOXSWfalse + +\def\@IEEEeqnarraybox{\relax\@ifnextchar[{\@@IEEEeqnarraybox}{\@@IEEEeqnarraybox[\relax]}} +% We have to be careful here to normalize catcodes just before acquiring the +% cols as that specification may contain punctuation which could be subject +% to document catcode changes. +\def\@@IEEEeqnarraybox[#1]{\relax\begingroup\IEEEnormalcatcodes\@ifnextchar[{\@@@IEEEeqnarraybox[#1]}{\@@@IEEEeqnarraybox[#1][b]}} +\def\@@@IEEEeqnarraybox[#1][#2]{\relax\@ifnextchar[{\@@@@IEEEeqnarraybox[#1][#2]}{\@@@@IEEEeqnarraybox[#1][#2][\relax]}} + +% #1 = decl; #2 = t,b,c; #3 = width, #4 = col specs +\def\@@@@IEEEeqnarraybox[#1][#2][#3]#4{\endgroup\@IEEEeqnarrayISinnerfalse % not yet within the lines of the halign + \@IEEEeqnarraymasterstrutsave% save current master strut values + \@IEEEeqnarraystrutsize{0pt}{0pt}[\relax]% turn off struts by default + \@IEEEeqnarrayusemasterstruttrue% use master strut till user asks otherwise + \IEEEvisiblestrutsfalse% diagnostic mode defaults to off + % no extra space unless the user specifically requests it + \lineskip=0pt\relax% + \lineskiplimit=0pt\relax% + \baselineskip=\normalbaselineskip\relax% + \jot=\IEEEnormaljot\relax% + \mathsurround\z@\relax% no extra spacing around math + % the default end glues are zero for an \IEEEeqnarraybox + \edef\@IEEEeqnarraycolSEPdefaultstart{\@IEEEeqnarraycolSEPzero}% default start glue + \edef\@IEEEeqnarraycolSEPdefaultend{\@IEEEeqnarraycolSEPzero}% default end glue + \edef\@IEEEeqnarraycolSEPdefaultmid{\@IEEEeqnarraycolSEPzero}% default inter-column glue + \@advanceIEEEeqncolcntfalse% do not advance the col counter for each col the user uses, + % used in \IEEEeqnarraymulticol and in the preamble build + \IEEEeqnarrayboxdecl\relax% allow a way for the user to make global overrides + #1\relax% allow user to override defaults + \let\\\@IEEEeqnarrayboxcr% replace newline with one that allows optional spacing + \@IEEEbuildpreamble{#4}\relax% build the preamble and put it into \@IEEEtrantmptoksA + % add an isolation column to the preamble to stop \\'s {} from getting into the last col + \ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi% col separator for those after the first + \toks0={##}% + % add the isolation column to the preamble + \@IEEEappendtoksA{\tabskip\z@skip\bgroup\the\toks0\egroup}% + % set the starting tabskip glue as determined by the preamble build + \tabskip=\@IEEEBPstartglue\relax + % begin the alignment + \everycr{}% + % use only the very first token to determine the positioning + \@IEEEextracttoken{#2}\relax + \ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: IEEEeqnarraybox position specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax + \fi + % \@IEEEextractedtoken has the first token, the rest are ignored + % if we need to put things into and hbox and go into math mode, do so now + \if@IEEEeqnarrayboxHBOXSW \leavevmode \hbox \bgroup $\fi% + % use the appropriate vbox type + \if\@IEEEextractedtoken t\relax\vtop\else\if\@IEEEextractedtoken c\relax% + \vcenter\else\vbox\fi\fi\bgroup% + \@IEEEeqnarrayISinnertrue% commands are now within the lines + \ifx#3\relax\halign\else\halign to #3\relax\fi% + \bgroup + % "exspand" the preamble + \span\the\@IEEEtrantmptoksA\cr} + +% carry strut status and enter the isolation/strut column, +% exit from math mode if needed, and exit +\def\end@IEEEeqnarraybox{\@IEEEeqnarrayglobalizestrutstatus% carry strut status +&% enter isolation/strut column +\@IEEEeqnarrayinsertstrut% do strut if needed +\@IEEEeqnarraymasterstrutrestore% restore the previous master strut values +% reset the strut system for next IEEEeqnarray +% (sets local strut values back to previous master strut values) +\@IEEEeqnarraystrutreset% +% ensure last line, exit from halign, close vbox +\crcr\egroup\egroup% +% exit from math mode and close hbox if needed +\if@IEEEeqnarrayboxHBOXSW $\egroup\fi} + + + +% IEEEeqnarraybox uses a modifed \\ instead of the plain \cr to +% end rows. This allows for things like \\[vskip amount] +% This "cr" macros are modified versions those for LaTeX2e's eqnarray +% For IEEEeqnarraybox, \\* is the same as \\ +% the {\ifnum0=`} braces must be kept away from the last column to avoid +% altering spacing of its math, so we use & to advance to the isolation/strut column +% carry strut status into isolation/strut column +\def\@IEEEeqnarrayboxcr{\@IEEEeqnarrayglobalizestrutstatus% carry strut status +&% enter isolation/strut column +\@IEEEeqnarrayinsertstrut% do strut if needed +% reset the strut system for next line or IEEEeqnarray +\@IEEEeqnarraystrutreset% +{\ifnum0=`}\fi% +\@ifstar{\@IEEEeqnarrayboxYCR}{\@IEEEeqnarrayboxYCR}} + +% test and setup the optional argument to \\[] +\def\@IEEEeqnarrayboxYCR{\@testopt\@IEEEeqnarrayboxXCR\z@skip} + +% IEEEeqnarraybox does not automatically increase line spacing by \jot +\def\@IEEEeqnarrayboxXCR[#1]{\ifnum0=`{\fi}% +\cr\noalign{\if@IEEEeqnarrayboxnojot\else\vskip\jot\fi\vskip#1\relax}} + + + +% usage: \@IEEEbuildpreamble{column specifiers} +% starts the halign preamble build +% the assembled preamble is put in \@IEEEtrantmptoksA +\def\@IEEEbuildpreamble#1{\@IEEEtrantmptoksA={}% clear token register +\let\@IEEEBPcurtype=u%current column type is not yet known +\let\@IEEEBPprevtype=s%the previous column type was the start +\let\@IEEEBPnexttype=u%next column type is not yet known +% ensure these are valid +\def\@IEEEBPcurglue={0pt plus 0pt minus 0pt}% +\def\@IEEEBPcurcolname{@IEEEdefault}% name of current column definition +% currently acquired numerically referenced glue +% use a name that is easier to remember +\let\@IEEEBPcurnum=\@IEEEtrantmpcountA% +\@IEEEBPcurnum=0% +% tracks number of columns in the preamble +\@IEEEeqnnumcols=0% +% record the default end glues +\edef\@IEEEBPstartglue{\@IEEEeqnarraycolSEPdefaultstart}% +\edef\@IEEEBPendglue{\@IEEEeqnarraycolSEPdefaultend}% +\edef\@IEEEedefMACRO{#1}\relax% fully expand the preamble to support macro containers +% now parse the user's column specifications +% \ignorespaces is used as a delimiter, need at least one trailing \relax because +% \@@IEEEbuildpreamble looks into the future +\expandafter\@@IEEEbuildpreamble\@IEEEedefMACRO\ignorespaces\relax\relax} + + +% usage: \@@IEEEbuildpreamble{current column}{next column} +% parses and builds the halign preamble +\def\@@IEEEbuildpreamble#1#2{\let\@@nextIEEEbuildpreamble=\@@IEEEbuildpreamble% +% use only the very first token to check the end +\@IEEEextracttokengroups{#1}\relax +\ifx\@IEEEextractedfirsttoken\ignorespaces\let\@@nextIEEEbuildpreamble=\@@IEEEfinishpreamble\else% +% identify current and next token type +\@IEEEgetcoltype{#1}{\@IEEEBPcurtype}{1}% current, error on invalid +\@IEEEgetcoltype{#2}{\@IEEEBPnexttype}{0}% next, no error on invalid next +% if curtype is a glue, get the glue def +\if\@IEEEBPcurtype g\@IEEEgetcurglue{#1}{\@IEEEBPcurglue}\fi% +% if curtype is a column, get the column def and set the current column name +\if\@IEEEBPcurtype c\@IEEEgetcurcol{#1}\fi% +% if curtype is a numeral, acquire the user defined glue +\if\@IEEEBPcurtype n\@IEEEprocessNcol{#1}\fi% +% process the acquired glue +\if\@IEEEBPcurtype g\@IEEEprocessGcol\fi% +% process the acquired col +\if\@IEEEBPcurtype c\@IEEEprocessCcol\fi% +% ready prevtype for next col spec. +\let\@IEEEBPprevtype=\@IEEEBPcurtype% +% be sure and put back the future token(s) as a group +\fi\@@nextIEEEbuildpreamble{#2}} + + +% usage: \@@IEEEfinishpreamble{discarded} +% executed just after preamble build is completed +% warn about zero cols, and if prevtype type = u, put in end tabskip glue +% argument is not used +\def\@@IEEEfinishpreamble#1{\ifnum\@IEEEeqnnumcols<1\relax +\@IEEEclspkgerror{No column specifiers declared for IEEEeqnarray}% +{At least one column type must be declared for each IEEEeqnarray.}% +\fi%num cols less than 1 +%if last type undefined, set default end tabskip glue +\if\@IEEEBPprevtype u\@IEEEappendtoksA{\tabskip=\@IEEEBPendglue}\fi} + + +% usage: \@IEEEgetcoltype{col specifier}{\output}{error more} +% Identify and return the column specifier's type code in the given +% \output macro: +% n = number +% g = glue (any other char in catagory 12) +% c = letter +% e = \ignorespaces (end of sequence) +% u = undefined +% error mode: 0 = no error message, 1 = error on invalid char +\def\@IEEEgetcoltype#1#2#3{% +% use only the very first token to determine the type +\@IEEEextracttoken{#1}\relax +% \@IEEEextractedtoken has the first token, the rest are discarded +\let#2=u\relax% assume invalid until know otherwise +\ifx\@IEEEextractedtoken\ignorespaces\let#2=e\else +\ifcat\@IEEEextractedtoken\relax\else% screen out control sequences +\if0\@IEEEextractedtoken\let#2=n\else +\if1\@IEEEextractedtoken\let#2=n\else +\if2\@IEEEextractedtoken\let#2=n\else +\if3\@IEEEextractedtoken\let#2=n\else +\if4\@IEEEextractedtoken\let#2=n\else +\if5\@IEEEextractedtoken\let#2=n\else +\if6\@IEEEextractedtoken\let#2=n\else +\if7\@IEEEextractedtoken\let#2=n\else +\if8\@IEEEextractedtoken\let#2=n\else +\if9\@IEEEextractedtoken\let#2=n\else +\ifcat,\@IEEEextractedtoken\let#2=g\relax +\else\ifcat a\@IEEEextractedtoken\let#2=c\relax\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi +\if#2u\relax +\if0\noexpand#3\relax\else\@IEEEclspkgerror{Invalid character in column specifications}% +{Only letters, numerals and certain other symbols are allowed \MessageBreak +as IEEEeqnarray column specifiers.}\fi\fi} + + +% usage: \@IEEEgetcurcol{col specifier} +% verify the letter referenced column exists +% and return its name in \@IEEEBPcurcolname +% if column specifier is invalid, use the default column @IEEEdefault +\def\@IEEEgetcurcol#1{\expandafter\ifx\csname @IEEEeqnarraycolDEF#1\endcsname\@IEEEeqnarraycolisdefined% +\def\@IEEEBPcurcolname{#1}\else% invalid column name +\@IEEEclspkgerror{Invalid column type "#1" in column specifications.\MessageBreak +Using a default centering column instead}% +{You must define IEEEeqnarray column types before use.}% +\def\@IEEEBPcurcolname{@IEEEdefault}\fi} + + +% usage: \@IEEEgetcurglue{glue specifier}{\output} +% identify the predefined (punctuation) glue value +% and return it in the given output macro +\def\@IEEEgetcurglue#1#2{% +% ! = \! (neg small) -0.16667em (-3/18 em) +% , = \, (small) 0.16667em ( 3/18 em) +% : = \: (med) 0.22222em ( 4/18 em) +% ; = \; (large) 0.27778em ( 5/18 em) +% ' = \quad 1em +% " = \qquad 2em +% . = 0.5\arraycolsep +% / = \arraycolsep +% ? = 2\arraycolsep +% * = 1fil +% + = \@IEEEeqnarraycolSEPcenter +% - = \@IEEEeqnarraycolSEPzero +% Note that all em values are referenced to the math font (textfont2) fontdimen6 +% value for 1em. +% +% use only the very first token to determine the type +\@IEEEextracttoken{#1}\relax +\ifx\@IEEEextractedtokensdiscarded\@empty\else + \typeout{** WARNING: IEEEeqnarray predefined inter-column glue type specifiers after the first in `\@IEEEextracttokenarg' ignored (line \the\inputlineno).}\relax +\fi +% get the math font 1em value +% LaTeX2e's NFSS2 does not preload the fonts, but \IEEEeqnarray needs +% to gain access to the math (\textfont2) font's spacing parameters. +% So we create a bogus box here that uses the math font to ensure +% that \textfont2 is loaded and ready. If this is not done, +% the \textfont2 stuff here may not work. +% Thanks to Bernd Raichle for his 1997 post on this topic. +{\setbox0=\hbox{$\displaystyle\relax$}}% +% fontdimen6 has the width of 1em (a quad). +\@IEEEtrantmpdimenA=\fontdimen6\textfont2\relax% +% identify the glue value based on the first token +% we discard anything after the first +\if!\@IEEEextractedtoken\@IEEEtrantmpdimenA=-0.16667\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if,\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.16667\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if:\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.22222\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if;\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.27778\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if'\@IEEEextractedtoken\@IEEEtrantmpdimenA=1\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if"\@IEEEextractedtoken\@IEEEtrantmpdimenA=2\@IEEEtrantmpdimenA\edef#2{\the\@IEEEtrantmpdimenA}\else +\if.\@IEEEextractedtoken\@IEEEtrantmpdimenA=0.5\arraycolsep\edef#2{\the\@IEEEtrantmpdimenA}\else +\if/\@IEEEextractedtoken\edef#2{\the\arraycolsep}\else +\if?\@IEEEextractedtoken\@IEEEtrantmpdimenA=2\arraycolsep\edef#2{\the\@IEEEtrantmpdimenA}\else +\if *\@IEEEextractedtoken\edef#2{0pt plus 1fil minus 0pt}\else +\if+\@IEEEextractedtoken\edef#2{\@IEEEeqnarraycolSEPcenter}\else +\if-\@IEEEextractedtoken\edef#2{\@IEEEeqnarraycolSEPzero}\else +\edef#2{\@IEEEeqnarraycolSEPzero}% +\@IEEEclspkgerror{Invalid predefined inter-column glue type "#1" in\MessageBreak +column specifications. Using a default value of\MessageBreak +0pt instead}% +{Only !,:;'"./?*+ and - are valid predefined glue types in the\MessageBreak +IEEEeqnarray column specifications.}\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + + +% usage: \@IEEEprocessNcol{digit} +% process a numerical digit from the column specification +% and look up the corresponding user defined glue value +% can transform current type from n to g or a as the user defined glue is acquired +\def\@IEEEprocessNcol#1{\if\@IEEEBPprevtype g% +\@IEEEclspkgerror{Back-to-back inter-column glue specifiers in column\MessageBreak +specifications. Ignoring consecutive glue specifiers\MessageBreak +after the first}% +{You cannot have two or more glue types next to each other\MessageBreak +in the IEEEeqnarray column specifications.}% +\let\@IEEEBPcurtype=a% abort this glue, future digits will be discarded +\@IEEEBPcurnum=0\relax% +\else% if we previously aborted a glue +\if\@IEEEBPprevtype a\@IEEEBPcurnum=0\let\@IEEEBPcurtype=a%maintain digit abortion +\else%acquire this number +% save the previous type before the numerical digits started +\if\@IEEEBPprevtype n\else\let\@IEEEBPprevsavedtype=\@IEEEBPprevtype\fi% +\multiply\@IEEEBPcurnum by 10\relax% +\advance\@IEEEBPcurnum by #1\relax% add in number, \relax is needed to stop TeX's number scan +\if\@IEEEBPnexttype n\else%close acquisition +\expandafter\ifx\csname @IEEEeqnarraycolSEPDEF\expandafter\romannumeral\number\@IEEEBPcurnum\endcsname\@IEEEeqnarraycolisdefined% +\edef\@IEEEBPcurglue{\csname @IEEEeqnarraycolSEP\expandafter\romannumeral\number\@IEEEBPcurnum\endcsname}% +\else%user glue not defined +\@IEEEclspkgerror{Invalid user defined inter-column glue type "\number\@IEEEBPcurnum" in\MessageBreak +column specifications. Using a default value of\MessageBreak +0pt instead}% +{You must define all IEEEeqnarray numerical inter-column glue types via\MessageBreak +\string\IEEEeqnarraydefcolsep \space before they are used in column specifications.}% +\edef\@IEEEBPcurglue{\@IEEEeqnarraycolSEPzero}% +\fi% glue defined or not +\let\@IEEEBPcurtype=g% change the type to reflect the acquired glue +\let\@IEEEBPprevtype=\@IEEEBPprevsavedtype% restore the prev type before this number glue +\@IEEEBPcurnum=0\relax%ready for next acquisition +\fi%close acquisition, get glue +\fi%discard or acquire number +\fi%prevtype glue or not +} + + +% process an acquired glue +% add any acquired column/glue pair to the preamble +\def\@IEEEprocessGcol{\if\@IEEEBPprevtype a\let\@IEEEBPcurtype=a%maintain previous glue abortions +\else +% if this is the start glue, save it, but do nothing else +% as this is not used in the preamble, but before +\if\@IEEEBPprevtype s\edef\@IEEEBPstartglue{\@IEEEBPcurglue}% +\else%not the start glue +\if\@IEEEBPprevtype g%ignore if back to back glues +\@IEEEclspkgerror{Back-to-back inter-column glue specifiers in column\MessageBreak +specifications. Ignoring consecutive glue specifiers\MessageBreak +after the first}% +{You cannot have two or more glue types next to each other\MessageBreak +in the IEEEeqnarray column specifications.}% +\let\@IEEEBPcurtype=a% abort this glue +\else% not a back to back glue +\if\@IEEEBPprevtype c\relax% if the previoustype was a col, add column/glue pair to preamble +\ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi +\toks0={##}% +% make preamble advance col counter if this environment needs this +\if@advanceIEEEeqncolcnt\@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}\fi +% insert the column defintion into the preamble, being careful not to expand +% the column definition +\@IEEEappendtoksA{\tabskip=\@IEEEBPcurglue}% +\@IEEEappendNOEXPANDtoksA{\begingroup\csname @IEEEeqnarraycolPRE}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname}% +\@IEEEappendtoksA{\the\toks0}% +\@IEEEappendNOEXPANDtoksA{\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\csname @IEEEeqnarraycolPOST}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\endgroup}% +\advance\@IEEEeqnnumcols by 1\relax%one more column in the preamble +\else% error: non-start glue with no pending column +\@IEEEclspkgerror{Inter-column glue specifier without a prior column\MessageBreak +type in the column specifications. Ignoring this glue\MessageBreak +specifier}% +{Except for the first and last positions, glue can be placed only\MessageBreak +between column types.}% +\let\@IEEEBPcurtype=a% abort this glue +\fi% previous was a column +\fi% back-to-back glues +\fi% is start column glue +\fi% prev type not a +} + + +% process an acquired letter referenced column and, if necessary, add it to the preamble +\def\@IEEEprocessCcol{\if\@IEEEBPnexttype g\else +\if\@IEEEBPnexttype n\else +% we have a column followed by something other than a glue (or numeral glue) +% so we must add this column to the preamble now +\ifnum\@IEEEeqnnumcols>0\relax\@IEEEappendtoksA{&}\fi%col separator for those after the first +\if\@IEEEBPnexttype e\@IEEEappendtoksA{\tabskip=\@IEEEBPendglue\relax}\else%put in end glue +\@IEEEappendtoksA{\tabskip=\@IEEEeqnarraycolSEPdefaultmid\relax}\fi% or default mid glue +\toks0={##}% +% make preamble advance col counter if this environment needs this +\if@advanceIEEEeqncolcnt\@IEEEappendtoksA{\global\advance\@IEEEeqncolcnt by 1\relax}\fi +% insert the column definition into the preamble, being careful not to expand +% the column definition +\@IEEEappendNOEXPANDtoksA{\begingroup\csname @IEEEeqnarraycolPRE}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname}% +\@IEEEappendtoksA{\the\toks0}% +\@IEEEappendNOEXPANDtoksA{\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\csname @IEEEeqnarraycolPOST}% +\@IEEEappendtoksA{\@IEEEBPcurcolname}% +\@IEEEappendNOEXPANDtoksA{\endcsname\relax\relax\relax\relax\relax% +\relax\relax\relax\relax\relax\endgroup}% +\advance\@IEEEeqnnumcols by 1\relax%one more column in the preamble +\fi%next type not numeral +\fi%next type not glue +} + + +%% +%% END OF IEEEeqnarray DEFINITIONS +%% + + + + + +% set up the running headers and footers +% +% header and footer font and size specifications +\def\@IEEEheaderstyle{\normalfont\scriptsize} +\def\@IEEEfooterstyle{\normalfont\scriptsize} +% +% compsoc uses sans-serif headers and footers +\ifCLASSOPTIONcompsoc + \def\@IEEEheaderstyle{\normalfont\sffamily\scriptsize} + \def\@IEEEfooterstyle{\normalfont\sffamily\scriptsize} +\fi + + +% standard page style, ps@headings +\def\ps@headings{% default to standard twoside headers, no footers +% will change later if the mode requires otherwise +\def\@oddhead{\hbox{}\@IEEEheaderstyle\rightmark\hfil\thepage}\relax +\def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax +\let\@oddfoot\@empty +\let\@evenfoot\@empty +\ifCLASSOPTIONtechnote + % technote twoside + \def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax + \def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax +\fi +\ifCLASSOPTIONdraftcls + % draft footers + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax +\fi +% oneside +\if@twoside\else + % standard one side headers + \def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax + \let\@evenhead\@empty + \ifCLASSOPTIONdraftcls + % oneside draft footers + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \let\@evenfoot\@empty + \fi +\fi +% turn off headers for conferences +\ifCLASSOPTIONconference + \let\@oddhead\@empty + \let\@evenhead\@empty +\fi +% turn off footers for draftclsnofoot +\ifCLASSOPTIONdraftclsnofoot + \let\@oddfoot\@empty + \let\@evenfoot\@empty +\fi} + + +% title page style, ps@IEEEtitlepagestyle +\def\ps@IEEEtitlepagestyle{% default title page headers, no footers +\def\@oddhead{\hbox{}\@IEEEheaderstyle\leftmark\hfil\thepage}\relax +\def\@evenhead{\@IEEEheaderstyle\thepage\hfil\leftmark\hbox{}}\relax +\let\@oddfoot\@empty +\let\@evenfoot\@empty +% will change later if the mode requires otherwise +\ifCLASSOPTIONdraftcls + % draft footers + \ifCLASSOPTIONdraftclsnofoot\else + % but only if not draftclsnofoot + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax + \fi +\else + % all nondraft mode footers + \if@IEEEusingpubid + % for title pages that are using a pubid + % do not repeat pubid on the title page if using a peer review cover page + \ifCLASSOPTIONpeerreview\else + % for noncompsoc papers, the pubid uses footnotesize and + % is at the same vertical position as where the last baseline would normally be + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \ifCLASSOPTIONcompsoc + % for compsoc papers, the pubid is at the same vertical position as the normal footer + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \fi + \fi + \fi +\fi +% turn off headers for conferences +\ifCLASSOPTIONconference + \let\@oddhead\@empty + \let\@evenhead\@empty +\fi} + + +% peer review cover page style, ps@IEEEpeerreviewcoverpagestyle +\def\ps@IEEEpeerreviewcoverpagestyle{% default peer review cover no headers, no footers +\let\@oddhead\@empty +\let\@evenhead\@empty +\let\@oddfoot\@empty +\let\@evenfoot\@empty +% will change later if the mode requires otherwise +\ifCLASSOPTIONdraftcls + % draft footers + \ifCLASSOPTIONdraftclsnofoot\else + % but only if not draftclsnofoot + \def\@oddfoot{\@IEEEfooterstyle\@date\hfil DRAFT}\relax + \def\@evenfoot{\@IEEEfooterstyle DRAFT\hfil\@date}\relax + \fi +\else + % all nondraft mode footers + \if@IEEEusingpubid + % for peer review cover pages that are using a pubid + % for noncompsoc papers, the pubid uses footnotesize and + % is at the same vertical position as where the last baseline would normally be + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\footnotesize\raisebox{\footskip}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \ifCLASSOPTIONcompsoc + % for compsoc papers, the pubid is at the same vertical position as the normal footer + \def\@oddfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \def\@evenfoot{\hbox{}\hss\@IEEEfooterstyle\raisebox{0pt}[0pt][0pt]{\@IEEEpubid}\hss\hbox{}}\relax + \fi + \fi +\fi} + + + +%% Defines the command for putting the header. +%% Note that all the text is forced into uppercase, if you have some text +%% that needs to be in lower case, for instance et. al., then either manually +%% set \leftmark and \rightmark or use \MakeLowercase{et. al.} within the +%% arguments to \markboth. +%% V1.7b add \protect to work with Babel +\def\markboth#1#2{\def\leftmark{\MakeUppercase{\protect#1}}% +\def\rightmark{\MakeUppercase{\protect#2}}} + +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} + + + + +%% CITATION AND BIBLIOGRAPHY COMMANDS +%% +%% V1.6 no longer supports the older, nonstandard \shortcite and \citename setup stuff +% +% +% Modify Latex2e \@citex to separate citations with "], [" +\def\@citex[#1]#2{% + \let\@citea\@empty + \@cite{\@for\@citeb:=#2\do + {\@citea\def\@citea{], [}% + \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}% + \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi + \@ifundefined{b@\@citeb}{\mbox{\reset@font\bfseries ?}% + \G@refundefinedtrue + \@latex@warning + {Citation `\@citeb' on page \thepage \space undefined}}% + {\hbox{\csname b@\@citeb\endcsname}}}}{#1}} + +% V1.6 we create hooks for the optional use of Donald Arseneau's +% cite.sty package. cite.sty is "smart" and will notice that the +% following format controls are already defined and will not +% redefine them. The result will be the proper sorting of the +% citation numbers and auto detection of 3 or more entry "ranges" - +% all in IEEE style: [1], [2], [5]--[7], [12] +% This also allows for an optional note, i.e., \cite[mynote]{..}. +% If the \cite with note has more than one reference, the note will +% be applied to the last of the listed references. It is generally +% desired that if a note is given, only one reference is listed in +% that \cite. +% Thanks to Mr. Arseneau for providing the required format arguments +% to produce the IEEE style. +\def\citepunct{], [} +\def\citedash{]--[} + +% V1.7 default to using same font for urls made by url.sty +\AtBeginDocument{\csname url@samestyle\endcsname} + +% V1.6 class files should always provide these +\def\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +% V1.8b article.cls is now providing these too +% we do not use \@mkboth, nor alter the page style +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \twocolumn[\section*{\indexname}]% + \parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \columnseprule \z@ + \columnsep 35\p@ + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} + + + +% Provide support for the control entries of IEEEtran.bst V1.00 and later. +% V1.7 optional argument allows for a different aux file to be specified in +% order to handle multiple bibliographies. For example, with multibib.sty: +% \newcites{sec}{Secondary Literature} +% \bstctlcite[@auxoutsec]{BSTcontrolhak} +\def\bstctlcite{\@ifnextchar[{\@bstctlcite}{\@bstctlcite[@auxout]}} +\def\@bstctlcite[#1]#2{\@bsphack + \@for\@citeb:=#2\do{% + \edef\@citeb{\expandafter\@firstofone\@citeb}% + \if@filesw\immediate\write\csname #1\endcsname{\string\citation{\@citeb}}\fi}% + \@esphack} + +% \IEEEnoauxwrite{} allows for citations that do not add to or affect +% the order of the existing citation list. Can be useful for \cite +% within \thanks{}. +\DeclareRobustCommand{\IEEEnoauxwrite}[1]{\relax +\if@filesw +\@fileswfalse +#1\relax\relax\relax\relax\relax +\@fileswtrue +\else +#1\relax\relax\relax\relax\relax +\fi} + +% V1.6 provide a way for a user to execute a command just before +% a given reference number - used to insert a \newpage to balance +% the columns on the last page +\edef\@IEEEtriggerrefnum{0} % the default of zero means that + % the command is not executed +\def\@IEEEtriggercmd{\newpage} + +% allow the user to alter the triggered command +\long\def\IEEEtriggercmd#1{\long\def\@IEEEtriggercmd{#1}} + +% allow user a way to specify the reference number just before the +% command is executed +\def\IEEEtriggeratref#1{\@IEEEtrantmpcountA=#1% +\edef\@IEEEtriggerrefnum{\the\@IEEEtrantmpcountA}}% + +% trigger command at the given reference +\def\@IEEEbibitemprefix{\@IEEEtrantmpcountA=\@IEEEtriggerrefnum\relax% +\advance\@IEEEtrantmpcountA by -1\relax% +\ifnum\c@enumiv=\@IEEEtrantmpcountA\relax\@IEEEtriggercmd\relax\fi} + + +\def\@biblabel#1{[#1]} + +% compsoc journals and conferences left align the reference numbers +\@IEEEcompsoconly{\def\@biblabel#1{[#1]\hfill}} + +% controls bib item spacing +\def\IEEEbibitemsep{0pt plus .5pt} + +\@IEEEcompsocconfonly{\def\IEEEbibitemsep{0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}} + + +\def\thebibliography#1{\section*{\refname}% + \addcontentsline{toc}{section}{\refname}% + % V1.6 add some rubber space here and provide a command trigger + \footnotesize\vskip 0.3\baselineskip plus 0.1\baselineskip minus 0.1\baselineskip% + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep\relax + \itemsep \IEEEbibitemsep\relax + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \let\@IEEElatexbibitem\bibitem% + \def\bibitem{\@IEEEbibitemprefix\@IEEElatexbibitem}% +\def\newblock{\hskip .11em plus .33em minus .07em}% +% originally: +% \sloppy\clubpenalty4000\widowpenalty4000% +% by adding the \interlinepenalty here, we make it more +% difficult, but not impossible, for LaTeX to break within a reference. +% The IEEE almost never breaks a reference (but they do it more often with +% technotes). You may get an underfull vbox warning around the bibliography, +% but the final result will be much more like what the IEEE will publish. +% MDS 11/2000 +\ifCLASSOPTIONtechnote\sloppy\clubpenalty4000\widowpenalty4000\interlinepenalty100% +\else\sloppy\clubpenalty4000\widowpenalty4000\interlinepenalty500\fi% + \sfcode`\.=1000\relax} +\let\endthebibliography=\endlist + + + + +% TITLE PAGE COMMANDS +% +% +% \IEEEmembership is used to produce the sublargesize italic font used to indicate author +% IEEE membership. compsoc uses a large size sans slant font +\def\IEEEmembership#1{{\@IEEEnotcompsoconly{\sublargesize}\normalfont\@IEEEcompsoconly{\sffamily}\textit{#1}}} + + +% \IEEEauthorrefmark{} produces a footnote type symbol to indicate author affiliation. +% When given an argument of 1 to 9, \IEEEauthorrefmark{} follows the standard LaTeX footnote +% symbol sequence convention. However, for arguments 10 and above, \IEEEauthorrefmark{} +% reverts to using lower case roman numerals, so it cannot overflow. Do note that you +% cannot use \footnotemark[] in place of \IEEEauthorrefmark{} within \author as the footnote +% symbols will have been turned off to prevent \thanks from creating footnote marks. +% \IEEEauthorrefmark{} produces a symbol that appears to LaTeX as having zero vertical +% height - this allows for a more compact line packing, but the user must ensure that +% the interline spacing is large enough to prevent \IEEEauthorrefmark{} from colliding +% with the text above. +% V1.7 make this a robust command +% V1.8 transmag uses an arabic author affiliation symbol +\ifCLASSOPTIONtransmag +\DeclareRobustCommand*{\IEEEauthorrefmark}[1]{\raisebox{0pt}[0pt][0pt]{\textsuperscript{\footnotesize #1}}} +\else +\DeclareRobustCommand*{\IEEEauthorrefmark}[1]{\raisebox{0pt}[0pt][0pt]{\textsuperscript{\footnotesize\ensuremath{\ifcase#1\or *\or \dagger\or \ddagger\or% + \mathsection\or \mathparagraph\or \|\or **\or \dagger\dagger% + \or \ddagger\ddagger \else\textsuperscript{\expandafter\romannumeral#1}\fi}}}} +\fi + + +% FONT CONTROLS AND SPACINGS FOR CONFERENCE MODE AUTHOR NAME AND AFFILIATION BLOCKS +% +% The default font styles for the author name and affiliation blocks (confmode) +\def\@IEEEauthorblockNstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\sublargesize} +\def\@IEEEauthorblockAstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\@IEEEcompsocconfonly{\itshape}\normalsize} +% The default if the user does not use an author block +\def\@IEEEauthordefaulttextstyle{\normalfont\@IEEEcompsocnotconfonly{\sffamily}\sublargesize} + +% adjustment spacing from title (or special paper notice) to author name blocks (confmode) +% can be negative +\def\@IEEEauthorblockconfadjspace{-0.25em} +% compsoc conferences need more space here +\@IEEEcompsocconfonly{\def\@IEEEauthorblockconfadjspace{0.75\@IEEEnormalsizeunitybaselineskip}} + +% spacing between name and affiliation blocks (confmode) +% This can be negative. +% The IEEE doesn't want any added spacing here, but I will leave these +% controls in place in case they ever change their mind. +% Personally, I like 0.75ex. +%\def\@IEEEauthorblockNtopspace{0.75ex} +%\def\@IEEEauthorblockAtopspace{0.75ex} +\def\@IEEEauthorblockNtopspace{0.0ex} +\def\@IEEEauthorblockAtopspace{0.0ex} +\ifCLASSOPTIONtransmag +% transmag uses one line of space above first affiliation block +\def\@IEEEauthorblockAtopspace{1\@IEEEnormalsizeunitybaselineskip} +\fi + +% baseline spacing within name and affiliation blocks (confmode) +% must be positive, spacings below certain values will make +% the position of line of text sensitive to the contents of the +% line above it i.e., whether or not the prior line has descenders, +% subscripts, etc. For this reason it is a good idea to keep +% these above 2.6ex +\def\@IEEEauthorblockNinterlinespace{2.6ex} +\def\@IEEEauthorblockAinterlinespace{2.75ex} + +% This tracks the required strut size. +% See the \@IEEEauthorhalign command for the actual default value used. +\def\@IEEEauthorblockXinterlinespace{2.7ex} + +% variables to retain font size and style across groups +% values given here have no effect as they will be overwritten later +\gdef\@IEEESAVESTATEfontsize{10} +\gdef\@IEEESAVESTATEfontbaselineskip{12} +\gdef\@IEEESAVESTATEfontencoding{OT1} +\gdef\@IEEESAVESTATEfontfamily{ptm} +\gdef\@IEEESAVESTATEfontseries{m} +\gdef\@IEEESAVESTATEfontshape{n} + +% saves the current font attributes +\def\@IEEEcurfontSAVE{\global\let\@IEEESAVESTATEfontsize\f@size% +\global\let\@IEEESAVESTATEfontbaselineskip\f@baselineskip% +\global\let\@IEEESAVESTATEfontencoding\f@encoding% +\global\let\@IEEESAVESTATEfontfamily\f@family% +\global\let\@IEEESAVESTATEfontseries\f@series% +\global\let\@IEEESAVESTATEfontshape\f@shape} + +% restores the saved font attributes +\def\@IEEEcurfontRESTORE{\fontsize{\@IEEESAVESTATEfontsize}{\@IEEESAVESTATEfontbaselineskip}% +\fontencoding{\@IEEESAVESTATEfontencoding}% +\fontfamily{\@IEEESAVESTATEfontfamily}% +\fontseries{\@IEEESAVESTATEfontseries}% +\fontshape{\@IEEESAVESTATEfontshape}% +\selectfont} + + +% variable to indicate if the current block is the first block in the column +\newif\if@IEEEprevauthorblockincol \@IEEEprevauthorblockincolfalse + + +% the command places a strut with height and depth = \@IEEEauthorblockXinterlinespace +% we use this technique to have complete manual control over the spacing of the lines +% within the halign environment. +% We set the below baseline portion at 30%, the above +% baseline portion at 70% of the total length. +% Responds to changes in the document's \baselinestretch +\def\@IEEEauthorstrutrule{\@IEEEtrantmpdimenA\@IEEEauthorblockXinterlinespace% +\@IEEEtrantmpdimenA=\baselinestretch\@IEEEtrantmpdimenA% +\rule[-0.3\@IEEEtrantmpdimenA]{0pt}{\@IEEEtrantmpdimenA}} + + +% blocks to hold the authors' names and affilations. +% Makes formatting easy for conferences +% +% use real definitions in conference mode +% name block +\def\IEEEauthorblockN#1{\relax\@IEEEauthorblockNstyle% set the default text style +\gdef\@IEEEauthorblockXinterlinespace{0pt}% disable strut for spacer row +% the \expandafter hides the \cr in conditional tex, see the array.sty docs +% for details, probably not needed here as the \cr is in a macro +% do a spacer row if needed +\if@IEEEprevauthorblockincol\expandafter\@IEEEauthorblockNtopspaceline\fi +\global\@IEEEprevauthorblockincoltrue% we now have a block in this column +%restore the correct strut value +\gdef\@IEEEauthorblockXinterlinespace{\@IEEEauthorblockNinterlinespace}% +% input the author names +#1% +% end the row if the user did not already +\crcr} +% spacer row for names +\def\@IEEEauthorblockNtopspaceline{\cr\noalign{\vskip\@IEEEauthorblockNtopspace}} +% +% affiliation block +\def\IEEEauthorblockA#1{\relax\@IEEEauthorblockAstyle% set the default text style +\gdef\@IEEEauthorblockXinterlinespace{0pt}%disable strut for spacer row +% the \expandafter hides the \cr in conditional tex, see the array.sty docs +% for details, probably not needed here as the \cr is in a macro +% do a spacer row if needed +\if@IEEEprevauthorblockincol\expandafter\@IEEEauthorblockAtopspaceline\fi +\global\@IEEEprevauthorblockincoltrue% we now have a block in this column +%restore the correct strut value +\gdef\@IEEEauthorblockXinterlinespace{\@IEEEauthorblockAinterlinespace}% +% input the author affiliations +#1% +% end the row if the user did not already +\crcr +% V1.8 transmag does not use any additional affiliation spacing after the first author +\ifCLASSOPTIONtransmag\gdef\@IEEEauthorblockAtopspace{0pt}\fi} + +% spacer row for affiliations +\def\@IEEEauthorblockAtopspaceline{\cr\noalign{\vskip\@IEEEauthorblockAtopspace}} + + +% allow papers to compile even if author blocks are used in modes other +% than conference or peerreviewca. For such cases, we provide dummy blocks. +\ifCLASSOPTIONconference +\else + \ifCLASSOPTIONpeerreviewca\else + % not conference, peerreviewca or transmag mode + \ifCLASSOPTIONtransmag\else + \def\IEEEauthorblockN#1{#1}% + \def\IEEEauthorblockA#1{#1}% + \fi + \fi +\fi + + + +% we provide our own halign so as not to have to depend on tabular +\def\@IEEEauthorhalign{\@IEEEauthordefaulttextstyle% default text style + \lineskip=0pt\relax% disable line spacing + \lineskiplimit=0pt\relax% + \baselineskip=0pt\relax% + \@IEEEcurfontSAVE% save the current font + \mathsurround\z@\relax% no extra spacing around math + \let\\\@IEEEauthorhaligncr% replace newline with halign friendly one + \tabskip=0pt\relax% no column spacing + \everycr{}% ensure no problems here + \@IEEEprevauthorblockincolfalse% no author blocks yet + \def\@IEEEauthorblockXinterlinespace{2.7ex}% default interline space + \vtop\bgroup%vtop box + \halign\bgroup&\relax\hfil\@IEEEcurfontRESTORE\relax ##\relax + \hfil\@IEEEcurfontSAVE\@IEEEauthorstrutrule\cr} + +% ensure last line, exit from halign, close vbox +\def\end@IEEEauthorhalign{\crcr\egroup\egroup} + +% handle bogus star form +\def\@IEEEauthorhaligncr{{\ifnum0=`}\fi\@ifstar{\@@IEEEauthorhaligncr}{\@@IEEEauthorhaligncr}} + +% test and setup the optional argument to \\[] +\def\@@IEEEauthorhaligncr{\@testopt\@@@IEEEauthorhaligncr\z@skip} + +% end the line and do the optional spacer +\def\@@@IEEEauthorhaligncr[#1]{\ifnum0=`{\fi}\cr\noalign{\vskip#1\relax}} + + + +% flag to prevent multiple \and warning messages +\newif\if@IEEEWARNand +\@IEEEWARNandtrue + +% if in conference or peerreviewca modes, we support the use of \and as \author is a +% tabular environment, otherwise we warn the user that \and is invalid +% outside of conference or peerreviewca modes. +\def\and{\relax} % provide a bogus \and that we will then override + +\renewcommand{\and}[1][\relax]{\if@IEEEWARNand\typeout{** WARNING: \noexpand\and is valid only + when in conference or peerreviewca}\typeout{modes (line \the\inputlineno).}\fi\global\@IEEEWARNandfalse} + +\ifCLASSOPTIONconference% +\renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}% +\fi +\ifCLASSOPTIONpeerreviewca +\renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}% +\fi +% V1.8 transmag uses conference author format +\ifCLASSOPTIONtransmag +\renewcommand{\and}[1][\hfill]{\end{@IEEEauthorhalign}#1\begin{@IEEEauthorhalign}}% +\fi + +% page clearing command +% based on LaTeX2e's \cleardoublepage, but allows different page styles +% for the inserted blank pages +\def\@IEEEcleardoublepage#1{\clearpage\if@twoside\ifodd\c@page\else +\hbox{}\thispagestyle{#1}\newpage\if@twocolumn\hbox{}\thispagestyle{#1}\newpage\fi\fi\fi} + +% V1.8b hooks to allow adjustment of space above title +\def\IEEEtitletopspace{0.5\baselineskip} +% an added extra amount to allow for adjustment/offset +\def\IEEEtitletopspaceextra{0pt} + +% user command to invoke the title page +\def\maketitle{\par% + \begingroup% + \normalfont% + \def\thefootnote{}% the \thanks{} mark type is empty + \def\footnotemark{}% and kill space from \thanks within author + \let\@makefnmark\relax% V1.7, must *really* kill footnotemark to remove all \textsuperscript spacing as well. + \footnotesize% equal spacing between thanks lines + \footnotesep 0.7\baselineskip%see global setting of \footnotesep for more info + % V1.7 disable \thanks note indention for compsoc + \@IEEEcompsoconly{\long\def\@makefntext##1{\parindent 1em\noindent\hbox{\@makefnmark}##1}}% + \normalsize% + \ifCLASSOPTIONpeerreview + \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext% + \thispagestyle{IEEEpeerreviewcoverpagestyle}\@thanks% + \else + \if@twocolumn% + \ifCLASSOPTIONtechnote% + \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext% + \else + \twocolumn[{\IEEEquantizevspace{\@maketitle}[\IEEEquantizedisabletitlecmds]{0pt}[-\topskip]{\baselineskip}{\@IEEENORMtitlevspace}{\@IEEEMINtitlevspace}\@IEEEaftertitletext}]% + \fi + \else + \newpage\global\@topnum\z@ \@maketitle\@IEEEstatictitlevskip\@IEEEaftertitletext% + \fi + \thispagestyle{IEEEtitlepagestyle}\@thanks% + \fi + % pullup page for pubid if used. + \if@IEEEusingpubid + \enlargethispage{-\@IEEEpubidpullup}% + \fi + \endgroup + \setcounter{footnote}{0}\let\maketitle\relax\let\@maketitle\relax + \gdef\@thanks{}% + % v1.6b do not clear these as we will need the title again for peer review papers + % \gdef\@author{}\gdef\@title{}% + \let\thanks\relax} + + +% V1.8 parbox to format \@IEEEtitleabstractindextext +\long\def\@IEEEtitleabstractindextextbox#1{\parbox{1\textwidth}{#1}} +% V1.8 compsoc is partial width +\ifCLASSOPTIONcompsoc +% comparison with proofs suggests it's in the range of 92.1-92.3% +\long\def\@IEEEtitleabstractindextextbox#1{\parbox{0.922\textwidth}{\@IEEEcompsocnotconfonly{\rightskip\@flushglue\leftskip\z@skip}#1}} +\fi + +% formats the Title, authors names, affiliations and special paper notice +% THIS IS A CONTROLLED SPACING COMMAND! Do not allow blank lines or unintentional +% spaces to enter the definition - use % at the end of each line +\def\@maketitle{\newpage +\bgroup\par\vskip\IEEEtitletopspace\vskip\IEEEtitletopspaceextra\centering% +\ifCLASSOPTIONtechnote% technotes, V1.8a abstract and index terms are not treated differently for compsoc technotes + {\bfseries\large\@IEEEcompsoconly{\Large\sffamily}\@title\par}\vskip 1.3em{\lineskip .5em\@IEEEcompsoconly{\large\sffamily}\@author + \@IEEEspecialpapernotice\par}\relax +\else% not a technote + \vskip0.2em{\Huge\ifCLASSOPTIONtransmag\bfseries\LARGE\fi\@IEEEcompsoconly{\sffamily}\@IEEEcompsocconfonly{\normalfont\normalsize\vskip 2\@IEEEnormalsizeunitybaselineskip + \bfseries\Large}\@IEEEcompsocnotconfonly{\vskip 0.75\@IEEEnormalsizeunitybaselineskip}\@title\par}\relax + \@IEEEcompsocnotconfonly{\vskip 0.5\@IEEEnormalsizeunitybaselineskip}\vskip1.0em\par% + % V1.6 handle \author differently if in conference mode + \ifCLASSOPTIONconference% + {\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace% + \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par}\relax + \else% peerreviewca, peerreview or journal + \ifCLASSOPTIONpeerreviewca + % peerreviewca handles author names just like conference mode + {\@IEEEcompsoconly{\sffamily}\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace% + \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par + {\@IEEEcompsoconly{\vskip 1.5em\relax + \@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\par\noindent\hfill + \IEEEcompsocdiamondline\hfill\hbox{}\par}}}\relax + \else% journal, peerreview or transmag + \ifCLASSOPTIONtransmag + % transmag also handles author names just like conference mode + % it also uses \@IEEEtitleabstractindextex, but with one line less + % space above, and one more below + {\@IEEEspecialpapernotice\mbox{}\vskip\@IEEEauthorblockconfadjspace% + \mbox{}\hfill\begin{@IEEEauthorhalign}\@author\end{@IEEEauthorhalign}\hfill\mbox{}\par + {\vspace{0.5\baselineskip}\relax\@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\vspace{-1\baselineskip}\par}}\relax + \else% journal or peerreview + {\lineskip.5em\@IEEEcompsoconly{\sffamily}\sublargesize\@author\@IEEEspecialpapernotice\par + {\@IEEEcompsoconly{\vskip 1.5em\relax + \@IEEEtitleabstractindextextbox{\@IEEEtitleabstractindextext}\par\noindent\hfill + \IEEEcompsocdiamondline\hfill\hbox{}\par}}}\relax + \fi + \fi + \fi +\fi\par\addvspace{0.5\baselineskip}\egroup} + + +% V1.7 Computer Society "diamond line" which follows index terms for nonconference papers +% V1.8a full width diamond line for single column use +\def\@IEEEcompsocdiamondlinei{\vrule depth 0pt height 0.5pt width 4cm\nobreak\hspace{7.5pt}\nobreak +\raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak +\hspace{7.5pt}\nobreak\vrule depth 0pt height 0.5pt width 4cm\relax} +% V1.8a narrower width diamond line for double column use +\def\@IEEEcompsocdiamondlineii{\vrule depth 0pt height 0.5pt width 2.5cm\nobreak\hspace{7.5pt}\nobreak +\raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak +\hspace{7.5pt}\nobreak\vrule depth 0pt height 0.5pt width 2.5cm\relax} +% V1.8a bare core without rules to base a last resort on for very narrow linewidths +\def\@IEEEcompsocdiamondlineiii{\mbox{}\nobreak\hspace{7.5pt}\nobreak +\raisebox{-3.5pt}{\fontfamily{pzd}\fontencoding{U}\fontseries{m}\fontshape{n}\fontsize{11}{12}\selectfont\char70}\nobreak +\hspace{7.5pt}\nobreak\mbox{}\relax} + +% V1.8a allow \IEEEcompsocdiamondline to adjust for different linewidths. +% Use \@IEEEcompsocdiamondlinei if its width is less than 0.66\linewidth (0.487 nominal for single column) +% if not, fall back to \@IEEEcompsocdiamondlineii if its width is less than 0.75\linewidth (0.659 nominal for double column) +% if all else fails, try to make a custom diamondline based on the abnormally narrow linewidth +\def\IEEEcompsocdiamondline{\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlinei}\relax +\ifdim\@IEEEtrantmpdimenA<0.66\linewidth\relax\@IEEEcompsocdiamondlinei\relax +\else +\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlineii}\relax +\ifdim\@IEEEtrantmpdimenA<0.75\linewidth\relax\@IEEEcompsocdiamondlineii\relax +\else +\settowidth{\@IEEEtrantmpdimenA}{\@IEEEcompsocdiamondlineiii}\relax +\@IEEEtrantmpdimenB=\linewidth\relax +\addtolength{\@IEEEtrantmpdimenB}{-1\@IEEEtrantmpdimenA}\relax +\vrule depth 0pt height 0.5pt width 0.33\@IEEEtrantmpdimenB\@IEEEcompsocdiamondlineiii\vrule depth 0pt height 0.5pt width 0.33\@IEEEtrantmpdimenB\relax +\fi\fi} + + +% V1.7 standard LateX2e \thanks, but with \itshape under compsoc. Also make it a \long\def +% We also need to trigger the one-shot footnote rule +\def\@IEEEtriggeroneshotfootnoterule{\global\@IEEEenableoneshotfootnoteruletrue} + + +\long\def\thanks#1{\footnotemark + \protected@xdef\@thanks{\@thanks + \protect\footnotetext[\the\c@footnote]{\@IEEEcompsoconly{\itshape + \protect\@IEEEtriggeroneshotfootnoterule\relax}\ignorespaces#1}}} +\let\@thanks\@empty + + +% V1.7 allow \author to contain \par's. This is needed to allow \thanks to contain \par. +\long\def\author#1{\gdef\@author{#1}} + + +% in addition to setting up IEEEitemize, we need to remove a baselineskip space above and +% below it because \list's \pars introduce blank lines because of the footnote struts. +\def\@IEEEsetupcompsocitemizelist{\def\labelitemi{$\bullet$}% +\setlength{\IEEElabelindent}{0pt}\setlength{\labelsep}{1.2em}\setlength{\parskip}{0pt}% +\setlength{\partopsep}{0pt}\setlength{\topsep}{0.5\baselineskip}\vspace{-1\baselineskip}\relax} + + +% flag for fake non-compsoc \IEEEcompsocthanksitem - prevents line break on very first item +\newif\if@IEEEbreakcompsocthanksitem \@IEEEbreakcompsocthanksitemfalse + +\ifCLASSOPTIONcompsoc +% V1.7 compsoc bullet item \thanks +% also, we need to redefine this to destroy the argument in \IEEEquantizevspace +\long\def\IEEEcompsocitemizethanks#1{\relax\@IEEEbreakcompsocthanksitemfalse\footnotemark + \protected@xdef\@thanks{\@thanks + \protect\footnotetext[\the\c@footnote]{\itshape\protect\@IEEEtriggeroneshotfootnoterule + {\let\IEEEiedlistdecl\relax\protect\begin{IEEEitemize}[\protect\@IEEEsetupcompsocitemizelist]\ignorespaces#1\relax + \protect\end{IEEEitemize}}\protect\vspace{-1\baselineskip}}}} +\DeclareRobustCommand*{\IEEEcompsocthanksitem}{\item} +\else +% non-compsoc, allow for dual compilation via rerouting to normal \thanks +\long\def\IEEEcompsocitemizethanks#1{\thanks{#1}} +% redirect to "pseudo-par" \hfil\break\indent after swallowing [] from \IEEEcompsocthanksitem[] +\DeclareRobustCommand{\IEEEcompsocthanksitem}{\@ifnextchar [{\@IEEEthanksswallowoptionalarg}% +{\@IEEEthanksswallowoptionalarg[\relax]}} +% be sure and break only after first item, be sure and ignore spaces after optional argument +\def\@IEEEthanksswallowoptionalarg[#1]{\relax\if@IEEEbreakcompsocthanksitem\hfil\break +\indent\fi\@IEEEbreakcompsocthanksitemtrue\ignorespaces} +\fi + + +% V1.6b define the \IEEEpeerreviewmaketitle as needed +\ifCLASSOPTIONpeerreview +\def\IEEEpeerreviewmaketitle{\@IEEEcleardoublepage{empty}% +\ifCLASSOPTIONtwocolumn +\twocolumn[{\IEEEquantizevspace{\@IEEEpeerreviewmaketitle}[\IEEEquantizedisabletitlecmds]{0pt}[-\topskip]{\baselineskip}{\@IEEENORMtitlevspace}{\@IEEEMINtitlevspace}}] +\else +\newpage\@IEEEpeerreviewmaketitle\@IEEEstatictitlevskip +\fi +\thispagestyle{IEEEtitlepagestyle}} +\else +% \IEEEpeerreviewmaketitle does nothing if peer review option has not been selected +\def\IEEEpeerreviewmaketitle{\relax} +\fi + +% peerreview formats the repeated title like the title in journal papers. +\def\@IEEEpeerreviewmaketitle{\bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEcompsoconly{\sffamily}% +\normalfont\normalsize\vskip0.2em{\Huge\@title\par}\vskip1.0em\par +\par\addvspace{0.5\baselineskip}\egroup} + + + +% V1.6 +% this is a static rubber spacer between the title/authors and the main text +% used for single column text, or when the title appears in the first column +% of two column text (technotes). +\def\@IEEEstatictitlevskip{{\normalfont\normalsize +% adjust spacing to next text +% v1.6b handle peer review papers +\ifCLASSOPTIONpeerreview +% for peer review papers, the same value is used for both title pages +% regardless of the other paper modes + \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip +\else + \ifCLASSOPTIONconference% conference + \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip% + \else% + \ifCLASSOPTIONtechnote% technote + \vskip 1\baselineskip plus 0.375\baselineskip minus 0.1875\baselineskip% + \else% journal uses more space + \vskip 2.5\baselineskip plus 0.75\baselineskip minus 0.375\baselineskip% + \fi + \fi +\fi}} + + +% set the nominal and minimum values for the quantized title spacer +% the quantization algorithm will not allow the spacer size to +% become less than \@IEEEMINtitlevspace - instead it will be lengthened +% default to journal values +\def\@IEEENORMtitlevspace{2.5\baselineskip} +\def\@IEEEMINtitlevspace{2\baselineskip} +% conferences and technotes need tighter spacing +\ifCLASSOPTIONconference% conference + \def\@IEEENORMtitlevspace{1\baselineskip} + \def\@IEEEMINtitlevspace{0.75\baselineskip} +\fi +\ifCLASSOPTIONtechnote% technote + \def\@IEEENORMtitlevspace{1\baselineskip} + \def\@IEEEMINtitlevspace{0.75\baselineskip} +\fi + + +% V1.8a +\def\IEEEquantizevspace{\begingroup\@ifstar{\@IEEEquantizevspacestarformtrue\@IEEEquantizevspace}{\@IEEEquantizevspacestarformfalse\@IEEEquantizevspace}} +% \IEEEquantizevspace[output dimen register]{object}[object decl] +% {top baselineskip} +% [offset][prevdepth][lineskip limit][lineskip] +% {unit height}{nominal vspace}{minimum vspace} +% +% Calculates and creates the vspace needed to make the combined height with +% the given object an integer multiple of the given unit height. This command +% is more general than the older \@IEEEdynamictitlevspace it replaces. +% +% The star form has no effect at present, but is reserved for future use. +% +% If the optional argument [output dimen register] is given, the calculated +% vspace height is stored in the given output dimen (or skip) register +% and no other action is taken, otherwise the object followed by a vspace* +% of the appropriate height is evaluated/output. +% +% The optional object decl (declarations) is code that is evaluated just +% before the object's height is evaluated. Its intented purpose is to allow +% for the alteration or disabling of code within the object during internal +% height evaluation (e.g., \long\def\thanks#1{\relax} ). +% This special code is not invoked if/when the object is rendered at the end. +% +% The nominal vspace is the target value of the added vspace and the minimum +% vspace is the lower allowed limit. The vspacer will be the value that achieves +% integral overall height, in terms of the given unit height, that is closest +% to the nominal vspace and that is not less than the specified minimum vspace. +% +% The line spacing algorithm of TeX is somewhat involved and requires special +% care with regard to the first line of a vertical list (which is indicated +% when \prevdepth is -1000pt or less). top baselineskip specifies the +% baselineskip or topskip used prior to the object. If the height of the +% first line of the object is greater than the given top baselineskip, then +% the top baselineskip is subtracted from the height of the first line and +% that difference is considered along with the rest of the object height +% (because the object will be shifted down by an amount = +% top line height - top baselineskip). Otherwise, the height of the first line +% of the object is ignored as far as the calculations are concerned. +% This algorithm is adequate for objects that appear at the top of a page +% (e.g., titles) where \topskip spacing is used. +% +% However, as explained on page 78 of the TeXbook, interline spacing is more +% complex when \baselineskip is being used (indicated by \prevdepth > +% -1000pt). The four optional parameters offset, prevdepth, lineskip limit and +% lineskip are assumed to be equal to be 0pt, \prevdepth, \lineskiplimit and +% \lineskip, respectively, if they are omitted. +% +% The prevdepth is the depth of the line before the object, the lineskip limit +% specifies how close the top of the object can come to the bottom of the +% previous line before \baselineskip is ignored and \lineskip is inserted +% between the object and the line above it. Lineskip does not come into +% play unless the first line of the object is high enough to "get too close" +% (as specified by lineskiplimit) to the line before it. The the prevdepth, +% lineskip limit, and lineskip optional parameters are not needed for the +% first object/line on a page (i.e., prevdepth <= -1000pt) where the simplier +% \topskip spacing rules are in effect. +% +% Offset is a manual adjustment that is added to the height calculations of +% object irrespective of the value of \prevdepth. It is useful when the top +% baselineskip will result in a noninteger unit height object placement even +% if the object itself has integral height. e.g., a footnotesize baselineskip +% is used before the object, thus an offset of, say -3pt, can be given as a +% correction. + +% Common combinations of these parameters include: +% +% top baselineskip: (and default values for offset, prevdepth, etc.) +% \topskip % for objects that appear at the top of a page +% \maxdimen % always ignore the height of the top line +% 0pt % always consider any positive height of the top line +% +% for objects to appear inline in normal text: +% top baselineskip = \baselineskip +% +% set prevdepth = -1000pt and top baselineskip = 0pt to consider the +% overall height of the object without any other external skip +% consideration + +\newif\if@IEEEquantizevspacestarform % flag to indicate star form +\newif\if@IEEEquantizevspaceuseoutdimenreg % flag to indicate output dimen register is to be used +% Use our own private registers because the object could contain a +% structure that uses the existing tmp scratch pad registers +\newdimen\@IEEEquantizeheightA +\newdimen\@IEEEquantizeheightB +\newdimen\@IEEEquantizeheightC +\newdimen\@IEEEquantizeprevdepth % need to save this early as can change +\newcount\@IEEEquantizemultiple +\newbox\@IEEEquantizeboxA + + +\def\@IEEEquantizevspace{\@ifnextchar [{\@IEEEquantizevspaceuseoutdimenregtrue\@@IEEEquantizevspace}{\@IEEEquantizevspaceuseoutdimenregfalse\@@IEEEquantizevspace[]}} + + +\long\def\@@IEEEquantizevspace[#1]#2{\relax +% acquire and store +% #1 optional output dimen register +% #2 object +\edef\@IEEEquantizeoutdimenreg{#1}\relax +% allow for object specifications that contain parameters +\@IEEEtrantmptoksA={#2}\relax +\long\edef\@IEEEquantizeobject{\the\@IEEEtrantmptoksA}\relax +\@ifnextchar [{\@@@IEEEquantizevspace}{\@@@IEEEquantizevspace[\relax]}} + +\long\def\@@@IEEEquantizevspace[#1]#2{\relax +% acquire and store +% [#1] optional object decl, is \relax if not given by user +% #2 top baselineskip +% allow for object decl specifications that have parameters +\@IEEEtrantmptoksA={#1}\relax +\long\edef\@IEEEquantizeobjectdecl{\the\@IEEEtrantmptoksA}\relax +\edef\@IEEEquantizetopbaselineskip{#2}\ivIEEEquantizevspace} + +% acquire optional argument set and store +% [offset][prevdepth][lineskip limit][lineskip] +\def\ivIEEEquantizevspace{\@ifnextchar [{\@vIEEEquantizevspace}{\@vIEEEquantizevspace[0pt]}} +\def\@vIEEEquantizevspace[#1]{\edef\@IEEEquantizeoffset{#1}\@ifnextchar [{\@viIEEEquantizevspace}{\@viIEEEquantizevspace[\prevdepth]}} +\def\@viIEEEquantizevspace[#1]{\@IEEEquantizeprevdepth=#1\relax\@ifnextchar [{\@viiIEEEquantizevspace}{\@viiIEEEquantizevspace[\lineskiplimit]}} +\def\@viiIEEEquantizevspace[#1]{\edef\@IEEEquantizelineskiplimit{#1}\@ifnextchar [{\@viiiIEEEquantizevspace}{\@viiiIEEEquantizevspace[\lineskip]}} +\def\@viiiIEEEquantizevspace[#1]{\edef\@IEEEquantizelineskip{#1}\@ixIEEEquantizevspace} + +% main routine +\def\@ixIEEEquantizevspace#1#2#3{\relax +\edef\@IEEEquantizeunitheight{#1}\relax +\edef\@IEEEquantizenomvspace{#2}\relax +\edef\@IEEEquantizeminvspace{#3}\relax +% \@IEEEquantizeoutdimenreg +% \@IEEEquantizeobject +% \@IEEEquantizeobjectdecl +% \@IEEEquantizetopbaselineskip +% \@IEEEquantizeoffset +% \@IEEEquantizeprevdepth +% \@IEEEquantizelineskiplimit +% \@IEEEquantizelineskip +% \@IEEEquantizeunitheight +% \@IEEEquantizenomvspace +% \@IEEEquantizeminvspace +% get overall height of object +\setbox\@IEEEquantizeboxA\vbox{\begingroup\@IEEEquantizeobjectdecl\@IEEEquantizeobject\relax\endgroup}\relax +\@IEEEquantizeheightA\ht\@IEEEquantizeboxA\relax +% get height of first line of object +\setbox\@IEEEquantizeboxA\vtop{\begingroup\@IEEEquantizeobjectdecl\@IEEEquantizeobject\relax\endgroup}\relax +\@IEEEquantizeheightB\ht\@IEEEquantizeboxA\relax +\ifdim\@IEEEquantizeprevdepth>-1000pt\relax % prevdepth > -1000pf means full baselineskip\lineskip rules in effect +% lineskip spacing rule takes effect if height of top line > baselineskip - prevdepth - lineskiplimit, +% otherwise the baselineskip rule is in effect and the height of the first line does not matter at all. +\@IEEEquantizeheightC=\@IEEEquantizetopbaselineskip\relax +\advance\@IEEEquantizeheightC-\@IEEEquantizeprevdepth\relax +\advance\@IEEEquantizeheightC-\@IEEEquantizelineskiplimit\relax % this works even though \@IEEEquantizelineskiplimit is a macro because TeX allows --10pt notation +\ifdim\@IEEEquantizeheightB>\@IEEEquantizeheightC\relax +% lineskip spacing rule is in effect i.e., the object is going to be shifted down relative to the +% baselineskip set position by its top line height (already a part of the total height) + prevdepth + lineskip - baselineskip +\advance\@IEEEquantizeheightA\@IEEEquantizeprevdepth\relax +\advance\@IEEEquantizeheightA\@IEEEquantizelineskip\relax +\advance\@IEEEquantizeheightA-\@IEEEquantizetopbaselineskip\relax +\else +% height of first line <= \@IEEEquantizetopbaselineskip - \@IEEEquantizeprevdepth - \@IEEEquantizelineskiplimit +% standard baselineskip rules are in effect, so don't consider height of first line +\advance\@IEEEquantizeheightA-\@IEEEquantizeheightB\relax +\fi +% +\else % prevdepth <= -1000pt, simplier \topskip type rules in effect +\ifdim\@IEEEquantizeheightB>\@IEEEquantizetopbaselineskip +% height of top line (already included in the total height) in excess of +% baselineskip is the amount it will be downshifted +\advance\@IEEEquantizeheightA-\@IEEEquantizetopbaselineskip\relax +\else +% height of first line is irrelevant, remove it +\advance\@IEEEquantizeheightA-\@IEEEquantizeheightB\relax +\fi +\fi % prevdepth <= -1000pt +% +% adjust height for any manual offset +\advance\@IEEEquantizeheightA\@IEEEquantizeoffset\relax +% add in nominal spacer +\advance\@IEEEquantizeheightA\@IEEEquantizenomvspace\relax +% check for nonzero unitheight +\@IEEEquantizeheightB=\@IEEEquantizeunitheight\relax +\ifnum\@IEEEquantizeheightB=0\relax +\@IEEEclspkgerror{IEEEquantizevspace unit height cannot be zero. Assuming 10pt.}% +{Division by zero is not allowed.} +\@IEEEquantizeheightB=10pt\relax +\fi +% get integer number of lines +\@IEEEquantizemultiple=\@IEEEquantizeheightA\relax +\divide\@IEEEquantizemultiple\@IEEEquantizeheightB\relax +% set A to contain the excess height over the \@IEEEquantizemultiple of lines +% A = height - multiple*unitheight +\@IEEEquantizeheightC\@IEEEquantizeheightB\relax +\multiply\@IEEEquantizeheightC\@IEEEquantizemultiple\relax +\advance\@IEEEquantizeheightA-\@IEEEquantizeheightC\relax +% set B to contain the height short of \@IEEEquantizemultiple+1 of lines +% B = unitheight - A +\advance\@IEEEquantizeheightB-\@IEEEquantizeheightA\relax +% choose A or B based on which is closer +\@IEEEquantizeheightC\@IEEEquantizenomvspace\relax +\ifdim\@IEEEquantizeheightA<\@IEEEquantizeheightB\relax +% C = nomvspace - A, go with lower +\advance\@IEEEquantizeheightC-\@IEEEquantizeheightA\relax +\else +% C = nomvspace + B, go with upper +\advance\@IEEEquantizeheightC\@IEEEquantizeheightB\relax +\fi +% if violate lower bound, use next integer bound +\ifdim\@IEEEquantizeheightC<\@IEEEquantizeminvspace\relax +% A + B = unitheight +\advance\@IEEEquantizeheightC\@IEEEquantizeheightA\relax +\advance\@IEEEquantizeheightC\@IEEEquantizeheightB\relax +\fi +% export object and spacer outside of group +\global\let\@IEEEquantizeobjectout\@IEEEquantizeobject\relax +\global\@IEEEquantizeheightC\@IEEEquantizeheightC\relax +\endgroup +\if@IEEEquantizevspaceuseoutdimenreg +\@IEEEquantizeoutdimenreg=\@IEEEquantizeheightC\relax +\else +\@IEEEquantizeobjectout\relax +\vskip\@IEEEquantizeheightC\relax +\fi} + + +% user command to disable all global assignments, possible use within object decl +\def\IEEEquantizedisableglobal{\let\global\relax +\let\gdef\def +\let\xdef\edef} +% user command to allow for the disabling of \thanks and other commands, possible use within object decl +\def\IEEEquantizedisabletitlecmds{\long\def\thanks##1{\relax}\relax +\long\def\IEEEcompsocitemizethanks##1{\relax}\def\newpage{\relax}} + + + + + +% V1.6 +% we allow the user access to the last part of the title area +% useful in emergencies such as when a different spacing is needed +% This text is NOT compensated for in the dynamic sizer. +\let\@IEEEaftertitletext=\relax +\long\def\IEEEaftertitletext#1{\def\@IEEEaftertitletext{#1}} + + +% V1.7 provide a way for users to enter abstract and keywords +% into the onecolumn title are. This text is compensated for +% in the dynamic sizer. +\let\@IEEEtitleabstractindextext=\relax +\long\def\IEEEtitleabstractindextext#1{\def\@IEEEtitleabstractindextext{#1}} + +% V1.7 provide a way for users to get the \@IEEEtitleabstractindextext if +% not in compsoc or transmag journal mode - this way abstract and keywords +% can still be placed in their conventional position if not in those modes. +\def\IEEEdisplaynontitleabstractindextext{% +% display for all conference formats +\ifCLASSOPTIONconference\@IEEEtitleabstractindextext\relax +\else% non-conferences + % V1.8a display for all technotes + \ifCLASSOPTIONtechnote\@IEEEtitleabstractindextext\relax + % V1.8a add diamond line after abstract and index terms for compsoc technotes + \@IEEEcompsoconly{\noindent\hfill\IEEEcompsocdiamondline\hfill\hbox{}\par}\relax + \else % non-conferences and non-technotes + \ifCLASSOPTIONcompsoc% display if not compsoc and not transmag + \else + \ifCLASSOPTIONtransmag + \else% not compsoc journal nor transmag journal + \@IEEEtitleabstractindextext\relax + \fi + \fi + \fi +\fi} + + +% command to allow alteration of baselinestretch, but only if the current +% baselineskip is unity. Used to tweak the compsoc abstract and keywords line spacing. +\def\@IEEEtweakunitybaselinestretch#1{{\def\baselinestretch{1}\selectfont +\global\@tempskipa\baselineskip}\ifnum\@tempskipa=\baselineskip% +\def\baselinestretch{#1}\selectfont\fi\relax} + + +% abstract and keywords are in \small, except +% for 9pt docs in which they are in \footnotesize +% Because 9pt docs use an 8pt footnotesize, \small +% becomes a rather awkward 8.5pt +\def\@IEEEabskeysecsize{\small} +\ifx\CLASSOPTIONpt\@IEEEptsizenine + \def\@IEEEabskeysecsize{\footnotesize} +\fi + +% compsoc journals use \footnotesize, compsoc conferences use normalsize +\@IEEEcompsoconly{\def\@IEEEabskeysecsize{\footnotesize}} +\@IEEEcompsocconfonly{\def\@IEEEabskeysecsize{\small}} + + +% V1.6 have abstract and keywords strip leading spaces, pars and newlines +% so that spacing is more tightly controlled. +\def\abstract{\normalfont + \if@twocolumn + \@IEEEabskeysecsize\bfseries\textit{\abstractname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} +% V1.6 The IEEE wants only 1 pica from end of abstract to introduction heading when in +% conference mode (the heading already has this much above it) +\def\endabstract{\relax\ifCLASSOPTIONconference\vspace{0ex}\else\vspace{1.34ex}\fi\par\if@twocolumn\else\endquotation\fi + \normalfont\normalsize} + +\def\IEEEkeywords{\normalfont + \if@twocolumn + \@IEEEabskeysecsize\bfseries\textit{\IEEEkeywordsname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} +\def\endIEEEkeywords{\relax\ifCLASSOPTIONtechnote\vspace{1.34ex}\else\vspace{0.67ex}\fi + \par\if@twocolumn\else\endquotation\fi% + \normalfont\normalsize} + +% V1.7 compsoc keywords index terms +\ifCLASSOPTIONcompsoc + \ifCLASSOPTIONconference% compsoc conference +\def\abstract{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\bfseries + \if@twocolumn + \@IEEEabskeysecsize\noindent\textit{\abstractname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} +\def\IEEEkeywords{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\bfseries + \if@twocolumn + \@IEEEabskeysecsize\vskip 0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip\noindent + \textit{\IEEEkeywordsname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} + \else% compsoc not conference +\def\abstract{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\sffamily + \if@twocolumn + \@IEEEabskeysecsize\noindent\textbf{\abstractname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize\textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} +\def\IEEEkeywords{\normalfont\@IEEEtweakunitybaselinestretch{1.15}\sffamily + \if@twocolumn + \@IEEEabskeysecsize\vskip 0.5\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip\noindent + \textbf{\IEEEkeywordsname}---\relax + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\@IEEEabskeysecsize\textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize% + \fi\@IEEEgobbleleadPARNLSP} + \fi +\fi + +% V1.8 transmag keywords index terms +% no abstract name, use indentation +\ifCLASSOPTIONtransmag +\def\abstract{\normalfont\parindent 1em\relax + \if@twocolumn + \@IEEEabskeysecsize\bfseries\indent + \else + \bgroup\par\addvspace{0.5\baselineskip}\centering\vspace{-1.78ex}\@IEEEabskeysecsize + \textbf{\abstractname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} + +\def\IEEEkeywords{\normalfont\parindent 1em\relax + \if@twocolumn + \@IEEEabskeysecsize\vspace{1\baselineskip}\bfseries\indent\textit{\IEEEkeywordsname}---\relax + \else + \bgroup\par\vspace{1\baselineskip}\centering\@IEEEabskeysecsize + \textbf{\IEEEkeywordsname}\par\addvspace{0.5\baselineskip}\egroup\quotation\@IEEEabskeysecsize + \fi\@IEEEgobbleleadPARNLSP} +\fi + + + +% gobbles all leading \, \\ and \par, upon finding first token that +% is not a \ , \\ or a \par, it ceases and returns that token +% +% used to strip leading \, \\ and \par from the input +% so that such things in the beginning of an environment will not +% affect the formatting of the text +\long\def\@IEEEgobbleleadPARNLSP#1{\let\@IEEEswallowthistoken=0% +\let\@IEEEgobbleleadPARNLSPtoken#1% +\let\@IEEEgobbleleadPARtoken=\par% +\let\@IEEEgobbleleadNLtoken=\\% +\let\@IEEEgobbleleadSPtoken=\ % +\def\@IEEEgobbleleadSPMACRO{\ }% +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadPARtoken% +\let\@IEEEswallowthistoken=1% +\fi% +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadNLtoken% +\let\@IEEEswallowthistoken=1% +\fi% +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadSPtoken% +\let\@IEEEswallowthistoken=1% +\fi% +% a control space will come in as a macro +% when it is the last one on a line +\ifx\@IEEEgobbleleadPARNLSPtoken\@IEEEgobbleleadSPMACRO% +\let\@IEEEswallowthistoken=1% +\fi% +% if we have to swallow this token, do so and taste the next one +% else spit it out and stop gobbling +\ifx\@IEEEswallowthistoken 1\let\@IEEEnextgobbleleadPARNLSP=\@IEEEgobbleleadPARNLSP\else% +\let\@IEEEnextgobbleleadPARNLSP=#1\fi% +\@IEEEnextgobbleleadPARNLSP}% + + + + +% TITLING OF SECTIONS +\def\@IEEEsectpunct{:\ \,} % Punctuation after run-in section heading (headings which are + % part of the paragraphs), need little bit more than a single space + % spacing from section number to title +% compsoc conferences use regular period/space punctuation +\ifCLASSOPTIONcompsoc +\ifCLASSOPTIONconference +\def\@IEEEsectpunct{.\ } +\fi\fi + + +\def\@seccntformat#1{\csname the#1dis\endcsname\hskip 0.5em\relax} + +\ifCLASSOPTIONcompsoc +% compsoc journals need extra spacing +\ifCLASSOPTIONconference\else +\def\@seccntformat#1{\csname the#1dis\endcsname\hskip 1em\relax} +\fi\fi + +%v1.7 put {} after #6 to allow for some types of user font control +%and use \@@par rather than \par +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + % load section label and spacer into \@svsec + \protected@edef\@svsec{\@seccntformat{#1}\relax}% + \fi% + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@% tempskipa determines whether is treated as a high + \begingroup #6{\relax% or low level heading + \noindent % subsections are NOT indented + % print top level headings. \@svsec is label, #8 is heading title + % The IEEE does not block indent the section title text, it flows like normal + {\hskip #3\relax\@svsec}{\interlinepenalty \@M #8\@@par}}% + \endgroup + \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth\relax\else + \protect\numberline{\csname the#1\endcsname}\fi#7}% + \else % printout low level headings + % svsechd seems to swallow the trailing space, protect it with \mbox{} + % got rid of sectionmark stuff + \def\@svsechd{#6{\hskip #3\relax\@svsec #8\@IEEEsectpunct\mbox{}}% + \addcontentsline{toc}{#1}{\ifnum #2>\c@secnumdepth\relax\else + \protect\numberline{\csname the#1\endcsname}\fi#7}}% + \fi%skip down + \@xsect{#5}} + + +% section* handler +%v1.7 put {} after #4 to allow for some types of user font control +%and use \@@par rather than \par +\def\@ssect#1#2#3#4#5{\@tempskipa #3\relax + \ifdim \@tempskipa>\z@ + %\begingroup #4\@hangfrom{\hskip #1}{\interlinepenalty \@M #5\par}\endgroup + % The IEEE does not block indent the section title text, it flows like normal + \begingroup \noindent #4{\relax{\hskip #1}{\interlinepenalty \@M #5\@@par}}\endgroup + % svsechd swallows the trailing space, protect it with \mbox{} + \else \def\@svsechd{#4{\hskip #1\relax #5\@IEEEsectpunct\mbox{}}}\fi + \@xsect{#3}} + + +%% SECTION heading spacing and font +%% +% arguments are: #1 - sectiontype name +% (for \@sect) #2 - section level +% #3 - section heading indent +% #4 - top separation (absolute value used, neg indicates not to indent main text) +% If negative, make stretch parts negative too! +% #5 - (absolute value used) positive: bottom separation after heading, +% negative: amount to indent main text after heading +% Both #4 and #5 negative means to indent main text and use negative top separation +% #6 - font control +% You've got to have \normalfont\normalsize in the font specs below to prevent +% trouble when you do something like: +% \section{Note}{\ttfamily TT-TEXT} is known to ... +% The IEEE sometimes REALLY stretches the area before a section +% heading by up to about 0.5in. However, it may not be a good +% idea to let LaTeX have quite this much rubber. +\ifCLASSOPTIONconference% +% The IEEE wants section heading spacing to decrease for conference mode +\def\section{\@startsection{section}{1}{\z@}{1.5ex plus 1.5ex minus 0.5ex}% +{0.7ex plus 1ex minus 0ex}{\normalfont\normalsize\centering\scshape}}% +\def\subsection{\@startsection{subsection}{2}{\z@}{1.5ex plus 1.5ex minus 0.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}% +\else % for journals +\def\section{\@startsection{section}{1}{\z@}{3.0ex plus 1.5ex minus 1.5ex}% V1.6 3.0ex from 3.5ex +{0.7ex plus 1ex minus 0ex}{\normalfont\normalsize\centering\scshape}}% +\def\subsection{\@startsection{subsection}{2}{\z@}{3.5ex plus 1.5ex minus 1.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}% +\fi + +% for both journals and conferences +% decided to put in a little rubber above the section, might help somebody +\def\subsubsection{\@startsection{subsubsection}{3}{\parindent}{0ex plus 0.1ex minus 0.1ex}% +{0ex}{\normalfont\normalsize\itshape}}% +\def\paragraph{\@startsection{paragraph}{4}{2\parindent}{0ex plus 0.1ex minus 0.1ex}% +{0ex}{\normalfont\normalsize\itshape}}% + + +% compsoc +\ifCLASSOPTIONcompsoc +\ifCLASSOPTIONconference +% compsoc conference +\def\section{\@startsection{section}{1}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}% +{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}{\normalfont\large\bfseries}}% +\def\subsection{\@startsection{subsection}{2}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}% +{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}{\normalfont\sublargesize\bfseries}}% +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{1\baselineskip plus 0.25\baselineskip minus 0.25\baselineskip}% +{0ex}{\normalfont\normalsize\bfseries}}% +\def\paragraph{\@startsection{paragraph}{4}{2\parindent}{0ex plus 0.1ex minus 0.1ex}% +{0ex}{\normalfont\normalsize}}% +\else% compsoc journals +% use negative top separation as compsoc journals do not indent paragraphs after section titles +\def\section{\@startsection{section}{1}{\z@}{-3.5ex plus -2ex minus -1.5ex}% +{0.7ex plus 1ex minus 0ex}{\normalfont\sublargesize\sffamily\bfseries\scshape}}% +% Note that subsection and smaller may not be correct for the Computer Society, +% I have to look up an example. +\def\subsection{\@startsection{subsection}{2}{\z@}{-3.5ex plus -1.5ex minus -1.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\sffamily\bfseries}}% +\def\subsubsection{\@startsection{subsubsection}{3}{\z@}{-2.5ex plus -1ex minus -1ex}% +{0.5ex plus 0.5ex minus 0ex}{\normalfont\normalsize\sffamily\itshape}}% +\def\paragraph{\@startsection{paragraph}{4}{2\parindent}{-0ex plus -0.1ex minus -0.1ex}% +{0ex}{\normalfont\normalsize}}% +\fi\fi + +% transmag +\ifCLASSOPTIONtransmag +\def\subsection{\@startsection{subsection}{2}{0.75\parindent}{3.5ex plus 1.5ex minus 1.5ex}% +{0.7ex plus .5ex minus 0ex}{\normalfont\normalsize\itshape}}% +\def\subsubsection{\@startsection{subsubsection}{3}{1.25\parindent}{0.1ex plus 0.1ex minus 0.1ex}% +{0.1ex}{\normalfont\normalsize\itshape}}% +\fi + + +% V1.8a provide for a raised line Introduction section for use with Computer +% Society papers. We have to remove any spacing glue after the section +% heading and then remove the blank line for the new paragraph after it. +% LaTeX's section handler alters \everypar and we need to propogate those +% changes outside of the \parbox lest there be spacing problems at the top +% of the next section. +\def\IEEEraisesectionheading#1{\noindent\raisebox{1.5\baselineskip}[0pt][0pt]{\parbox[b]{\columnwidth}{#1\unskip\global\everypar=\everypar}}\vspace{-1\baselineskip}\vspace{-\parskip}\par} + + + +%% ENVIRONMENTS +% "box" symbols at end of proofs +\def\IEEEQEDclosed{\mbox{\rule[0pt]{1.3ex}{1.3ex}}} % for a filled box +% V1.6 some journals use an open box instead that will just fit around a closed one +\def\IEEEQEDopen{{\setlength{\fboxsep}{0pt}\setlength{\fboxrule}{0.2pt}\fbox{\rule[0pt]{0pt}{1.3ex}\rule[0pt]{1.3ex}{0pt}}}} +\ifCLASSOPTIONcompsoc +\def\IEEEQED{\IEEEQEDopen} % default to open for compsoc +\else +\def\IEEEQED{\IEEEQEDclosed} % otherwise default to closed +\fi + +%V1.8 flag to indicate if QED symbol is to be shown +\newif\if@IEEEQEDshow \@IEEEQEDshowtrue +\def\IEEEproofindentspace{2\parindent}% V1.8 allow user to change indentation amount if desired +% v1.7 name change to avoid namespace collision with amsthm. Also add support +% for an optional argument. +\def\IEEEproof{\@ifnextchar[{\@IEEEproof}{\@IEEEproof[\IEEEproofname]}} +\def\@IEEEproof[#1]{\@IEEEQEDshowtrue\par\noindent\hspace{\IEEEproofindentspace}{\itshape #1: }} +\def\endIEEEproof{\if@IEEEQEDshow\hspace*{\fill}\nobreakspace\IEEEQED\fi\par} +% qedhere for equation environments, similar to AMS \qedhere +\def\IEEEQEDhereeqn{\global\@IEEEQEDshowfalse\eqno\let\eqno\relax\let\leqno\relax + \let\veqno\relax\hbox{\IEEEQED}} +% IEEE style qedhere for IEEEeqnarray and other environments +\def\IEEEQEDhere{\global\@IEEEQEDshowfalse\IEEEQED} +% command to disable QED at end of IEEEproof +\def\IEEEQEDoff{\global\@IEEEQEDshowfalse} + + +%\itemindent is set to \z@ by list, so define new temporary variable +\newdimen\@IEEEtmpitemindent + +\ifCLASSOPTIONcompsoc +% V1.8a compsoc uses bold theorem titles, a period instead of a colon, vertical spacing, and hanging indentation +% V1.8 allow long theorem names to break across lines. +% Thanks to Miquel Payaro for reporting this. +\def\@begintheorem#1#2{\@IEEEtmpitemindent\itemindent\relax + \topsep 0.2\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip + \rmfamily\trivlist\hangindent\parindent% + \item[]\textit{\bfseries\noindent #1\ #2.} \itemindent\@IEEEtmpitemindent\relax} +\def\@opargbegintheorem#1#2#3{\@IEEEtmpitemindent\itemindent\relax +\topsep 0.2\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip +\rmfamily\trivlist\hangindent\parindent% +% V1.6 The IEEE is back to using () around theorem names which are also in italics +% Thanks to Christian Peel for reporting this. + \item[]\textit{\bfseries\noindent #1\ #2\ (#3).} \itemindent\@IEEEtmpitemindent\relax} +% V1.7 remove bogus \unskip that caused equations in theorems to collide with +% lines below. +\def\@endtheorem{\endtrivlist\vskip 0.25\@IEEEnormalsizeunitybaselineskip plus 0.26\@IEEEnormalsizeunitybaselineskip minus 0.05\@IEEEnormalsizeunitybaselineskip} +\else +% +% noncompsoc +% +% V1.8 allow long theorem names to break across lines. +% Thanks to Miquel Payaro for reporting this. +\def\@begintheorem#1#2{\@IEEEtmpitemindent\itemindent\relax\topsep 0pt\rmfamily\trivlist% + \item[]\textit{\indent #1\ #2:} \itemindent\@IEEEtmpitemindent\relax} +\def\@opargbegintheorem#1#2#3{\@IEEEtmpitemindent\itemindent\relax\topsep 0pt\rmfamily \trivlist% +% V1.6 The IEEE is back to using () around theorem names which are also in italics +% Thanks to Christian Peel for reporting this. + \item[]\textit{\indent #1\ #2\ (#3):} \itemindent\@IEEEtmpitemindent\relax} +% V1.7 remove bogus \unskip that caused equations in theorems to collide with +% lines below. +\def\@endtheorem{\endtrivlist} +\fi + + + +% V1.6 +% display command for the section the theorem is in - so that \thesection +% is not used as this will be in Roman numerals when we want arabic. +% LaTeX2e uses \def\@thmcounter#1{\noexpand\arabic{#1}} for the theorem number +% (second part) display and \def\@thmcountersep{.} as a separator. +% V1.7 intercept calls to the section counter and reroute to \@IEEEthmcounterinsection +% to allow \appendix(ices} to override as needed. +% +% special handler for sections, allows appendix(ices) to override +\gdef\@IEEEthmcounterinsection#1{\arabic{#1}} +% string macro +\edef\@IEEEstringsection{section} + +% redefine the #1#2[#3] form of newtheorem to use a hook to \@IEEEthmcounterinsection +% if section in_counter is used +\def\@xnthm#1#2[#3]{% + \expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}\@newctr{#1}[#3]% + \edef\@IEEEstringtmp{#3} + \ifx\@IEEEstringtmp\@IEEEstringsection + \expandafter\xdef\csname the#1\endcsname{% + \noexpand\@IEEEthmcounterinsection{#3}\@thmcountersep + \@thmcounter{#1}}% + \else + \expandafter\xdef\csname the#1\endcsname{% + \expandafter\noexpand\csname the#3\endcsname \@thmcountersep + \@thmcounter{#1}}% + \fi + \global\@namedef{#1}{\@thm{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}}} + + + +%% SET UP THE DEFAULT PAGESTYLE +\pagestyle{headings} +\pagenumbering{arabic} + +% normally the page counter starts at 1 +\setcounter{page}{1} +% however, for peerreview the cover sheet is page 0 or page -1 +% (for duplex printing) +\ifCLASSOPTIONpeerreview + \if@twoside + \setcounter{page}{-1} + \else + \setcounter{page}{0} + \fi +\fi + +% standard book class behavior - let bottom line float up and down as +% needed when single sided +\ifCLASSOPTIONtwoside\else\raggedbottom\fi +% if two column - turn on twocolumn, allow word spacings to stretch more and +% enforce a rigid position for the last lines +\ifCLASSOPTIONtwocolumn +% the peer review option delays invoking twocolumn + \ifCLASSOPTIONpeerreview\else + \twocolumn + \fi +\sloppy +\flushbottom +\fi + + + + +% \APPENDIX and \APPENDICES definitions + +% This is the \@ifmtarg command from the LaTeX ifmtarg package +% by Peter Wilson (CUA) and Donald Arseneau +% \@ifmtarg is used to determine if an argument to a command +% is present or not. +% For instance: +% \@ifmtarg{#1}{\typeout{empty}}{\typeout{has something}} +% \@ifmtarg is used with our redefined \section command if +% \appendices is invoked. +% The command \section will behave slightly differently depending +% on whether the user specifies a title: +% \section{My appendix title} +% or not: +% \section{} +% This way, we can eliminate the blank lines where the title +% would be, and the unneeded : after Appendix in the table of +% contents +\begingroup +\catcode`\Q=3 +\long\gdef\@ifmtarg#1{\@xifmtarg#1QQ\@secondoftwo\@firstoftwo\@nil} +\long\gdef\@xifmtarg#1#2Q#3#4#5\@nil{#4} +\endgroup +% end of \@ifmtarg defs + + +% V1.7 +% command that allows the one time saving of the original definition +% of section to \@IEEEappendixsavesection for \appendix or \appendices +% we don't save \section here as it may be redefined later by other +% packages (hyperref.sty, etc.) +\def\@IEEEsaveoriginalsectiononce{\let\@IEEEappendixsavesection\section +\let\@IEEEsaveoriginalsectiononce\relax} + +% neat trick to grab and process the argument from \section{argument} +% we process differently if the user invoked \section{} with no +% argument (title) +% note we reroute the call to the old \section* +\def\@IEEEprocessthesectionargument#1{% +\@ifmtarg{#1}{% +\@IEEEappendixsavesection*{\appendixname\nobreakspace\thesectiondis}% +\addcontentsline{toc}{section}{\appendixname\nobreakspace\thesection}}{% +\@IEEEappendixsavesection*{\appendixname\nobreakspace\thesectiondis\\* #1}% +\addcontentsline{toc}{section}{\appendixname\nobreakspace\thesection: #1}}} + +% we use this if the user calls \section{} after +% \appendix-- which has no meaning. So, we ignore the +% command and its argument. Then, warn the user. +\def\@IEEEdestroythesectionargument#1{\typeout{** WARNING: Ignoring useless +\protect\section\space in Appendix (line \the\inputlineno).}} + + +% remember \thesection forms will be displayed in \ref calls +% and in the Table of Contents. +% The \sectiondis form is used in the actual heading itself + +% appendix command for one single appendix +% normally has no heading. However, if you want a +% heading, you can do so via the optional argument: +% \appendix[Optional Heading] +\def\appendix{\relax} +\renewcommand{\appendix}[1][]{\@IEEEsaveoriginalsectiononce\par + % v1.6 keep hyperref's identifiers unique + \gdef\theHsection{Appendix.A}% + % v1.6 adjust hyperref's string name for the section + \xdef\Hy@chapapp{appendix}% + \setcounter{section}{0}% + \setcounter{subsection}{0}% + \setcounter{subsubsection}{0}% + \setcounter{paragraph}{0}% + \gdef\thesection{A}% + \gdef\thesectiondis{}% + \gdef\thesubsection{\Alph{subsection}}% + \gdef\@IEEEthmcounterinsection##1{A} + \refstepcounter{section}% update the \ref counter + \@ifmtarg{#1}{\@IEEEappendixsavesection*{\appendixname}% + \addcontentsline{toc}{section}{\appendixname}}{% + \@IEEEappendixsavesection*{\appendixname\nobreakspace\\* #1}% + \addcontentsline{toc}{section}{\appendixname: #1}}% + % redefine \section command for appendix + % leave \section* as is + \def\section{\@ifstar{\@IEEEappendixsavesection*}{% + \@IEEEdestroythesectionargument}}% throw out the argument + % of the normal form +} + + + +% appendices command for multiple appendices +% user then calls \section with an argument (possibly empty) to +% declare the individual appendices +\def\appendices{\@IEEEsaveoriginalsectiononce\par + % v1.6 keep hyperref's identifiers unique + \gdef\theHsection{Appendix.\Alph{section}}% + % v1.6 adjust hyperref's string name for the section + \xdef\Hy@chapapp{appendix}% + \setcounter{section}{-1}% we want \refstepcounter to use section 0 + \setcounter{subsection}{0}% + \setcounter{subsubsection}{0}% + \setcounter{paragraph}{0}% + \ifCLASSOPTIONromanappendices% + \gdef\thesection{\Roman{section}}% + \gdef\thesectiondis{\Roman{section}}% + \@IEEEcompsocconfonly{\gdef\thesectiondis{\Roman{section}.}}% + \gdef\@IEEEthmcounterinsection##1{A\arabic{##1}} + \else% + \gdef\thesection{\Alph{section}}% + \gdef\thesectiondis{\Alph{section}}% + \@IEEEcompsocconfonly{\gdef\thesectiondis{\Alph{section}.}}% + \gdef\@IEEEthmcounterinsection##1{\Alph{##1}} + \fi% + \refstepcounter{section}% update the \ref counter + \setcounter{section}{0}% NEXT \section will be the FIRST appendix + % redefine \section command for appendices + % leave \section* as is + \def\section{\@ifstar{\@IEEEappendixsavesection*}{% process the *-form + \refstepcounter{section}% or is a new section so, + \@IEEEprocessthesectionargument}}% process the argument + % of the normal form +} + + + +% V1.7 compoc uses nonbold drop cap and small caps word style +\ifCLASSOPTIONcompsoc + \def\IEEEPARstartFONTSTYLE{\mdseries} + \def\IEEEPARstartWORDFONTSTYLE{\scshape} + \def\IEEEPARstartWORDCAPSTYLE{\relax} +\fi +% +% +% \IEEEPARstart +% Definition for the big two line drop cap letter at the beginning of the +% first paragraph of journal papers. The first argument is the first letter +% of the first word, the second argument is the remaining letters of the +% first word which will be rendered in upper case. +% In V1.6 this has been completely rewritten to: +% +% 1. no longer have problems when the user begins an environment +% within the paragraph that uses \IEEEPARstart. +% 2. auto-detect and use the current font family +% 3. revise handling of the space at the end of the first word so that +% interword glue will now work as normal. +% 4. produce correctly aligned edges for the (two) indented lines. +% +% We generalize things via control macros - playing with these is fun too. +% +% V1.7 added more control macros to make it easy for IEEEtrantools.sty users +% to change the font style. +% +% the number of lines that are indented to clear it +% may need to increase if using decenders +\providecommand{\IEEEPARstartDROPLINES}{2} +% minimum number of lines left on a page to allow a \@IEEEPARstart +% Does not take into consideration rubber shrink, so it tends to +% be overly cautious +\providecommand{\IEEEPARstartMINPAGELINES}{2} +% V1.7 the height of the drop cap is adjusted to match the height of this text +% in the current font (when \IEEEPARstart is called). +\providecommand{\IEEEPARstartHEIGHTTEXT}{T} +% the depth the letter is lowered below the baseline +% the height (and size) of the letter is determined by the sum +% of this value and the height of the \IEEEPARstartHEIGHTTEXT in the current +% font. It is a good idea to set this value in terms of the baselineskip +% so that it can respond to changes therein. +\providecommand{\IEEEPARstartDROPDEPTH}{1.1\baselineskip} +% V1.7 the font the drop cap will be rendered in, +% can take zero or one argument. +\providecommand{\IEEEPARstartFONTSTYLE}{\bfseries} +% V1.7 any additional, non-font related commands needed to modify +% the drop cap letter, can take zero or one argument. +\providecommand{\IEEEPARstartCAPSTYLE}{\MakeUppercase} +% V1.7 the font that will be used to render the rest of the word, +% can take zero or one argument. +\providecommand{\IEEEPARstartWORDFONTSTYLE}{\relax} +% V1.7 any additional, non-font related commands needed to modify +% the rest of the word, can take zero or one argument. +\providecommand{\IEEEPARstartWORDCAPSTYLE}{\MakeUppercase} +% This is the horizontal separation distance from the drop letter to the main text. +% Lengths that depend on the font (e.g., ex, em, etc.) will be referenced +% to the font that is active when \IEEEPARstart is called. +\providecommand{\IEEEPARstartSEP}{0.15em} +% V1.7 horizontal offset applied to the left of the drop cap. +\providecommand{\IEEEPARstartHOFFSET}{0em} +% V1.7 Italic correction command applied at the end of the drop cap. +\providecommand{\IEEEPARstartITLCORRECT}{\/} + +% width of the letter output, set globally. Can be used in \IEEEPARstartSEP +% or \IEEEPARstartHOFFSET, but not the height lengths. +\newdimen\IEEEPARstartletwidth +\IEEEPARstartletwidth 0pt\relax + +% definition of \IEEEPARstart +% THIS IS A CONTROLLED SPACING AREA, DO NOT ALLOW SPACES WITHIN THESE LINES +% +% The token \@IEEEPARstartfont will be globally defined after the first use +% of \IEEEPARstart and will be a font command which creates the big letter +% The first argument is the first letter of the first word and the second +% argument is the rest of the first word(s). +\def\IEEEPARstart#1#2{\par{% +% if this page does not have enough space, break it and lets start +% on a new one +\@IEEEtranneedspace{\IEEEPARstartMINPAGELINES\baselineskip}{\relax}% +% V1.7 move this up here in case user uses \textbf for \IEEEPARstartFONTSTYLE +% which uses command \leavevmode which causes an unwanted \indent to be issued +\noindent +% calculate the desired height of the big letter +% it extends from the top of \IEEEPARstartHEIGHTTEXT in the current font +% down to \IEEEPARstartDROPDEPTH below the current baseline +\settoheight{\@IEEEtrantmpdimenA}{\IEEEPARstartHEIGHTTEXT}% +\addtolength{\@IEEEtrantmpdimenA}{\IEEEPARstartDROPDEPTH}% +% extract the name of the current font in bold +% and place it in \@IEEEPARstartFONTNAME +\def\@IEEEPARstartGETFIRSTWORD##1 ##2\relax{##1}% +{\IEEEPARstartFONTSTYLE{\selectfont\edef\@IEEEPARstartFONTNAMESPACE{\fontname\font\space}% +\xdef\@IEEEPARstartFONTNAME{\expandafter\@IEEEPARstartGETFIRSTWORD\@IEEEPARstartFONTNAMESPACE\relax}}}% +% define a font based on this name with a point size equal to the desired +% height of the drop letter +\font\@IEEEPARstartsubfont\@IEEEPARstartFONTNAME\space at \@IEEEtrantmpdimenA\relax% +% save this value as a counter (integer) value (sp points) +\@IEEEtrantmpcountA=\@IEEEtrantmpdimenA% +% now get the height of the actual letter produced by this font size +\settoheight{\@IEEEtrantmpdimenB}{\@IEEEPARstartsubfont\IEEEPARstartCAPSTYLE{#1}}% +% If something bogus happens like the first argument is empty or the +% current font is strange, do not allow a zero height. +\ifdim\@IEEEtrantmpdimenB=0pt\relax% +\typeout{** WARNING: IEEEPARstart drop letter has zero height! (line \the\inputlineno)}% +\typeout{ Forcing the drop letter font size to 10pt.}% +\@IEEEtrantmpdimenB=10pt% +\fi% +% and store it as a counter +\@IEEEtrantmpcountB=\@IEEEtrantmpdimenB% +% Since a font size doesn't exactly correspond to the height of the capital +% letters in that font, the actual height of the letter, \@IEEEtrantmpcountB, +% will be less than that desired, \@IEEEtrantmpcountA +% we need to raise the font size, \@IEEEtrantmpdimenA +% by \@IEEEtrantmpcountA / \@IEEEtrantmpcountB +% But, TeX doesn't have floating point division, so we have to use integer +% division. Hence the use of the counters. +% We need to reduce the denominator so that the loss of the remainder will +% have minimal affect on the accuracy of the result +\divide\@IEEEtrantmpcountB by 200% +\divide\@IEEEtrantmpcountA by \@IEEEtrantmpcountB% +% Then reequalize things when we use TeX's ability to multiply by +% floating point values +\@IEEEtrantmpdimenB=0.005\@IEEEtrantmpdimenA% +\multiply\@IEEEtrantmpdimenB by \@IEEEtrantmpcountA% +% \@IEEEPARstartfont is globaly set to the calculated font of the big letter +% We need to carry this out of the local calculation area to to create the +% big letter. +\global\font\@IEEEPARstartfont\@IEEEPARstartFONTNAME\space at \@IEEEtrantmpdimenB% +% Now set \@IEEEtrantmpdimenA to the width of the big letter +% We need to carry this out of the local calculation area to set the +% hanging indent +\settowidth{\global\@IEEEtrantmpdimenA}{\@IEEEPARstartfont +\IEEEPARstartCAPSTYLE{#1\IEEEPARstartITLCORRECT}}}% +% end of the isolated calculation environment +\global\IEEEPARstartletwidth\@IEEEtrantmpdimenA\relax% +% add in the extra clearance we want +\advance\@IEEEtrantmpdimenA by \IEEEPARstartSEP\relax% +% add in the optional offset +\advance\@IEEEtrantmpdimenA by \IEEEPARstartHOFFSET\relax% +% V1.7 don't allow negative offsets to produce negative hanging indents +\@IEEEtrantmpdimenB\@IEEEtrantmpdimenA +\ifnum\@IEEEtrantmpdimenB < 0 \@IEEEtrantmpdimenB 0pt\fi +% \@IEEEtrantmpdimenA has the width of the big letter plus the +% separation space and \@IEEEPARstartfont is the font we need to use +% Now, we make the letter and issue the hanging indent command +% The letter is placed in a box of zero width and height so that other +% text won't be displaced by it. +\hangindent\@IEEEtrantmpdimenB\hangafter=-\IEEEPARstartDROPLINES% +\makebox[0pt][l]{\hspace{-\@IEEEtrantmpdimenA}% +\raisebox{-\IEEEPARstartDROPDEPTH}[0pt][0pt]{\hspace{\IEEEPARstartHOFFSET}% +\@IEEEPARstartfont\IEEEPARstartCAPSTYLE{#1\IEEEPARstartITLCORRECT}% +\hspace{\IEEEPARstartSEP}}}% +{\IEEEPARstartWORDFONTSTYLE{\IEEEPARstartWORDCAPSTYLE{\selectfont#2}}}} + + + + +% determines if the space remaining on a given page is equal to or greater +% than the specified space of argument one +% if not, execute argument two (only if the remaining space is greater than zero) +% and issue a \newpage +% +% example: \@IEEEtranneedspace{2in}{\vfill} +% +% Does not take into consideration rubber shrinkage, so it tends to +% be overly cautious +% Based on an example posted by Donald Arseneau +% Note this macro uses \@IEEEtrantmpdimenB internally for calculations, +% so DO NOT PASS \@IEEEtrantmpdimenB to this routine +% if you need a dimen register, import with \@IEEEtrantmpdimenA instead +\def\@IEEEtranneedspace#1#2{\penalty-100\begingroup%shield temp variable +\@IEEEtrantmpdimenB\pagegoal\advance\@IEEEtrantmpdimenB-\pagetotal% space left +\ifdim #1>\@IEEEtrantmpdimenB\relax% not enough space left +\ifdim\@IEEEtrantmpdimenB>\z@\relax #2\fi% +\newpage% +\fi\endgroup} + + + +% IEEEbiography ENVIRONMENT +% Allows user to enter biography leaving place for picture (adapts to font size) +% As of V1.5, a new optional argument allows you to have a real graphic! +% V1.5 and later also fixes the "colliding biographies" which could happen when a +% biography's text was shorter than the space for the photo. +% MDS 7/2001 +% V1.6 prevent multiple biographies from making multiple TOC entries +\newif\if@IEEEbiographyTOCentrynotmade +\global\@IEEEbiographyTOCentrynotmadetrue + +% biography counter so hyperref can jump directly to the biographies +% and not just the previous section +\newcounter{IEEEbiography} +\setcounter{IEEEbiography}{0} + +% photo area size +\def\@IEEEBIOphotowidth{1.0in} % width of the biography photo area +\def\@IEEEBIOphotodepth{1.25in} % depth (height) of the biography photo area +% area cleared for photo +\def\@IEEEBIOhangwidth{1.14in} % width cleared for the biography photo area +\def\@IEEEBIOhangdepth{1.25in} % depth cleared for the biography photo area + % actual depth will be a multiple of + % \baselineskip, rounded up +\def\@IEEEBIOskipN{4\baselineskip}% nominal value of the vskip above the biography + +\newenvironment{IEEEbiography}[2][]{\normalfont\@IEEEcompsoconly{\sffamily}\footnotesize% +\unitlength 1in\parskip=0pt\par\parindent 1em\interlinepenalty500% +% we need enough space to support the hanging indent +% the nominal value of the spacer +% and one extra line for good measure +\@IEEEtrantmpdimenA=\@IEEEBIOhangdepth% +\advance\@IEEEtrantmpdimenA by \@IEEEBIOskipN% +\advance\@IEEEtrantmpdimenA by 1\baselineskip% +% if this page does not have enough space, break it and lets start +% with a new one +\@IEEEtranneedspace{\@IEEEtrantmpdimenA}{\relax}% +% nominal spacer can strech, not shrink use 1fil so user can out stretch with \vfill +\vskip \@IEEEBIOskipN plus 1fil minus 0\baselineskip% +% the default box for where the photo goes +\def\@IEEEtempbiographybox{{\setlength{\fboxsep}{0pt}\framebox{% +\begin{minipage}[b][\@IEEEBIOphotodepth][c]{\@IEEEBIOphotowidth}\centering PLACE\\ PHOTO\\ HERE \end{minipage}}}}% +% +% detect if the optional argument was supplied, this requires the +% \@ifmtarg command as defined in the appendix section above +% and if so, override the default box with what they want +\@ifmtarg{#1}{\relax}{\def\@IEEEtempbiographybox{\mbox{\begin{minipage}[b][\@IEEEBIOphotodepth][c]{\@IEEEBIOphotowidth}% +\centering% +#1% +\end{minipage}}}}% end if optional argument supplied +% Make an entry into the table of contents only if we have not done so before +\if@IEEEbiographyTOCentrynotmade% +% link labels to the biography counter so hyperref will jump +% to the biography, not the previous section +\setcounter{IEEEbiography}{-1}% +\refstepcounter{IEEEbiography}% +\addcontentsline{toc}{section}{Biographies}% +\global\@IEEEbiographyTOCentrynotmadefalse% +\fi% +% one more biography +\refstepcounter{IEEEbiography}% +% Make an entry for this name into the table of contents +\addcontentsline{toc}{subsection}{#2}% +% V1.6 properly handle if a new paragraph should occur while the +% hanging indent is still active. Do this by redefining \par so +% that it will not start a new paragraph. (But it will appear to the +% user as if it did.) Also, strip any leading pars, newlines, or spaces. +\let\@IEEEBIOORGparCMD=\par% save the original \par command +\edef\par{\hfil\break\indent}% the new \par will not be a "real" \par +\settoheight{\@IEEEtrantmpdimenA}{\@IEEEtempbiographybox}% get height of biography box +\@IEEEtrantmpdimenB=\@IEEEBIOhangdepth% +\@IEEEtrantmpcountA=\@IEEEtrantmpdimenB% countA has the hang depth +\divide\@IEEEtrantmpcountA by \baselineskip% calculates lines needed to produce the hang depth +\advance\@IEEEtrantmpcountA by 1% ensure we overestimate +% set the hanging indent +\hangindent\@IEEEBIOhangwidth% +\hangafter-\@IEEEtrantmpcountA% +% reference the top of the photo area to the top of a capital T +\settoheight{\@IEEEtrantmpdimenB}{\mbox{T}}% +% set the photo box, give it zero width and height so as not to disturb anything +\noindent\makebox[0pt][l]{\hspace{-\@IEEEBIOhangwidth}\raisebox{\@IEEEtrantmpdimenB}[0pt][0pt]{% +\raisebox{-\@IEEEBIOphotodepth}[0pt][0pt]{\@IEEEtempbiographybox}}}% +% now place the author name and begin the bio text +\noindent\textbf{#2\ }\@IEEEgobbleleadPARNLSP}{\relax\let\par=\@IEEEBIOORGparCMD\par% +% 7/2001 V1.5 detect when the biography text is shorter than the photo area +% and pad the unused area - preventing a collision from the next biography entry +% MDS +\ifnum \prevgraf <\@IEEEtrantmpcountA\relax% detect when the biography text is shorter than the photo + \advance\@IEEEtrantmpcountA by -\prevgraf% calculate how many lines we need to pad + \advance\@IEEEtrantmpcountA by -1\relax% we compensate for the fact that we indented an extra line + \@IEEEtrantmpdimenA=\baselineskip% calculate the length of the padding + \multiply\@IEEEtrantmpdimenA by \@IEEEtrantmpcountA% + \noindent\rule{0pt}{\@IEEEtrantmpdimenA}% insert an invisible support strut +\fi% +\par\normalfont} + + + +% V1.6 +% added biography without a photo environment +\newenvironment{IEEEbiographynophoto}[1]{% +% Make an entry into the table of contents only if we have not done so before +\if@IEEEbiographyTOCentrynotmade% +% link labels to the biography counter so hyperref will jump +% to the biography, not the previous section +\setcounter{IEEEbiography}{-1}% +\refstepcounter{IEEEbiography}% +\addcontentsline{toc}{section}{Biographies}% +\global\@IEEEbiographyTOCentrynotmadefalse% +\fi% +% one more biography +\refstepcounter{IEEEbiography}% +% Make an entry for this name into the table of contents +\addcontentsline{toc}{subsection}{#1}% +\normalfont\@IEEEcompsoconly{\sffamily}\footnotesize\interlinepenalty500% +\vskip 4\baselineskip plus 1fil minus 0\baselineskip% +\parskip=0pt\par% +\noindent\textbf{#1\ }\@IEEEgobbleleadPARNLSP}{\relax\par\normalfont} + + +% provide the user with some old font commands +% got this from article.cls +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} + + +% SPECIAL PAPER NOTICE COMMANDS +% +% holds the special notice text +\def\@IEEEspecialpapernotice{\relax} + +% for special papers, like invited papers, the user can do: +% \IEEEspecialpapernotice{(Invited Paper)} before \maketitle +\def\IEEEspecialpapernotice#1{\ifCLASSOPTIONconference% +\def\@IEEEspecialpapernotice{{\sublargesize\textit{#1}\vspace*{1em}}}% +\else% +\def\@IEEEspecialpapernotice{{\\*[1.5ex]\sublargesize\textit{#1}}\vspace*{-2ex}}% +\fi} + + + + +% PUBLISHER ID COMMANDS +% to insert a publisher's ID footer +% V1.6 \IEEEpubid has been changed so that the change in page size and style +% occurs in \maketitle. \IEEEpubid must now be issued prior to \maketitle +% use \IEEEpubidadjcol as before - in the second column of the title page +% These changes allow \maketitle to take the reduced page height into +% consideration when dynamically setting the space between the author +% names and the maintext. +% +% the amount the main text is pulled up to make room for the +% publisher's ID footer +% The IEEE uses about 1.3\baselineskip for journals, +% dynamic title spacing will clean up the fraction +\def\@IEEEpubidpullup{1.3\baselineskip} +\ifCLASSOPTIONtechnote +% for technotes it must be an integer of baselineskip as there can be no +% dynamic title spacing for two column mode technotes (the title is in the +% in first column) and we should maintain an integer number of lines in the +% second column +% There are some examples (such as older issues of "Transactions on +% Information Theory") in which the IEEE really pulls the text off the ID for +% technotes - about 0.55in (or 4\baselineskip). We'll use 2\baselineskip +% and call it even. +\def\@IEEEpubidpullup{2\baselineskip} +\fi + +% V1.7 compsoc does not use a pullup +\ifCLASSOPTIONcompsoc +\def\@IEEEpubidpullup{0pt} +\fi + +% holds the ID text +\def\@IEEEpubid{\relax} + +% flag so \maketitle can tell if \IEEEpubid was called +\newif\if@IEEEusingpubid +\global\@IEEEusingpubidfalse +% issue this command in the page to have the ID at the bottom +% V1.6 use before \maketitle +\def\IEEEpubid#1{\def\@IEEEpubid{#1}\global\@IEEEusingpubidtrue} + + +% command which will pull up (shorten) the column it is executed in +% to make room for the publisher ID. Place in the second column of +% the title page when using \IEEEpubid +% Is smart enough not to do anything when in single column text or +% if the user hasn't called \IEEEpubid +% currently needed in for the second column of a page with the +% publisher ID. If not needed in future releases, please provide this +% command and define it as \relax for backward compatibility +% v1.6b do not allow command to operate if the peer review option has been +% selected because \IEEEpubidadjcol will not be on the cover page. +% V1.7 do nothing if compsoc +\def\IEEEpubidadjcol{\ifCLASSOPTIONcompsoc\else\ifCLASSOPTIONpeerreview\else +\if@twocolumn\if@IEEEusingpubid\enlargethispage{-\@IEEEpubidpullup}\fi\fi\fi\fi} + +% Special thanks to Peter Wilson, Daniel Luecking, and the other +% gurus at comp.text.tex, for helping me to understand how best to +% implement the IEEEpubid command in LaTeX. + + + +%% Lockout some commands under various conditions + +% general purpose bit bucket +\newsavebox{\@IEEEtranrubishbin} + +% flags to prevent multiple warning messages +\newif\if@IEEEWARNthanks +\newif\if@IEEEWARNIEEEPARstart +\newif\if@IEEEWARNIEEEbiography +\newif\if@IEEEWARNIEEEbiographynophoto +\newif\if@IEEEWARNIEEEpubid +\newif\if@IEEEWARNIEEEpubidadjcol +\newif\if@IEEEWARNIEEEmembership +\newif\if@IEEEWARNIEEEaftertitletext +\@IEEEWARNthankstrue +\@IEEEWARNIEEEPARstarttrue +\@IEEEWARNIEEEbiographytrue +\@IEEEWARNIEEEbiographynophototrue +\@IEEEWARNIEEEpubidtrue +\@IEEEWARNIEEEpubidadjcoltrue +\@IEEEWARNIEEEmembershiptrue +\@IEEEWARNIEEEaftertitletexttrue + + +%% Lockout some commands when in various modes, but allow them to be restored if needed +%% +% save commands which might be locked out +% so that the user can later restore them if needed +\let\@IEEESAVECMDthanks\thanks +\let\@IEEESAVECMDIEEEPARstart\IEEEPARstart +\let\@IEEESAVECMDIEEEbiography\IEEEbiography +\let\@IEEESAVECMDendIEEEbiography\endIEEEbiography +\let\@IEEESAVECMDIEEEbiographynophoto\IEEEbiographynophoto +\let\@IEEESAVECMDendIEEEbiographynophoto\endIEEEbiographynophoto +\let\@IEEESAVECMDIEEEpubid\IEEEpubid +\let\@IEEESAVECMDIEEEpubidadjcol\IEEEpubidadjcol +\let\@IEEESAVECMDIEEEmembership\IEEEmembership +\let\@IEEESAVECMDIEEEaftertitletext\IEEEaftertitletext + + +% disable \IEEEPARstart when in draft mode +% This may have originally been done because the pre-V1.6 drop letter +% algorithm had problems with a non-unity baselinestretch +% At any rate, it seems too formal to have a drop letter in a draft +% paper. +\ifCLASSOPTIONdraftcls +\def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** ATTENTION: \noexpand\IEEEPARstart + is disabled in draft mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse} +\fi +% and for technotes +\ifCLASSOPTIONtechnote +\def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** WARNING: \noexpand\IEEEPARstart + is locked out for technotes (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse} +\fi + + +% lockout unneeded commands when in conference mode +\ifCLASSOPTIONconference +% when locked out, \thanks, \IEEEbiography, \IEEEbiographynophoto, \IEEEpubid, +% \IEEEmembership and \IEEEaftertitletext will all swallow their given text. +% \IEEEPARstart will output a normal character instead +% warn the user about these commands only once to prevent the console screen +% from filling up with redundant messages +\def\thanks#1{\if@IEEEWARNthanks\typeout{** WARNING: \noexpand\thanks + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNthanksfalse} +\def\IEEEPARstart#1#2{#1#2\if@IEEEWARNIEEEPARstart\typeout{** WARNING: \noexpand\IEEEPARstart + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEPARstartfalse} + + +% LaTeX treats environments and commands with optional arguments differently. +% the actual ("internal") command is stored as \\commandname +% (accessed via \csname\string\commandname\endcsname ) +% the "external" command \commandname is a macro with code to determine +% whether or not the optional argument is presented and to provide the +% default if it is absent. So, in order to save and restore such a command +% we would have to save and restore \\commandname as well. But, if LaTeX +% ever changes the way it names the internal names, the trick would break. +% Instead let us just define a new environment so that the internal +% name can be left undisturbed. +\newenvironment{@IEEEbogusbiography}[2][]{\if@IEEEWARNIEEEbiography\typeout{** WARNING: \noexpand\IEEEbiography + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEbiographyfalse% +\setbox\@IEEEtranrubishbin\vbox\bgroup}{\egroup\relax} +% and make biography point to our bogus biography +\let\IEEEbiography=\@IEEEbogusbiography +\let\endIEEEbiography=\end@IEEEbogusbiography + +\renewenvironment{IEEEbiographynophoto}[1]{\if@IEEEWARNIEEEbiographynophoto\typeout{** WARNING: \noexpand\IEEEbiographynophoto + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEbiographynophotofalse% +\setbox\@IEEEtranrubishbin\vbox\bgroup}{\egroup\relax} + +\def\IEEEpubid#1{\if@IEEEWARNIEEEpubid\typeout{** WARNING: \noexpand\IEEEpubid + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEpubidfalse} +\def\IEEEpubidadjcol{\if@IEEEWARNIEEEpubidadjcol\typeout{** WARNING: \noexpand\IEEEpubidadjcol + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEpubidadjcolfalse} +\def\IEEEmembership#1{\if@IEEEWARNIEEEmembership\typeout{** WARNING: \noexpand\IEEEmembership + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEmembershipfalse} +\def\IEEEaftertitletext#1{\if@IEEEWARNIEEEaftertitletext\typeout{** WARNING: \noexpand\IEEEaftertitletext + is locked out when in conference mode (line \the\inputlineno).}\fi\global\@IEEEWARNIEEEaftertitletextfalse} +\fi + + +% provide a way to restore the commands that are locked out +\def\IEEEoverridecommandlockouts{% +\typeout{** ATTENTION: Overriding command lockouts (line \the\inputlineno).}% +\let\thanks\@IEEESAVECMDthanks% +\let\IEEEPARstart\@IEEESAVECMDIEEEPARstart% +\let\IEEEbiography\@IEEESAVECMDIEEEbiography% +\let\endIEEEbiography\@IEEESAVECMDendIEEEbiography% +\let\IEEEbiographynophoto\@IEEESAVECMDIEEEbiographynophoto% +\let\endIEEEbiographynophoto\@IEEESAVECMDendIEEEbiographynophoto% +\let\IEEEpubid\@IEEESAVECMDIEEEpubid% +\let\IEEEpubidadjcol\@IEEESAVECMDIEEEpubidadjcol% +\let\IEEEmembership\@IEEESAVECMDIEEEmembership% +\let\IEEEaftertitletext\@IEEESAVECMDIEEEaftertitletext} + + + +% need a backslash character for typeout output +{\catcode`\|=0 \catcode`\\=12 +|xdef|@IEEEbackslash{\}} + + +% hook to allow easy disabling of all legacy warnings +\def\@IEEElegacywarn#1#2{\typeout{** ATTENTION: \@IEEEbackslash #1 is deprecated (line \the\inputlineno). +Use \@IEEEbackslash #2 instead.}} + + +% provide some legacy IEEEtran commands +\def\IEEEcompsoctitleabstractindextext{\@IEEElegacywarn{IEEEcompsoctitleabstractindextext}{IEEEtitleabstractindextext}\IEEEtitleabstractindextext} +\def\IEEEdisplaynotcompsoctitleabstractindextext{\@IEEElegacywarn{IEEEdisplaynotcompsoctitleabstractindextext}{IEEEdisplaynontitleabstractindextext}\IEEEdisplaynontitleabstractindextext} +% provide some legacy IEEEtran environments + + +% V1.8a no more support for these legacy commands +%\def\authorblockA{\@IEEElegacywarn{authorblockA}{IEEEauthorblockA}\IEEEauthorblockA} +%\def\authorblockN{\@IEEElegacywarn{authorblockN}{IEEEauthorblockN}\IEEEauthorblockN} +%\def\authorrefmark{\@IEEElegacywarn{authorrefmark}{IEEEauthorrefmark}\IEEEauthorrefmark} +%\def\PARstart{\@IEEElegacywarn{PARstart}{IEEEPARstart}\IEEEPARstart} +%\def\pubid{\@IEEElegacywarn{pubid}{IEEEpubid}\IEEEpubid} +%\def\pubidadjcol{\@IEEElegacywarn{pubidadjcol}{IEEEpubidadjcol}\IEEEpubidadjcol} +%\def\specialpapernotice{\@IEEElegacywarn{specialpapernotice}{IEEEspecialpapernotice}\IEEEspecialpapernotice} +% and environments +%\def\keywords{\@IEEElegacywarn{keywords}{IEEEkeywords}\IEEEkeywords} +%\def\endkeywords{\endIEEEkeywords} +% V1.8 no more support for legacy IED list commands +%\let\labelindent\IEEElabelindent +%\def\calcleftmargin{\@IEEElegacywarn{calcleftmargin}{IEEEcalcleftmargin}\IEEEcalcleftmargin} +%\def\setlabelwidth{\@IEEElegacywarn{setlabelwidth}{IEEEsetlabelwidth}\IEEEsetlabelwidth} +%\def\usemathlabelsep{\@IEEElegacywarn{usemathlabelsep}{IEEEusemathlabelsep}\IEEEusemathlabelsep} +%\def\iedlabeljustifyc{\@IEEElegacywarn{iedlabeljustifyc}{IEEEiedlabeljustifyc}\IEEEiedlabeljustifyc} +%\def\iedlabeljustifyl{\@IEEElegacywarn{iedlabeljustifyl}{IEEEiedlabeljustifyl}\IEEEiedlabeljustifyl} +%\def\iedlabeljustifyr{\@IEEElegacywarn{iedlabeljustifyr}{IEEEiedlabeljustifyr}\IEEEiedlabeljustifyr} +% V1.8 no more support for QED and proof stuff +%\def\QED{\@IEEElegacywarn{QED}{IEEEQED}\IEEEQED} +%\def\QEDclosed{\@IEEElegacywarn{QEDclosed}{IEEEQEDclosed}\IEEEQEDclosed} +%\def\QEDopen{\@IEEElegacywarn{QEDopen}{IEEEQEDopen}\IEEEQEDopen} +%\AtBeginDocument{\def\proof{\@IEEElegacywarn{proof}{IEEEproof}\IEEEproof}\def\endproof{\endIEEEproof}} +% V1.8 no longer support biography or biographynophoto +%\def\biography{\@IEEElegacywarn{biography}{IEEEbiography}\IEEEbiography} +%\def\biographynophoto{\@IEEElegacywarn{biographynophoto}{IEEEbiographynophoto}\IEEEbiographynophoto} +%\def\endbiography{\endIEEEbiography} +%\def\endbiographynophoto{\endIEEEbiographynophoto} +% V1.7 and later no longer supports \overrideIEEEmargins +%\def\overrideIEEEmargins{% +%\typeout{** WARNING: \string\overrideIEEEmargins \space no longer supported (line \the\inputlineno).}% +%\typeout{** Use the \string\CLASSINPUTinnersidemargin, \string\CLASSINPUToutersidemargin \space controls instead.}} + +\endinput + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% End of IEEEtran.cls %%%%%%%%%%%%%%%%%%%%%%%%%%%% +% That's all folks! + diff --git a/asiabsdcon2023/asiabsdcon_2023_final.pdf b/asiabsdcon2023/asiabsdcon_2023_final.pdf new file mode 100644 index 0000000000000000000000000000000000000000..71a276203f773ef6580ce219c4bcb78b7b5aa41d GIT binary patch literal 113299 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

VGv_ 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

96@63nhQc|;ijuP26oHP= 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 literal 0 HcmV?d00001 diff --git a/asiabsdcon2023/asiabsdcon_2023_final.tex b/asiabsdcon2023/asiabsdcon_2023_final.tex new file mode 100644 index 0000000..6d37e81 --- /dev/null +++ b/asiabsdcon2023/asiabsdcon_2023_final.tex @@ -0,0 +1,686 @@ +% Intended LaTeX compiler: pdflatex +\documentclass[conference]{IEEEtran} +%\documentclass[11pt]{article} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{graphicx} +\usepackage{longtable} +\usepackage{wrapfig} +\usepackage{rotating} +\usepackage[normalem]{ulem} +\usepackage{amsmath} +\usepackage{amssymb} +%\usepackage{capt-of} +\usepackage{hyperref} +\date{2023-03-07} +\title{Dynamic host configuration, please} +\hypersetup{ + pdfauthor={Florian Obser}, + pdftitle={Dynamic host configuration, please}, + pdfkeywords={}, + pdfsubject={}, + pdfcreator={Emacs 28.2 (Org mode 9.5.5)}, + pdflang={English}} +\author{\IEEEauthorblockN{Florian Obser} +\IEEEauthorblockA{florian@openbsd.org} +} +\begin{document} + +\maketitle +\begin{abstract} +\label{sec:orgdbc4e3b} +Smartphones are always online devices in urban areas. They are even +mostly online in rural areas. They deal with many different kinds of +networks with only minimal configuration from the user. This paper +will cover how we achieved a similar user experience on OpenBSD +laptops. We will cover how we remember past visited Wi-Fi networks, +automatically configuring IPv4 and IPv6 addresses and dealing with DNS +in challenging network environments. We will also point out security +measurements we put in place while dealing with untrusted networks. +\end{abstract} + +\section{Join the Wi-Fi} +\label{sec:orgff06dc2} +When we bring a device to a never-before-visited network location we +need the network name and password for the Wi-Fi or select an open +Wi-Fi network. + +Smartphones provide a user interface (UI) for this where we select +the Wi-Fi from a drop-down list and then we are prompted for a +password. + +On OpenBSD, network interfaces are configured by \href{https://man.openbsd.org/ifconfig.8}{ifconfig(8)}, or +persistently in \href{https://man.openbsd.org/hostname.if.5}{/etc/hostname.IF}\footnote{IF denotes a specific network +interface. For example for iwm0 the file is \texttt{/etc/hostname.iwm0}}, +which is read by \href{https://man.openbsd.org/netstart.8}{netstart(8)} during boot. netstart(8) calls ifconfig(8) +internally to handle the network configuration. \texttt{\# ifconfig iwm0 scan} +will list the available Wi-Fi networks for the \texttt{iwm0} interface. + +For a long time, we could only configure one Wi-Fi network: +\begin{verbatim} +$ cat /etc/hostname.iwm0 +nwid home wpakey "trivial password" +inet autoconf +inet6 autoconf +up +\end{verbatim} + +This configures a Wi-Fi network named "home" and a password "trivial +password". IPv4 and IPv6 auto-configuration are enabled. Whenever the +network is in range the kernel automatically connects to it. + +That is not a good user experience (UX). We typically take our laptops +with us and connect to different Wi-Fi networks, like our smartphones. We +have a Wi-Fi at home, at work, there are open Wi-Fis at hotels, and so +on. + +People came up with all kinds of unusual shell scripts that would run in +the background or were triggered by \href{https://man.openbsd.org/cron.8}{cron(8)} to notice when the laptop moved +to a different Wi-Fi. The script would then call ifconfig(8) to +reconfigure Wi-Fi from a list of networks it knew about. This was all fragile and unlike how OpenBSD works. + +Peter Hessler (phessler@), with the help of Stefan Sperling (stsp@) +went ahead and tackled this problem: what if we could pass multiple +\texttt{(name, password)} tuples to the kernel and the kernel would choose the +right one? + +\begin{verbatim} +$ cat /etc/hostname.iwm0 +join home wpakey "trivial password" +join work wpakey zUDciIezevfySqam +join "Airport Wi-Fi" +join "" +inet autoconf +inet6 autoconf +up +\end{verbatim} +\texttt{join} implements exactly this. The argument to \texttt{join} is the name of +the network and the following \texttt{wpakey} is the password for that +network. If we leave out the \texttt{wpakey}, the Wi-Fi is open and does not +require a password. Using \texttt{join} with the empty string (\texttt{join ""}) +means the kernel will try to connect to any open Wi-Fi if no Wi-Fi +from the join-list is found first. + +We still need to configure the name and password by editing a file +in \texttt{/etc/} and run netstart(8) when we encounter a new Wi-Fi. This is +probably not the best UI\footnote{ed(1) is the +pinnacle of UI design, as far as the author is concerned.} but the UX is pretty good and on par +with a smartphone. Once the Wi-Fi has been configured by adding a \texttt{join} +line, the kernel will automatically reconnect to a known Wi-Fi +whenever it comes within range. +\section{Stop slacking} +\label{sec:orgcc75305} +Now that we are connected to the Wi-Fi, we need to configure IP +addresses. + +We started our efforts to improve the network configuration user +experience with IPv6 for two reasons. One is that IPv6 is still a technology for early adopters +who are used to difficulties when using new technologies and are eager to help debug the problems that might arise. + +Another reason for our work was the fact that OpenBSD got IPv6 support from the KAME project +in the late 1990s and early 2000s after which it quieted down again. +The network configuration was handled mostly in the +kernel, so there was no isolation from malicious input. For the most +part it assumed a stationary workstation that tried to acquire an +IPv6 prefix for stateless address auto-configuration during boot by +sending three router solicitations and then listened for router +advertisements to create auto-configuration addresses and renewed +their lifetimes when a new advertisement flew by. There was some +rudimentary code in rtsold(8) to handle movement between networks, but +it was rarely used since it was optional. rtsold(8) was used in +one-shot mode where it would send at most three router solicitations +when an interface connected to the network and then it would exit. + +We started to write \href{https://man.openbsd.org/slaacd.8}{slaacd(8)} +and once that was working we could delete rtsold(8) +and remove considerable pieces of code from the kernel. + +slaacd(8) is a privilege-separated network daemon that build previous +experience with privilege separation in OpenBSD. It uses three +processes, (1) the \emph{parent} process to configure the system, (2) the +\emph{frontend} process to talk to the outside world and (3) the \emph{engine} +process to handle untrusted data and run a state machine for the +stateless address auto-configuration protocol. + +pledge(2) restricts what a process is allowed to do and this is +enforced by the kernel. Enforcement means that the kernel will +terminate processes that violate what they have pledged to do. The +pledges themselves are in broad strokes, we do not concern ourselves +with single system calls but with groups of system calls. For example, +the process is allowed to interact with open file descriptors +(\texttt{"stdio"}), it is allowed to open connections to hosts on the +Internet (\texttt{"inet"}), and it is allowed to open files for reading +(\texttt{"rpath"}). + +The \emph{parent} process pledges that it will only open new network +sockets, send those to other processes and reconfigure the routing +table (\texttt{"stdio inet sendfd wroute"}). The \emph{frontend} process pledges +to only receive file descriptors, open unix domain sockets and check +the state of the routing table (\texttt{"stdio unix recvfd route"}). Checking +the routing table includes seeing which flags are configured per +interface. The \emph{engine} process pledges to only read and write to +already open file-descriptors (\texttt{"stdio"}). The \emph{engine} process is +very restricted in what it is allowed to do. This is important because it +handles untrusted data coming from the network. While the \emph{frontend} +process talks to the network, it never looks at the data. An attacker +will not be able to confuse the \emph{frontend} process with data they +send. They can and have \href{https://ftp.openbsd.org/pub/OpenBSD/patches/7.0/common/014\_slaacd.patch.sig}{confused} the \emph{engine} process. + +For more details see \href{privsep.org}{"Privilege drop, privilege separation, and +restricted-service operating mode in OpenBSD"}. + +slaacd(8) is enabled per default on all OpenBSD installations. + +IPv6 stateless address auto-configuration is enabled on an interface +by setting the \texttt{AUTCONF6} flag using +\href{https:///man.openbsd.org/ifconfig.8}{ifconfig(8)}: \texttt{ifconfig iwm0 inet6 +autoconf}. The kernel announces this changed interface flag to the +whole system using a broadcast route message. slaacd(8) reads those +messages using a \href{https://man.openbsd.org/route.4}{route(4)} socket. + +slaacd(8) handles all aspects of stateless address +auto-configuration. It sends router solicitations when needed, either +multi-cast or uni-cast, depending on which is appropriate. It waits +for router advertisements, parses them, and configures default routes, +global and temporary IPv6 addresses, and passes name server +information via a route message to the rest of the system. It takes +care of the lifetimes of addresses, default routes, and name server +information expiring and removes those from the system when no router +advertisements are received to extend the lifetime. + +slaacd(8) also monitors when network interfaces regain their +connection to a network. For example because the laptop woke up from +suspension or it got moved out of range of a Wi-Fi network and moved back +within range. It then needs to find out whether it connected to the same +network as before or whether it is now in a new network. If it is a new +network we need to replace the old addresses, default route and name +servers. If there is no IPv6 available it needs to remove the old +information. + +The stateless address auto-configuration specification allows multiple +default routers being present on the same layer-two network, +announcing the same or different network information. slaacd(8) tries +to handle this, but this has not been extensively tested in all +possible cases. There are still open questions being discussed at the +IETF on how to run networks with different network prefixes in the +same layer-two network. + +slaacd(8) is able to handle multiple interfaces and we will show +later how we pick the right source address when multiple addresses are available +to choose from. + +\section{Dynamic host configuration, please} +\label{sec:org76b66c3} +With IPv6 address configuration mostly solved, it was time to look at +IPv4 again. We used a fork of ISC's dhclient(8). Henning Brauer +(henning@) added privilege-separation to it and Kenneth Westerback (krw@) +has been maintaining it in the past few years. However, the privilege-separation was never quite right which +became more visible with the integration of pledge(2) and it turned out to be +difficult to integrate some of the features we developed in slaacd(8). + +It was time to write a new daemon and Otto Moerbeek (otto@) came up with a name for it: dhcpleased(8). +It is pronounced as "dynamic host configuration, please" with the "d" silent. + +On a very high level, IPv4 DHCP and IPv6 stateless address +auto-configuration are very similar. We request some information from +the router\footnote{In IPv6 we might not need to request the information, +it might just show up unannounced.}, we use it to configure the system +and we make sure that information does not expire. When we move +networks we need to probe whether our information is still up to date and +if not, reconfigure the system. + +We opted for the obvious solution, which is to copy \texttt{sbin/slaacd} to \texttt{sbin/dhcpleased} and +replace the IPv6 specific bits with IPv4 specific bits. + +On paper DHCP looks more complicated than IPv6 stateless address +auto-configuration because it negotiates with the server and there is +a complicated state machine to implement. + +In practice it is the other way around. The "stateless" part in IPv6 +does not apply to the client. The client must keep state and implement +a state machine to keep track of which routers are available and when +various information expires. In IPv4 we talk to one server and all +information expires at the same time. + +We will talk about a few differences between slaacd(8) and +dhcpleased(8) in a moment, but from the user perspective both behave +in the same way. They make sure that the address configuration and default +gateway are always up to date and they pay attention when the machine +moves between networks, either while awake or while sleeping. + +Because dhcpleased(8) has to use \href{https://man.openbsd.org/bpf.4}{bpf(4)} instead of regular sockets for +some of the network packets it needs to send, the \emph{parent} process +cannot use pledge(2). Currently, there is nothing it could pledge that would +allow the usage of bpf(4). To protect the system and +prevent exfiltration of sensitive data we use \href{https://man.openbsd.org/unveil.2}{unveil(2)} to restrict +the \emph{parent} process' view of the file system. dhcpleased(8) can only +read its configuration file, read and write \texttt{/dev/bpf}, and read, +write and create files underneath \texttt{/var/db/dhcpleased/} to store +information about received leases. + +While we could get away with not implementing a config file for +slaacd(8), this did not work for dhcpleased(8). Some systems out +there will only give us a DHCP lease if we send the correct \emph{client +id}, for example. + +There are many DHCP options specified in RFC 2132. We have only +implemented the bare minimum, only the options we need and can +handle. We do not need a swap server or a cookie server, to name a few. + +Like slaacd(8), dhcpleased(8) is enabled on all OpenBSD +installations. +\section{Route priorities} +\label{sec:orgefb99be} +dhcpleased(8) and slaacd(8) can handle multiple interfaces at the same +time. The routing table might look like this: + +\begin{verbatim} +$ netstat -nrf inet \ + | awk "{print $1,$2,$7,$8}" +Routing tables + +Internet: +Destination Gateway Prio Iface +default 192.168.1.1 8 em0 +default 192.168.178.1 12 iwm0 +[...] +\end{verbatim} + +We end up with two default routes, one gateway is reachable via the +\emph{em0} interface with priority value 8 and the other gateway is +reachable via the \emph{iwm0} interface with priority value 12. A route has +higher priority when its priority value is lower. \emph{em0} is an Ethernet +interface and it gets higher priority over the Wi-Fi interface +\emph{iwm0}. All things being equal, the kernel will pick the address from +\emph{em0} as source address when making a new connection to the internet +and route traffic over the Ethernet interface, which is presumably +faster. + +If we pick up the laptop and unplug the Ethernet interface, the route over \emph{em0} is no longer usable and +existing connections using it will stall and time out. New connections +will instead use \emph{iwm0}. + +If we plug the Ethernet interface \emph{em0} back in, the session might come alive again and new +connections will use \emph{em0}. Connections that are running over \emph{iwm0} +will continue working, because the interface is still connected to +the Wi-Fi. + +Applications like web browsers, email clients or even video +conferencing systems will automatically establish a new connection +when they notice that the old one is dead. + +Unfortunately \href{https://man.openbsd.org/ssh.1}{ssh(1)} is not one of them. If switching between wired +and wireless happens rarely, \href{https://man.openbsd.org/tmux.1}{tmux(1)} on the remote system might help +with ssh(1) disconnects, or a \href{https://man.openbsd.org/wg.4}{wg(4)} tunnel can be used so that +the source address does not change when switching between wired and +wireless. +\section{Cellular networks} +\label{sec:org7d7219f} +In addition to Ethernet and Wi-Fi networks, OpenBSD supports "Mobile +Broadband Interface Model" devices using the \href{https://man.openbsd.org/umb.4}{umb(4)} driver. These can +be used to connect to UMTS or LTE networks. They require a SIM card +and after being configured using a PIN they will connect to cellular +networks and automatically configure an IP address and default +route. The default route has an even lower route priority than Wi-Fi +so it will only be used when Ethernet and Wi-Fi are not connected. +\section{It is always DNS} +\label{sec:orgd2b8f30} +Humans are not particularly good at remembering +addresses like \texttt{2606:2800:220:1:248:1893:25c8:1946} and are much better +with names like \emph{example.com}. When we run \texttt{ping6 example.com} we +will end up in \href{https://man.openbsd.org/asr\_run.3}{libc's stub resolver}. It will open +\texttt{/etc/resolv.conf} and look for \emph{nameserver} lines to use for DNS +resolution. + +We can learn name servers from dhcpleased(8), slaacd(8), umb(4), +and \href{https://man.openbsd.org/iked.8}{iked(8)}. Historically dhclient(8) owned \texttt{/etc/resolv.conf}, which +means that no other process could add name servers to it. dhclient(8) +would just overwrite whatever was in there whenever it renewed its +lease. This made it impossible to sometimes move to an IPv6-only +network. slaacd(8) could not configure name servers and the left-over +IPv4 name servers were not reachable. + +We can either teach all name server sources to somehow cooperate and share responsibility of +\texttt{/etc/resolv.conf} or we can run an arbitrator that collects name +servers from diverse sources and handles the contents of +\texttt{/etc/resolv.conf}. + +\href{https://man.openbsd.org/resolvd.8}{resolvd(8)} is such an arbitrator. It is another always enabled +daemon. It collects name servers from all the mentioned sources and +adds them to \texttt{/etc/resolv.conf}. + +It also monitors if \texttt{/etc/resolv.conf} gets edited in which case it +rereads the file and makes sure that the learned name servers are at +the beginning of the file. This is useful when the administrator of +the machine decides to add options to \texttt{/etc/resolv.conf}. For example, +we can edit the file and add \texttt{family inet6 inet} to prefer IPv6 over +IPv4 and resolvd(8) will cope. There is no need for an extra +configuration file, \texttt{/etc/resolv.conf} is the configuration file. + +Name servers are announced using route messages and resolvd(8) listens +for them using a route(4) socket. They can also be observed using the +\href{https://man.openbsd.org/route.8}{route(8)} tool: \texttt{\$ route monitor}. + +resolvd(8) can also request that name servers are re-announced by their +sources. This is useful when resolvd(8) gets restarted. +\section{Let us unwind a bit} +\label{sec:orgab25916} +Plain DNS is not a secure protocol. It exchanges +unauthenticated UDP packets without any integrity protection. This +makes it easy for an attacker to spoof answer packets. + +DNS answer packets are untrusted data, they come from the +network. However, the process that sends DNS queries and parses the +answer using the libc functions is almost always the single main +process of the tool. When we run \texttt{ping example.com}, DNS packets are +parsed using our user. An attacker who can spoof a DNS answer might be +able to trigger a bug in libc and gain code execution that way. + +On OpenBSD, ping(8) pledges \texttt{"stdio DNS"} so the attacker will not get +very far, but there are many more programs in ports that are not +pledged that might want to resolve names. + +It would be worthwhile to have some sort of proxy running on localhost +such that DNS packets from the outside need to traverse a well locked +down process running in a different address-space and as a different +user than the program that needs to resolve a name. + +An early experiment was rebound(8), written by Ted Unangst (tedu@). It +was simplistic and did not understand DNS at all, it would just +forward packets, but it would sit between the Internet and the +program. + +An alternative is to run a full recursive resolver like \href{https://man.openbsd.org/unbound.8}{unbound(8)} on +the laptop, but this leads to problems, too. unbound(8) expects a well +working network where nothing interferes with DNS, this is true in data +centres and can be achieved in well maintained home networks, but it +is not something we find when moving laptops to arbitrary networks +like free Wi-Fi in a hotel or at an airport. + +It turns out that often the quality of the network changes over +time. When we first connect to a hotel Wi-Fi we may find ourselves in +what is referred to as a \emph{captive portal}. Everything is blocked, DNS +gets intercepted, and we are redirected to a website where we need to +agree to the terms and conditions and maybe provide our name and room +number. Once we are past that, network quality improves considerably +and we are mostly free to talk to the outside world. + +This is where \href{https://man.openbsd.org/unwind.8}{unwind(8)} comes in. +It is another privilege-separated +network daemon that provides a recursive name server for the local +machine. resolvd(8) detects when it is running and automatically +rewrites \texttt{/etc/resolv.conf} to have only \texttt{nameserver 127.0.0.1} listed +as name server. + +This solves or improves upon the first problem. Programs that need DNS resolution are insulated from +the Internet. An attacker needs to get past unwind(8) first before +they can try to attack the libc stub resolver. + +unwind(8) understands and speaks DNS and it actively observes the +network quality. + +We did not write our own recursive name server. That would be +difficult and since DNS is constantly evolving, it would also require extra work to keep up. Instead we +decided to use libunbound, which is +part of \href{https://man.openbsd.org/unbound.8}{unbound(8)}. It is developed under a BSD license by \href{https://www.nlnetlabs.nl/}{NLnet Labs}. + +The resolver process pledges \texttt{"stdio inet dns rpath"} and +restricts access to the file system using unveil(2) to +\texttt{/etc/ssl/cert.pem}. This is the process that is exposed to the +Internet and handles untrusted data. It would be preferable to have +one process exposed to the Internet and another to parse untrusted +data but that is not possible to do with libunbound. + +Since we are using a real recursive name server, that gives us many +options on how we can resolve names: +\begin{itemize} +\item We can do our own recursion, walk down from the root zone using +qname minimization to improve privacy. +\item We can use the name server we learned from dhcpleased(8) and +slaacd(8) as forwarders, so we do not need to do our own recursion, +which might be faster. +\item We can try to opportunistically speak DNS over TLS (DoT) to the +learned name servers to prevent eavesdroppers from listening in. +\item We can configure forwarders manually to not depend on the network +provided name servers. Those might be more trustworthy. They can +also be DoT forwarders to prevent eavesdropping. +\item As a last resort, unwind(8) can behave exactly like the libc stub +resolver\footnote{Call this the "Dutch train problem": the free Wi-Fi on +Dutch trains do not like DNS queries with an \emph{EDNS0} option, they +intercept them, do not understand them, and answer \emph{NXDOMAIN}. There +are other free Wi-Fi networks that are similarly broken.}. +\end{itemize} +We call these resolving strategies and unwind(8) actively probes if +they are usable by sending test queries when it notices that the +network changed, for example because the laptop moved to a different Wi-Fi +network or woke up from suspension. It then orders them by quality and +picks the best one. + +There is an implicit skew in the strategies for finding the best one: +a manually configured DoT name server is always considered better than +a name server provided by the local network, as long as it is available +and not too slow. + +unwind(8) is not too concerned about preserving privacy, it is +pragmatic and tries to resolve names the best way it can, and it will use +the local name servers provided by the network if those are the only ones available. + +Since unwind(8) uses libunbound it also supports DNSSEC. DNSSEC +provides data integrity and cryptographic authenticity, it does not +provide confidentiality. + +unwind(8) is pragmatic about DNSSEC. When it tests the quality of a +resolving strategy it also tries to find out if DNSSEC is +available. There are many reasons why DNSSEC might not be available: the +network is misconfigured, DNSSEC is blocked or the laptop +does not (yet) have the correct time. If DNSSEC does not work, unwind(8) does not insist on using it. + +Of course this makes it susceptible to a downgrade attack. To mitigate +this, unwind(8) will insist on DNSSEC working after it has discovered once +that DNSSEC is working in the local network. This means that an +attacker needs to be able to block DNSSEC from the moment we connect +to a network. They cannot show up later and try to downgrade +us. unwind(8) will only become lenient again when we connect to a new +network. + +This is not a strong mitigation of course, but DNSSEC is not a fix for +everything at the resolver. Applications also need +to do their part and decide how much they are willing to trust +DNS. For example ssh(1)'s \emph{VerifyHostKeyDNS} feature will only trust +host key fingerprints it obtained from DNS if they were validated +using DNSSEC and the validator runs on the local +machine\footnote{Technically not entirely true, ssh(1) trusts what libc +indicates and libc automatically trusts localhost. See \emph{trust-ad} in +\href{https://man.openbsd.org/resolv.conf.5}{resolv.conf(5)}.}. Otherwise it will ask the user what to do. + +A worst-case scenario when joining a partially broken Wi-Fi network +with captive portal and a manually configured DoT name server might +look like this: +\begin{enumerate} +\item We connect to the network, we cannot reach the DoT name server and +cannot do our own recursion. +\item unwind(8) will choose the name server provided by the +network. It also notes that we just connected to a new network so +it is lenient with respect to DNSSEC validation. In effect it will +ignore validation errors. +\item We try to access a website and the captive portal +detection in the browser triggers. We click the buttons and fill in +the forms until we are allowed on the internet. +\item unwind(8) notices that it can do its own recursion. +\item At the same time, unwind(8) notices that the DoT name server is +also reachable now and starts using it. +\end{enumerate} + +unwind(8) does not natively support DNS over HTTPS (DoH) and we +sometimes find ourselves in networks that block everything except for +TCP port 443. One way around this is to use dnscrypt-proxy from ports +which does support DoH. We can point unwind(8) at it by manually +configuring a plain DNS forwarder in addition to a DoT forwarder: +\begin{verbatim} +$ cat /etc/unwind.conf +forwarder "9.9.9.9" port 853 \ + authentication name "dns.quad9.net" DoT +forwarder "2620:fe::9" port 853 \ + authentication name "dns.quad9.net" DoT +# dnscrypt-proxy for DoH +forwarder "127.0.0.1" port 5353 +\end{verbatim} + +\section{Time for gelato} +\label{sec:orgbb01a19} +There are various transition technologies that get us from an IPv4-only +Internet to an IPv6-only Internet. We will only look at \emph{NAT64}, +\emph{DNS64}, and \emph{464XLAT}. + +\emph{NAT64} allows us to reach IPv4 hosts from an IPv6-only network by +pretending that the hosts are IPv6 enabled. IPv6 addresses are so large +that we can easily encode all of IPv4 in an IPv6 /64 prefix, which is +the usual size of on IPv6 prefix we see per layer-two network. In fact +we don't need the whole /64, a /96 is enough to encode the whole IPv4 +Internet. + +Let us pretend we know the /96 prefix used for \emph{NAT64} and the IPv4 +address we want to reach. Forming an IPv6 address for the host is then +simply a bitwise-or operation of the IPv4 address with the /96 prefix, +the IPv4 address fills in the lower bits of the IPv6 prefix. This is +called address synthesis. + +We can then use this address to connect to the IPv4-only +host. Somewhere on the network path is the \emph{NAT64} gateway that is +dual stacked. It knows that our packets are using \emph{NAT64} because it +is configured with the /96 prefix. It intercepts the packets and forms +IPv4 packets and sends them on their way. The gateway needs to be +stateful to be able to \emph{NAT} the return traffic back to us. + +We use DNS to find out the IPv4 address that we want to connect to. The +local name servers that slaacd(8) learned about would know +about the \emph{NAT64} prefix used in the network and do the address +synthesis for us. This is called \emph{DNS64}. The problem with this is that +the name servers spoof DNS answers, something that DNSSEC tries to prevent. +unwind(8) will detect this and generate an error, or +unwind(8) might not even talk to the designated name servers at all. + +To get around this, unwind(8) itself can detect the presence of \emph{DNS64} +on a network by asking the local name servers for the \emph{AAAA} record, +i.e. the IPv6 address, for something that is guaranteed to never have +one: \emph{ipv4only.arpa}. If it gets an answer, it can reverse the address +synthesis and learn the \emph{NAT64} prefix. With that information it can +do \emph{DNS64} itself and there is no longer a problem with DNSSEC. + +The downsides of this mechanism are that it is quite complicated, it +messes around with DNS, and it does not work with IPv4 address +literals. It also does not work with programs that are fundamentally +IPv4-only: \texttt{ping example.com} will never work in an IPv6-only network +with only \emph{NAT64 / DNS64}. + +Instead of pretending that the IPv4 host we want to reach has IPv6, we can +pretend to have working IPv4 if a \emph{NAT64} gateway is present. We ask +the kernel via the \href{https://man.openbsd.org/pf.4}{pf(4)} firewall to do the IPv4-to-IPv6 translation +for us. The \emph{NAT64} gateway will then do the reverse translation and +send an IPv4 packet on its way. This is called \emph{464XLAT}. + +We first need an IPv4 address, RFC 7335 reserved \texttt{192.0.0.0/29} for +this purpose: +\begin{verbatim} +ifconfig pair1 inet 192.0.0.4/29 +\end{verbatim} +We then need a default gateway: +\begin{verbatim} +ifconfig pair2 rdomain 1 +ifconfig pair2 inet 192.0.0.1/29 +\end{verbatim} +Because pf(4) will only do address family translation on inbound rules +we need a different \emph{rdomain} and use \href{https://man.openbsd.org/pair.4}{pair(4)} interfaces. We need to +connect them: +\begin{verbatim} +ifconfig pair1 patch pair2 +\end{verbatim} +And then we can configure our default route: +\begin{verbatim} +route add -host -inet default 192.0.0.1 \ + -priority 48 +\end{verbatim} +We set it to a very low priority\footnote{Remember that a high priority +\textbf{value} means low priority.} so that it does not interfere with routes +that dhcpleased(8) configures when we move to an IPv4 enabled network. + +We then need to configure address family translation in pf(4) when we +detect \emph{NAT64} being present. This is were \href{https://github.com/fobser/gelatod/}{gelatod(8)} comes in. It is +a Customer-side transLATor (\emph{CLAT}) configuration daemon. \emph{CLAT} +is what \emph{464XLAT} calls the address translation happening on the laptop. + +gelatod(8) is yet another privilege-separated daemon\footnote{At this point +we will not go into pledge details.} that checks for the presence of a \emph{NAT64} +gateway whenever we change networks. It does so either via the +\emph{ipv4only.arpa} trick or explicitly via router advertisements. RFC +8781 specifies how a network can signal the presence of a \emph{NAT64} +gateway. + +gelatod(8) needs a pf(4) anchor into which it adds rules that are +similar to this example: +\begin{verbatim} +pass in log quick on pair2 inet \ + af-to inet6 \ + from 2001:db8::da68:f613:4573:4ed0 \ + to 64:ff9b::/96 \ + rtable 0 +\end{verbatim} +The rule is doing address family translation to IPv6 on incoming +packets on \texttt{pair2}. In this example it uses +\texttt{2001:db8::da68:f613:4573:4ed0} as the IPv6 source address, gelatod(8) +learned this from the system when slaacd(8) configured +it. \texttt{64:ff9b::/96} is the learned \emph{NAT64} prefix and we are moving +traffic back to \texttt{rtable 0}. Remember \texttt{pair2} is in rdomain 1. + +While this works rather well, it is also complicated to set up, +which is why gelatod(8) is not in +OpenBSD base but lives in ports. We believe in good defaults in +OpenBSD and try to make it easy for the user. + +\section{Future work} +\label{sec:org3bacedc} +We would like to have the functionality of gelatod(8) in OpenBSD base. +gelatod(8) was mostly a proof of concept and we imagine that a new network device +like clat(4) would take over the role of client side address family +translation. It could be always present and gelatod(8) would just enable +and disable it. At that point we could move the functionality into +slaacd(8) and delete gelatod(8). \emph{CLAT} is defined as a stateless +mechanism so it does not need the full pf(4) machinery for address +family translation. + +It would be valuable to have DNS over HTTPS (DoH) and DNS over Quic (DoQ) +natively in unwind(8). We are mostly waiting on upstream to implement +support in unbound(8). + +There are also minor issues that could be improved: +\begin{itemize} +\item The captive portal detection in unwind(8) is not perfect and could be improved upon. +\item dhcpleased(8) and slaacd(8) should remember IP addresses from +networks they have been connected to previously, to be able to quickly +re-establish connectivity by probing whether we are connecting to a +previous network while the lifetime of our addresses have not expired +yet. RFC 4436 "Detecting Network Attachment in IPv4 (DNAv4)" and RFC +6059 "Simple Procedures for Detecting Network Attachment in IPv6" +discuss the details. +\item It would be helpful if the dhcpleased(8) parent process could be +pledged. This is currently not possible because of bpf(4). Things to +investigate here are changes to the network stack that would allow +us to use raw sockets instead of bpf(4) sockets or the ability to +\href{https://man.openbsd.org/dup.2}{dup(2)} an existing bpf(4) socket and reprogram the interface it is +using. +\end{itemize} +\section{Conclusion} +\label{sec:org29b4bac} +In this paper we have described how OpenBSD improved the user +experience and security of laptop users when visiting diverse network +locations. The system remembers Wi-Fi networks and automatically +connects to them. It automatically discovers when the network changes +and acquires new IPv4 and IPv6 addresses or renews existing +configurations. OpenBSD also actively probes available DNS resolving +strategies and picks the best one available. Privilege-separation and +restricted service operating mode ensure that untrusted data is parsed +with the least privileges necessary, protecting the rest of the +system. +\section*{Acknowledgment} +The author would like to thank Mine Temuerhan for copyediting the paper. +\end{document} diff --git a/index.org b/index.org index b53cb28..eb98a81 100644 --- a/index.org +++ b/index.org @@ -36,6 +36,7 @@ - [[http://www.openbsd.org/papers/bsdcan2019_unwind.pdf][2019-05-17, BSDCan: unwind(8) a privilege-separated, validating DNS recursive nameserver for every laptop]], [[https://www.youtube.com/watch?v=88SoI49nO4o][video]] - [[https://archive.fosdem.org/2020/schedule/event/dns_unwind/][2020-02-01, FOSDEM: unwind(8) a privilege-separated, validating DNS recursive nameserver for every laptop]] - [[https://undeadly.org/cgi?action=article;sid=20200922090542][2020-09-21, undeadly: k2k20 hackathon report: Florian Obser on DNS]] +- [[https://2023.asiabsdcon.org/program.html.en][2023-04-02, AsiaBSDCon 2023: P09B: Dynamic Host Configuration, please]] ([[https://www.openbsd.org/papers/asiabsdcon2023-dynamic_host_configuration_please-slides.pdf][slides]]), ([[file:asiabsdcon2023/asiabsdcon_2023_final.pdf][paper]]) * meta This page is made using [[https://orgmode.org/][Org Mode]]'s [[https://orgmode.org/manual/Publishing.html][publishing]] facility. The