[9724df0] | 1 | % +--------------------------------------------------+ |
---|
| 2 | % | Typeset enumitem.tex to get the documentation. | |
---|
| 3 | % +--------------------------------------------------+ |
---|
| 4 | % |
---|
| 5 | % Copyright (c) 2003-2011 by Javier Bezos. |
---|
| 6 | % All Rights Reserved. |
---|
| 7 | % |
---|
| 8 | % This file is part of the enumitem distribution release 3.5.2 |
---|
| 9 | % ----------------------------------------------------------- |
---|
| 10 | % |
---|
| 11 | % It may be distributed and/or modified under the |
---|
| 12 | % conditions of the LaTeX Project Public License, either version 1.3 |
---|
| 13 | % of this license or (at your option) any later version. |
---|
| 14 | % The latest version of this license is in |
---|
| 15 | % http://www.latex-project.org/lppl.txt |
---|
| 16 | % and version 1.3 or later is part of all distributions of LaTeX |
---|
| 17 | % version 2003/12/01 or later. |
---|
| 18 | % |
---|
| 19 | % This work has the LPPL maintenance status "maintained". |
---|
| 20 | % |
---|
| 21 | % The Current Maintainer of this work is Javier Bezos. |
---|
| 22 | % |
---|
| 23 | % Notes |
---|
| 24 | % ~~~~~ |
---|
| 25 | % |
---|
| 26 | % The tag enit@ is used through the style |
---|
| 27 | % |
---|
| 28 | % To do: |
---|
| 29 | % ~~~~~~ |
---|
| 30 | % - ref*, for adding stuff in the same fashion as label* |
---|
| 31 | % - option ams, to force upshape, but I have to investigate |
---|
| 32 | % how to do it. |
---|
| 33 | % - labelled descriptions (ie, label, title, body) |
---|
| 34 | % - A true nextline (far from trivial and perhaps solved with |
---|
| 35 | % labelled descriptions). |
---|
| 36 | % - Improved \AddEnumerateCounter |
---|
| 37 | % - Compatibility with interfaces and zref-enumitem |
---|
| 38 | % - "Pausing" somehow inline boxed text. |
---|
| 39 | % - \@enumctr <-> \@listctr? |
---|
| 40 | % - Define keys with values |
---|
| 41 | % - Revise @nobreak |
---|
| 42 | % |
---|
| 43 | % Release |
---|
| 44 | % ~~~~~~~ |
---|
| 45 | |
---|
| 46 | \NeedsTeXFormat{LaTeX2e} |
---|
| 47 | \ProvidesPackage{enumitem}[2011/09/28 v3.5.2 Customized lists] |
---|
| 48 | |
---|
| 49 | % +=============================+ |
---|
| 50 | % | EMULATING KEYVAL | |
---|
| 51 | % +=============================+ |
---|
| 52 | % |
---|
| 53 | % "Thanks" to xkeyval, which use the same macros names as |
---|
| 54 | % keyval :-(, the latter has to be replicated in full here |
---|
| 55 | % to ensure it works as intended. The original work if by |
---|
| 56 | % David Carlisle, under license LPPL. Once the code is here, |
---|
| 57 | % it could be optimized by adpting it to the specific needs |
---|
| 58 | % of titlesec (to do). |
---|
| 59 | |
---|
| 60 | \def\enitkv@setkeys#1#2{% |
---|
| 61 | \def\enitkv@prefix{enitkv@#1@}% |
---|
| 62 | \let\@tempc\relax |
---|
| 63 | \enitkv@do#2,\relax,} |
---|
| 64 | |
---|
| 65 | \def\enitkv@do#1,{% |
---|
| 66 | \ifx\relax#1\empty\else |
---|
| 67 | \enitkv@split#1==\relax |
---|
| 68 | \expandafter\enitkv@do\fi} |
---|
| 69 | |
---|
| 70 | \def\enitkv@split#1=#2=#3\relax{% |
---|
| 71 | \enitkv@@sp@def\@tempa{#1}% |
---|
| 72 | \ifx\@tempa\@empty\else |
---|
| 73 | \expandafter\let\expandafter\@tempc |
---|
| 74 | \csname\enitkv@prefix\@tempa\endcsname |
---|
| 75 | \ifx\@tempc\relax |
---|
| 76 | \enitkv@errx{\@tempa\space undefined}% |
---|
| 77 | \else |
---|
| 78 | \ifx\@empty#3\@empty |
---|
| 79 | \enitkv@default |
---|
| 80 | \else |
---|
| 81 | \enitkv@@sp@def\@tempb{#2}% |
---|
| 82 | \expandafter\@tempc\expandafter{\@tempb}\relax |
---|
| 83 | \fi |
---|
| 84 | \fi |
---|
| 85 | \fi} |
---|
| 86 | |
---|
| 87 | \def\enitkv@default{% |
---|
| 88 | \expandafter\let\expandafter\@tempb |
---|
| 89 | \csname\enitkv@prefix\@tempa @default\endcsname |
---|
| 90 | \ifx\@tempb\relax |
---|
| 91 | \enitkv@err{No value specified for \@tempa}% |
---|
| 92 | \else |
---|
| 93 | \@tempb\relax |
---|
| 94 | \fi} |
---|
| 95 | |
---|
| 96 | \def\enitkv@errx#1{\enit@error{#1}\@ehc} |
---|
| 97 | |
---|
| 98 | \let\enitkv@err\enitkv@errx |
---|
| 99 | |
---|
| 100 | \def\@tempa#1{% |
---|
| 101 | \def\enitkv@@sp@def##1##2{% |
---|
| 102 | \futurelet\enitkv@tempa\enitkv@@sp@d##2\@nil\@nil#1\@nil\relax##1}% |
---|
| 103 | \def\enitkv@@sp@d{% |
---|
| 104 | \ifx\enitkv@tempa\@sptoken |
---|
| 105 | \expandafter\enitkv@@sp@b |
---|
| 106 | \else |
---|
| 107 | \expandafter\enitkv@@sp@b\expandafter#1% |
---|
| 108 | \fi}% |
---|
| 109 | \def\enitkv@@sp@b#1##1 \@nil{\enitkv@@sp@c##1}} |
---|
| 110 | |
---|
| 111 | \@tempa{ } |
---|
| 112 | |
---|
| 113 | \def\enitkv@@sp@c#1\@nil#2\relax#3{\enitkv@toks@{#1}\edef#3{\the\enitkv@toks@}} |
---|
| 114 | |
---|
| 115 | \@ifundefined{KV@toks@} |
---|
| 116 | {\newtoks\enitkv@toks@} |
---|
| 117 | {\let\enitkv@toks@\KV@toks@} |
---|
| 118 | |
---|
| 119 | \def\enitkv@key#1#2{% |
---|
| 120 | \@ifnextchar[{\enitkv@def{#1}{#2}}{\@namedef{enitkv@#1@#2}####1}} |
---|
| 121 | |
---|
| 122 | \def\enitkv@def#1#2[#3]{% |
---|
| 123 | \@namedef{enitkv@#1@#2@default\expandafter}\expandafter |
---|
| 124 | {\csname enitkv@#1@#2\endcsname{#3}}% |
---|
| 125 | \@namedef{enitkv@#1@#2}##1} |
---|
| 126 | |
---|
| 127 | % +=============================+ |
---|
| 128 | % | DEFINITIONS | |
---|
| 129 | % +=============================+ |
---|
| 130 | % |
---|
| 131 | % (1) The package uses a token register very often. To be on the |
---|
| 132 | % safe side, instead of \toks@, etc., a new one is declared. |
---|
| 133 | % (2) \enit@inbox is the box storing the items in boxed inline |
---|
| 134 | % lists. |
---|
| 135 | % (3) \enit@outerparindent is used to save the outer parindent |
---|
| 136 | % so that it can be used in the key parindent |
---|
| 137 | % (4) \enit@type has three values: 0 = enum, 1 = item, 2 = desc. |
---|
| 138 | % (5) \enit@calc stores which dimen is to be computed: |
---|
| 139 | % 0=labelindent, 1=labelwidth, 2=labelsep, 3=leftmargin, |
---|
| 140 | % 4=itemindent |
---|
| 141 | % (6) \enit@resuming has four values: 0 = none, 1 = series, |
---|
| 142 | % 2 = resume* series (computed in group enumitem-resume), |
---|
| 143 | % 3 = resume* list (ie, with no value). |
---|
| 144 | |
---|
| 145 | \chardef \enit@iv=4 |
---|
| 146 | \newlength\labelindent |
---|
| 147 | \newdimen \enit@outerparindent |
---|
| 148 | \newtoks \enit@toks |
---|
| 149 | \newbox \enit@inbox |
---|
| 150 | |
---|
| 151 | \newif\ifenit@boxmode |
---|
| 152 | \newif\ifenit@sepfrommargin |
---|
| 153 | \newif\ifenit@lblfrommargin |
---|
| 154 | \newif\ifenit@calcwidest |
---|
| 155 | \newif\ifenit@nextline |
---|
| 156 | \newif\ifenit@boxdesc |
---|
| 157 | |
---|
| 158 | % An alias (calc-savvy): |
---|
| 159 | |
---|
| 160 | \let\c@enit@cnt\@tempcnta |
---|
| 161 | |
---|
| 162 | \def\enit@meaning{\expandafter\strip@prefix\meaning} |
---|
| 163 | \def\enit@noexcs#1{\expandafter\noexpand\csname#1\endcsname} |
---|
| 164 | |
---|
| 165 | % Miscelaneous errors |
---|
| 166 | % =================== |
---|
| 167 | |
---|
| 168 | \def\enit@error{\PackageError{enumitem}} |
---|
| 169 | |
---|
| 170 | \def\enit@checkerror#1#2{% |
---|
| 171 | \enit@error{Unknown value `#2' for key `#1'}% |
---|
| 172 | {See the manual for valid values}} |
---|
| 173 | |
---|
| 174 | \def\enit@itemerror{% |
---|
| 175 | \enit@error{Misplaced \string\item}% |
---|
| 176 | {Either there is some text before the first\MessageBreak |
---|
| 177 | item or the last item has no text}} |
---|
| 178 | |
---|
| 179 | \def\enit@noserieserror#1{% |
---|
| 180 | \enit@error{Series `#1' not started}% |
---|
| 181 | {You are trying to continue a series\MessageBreak |
---|
| 182 | which has not been started with series}} |
---|
| 183 | |
---|
| 184 | \def\enit@checkseries#1{% |
---|
| 185 | \ifcase\enit@resuming |
---|
| 186 | \enit@error{Misplaced key `#1'}% |
---|
| 187 | {`series' and `resume*' must be used\MessageBreak |
---|
| 188 | in the optional argument of lists}% |
---|
| 189 | \fi} |
---|
| 190 | |
---|
| 191 | \def\enit@checkseries@m{% |
---|
| 192 | \ifcase\enit@resuming\else |
---|
| 193 | \enit@error{Uncompatible series settings}% |
---|
| 194 | {`series' and `resume*' must not be used\MessageBreak |
---|
| 195 | at the same time}% |
---|
| 196 | \fi} |
---|
| 197 | |
---|
| 198 | \let\enit@toodeep\@toodeep |
---|
| 199 | |
---|
| 200 | \def\@toodeep{% |
---|
| 201 | \ifnum\@listdepth>\enit@listdepth\relax |
---|
| 202 | \enit@toodeep |
---|
| 203 | \else |
---|
| 204 | \count@\@listdepth |
---|
| 205 | \global\advance\@listdepth\@ne |
---|
| 206 | \@ifundefined{@list\romannumeral\the\@listdepth}% |
---|
| 207 | {\expandafter\let |
---|
| 208 | \csname @list\romannumeral\the\@listdepth\expandafter\endcsname |
---|
| 209 | \csname @list\romannumeral\the\count@\endcsname}{}% |
---|
| 210 | \fi} |
---|
| 211 | |
---|
| 212 | |
---|
| 213 | % +=============================+ |
---|
| 214 | % | KEYS | |
---|
| 215 | % +=============================+ |
---|
| 216 | % |
---|
| 217 | % Including code executed by keys. |
---|
| 218 | % |
---|
| 219 | % There are 2 keyval groups: enumitem, and enumitem-delayed. |
---|
| 220 | % The latter is used to make sure a prioritary key is the |
---|
| 221 | % latest one; eg, ref, so that the ref format set by label |
---|
| 222 | % is overriden. So, when this key is found in enumitem, |
---|
| 223 | % nothing is done, except the key/value is moved to |
---|
| 224 | % enumitem-delayed. |
---|
| 225 | % |
---|
| 226 | % A further group (enumitem-resume) catches resume* and |
---|
| 227 | % series in optional arguments in lists. |
---|
| 228 | % |
---|
| 229 | % Vertical spacing |
---|
| 230 | % ================ |
---|
| 231 | |
---|
| 232 | \enitkv@key{enumitem}{topsep}{% |
---|
| 233 | \setlength\topsep{#1}} |
---|
| 234 | |
---|
| 235 | \enitkv@key{enumitem}{itemsep}{% |
---|
| 236 | \setlength\itemsep{#1}} |
---|
| 237 | |
---|
| 238 | \enitkv@key{enumitem}{parsep}{% |
---|
| 239 | \setlength\parsep{#1}} |
---|
| 240 | |
---|
| 241 | \enitkv@key{enumitem}{partopsep}{% |
---|
| 242 | \setlength\partopsep{#1}} |
---|
| 243 | |
---|
| 244 | % Horizontal spacing |
---|
| 245 | % ================== |
---|
| 246 | % |
---|
| 247 | % There are 3 cases: *, ! and a value. The latter also |
---|
| 248 | % cancels widest with the sequence key=* ... key=value |
---|
| 249 | % \string is used, just in case some package changes the |
---|
| 250 | % catcodes. |
---|
| 251 | |
---|
| 252 | \def\enit@calcset#1#2#3{% |
---|
| 253 | \if\string*\string#3% |
---|
| 254 | \enit@calcwidesttrue |
---|
| 255 | \let\enit@calc#2% |
---|
| 256 | \else\if\string!\string#3% |
---|
| 257 | \enit@calcwidestfalse |
---|
| 258 | \let\enit@calc#2% |
---|
| 259 | \else |
---|
| 260 | \ifnum\enit@calc=#2% |
---|
| 261 | \enit@calcwidestfalse |
---|
| 262 | \let\enit@calc\z@ |
---|
| 263 | \fi |
---|
| 264 | \setlength#1{#3}% |
---|
| 265 | \fi\fi} |
---|
| 266 | |
---|
| 267 | \def\enitkv@enumitem@widest#1{% |
---|
| 268 | \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax |
---|
| 269 | \@namedef{enit@widest@\@enumctr}##1{#1}} |
---|
| 270 | |
---|
| 271 | \def\enitkv@enumitem@widest@default{% |
---|
| 272 | \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax |
---|
| 273 | \expandafter\let\csname enit@widest@\@enumctr\endcsname\relax} |
---|
| 274 | |
---|
| 275 | \enitkv@key{enumitem}{widest*}{% |
---|
| 276 | \setcounter{enit@cnt}{#1}% |
---|
| 277 | \expandafter\edef\csname enit@cw@\@enumctr\endcsname |
---|
| 278 | {\the\c@enit@cnt}% |
---|
| 279 | \expandafter\edef\csname enit@widest@\@enumctr\endcsname##1% |
---|
| 280 | {##1{\the\c@enit@cnt}}} |
---|
| 281 | |
---|
| 282 | \enitkv@key{enumitem}{labelindent*}{% |
---|
| 283 | \enit@lblfrommargintrue |
---|
| 284 | \ifnum\enit@calc=\z@ |
---|
| 285 | \enit@calcwidestfalse |
---|
| 286 | \fi |
---|
| 287 | \setlength\labelindent{#1}% |
---|
| 288 | \advance\labelindent\leftmargin} |
---|
| 289 | |
---|
| 290 | \enitkv@key{enumitem}{labelindent}{% |
---|
| 291 | \enit@lblfrommarginfalse |
---|
| 292 | \enit@calcset\labelindent\z@{#1}} |
---|
| 293 | |
---|
| 294 | \enitkv@key{enumitem}{labelwidth}{% |
---|
| 295 | \enit@calcset\labelwidth\@ne{#1}} |
---|
| 296 | |
---|
| 297 | \enitkv@key{enumitem}{leftmargin}{% |
---|
| 298 | \edef\enit@c{\the\leftmargin}% |
---|
| 299 | \enit@calcset\leftmargin\thr@@{#1}% |
---|
| 300 | \ifenit@lblfrommargin |
---|
| 301 | \advance\labelindent-\enit@c\relax |
---|
| 302 | \advance\labelindent\leftmargin |
---|
| 303 | \fi} |
---|
| 304 | |
---|
| 305 | \enitkv@key{enumitem}{itemindent}{% |
---|
| 306 | \edef\enit@c{\the\itemindent}% |
---|
| 307 | \enit@calcset\itemindent\enit@iv{#1}% |
---|
| 308 | \ifenit@sepfrommargin |
---|
| 309 | \advance\labelsep-\enit@c\relax |
---|
| 310 | \advance\labelsep\itemindent |
---|
| 311 | \fi} |
---|
| 312 | |
---|
| 313 | \enitkv@key{enumitem}{listparindent}{% |
---|
| 314 | \setlength\listparindent{#1}} |
---|
| 315 | |
---|
| 316 | \enitkv@key{enumitem}{rightmargin}{% |
---|
| 317 | \setlength\rightmargin{#1}} |
---|
| 318 | |
---|
| 319 | % labelsep, from itemindent; labelsep*, from leftmargin |
---|
| 320 | |
---|
| 321 | \enitkv@key{enumitem}{labelsep*}{% |
---|
| 322 | \enit@sepfrommargintrue |
---|
| 323 | \ifnum\enit@calc=\tw@ |
---|
| 324 | \enit@calcwidestfalse |
---|
| 325 | \let\enit@calc\z@ |
---|
| 326 | \fi |
---|
| 327 | \setlength\labelsep{#1}% |
---|
| 328 | \advance\labelsep\itemindent} |
---|
| 329 | |
---|
| 330 | \enitkv@key{enumitem}{labelsep}{% |
---|
| 331 | \enit@sepfrommarginfalse |
---|
| 332 | \enit@calcset\labelsep\tw@{#1}} |
---|
| 333 | |
---|
| 334 | % Series, resume and start |
---|
| 335 | % ======================== |
---|
| 336 | |
---|
| 337 | \enitkv@key{enumitem-resume}{series}{% |
---|
| 338 | \enit@checkseries@m |
---|
| 339 | \let\enit@resuming\@ne |
---|
| 340 | \@ifundefined{enitkv@enumitem@#1}{}% |
---|
| 341 | {\enit@error{Invalid series name `#1'}% |
---|
| 342 | {Do not name a series with an existing key}}% |
---|
| 343 | \def\enit@series{#1}} |
---|
| 344 | |
---|
| 345 | \enitkv@key{enumitem}{series}{% |
---|
| 346 | \enit@checkseries{series}} |
---|
| 347 | |
---|
| 348 | \def\enitkv@enumitem@resume#1{% |
---|
| 349 | \edef\enit@series{#1}% |
---|
| 350 | \@nameuse{enit@resume@series@#1}\relax} |
---|
| 351 | |
---|
| 352 | \def\enitkv@enumitem@resume@default{% |
---|
| 353 | \@nameuse{enit@resume@\@currenvir}\relax} |
---|
| 354 | |
---|
| 355 | \@namedef{enitkv@enumitem-resume@resume*}#1{% |
---|
| 356 | \enit@checkseries@m |
---|
| 357 | \let\enit@resuming\tw@ |
---|
| 358 | \edef\enit@series{#1}% |
---|
| 359 | \@ifundefined{enit@resumekeys@series@#1}% |
---|
| 360 | {\enit@noserieserror{#1}}% |
---|
| 361 | {\expandafter\let\expandafter\enit@resumekeys |
---|
| 362 | \csname enit@resumekeys@series@#1\endcsname}} |
---|
| 363 | |
---|
| 364 | \@namedef{enitkv@enumitem-resume@resume*@default}{% |
---|
| 365 | \let\enit@resuming\thr@@ |
---|
| 366 | \expandafter\let\expandafter\enit@resumekeys |
---|
| 367 | \csname enit@resumekeys@\@currenvir\endcsname |
---|
| 368 | \@nameuse{enit@resume@\@currenvir}\relax} |
---|
| 369 | |
---|
| 370 | \enitkv@key{enumitem}{resume*}[]{% |
---|
| 371 | \enit@checkseries{resume*}} |
---|
| 372 | |
---|
| 373 | \newcommand\restartlist[1]{% |
---|
| 374 | \@ifundefined{end#1}% |
---|
| 375 | {\enit@error{Undefined list `#1'}% |
---|
| 376 | {No list has been defined with that name.}}% |
---|
| 377 | {\expandafter\let |
---|
| 378 | \csname enit@resume@#1\endcsname\@empty}} |
---|
| 379 | |
---|
| 380 | \enitkv@key{enumitem}{start}[\@ne]{% |
---|
| 381 | \setcounter{\@listctr}{#1}% |
---|
| 382 | \advance\@nameuse{c@\@listctr}\m@ne} |
---|
| 383 | |
---|
| 384 | % Penalties |
---|
| 385 | % ========= |
---|
| 386 | |
---|
| 387 | \enitkv@key{enumitem}{beginpenalty}{% |
---|
| 388 | \@beginparpenalty#1\relax} |
---|
| 389 | |
---|
| 390 | \enitkv@key{enumitem}{midpenalty}{% |
---|
| 391 | \@itempenalty#1\relax} |
---|
| 392 | |
---|
| 393 | \enitkv@key{enumitem}{endpenalty}{% |
---|
| 394 | \@endparpenalty#1\relax} |
---|
| 395 | |
---|
| 396 | % Font/Format |
---|
| 397 | % =========== |
---|
| 398 | |
---|
| 399 | \enitkv@key{enumitem}{format}{% |
---|
| 400 | \def\enit@format{#1}} |
---|
| 401 | |
---|
| 402 | \enitkv@key{enumitem}{font}{% |
---|
| 403 | \def\enit@format{#1}} |
---|
| 404 | |
---|
| 405 | % Description styles |
---|
| 406 | % ================== |
---|
| 407 | |
---|
| 408 | \enitkv@key{enumitem}{style}[normal]{% |
---|
| 409 | \@ifundefined{enit@style@#1}% |
---|
| 410 | {\enit@checkerror{style}{#1}}% |
---|
| 411 | {\enit@nextlinefalse |
---|
| 412 | \enit@boxdescfalse |
---|
| 413 | \@nameuse{enit@style@#1}% |
---|
| 414 | \edef\enit@descstyle{\enit@noexcs{enit@#1style}}}} |
---|
| 415 | |
---|
| 416 | \def\enit@style@standard{% |
---|
| 417 | \enit@boxdesctrue |
---|
| 418 | \enit@calcset\itemindent\enit@iv!} |
---|
| 419 | |
---|
| 420 | \let\enit@style@normal\enit@style@standard |
---|
| 421 | |
---|
| 422 | \def\enit@style@unboxed{% |
---|
| 423 | \enit@calcset\itemindent\enit@iv!} |
---|
| 424 | |
---|
| 425 | \def\enit@style@sameline{% |
---|
| 426 | \enit@calcset\labelwidth\@ne!} |
---|
| 427 | |
---|
| 428 | \def\enit@style@multiline{% |
---|
| 429 | \enit@align@parleft |
---|
| 430 | \enit@calcset\labelwidth\@ne!} |
---|
| 431 | |
---|
| 432 | \def\enit@style@nextline{% |
---|
| 433 | \enit@nextlinetrue |
---|
| 434 | \enit@calcset\labelwidth\@ne!} |
---|
| 435 | |
---|
| 436 | % Labels and refs |
---|
| 437 | % =============== |
---|
| 438 | |
---|
| 439 | % Aligment |
---|
| 440 | % -------- |
---|
| 441 | |
---|
| 442 | \enitkv@key{enumitem}{align}{% |
---|
| 443 | \@ifundefined{enit@align@#1}% |
---|
| 444 | {\enit@checkerror{align}{#1}}% |
---|
| 445 | {\csname enit@align@#1\endcsname}} |
---|
| 446 | |
---|
| 447 | % \nobreak for unboxed label with color. See below. |
---|
| 448 | |
---|
| 449 | \newcommand\SetLabelAlign[2]{% |
---|
| 450 | \enit@toks{#2}% |
---|
| 451 | \expandafter\edef\csname enit@align@#1\endcsname |
---|
| 452 | {\def\noexpand\enit@align####1{\nobreak\the\enit@toks}}} |
---|
| 453 | |
---|
| 454 | \def\enit@align@right{% |
---|
| 455 | \def\enit@align##1{\nobreak\hss\llap{##1}}} |
---|
| 456 | |
---|
| 457 | \def\enit@align@left{% |
---|
| 458 | \def\enit@align##1{\nobreak##1\hfil}} |
---|
| 459 | |
---|
| 460 | \def\enit@align@parleft{% |
---|
| 461 | \def\enit@align##1{% |
---|
| 462 | \nobreak |
---|
| 463 | \strut\smash{\parbox[t]\labelwidth{\raggedright##1}}}} |
---|
| 464 | |
---|
| 465 | % \enit@ref has three possible definitions: |
---|
| 466 | % (1) \relax, if there is neither label nor ref (ie, use |
---|
| 467 | % LaTeX settings). |
---|
| 468 | % (2) set ref to @itemlabel, if there is label but not ref |
---|
| 469 | % (3) set ref to ref, if there is ref (with or without label) |
---|
| 470 | |
---|
| 471 | \enitkv@key{enumitem}{label}{% |
---|
| 472 | \expandafter\def\@itemlabel{#1}% |
---|
| 473 | \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}} |
---|
| 474 | |
---|
| 475 | \enitkv@key{enumitem}{label*}{% |
---|
| 476 | \ifnum\enit@depth=\@ne |
---|
| 477 | \expandafter\def\@itemlabel{#1}% |
---|
| 478 | \else % no level 0 |
---|
| 479 | \advance\enit@depth\m@ne |
---|
| 480 | \enit@toks{#1}% |
---|
| 481 | \expandafter\edef\@itemlabel{% |
---|
| 482 | \enit@noexcs{label\enit@prevlabel}% |
---|
| 483 | \the\enit@toks}% |
---|
| 484 | \advance\enit@depth\@ne |
---|
| 485 | \fi |
---|
| 486 | \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}} |
---|
| 487 | |
---|
| 488 | % ref is set by label, except if there is an explicit ref |
---|
| 489 | % in the same hierarchy level. Explicit refs above the |
---|
| 490 | % current hierarchy level are overriden by label (besides ref), |
---|
| 491 | % too. Since an explicit ref has preference, it's delayed. |
---|
| 492 | |
---|
| 493 | \enitkv@key{enumitem}{ref}{% |
---|
| 494 | \g@addto@macro\enit@delayedkeys{,ref=#1}} |
---|
| 495 | |
---|
| 496 | \enitkv@key{enumitem-delayed}{ref}{% |
---|
| 497 | \def\enit@ref{\enit@reflabel{#1}\@ne}} |
---|
| 498 | |
---|
| 499 | % #2=0 don't "normalize" (ie, already normalized) |
---|
| 500 | % =1 "normalize" (in key ref) |
---|
| 501 | % Used thru \enit@ref |
---|
| 502 | |
---|
| 503 | \def\enit@reflabel#1#2{% |
---|
| 504 | \ifnum\enit@depth=\@ne\else % no level 0 |
---|
| 505 | \advance\enit@depth\@ne |
---|
| 506 | \@namedef{p@\@enumctr}{}% Don't accumulate labels |
---|
| 507 | \advance\enit@depth\m@ne |
---|
| 508 | \fi |
---|
| 509 | \ifcase#2% |
---|
| 510 | \@namedef{the\@enumctr}{{#1}}% |
---|
| 511 | \else |
---|
| 512 | \enit@normlabel{\csname the\@enumctr\endcsname}{#1}% |
---|
| 513 | \fi} |
---|
| 514 | |
---|
| 515 | % \xxx* in counters (refstar) and widest (calcdef) |
---|
| 516 | % ------------------------------------------------ |
---|
| 517 | % \enit@labellist contains a list of |
---|
| 518 | % \enit@elt{widest}\count\@count\enit@sc@@count |
---|
| 519 | % \enit@elt is either \enit@getwidth or \enit@refstar, defined |
---|
| 520 | % below |
---|
| 521 | % The current implementation is sub-optimal -- labels are stored in |
---|
| 522 | % labellist, counters defined again when processing labels, and |
---|
| 523 | % modifying it is almost impossible. |
---|
| 524 | |
---|
| 525 | \let\enit@labellist\@empty |
---|
| 526 | |
---|
| 527 | \newcommand\AddEnumerateCounter{% |
---|
| 528 | \@ifstar\enit@addcounter@s\enit@addcounter} |
---|
| 529 | |
---|
| 530 | \def\enit@addcounter#1#2#3{% |
---|
| 531 | \enit@toks\expandafter{% |
---|
| 532 | \enit@labellist |
---|
| 533 | \enit@elt{#3}}% |
---|
| 534 | \edef\enit@labellist{% |
---|
| 535 | \the\enit@toks |
---|
| 536 | \enit@noexcs{\expandafter\@gobble\string#1}% |
---|
| 537 | \enit@noexcs{\expandafter\@gobble\string#2}% |
---|
| 538 | \enit@noexcs{enit@sc@\expandafter\@gobble\string#2}}} |
---|
| 539 | |
---|
| 540 | \def\enit@addcounter@s#1#2#3{% |
---|
| 541 | \enit@addcounter{#1}{#2}% |
---|
| 542 | {\@nameuse{enit@sc@\expandafter\@gobble\string#2}{#3}}} |
---|
| 543 | |
---|
| 544 | % The 5 basic counters: |
---|
| 545 | |
---|
| 546 | \AddEnumerateCounter\arabic\@arabic{0} |
---|
| 547 | \AddEnumerateCounter\alph\@alph{m} |
---|
| 548 | \AddEnumerateCounter\Alph\@Alph{M} |
---|
| 549 | \AddEnumerateCounter\roman\@roman{viii} |
---|
| 550 | \AddEnumerateCounter\Roman\@Roman{VIII} |
---|
| 551 | |
---|
| 552 | % Inline lists |
---|
| 553 | % ============ |
---|
| 554 | % |
---|
| 555 | % Labels |
---|
| 556 | % ------ |
---|
| 557 | |
---|
| 558 | \enitkv@key{enumitem}{itemjoin}{% |
---|
| 559 | \def\enit@itemjoin{#1}} |
---|
| 560 | |
---|
| 561 | \enitkv@key{enumitem}{itemjoin*}{% |
---|
| 562 | \def\enit@itemjoin@s{#1}} |
---|
| 563 | |
---|
| 564 | \enitkv@key{enumitem}{afterlabel}{% |
---|
| 565 | \def\enit@afterlabel{#1}} |
---|
| 566 | |
---|
| 567 | % Mode |
---|
| 568 | % ---- |
---|
| 569 | |
---|
| 570 | \enitkv@key{enumitem}{mode}{% |
---|
| 571 | \@ifundefined{enit@mode#1}% |
---|
| 572 | {\enit@checkerror{mode}{#1}}% |
---|
| 573 | {\csname enit@mode#1\endcsname}} |
---|
| 574 | |
---|
| 575 | \let\enit@modeboxed\enit@boxmodetrue |
---|
| 576 | \let\enit@modeunboxed\enit@boxmodefalse |
---|
| 577 | |
---|
| 578 | % Short Labels |
---|
| 579 | % ============ |
---|
| 580 | |
---|
| 581 | \let\enit@marklist\@empty |
---|
| 582 | |
---|
| 583 | % shorthand, expansion: |
---|
| 584 | |
---|
| 585 | \newcommand\SetEnumerateShortLabel[2]{% |
---|
| 586 | \let\enit@a\@empty |
---|
| 587 | \def\enit@elt##1##2{% |
---|
| 588 | \def\enit@b{#1}\def\enit@c{##1}% |
---|
| 589 | \ifx\enit@b\enit@c\else |
---|
| 590 | \expandafter\def\expandafter\enit@a\expandafter{% |
---|
| 591 | \enit@a |
---|
| 592 | \enit@elt{##1}{##2}}% |
---|
| 593 | \fi}% |
---|
| 594 | \enit@marklist |
---|
| 595 | \expandafter\def\expandafter\enit@a\expandafter{% |
---|
| 596 | \enit@a |
---|
| 597 | \enit@elt{#1}{#2}}% |
---|
| 598 | \let\enit@marklist\enit@a} |
---|
| 599 | |
---|
| 600 | \SetEnumerateShortLabel{a}{\alph*} |
---|
| 601 | \SetEnumerateShortLabel{A}{\Alph*} |
---|
| 602 | \SetEnumerateShortLabel{i}{\roman*} |
---|
| 603 | \SetEnumerateShortLabel{I}{\Roman*} |
---|
| 604 | \SetEnumerateShortLabel{1}{\arabic*} |
---|
| 605 | |
---|
| 606 | % This is called \enit@first one,two,three,\@nil\@@nil. If there |
---|
| 607 | % are just one element #2 is \@nil, otherwise we have to remove |
---|
| 608 | % the trailing ,\@nil with enit@first@x |
---|
| 609 | % Called with the keys in \enit@c |
---|
| 610 | % Returns enit@toks |
---|
| 611 | |
---|
| 612 | \def\enit@first#1,#2\@@nil{% |
---|
| 613 | \in@{=}{#1}% Quick test, if contains =, it's key=value |
---|
| 614 | \ifin@\else |
---|
| 615 | \enitkv@@sp@def\enit@a{#1}% |
---|
| 616 | \@ifundefined{enitkv@enumitem@\enit@meaning\enit@a}% |
---|
| 617 | {\ifnum\enit@type=\z@ |
---|
| 618 | \def\enit@elt{\enit@replace\enit@a}% |
---|
| 619 | \enit@marklist % Returns \enit@toks |
---|
| 620 | \else |
---|
| 621 | \enit@toks{#1}% |
---|
| 622 | \fi |
---|
| 623 | \ifx\@nil#2% |
---|
| 624 | \ifx,#1,\else |
---|
| 625 | \edef\enit@c{label=\the\enit@toks}% |
---|
| 626 | \fi |
---|
| 627 | \else |
---|
| 628 | \@temptokena\expandafter{\enit@first@x#2}% |
---|
| 629 | \edef\enit@c{label=\the\enit@toks,\the\@temptokena}% |
---|
| 630 | \fi}% |
---|
| 631 | {}% |
---|
| 632 | \fi |
---|
| 633 | \enit@toks\expandafter{\enit@c}} |
---|
| 634 | |
---|
| 635 | \def\enit@first@x#1,\@nil{#1} |
---|
| 636 | |
---|
| 637 | \def\enit@replace#1#2#3{% |
---|
| 638 | \enit@toks{}% |
---|
| 639 | \def\enit@b##1#2##2\@@nil{% |
---|
| 640 | \ifx\@nil##2% |
---|
| 641 | \addto@hook\enit@toks{##1}% |
---|
| 642 | \else |
---|
| 643 | \edef\enit@a{\the\enit@toks}% |
---|
| 644 | \ifx\enit@a\@empty\else |
---|
| 645 | \enit@error{Extra short label ignored}% |
---|
| 646 | {There are more than one short label}% |
---|
| 647 | \fi |
---|
| 648 | \addto@hook\enit@toks{##1#3}% |
---|
| 649 | \enit@b##2\@@nil |
---|
| 650 | \fi}% |
---|
| 651 | \expandafter\enit@b#1#2\@nil\@@nil |
---|
| 652 | \edef#1{\the\enit@toks}} |
---|
| 653 | |
---|
| 654 | % Pre and post code |
---|
| 655 | % ================= |
---|
| 656 | |
---|
| 657 | \enitkv@key{enumitem}{before}{% |
---|
| 658 | \def\enit@before{#1}} |
---|
| 659 | |
---|
| 660 | \enitkv@key{enumitem}{after}{% |
---|
| 661 | \def\enit@after{#1}} |
---|
| 662 | |
---|
| 663 | \enitkv@key{enumitem}{before*}{% |
---|
| 664 | \expandafter\def\expandafter\enit@before\expandafter |
---|
| 665 | {\enit@before#1}} |
---|
| 666 | |
---|
| 667 | \enitkv@key{enumitem}{after*}{% |
---|
| 668 | \expandafter\def\expandafter\enit@after\expandafter |
---|
| 669 | {\enit@after#1}} |
---|
| 670 | |
---|
| 671 | % Miscelaneous keys |
---|
| 672 | % ================ |
---|
| 673 | |
---|
| 674 | \enitkv@key{enumitem}{nolistsep}[true]{% |
---|
| 675 | \partopsep=\z@skip |
---|
| 676 | \topsep=\z@ plus .1pt |
---|
| 677 | \itemsep=\z@skip |
---|
| 678 | \parsep=\z@skip} |
---|
| 679 | |
---|
| 680 | \enitkv@key{enumitem}{nosep}[true]{% |
---|
| 681 | \partopsep=\z@skip |
---|
| 682 | \topsep=\z@skip |
---|
| 683 | \itemsep=\z@skip |
---|
| 684 | \parsep=\z@skip} |
---|
| 685 | |
---|
| 686 | |
---|
| 687 | \enitkv@key{enumitem}{noitemsep}[true]{% |
---|
| 688 | \itemsep=\z@skip |
---|
| 689 | \parsep=\z@skip} |
---|
| 690 | |
---|
| 691 | \enitkv@key{enumitem}{wide}[\parindent]{% |
---|
| 692 | \enit@align@left |
---|
| 693 | \leftmargin\z@ |
---|
| 694 | \labelwidth\z@ |
---|
| 695 | \setlength\labelindent{#1}% |
---|
| 696 | \listparindent\labelindent |
---|
| 697 | \enit@calcset\itemindent\enit@iv!} |
---|
| 698 | |
---|
| 699 | % The following is deprecated in favour of wide: |
---|
| 700 | |
---|
| 701 | \enitkv@key{enumitem}{fullwidth}[true]{% |
---|
| 702 | \leftmargin\z@ |
---|
| 703 | \labelwidth\z@ |
---|
| 704 | \def\enit@align##1{\hskip\labelsep##1}} |
---|
| 705 | |
---|
| 706 | % "Abstract" layer |
---|
| 707 | % ================ |
---|
| 708 | % |
---|
| 709 | % Named values |
---|
| 710 | % ------------ |
---|
| 711 | |
---|
| 712 | \newcommand\SetEnumitemValue[2]{% Implicit #3 |
---|
| 713 | \@ifundefined{enit@enitkv@#1}% |
---|
| 714 | {\@ifundefined{enitkv@enumitem@#1}% |
---|
| 715 | {\enit@error{Wrong key `#1' in \string\SetEnumitemValue}% |
---|
| 716 | {Perhaps you have misspelled it}}{}% |
---|
| 717 | \expandafter\let\csname enit@enitkv@#1\expandafter\endcsname |
---|
| 718 | \csname enitkv@enumitem@#1\endcsname}{}% |
---|
| 719 | \@namedef{enitkv@enumitem@#1}##1{% |
---|
| 720 | \def\enit@a{##1}% |
---|
| 721 | \@ifundefined{enit@enitkv@#1@\enit@meaning\enit@a}% |
---|
| 722 | {\@nameuse{enit@enitkv@#1}{##1}}% |
---|
| 723 | {\@nameuse{enit@enitkv@#1\expandafter\expandafter\expandafter}% |
---|
| 724 | \expandafter\expandafter\expandafter |
---|
| 725 | {\csname enit@enitkv@#1@##1\endcsname}}{}}% |
---|
| 726 | \@namedef{enit@enitkv@#1@#2}} |
---|
| 727 | |
---|
| 728 | % Defining keys |
---|
| 729 | % ------------- |
---|
| 730 | |
---|
| 731 | \newcommand\SetEnumitemKey[2]{% |
---|
| 732 | \@ifundefined{enitkv@enumitem@#1}% |
---|
| 733 | {\enitkv@key{enumitem}{#1}[]{\enitkv@setkeys{enumitem}{#2}}}% |
---|
| 734 | {\enit@error{Duplicated key `#1' in \string\SetEnumitemKey}% |
---|
| 735 | {There already exists a key with that name}}} |
---|
| 736 | |
---|
| 737 | % +=============================+ |
---|
| 738 | % | PROCESSING KEYS | |
---|
| 739 | % +=============================+ |
---|
| 740 | % |
---|
| 741 | % Set keys |
---|
| 742 | % ======== |
---|
| 743 | |
---|
| 744 | \def\enit@setkeys#1{% |
---|
| 745 | \@ifundefined{enit@@#1}{}% |
---|
| 746 | {\expandafter\expandafter\expandafter |
---|
| 747 | \enit@setkeys@i\csname enit@@#1\endcsname\@@}} |
---|
| 748 | |
---|
| 749 | % The following is used directly in resumeset: |
---|
| 750 | |
---|
| 751 | \def\enit@setkeys@i#1\@@{% |
---|
| 752 | \let\enit@delayedkeys\@empty |
---|
| 753 | \enit@shl{#1}% is or returns \enit@toks |
---|
| 754 | \expandafter\enit@setkeys@ii\the\enit@toks\@@} |
---|
| 755 | |
---|
| 756 | \def\enit@setkeys@ii#1\@@{% |
---|
| 757 | \enitkv@setkeys{enumitem}{#1}% |
---|
| 758 | \enit@toks\expandafter{\enit@delayedkeys}% |
---|
| 759 | \edef\enit@a{% |
---|
| 760 | \noexpand\enitkv@setkeys{enumitem-delayed}{\the\enit@toks}}% |
---|
| 761 | \enit@a} |
---|
| 762 | |
---|
| 763 | % Handling * and ! values |
---|
| 764 | % ======================= |
---|
| 765 | % |
---|
| 766 | % \@gobbletwo removes \c from \c@counter. |
---|
| 767 | |
---|
| 768 | \def\enit@getwidth#1#2#3#4{% |
---|
| 769 | \let#4#3% |
---|
| 770 | \def#3##1{% |
---|
| 771 | \@ifundefined{enit@widest\expandafter\@gobbletwo\string##1}% if no widest=key |
---|
| 772 | {#1}% |
---|
| 773 | {\csname enit@widest\expandafter\@gobbletwo\string##1\endcsname{#4}}}} |
---|
| 774 | |
---|
| 775 | \def\enit@valueerror#1{\z@ % if after an assignment, but doesn't catch \ifnum |
---|
| 776 | \enit@error{No default \string\value\space for `#1'}% |
---|
| 777 | {You can provide one with widest*}}% |
---|
| 778 | |
---|
| 779 | \let\enit@values\@empty |
---|
| 780 | |
---|
| 781 | \def\enit@calcwidth{% |
---|
| 782 | \ifenit@calcwidest |
---|
| 783 | \ifnum\enit@type=\z@ % ie, enum |
---|
| 784 | \@ifundefined{enit@cw@\@enumctr}% |
---|
| 785 | {\@namedef{enit@cv@\@enumctr}{\enit@valueerror\@enumctr}}% |
---|
| 786 | {\edef\enit@values{% |
---|
| 787 | \enit@values |
---|
| 788 | \@nameuse{c@\@enumctr}\@nameuse{enit@cw@\@enumctr}\relax}% |
---|
| 789 | \expandafter |
---|
| 790 | \edef\csname enit@cv@\@enumctr\endcsname |
---|
| 791 | {\@nameuse{c@\@enumctr}}}% |
---|
| 792 | \fi |
---|
| 793 | \begingroup |
---|
| 794 | \enit@values |
---|
| 795 | \def\value##1{\csname enit@cv@##1\endcsname}% |
---|
| 796 | \let\enit@elt\enit@getwidth |
---|
| 797 | \enit@labellist |
---|
| 798 | \settowidth\labelwidth{\@itemlabel}% |
---|
| 799 | \xdef\enit@a{\labelwidth\the\labelwidth\relax}% |
---|
| 800 | \endgroup |
---|
| 801 | \enit@a |
---|
| 802 | \fi |
---|
| 803 | \advance\dimen@-\labelwidth} |
---|
| 804 | |
---|
| 805 | \def\enit@calcleft{% |
---|
| 806 | \dimen@\leftmargin |
---|
| 807 | \advance\dimen@\itemindent |
---|
| 808 | \advance\dimen@-\labelsep |
---|
| 809 | \advance\dimen@-\labelindent |
---|
| 810 | \ifcase\enit@calc % = 0 = labelindent |
---|
| 811 | \enit@calcwidth |
---|
| 812 | \advance\labelindent\dimen@ |
---|
| 813 | \or % = 1 = labelwidth, so no \enit@calcwidth |
---|
| 814 | \labelwidth\dimen@ |
---|
| 815 | \or % = 2 = labelsep |
---|
| 816 | \enit@calcwidth |
---|
| 817 | \advance\labelsep\dimen@ |
---|
| 818 | \or % = 3 = leftmargin |
---|
| 819 | \enit@calcwidth |
---|
| 820 | \advance\leftmargin-\dimen@ |
---|
| 821 | \or % = 4 =itemindent |
---|
| 822 | \enit@calcwidth |
---|
| 823 | \advance\itemindent-\dimen@ |
---|
| 824 | \fi} |
---|
| 825 | |
---|
| 826 | % "Normalizing" labels |
---|
| 827 | % ==================== |
---|
| 828 | % |
---|
| 829 | % Replaces \counter* by \counter{level} (those in \enit@labellist). |
---|
| 830 | % |
---|
| 831 | % #1 is either \csname...\endcsmame or the container \@itemlabel -- |
---|
| 832 | % hence \expandafter |
---|
| 833 | |
---|
| 834 | \def\enit@refstar@i#1#2{% |
---|
| 835 | \if*#2\@empty |
---|
| 836 | \noexpand#1{\@enumctr}% |
---|
| 837 | \else |
---|
| 838 | \noexpand#1{#2}% |
---|
| 839 | \fi}% |
---|
| 840 | |
---|
| 841 | \def\enit@refstar#1#2#3#4{% |
---|
| 842 | \def#2{\enit@refstar@i#2}% |
---|
| 843 | \def#3{\enit@refstar@i#3}} |
---|
| 844 | |
---|
| 845 | \def\enit@normlabel#1#2{% |
---|
| 846 | \begingroup |
---|
| 847 | \def\value{\enit@refstar@i\value}% |
---|
| 848 | \let\enit@elt\enit@refstar |
---|
| 849 | \enit@labellist |
---|
| 850 | \protected@xdef\enit@a{{#2}}% Added braces as \ref is in the |
---|
| 851 | \endgroup |
---|
| 852 | \expandafter\let#1\enit@a} % global scope. |
---|
| 853 | |
---|
| 854 | % Preliminary settings and default values |
---|
| 855 | % ======================================= |
---|
| 856 | |
---|
| 857 | \def\enit@prelist#1#2#3{% |
---|
| 858 | \let\enit@type#1% |
---|
| 859 | \def\enit@depth{#2}% |
---|
| 860 | \edef\enit@prevlabel{#3\romannumeral#2}% |
---|
| 861 | \advance#2\@ne} |
---|
| 862 | |
---|
| 863 | \def\enit@preset#1#2#3{% |
---|
| 864 | \enit@sepfrommarginfalse |
---|
| 865 | \enit@calcwidestfalse |
---|
| 866 | \let\enit@resuming\z@ |
---|
| 867 | \let\enit@series\relax |
---|
| 868 | \enit@boxmodetrue |
---|
| 869 | \def\enit@itemjoin{ }% |
---|
| 870 | \let\enit@itemjoin@s\relax |
---|
| 871 | \let\enit@afterlabel\nobreakspace |
---|
| 872 | \let\enit@before\@empty |
---|
| 873 | \let\enit@after\@empty |
---|
| 874 | \let\enit@format\@firstofone % and NOT empty |
---|
| 875 | \let\enit@ref\relax |
---|
| 876 | \labelindent\z@skip |
---|
| 877 | \ifnum\@listdepth=\@ne |
---|
| 878 | \enit@outerparindent\parindent |
---|
| 879 | \else |
---|
| 880 | \parindent\enit@outerparindent |
---|
| 881 | \fi |
---|
| 882 | \enit@setkeys{list}% |
---|
| 883 | \enit@setkeys{list\romannumeral\@listdepth}% |
---|
| 884 | \enit@setkeys{#1}% |
---|
| 885 | \enit@setkeys{#1\romannumeral#2}% |
---|
| 886 | \enit@setresume{#3}} |
---|
| 887 | |
---|
| 888 | % keyval "error" in enumitem-resume: all undefined keys (ie, all |
---|
| 889 | % except resume*) are ignored, but <series> is treated like |
---|
| 890 | % resume*=<series> |
---|
| 891 | |
---|
| 892 | \def\enitkv@err@a#1{% |
---|
| 893 | \@ifundefined{enit@resumekeys@series@\@tempa}{}% |
---|
| 894 | {\@nameuse{enitkv@enumitem-resume@resume*\expandafter}% |
---|
| 895 | \expandafter{\@tempa}}} |
---|
| 896 | |
---|
| 897 | % keyval "error" in the optional argument: all undefined keys are |
---|
| 898 | % passed to the keyval error, but <series> is ignored (already |
---|
| 899 | % processed in enumitem-resume |
---|
| 900 | |
---|
| 901 | \def\enitkv@err@b#1{% |
---|
| 902 | \@ifundefined{enit@resumekeys@series@\@tempa}% |
---|
| 903 | {\enit@savekverr{#1}}% |
---|
| 904 | {}} |
---|
| 905 | |
---|
| 906 | % Process keys in optional argument: |
---|
| 907 | |
---|
| 908 | \def\enit@setresume#1{% |
---|
| 909 | \enit@shl{#1}% Returns enit@toks |
---|
| 910 | \edef\enit@savekeys{\the\enit@toks}% |
---|
| 911 | \let\enit@savekverr\enitkv@errx |
---|
| 912 | \let\enitkv@errx\enitkv@err@a |
---|
| 913 | \edef\enit@b{% |
---|
| 914 | \noexpand\enitkv@setkeys{enumitem-resume}{\the\enit@toks}}% |
---|
| 915 | \enit@b |
---|
| 916 | \let\enitkv@errx\enitkv@err@b |
---|
| 917 | \ifcase\enit@resuming\or\or % = 2 |
---|
| 918 | \expandafter |
---|
| 919 | \enit@setkeys@i\enit@resumekeys,resume=\enit@series\@@ |
---|
| 920 | \or % = 3 |
---|
| 921 | \expandafter |
---|
| 922 | \enit@setkeys@i\enit@resumekeys,resume\@@ |
---|
| 923 | \fi |
---|
| 924 | \expandafter\enit@setkeys@i\enit@savekeys\@@ |
---|
| 925 | \let\enitkv@errx\enit@savekverr} |
---|
| 926 | |
---|
| 927 | % +=============================+ |
---|
| 928 | % | LIST TYPES | |
---|
| 929 | % +=============================+ |
---|
| 930 | % |
---|
| 931 | % Displayed lists |
---|
| 932 | % =============== |
---|
| 933 | % #1 #2 implicit |
---|
| 934 | |
---|
| 935 | \def\enit@dylist{% |
---|
| 936 | \enit@align@right |
---|
| 937 | \list} |
---|
| 938 | |
---|
| 939 | \def\enit@endlist{% |
---|
| 940 | \enit@after |
---|
| 941 | \endlist |
---|
| 942 | \ifx\enit@series\relax\else % discards resume*, too |
---|
| 943 | \ifnum\enit@resuming=\@ne % ie, series= |
---|
| 944 | \enit@setresumekeys{series@\enit@series}\global\global |
---|
| 945 | \else % ie, resume=, resume*= (save count, but not keys) |
---|
| 946 | \enit@setresumekeys{series@\enit@series}\@gobblefour\global |
---|
| 947 | \fi |
---|
| 948 | \enit@afterlist |
---|
| 949 | \fi |
---|
| 950 | \ifnum\enit@resuming=\thr@@ % ie, resume* list (save count only) |
---|
| 951 | \enit@setresumekeys\@currenvir\@gobblefour\global |
---|
| 952 | \else |
---|
| 953 | \enit@setresumekeys\@currenvir\@empty\@empty |
---|
| 954 | \fi |
---|
| 955 | \aftergroup\enit@afterlist} |
---|
| 956 | |
---|
| 957 | % #1 = either \@currenvir or series@<series> |
---|
| 958 | % #2(keys) #3(counter) are \global, \@gobblefour or \@empty |
---|
| 959 | |
---|
| 960 | \def\enit@setresumekeys#1#2#3{% |
---|
| 961 | \enit@toks\expandafter{\enit@savekeys}% |
---|
| 962 | \xdef\enit@afterlist{% |
---|
| 963 | #2\def\enit@noexcs{enit@resumekeys@#1}{\the\enit@toks}% |
---|
| 964 | \ifnum\enit@type=\z@ % ie, enum |
---|
| 965 | #3\def\enit@noexcs{enit@resume@#1}{% |
---|
| 966 | \csname c@\@listctr\endcsname |
---|
| 967 | \the\csname c@\@listctr\endcsname}% |
---|
| 968 | \fi}} |
---|
| 969 | |
---|
| 970 | % Inline lists |
---|
| 971 | % ============ |
---|
| 972 | |
---|
| 973 | % Definition of \@trivlist inside inline lists. So, when |
---|
| 974 | % \@trivlist is found in any displayed list (including quote, |
---|
| 975 | % center, verbatim...) the default \@item is restored. |
---|
| 976 | |
---|
| 977 | \def\enit@intrivlist{% |
---|
| 978 | \enit@changed@itemfalse |
---|
| 979 | \let\@item\enit@outer@item |
---|
| 980 | \let\par\@@par |
---|
| 981 | \let\@trivlist\enit@outer@triv |
---|
| 982 | \@trivlist} |
---|
| 983 | |
---|
| 984 | % Keep track of \@item and \item changes |
---|
| 985 | |
---|
| 986 | \newif\ifenit@changed@item |
---|
| 987 | \enit@changed@itemfalse |
---|
| 988 | |
---|
| 989 | \newif\ifenit@changeditem |
---|
| 990 | \enit@changeditemfalse |
---|
| 991 | |
---|
| 992 | % List |
---|
| 993 | % ---- |
---|
| 994 | |
---|
| 995 | % Arguments, as before: |
---|
| 996 | % \enitdp@<name>, <name>, <max-depth>, <format> |
---|
| 997 | % About @newlist, see @initem. |
---|
| 998 | |
---|
| 999 | \def\enit@inlist#1#2{% |
---|
| 1000 | \ifnum\@listdepth>\enit@listdepth\relax |
---|
| 1001 | \@toodeep |
---|
| 1002 | \else |
---|
| 1003 | \global\advance\@listdepth\@ne |
---|
| 1004 | \fi |
---|
| 1005 | \let\enit@align\@firstofone |
---|
| 1006 | \def\@itemlabel{#1}% |
---|
| 1007 | \@nmbrlistfalse |
---|
| 1008 | \ifenit@changed@item\else |
---|
| 1009 | \enit@changed@itemtrue |
---|
| 1010 | \let\enit@outer@triv\@trivlist |
---|
| 1011 | \let\@trivlist\enit@intrivlist |
---|
| 1012 | \@setpar\@empty |
---|
| 1013 | \let\enit@outer@item\@item |
---|
| 1014 | \fi |
---|
| 1015 | #2\relax |
---|
| 1016 | \global\@newlisttrue |
---|
| 1017 | \ifenit@boxmode |
---|
| 1018 | \ifenit@changeditem\else |
---|
| 1019 | \enit@changeditemtrue |
---|
| 1020 | \let\enit@outeritem\item |
---|
| 1021 | \fi |
---|
| 1022 | \let\@item\enit@boxitem |
---|
| 1023 | \else |
---|
| 1024 | \let\@item\enit@noboxitem |
---|
| 1025 | \ifx\enit@itemjoin@s\relax\else |
---|
| 1026 | \PackageWarning{enumitem}% |
---|
| 1027 | {itemjoin* discarded in mode unboxed\MessageBreak}% |
---|
| 1028 | \fi |
---|
| 1029 | \fi |
---|
| 1030 | \let\enit@calcleft\relax |
---|
| 1031 | \let\enit@afteritem\relax |
---|
| 1032 | \ifenit@boxmode |
---|
| 1033 | \global\setbox\enit@inbox\hbox\bgroup\color@begingroup |
---|
| 1034 | \let\item\enit@endinbox |
---|
| 1035 | \fi |
---|
| 1036 | \ignorespaces} |
---|
| 1037 | |
---|
| 1038 | \def\enit@endinlist{% |
---|
| 1039 | \ifenit@boxmode |
---|
| 1040 | \unskip |
---|
| 1041 | \xdef\enit@afteritem{% |
---|
| 1042 | \ifhmode\spacefactor\the\spacefactor\relax\fi}% |
---|
| 1043 | \color@endgroup |
---|
| 1044 | \egroup |
---|
| 1045 | \ifdim\wd\enit@inbox=\z@ |
---|
| 1046 | \enit@itemerror |
---|
| 1047 | \else |
---|
| 1048 | \ifenit@noinitem\else |
---|
| 1049 | \ifhmode\unskip\fi |
---|
| 1050 | \@ifundefined{enit@itemjoin@s}% |
---|
| 1051 | {\enit@itemjoin}% |
---|
| 1052 | {\enit@itemjoin@s}% |
---|
| 1053 | \fi |
---|
| 1054 | \unhbox\@labels |
---|
| 1055 | \enit@afterlabel |
---|
| 1056 | \unhbox\enit@inbox |
---|
| 1057 | \enit@afteritem |
---|
| 1058 | \fi |
---|
| 1059 | \else |
---|
| 1060 | \unskip |
---|
| 1061 | \if@newlist |
---|
| 1062 | \enit@itemerror |
---|
| 1063 | \fi |
---|
| 1064 | \fi |
---|
| 1065 | \enit@after |
---|
| 1066 | \global\advance\@listdepth\m@ne |
---|
| 1067 | \global\@inlabelfalse |
---|
| 1068 | \if@newlist |
---|
| 1069 | \global\@newlistfalse |
---|
| 1070 | \@noitemerr |
---|
| 1071 | \fi |
---|
| 1072 | \ifx\enit@series\relax\else % discards resume* list, too |
---|
| 1073 | \ifnum\enit@resuming=\@ne % ie, series |
---|
| 1074 | \enit@setresumekeys{series@\enit@series}\global\global |
---|
| 1075 | \else % ie, resume, resume* (save count, but not keys) |
---|
| 1076 | \enit@setresumekeys{series@\enit@series}\@gobblefour\global |
---|
| 1077 | \fi |
---|
| 1078 | \enit@afterlist |
---|
| 1079 | \fi |
---|
| 1080 | \ifnum\enit@resuming=\thr@@ % ie, resume* list (save count only) |
---|
| 1081 | \enit@setresumekeys\@currenvir\@gobblefour\global |
---|
| 1082 | \else |
---|
| 1083 | \enit@setresumekeys\@currenvir\@empty\@empty |
---|
| 1084 | \fi |
---|
| 1085 | \aftergroup\enit@afterlist} |
---|
| 1086 | |
---|
| 1087 | % \@item: unboxed |
---|
| 1088 | % --------------- |
---|
| 1089 | |
---|
| 1090 | \def\enit@noboxitem[#1]{% |
---|
| 1091 | \if@newlist |
---|
| 1092 | \leavevmode % ships pending labels out |
---|
| 1093 | \global\@newlistfalse |
---|
| 1094 | \else |
---|
| 1095 | \ifhmode |
---|
| 1096 | \unskip |
---|
| 1097 | \enit@itemjoin |
---|
| 1098 | \else |
---|
| 1099 | \noindent |
---|
| 1100 | \fi |
---|
| 1101 | \fi |
---|
| 1102 | \if@noitemarg |
---|
| 1103 | \@noitemargfalse |
---|
| 1104 | \if@nmbrlist |
---|
| 1105 | \refstepcounter{\@listctr}% after \unskip (hyperref) |
---|
| 1106 | \fi |
---|
| 1107 | \fi |
---|
| 1108 | \mbox{\makelabel{#1}}% |
---|
| 1109 | \enit@afterlabel |
---|
| 1110 | \ignorespaces} |
---|
| 1111 | |
---|
| 1112 | % \@item: boxed |
---|
| 1113 | % ------------ |
---|
| 1114 | % |
---|
| 1115 | % We don't want \item to be executed locally, because it sets a flag |
---|
| 1116 | % (and hyperref adds another flag, too). So, we redefine it inside |
---|
| 1117 | % the box to \enit@endinbox which ends the box and then use the actual |
---|
| 1118 | % (outer) \item. labels are stored in another box, to detect empty |
---|
| 1119 | % boxes, ie, misplaced \item's. Note the 2nd \item ends collecting |
---|
| 1120 | % the 1st item and ships it out, while the 3rd \item ends collecting |
---|
| 1121 | % the 2nd item, puts the itemjoin and then ships the 2nd item out. |
---|
| 1122 | % The flag enit@noinitem keeps track of that. |
---|
| 1123 | |
---|
| 1124 | \newif\ifenit@noinitem |
---|
| 1125 | |
---|
| 1126 | \def\enit@endinbox{% |
---|
| 1127 | \unskip |
---|
| 1128 | \xdef\enit@afteritem{% |
---|
| 1129 | \ifhmode\spacefactor\the\spacefactor\relax\fi}% |
---|
| 1130 | \color@endgroup |
---|
| 1131 | \egroup |
---|
| 1132 | \enit@outeritem} |
---|
| 1133 | |
---|
| 1134 | \def\enit@boxitem[#1]{% |
---|
| 1135 | \if@newlist |
---|
| 1136 | \global\@newlistfalse |
---|
| 1137 | \ifdim\wd\enit@inbox>\z@ |
---|
| 1138 | \enit@itemerror |
---|
| 1139 | \fi |
---|
| 1140 | \enit@noinitemtrue |
---|
| 1141 | \leavevmode % ships pending labels out |
---|
| 1142 | \else |
---|
| 1143 | \ifdim\wd\enit@inbox=\z@ |
---|
| 1144 | \enit@itemerror |
---|
| 1145 | \else |
---|
| 1146 | \ifenit@noinitem |
---|
| 1147 | \enit@noinitemfalse |
---|
| 1148 | \else |
---|
| 1149 | \ifhmode\unskip\fi |
---|
| 1150 | \enit@itemjoin |
---|
| 1151 | \fi |
---|
| 1152 | \unhbox\@labels |
---|
| 1153 | \enit@afterlabel |
---|
| 1154 | \unhbox\enit@inbox |
---|
| 1155 | \enit@afteritem |
---|
| 1156 | \fi |
---|
| 1157 | \fi |
---|
| 1158 | \if@noitemarg |
---|
| 1159 | \@noitemargfalse |
---|
| 1160 | \if@nmbrlist |
---|
| 1161 | \refstepcounter{\@listctr}% |
---|
| 1162 | \fi |
---|
| 1163 | \fi |
---|
| 1164 | \sbox\@labels{\makelabel{#1}}% |
---|
| 1165 | \let\enit@afteritem\relax |
---|
| 1166 | \setbox\enit@inbox\hbox\bgroup\color@begingroup |
---|
| 1167 | \let\item\enit@endinbox |
---|
| 1168 | \hskip1sp % in case the first thing is \label |
---|
| 1169 | \ignorespaces} |
---|
| 1170 | |
---|
| 1171 | % Pause item |
---|
| 1172 | % ---------- |
---|
| 1173 | % |
---|
| 1174 | % To do. |
---|
| 1175 | % |
---|
| 1176 | % The three types |
---|
| 1177 | % =============== |
---|
| 1178 | % |
---|
| 1179 | % enumerate and enumerate* |
---|
| 1180 | % ------------------------ |
---|
| 1181 | % |
---|
| 1182 | % The following has 4 arguments, which in enumerate are: |
---|
| 1183 | % \@enumdepth, enum, \thr@@, <format>. |
---|
| 1184 | % In user defined environments they are: |
---|
| 1185 | % \enitdp@<name>, <name>, <max-depth>, <format> |
---|
| 1186 | |
---|
| 1187 | \def\enit@enumerate{% |
---|
| 1188 | \let\enit@list\enit@dylist |
---|
| 1189 | \enit@enumerate@i} |
---|
| 1190 | |
---|
| 1191 | \@namedef{enit@enumerate*}{% |
---|
| 1192 | \let\enit@list\enit@inlist |
---|
| 1193 | \enit@enumerate@i} |
---|
| 1194 | |
---|
| 1195 | \def\enit@enumerate@i#1#2#3#4{% |
---|
| 1196 | \ifnum#1>#3\relax |
---|
| 1197 | \enit@toodeep |
---|
| 1198 | \else |
---|
| 1199 | \enit@prelist\z@{#1}{#2}% |
---|
| 1200 | \edef\@enumctr{#2\romannumeral#1}% |
---|
| 1201 | \expandafter |
---|
| 1202 | \enit@list |
---|
| 1203 | \csname label\@enumctr\endcsname |
---|
| 1204 | {\usecounter\@enumctr |
---|
| 1205 | \let\enit@calc\z@ |
---|
| 1206 | \def\makelabel##1{\enit@align{\enit@format{##1}}}% |
---|
| 1207 | \enit@preset{#2}{#1}{#4}% |
---|
| 1208 | \enit@normlabel\@itemlabel\@itemlabel |
---|
| 1209 | \enit@ref |
---|
| 1210 | \enit@calcleft |
---|
| 1211 | \enit@before}% |
---|
| 1212 | \fi} |
---|
| 1213 | |
---|
| 1214 | \let\enit@endenumerate\enit@endlist |
---|
| 1215 | \@namedef{enit@endenumerate*}{\enit@endinlist} |
---|
| 1216 | |
---|
| 1217 | % itemize and itemize* |
---|
| 1218 | % -------------------- |
---|
| 1219 | % |
---|
| 1220 | % The following has 4 arguments, which in itemize are: |
---|
| 1221 | % \@itemdepth, item, \thr@@, <format>. |
---|
| 1222 | % In user defined environments they are: |
---|
| 1223 | % \enitdp@<name>, <name>, <max-depth>, <format> |
---|
| 1224 | |
---|
| 1225 | \def\enit@itemize{% |
---|
| 1226 | \let\enit@list\enit@dylist |
---|
| 1227 | \enit@itemize@i} |
---|
| 1228 | |
---|
| 1229 | \@namedef{enit@itemize*}{% |
---|
| 1230 | \let\enit@list\enit@inlist |
---|
| 1231 | \enit@itemize@i} |
---|
| 1232 | |
---|
| 1233 | \def\enit@itemize@i#1#2#3#4{% |
---|
| 1234 | \ifnum#1>#3\relax |
---|
| 1235 | \enit@toodeep |
---|
| 1236 | \else |
---|
| 1237 | \enit@prelist\@ne{#1}{#2}% |
---|
| 1238 | \edef\@itemitem{label#2\romannumeral#1}% |
---|
| 1239 | \expandafter |
---|
| 1240 | \enit@list |
---|
| 1241 | \csname\@itemitem\endcsname |
---|
| 1242 | {\let\enit@calc\z@ |
---|
| 1243 | \def\makelabel##1{\enit@align{\enit@format{##1}}}% |
---|
| 1244 | \enit@preset{#2}{#1}{#4}% |
---|
| 1245 | \enit@calcleft |
---|
| 1246 | \enit@before}% |
---|
| 1247 | \fi} |
---|
| 1248 | |
---|
| 1249 | \let\enit@enditemize\enit@endlist |
---|
| 1250 | \@namedef{enit@enditemize*}{\enit@endinlist} |
---|
| 1251 | |
---|
| 1252 | % description and description* |
---|
| 1253 | % ---------------------------- |
---|
| 1254 | % |
---|
| 1255 | % Make sure \descriptionlabel exists: |
---|
| 1256 | |
---|
| 1257 | \providecommand*\descriptionlabel[1]{% |
---|
| 1258 | \hspace\labelsep |
---|
| 1259 | \normalfont\bfseries#1} |
---|
| 1260 | |
---|
| 1261 | \@namedef{enit@description*}{% |
---|
| 1262 | \let\enit@list\enit@inlist |
---|
| 1263 | \enit@description@i} |
---|
| 1264 | |
---|
| 1265 | \def\enit@description{% |
---|
| 1266 | \let\enit@list\enit@dylist |
---|
| 1267 | \enit@description@i} |
---|
| 1268 | |
---|
| 1269 | \def\enit@description@i#1#2#3#4{% |
---|
| 1270 | \ifnum#1>#3\relax |
---|
| 1271 | \enit@toodeep |
---|
| 1272 | \else |
---|
| 1273 | \enit@list{}% |
---|
| 1274 | {\let\enit@type\tw@ |
---|
| 1275 | \advance#1\@ne |
---|
| 1276 | \labelwidth\z@ |
---|
| 1277 | \enit@align@left |
---|
| 1278 | \let\makelabel\descriptionlabel |
---|
| 1279 | \enit@style@standard |
---|
| 1280 | \enit@preset{#2}{#1}{#4}% |
---|
| 1281 | \enit@calcleft |
---|
| 1282 | \let\enit@svlabel\makelabel |
---|
| 1283 | \def\makelabel##1{% |
---|
| 1284 | \labelsep\z@ |
---|
| 1285 | \ifenit@boxdesc |
---|
| 1286 | \enit@svlabel{\enit@align{\enit@format{##1}}}% |
---|
| 1287 | \else |
---|
| 1288 | \nobreak |
---|
| 1289 | \enit@svlabel{\enit@format{##1}}% |
---|
| 1290 | \aftergroup\enit@postlabel |
---|
| 1291 | \fi}% |
---|
| 1292 | \enit@before}% |
---|
| 1293 | \fi} |
---|
| 1294 | |
---|
| 1295 | \let\enit@enddescription\enit@endlist |
---|
| 1296 | \@namedef{enit@enddescription*}{\enit@endinlist} |
---|
| 1297 | |
---|
| 1298 | % trivlist |
---|
| 1299 | % ======== |
---|
| 1300 | |
---|
| 1301 | \def\enit@trivlist{% |
---|
| 1302 | \let\enit@type\tw@ |
---|
| 1303 | \parsep\parskip |
---|
| 1304 | \csname @list\romannumeral\the\@listdepth\endcsname |
---|
| 1305 | \@nmbrlistfalse |
---|
| 1306 | \enit@setkeys{trivlist}% |
---|
| 1307 | \enit@setkeys{trivlist\romannumeral\@listdepth}% |
---|
| 1308 | \@trivlist |
---|
| 1309 | \labelwidth\z@ |
---|
| 1310 | \leftmargin\z@ |
---|
| 1311 | \itemindent\z@ |
---|
| 1312 | \let\@itemlabel\@empty |
---|
| 1313 | \def\makelabel##1{##1}} |
---|
| 1314 | |
---|
| 1315 | % Description styles |
---|
| 1316 | % ================== |
---|
| 1317 | % |
---|
| 1318 | % the next definition is somewhat tricky because labels are boxed. |
---|
| 1319 | % That's fine when the label is just placed at the begining of a line |
---|
| 1320 | % of text, but when the box is placed without horizontal material, |
---|
| 1321 | % leading is killed. So, we need change somehow \box to \unhbox, but |
---|
| 1322 | % I don't want to modify \@item. The code below presumes \@item has |
---|
| 1323 | % not been changed and arguments gobble the part setting \@labels, |
---|
| 1324 | % which is replaced by a new one. |
---|
| 1325 | % |
---|
| 1326 | % The default value in description is itemindent=!, but some styles |
---|
| 1327 | % (those whose item text begin at a fixed place, ie, nextline, |
---|
| 1328 | % multiline and sameline) change it to labelwidth=!. |
---|
| 1329 | % |
---|
| 1330 | % We must be careful with the group and the whatsit added by color to |
---|
| 1331 | % boxes. Alignment is applied here and some adjustments in skips are |
---|
| 1332 | % necessary to get proper line breaks (including a \nobreak at the |
---|
| 1333 | % beginning of \enit@align, ie, after the first whatsit, see above). |
---|
| 1334 | % To "pass" the inner group added by color to the box, \enit@postlabel |
---|
| 1335 | % ckecks if the following is }. ie, \egroup -- if not, the box has |
---|
| 1336 | % not reached yet its end. |
---|
| 1337 | |
---|
| 1338 | \def\enit@postlabel{% |
---|
| 1339 | \@ifnextchar\egroup |
---|
| 1340 | {\aftergroup\enit@postlabel}% |
---|
| 1341 | {\enit@postlabel@i}} |
---|
| 1342 | |
---|
| 1343 | \def\enit@postlabel@i#1#2#3#4#5{% |
---|
| 1344 | \def\enit@lblpenalty{\penalty\z@\hskip\skip@}% |
---|
| 1345 | \ifenit@nextline |
---|
| 1346 | \ifdim\wd\@tempboxa>\labelwidth |
---|
| 1347 | \def\enit@lblpenalty{\newline\@nobreaktrue}% |
---|
| 1348 | \fi |
---|
| 1349 | \fi |
---|
| 1350 | \everypar{% |
---|
| 1351 | \@minipagefalse |
---|
| 1352 | \global\@newlistfalse |
---|
| 1353 | \if@inlabel |
---|
| 1354 | \global\@inlabelfalse |
---|
| 1355 | {\setbox\z@\lastbox |
---|
| 1356 | \ifvoid\z@ |
---|
| 1357 | \kern-\itemindent |
---|
| 1358 | \fi}% |
---|
| 1359 | \unhbox\@labels |
---|
| 1360 | \skip@\lastskip % Save last \labelsep |
---|
| 1361 | \unskip % Remove it |
---|
| 1362 | \enit@lblpenalty % Restore it, after penalty |
---|
| 1363 | \fi |
---|
| 1364 | \if@nobreak |
---|
| 1365 | \@nobreakfalse |
---|
| 1366 | \clubpenalty\@M |
---|
| 1367 | \else |
---|
| 1368 | \clubpenalty\@clubpenalty |
---|
| 1369 | \everypar{}% |
---|
| 1370 | \fi}% |
---|
| 1371 | \def\enit@a{#1#2#3#4}% |
---|
| 1372 | \def\enit@b{\global\setbox\@labels\hbox}% |
---|
| 1373 | \ifx\enit@a\enit@b\else |
---|
| 1374 | \enit@error{Non standard \string\item}% |
---|
| 1375 | {A class or a package has redefined \string\item\MessageBreak |
---|
| 1376 | and I do not know how to continue}% |
---|
| 1377 | \fi |
---|
| 1378 | \global\setbox\@labels\hbox{% |
---|
| 1379 | \unhbox\@labels |
---|
| 1380 | \hskip\itemindent |
---|
| 1381 | \hskip-\labelwidth |
---|
| 1382 | \hskip-\labelsep |
---|
| 1383 | \ifdim\wd\@tempboxa>\labelwidth |
---|
| 1384 | \enit@align{\unhbox\@tempboxa}\unskip % Removes (typically) \hfil |
---|
| 1385 | \else |
---|
| 1386 | \leavevmode\hbox to\labelwidth{\enit@align{\unhbox\@tempboxa}}% |
---|
| 1387 | \fi |
---|
| 1388 | \hskip\labelsep}} |
---|
| 1389 | |
---|
| 1390 | % +=============================+ |
---|
| 1391 | % | (RE)DEFINING LISTS | |
---|
| 1392 | % +=============================+ |
---|
| 1393 | % |
---|
| 1394 | % Set keys/values |
---|
| 1395 | % =============== |
---|
| 1396 | % Remember \romannumeral0 expands to nothing. |
---|
| 1397 | % #1 = list name, #2 = level, #3 = flag if star, #4 = keys/values |
---|
| 1398 | |
---|
| 1399 | \def\enit@saveset#1#2#3#4{% |
---|
| 1400 | \setcounter{enit@cnt}{#2}% |
---|
| 1401 | \ifcase#3% |
---|
| 1402 | \expandafter |
---|
| 1403 | \def\csname enit@@#1\romannumeral\c@enit@cnt\endcsname{#4}% |
---|
| 1404 | \or |
---|
| 1405 | \expandafter\let\expandafter\enit@b |
---|
| 1406 | \csname enit@@#1\romannumeral\c@enit@cnt\endcsname |
---|
| 1407 | \ifx\enit@b\relax |
---|
| 1408 | \let\enit@b\@empty |
---|
| 1409 | \fi |
---|
| 1410 | \expandafter\def |
---|
| 1411 | \csname enit@@#1\romannumeral\c@enit@cnt\expandafter\endcsname |
---|
| 1412 | \expandafter{\enit@b,#4}% |
---|
| 1413 | \fi} |
---|
| 1414 | |
---|
| 1415 | % To do: more robust tests (catch wrong names, but not easy) |
---|
| 1416 | |
---|
| 1417 | % Internally, LaTeX uses a short name for enumerate (enum) |
---|
| 1418 | % and itemize (item). To be consistent with this convention, |
---|
| 1419 | % a couple of macros provide a "translation". I'm not very |
---|
| 1420 | % happy with the current implementation. |
---|
| 1421 | |
---|
| 1422 | \def\enit@shortenumerate{enum} |
---|
| 1423 | \def\enit@shortitemize{item} |
---|
| 1424 | |
---|
| 1425 | \newcommand\setlist{% |
---|
| 1426 | \@ifstar{\enit@setlist\@ne}{\enit@setlist\z@}} |
---|
| 1427 | |
---|
| 1428 | \def\enit@setlist#1{% |
---|
| 1429 | \@ifnextchar[{\enit@setlist@x#1}{\enit@setlist@i#1\@empty}} |
---|
| 1430 | |
---|
| 1431 | % Let's accept \setlist[]*{}, too, because an error in <=3.5.1 |
---|
| 1432 | |
---|
| 1433 | \def\enit@setlist@x#1[#2]{% |
---|
| 1434 | \@ifstar{\enit@setlist@i\@ne{#2}}{\enit@setlist@i#1{#2}}} |
---|
| 1435 | |
---|
| 1436 | % #1 list names/levels, #2 keys/values |
---|
| 1437 | |
---|
| 1438 | % #1 star flag, #2 list names/levels, #3 keys/values |
---|
| 1439 | |
---|
| 1440 | \def\enit@setlist@i#1#2#3{% |
---|
| 1441 | \let\enit@eltnames\relax |
---|
| 1442 | \let\enit@b\@empty |
---|
| 1443 | \let\enit@eltlevels\relax |
---|
| 1444 | \let\enit@c\@empty |
---|
| 1445 | \protected@edef\enit@a{#2}% |
---|
| 1446 | \@for\enit@a:=\enit@a\do{% the 2nd enit@a is first expanded |
---|
| 1447 | \@ifundefined{enitdp@\enit@meaning\enit@a}% |
---|
| 1448 | {\edef\enit@c{\enit@c\enit@eltlevels{\enit@a}}}% |
---|
| 1449 | {\@ifundefined{enit@short\enit@meaning\enit@a}% |
---|
| 1450 | \@empty |
---|
| 1451 | {\edef\enit@a{\@nameuse{enit@short\enit@a}}}% |
---|
| 1452 | \edef\enit@b{\enit@b\enit@eltnames{\enit@a}}}}% |
---|
| 1453 | \ifx\enit@b\@empty |
---|
| 1454 | \def\enit@b{\enit@eltnames{list}}% |
---|
| 1455 | \fi |
---|
| 1456 | \ifx\enit@c\@empty |
---|
| 1457 | \def\enit@c{\enit@eltlevels{0}}% |
---|
| 1458 | \fi |
---|
| 1459 | \def\enit@eltnames##1{% |
---|
| 1460 | \def\enit@a{##1}% |
---|
| 1461 | \enit@c}% |
---|
| 1462 | \def\enit@eltlevels##1{% |
---|
| 1463 | \enit@saveset\enit@a{##1}#1{#3}}% |
---|
| 1464 | \enit@b}% |
---|
| 1465 | |
---|
| 1466 | % Deprecated: |
---|
| 1467 | |
---|
| 1468 | \newcommand\setdisplayed[1][0]{\setlist[trivlist,#1]} |
---|
| 1469 | \let\enitdp@trivlist\@empty % dummy, let know it exists |
---|
| 1470 | \newcommand\setenumerate[1][0]{\setlist[enumerate,#1]} |
---|
| 1471 | \newcommand\setitemize[1][0]{\setlist[itemize,#1]} |
---|
| 1472 | \newcommand\setdescription[1][0]{\setlist[description,#1]} |
---|
| 1473 | |
---|
| 1474 | % New lists |
---|
| 1475 | % ========= |
---|
| 1476 | |
---|
| 1477 | % When defining a list, \label... and counters must be defined |
---|
| 1478 | % for each level, too: |
---|
| 1479 | |
---|
| 1480 | \def\enit@xset@itemize{% |
---|
| 1481 | \@namedef{label\enit@c\romannumeral\count@}{% |
---|
| 1482 | \enit@error{Undefined label}% |
---|
| 1483 | {You have defined a list, but labels have |
---|
| 1484 | not been setup.\MessageBreak |
---|
| 1485 | You can set the label field with \string\setlist.}}} |
---|
| 1486 | \@namedef{enit@xset@itemize*}{\enit@xset@itemize} |
---|
| 1487 | |
---|
| 1488 | \def\enit@xset@enumerate{% |
---|
| 1489 | \enit@xset@itemize |
---|
| 1490 | \@ifundefined{c@\enit@c\romannumeral\count@}% |
---|
| 1491 | {\@definecounter{\enit@c\romannumeral\count@}}{}} |
---|
| 1492 | \@namedef{enit@xset@enumerate*}{\enit@xset@enumerate} |
---|
| 1493 | |
---|
| 1494 | \let\enit@xset@description\@empty |
---|
| 1495 | \@namedef{enit@xset@description*}{\enit@xset@description} |
---|
| 1496 | |
---|
| 1497 | \newcommand\newlist{\enit@newlist\newenvironment} |
---|
| 1498 | \newcommand\renewlist{\enit@newlist\renewenvironment} |
---|
| 1499 | |
---|
| 1500 | % <new/renew>, <name>, <type>, <max-depth> |
---|
| 1501 | |
---|
| 1502 | \def\enit@newlist#1#2#3#4{% |
---|
| 1503 | \@ifundefined{enit@xset@#3}% |
---|
| 1504 | {\enit@error{Unknown list type `#3')}% |
---|
| 1505 | {Valid types are: |
---|
| 1506 | enumerate, itemize, description,\messageBreak |
---|
| 1507 | enumerate*, itemize*, description*}}% |
---|
| 1508 | {}% |
---|
| 1509 | \setcounter{enit@cnt}{#4}% |
---|
| 1510 | \count@\@ne |
---|
| 1511 | \@ifundefined{enit@short#2}% |
---|
| 1512 | {\def\enit@c{#2}}% |
---|
| 1513 | {\edef\enit@c{\csname enit@short#2\endcsname}}% |
---|
| 1514 | \loop |
---|
| 1515 | \@nameuse{enit@xset@#3}% Uses \enit@c |
---|
| 1516 | \ifnum\count@<\c@enit@cnt |
---|
| 1517 | \advance\count@\@ne |
---|
| 1518 | \repeat |
---|
| 1519 | \@ifundefined{enitdp@#2}% |
---|
| 1520 | {\expandafter\newcount\csname enitdp@#2\endcsname}{}% |
---|
| 1521 | \csname enitdp@#2\endcsname\z@ |
---|
| 1522 | \advance\c@enit@cnt\m@ne |
---|
| 1523 | \edef\enit@a{% |
---|
| 1524 | \noexpand#1{#2}[1][]% |
---|
| 1525 | {\enit@noexcs{enit@#3}% |
---|
| 1526 | \enit@noexcs{enitdp@#2}% |
---|
| 1527 | {\enit@c}% |
---|
| 1528 | {\the\c@enit@cnt}% |
---|
| 1529 | {####1}}% |
---|
| 1530 | {\enit@noexcs{enit@end#3}}}% |
---|
| 1531 | \enit@a} |
---|
| 1532 | |
---|
| 1533 | % Changing the default nesting limit |
---|
| 1534 | % ---------------------------------- |
---|
| 1535 | |
---|
| 1536 | \newcommand\setlistdepth{\def\enit@listdepth} |
---|
| 1537 | \setlistdepth{5} |
---|
| 1538 | |
---|
| 1539 | % +=============================+ |
---|
| 1540 | % | PACKAGE OPTIONS | |
---|
| 1541 | % +=============================+ |
---|
| 1542 | |
---|
| 1543 | \newif\ifenit@loadonly |
---|
| 1544 | |
---|
| 1545 | \DeclareOption{ignoredisplayed}{\let\enit@trivlist\trivlist} |
---|
| 1546 | \DeclareOption{loadonly}{\enit@loadonlytrue} |
---|
| 1547 | \DeclareOption{shortlabels} |
---|
| 1548 | {\def\enit@shl#1{% |
---|
| 1549 | \ifnum\enit@type=\tw@ |
---|
| 1550 | \enit@toks{#1}% |
---|
| 1551 | \else |
---|
| 1552 | \def\enit@c{#1}% |
---|
| 1553 | \enit@first#1,\@nil\@@nil % Returns enit@toks |
---|
| 1554 | \fi}} |
---|
| 1555 | \DeclareOption{inline} |
---|
| 1556 | {\newenvironment{enumerate*}[1][]% |
---|
| 1557 | {\@nameuse{enit@enumerate*}\enitdp@enumerate{enum}\thr@@{#1}} |
---|
| 1558 | {\@nameuse{enit@endenumerate*}} |
---|
| 1559 | \newenvironment{itemize*}[1][]% |
---|
| 1560 | {\@nameuse{enit@itemize*}\enitdp@itemize{item}\thr@@{#1}} |
---|
| 1561 | {\@nameuse{enit@enditemize*}} |
---|
| 1562 | \newenvironment{description*}[1][]% |
---|
| 1563 | {\@nameuse{enit@description*}\enitdp@description{description}\@M{#1}} |
---|
| 1564 | {\@nameuse{enit@enddescription*}}} |
---|
| 1565 | |
---|
| 1566 | \let\enit@shl\enit@toks |
---|
| 1567 | |
---|
| 1568 | \ProcessOptions |
---|
| 1569 | |
---|
| 1570 | \let\trivlist\enit@trivlist |
---|
| 1571 | |
---|
| 1572 | % If there is no loadonly, redefine the basic lists: |
---|
| 1573 | |
---|
| 1574 | \ifenit@loadonly\else |
---|
| 1575 | |
---|
| 1576 | \let\enitdp@enumerate\@enumdepth |
---|
| 1577 | \renewenvironment{enumerate}[1][] |
---|
| 1578 | {\enit@enumerate\enitdp@enumerate{enum}\thr@@{#1}} |
---|
| 1579 | {\enit@endenumerate} |
---|
| 1580 | |
---|
| 1581 | \let\enitdp@itemize\@itemdepth |
---|
| 1582 | \renewenvironment{itemize}[1][] |
---|
| 1583 | {\enit@itemize\enitdp@itemize{item}\thr@@{#1}} |
---|
| 1584 | {\enit@enditemize} |
---|
| 1585 | |
---|
| 1586 | \newcount\enitdp@description |
---|
| 1587 | \renewenvironment{description}[1][] |
---|
| 1588 | {\enit@description\enitdp@description{description}\@M{#1}} |
---|
| 1589 | {\enit@enddescription} |
---|
| 1590 | |
---|
| 1591 | \fi |
---|
| 1592 | |
---|
| 1593 | \endinput |
---|