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