source: doc/LaTeXmacros/enumitem/enumitem.sty@ dd020c0

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since dd020c0 was 9724df0, checked in by Peter A. Buhr <pabuhr@…>, 9 years ago

update latex macros, and user and refrat manuals

  • Property mode set to 100644
File size: 41.7 KB
Line 
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
Note: See TracBrowser for help on using the repository browser.