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 |
---|