%% %% IEEEtrantools.sty 2015/08/26 version V1.5 %% %% %% This package provides several popular and unique commands from the %% IEEEtran.cls class (version 1.8b) file. %% %% The provided commands include \IEEEPARstart, \IEEEitemize, \IEEEenumerate, %% \IEEEdescription as well as the \IEEEeqnarray, \IEEEeqnarraybox family %% of commands including support commands such as \IEEEstrut, the IEEEproof %% environment and its support commands and the \IEEEauthorrefmark command. %% Also provides the \bstctlcite command for the control entry types of %% IEEEtran.bst V1.00 and later, as well as \IEEEnoauxwrite. %% %% IEEEtrantools.sty should not be used with IEEEtran.cls. %% %% Support sites: %% http://www.michaelshell.org/tex/ieeetran/ %% http://www.ctan.org/pkg/ieeetran %% %% %% Copyright (c) 2002-2015 by Michael Shell %% See: http://www.michaelshell.org/ %% for current contact information. %% %%************************************************************************* %% 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: IEEEtrantools.sty, IEEEtrantools_doc.txt %%************************************************************************* %% %% %% %% Available package options (e.g., \usepackage[redeflists]{IEEEtrantools} %% %% redeflists %% Causes IEEEtrantools to redefine the standard itemize, enumerate and %% description (IED) list environments to their IEEE versions. %% IEEEitemize, IEEEenumerate and IEEEdescription remain available in any %% case. This option may not be compatible with packages that alter the %% standard IED list environments. %% %% %%********************************************************************** \ProvidesPackage{IEEEtrantools}[2015/08/26 V1.5 by Michael Shell] \typeout{-- See the "IEEEtrantools_doc.txt" manual for usage information.} \typeout{-- http://www.michaelshell.org/tex/ieeetran/tools/} \NeedsTeXFormat{LaTeX2e} % If \@IEEEeqnarray is detected, error. {\@ifundefined{@IEEEeqnarray}{\relax}{% \PackageError{IEEEtrantools}{The IEEEtrantools package is not for use\MessageBreak with classes that already provide it}% {Do not load IEEEtrantools - you don't need it.}% }} % hook to allow easy changeover to IEEEtran.cls/tools.sty error reporting \def\@IEEEclspkgerror{\PackageError{IEEEtrantools}} % define needed flags to indicate document options \newif\if@IEEETOOLSredeflists \global\@IEEETOOLSredeflistsfalse % IEEEtran class scratch pad registers % dimen \newdimen\@IEEEtrantmpdimenA \newdimen\@IEEEtrantmpdimenB \newdimen\@IEEEtrantmpdimenC % count \newcount\@IEEEtrantmpcountA \newcount\@IEEEtrantmpcountB \newcount\@IEEEtrantmpcountC % token list \newtoks\@IEEEtrantmptoksA % declare the options \DeclareOption{redeflists}{\@IEEETOOLSredefliststrue} % provide legacy support for retainorgcmds which does nothing now. \DeclareOption{retainorgcmds}{\@IEEETOOLSredeflistsfalse} % get and process any supplied options \ProcessOptions % store the nominal value of jot \newdimen\IEEEnormaljot \IEEEnormaljot\jot\relax % V1.4 allow for other packages that later change \jot \AtBeginDocument{\IEEEnormaljot\jot\relax} %% -- 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: \@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}} % 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}} % 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 -- % -- page setup commands -- % The default sample text for calculating margins \def\IEEEdefaultsampletext{\normalfont\normalsize gT} \def\IEEEdefaultheadersampletext{\normalfont\normalsize T} \def\IEEEdefaultfootersampletext{\normalfont\normalsize 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 page setup commands -- % 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. \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. \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 % base class should define \description \let\LaTeXdescription\description \let\endLaTeXdescription\enddescription % override LaTeX's default IED lists, if the user requested it \if@IEEETOOLSredeflists \def\itemize{\@IEEEitemize} \def\enditemize{\@endIEEEitemize} \def\enumerate{\@IEEEenumerate} \def\endenumerate{\@endIEEEenumerate} \def\description{\@IEEEdescription} \def\enddescription{\@endIEEEdescription} \fi % provide the user with the IEEE IED commands \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} % used only by IEEEtran's IEEEeqnarray as other packages may % have their own, different, implementations \newcounter{IEEEsubequation}[equation] % e.g., "1a" (used only by IEEEtran's IEEEeqnarray) \def\theIEEEsubequation{\theequation\alph{IEEEsubequation}} % just like LaTeX2e's \@eqnnum \def\theequationdis{(\theequation)}% (1) % IEEEsubequation used only by IEEEtran's IEEEeqnarray \def\theIEEEsubequationdis{(\theIEEEsubequation)}% (1a) %% %% 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 %% % \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} % \IEEEauthorrefmark \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}}}} % V1.3 IEEEQED and IEEEproof \def\IEEEproofname{Proof} \def\IEEEQEDclosed{\mbox{\rule[0pt]{1.3ex}{1.3ex}}} % for a filled box \def\IEEEQEDopen{{\setlength{\fboxsep}{0pt}\setlength{\fboxrule}{0.2pt}\fbox{\rule[0pt]{0pt}{1.3ex}\rule[0pt]{1.3ex}{0pt}}}} \def\IEEEQED{\IEEEQEDclosed} % default to closed %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} % 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} % V1.7 I see no need for \providecommand here. \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} % 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.}} % V1.4 no longer support these legacy commands % \def\PARstart{\@IEEElegacywarn{PARstart}{IEEEPARstart}\IEEEPARstart} % \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} \endinput %%%%%%%%%%%%%%%%%%%%%%%%%% End of IEEEtrantools.sty %%%%%%%%%%%%%%%%%%%%%% % That's all folks!