summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/enumitem/enumitem.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2011-07-26 23:26:46 +0000
committerKarl Berry <karl@freefriends.org>2011-07-26 23:26:46 +0000
commit0a04967062b7de7c64f902743994a3edd7caac9f (patch)
treeaa5b7358366af859c01ddb5168c675ca095d118e /Master/texmf-dist/tex/latex/enumitem/enumitem.sty
parent792ab47701eef9ed7c77ca44fb642b53189aba33 (diff)
enumitem 3.3 (14jul11)
git-svn-id: svn://tug.org/texlive/trunk@23242 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/enumitem/enumitem.sty')
-rw-r--r--Master/texmf-dist/tex/latex/enumitem/enumitem.sty1772
1 files changed, 1277 insertions, 495 deletions
diff --git a/Master/texmf-dist/tex/latex/enumitem/enumitem.sty b/Master/texmf-dist/tex/latex/enumitem/enumitem.sty
index d008eee65be..60b70dbc59e 100644
--- a/Master/texmf-dist/tex/latex/enumitem/enumitem.sty
+++ b/Master/texmf-dist/tex/latex/enumitem/enumitem.sty
@@ -2,10 +2,10 @@
% | Typeset enumitem.tex to get the documentation. |
% +--------------------------------------------------+
%
-% Copyright (c) 2003-2009 by Javier Bezos.
+% Copyright (c) 2003-2011 by Javier Bezos.
% All Rights Reserved.
%
-% This file is part of the enumitem distribution release 2.2
+% This file is part of the enumitem distribution release 3.3
% -----------------------------------------------------------
%
% It may be distributed and/or modified under the
@@ -24,215 +24,566 @@
% ~~~~~
%
% The tag enit@ is used through the style
-
-% Tasks:
-% -runin
-% -ref*, for adding stuff in the same fashion as label*
+%
+% To do:
+% ~~~~~~
+% - ref*, for adding stuff in the same fashion as label*
+% - option ams, to force upshape, but I have to investigate
+% how to do it.
+% - labelled descriptions (ie, label, title, body)
+% - A true nextline (far from trivial and perhaps solved with
+% labelled descriptions).
+% - Improved \AddEnumerateCounter
+% - Compatibility with interfaces and zref-enumitem
+% - "Pausing" somehow inline boxed text.
+% - \@enumctr <-> \@listctr?
%
% Release
% ~~~~~~~
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{enumitem}[2009/05/18 v2.2 Customized lists]
+\ProvidesPackage{enumitem}[2011/07/14 v3.3 Customized lists]
-% The package uses a token register very often. To be on the
-% safe side, instead of \toks@, etc., a new one is declared:
+% +=============================+
+% | EMULATING KEYVAL |
+% +=============================+
+%
+% "Thanks" to xkeyval, which use the same macros names as
+% keyval :-(, the latter has to be replicated in full here
+% to ensure it works as intended. The original work if by
+% David Carlisle, under license LPPL. Once the code is here,
+% it could be optimized by adpting it to the specific needs
+% of titlesec (to do).
+
+\def\enitkv@setkeys#1#2{%
+ \def\enitkv@prefix{enitkv@#1@}%
+ \let\@tempc\relax
+ \enitkv@do#2,\relax,}
+
+\def\enitkv@do#1,{%
+ \ifx\relax#1\empty\else
+ \enitkv@split#1==\relax
+ \expandafter\enitkv@do\fi}
+
+\def\enitkv@split#1=#2=#3\relax{%
+ \enitkv@@sp@def\@tempa{#1}%
+ \ifx\@tempa\@empty\else
+ \expandafter\let\expandafter\@tempc
+ \csname\enitkv@prefix\@tempa\endcsname
+ \ifx\@tempc\relax
+ \enitkv@errx{\@tempa\space undefined}%
+ \else
+ \ifx\@empty#3\@empty
+ \enitkv@default
+ \else
+ \enitkv@@sp@def\@tempb{#2}%
+ \expandafter\@tempc\expandafter{\@tempb}\relax
+ \fi
+ \fi
+ \fi}
-\newtoks\enit@toks
+\def\enitkv@default{%
+ \expandafter\let\expandafter\@tempb
+ \csname\enitkv@prefix\@tempa @default\endcsname
+ \ifx\@tempb\relax
+ \enitkv@err{No value specified for \@tempa}%
+ \else
+ \@tempb\relax
+ \fi}
-\@ifundefined{define@key}{\RequirePackage{keyval}}{}%
+\def\enitkv@errx#1{\PackageError{enumitem}{#1}\@ehc}
-\newlength{\labelindent}
+\let\enitkv@err\enitkv@errx
-% Vertical spacing
+\def\@tempa#1{%
+ \def\enitkv@@sp@def##1##2{%
+ \futurelet\enitkv@tempa\enitkv@@sp@d##2\@nil\@nil#1\@nil\relax##1}%
+ \def\enitkv@@sp@d{%
+ \ifx\enitkv@tempa\@sptoken
+ \expandafter\enitkv@@sp@b
+ \else
+ \expandafter\enitkv@@sp@b\expandafter#1%
+ \fi}%
+ \def\enitkv@@sp@b#1##1 \@nil{\enitkv@@sp@c##1}}
-\define@key{enumitem}{topsep}{%
- \setlength{\topsep}{#1}}
+\@tempa{ }
-\define@key{enumitem}{itemsep}{%
- \setlength{\itemsep}{#1}}
+\def\enitkv@@sp@c#1\@nil#2\relax#3{\enitkv@toks@{#1}\edef#3{\the\enitkv@toks@}}
-\define@key{enumitem}{parsep}{%
- \setlength{\parsep}{#1}}
+\@ifundefined{KV@toks@}
+ {\newtoks\enitkv@toks@}
+ {\let\enitkv@toks@\KV@toks@}
-\define@key{enumitem}{partopsep}{%
- \setlength{\partopsep}{#1}}
+\def\enitkv@key#1#2{%
+ \@ifnextchar[{\enitkv@def{#1}{#2}}{\@namedef{enitkv@#1@#2}####1}}
-% Horizontal spacing
+\def\enitkv@def#1#2[#3]{%
+ \@namedef{enitkv@#1@#2@default\expandafter}\expandafter
+ {\csname enitkv@#1@#2\endcsname{#3}}%
+ \@namedef{enitkv@#1@#2}##1}
-\define@key{enumitem}{itemindent}{%
- \setlength{\itemindent}{#1}}
+% +=============================+
+% | DEFINITIONS |
+% +=============================+
+%
+% (1) The package uses a token register very often. To be on the
+% safe side, instead of \toks@, etc., a new one is declared.
+% (2) \enit@inbox is the box storing the items in boxed inline
+% lists.
+% (3) \enit@outerparindent is used to save the outer parindent
+% so that it can be used in the key parindent
+% (4) \enit@type has three values: 0 = enum, 1 = item, 2 = desc.
+% (5) \enit@calc stores which dimen is to be computed:
+% 0=labelindent, 1=labelwidth, 2=labelsep, 3=leftmargin,
+% 4=itemindent
+% (6) \enit@resuming has four values: 0 = none, 1 = series,
+% 2 = resume* series (computed in group enumitem-resume),
+% 3 = resume* list (ie, with no value).
+
+\chardef \enit@iv=4
+\newlength\labelindent
+\newdimen \enit@outerparindent
+\newtoks \enit@toks
+\newbox \enit@inbox
+
+\newif\ifenit@boxmode
+\newif\ifenit@sepfrommargin
+\newif\ifenit@lblfrommargin
+\newif\ifenit@calcwidest
+\newif\ifenit@nextline
+\newif\ifenit@boxdesc
+
+% An alias (calc-savvy):
+
+\let\c@enit@cnt\@tempcnta
+
+\def\enit@meaning{\expandafter\strip@prefix\meaning}
+\def\enit@noexcs#1{\expandafter\noexpand\csname#1\endcsname}
+
+% Miscelaneous errors
+% ===================
+
+\def\enit@checkerror#1#2{%
+ \PackageError{enumitem}%
+ {Unknown value `#2' for key `#1'}%
+ {See the manual for valid values}}
-\define@key{enumitem}{listparindent}{%
- \setlength{\listparindent}{#1}}
+\def\enit@itemerror{%
+ \PackageError{enumitem}%
+ {Misplaced \string\item}%
+ {Either there is some text before the first\MessageBreak
+ item or the last item has no text}}
-\define@key{enumitem}{labelwidth}{%
- \setlength{\labelwidth}{#1}}
+\def\enit@noserieserror#1{%
+ \PackageError{enumitem}%
+ {Series `#1' not started}%
+ {You are trying to continue a series\MessageBreak
+ which has not been started with series}}
+
+\def\enit@checkseries#1{%
+ \ifcase\enit@resuming
+ \PackageError{enumitem}%
+ {Misplaced key `#1'}%
+ {`series' and `resume*' must be used\MessageBreak
+ in the optional argument of lists}%
+ \fi}
-\define@key{enumitem}{labelindent}{%
- \setlength{\labelindent}{#1}}
+\def\enit@checkseries@m{%
+ \ifcase\enit@resuming\else
+ \PackageError{enumitem}%
+ {Uncompatible series settings}%
+ {`series' and `resume*' must not be used\MessageBreak
+ at the same time}%
+ \fi}
-\define@key{enumitem}{rightmargin}{%
- \setlength{\rightmargin}{#1}}
+\let\enit@toodeep\@toodeep
-\define@key{enumitem}{leftmargin}{%
- \if*#1%
- \def\enit@calcleft{%
- \enit@calclabel
- \leftmargin\labelwidth
- \advance\leftmargin\labelsep
- \advance\leftmargin\labelindent
- \advance\labelindent-\itemindent}%
+\def\@toodeep{%
+ \ifnum\@listdepth>\enit@listdepth\relax
+ \enit@toodeep
\else
- \setlength{\leftmargin}{#1}%
+ \count@\@listdepth
+ \global\advance\@listdepth\@ne
+ \@ifundefined{@list\romannumeral\the\@listdepth}%
+ {\expandafter\let
+ \csname @list\romannumeral\the\@listdepth\expandafter\endcsname
+ \csname @list\romannumeral\the\count@\endcsname}{}%
\fi}
-\define@key{enumitem}{labelsep}{%
- \if*#1%
- \def\enit@calcleft{%
- \advance\labelindent-\itemindent
- \enit@calclabel
- \labelsep\leftmargin
- \advance\labelsep-\labelwidth
- \advance\labelsep-\labelindent}%
+
+% +=============================+
+% | KEYS |
+% +=============================+
+%
+% Including code executed by keys.
+%
+% There are 2 keyval groups: enumitem, and enumitem-delayed.
+% The latter is used to make sure a prioritary key is the
+% latest one; eg, ref, so that the ref format set by label
+% is overriden. So, when this key is found in enumitem,
+% nothing is done, except the key/value is moved to
+% enumitem-delayed.
+%
+% A further group (enumitem-resume) catches resume* and
+% series in optional arguments in lists.
+%
+% Vertical spacing
+% ================
+
+\enitkv@key{enumitem}{topsep}{%
+ \setlength\topsep{#1}}
+
+\enitkv@key{enumitem}{itemsep}{%
+ \setlength\itemsep{#1}}
+
+\enitkv@key{enumitem}{parsep}{%
+ \setlength\parsep{#1}}
+
+\enitkv@key{enumitem}{partopsep}{%
+ \setlength\partopsep{#1}}
+
+% Horizontal spacing
+% ==================
+%
+% There are 3 cases: *, ! and a value. The latter also
+% cancels widest with the sequence key=* ... key=value
+% \string is used, just in case some package changes the
+% catcodes.
+
+\def\enit@calcset#1#2#3{%
+ \if\string*\string#3%
+ \enit@calcwidesttrue
+ \let\enit@calc#2%
+ \else\if\string!\string#3%
+ \enit@calcwidestfalse
+ \let\enit@calc#2%
\else
- \setlength{\labelsep}{#1}%
+ \ifnum\enit@calc=#2%
+ \enit@calcwidestfalse
+ \let\enit@calc\z@
+ \fi
+ \setlength#1{#3}%
+ \fi\fi}
+
+\def\enitkv@enumitem@widest#1{%
+ \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax
+ \@namedef{enit@widest@\@enumctr}##1{#1}}
+
+\def\enitkv@enumitem@widest@default{%
+ \expandafter\let\csname enit@cw@\@enumctr\endcsname\relax
+ \expandafter\let\csname enit@widest@\@enumctr\endcsname\relax}
+
+\enitkv@key{enumitem}{widest*}{%
+ \setcounter{enit@cnt}{#1}%
+ \expandafter\edef\csname enit@cw@\@enumctr\endcsname
+ {\the\c@enit@cnt}%
+ \expandafter\edef\csname enit@widest@\@enumctr\endcsname##1%
+ {##1{\the\c@enit@cnt}}}
+
+\enitkv@key{enumitem}{labelindent*}{%
+ \enit@lblfrommargintrue
+ \ifnum\enit@calc=\z@
+ \enit@calcwidestfalse
+ \fi
+ \setlength\labelindent{#1}%
+ \advance\labelindent\leftmargin}
+
+\enitkv@key{enumitem}{labelindent}{%
+ \enit@lblfrommarginfalse
+ \enit@calcset\labelindent\z@{#1}}
+
+\enitkv@key{enumitem}{labelwidth}{%
+ \enit@calcset\labelwidth\@ne{#1}}
+
+\enitkv@key{enumitem}{leftmargin}{%
+ \edef\enit@c{\the\leftmargin}%
+ \enit@calcset\leftmargin\thr@@{#1}%
+ \ifenit@lblfrommargin
+ \advance\labelindent-\enit@c\relax
+ \advance\labelindent\leftmargin
\fi}
-\define@key{enumitem}{widest}{%
- \expandafter\def
- \csname enit@widest\@enumctr\endcsname{#1}}
+\enitkv@key{enumitem}{itemindent}{%
+ \edef\enit@c{\the\itemindent}%
+ \enit@calcset\itemindent\enit@iv{#1}%
+ \ifenit@sepfrommargin
+ \advance\labelsep-\enit@c\relax
+ \advance\labelsep\itemindent
+ \fi}
-\def\enit@calclabel{%
- \begingroup
- \enit@calcdefs
- \settowidth\labelwidth{\@itemlabel}%
- \xdef\enit@a{\labelwidth\the\labelwidth\relax}%
- \endgroup
- \enit@a}
+\enitkv@key{enumitem}{listparindent}{%
+ \setlength\listparindent{#1}}
-\let\enit@calcdefs\@empty
+\enitkv@key{enumitem}{rightmargin}{%
+ \setlength\rightmargin{#1}}
-% Used below to gobble \c@ from the internal representation
-% of counters.
+% labelsep, from itemindent; labelsep*, from leftmargin
-\def\@gobblethree#1#2#3{}
+\enitkv@key{enumitem}{labelsep*}{%
+ \enit@sepfrommargintrue
+ \ifnum\enit@calc=\tw@
+ \enit@calcwidestfalse
+ \let\enit@calc\z@
+ \fi
+ \setlength\labelsep{#1}%
+ \advance\labelsep\itemindent}
-\def\enit@calcdef#1#2#3{%
- \let#2#1%
- \def#1##1{%
- \@ifundefined{enit@widest\expandafter\@gobblethree\string##1}% if no widest key
- {#3}%
- {\csname enit@widest\expandafter\@gobblethree\string##1\endcsname}}}
+\enitkv@key{enumitem}{labelsep}{%
+ \enit@sepfrommarginfalse
+ \enit@calcset\labelsep\tw@{#1}}
-% Resume and start
+% Series, resume and start
+% ========================
-\define@key{enumitem}{resume}[]{%
- \@nameuse{enit@resume@\@currenvir}\relax}
+\enitkv@key{enumitem-resume}{series}{%
+ \enit@checkseries@m
+ \let\enit@resuming\@ne
+ \@ifundefined{enitkv@enumitem@#1}{}%
+ {\PackageError{enumitem}%
+ {Invalid series name `#1'}%
+ {Do not name a series with an existing key}}%
+ \def\enit@series{#1}}
-\define@key{enumitem}{start}[\@ne]{%
- \csname c@\@listctr\endcsname#1\relax
- \advance\csname c@\@listctr\endcsname\m@ne}
+\enitkv@key{enumitem}{series}{%
+ \enit@checkseries{series}}
-\define@key{enumitem}{resume*}[]{%
- \PackageError{enumitem}%
- {Invalid resume* ignored}%
- {resume* has to be the only key in the optional argument}%
+\def\enitkv@enumitem@resume#1{%
+ \edef\enit@series{#1}%
+ \@nameuse{enit@resume@series@#1}\relax}
+
+\def\enitkv@enumitem@resume@default{%
\@nameuse{enit@resume@\@currenvir}\relax}
-% How the label is aligned
-
-\def\enit@alignleft{%
- \def\makelabel##1{\rlap{\enit@format##1}\hss}}
+\@namedef{enitkv@enumitem-resume@resume*}#1{%
+ \enit@checkseries@m
+ \let\enit@resuming\tw@
+ \edef\enit@series{#1}%
+ \@ifundefined{enit@resumekeys@series@#1}%
+ {\enit@noserieserror{#1}}%
+ {\expandafter\let\expandafter\enit@resumekeys
+ \csname enit@resumekeys@series@#1\endcsname}}
+
+\@namedef{enitkv@enumitem-resume@resume*@default}{%
+ \let\enit@resuming\thr@@
+ \expandafter\let\expandafter\enit@resumekeys
+ \csname enit@resumekeys@\@currenvir\endcsname
+ \@nameuse{enit@resume@\@currenvir}\relax}
-\define@key{enumitem}{align}{%
- \csname enit@align#1\endcsname}
+\enitkv@key{enumitem}{resume*}[]{%
+ \enit@checkseries{resume*}}
+
+\newcommand\restartlist[1]{%
+ \@ifundefined{end#1}%
+ {\PackageError{enumitem}%
+ {Undefined list `#1'}%
+ {No list has been defined with that name.}}%
+ {\expandafter\let
+ \csname enit@resume@#1\endcsname\@empty}}
+
+\enitkv@key{enumitem}{start}[\@ne]{%
+ \setcounter{\@listctr}{#1}%
+ \advance\@nameuse{c@\@listctr}\m@ne}
% Penalties
+% =========
-\define@key{enumitem}{beginpenalty}{%
+\enitkv@key{enumitem}{beginpenalty}{%
\@beginparpenalty#1\relax}
-\define@key{enumitem}{midpenalty}{%
+\enitkv@key{enumitem}{midpenalty}{%
\@itempenalty#1\relax}
-\define@key{enumitem}{endpenalty}{%
+\enitkv@key{enumitem}{endpenalty}{%
\@endparpenalty#1\relax}
-% Font
+% Font/Format
+% ===========
+
+\enitkv@key{enumitem}{format}{%
+ \def\enit@format{#1}}
-\define@key{enumitem}{font}[]{%
+\enitkv@key{enumitem}{font}{%
\def\enit@format{#1}}
-% description specific keys
+% Description styles
+% ==================
+
+\enitkv@key{enumitem}{style}[normal]{%
+ \@ifundefined{enit@style@#1}%
+ {\enit@checkerror{style}{#1}}%
+ {\enit@nextlinefalse
+ \enit@boxdescfalse
+ \@nameuse{enit@style@#1}%
+ \edef\enit@descstyle{\enit@noexcs{enit@#1style}}}}
+
+\def\enit@style@standard{%
+ \enit@boxdesctrue
+ \enit@calcset\itemindent\enit@iv!}
-\define@key{enumitem}{style}[normal]{%
- \edef\enit@descstyle{%
- \expandafter\noexpand\csname enit@#1style\endcsname}}
+\let\enit@style@normal\enit@style@standard
-\let\enit@normalstyle\@firstofone
+\def\enit@style@unboxed{%
+ \enit@calcset\itemindent\enit@iv!}
+
+\def\enit@style@sameline{%
+ \enit@calcset\labelwidth\@ne!}
+
+\def\enit@style@multiline{%
+ \enit@align@parleft
+ \enit@calcset\labelwidth\@ne!}
+
+\def\enit@style@nextline{%
+ \enit@nextlinetrue
+ \enit@calcset\labelwidth\@ne!}
% Labels and refs
+% ===============
+
+% Aligment
+% --------
+
+\enitkv@key{enumitem}{align}{%
+ \@ifundefined{enit@align@#1}%
+ {\enit@checkerror{align}{#1}}%
+ {\csname enit@align@#1\endcsname}}
-\define@key{enumitem}{label}{%
- \@nameuse{enit@set\enit@type label}{#1}}
+% \nobreak for unboxed label with color. See below.
-\define@key{enumitem}{label*}{%
+\newcommand\SetLabelAlign[2]{%
+ \enit@toks{#2}%
+ \expandafter\edef\csname enit@align@#1\endcsname
+ {\def\noexpand\enit@align####1{\nobreak\the\enit@toks}}}
+
+\def\enit@align@right{%
+ \def\enit@align##1{\nobreak\hss\llap{##1}}}
+
+\def\enit@align@left{%
+ \def\enit@align##1{\nobreak##1\hfil}}
+
+\def\enit@align@parleft{%
+ \def\enit@align##1{%
+ \nobreak
+ \strut\smash{\parbox[t]\labelwidth{\raggedright##1}}}}
+
+% \enit@ref has three possible definitions:
+% (1) \relax, if there is neither label nor ref (ie, use
+% LaTeX settings).
+% (2) set ref to @itemlabel, if there is label but not ref
+% (3) set ref to ref, if there is ref (with or without label)
+
+\enitkv@key{enumitem}{label}{%
+ \expandafter\def\@itemlabel{#1}%
+ \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}}
+
+\enitkv@key{enumitem}{label*}{%
\ifnum\enit@depth=\@ne
- \@nameuse{enit@set\enit@type label}{#1}%
+ \expandafter\def\@itemlabel{#1}%
\else % no level 0
\advance\enit@depth\m@ne
\enit@toks{#1}%
- \edef\enit@a{%
- \noexpand\@nameuse{enit@set\enit@type label}{%
- \expandafter\noexpand\csname label\enit@prevlabel\endcsname
- \the\enit@toks}}%
- \enit@a
+ \expandafter\edef\@itemlabel{%
+ \enit@noexcs{label\enit@prevlabel}%
+ \the\enit@toks}%
\advance\enit@depth\@ne
- \fi}
+ \fi
+ \def\enit@ref{\expandafter\enit@reflabel\@itemlabel\z@}}
-\def\enit@setenumlabel#1{%
- \enit@normlabel{#1}% Returns \enit@a
- \expandafter\let\@itemlabel\enit@a
-%ie, redefine \labelenumX or \labelitemX.
- \ifx\enit@ref\relax\expandafter\enit@reflabel\enit@a\z@\fi}
-%ie, only if there is not a previous ref=
+% ref is set by label, except if there is an explicit ref
+% in the same hierarchy level. Explicit refs above the
+% current hierarchy level are overriden by label (besides ref),
+% too. Since an explicit ref has preference, it's delayed.
+
+\enitkv@key{enumitem}{ref}{%
+ \g@addto@macro\enit@delayedkeys{,ref=#1}}
-\def\enit@setitemlabel#1{%
- \expandafter\def\@itemlabel{#1}%
- \def\enit@a{#1}%
- \ifx\enit@ref\relax\enit@reflabel{#1}\z@\fi}
+\enitkv@key{enumitem-delayed}{ref}{%
+ \def\enit@ref{\enit@reflabel{#1}\@ne}}
-\let\enit@setdesclabel\enit@setitemlabel
-
-\define@key{enumitem}{ref}{%
- \enit@reflabel{#1}\@ne}
+% #2=0 don't "normalize" (ie, already normalized)
+% =1 "normalize" (in key ref)
+% Used thru \enit@ref
-%\expandafter\def\csname c@*\endcsname{\csname c@\@enumctr\endcsname}
+\def\enit@reflabel#1#2{%
+ \ifnum\enit@depth=\@ne\else % no level 0
+ \advance\enit@depth\@ne
+ \@namedef{p@\@enumctr}{}% Don't accumulate labels
+ \advance\enit@depth\m@ne
+ \fi
+ \ifcase#2%
+ \@namedef{the\@enumctr}{{#1}}%
+ \else
+ \enit@normlabel{\csname the\@enumctr\endcsname}{#1}%
+ \fi}
-\newcommand\AddEnumerateCounter[3]{%
- \g@addto@macro\enit@labellist{\enit@refstar#1\enit@refstar#2}%
- \enit@toks\expandafter{\enit@calcdefs}%
- \edef\enit@calcdefs{%
- \the\enit@toks
- \noexpand\enit@calcdef
- \noexpand#2%
- \expandafter\noexpand\csname enit@\string#1\endcsname
- {#3}}}
+% \xxx* in counters (refstar) and widest (calcdef)
+% ------------------------------------------------
+% \enit@labellist contains a list of
+% \enit@elt{widest}\count\@count\enit@sc@@count
+% \enit@elt is either \enit@getwidth or \enit@refstar, defined
+% below
+% The current implementation is sub-optimal -- labels are stored in
+% labellist, counters defined again when processing labels, and
+% modifying it is almost impossible.
\let\enit@labellist\@empty
-\AddEnumerateCounter{\arabic}{\@arabic}{0}
-\AddEnumerateCounter{\alph}{\@alph}{m}
-\AddEnumerateCounter{\Alph}{\@Alph}{M}
-\AddEnumerateCounter{\roman}{\@roman}{viii}
-\AddEnumerateCounter{\Roman}{\@Roman}{VIII}
+\newcommand\AddEnumerateCounter{%
+ \@ifstar\enit@addcounter@s\enit@addcounter}
+
+\def\enit@addcounter#1#2#3{%
+ \enit@toks\expandafter{%
+ \enit@labellist
+ \enit@elt{#3}}%
+ \edef\enit@labellist{%
+ \the\enit@toks
+ \enit@noexcs{\expandafter\@gobble\string#1}%
+ \enit@noexcs{\expandafter\@gobble\string#2}%
+ \enit@noexcs{enit@sc@\expandafter\@gobble\string#2}}}
+
+\def\enit@addcounter@s#1#2#3{%
+ \enit@addcounter{#1}{#2}%
+ {\@nameuse{enit@sc@\expandafter\@gobble\string#2}{#3}}}
+
+% The 5 basic counters:
+
+\AddEnumerateCounter\arabic\@arabic{0}
+\AddEnumerateCounter\alph\@alph{m}
+\AddEnumerateCounter\Alph\@Alph{M}
+\AddEnumerateCounter\roman\@roman{viii}
+\AddEnumerateCounter\Roman\@Roman{VIII}
+
+% Inline lists
+% ============
+%
+% Labels
+% ------
+
+\enitkv@key{enumitem}{itemjoin}{%
+ \def\enit@itemjoin{#1}}
+
+\enitkv@key{enumitem}{itemjoin*}{%
+ \def\enit@itemjoin@s{#1}}
+
+\enitkv@key{enumitem}{afterlabel}{%
+ \def\enit@afterlabel{#1}}
+
+% Mode
+% ----
+
+\enitkv@key{enumitem}{mode}{%
+ \@ifundefined{enit@mode#1}%
+ {\enit@checkerror{mode}{#1}}%
+ {\csname enit@mode#1\endcsname}}
+
+\let\enit@modeboxed\enit@boxmodetrue
+\let\enit@modeunboxed\enit@boxmodefalse
% Short Labels
+% ============
\let\enit@marklist\@empty
-% shorthand, expansion
+% shorthand, expansion:
\newcommand\SetEnumerateShortLabel[2]{%
\let\enit@a\@empty
@@ -255,6 +606,37 @@
\SetEnumerateShortLabel{I}{\Roman*}
\SetEnumerateShortLabel{1}{\arabic*}
+% This is called \enit@first one,two,three,\@nil\@@nil. If there
+% are just one element #2 is \@nil, otherwise we have to remove
+% the trailing ,\@nil with enit@first@x
+% Called with the keys in \enit@c
+% Returns enit@toks
+
+\def\enit@first#1,#2\@@nil{%
+ \in@{=}{#1}% Quick test, if contains =, it's key=value
+ \ifin@\else
+ \def\enit@a{#1}%
+ \@ifundefined{enitkv@enumitem@\enit@meaning\enit@a}%
+ {\ifnum\enit@type=\z@
+ \def\enit@elt{\enit@replace\enit@a}%
+ \enit@marklist % Returns \enit@toks
+ \else
+ \enit@toks{#1}%
+ \fi
+ \ifx\@nil#2%
+ \ifx,#1,\else
+ \edef\enit@c{label=\the\enit@toks}%
+ \fi
+ \else
+ \@temptokena\expandafter{\enit@first@x#2}%
+ \edef\enit@c{label=\the\enit@toks,\the\@temptokena}%
+ \fi}%
+ {}%
+ \fi
+ \enit@toks\expandafter{\enit@c}}
+
+\def\enit@first@x#1,\@nil{#1}
+
\def\enit@replace#1#2#3{%
\enit@toks{}%
\def\enit@b##1#2##2\@@nil{%
@@ -272,265 +654,637 @@
\expandafter\enit@b#1#2\@nil\@@nil
\edef#1{\the\enit@toks}}
-% ¿Se podría dar una variante para ref?
+% Pre and post code
+% =================
-\def\enit@first@x#1,\@nil{#1}
+\enitkv@key{enumitem}{before}{%
+ \def\enit@before{#1}}
-% This is called \enit@first one,two,three,\@nil\@@nil. If there
-% are just one element #2 is \@nil, otherwise we have to remove
-% the trailing ,\@nil with enit@first@x
-% Returns toks@
+\enitkv@key{enumitem}{after}{%
+ \def\enit@after{#1}}
-\def\enit@first#1,#2\@@nil{%
- \in@{=}{#1}%
- \ifin@\else
- \def\enit@c{#1}%
- \@ifundefined{KV@enumitem@\expandafter\strip@prefix\meaning\enit@c}{%
- \def\enit@elt{\enit@replace\enit@c}%
- \enit@marklist % Returns \enit@toks
- \ifx\@nil#2%
- \ifx,#1,\else
- \edef\enit@c{label=\the\enit@toks}%
- \fi
- \else
- \@temptokena\expandafter{\enit@first@x#2}%
- \edef\enit@c{label=\the\enit@toks,\the\@temptokena}%
- \fi}{}%
- \fi
- \enit@toks\expandafter{\enit@c}}
+\enitkv@key{enumitem}{before*}{%
+ \expandafter\def\expandafter\enit@before\expandafter
+ {\enit@before#1}}
-\let\enit@shl@enum\enit@toks
-\let\enit@shl@item\enit@toks
-\let\enit@shl@desc\enit@toks
+\enitkv@key{enumitem}{after*}{%
+ \expandafter\def\expandafter\enit@after\expandafter
+ {\enit@after#1}}
-% Labels
+% Miscelaneous keys
+% ================
+
+\enitkv@key{enumitem}{nolistsep}[true]{%
+ \partopsep=\z@skip
+ \topsep=\z@ plus .1pt
+ \itemsep=\z@skip
+ \parsep=\z@skip}
-\def\enit@normlabel#1{%
- \begingroup
- \enit@labellist
- \protected@xdef\enit@a{{#1}}% Added braces as \ref is in the
- \endgroup} % global scope.
+\enitkv@key{enumitem}{noitemsep}[true]{%
+ \itemsep=\z@skip
+ \parsep=\z@skip}
-% #2=0 don't "normalize", =1 "normalize"
+\enitkv@key{enumitem}{wide}[\parindent]{%
+ \enit@align@left
+ \leftmargin\z@
+ \labelwidth\z@
+ \setlength\labelindent{#1}%
+ \listparindent\labelindent
+ \enit@calcset\itemindent\enit@iv!}
-\def\enit@reflabel#1#2{%
- \def\enit@ref{%
- \ifnum\enit@depth=\@ne\else % no level 0
- \advance\enit@depth\@ne
- \@namedef{p@\@enumctr}{}% Don't accumulate labels
- \advance\enit@depth\m@ne
- \fi
- \ifcase#2%
- \def\enit@a{{#1}}%
- \else
- \enit@normlabel{#1}% Returns \enit@a
- \fi
- \expandafter
- \let\csname the\@enumctr\endcsname\enit@a}}
+% The following is deprecated in favour of wide:
-\def\enit@refstar#1{%
- \def#1##1{%
- \if*##1\@empty
- \noexpand#1{\@enumctr}%
- \else
- \noexpand#1{##1}%
- \fi}}
+\enitkv@key{enumitem}{fullwidth}[true]{%
+ \leftmargin\z@
+ \labelwidth\z@
+ \def\enit@align##1{\hskip\labelsep##1}}
+
+% "Abstract" layer
+% ================
+%
+% Named values
+% ------------
+
+\newcommand\SetEnumitemValue[2]{% Implicit #3
+ \@ifundefined{enit@enitkv@#1}%
+ {\@ifundefined{enitkv@enumitem@#1}%
+ {\PackageError{enumitem}%
+ {Wrong key `#1' in \string\SetEnumitemValue}%
+ {Perhaps you have misspelled it}}{}%
+ \expandafter\let\csname enit@enitkv@#1\expandafter\endcsname
+ \csname enitkv@enumitem@#1\endcsname}{}%
+ \@namedef{enitkv@enumitem@#1}##1{%
+ \def\enit@a{##1}%
+ \@ifundefined{enit@enitkv@#1@\enit@meaning\enit@a}%
+ {\@nameuse{enit@enitkv@#1}{##1}}%
+ {\@nameuse{enit@enitkv@#1\expandafter\expandafter\expandafter}%
+ \expandafter\expandafter\expandafter
+ {\csname enit@enitkv@#1@##1\endcsname}}{}}%
+ \@namedef{enit@enitkv@#1@#2}}
+
+% Defining keys
+% -------------
+
+\newcommand\SetEnumitemKey[2]{%
+ \@ifundefined{enitkv@enumitem@#1}%
+ {\enitkv@key{enumitem}{#1}[]{\enitkv@setkeys{enumitem}{#2}}}%
+ {\PackageError{enumitem}%
+ {Duplicated key `#1' in \string\SetEnumitemKey}%
+ {There already existsa key with that name}}}
+
+% +=============================+
+% | PROCESSING KEYS |
+% +=============================+
+%
+% Set keys
+% ========
\def\enit@setkeys#1{%
- \@ifundefined{#1}{}%
+ \@ifundefined{enit@@#1}{}%
{\expandafter\expandafter\expandafter
- \enit@setkeys@i\csname#1\endcsname\@@}}
+ \enit@setkeys@i\csname enit@@#1\endcsname\@@}}
+
+% The following is used directly in resumeset:
\def\enit@setkeys@i#1\@@{%
- \@nameuse{enit@shl@\enit@type}{#1}%
+ \let\enit@delayedkeys\@empty
+ \enit@shl{#1}% is or returns \enit@toks
\expandafter\enit@setkeys@ii\the\enit@toks\@@}
\def\enit@setkeys@ii#1\@@{%
- \setkeys{enumitem}{#1}%
- \ifx\enit@ref\relax\else % Not a logical place, grrr
- \let\enit@saveref\enit@ref
- \let\enit@ref\relax
+ \enitkv@setkeys{enumitem}{#1}%
+ \enit@toks\expandafter{\enit@delayedkeys}%
+ \edef\enit@a{%
+ \noexpand\enitkv@setkeys{enumitem-delayed}{\the\enit@toks}}%
+ \enit@a}
+
+% Handling * and ! values
+% =======================
+%
+% \@gobbletwo removes \c from \c@counter.
+
+\def\enit@getwidth#1#2#3#4{%
+ \let#4#3%
+ \def#3##1{%
+ \@ifundefined{enit@widest\expandafter\@gobbletwo\string##1}% if no widest=key
+ {#1}%
+ {\csname enit@widest\expandafter\@gobbletwo\string##1\endcsname{#4}}}}
+
+\def\enit@valueerror#1{\z@ % if after an assignment, but doesn't catch \ifnum
+ \PackageError{enumitem}%
+ {No default \string\value\space for `#1'}%
+ {You can provide one with widest*}}%
+
+\let\enit@values\@empty
+
+\def\enit@calcwidth{%
+ \ifenit@calcwidest
+ \ifnum\enit@type=\z@ % ie, enum
+ \@ifundefined{enit@cw@\@enumctr}%
+ {\@namedef{enit@cv@\@enumctr}{\enit@valueerror\@enumctr}}%
+ {\edef\enit@values{%
+ \enit@values
+ \@nameuse{c@\@enumctr}\@nameuse{enit@cw@\@enumctr}\relax}%
+ \expandafter
+ \edef\csname enit@cv@\@enumctr\endcsname
+ {\@nameuse{c@\@enumctr}}}%
+ \fi
+ \begingroup
+ \enit@values
+ \def\value##1{\csname enit@cv@##1\endcsname}%
+ \let\enit@elt\enit@getwidth
+ \enit@labellist
+ \settowidth\labelwidth{\@itemlabel}%
+ \xdef\enit@a{\labelwidth\the\labelwidth\relax}%
+ \endgroup
+ \enit@a
+ \fi
+ \advance\dimen@-\labelwidth}
+
+\def\enit@calcleft{%
+ \dimen@\leftmargin
+ \advance\dimen@\itemindent
+ \advance\dimen@-\labelsep
+ \advance\dimen@-\labelindent
+ \ifcase\enit@calc % = 0 = labelindent
+ \enit@calcwidth
+ \advance\labelindent\dimen@
+ \or % = 1 = labelwidth, so no \enit@calcwidth
+ \labelwidth\dimen@
+ \or % = 2 = labelsep
+ \enit@calcwidth
+ \advance\labelsep\dimen@
+ \or % = 3 = leftmargin
+ \enit@calcwidth
+ \advance\leftmargin-\dimen@
+ \or % = 4 =itemindent
+ \enit@calcwidth
+ \advance\itemindent-\dimen@
\fi}
-% pre y post code
+% "Normalizing" labels
+% ====================
+%
+% Replaces \counter* by \counter{level} (those in \enit@labellist).
+%
+% #1 is either \csname...\endcsmame or the container \@itemlabel --
+% hence \expandafter
-\define@key{enumitem}{before}[1]{%
- \def\enit@before{#1}}
+\def\enit@refstar@i#1#2{%
+ \if*#2\@empty
+ \noexpand#1{\@enumctr}%
+ \else
+ \noexpand#1{#2}%
+ \fi}%
-\define@key{enumitem}{after}[1]{%
- \def\enit@after{#1}}
+\def\enit@refstar#1#2#3#4{%
+ \def#2{\enit@refstar@i#2}%
+ \def#3{\enit@refstar@i#3}}
-\define@key{enumitem}{before*}[1]{%
- \expandafter\def\expandafter\enit@before\expandafter
- {\enit@before#1}}
+\def\enit@normlabel#1#2{%
+ \begingroup
+ \def\value{\enit@refstar@i\value}%
+ \let\enit@elt\enit@refstar
+ \enit@labellist
+ \protected@xdef\enit@a{{#2}}% Added braces as \ref is in the
+ \endgroup
+ \expandafter\let#1\enit@a} % global scope.
-\define@key{enumitem}{after*}[1]{%
- \expandafter\def\expandafter\enit@after\expandafter
- {\enit@after#1}}
+% Preliminary settings and default values
+% =======================================
-% And now, the three environments are redefined.
-% First, code shared by enumerate and itemize.
-
-\newdimen\enit@outerparindent
+\def\enit@prelist#1#2#3{%
+ \let\enit@type#1%
+ \def\enit@depth{#2}%
+ \edef\enit@prevlabel{#3\romannumeral#2}%
+ \advance#2\@ne}
-\def\enit@preset{%
- \def\makelabel##1{\hss\llap{\enit@format##1}}%
+\def\enit@preset#1#2#3{%
+ \enit@sepfrommarginfalse
+ \enit@calcwidestfalse
+ \let\enit@resuming\z@
+ \let\enit@series\relax
+ \enit@boxmodetrue
+ \def\enit@itemjoin{ }%
+ \let\enit@itemjoin@s\relax
+ \let\enit@afterlabel\nobreakspace
\let\enit@before\@empty
\let\enit@after\@empty
- \let\enit@format\@empty
- \let\enit@calcleft\relax
- \let\enit@widest\@empty
+ \let\enit@format\@firstofone % and NOT empty
+ \let\enit@ref\relax
\labelindent\z@skip
\ifnum\@listdepth=\@ne
\enit@outerparindent\parindent
\else
\parindent\enit@outerparindent
\fi
- \enit@setkeys{enit@@list}%
- \enit@setkeys{enit@@list\romannumeral\@listdepth}}
-
-\def\enit@resumeset#1#2{%
- \def\enit@a{resume*}%
- \def\enit@b{#2}%
- \ifx\enit@a\enit@b
- \enit@toks\expandafter\expandafter\expandafter
- {\csname enit@savekeys@\@currenvir\endcsname,resume}%
- \else
- #1{#2}% Returns toks@
+ \enit@setkeys{list}%
+ \enit@setkeys{list\romannumeral\@listdepth}%
+ \enit@setkeys{#1}%
+ \enit@setkeys{#1\romannumeral#2}%
+ \enit@setresume{#3}}
+
+% keyval "error" in enumitem-resume: all undefined keys (ie, all
+% except resume*) are ignored, but <series> is treated like
+% resume*=<series>
+
+\def\enitkv@err@a#1{%
+ \@ifundefined{enit@resumekeys@series@\@tempa}{}%
+ {\@nameuse{enitkv@enumitem-resume@resume*\expandafter}%
+ \expandafter{\@tempa}}}
+
+% keyval "error" in the optional argument: all undefined keys are
+% passed to the keyval error, but <series> is ignored (already
+% processed in enumitem-resume
+
+\def\enitkv@err@b#1{%
+ \@ifundefined{enit@resumekeys@series@\@tempa}%
+ {\enit@savekverr{#1}}%
+ {}}
+
+% Process keys in optional argument:
+
+\def\enit@setresume#1{%
+ \enit@shl{#1}% Returns enit@toks
+ \edef\enit@savekeys{\the\enit@toks}%
+ \let\enit@savekverr\enitkv@errx
+ \let\enitkv@errx\enitkv@err@a
+ \edef\enit@b{%
+ \noexpand\enitkv@setkeys{enumitem-resume}{\the\enit@toks}}%
+ \enit@b
+ \let\enitkv@errx\enitkv@err@b
+ \ifcase\enit@resuming\or\or % = 2
+ \expandafter
+ \enit@setkeys@i\enit@resumekeys,resume=\enit@series\@@
+ \or % = 3
+ \expandafter
+ \enit@setkeys@i\enit@resumekeys,resume\@@
\fi
- \edef\enit@c{%
- \def\noexpand\enit@savekeys{\the\enit@toks}%
- \noexpand\setkeys{enumitem}{\the\enit@toks}}%
- \enit@c}
+ \expandafter\enit@setkeys@i\enit@savekeys\@@
+ \let\enitkv@errx\enit@savekverr}
+% +=============================+
+% | LIST TYPES |
+% +=============================+
+%
+% Displayed lists
+% ===============
+% #1 #2 implicit
+
+\def\enit@dylist{%
+ \enit@align@right
+ \list}
+
+\def\enit@endlist{%
+ \enit@after
+ \endlist
+ \ifx\enit@series\relax\else % discards resume*, too
+ \ifnum\enit@resuming=\@ne % ie, series
+ \enit@setresumekeys{series@\enit@series}\global\global
+ \else % ie, resume, resume* (save count, but not keys)
+ \enit@setresumekeys{series@\enit@series}\@gobblefour\global
+ \fi
+ \enit@afterlist
+ \fi
+ \enit@setresumekeys\@currenvir\@empty\@empty
+ \aftergroup\enit@afterlist}
+
+% #1 = either \@currenvir or series@<series>
+% #2(keys) #3(counter) are \global, \@gobblefour or \@empty
+
+\def\enit@setresumekeys#1#2#3{%
+ \enit@toks\expandafter{\enit@savekeys}%
+ \xdef\enit@afterlist{%
+ #2\def\enit@noexcs{enit@resumekeys@#1}{\the\enit@toks}%
+ \ifnum\enit@type=\z@ % ie, enum
+ #3\def\enit@noexcs{enit@resume@#1}{%
+ \csname c@\@listctr\endcsname
+ \the\csname c@\@listctr\endcsname}%
+ \fi}}
+
+% Inline lists
+% ============
+
+% Definition of \@trivlist inside inline lists. So, when
+% \@trivlist is found in any displayed list (including quote,
+% center, verbatim...) the default \@item is restored.
+
+\def\enit@intrivlist{%
+ \enit@changed@itemfalse
+ \let\@item\enit@outer@item
+ \let\par\@@par
+ \let\@trivlist\enit@outer@triv
+ \@trivlist}
+
+% Keep track of \@item and \item changes
+
+\newif\ifenit@changed@item
+\enit@changed@itemfalse
+
+\newif\ifenit@changeditem
+\enit@changeditemfalse
+
+% List
+% ----
+
+% Arguments, as before:
+% \enitdp@<name>, <name>, <max-depth>, <format>
+% About @newlist, see @initem.
+
+\def\enit@inlist#1#2{%
+ \ifnum\@listdepth>\enit@listdepth\relax
+ \@toodeep
+ \else
+ \global\advance\@listdepth\@ne
+ \fi
+ \let\enit@align\@firstofone
+ \def\@itemlabel{#1}%
+ \@nmbrlistfalse
+ \ifenit@changed@item\else
+ \enit@changed@itemtrue
+ \let\enit@outer@triv\@trivlist
+ \let\@trivlist\enit@intrivlist
+ \@setpar\@empty
+ \let\enit@outer@item\@item
+ \fi
+ #2\relax
+ \global\@newlisttrue
+ \ifenit@boxmode
+ \ifenit@changeditem\else
+ \let\enit@outeritem\item
+ \fi
+ \let\@item\enit@boxitem
+ \else
+ \let\@item\enit@noboxitem
+ \ifx\enit@itemjoin@s\relax\else
+ \PackageWarning{enumitem}%
+ {itemjoin* discarded in mode unboxed\MessageBreak}%
+ \fi
+ \fi
+ \let\enit@calcleft\relax
+ \ifenit@boxmode
+ \global\setbox\enit@inbox\hbox\bgroup\color@begingroup
+ \let\item\enit@endinbox
+ \enit@changeditemtrue
+ \fi
+ \ignorespaces}
+
+\def\enit@endinlist{%
+ \ifenit@boxmode
+ \unskip\color@endgroup\egroup
+ \ifdim\wd\enit@inbox=\z@
+ \enit@itemerror
+ \else
+ \ifenit@noinitem\else
+ \@ifundefined{enit@itemjoin@s}%
+ {\enit@itemjoin}%
+ {\enit@itemjoin@s}%
+ \fi
+ \unhbox\@labels
+ \enit@afterlabel
+ \unhbox\enit@inbox
+ \fi
+ \else
+ \unskip
+ \if@newlist
+ \enit@itemerror
+ \fi
+ \fi
+ \enit@after
+ \global\advance\@listdepth\m@ne
+ \global\@inlabelfalse
+ \if@newlist
+ \global\@newlistfalse
+ \@noitemerr
+ \fi
+ \ifx\enit@series\relax\else % discards resume* list, too
+ \ifnum\enit@resuming=\@ne % ie, series
+ \enit@setresumekeys{series@\enit@series}\global\global
+ \else % ie, resume, resume* (save count, but not keys)
+ \enit@setresumekeys{series@\enit@series}\@gobblefour\global
+ \fi
+ \enit@afterlist
+ \fi
+ \enit@setresumekeys\@currenvir\@empty\@empty
+ \aftergroup\enit@afterlist}
+
+% \@item: unboxed
+% ---------------
+
+\def\enit@noboxitem[#1]{%
+ \if@newlist
+ \leavevmode % ships pending labels out
+ \global\@newlistfalse
+ \else
+ \ifhmode
+ \unskip
+ \enit@itemjoin
+ \else
+ \noindent
+ \fi
+ \fi
+ \if@noitemarg
+ \@noitemargfalse
+ \if@nmbrlist
+ \refstepcounter{\@listctr}% after \unskip (hyperref)
+ \fi
+ \fi
+ \mbox{\makelabel{#1}}%
+ \enit@afterlabel
+ \ignorespaces}
+
+% \@item: boxed
+% ------------
+%
+% We don't want \item to be executed locally, because it sets a flag
+% (and hyperref adds another flag, too). So, we redefine it inside
+% the box to \enit@endinbox which ends the box and then use the actual
+% (outer) \item. labels are stored in another box, to detect empty
+% boxes, ie, misplaced \item's. Note the 2nd \item ends collecting
+% the 1st item and ships it out, while the 3rd \item ends collecting
+% the 2nd item, puts the itemjoin and then ships the 2nd item out.
+% The flag enit@noinitem keeps track of that.
+
+\newif\ifenit@noinitem
+
+\def\enit@endinbox{%
+ \unskip
+ \color@endgroup
+ \egroup
+ \enit@outeritem}
+
+\def\enit@boxitem[#1]{%
+ \if@newlist
+ \global\@newlistfalse
+ \ifdim\wd\enit@inbox>\z@
+ \enit@itemerror
+ \fi
+ \enit@noinitemtrue
+ \leavevmode % ships pending labels out
+ \else
+ \ifhmode\unskip\fi
+ \ifdim\wd\enit@inbox=\z@
+ \enit@itemerror
+ \else
+ \ifenit@noinitem
+ \enit@noinitemfalse
+ \else
+ \enit@itemjoin
+ \fi
+ \unhbox\@labels
+ \enit@afterlabel
+ \unhbox\enit@inbox
+ \fi
+ \fi
+ \if@noitemarg
+ \@noitemargfalse
+ \if@nmbrlist
+ \refstepcounter{\@listctr}%
+ \fi
+ \fi
+ \sbox\@labels{\makelabel{#1}}%
+ \setbox\enit@inbox\hbox\bgroup\color@begingroup
+ \let\item\enit@endinbox
+ \hskip1sp % in case the first thing is \label
+ \ignorespaces}
+
+% Pause item
+% ----------
+%
+% To do.
+%
+% The three types
+% ===============
+%
+% enumerate and enumerate*
+% ------------------------
+%
% The following has 4 arguments, which in enumerate are:
% \@enumdepth, enum, \thr@@, <format>.
% In user defined environments they are:
% \enitdp@<name>, <name>, <max-depth>, <format>
-\def\enit@enumerate#1#2#3#4{%
- \def\enit@depth{#1}%
- \def\enit@type{enum}%
+\def\enit@enumerate{%
+ \let\enit@list\enit@dylist
+ \enit@enumerate@i}
+
+\@namedef{enit@enumerate*}{%
+ \let\enit@list\enit@inlist
+ \enit@enumerate@i}
+
+\def\enit@enumerate@i#1#2#3#4{%
\ifnum#1>#3\relax
- \@toodeep
+ \enit@toodeep
\else
- \edef\enit@prevlabel{#2\romannumeral#1}%
- \advance#1\@ne
+ \enit@prelist\z@{#1}{#2}%
\edef\@enumctr{#2\romannumeral#1}%
\expandafter
- \list
+ \enit@list
\csname label\@enumctr\endcsname
{\usecounter\@enumctr
- \let\enit@ref\relax
- \let\enit@saveref\relax
- \enit@normlabel{\@itemlabel}% Returns \enit@a
- \expandafter\let\@itemlabel\enit@a
- \enit@preset
- \enit@setkeys{enit@@#2}%
- \enit@setkeys{enit@@\@enumctr}%
- \enit@resumeset\enit@shl@enum{#4}%
+ \let\enit@calc\z@
+ \def\makelabel##1{\enit@align{\enit@format{##1}}}%
+ \enit@preset{#2}{#1}{#4}%
+ \enit@normlabel\@itemlabel\@itemlabel
+ \enit@ref
\enit@calcleft
- \ifx\enit@ref\relax
- \enit@saveref
- \else
- \enit@ref
- \fi
\enit@before}%
\fi}
-\def\enit@endenumerate{%
- \enit@after
- \endlist
- \enit@toks\expandafter{\enit@savekeys}%
- \xdef\enit@afterlist{%
- \def\expandafter\noexpand
- \csname enit@savekeys@\@currenvir\endcsname{\the\enit@toks}%
- \def\expandafter\noexpand
- \csname enit@resume@\@currenvir\endcsname{%
- \csname c@\@listctr\endcsname
- \the\csname c@\@listctr\endcsname}}%
- \aftergroup\enit@afterlist}
-
+\let\enit@endenumerate\enit@endlist
+\@namedef{enit@endenumerate*}{\enit@endinlist}
+
+% itemize and itemize*
+% --------------------
+%
% The following has 4 arguments, which in itemize are:
% \@itemdepth, item, \thr@@, <format>.
% In user defined environments they are:
% \enitdp@<name>, <name>, <max-depth>, <format>
+
+\def\enit@itemize{%
+ \let\enit@list\enit@dylist
+ \enit@itemize@i}
+
+\@namedef{enit@itemize*}{%
+ \let\enit@list\enit@inlist
+ \enit@itemize@i}
-\def\enit@itemize#1#2#3#4{%
- \def\enit@depth{#1}%
- \def\enit@type{item}%
+\def\enit@itemize@i#1#2#3#4{%
\ifnum#1>#3\relax
- \@toodeep
+ \enit@toodeep
\else
- \edef\enit@prevlabel{#2\romannumeral#1}%
- \advance#1\@ne
+ \enit@prelist\@ne{#1}{#2}%
\edef\@itemitem{label#2\romannumeral#1}%
\expandafter
- \list
+ \enit@list
\csname\@itemitem\endcsname
- {\enit@preset
- \enit@setkeys{enit@@#2}%
- \enit@setkeys{enit@@#2\romannumeral#1}%
- \enit@resumeset\enit@shl@item{#4}%
- \enit@calcleft
- \enit@before}%
+ {\let\enit@calc\z@
+ \def\makelabel##1{\enit@align{\enit@format{##1}}}%
+ \enit@preset{#2}{#1}{#4}%
+ \enit@calcleft
+ \enit@before}%
\fi}
-\def\enit@enditemize{%
- \enit@after
- \endlist
- \enit@toks\expandafter{\enit@savekeys}%
- \xdef\enit@afterlist{%
- \def\expandafter\noexpand
- \csname enit@savekeys@\@currenvir\endcsname{\the\enit@toks}}%
- \aftergroup\enit@afterlist}
+\let\enit@enditemize\enit@endlist
+\@namedef{enit@enditemize*}{\enit@endinlist}
+
+% description and description*
+% ----------------------------
+%
+% Make sure \descriptionlabel exists:
+
+\providecommand*\descriptionlabel[1]{%
+ \hspace\labelsep
+ \normalfont\bfseries#1}
+
+\@namedef{enit@description*}{%
+ \let\enit@list\enit@inlist
+ \enit@description@i}
-\def\enit@description#1#2#3#4{%
- \def\enit@depth{#1}%
- \def\enit@type{desc}%
+\def\enit@description{%
+ \let\enit@list\enit@dylist
+ \enit@description@i}
+
+\def\enit@description@i#1#2#3#4{%
\ifnum#1>#3\relax
- \@toodeep
+ \enit@toodeep
\else
- \list{}%
- {\labelwidth\z@
+ \enit@list{}%
+ {\let\enit@type\tw@
+ \advance#1\@ne
+ \labelwidth\z@
+ \enit@align@left
\let\makelabel\descriptionlabel
- \let\enit@descstyle\enit@normalstyle
- \let\enit@before\@empty
- \let\enit@after\@empty
- \let\enit@format\@empty
- \labelindent\z@skip
- \enit@setkeys{enit@@list}%
- \enit@setkeys{enit@@list\romannumeral#1}%
- \enit@setkeys{enit@@#2}%
- \enit@resumeset\enit@toks{#4}%
- \itemindent-\leftmargin
- \advance\itemindent\labelindent
- \let\enit@makelabel\makelabel
+ \enit@style@standard
+ \enit@preset{#2}{#1}{#4}%
+ \enit@calcleft
+ \let\enit@svlabel\makelabel
\def\makelabel##1{%
- \enit@descstyle{\enit@makelabel{\enit@format##1}}}%
+ \labelsep\z@
+ \ifenit@boxdesc
+ \enit@svlabel{\enit@align{\enit@format{##1}}}%
+ \else
+ \nobreak
+ \enit@svlabel{\enit@format{##1}}%
+ \aftergroup\enit@postlabel
+ \fi}%
\enit@before}%
\fi}
-\newcount\enitdp@desc
-\enitdp@desc\z@
+\let\enit@enddescription\enit@endlist
+\@namedef{enit@enddescription*}{\enit@endinlist}
-\def\enit@enddescription{%
- \enit@after
- \endlist
- \enit@toks\expandafter{\enit@savekeys}%
- \xdef\enit@afterlist{%
- \def\expandafter\noexpand
- \csname enit@savekeys@\@currenvir\endcsname{\the\enit@toks}}%
- \aftergroup\enit@afterlist}
-
-% Option ignoredisplayed (see below).
+% trivlist
+% ========
\def\enit@trivlist{%
+ \let\enit@type\tw@
\parsep\parskip
\csname @list\romannumeral\the\@listdepth\endcsname
\@nmbrlistfalse
- \enit@setkeys{enit@@triv}%
- \enit@setkeys{enit@@triv\romannumeral\@listdepth}%
+ \enit@setkeys{trivlist}%
+ \enit@setkeys{trivlist\romannumeral\@listdepth}%
\@trivlist
\labelwidth\z@
\leftmargin\z@
@@ -538,32 +1292,42 @@
\let\@itemlabel\@empty
\def\makelabel##1{##1}}
-% description styles
-
-% the next definition is somewhat tricky because
-% labels are boxed. That's fine when the label is
-% just placed at the begining of a line of text,
-% but when the box is placed without horizontal
-% material, leading is killed. Therefore,
-% solutions based on the LaTeX Companion are wrong.
-% Here, the \everypar in \@item is overriden
-% and the label is printed directly, without
-% boxing it.
+% Description styles
+% ==================
%
-% First, a utility macro
-
-\def\enit@break{%
- \if@nobreak
- \@nobreakfalse
- \clubpenalty\@M
- \else
- \clubpenalty\@clubpenalty
- \everypar{}%
- \fi}
-
-\def\enit@nextlinestyle#1{%
- \hskip-\itemindent
- \global\everypar{%
+% the next definition is somewhat tricky because labels are boxed.
+% That's fine when the label is just placed at the begining of a line
+% of text, but when the box is placed without horizontal material,
+% leading is killed. So, we need change somehow \box to \unhbox, but
+% I don't want to modify \@item. The code below presumes \@item has
+% not been changed and arguments gobble the part setting \@labels,
+% which is replaced by a new one.
+%
+% The default value in description is itemindent=!, but some styles
+% (those whose item text begin at a fixed place, ie, nextline,
+% multiline and sameline) change it to labelwidth=!.
+%
+% We must be careful with the group and the whatsit added by color to
+% boxes. Alignment is applied here and some adjustments in skips are
+% necessary to get proper line breaks (including a \nobreak at the
+% beginning of \enit@align, ie, after the first whatsit, see above).
+% To "pass" the inner group added by color to the box, \enit@postlabel
+% ckecks if the following is }. ie, \egroup -- if not, the box has
+% not reached yet its end.
+
+\def\enit@postlabel{%
+ \@ifnextchar\egroup
+ {\aftergroup\enit@postlabel}%
+ {\enit@postlabel@i}}
+
+\def\enit@postlabel@i#1#2#3#4#5{%
+ \def\enit@lblpenalty{\penalty\z@\hskip\skip@}%
+ \ifenit@nextline
+ \ifdim\wd\@tempboxa>\labelwidth
+ \def\enit@lblpenalty{\newline\@nobreaktrue}%
+ \fi
+ \fi
+ \everypar{%
\@minipagefalse
\global\@newlistfalse
\if@inlabel
@@ -571,212 +1335,230 @@
{\setbox\z@\lastbox
\ifvoid\z@
\kern-\itemindent
- \fi
- \sbox\z@{\hskip\labelindent#1\hskip\labelsep}%
- \ifdim\wd\z@>\leftmargin
- {\advance\leftskip-\leftmargin
- \advance\leftskip\labelindent
- \hskip-\labelsep
- #1%
- \par
- \nobreak
- \vskip-\parskip}%
- \else
- \hskip-\leftmargin\hskip-\labelsep\hskip\labelindent
- \rlap{#1}%
- \hskip\leftmargin\hskip\labelsep\hskip-\labelindent
\fi}%
- \setbox\@labels\box\voidb@x
+ \unhbox\@labels
+ \skip@\lastskip % Save last \labelsep
+ \unskip % Remove it
+ \enit@lblpenalty % Restore it, after penalty
\fi
- \enit@break}}
-
-\def\enit@multilinestyle#1{%
- \dimen@\leftmargin
- \advance\dimen@-\labelsep
- \advance\dimen@-\labelindent
- \sbox\z@{%
- \parbox[t]\dimen@{%
- \raggedright\hskip-\labelsep#1}}%
- \setbox\@labels\box\voidb@x
- \dp\z@\z@
- \hskip\labelsep\box\z@
- \hfil}
-
-\def\enit@unboxedstyle#1{%
- \hskip-\itemindent
- \global\everypar{%
- \@minipagefalse
- \global\@newlistfalse
- \if@inlabel
- \global\@inlabelfalse
- {\setbox\z@\lastbox
- \ifvoid\z@
- \kern-\itemindent
- \fi
- \hskip-\leftmargin\hskip-\labelsep\hskip\labelindent
- #1%
- \hskip\labelsep}%
- \setbox\@labels\box\voidb@x
+ \if@nobreak
+ \@nobreakfalse
+ \clubpenalty\@M
+ \else
+ \clubpenalty\@clubpenalty
+ \everypar{}%
+ \fi}%
+ \def\enit@a{#1#2#3#4}%
+ \def\enit@b{\global\setbox\@labels\hbox}%
+ \ifx\enit@a\enit@b\else
+ \PackageError{enumitem}%
+ {Non standard \string\item}%
+ {A class or a package has redefined \string\item\MessageBreak
+ and I do not know how to continue}%
+ \fi
+ \global\setbox\@labels\hbox{%
+ \unhbox\@labels
+ \hskip\itemindent
+ \hskip-\labelwidth
+ \hskip-\labelsep
+ \ifdim\wd\@tempboxa>\labelwidth
+ \enit@align{\unhbox\@tempboxa}\unskip % Removes (typically) \hfil
+ \else
+ \leavevmode\hbox to\labelwidth{\enit@align{\unhbox\@tempboxa}}%
\fi
- \enit@break}}
+ \hskip\labelsep}}
-\def\enit@samelinestyle#1{%
- \hskip-\itemindent
- \global\everypar{%
- \@minipagefalse
- \global\@newlistfalse
- \if@inlabel
- \global\@inlabelfalse
- {\setbox\z@\lastbox
- \ifvoid\z@
- \kern-\itemindent
- \fi
- \sbox\z@{\hskip\labelindent#1\hskip\labelsep}%
- \ifdim\wd\z@>\leftmargin
- \hskip-\leftmargin
- \hskip-\labelsep
- \hskip\labelindent
- #1%
- \hskip\labelsep
- \else
- \hskip-\leftmargin
- \hskip-\labelsep
- \hskip\labelindent
- \rlap{#1}%
- \hskip\leftmargin
- \hskip\labelsep
- \hskip-\labelindent
- \fi}%
- \setbox\@labels\box\voidb@x
+% +=============================+
+% | (RE)DEFINING LISTS |
+% +=============================+
+%
+% Set keys/values
+% ===============
+% Remember \romannumeral0 expands to nothing.
+% #1 = list name, #2 = level, #3 = flag if star, #4 = keys/values
+
+\def\enit@saveset#1#2#3#4{%
+ \setcounter{enit@cnt}{#2}%
+ \ifcase#3%
+ \expandafter
+ \def\csname enit@@#1\romannumeral\c@enit@cnt\endcsname{#4}%
+ \or
+ \expandafter\let\expandafter\enit@b
+ \csname enit@@#1\romannumeral\c@enit@cnt\endcsname
+ \ifx\enit@b\relax
+ \let\enit@b\@empty
\fi
- \enit@break}}
-
-% Formatting lists globally. Note \romannumeral0 expands
-% to nothing.
-
-\newcommand\setenumerate[1][0]{%
- \expandafter\def\csname enit@@enum\romannumeral#1\endcsname}
-
-\newcommand\setitemize[1][0]{%
- \expandafter\def\csname enit@@item\romannumeral#1\endcsname}
-
-\newcommand\setdescription{\def\enit@@desc}
-
-% task: more robust test
-
-\newcommand\setlist[1][0]{%
- \def\enit@b{list}%
- \count@\z@\relax
- \@for\enit@a:=#1\do{%
- \@ifundefined{end\enit@a}%
- {\count@=\enit@a}%
- {\edef\enit@b{\enit@a}}}%
- \expandafter\def\csname enit@@\enit@b\romannumeral\count@\endcsname}
+ \expandafter\def
+ \csname enit@@#1\romannumeral\c@enit@cnt\expandafter\endcsname
+ \expandafter{\enit@b,#4}%
+ \fi}
-\newcommand\setdisplayed[1][0]{%
- \expandafter\def\csname enit@@triv\romannumeral#1\endcsname}
+% To do: more robust tests (catch wrong names, but not easy)
+
+% Internally, LaTeX uses a short name for enumerate (enum)
+% and itemize (item). To be consistent with this convention,
+% a couple of macros provide a "translation". I'm not very
+% happy with the current implementation.
+
+\def\enit@shortenumerate{enum}
+\def\enit@shortitemize{item}
+
+\newcommand\setlist[1][]{%
+ \@ifstar{\enit@setlist{#1}\@ne}{\enit@setlist{#1}\z@}}
+
+% #1 list names/levels, #2 keys/values
+
+\def\enit@setlist#1#2#3{%
+ \let\enit@eltnames\relax
+ \let\enit@b\@empty
+ \let\enit@eltlevels\relax
+ \let\enit@c\@empty
+ \protected@edef\enit@a{#1}%
+ \@for\enit@a:=\enit@a\do{% the 2nd enit@a is first expanded
+ \@ifundefined{enitdp@\enit@meaning\enit@a}%
+ {\edef\enit@c{\enit@c\enit@eltlevels{\enit@a}}}%
+ {\@ifundefined{enit@short\enit@meaning\enit@a}%
+ \@empty
+ {\edef\enit@a{\@nameuse{enit@short\enit@a}}}%
+ \edef\enit@b{\enit@b\enit@eltnames{\enit@a}}}}%
+ \ifx\enit@b\@empty
+ \def\enit@b{\enit@eltnames{list}}%
+ \fi
+ \ifx\enit@c\@empty
+ \def\enit@c{\enit@eltlevels{0}}%
+ \fi
+ \def\enit@eltnames##1{%
+ \def\enit@a{##1}%
+ \enit@c}%
+ \def\enit@eltlevels##1{%
+ \enit@saveset\enit@a{##1}#2{#3}}%
+ \enit@b}%
-% A few useful predefined keys
-
-\define@key{enumitem}{nolistsep}[true]{%
- \partopsep=\z@skip
- \topsep=\z@ plus .1pt
- \itemsep=\z@skip
- \parsep=\z@skip}
+% Deprecated:
-\define@key{enumitem}{noitemsep}[true]{%
- \itemsep=\z@skip
- \parsep=\z@skip}
+\newcommand\setdisplayed[1][0]{\setlist[trivlist,#1]}
+\let\enitdp@trivlist\@empty % dummy, let know it exists
+\newcommand\setenumerate[1][0]{\setlist[enumerate,#1]}
+\newcommand\setitemize[1][0]{\setlist[itemize,#1]}
+\newcommand\setdescription[1][0]{\setlist[description,#1]}
-\define@key{enumitem}{fullwidth}[true]{%
- \leftmargin\z@
- \labelwidth\z@
- \def\makelabel##1{%
- \hskip\labelsep\enit@format##1}}
+% New lists
+% =========
-% User defined enumerate and itemize
+% When defining a list, \label... and counters must be defined
+% for each level, too:
-\def\enit@xset@itemize#1#2{%
- \@namedef{label#1\romannumeral\count@}{%
+\def\enit@xset@itemize{%
+ \@namedef{label\enit@c\romannumeral\count@}{%
\PackageError{enumitem}{Undefined label}%
{You have defined a list, but labels have
- not been setup.\MessageBreak Use the label field.}}}
+ not been setup.\MessageBreak
+ You can set the label field with \string\setlist.}}}
+\@namedef{enit@xset@itemize*}{\enit@xset@itemize}
-\def\enit@xset@enumerate#1#2{%
- \enit@xset@itemize{#1}{#2}%
- \@definecounter{#1\romannumeral\count@}}
+\def\enit@xset@enumerate{%
+ \enit@xset@itemize
+ \@ifundefined{c@\enit@c\romannumeral\count@}%
+ {\@definecounter{\enit@c\romannumeral\count@}}{}}
+\@namedef{enit@xset@enumerate*}{\enit@xset@enumerate}
-\let\enit@xset@description\@gobbletwo
+\let\enit@xset@description\@empty
+\@namedef{enit@xset@description*}{\enit@xset@description}
+
+\newcommand\newlist{\enit@newlist\newenvironment}
+\newcommand\renewlist{\enit@newlist\renewenvironment}
% <new/renew>, <name>, <type>, <max-depth>
\def\enit@newlist#1#2#3#4{%
+ \@ifundefined{enit@xset@#3}%
+ {\PackageError{enumitem}{Unknown list type `#3')}%
+ {Valid types are:
+ enumerate, itemize, description,\messageBreak
+ enumerate*, itemize*, description*}}%
+ {}%
+ \setcounter{enit@cnt}{#4}%
\count@\@ne
+ \@ifundefined{enit@short#2}%
+ {\def\enit@c{#2}}%
+ {\edef\enit@c{\csname enit@short#2\endcsname}}%
\loop
- \@nameuse{enit@xset@#3}{#2}{#4}%
- \ifnum\count@<#4
+ \@nameuse{enit@xset@#3}% Uses \enit@c
+ \ifnum\count@<\c@enit@cnt
\advance\count@\@ne
\repeat
\@ifundefined{enitdp@#2}%
{\expandafter\newcount\csname enitdp@#2\endcsname}{}%
\csname enitdp@#2\endcsname\z@
- \count@#4
- \advance\count@\m@ne
+ \advance\c@enit@cnt\m@ne
\edef\enit@a{%
\noexpand#1{#2}[1][]%
- {\noexpand\enit@checkenv{#2}%
- \expandafter\noexpand\csname enit@#3\endcsname
- \expandafter\noexpand\csname enitdp@#2\endcsname
- {#2}%
- {\the\count@}%
+ {\enit@noexcs{enit@#3}%
+ \enit@noexcs{enitdp@#2}%
+ {\enit@c}%
+ {\the\c@enit@cnt}%
{####1}}%
- {\expandafter\noexpand\csname enit@end#3\endcsname}}%
+ {\enit@noexcs{enit@end#3}}}%
\enit@a}
+% Changing the default nesting limit
+% ----------------------------------
-\newcommand\newlist{\enit@newlist\newenvironment}
-\newcommand\renewlist{\enit@newlist\renewenvironment}
+\newcommand\setlistdepth{\def\enit@listdepth}
+\setlistdepth{5}
-\def\enit@checkenv#1{%
- \def\enit@a{#1}%
- \ifx\enit@a\@currenvir\else
- \PackageError{enumitem}{Bad nesting}%
- {You are using a non grouping form of a list
- environment.\MessageBreak
- Use \string\begin/\string\end.}%
- \fi}%
-
-% And options
+% +=============================+
+% | PACKAGE OPTIONS |
+% +=============================+
\newif\ifenit@loadonly
\DeclareOption{ignoredisplayed}{\let\enit@trivlist\trivlist}
\DeclareOption{loadonly}{\enit@loadonlytrue}
\DeclareOption{shortlabels}
- {\def\enit@shl@enum#1{%
- \def\enit@c{#1}%
- \enit@first#1,\@nil\@@nil}%
- \let\enit@shl@item\enit@shl@enum}
+ {\def\enit@shl#1{%
+ \ifnum\enit@type=\tw@
+ \enit@toks{#1}%
+ \else
+ \def\enit@c{#1}%
+ \enit@first#1,\@nil\@@nil % Returns enit@toks
+ \fi}}
+\DeclareOption{inline}
+ {\newenvironment{enumerate*}[1][]%
+ {\@nameuse{enit@enumerate*}\enitdp@enumerate{enum}\thr@@{#1}}
+ {\@nameuse{enit@endenumerate*}}
+ \newenvironment{itemize*}[1][]%
+ {\@nameuse{enit@itemize*}\enitdp@itemize{item}\thr@@{#1}}
+ {\@nameuse{enit@enditemize*}}
+ \newenvironment{description*}[1][]%
+ {\@nameuse{enit@description*}\enitdp@description{description}\@M{#1}}
+ {\@nameuse{enit@enddescription*}}}
+
+\let\enit@shl\enit@toks
\ProcessOptions
\let\trivlist\enit@trivlist
+% If there is no loadonly, redefine the basic lists:
+
\ifenit@loadonly\else
+\let\enitdp@enumerate\@enumdepth
\renewenvironment{enumerate}[1][]
- {\enit@enumerate\@enumdepth{enum}\thr@@{#1}}
+ {\enit@enumerate\enitdp@enumerate{enum}\thr@@{#1}}
{\enit@endenumerate}
+\let\enitdp@itemize\@itemdepth
\renewenvironment{itemize}[1][]
- {\enit@itemize\@itemdepth{item}\thr@@{#1}}
+ {\enit@itemize\enitdp@itemize{item}\thr@@{#1}}
{\enit@enditemize}
+\newcount\enitdp@description
\renewenvironment{description}[1][]
- {\enit@description\z@{desc}\@M{#1}}
+ {\enit@description\enitdp@description{description}\@M{#1}}
{\enit@enddescription}
\fi
-
\endinput