PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/share/texlive/texmf-dist/tex/latex/enumitem
Viewing File: /usr/share/texlive/texmf-dist/tex/latex/enumitem/enumitem.sty
% +--------------------------------------------------+ % | Typeset enumitem.tex to get the documentation. | % +--------------------------------------------------+ % % Copyright (c) 2003-2011 by Javier Bezos. % All Rights Reserved. % % This file is part of the enumitem distribution release 3.5.2 % ----------------------------------------------------------- % % It may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3 % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3 or later is part of all distributions of LaTeX % version 2003/12/01 or later. % % This work has the LPPL maintenance status "maintained". % % The Current Maintainer of this work is Javier Bezos. % % Notes % ~~~~~ % % The tag enit@ is used through the style % % To do: % ~~~~~~ % - ref*, for adding stuff in the same fashion as label* % - option ams, to force upshape, but I have to investigate % how to do it. % - labelled descriptions (ie, label, title, body) % - A true nextline (far from trivial and perhaps solved with % labelled descriptions). % - Improved \AddEnumerateCounter % - Compatibility with interfaces and zref-enumitem % - "Pausing" somehow inline boxed text. % - \@enumctr <-> \@listctr? % - Define keys with values % - Revise @nobreak % % Release % ~~~~~~~ \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{enumitem}[2011/09/28 v3.5.2 Customized lists] % +=============================+ % | EMULATING KEYVAL | % +=============================+ % % "Thanks" to xkeyval, which use the same macros names as % keyval :-(, the latter has to be replicated in full here % to ensure it works as intended. The original work if by % David Carlisle, under license LPPL. Once the code is here, % it could be optimized by adpting it to the specific needs % of titlesec (to do). \def\enitkv@setkeys#1#2{% \def\enitkv@prefix{enitkv@#1@}% \let\@tempc\relax \enitkv@do#2,\relax,} \def\enitkv@do#1,{% \ifx\relax#1\empty\else \enitkv@split#1==\relax \expandafter\enitkv@do\fi} \def\enitkv@split#1=#2=#3\relax{% \enitkv@@sp@def\@tempa{#1}% \ifx\@tempa\@empty\else \expandafter\let\expandafter\@tempc \csname\enitkv@prefix\@tempa\endcsname \ifx\@tempc\relax \enitkv@errx{\@tempa\space undefined}% \else \ifx\@empty#3\@empty \enitkv@default \else \enitkv@@sp@def\@tempb{#2}% \expandafter\@tempc\expandafter{\@tempb}\relax \fi \fi \fi} \def\enitkv@default{% \expandafter\let\expandafter\@tempb \csname\enitkv@prefix\@tempa @default\endcsname \ifx\@tempb\relax \enitkv@err{No value specified for \@tempa}% \else \@tempb\relax \fi} \def\enitkv@errx#1{\enit@error{#1}\@ehc} \let\enitkv@err\enitkv@errx \def\@tempa#1{% \def\enitkv@@sp@def##1##2{% \futurelet\enitkv@tempa\enitkv@@sp@d##2\@nil\@nil#1\@nil\relax##1}% \def\enitkv@@sp@d{% \ifx\enitkv@tempa\@sptoken \expandafter\enitkv@@sp@b \else \expandafter\enitkv@@sp@b\expandafter#1% \fi}% \def\enitkv@@sp@b#1##1 \@nil{\enitkv@@sp@c##1}} \@tempa{ } \def\enitkv@@sp@c#1\@nil#2\relax#3{\enitkv@toks@{#1}\edef#3{\the\enitkv@toks@}} \@ifundefined{KV@toks@} {\newtoks\enitkv@toks@} {\let\enitkv@toks@\KV@toks@} \def\enitkv@key#1#2{% \@ifnextchar[{\enitkv@def{#1}{#2}}{\@namedef{enitkv@#1@#2}####1}} \def\enitkv@def#1#2[#3]{% \@namedef{enitkv@#1@#2@default\expandafter}\expandafter {\csname enitkv@#1@#2\endcsname{#3}}% \@namedef{enitkv@#1@#2}##1} % +=============================+ % | DEFINITIONS | % +=============================+ % % (1) The package uses a token register very often. To be on the % safe side, instead of \toks@, etc., a new one is declared. % (2) \enit@inbox is the box storing the items in boxed inline % lists. % (3) \enit@outerparindent is used to save the outer parindent % so that it can be used in the key parindent % (4) \enit@type has three values: 0 = enum, 1 = item, 2 = desc. % (5) \enit@calc stores which dimen is to be computed: % 0=labelindent, 1=labelwidth, 2=labelsep, 3=leftmargin, % 4=itemindent % (6) \enit@resuming has four values: 0 = none, 1 = series, % 2 = resume* series (computed in group enumitem-resume), % 3 = resume* list (ie, with no value). \chardef \enit@iv=4 \newlength\labelindent \newdimen \enit@outerparindent \newtoks \enit@toks \newbox \enit@inbox \newif\ifenit@boxmode \newif\ifenit@sepfrommargin \newif\ifenit@lblfrommargin \newif\ifenit@calcwidest \newif\ifenit@nextline \newif\ifenit@boxdesc % An alias (calc-savvy): \let\c@enit@cnt\@tempcnta \def\enit@meaning{\expandafter\strip@prefix\meaning} \def\enit@noexcs#1{\expandafter\noexpand\csname#1\endcsname} % Miscelaneous errors % =================== \def\enit@error{\PackageError{enumitem}} \def\enit@checkerror#1#2{% \enit@error{Unknown value `#2' for key `#1'}% {See the manual for valid values}} \def\enit@itemerror{% \enit@error{Misplaced \string\item}% {Either there is some text before the first\MessageBreak item or the last item has no text}} \def\enit@noserieserror#1{% \enit@error{Series `#1' not started}% {You are trying to continue a series\MessageBreak which has not been started with series}} \def\enit@checkseries#1{% \ifcase\enit@resuming \enit@error{Misplaced key `#1'}% {`series' and `resume*' must be used\MessageBreak in the optional argument of lists}% \fi} \def\enit@checkseries@m{% \ifcase\enit@resuming\else \enit@error{Uncompatible series settings}% {`series' and `resume*' must not be used\MessageBreak at the same time}% \fi} \let\enit@toodeep\@toodeep \def\@toodeep{% \ifnum\@listdepth>\enit@listdepth\relax \enit@toodeep \else \count@\@listdepth \global\advance\@listdepth\@ne \@ifundefined{@list\romannumeral\the\@listdepth}% {\expandafter\let \csname @list\romannumeral\the\@listdepth\expandafter\endcsname \csname @list\romannumeral\the\count@\endcsname}{}% \fi} % +=============================+ % | KEYS | % +=============================+ % % Including code executed by keys. % % There are 2 keyval groups: enumitem, and enumitem-delayed. % The latter is used to make sure a prioritary key is the % latest one; eg, ref, so that the ref format set by label % is overriden. So, when this key is found in enumitem, % nothing is done, except the key/value is moved to % enumitem-delayed. % % A further group (enumitem-resume) catches resume* and % series in optional arguments in lists. % % Vertical spacing % ================ \enitkv@key{enumitem}{topsep}{% \setlength\topsep{#1}} \enitkv@key{enumitem}{itemsep}{% \setlength\itemsep{#1}} \enitkv@key{enumitem}{parsep}{% \setlength\parsep{#1}} \enitkv@key{enumitem}{partopsep}{% \setlength\partopsep{#1}} % Horizontal spacing % ================== % % There are 3 cases: *, ! and a value. The latter also % cancels widest with the sequence key=* ... key=value % \string is used, just in case some package changes the % catcodes. \def\enit@calcset#1#2#3{% \if\string*\string#3% \enit@calcwidesttrue \let\enit@calc#2% \else\if\string!\string#3% \enit@calcwidestfalse \let\enit@calc#2% \else \ifnum\enit@calc=#2% \enit@calcwidestfalse \let\enit@calc\z@ \fi \setlength#1{#3}% \fi\fi} \def\enitkv@enumitem@widest#1{% \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax \@namedef{enit@widest@\@enumctr}##1{#1}} \def\enitkv@enumitem@widest@default{% \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax \expandafter\let\csname enit@widest@\@enumctr\endcsname\relax} \enitkv@key{enumitem}{widest*}{% \setcounter{enit@cnt}{#1}% \expandafter\edef\csname enit@cw@\@enumctr\endcsname {\the\c@enit@cnt}% \expandafter\edef\csname enit@widest@\@enumctr\endcsname##1% {##1{\the\c@enit@cnt}}} \enitkv@key{enumitem}{labelindent*}{% \enit@lblfrommargintrue \ifnum\enit@calc=\z@ \enit@calcwidestfalse \fi \setlength\labelindent{#1}% \advance\labelindent\leftmargin} \enitkv@key{enumitem}{labelindent}{% \enit@lblfrommarginfalse \enit@calcset\labelindent\z@{#1}} \enitkv@key{enumitem}{labelwidth}{% \enit@calcset\labelwidth\@ne{#1}} \enitkv@key{enumitem}{leftmargin}{% \edef\enit@c{\the\leftmargin}% \enit@calcset\leftmargin\thr@@{#1}% \ifenit@lblfrommargin \advance\labelindent-\enit@c\relax \advance\labelindent\leftmargin \fi} \enitkv@key{enumitem}{itemindent}{% \edef\enit@c{\the\itemindent}% \enit@calcset\itemindent\enit@iv{#1}% \ifenit@sepfrommargin \advance\labelsep-\enit@c\relax \advance\labelsep\itemindent \fi} \enitkv@key{enumitem}{listparindent}{% \setlength\listparindent{#1}} \enitkv@key{enumitem}{rightmargin}{% \setlength\rightmargin{#1}} % labelsep, from itemindent; labelsep*, from leftmargin \enitkv@key{enumitem}{labelsep*}{% \enit@sepfrommargintrue \ifnum\enit@calc=\tw@ \enit@calcwidestfalse \let\enit@calc\z@ \fi \setlength\labelsep{#1}% \advance\labelsep\itemindent} \enitkv@key{enumitem}{labelsep}{% \enit@sepfrommarginfalse \enit@calcset\labelsep\tw@{#1}} % Series, resume and start % ======================== \enitkv@key{enumitem-resume}{series}{% \enit@checkseries@m \let\enit@resuming\@ne \@ifundefined{enitkv@enumitem@#1}{}% {\enit@error{Invalid series name `#1'}% {Do not name a series with an existing key}}% \def\enit@series{#1}} \enitkv@key{enumitem}{series}{% \enit@checkseries{series}} \def\enitkv@enumitem@resume#1{% \edef\enit@series{#1}% \@nameuse{enit@resume@series@#1}\relax} \def\enitkv@enumitem@resume@default{% \@nameuse{enit@resume@\@currenvir}\relax} \@namedef{enitkv@enumitem-resume@resume*}#1{% \enit@checkseries@m \let\enit@resuming\tw@ \edef\enit@series{#1}% \@ifundefined{enit@resumekeys@series@#1}% {\enit@noserieserror{#1}}% {\expandafter\let\expandafter\enit@resumekeys \csname enit@resumekeys@series@#1\endcsname}} \@namedef{enitkv@enumitem-resume@resume*@default}{% \let\enit@resuming\thr@@ \expandafter\let\expandafter\enit@resumekeys \csname enit@resumekeys@\@currenvir\endcsname \@nameuse{enit@resume@\@currenvir}\relax} \enitkv@key{enumitem}{resume*}[]{% \enit@checkseries{resume*}} \newcommand\restartlist[1]{% \@ifundefined{end#1}% {\enit@error{Undefined list `#1'}% {No list has been defined with that name.}}% {\expandafter\let \csname enit@resume@#1\endcsname\@empty}} \enitkv@key{enumitem}{start}[\@ne]{% \setcounter{\@listctr}{#1}% \advance\@nameuse{c@\@listctr}\m@ne} % Penalties % ========= \enitkv@key{enumitem}{beginpenalty}{% \@beginparpenalty#1\relax} \enitkv@key{enumitem}{midpenalty}{% \@itempenalty#1\relax} \enitkv@key{enumitem}{endpenalty}{% \@endparpenalty#1\relax} % Font/Format % =========== \enitkv@key{enumitem}{format}{% \def\enit@format{#1}} \enitkv@key{enumitem}{font}{% \def\enit@format{#1}} % Description styles % ================== \enitkv@key{enumitem}{style}[normal]{% \@ifundefined{enit@style@#1}% {\enit@checkerror{style}{#1}}% {\enit@nextlinefalse \enit@boxdescfalse \@nameuse{enit@style@#1}% \edef\enit@descstyle{\enit@noexcs{enit@#1style}}}} \def\enit@style@standard{% \enit@boxdesctrue \enit@calcset\itemindent\enit@iv!} \let\enit@style@normal\enit@style@standard \def\enit@style@unboxed{% \enit@calcset\itemindent\enit@iv!} \def\enit@style@sameline{% \enit@calcset\labelwidth\@ne!} \def\enit@style@multiline{% \enit@align@parleft \enit@calcset\labelwidth\@ne!} \def\enit@style@nextline{% \enit@nextlinetrue \enit@calcset\labelwidth\@ne!} % Labels and refs % =============== % Aligment % -------- \enitkv@key{enumitem}{align}{% \@ifundefined{enit@align@#1}% {\enit@checkerror{align}{#1}}% {\csname enit@align@#1\endcsname}} % \nobreak for unboxed label with color. See below. \newcommand\SetLabelAlign[2]{% \enit@toks{#2}% \expandafter\edef\csname enit@align@#1\endcsname {\def\noexpand\enit@align####1{\nobreak\the\enit@toks}}} \def\enit@align@right{% \def\enit@align##1{\nobreak\hss\llap{##1}}} \def\enit@align@left{% \def\enit@align##1{\nobreak##1\hfil}} \def\enit@align@parleft{% \def\enit@align##1{% \nobreak \strut\smash{\parbox[t]\labelwidth{\raggedright##1}}}} % \enit@ref has three possible definitions: % (1) \relax, if there is neither label nor ref (ie, use % LaTeX settings). % (2) set ref to @itemlabel, if there is label but not ref % (3) set ref to ref, if there is ref (with or without label) \enitkv@key{enumitem}{label}{% \expandafter\def\@itemlabel{#1}% \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}} \enitkv@key{enumitem}{label*}{% \ifnum\enit@depth=\@ne \expandafter\def\@itemlabel{#1}% \else % no level 0 \advance\enit@depth\m@ne \enit@toks{#1}% \expandafter\edef\@itemlabel{% \enit@noexcs{label\enit@prevlabel}% \the\enit@toks}% \advance\enit@depth\@ne \fi \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}} % ref is set by label, except if there is an explicit ref % in the same hierarchy level. Explicit refs above the % current hierarchy level are overriden by label (besides ref), % too. Since an explicit ref has preference, it's delayed. \enitkv@key{enumitem}{ref}{% \g@addto@macro\enit@delayedkeys{,ref=#1}} \enitkv@key{enumitem-delayed}{ref}{% \def\enit@ref{\enit@reflabel{#1}\@ne}} % #2=0 don't "normalize" (ie, already normalized) % =1 "normalize" (in key ref) % Used thru \enit@ref \def\enit@reflabel#1#2{% \ifnum\enit@depth=\@ne\else % no level 0 \advance\enit@depth\@ne \@namedef{p@\@enumctr}{}% Don't accumulate labels \advance\enit@depth\m@ne \fi \ifcase#2% \@namedef{the\@enumctr}{{#1}}% \else \enit@normlabel{\csname the\@enumctr\endcsname}{#1}% \fi} % \xxx* in counters (refstar) and widest (calcdef) % ------------------------------------------------ % \enit@labellist contains a list of % \enit@elt{widest}\count\@count\enit@sc@@count % \enit@elt is either \enit@getwidth or \enit@refstar, defined % below % The current implementation is sub-optimal -- labels are stored in % labellist, counters defined again when processing labels, and % modifying it is almost impossible. \let\enit@labellist\@empty \newcommand\AddEnumerateCounter{% \@ifstar\enit@addcounter@s\enit@addcounter} \def\enit@addcounter#1#2#3{% \enit@toks\expandafter{% \enit@labellist \enit@elt{#3}}% \edef\enit@labellist{% \the\enit@toks \enit@noexcs{\expandafter\@gobble\string#1}% \enit@noexcs{\expandafter\@gobble\string#2}% \enit@noexcs{enit@sc@\expandafter\@gobble\string#2}}} \def\enit@addcounter@s#1#2#3{% \enit@addcounter{#1}{#2}% {\@nameuse{enit@sc@\expandafter\@gobble\string#2}{#3}}} % The 5 basic counters: \AddEnumerateCounter\arabic\@arabic{0} \AddEnumerateCounter\alph\@alph{m} \AddEnumerateCounter\Alph\@Alph{M} \AddEnumerateCounter\roman\@roman{viii} \AddEnumerateCounter\Roman\@Roman{VIII} % Inline lists % ============ % % Labels % ------ \enitkv@key{enumitem}{itemjoin}{% \def\enit@itemjoin{#1}} \enitkv@key{enumitem}{itemjoin*}{% \def\enit@itemjoin@s{#1}} \enitkv@key{enumitem}{afterlabel}{% \def\enit@afterlabel{#1}} % Mode % ---- \enitkv@key{enumitem}{mode}{% \@ifundefined{enit@mode#1}% {\enit@checkerror{mode}{#1}}% {\csname enit@mode#1\endcsname}} \let\enit@modeboxed\enit@boxmodetrue \let\enit@modeunboxed\enit@boxmodefalse % Short Labels % ============ \let\enit@marklist\@empty % shorthand, expansion: \newcommand\SetEnumerateShortLabel[2]{% \let\enit@a\@empty \def\enit@elt##1##2{% \def\enit@b{#1}\def\enit@c{##1}% \ifx\enit@b\enit@c\else \expandafter\def\expandafter\enit@a\expandafter{% \enit@a \enit@elt{##1}{##2}}% \fi}% \enit@marklist \expandafter\def\expandafter\enit@a\expandafter{% \enit@a \enit@elt{#1}{#2}}% \let\enit@marklist\enit@a} \SetEnumerateShortLabel{a}{\alph*} \SetEnumerateShortLabel{A}{\Alph*} \SetEnumerateShortLabel{i}{\roman*} \SetEnumerateShortLabel{I}{\Roman*} \SetEnumerateShortLabel{1}{\arabic*} % This is called \enit@first one,two,three,\@nil\@@nil. If there % are just one element #2 is \@nil, otherwise we have to remove % the trailing ,\@nil with enit@first@x % Called with the keys in \enit@c % Returns enit@toks \def\enit@first#1,#2\@@nil{% \in@{=}{#1}% Quick test, if contains =, it's key=value \ifin@\else \enitkv@@sp@def\enit@a{#1}% \@ifundefined{enitkv@enumitem@\enit@meaning\enit@a}% {\ifnum\enit@type=\z@ \def\enit@elt{\enit@replace\enit@a}% \enit@marklist % Returns \enit@toks \else \enit@toks{#1}% \fi \ifx\@nil#2% \ifx,#1,\else \edef\enit@c{label=\the\enit@toks}% \fi \else \@temptokena\expandafter{\enit@first@x#2}% \edef\enit@c{label=\the\enit@toks,\the\@temptokena}% \fi}% {}% \fi \enit@toks\expandafter{\enit@c}} \def\enit@first@x#1,\@nil{#1} \def\enit@replace#1#2#3{% \enit@toks{}% \def\enit@b##1#2##2\@@nil{% \ifx\@nil##2% \addto@hook\enit@toks{##1}% \else \edef\enit@a{\the\enit@toks}% \ifx\enit@a\@empty\else \enit@error{Extra short label ignored}% {There are more than one short label}% \fi \addto@hook\enit@toks{##1#3}% \enit@b##2\@@nil \fi}% \expandafter\enit@b#1#2\@nil\@@nil \edef#1{\the\enit@toks}} % Pre and post code % ================= \enitkv@key{enumitem}{before}{% \def\enit@before{#1}} \enitkv@key{enumitem}{after}{% \def\enit@after{#1}} \enitkv@key{enumitem}{before*}{% \expandafter\def\expandafter\enit@before\expandafter {\enit@before#1}} \enitkv@key{enumitem}{after*}{% \expandafter\def\expandafter\enit@after\expandafter {\enit@after#1}} % Miscelaneous keys % ================ \enitkv@key{enumitem}{nolistsep}[true]{% \partopsep=\z@skip \topsep=\z@ plus .1pt \itemsep=\z@skip \parsep=\z@skip} \enitkv@key{enumitem}{nosep}[true]{% \partopsep=\z@skip \topsep=\z@skip \itemsep=\z@skip \parsep=\z@skip} \enitkv@key{enumitem}{noitemsep}[true]{% \itemsep=\z@skip \parsep=\z@skip} \enitkv@key{enumitem}{wide}[\parindent]{% \enit@align@left \leftmargin\z@ \labelwidth\z@ \setlength\labelindent{#1}% \listparindent\labelindent \enit@calcset\itemindent\enit@iv!} % The following is deprecated in favour of wide: \enitkv@key{enumitem}{fullwidth}[true]{% \leftmargin\z@ \labelwidth\z@ \def\enit@align##1{\hskip\labelsep##1}} % "Abstract" layer % ================ % % Named values % ------------ \newcommand\SetEnumitemValue[2]{% Implicit #3 \@ifundefined{enit@enitkv@#1}% {\@ifundefined{enitkv@enumitem@#1}% {\enit@error{Wrong key `#1' in \string\SetEnumitemValue}% {Perhaps you have misspelled it}}{}% \expandafter\let\csname enit@enitkv@#1\expandafter\endcsname \csname enitkv@enumitem@#1\endcsname}{}% \@namedef{enitkv@enumitem@#1}##1{% \def\enit@a{##1}% \@ifundefined{enit@enitkv@#1@\enit@meaning\enit@a}% {\@nameuse{enit@enitkv@#1}{##1}}% {\@nameuse{enit@enitkv@#1\expandafter\expandafter\expandafter}% \expandafter\expandafter\expandafter {\csname enit@enitkv@#1@##1\endcsname}}{}}% \@namedef{enit@enitkv@#1@#2}} % Defining keys % ------------- \newcommand\SetEnumitemKey[2]{% \@ifundefined{enitkv@enumitem@#1}% {\enitkv@key{enumitem}{#1}[]{\enitkv@setkeys{enumitem}{#2}}}% {\enit@error{Duplicated key `#1' in \string\SetEnumitemKey}% {There already exists a key with that name}}} % +=============================+ % | PROCESSING KEYS | % +=============================+ % % Set keys % ======== \def\enit@setkeys#1{% \@ifundefined{enit@@#1}{}% {\expandafter\expandafter\expandafter \enit@setkeys@i\csname enit@@#1\endcsname\@@}} % The following is used directly in resumeset: \def\enit@setkeys@i#1\@@{% \let\enit@delayedkeys\@empty \enit@shl{#1}% is or returns \enit@toks \expandafter\enit@setkeys@ii\the\enit@toks\@@} \def\enit@setkeys@ii#1\@@{% \enitkv@setkeys{enumitem}{#1}% \enit@toks\expandafter{\enit@delayedkeys}% \edef\enit@a{% \noexpand\enitkv@setkeys{enumitem-delayed}{\the\enit@toks}}% \enit@a} % Handling * and ! values % ======================= % % \@gobbletwo removes \c from \c@counter. \def\enit@getwidth#1#2#3#4{% \let#4#3% \def#3##1{% \@ifundefined{enit@widest\expandafter\@gobbletwo\string##1}% if no widest=key {#1}% {\csname enit@widest\expandafter\@gobbletwo\string##1\endcsname{#4}}}} \def\enit@valueerror#1{\z@ % if after an assignment, but doesn't catch \ifnum \enit@error{No default \string\value\space for `#1'}% {You can provide one with widest*}}% \let\enit@values\@empty \def\enit@calcwidth{% \ifenit@calcwidest \ifnum\enit@type=\z@ % ie, enum \@ifundefined{enit@cw@\@enumctr}% {\@namedef{enit@cv@\@enumctr}{\enit@valueerror\@enumctr}}% {\edef\enit@values{% \enit@values \@nameuse{c@\@enumctr}\@nameuse{enit@cw@\@enumctr}\relax}% \expandafter \edef\csname enit@cv@\@enumctr\endcsname {\@nameuse{c@\@enumctr}}}% \fi \begingroup \enit@values \def\value##1{\csname enit@cv@##1\endcsname}% \let\enit@elt\enit@getwidth \enit@labellist \settowidth\labelwidth{\@itemlabel}% \xdef\enit@a{\labelwidth\the\labelwidth\relax}% \endgroup \enit@a \fi \advance\dimen@-\labelwidth} \def\enit@calcleft{% \dimen@\leftmargin \advance\dimen@\itemindent \advance\dimen@-\labelsep \advance\dimen@-\labelindent \ifcase\enit@calc % = 0 = labelindent \enit@calcwidth \advance\labelindent\dimen@ \or % = 1 = labelwidth, so no \enit@calcwidth \labelwidth\dimen@ \or % = 2 = labelsep \enit@calcwidth \advance\labelsep\dimen@ \or % = 3 = leftmargin \enit@calcwidth \advance\leftmargin-\dimen@ \or % = 4 =itemindent \enit@calcwidth \advance\itemindent-\dimen@ \fi} % "Normalizing" labels % ==================== % % Replaces \counter* by \counter{level} (those in \enit@labellist). % % #1 is either \csname...\endcsmame or the container \@itemlabel -- % hence \expandafter \def\enit@refstar@i#1#2{% \if*#2\@empty \noexpand#1{\@enumctr}% \else \noexpand#1{#2}% \fi}% \def\enit@refstar#1#2#3#4{% \def#2{\enit@refstar@i#2}% \def#3{\enit@refstar@i#3}} \def\enit@normlabel#1#2{% \begingroup \def\value{\enit@refstar@i\value}% \let\enit@elt\enit@refstar \enit@labellist \protected@xdef\enit@a{{#2}}% Added braces as \ref is in the \endgroup \expandafter\let#1\enit@a} % global scope. % Preliminary settings and default values % ======================================= \def\enit@prelist#1#2#3{% \let\enit@type#1% \def\enit@depth{#2}% \edef\enit@prevlabel{#3\romannumeral#2}% \advance#2\@ne} \def\enit@preset#1#2#3{% \enit@sepfrommarginfalse \enit@calcwidestfalse \let\enit@resuming\z@ \let\enit@series\relax \enit@boxmodetrue \def\enit@itemjoin{ }% \let\enit@itemjoin@s\relax \let\enit@afterlabel\nobreakspace \let\enit@before\@empty \let\enit@after\@empty \let\enit@format\@firstofone % and NOT empty \let\enit@ref\relax \labelindent\z@skip \ifnum\@listdepth=\@ne \enit@outerparindent\parindent \else \parindent\enit@outerparindent \fi \enit@setkeys{list}% \enit@setkeys{list\romannumeral\@listdepth}% \enit@setkeys{#1}% \enit@setkeys{#1\romannumeral#2}% \enit@setresume{#3}} % keyval "error" in enumitem-resume: all undefined keys (ie, all % except resume*) are ignored, but <series> is treated like % resume*=<series> \def\enitkv@err@a#1{% \@ifundefined{enit@resumekeys@series@\@tempa}{}% {\@nameuse{enitkv@enumitem-resume@resume*\expandafter}% \expandafter{\@tempa}}} % keyval "error" in the optional argument: all undefined keys are % passed to the keyval error, but <series> is ignored (already % processed in enumitem-resume \def\enitkv@err@b#1{% \@ifundefined{enit@resumekeys@series@\@tempa}% {\enit@savekverr{#1}}% {}} % Process keys in optional argument: \def\enit@setresume#1{% \enit@shl{#1}% Returns enit@toks \edef\enit@savekeys{\the\enit@toks}% \let\enit@savekverr\enitkv@errx \let\enitkv@errx\enitkv@err@a \edef\enit@b{% \noexpand\enitkv@setkeys{enumitem-resume}{\the\enit@toks}}% \enit@b \let\enitkv@errx\enitkv@err@b \ifcase\enit@resuming\or\or % = 2 \expandafter \enit@setkeys@i\enit@resumekeys,resume=\enit@series\@@ \or % = 3 \expandafter \enit@setkeys@i\enit@resumekeys,resume\@@ \fi \expandafter\enit@setkeys@i\enit@savekeys\@@ \let\enitkv@errx\enit@savekverr} % +=============================+ % | LIST TYPES | % +=============================+ % % Displayed lists % =============== % #1 #2 implicit \def\enit@dylist{% \enit@align@right \list} \def\enit@endlist{% \enit@after \endlist \ifx\enit@series\relax\else % discards resume*, too \ifnum\enit@resuming=\@ne % ie, series= \enit@setresumekeys{series@\enit@series}\global\global \else % ie, resume=, resume*= (save count, but not keys) \enit@setresumekeys{series@\enit@series}\@gobblefour\global \fi \enit@afterlist \fi \ifnum\enit@resuming=\thr@@ % ie, resume* list (save count only) \enit@setresumekeys\@currenvir\@gobblefour\global \else \enit@setresumekeys\@currenvir\@empty\@empty \fi \aftergroup\enit@afterlist} % #1 = either \@currenvir or series@<series> % #2(keys) #3(counter) are \global, \@gobblefour or \@empty \def\enit@setresumekeys#1#2#3{% \enit@toks\expandafter{\enit@savekeys}% \xdef\enit@afterlist{% #2\def\enit@noexcs{enit@resumekeys@#1}{\the\enit@toks}% \ifnum\enit@type=\z@ % ie, enum #3\def\enit@noexcs{enit@resume@#1}{% \csname c@\@listctr\endcsname \the\csname c@\@listctr\endcsname}% \fi}} % Inline lists % ============ % Definition of \@trivlist inside inline lists. So, when % \@trivlist is found in any displayed list (including quote, % center, verbatim...) the default \@item is restored. \def\enit@intrivlist{% \enit@changed@itemfalse \let\@item\enit@outer@item \let\par\@@par \let\@trivlist\enit@outer@triv \@trivlist} % Keep track of \@item and \item changes \newif\ifenit@changed@item \enit@changed@itemfalse \newif\ifenit@changeditem \enit@changeditemfalse % List % ---- % Arguments, as before: % \enitdp@<name>, <name>, <max-depth>, <format> % About @newlist, see @initem. \def\enit@inlist#1#2{% \ifnum\@listdepth>\enit@listdepth\relax \@toodeep \else \global\advance\@listdepth\@ne \fi \let\enit@align\@firstofone \def\@itemlabel{#1}% \@nmbrlistfalse \ifenit@changed@item\else \enit@changed@itemtrue \let\enit@outer@triv\@trivlist \let\@trivlist\enit@intrivlist \@setpar\@empty \let\enit@outer@item\@item \fi #2\relax \global\@newlisttrue \ifenit@boxmode \ifenit@changeditem\else \enit@changeditemtrue \let\enit@outeritem\item \fi \let\@item\enit@boxitem \else \let\@item\enit@noboxitem \ifx\enit@itemjoin@s\relax\else \PackageWarning{enumitem}% {itemjoin* discarded in mode unboxed\MessageBreak}% \fi \fi \let\enit@calcleft\relax \let\enit@afteritem\relax \ifenit@boxmode \global\setbox\enit@inbox\hbox\bgroup\color@begingroup \let\item\enit@endinbox \fi \ignorespaces} \def\enit@endinlist{% \ifenit@boxmode \unskip \xdef\enit@afteritem{% \ifhmode\spacefactor\the\spacefactor\relax\fi}% \color@endgroup \egroup \ifdim\wd\enit@inbox=\z@ \enit@itemerror \else \ifenit@noinitem\else \ifhmode\unskip\fi \@ifundefined{enit@itemjoin@s}% {\enit@itemjoin}% {\enit@itemjoin@s}% \fi \unhbox\@labels \enit@afterlabel \unhbox\enit@inbox \enit@afteritem \fi \else \unskip \if@newlist \enit@itemerror \fi \fi \enit@after \global\advance\@listdepth\m@ne \global\@inlabelfalse \if@newlist \global\@newlistfalse \@noitemerr \fi \ifx\enit@series\relax\else % discards resume* list, too \ifnum\enit@resuming=\@ne % ie, series \enit@setresumekeys{series@\enit@series}\global\global \else % ie, resume, resume* (save count, but not keys) \enit@setresumekeys{series@\enit@series}\@gobblefour\global \fi \enit@afterlist \fi \ifnum\enit@resuming=\thr@@ % ie, resume* list (save count only) \enit@setresumekeys\@currenvir\@gobblefour\global \else \enit@setresumekeys\@currenvir\@empty\@empty \fi \aftergroup\enit@afterlist} % \@item: unboxed % --------------- \def\enit@noboxitem[#1]{% \if@newlist \leavevmode % ships pending labels out \global\@newlistfalse \else \ifhmode \unskip \enit@itemjoin \else \noindent \fi \fi \if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}% after \unskip (hyperref) \fi \fi \mbox{\makelabel{#1}}% \enit@afterlabel \ignorespaces} % \@item: boxed % ------------ % % We don't want \item to be executed locally, because it sets a flag % (and hyperref adds another flag, too). So, we redefine it inside % the box to \enit@endinbox which ends the box and then use the actual % (outer) \item. labels are stored in another box, to detect empty % boxes, ie, misplaced \item's. Note the 2nd \item ends collecting % the 1st item and ships it out, while the 3rd \item ends collecting % the 2nd item, puts the itemjoin and then ships the 2nd item out. % The flag enit@noinitem keeps track of that. \newif\ifenit@noinitem \def\enit@endinbox{% \unskip \xdef\enit@afteritem{% \ifhmode\spacefactor\the\spacefactor\relax\fi}% \color@endgroup \egroup \enit@outeritem} \def\enit@boxitem[#1]{% \if@newlist \global\@newlistfalse \ifdim\wd\enit@inbox>\z@ \enit@itemerror \fi \enit@noinitemtrue \leavevmode % ships pending labels out \else \ifdim\wd\enit@inbox=\z@ \enit@itemerror \else \ifenit@noinitem \enit@noinitemfalse \else \ifhmode\unskip\fi \enit@itemjoin \fi \unhbox\@labels \enit@afterlabel \unhbox\enit@inbox \enit@afteritem \fi \fi \if@noitemarg \@noitemargfalse \if@nmbrlist \refstepcounter{\@listctr}% \fi \fi \sbox\@labels{\makelabel{#1}}% \let\enit@afteritem\relax \setbox\enit@inbox\hbox\bgroup\color@begingroup \let\item\enit@endinbox \hskip1sp % in case the first thing is \label \ignorespaces} % Pause item % ---------- % % To do. % % The three types % =============== % % enumerate and enumerate* % ------------------------ % % The following has 4 arguments, which in enumerate are: % \@enumdepth, enum, \thr@@, <format>. % In user defined environments they are: % \enitdp@<name>, <name>, <max-depth>, <format> \def\enit@enumerate{% \let\enit@list\enit@dylist \enit@enumerate@i} \@namedef{enit@enumerate*}{% \let\enit@list\enit@inlist \enit@enumerate@i} \def\enit@enumerate@i#1#2#3#4{% \ifnum#1>#3\relax \enit@toodeep \else \enit@prelist\z@{#1}{#2}% \edef\@enumctr{#2\romannumeral#1}% \expandafter \enit@list \csname label\@enumctr\endcsname {\usecounter\@enumctr \let\enit@calc\z@ \def\makelabel##1{\enit@align{\enit@format{##1}}}% \enit@preset{#2}{#1}{#4}% \enit@normlabel\@itemlabel\@itemlabel \enit@ref \enit@calcleft \enit@before}% \fi} \let\enit@endenumerate\enit@endlist \@namedef{enit@endenumerate*}{\enit@endinlist} % itemize and itemize* % -------------------- % % The following has 4 arguments, which in itemize are: % \@itemdepth, item, \thr@@, <format>. % In user defined environments they are: % \enitdp@<name>, <name>, <max-depth>, <format> \def\enit@itemize{% \let\enit@list\enit@dylist \enit@itemize@i} \@namedef{enit@itemize*}{% \let\enit@list\enit@inlist \enit@itemize@i} \def\enit@itemize@i#1#2#3#4{% \ifnum#1>#3\relax \enit@toodeep \else \enit@prelist\@ne{#1}{#2}% \edef\@itemitem{label#2\romannumeral#1}% \expandafter \enit@list \csname\@itemitem\endcsname {\let\enit@calc\z@ \def\makelabel##1{\enit@align{\enit@format{##1}}}% \enit@preset{#2}{#1}{#4}% \enit@calcleft \enit@before}% \fi} \let\enit@enditemize\enit@endlist \@namedef{enit@enditemize*}{\enit@endinlist} % description and description* % ---------------------------- % % Make sure \descriptionlabel exists: \providecommand*\descriptionlabel[1]{% \hspace\labelsep \normalfont\bfseries#1} \@namedef{enit@description*}{% \let\enit@list\enit@inlist \enit@description@i} \def\enit@description{% \let\enit@list\enit@dylist \enit@description@i} \def\enit@description@i#1#2#3#4{% \ifnum#1>#3\relax \enit@toodeep \else \enit@list{}% {\let\enit@type\tw@ \advance#1\@ne \labelwidth\z@ \enit@align@left \let\makelabel\descriptionlabel \enit@style@standard \enit@preset{#2}{#1}{#4}% \enit@calcleft \let\enit@svlabel\makelabel \def\makelabel##1{% \labelsep\z@ \ifenit@boxdesc \enit@svlabel{\enit@align{\enit@format{##1}}}% \else \nobreak \enit@svlabel{\enit@format{##1}}% \aftergroup\enit@postlabel \fi}% \enit@before}% \fi} \let\enit@enddescription\enit@endlist \@namedef{enit@enddescription*}{\enit@endinlist} % trivlist % ======== \def\enit@trivlist{% \let\enit@type\tw@ \parsep\parskip \csname @list\romannumeral\the\@listdepth\endcsname \@nmbrlistfalse \enit@setkeys{trivlist}% \enit@setkeys{trivlist\romannumeral\@listdepth}% \@trivlist \labelwidth\z@ \leftmargin\z@ \itemindent\z@ \let\@itemlabel\@empty \def\makelabel##1{##1}} % Description styles % ================== % % the next definition is somewhat tricky because labels are boxed. % That's fine when the label is just placed at the begining of a line % of text, but when the box is placed without horizontal material, % leading is killed. So, we need change somehow \box to \unhbox, but % I don't want to modify \@item. The code below presumes \@item has % not been changed and arguments gobble the part setting \@labels, % which is replaced by a new one. % % The default value in description is itemindent=!, but some styles % (those whose item text begin at a fixed place, ie, nextline, % multiline and sameline) change it to labelwidth=!. % % We must be careful with the group and the whatsit added by color to % boxes. Alignment is applied here and some adjustments in skips are % necessary to get proper line breaks (including a \nobreak at the % beginning of \enit@align, ie, after the first whatsit, see above). % To "pass" the inner group added by color to the box, \enit@postlabel % ckecks if the following is }. ie, \egroup -- if not, the box has % not reached yet its end. \def\enit@postlabel{% \@ifnextchar\egroup {\aftergroup\enit@postlabel}% {\enit@postlabel@i}} \def\enit@postlabel@i#1#2#3#4#5{% \def\enit@lblpenalty{\penalty\z@\hskip\skip@}% \ifenit@nextline \ifdim\wd\@tempboxa>\labelwidth \def\enit@lblpenalty{\newline\@nobreaktrue}% \fi \fi \everypar{% \@minipagefalse \global\@newlistfalse \if@inlabel \global\@inlabelfalse {\setbox\z@\lastbox \ifvoid\z@ \kern-\itemindent \fi}% \unhbox\@labels \skip@\lastskip % Save last \labelsep \unskip % Remove it \enit@lblpenalty % Restore it, after penalty \fi \if@nobreak \@nobreakfalse \clubpenalty\@M \else \clubpenalty\@clubpenalty \everypar{}% \fi}% \def\enit@a{#1#2#3#4}% \def\enit@b{\global\setbox\@labels\hbox}% \ifx\enit@a\enit@b\else \enit@error{Non standard \string\item}% {A class or a package has redefined \string\item\MessageBreak and I do not know how to continue}% \fi \global\setbox\@labels\hbox{% \unhbox\@labels \hskip\itemindent \hskip-\labelwidth \hskip-\labelsep \ifdim\wd\@tempboxa>\labelwidth \enit@align{\unhbox\@tempboxa}\unskip % Removes (typically) \hfil \else \leavevmode\hbox to\labelwidth{\enit@align{\unhbox\@tempboxa}}% \fi \hskip\labelsep}} % +=============================+ % | (RE)DEFINING LISTS | % +=============================+ % % Set keys/values % =============== % Remember \romannumeral0 expands to nothing. % #1 = list name, #2 = level, #3 = flag if star, #4 = keys/values \def\enit@saveset#1#2#3#4{% \setcounter{enit@cnt}{#2}% \ifcase#3% \expandafter \def\csname enit@@#1\romannumeral\c@enit@cnt\endcsname{#4}% \or \expandafter\let\expandafter\enit@b \csname enit@@#1\romannumeral\c@enit@cnt\endcsname \ifx\enit@b\relax \let\enit@b\@empty \fi \expandafter\def \csname enit@@#1\romannumeral\c@enit@cnt\expandafter\endcsname \expandafter{\enit@b,#4}% \fi} % To do: more robust tests (catch wrong names, but not easy) % Internally, LaTeX uses a short name for enumerate (enum) % and itemize (item). To be consistent with this convention, % a couple of macros provide a "translation". I'm not very % happy with the current implementation. \def\enit@shortenumerate{enum} \def\enit@shortitemize{item} \newcommand\setlist{% \@ifstar{\enit@setlist\@ne}{\enit@setlist\z@}} \def\enit@setlist#1{% \@ifnextchar[{\enit@setlist@x#1}{\enit@setlist@i#1\@empty}} % Let's accept \setlist[]*{}, too, because an error in <=3.5.1 \def\enit@setlist@x#1[#2]{% \@ifstar{\enit@setlist@i\@ne{#2}}{\enit@setlist@i#1{#2}}} % #1 list names/levels, #2 keys/values % #1 star flag, #2 list names/levels, #3 keys/values \def\enit@setlist@i#1#2#3{% \let\enit@eltnames\relax \let\enit@b\@empty \let\enit@eltlevels\relax \let\enit@c\@empty \protected@edef\enit@a{#2}% \@for\enit@a:=\enit@a\do{% the 2nd enit@a is first expanded \@ifundefined{enitdp@\enit@meaning\enit@a}% {\edef\enit@c{\enit@c\enit@eltlevels{\enit@a}}}% {\@ifundefined{enit@short\enit@meaning\enit@a}% \@empty {\edef\enit@a{\@nameuse{enit@short\enit@a}}}% \edef\enit@b{\enit@b\enit@eltnames{\enit@a}}}}% \ifx\enit@b\@empty \def\enit@b{\enit@eltnames{list}}% \fi \ifx\enit@c\@empty \def\enit@c{\enit@eltlevels{0}}% \fi \def\enit@eltnames##1{% \def\enit@a{##1}% \enit@c}% \def\enit@eltlevels##1{% \enit@saveset\enit@a{##1}#1{#3}}% \enit@b}% % Deprecated: \newcommand\setdisplayed[1][0]{\setlist[trivlist,#1]} \let\enitdp@trivlist\@empty % dummy, let know it exists \newcommand\setenumerate[1][0]{\setlist[enumerate,#1]} \newcommand\setitemize[1][0]{\setlist[itemize,#1]} \newcommand\setdescription[1][0]{\setlist[description,#1]} % New lists % ========= % When defining a list, \label... and counters must be defined % for each level, too: \def\enit@xset@itemize{% \@namedef{label\enit@c\romannumeral\count@}{% \enit@error{Undefined label}% {You have defined a list, but labels have not been setup.\MessageBreak You can set the label field with \string\setlist.}}} \@namedef{enit@xset@itemize*}{\enit@xset@itemize} \def\enit@xset@enumerate{% \enit@xset@itemize \@ifundefined{c@\enit@c\romannumeral\count@}% {\@definecounter{\enit@c\romannumeral\count@}}{}} \@namedef{enit@xset@enumerate*}{\enit@xset@enumerate} \let\enit@xset@description\@empty \@namedef{enit@xset@description*}{\enit@xset@description} \newcommand\newlist{\enit@newlist\newenvironment} \newcommand\renewlist{\enit@newlist\renewenvironment} % <new/renew>, <name>, <type>, <max-depth> \def\enit@newlist#1#2#3#4{% \@ifundefined{enit@xset@#3}% {\enit@error{Unknown list type `#3')}% {Valid types are: enumerate, itemize, description,\messageBreak enumerate*, itemize*, description*}}% {}% \setcounter{enit@cnt}{#4}% \count@\@ne \@ifundefined{enit@short#2}% {\def\enit@c{#2}}% {\edef\enit@c{\csname enit@short#2\endcsname}}% \loop \@nameuse{enit@xset@#3}% Uses \enit@c \ifnum\count@<\c@enit@cnt \advance\count@\@ne \repeat \@ifundefined{enitdp@#2}% {\expandafter\newcount\csname enitdp@#2\endcsname}{}% \csname enitdp@#2\endcsname\z@ \advance\c@enit@cnt\m@ne \edef\enit@a{% \noexpand#1{#2}[1][]% {\enit@noexcs{enit@#3}% \enit@noexcs{enitdp@#2}% {\enit@c}% {\the\c@enit@cnt}% {####1}}% {\enit@noexcs{enit@end#3}}}% \enit@a} % Changing the default nesting limit % ---------------------------------- \newcommand\setlistdepth{\def\enit@listdepth} \setlistdepth{5} % +=============================+ % | PACKAGE OPTIONS | % +=============================+ \newif\ifenit@loadonly \DeclareOption{ignoredisplayed}{\let\enit@trivlist\trivlist} \DeclareOption{loadonly}{\enit@loadonlytrue} \DeclareOption{shortlabels} {\def\enit@shl#1{% \ifnum\enit@type=\tw@ \enit@toks{#1}% \else \def\enit@c{#1}% \enit@first#1,\@nil\@@nil % Returns enit@toks \fi}} \DeclareOption{inline} {\newenvironment{enumerate*}[1][]% {\@nameuse{enit@enumerate*}\enitdp@enumerate{enum}\thr@@{#1}} {\@nameuse{enit@endenumerate*}} \newenvironment{itemize*}[1][]% {\@nameuse{enit@itemize*}\enitdp@itemize{item}\thr@@{#1}} {\@nameuse{enit@enditemize*}} \newenvironment{description*}[1][]% {\@nameuse{enit@description*}\enitdp@description{description}\@M{#1}} {\@nameuse{enit@enddescription*}}} \let\enit@shl\enit@toks \ProcessOptions \let\trivlist\enit@trivlist % If there is no loadonly, redefine the basic lists: \ifenit@loadonly\else \let\enitdp@enumerate\@enumdepth \renewenvironment{enumerate}[1][] {\enit@enumerate\enitdp@enumerate{enum}\thr@@{#1}} {\enit@endenumerate} \let\enitdp@itemize\@itemdepth \renewenvironment{itemize}[1][] {\enit@itemize\enitdp@itemize{item}\thr@@{#1}} {\enit@enditemize} \newcount\enitdp@description \renewenvironment{description}[1][] {\enit@description\enitdp@description{description}\@M{#1}} {\enit@enddescription} \fi \endinput