% +--------------------------------------------------+
% | Typeset enumitem.tex to get the documentation.   |
% +--------------------------------------------------+
%
% Copyright (c) 2003-2004 by Javier Bezos.
% All Rights Reserved.
%
% This file is part of the enumitem distribution release 1.0
% -----------------------------------------------------------
%
% This program can be redistributed and/or modified under the terms
% of the LaTeX Project Public License Distributed from CTAN
% archives in directory macros/latex/base/lppl.txt; either
% version 1 of the License, or any later version.
%
% Notes
% ~~~~~
%
% The tag enit@ is used through the style
%
% Release
% ~~~~~~~

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{enumitem}[2004/07/19 v1.0 Customized lists]

% Reponer \lableindent a 0 siempre

\@ifundefined{define@key}{\RequirePackage{keyval}}{}%

\newlength{\labelindent}

% Vertical spacing

\define@key{enumitem}{topsep}{%
  \setlength{\topsep}{#1}}

\define@key{enumitem}{itemsep}{%
  \setlength{\itemsep}{#1}}

\define@key{enumitem}{parsep}{%
  \setlength{\parsep}{#1}}

\define@key{enumitem}{partopsep}{%
  \setlength{\partopsep}{#1}}

% Horizontal spacing

\define@key{enumitem}{itemindent}{%
  \setlength{\itemindent}{#1}}

\define@key{enumitem}{listparindent}{%
  \setlength{\listparindent}{#1}}

\define@key{enumitem}{labelwidth}{%
  \setlength{\labelwidth}{#1}}

\define@key{enumitem}{labelindent}{%
  \setlength{\labelindent}{#1}}

\define@key{enumitem}{rightmargin}{%
  \setlength{\rightmargin}{#1}}

\define@key{enumitem}{leftmargin}{%
  \if*#1%
    \def\enit@calcleft{%
      \enit@calclabel
      \leftmargin\labelwidth
      \advance\leftmargin\labelsep
      \advance\leftmargin\labelindent
      \advance\labelindent-\itemindent}%
  \else
    \setlength{\leftmargin}{#1}%
  \fi}

\define@key{enumitem}{labelsep}{%
  \if*#1%
    \def\enit@calcleft{%
      \advance\labelindent-\itemindent
      \enit@calclabel
      \labelsep\leftmargin
      \advance\labelsep-\labelwidth
      \advance\labelsep-\labelindent}%
  \else
    \setlength{\labelsep}{#1}%
  \fi}

\define@key{enumitem}{widest}{%
  \expandafter\def
  \csname enit@widest\@enumctr\endcsname{#1}}

\def\enit@calclabel{%
  \begingroup
    \enit@calcdef\@arabic\enit@arabic{0}%
    \enit@calcdef\@alph\enit@alph{m}%
    \enit@calcdef\@Alph\enit@Alph{M}%
    \enit@calcdef\@roman\enit@roman{viii}%
    \enit@calcdef\@Roman\enit@Roman{VIII}%
    \settowidth\labelwidth{\@itemlabel}%
    \xdef\enit@a{\labelwidth\the\labelwidth\relax}%
  \endgroup
  \enit@a}

% Used below to gobble \c@ from the internal representation
% of counters.

\def\@gobblethree#1#2#3{}

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

% Resume and start

\define@key{enumitem}{resume}[]{%
  \enit@resume\relax}

\define@key{enumitem}{start}[\@ne]{%
  \csname c@\@listctr\endcsname#1\relax
  \advance\csname c@\@listctr\endcsname\m@ne}
  
% How the label is aligned
    
\let\enit@alignright\@empty
\def\enit@alignleft{%
  \def\makelabel##1{\rlap{##1}\hss}}

\define@key{enumitem}{align}{%
  \csname enit@align#1\endcsname}

% Penalties
  
\define@key{enumitem}{beginpenalty}{%
  \@beginparpenalty#1\relax}
  
\define@key{enumitem}{midpenalty}{%
  \@itempenalty#1\relax}

\define@key{enumitem}{endpenalty}{%
  \@endparpenalty#1\relax}
   

% description specific keys

\define@key{enumitem}{font}[]{%
  \def\makelabel##1{\hskip\labelsep\normalfont#1##1}}

\define@key{enumitem}{style}[normal]{%
  \edef\enit@descstyle{%
    \expandafter\noexpand\csname enit@#1style\endcsname}}

\let\enit@normalstyle\@firstofone

% Labels and refs

\define@key{enumitem}{label}{%
  \enit@normlabel{#1}% Returns \enit@a
  \expandafter\let\@itemlabel\enit@a
%ie, redefine \labelenumX or \labelitemX.
  \ifx\enit@ref\relax\enit@reflabel{#1}\fi}
%ie, only if there is not a previous ref=
% Normalization is done twice. Not good.
  
\define@key{enumitem}{ref}{%
  \enit@reflabel{#1}}

%\expandafter\def\csname c@*\endcsname{\csname c@\@enumctr\endcsname}

\def\enit@normlabel#1{%
  \begingroup
    \enit@refstar\arabic
    \enit@refstar\alph
    \enit@refstar\Alph
    \enit@refstar\roman
    \enit@refstar\Roman
    \enit@refstar\value
    \enit@refstar\@arabic
    \enit@refstar\@alph
    \enit@refstar\@Alph
    \enit@refstar\@roman
    \enit@refstar\@Roman
    \protected@xdef\enit@a{#1}%
  \endgroup}

\def\enit@reflabel#1{%
  \def\enit@ref{%
    \ifnum\@enumdepth=\@ne\else % no level 0
      \advance\@enumdepth\@ne
      \@namedef{p@\@enumctr}{}% Don't accumulate labels
      \advance\@enumdepth\m@ne
    \fi
    \enit@normlabel{#1}% Returns \enit@a
    \expandafter
    \let\csname the\@enumctr\endcsname\enit@a}}

\def\enit@refstar#1{%
  \def#1##1{%
    \if*##1\@empty
      \noexpand#1{enum\romannumeral\@enumdepth}%
    \else
      \noexpand#1{##1}%
    \fi}}

\def\enit@setkeys#1{%
  \@ifundefined{#1}{}%
    {\toks@\expandafter\expandafter\expandafter
       {\csname#1\endcsname}%
     \edef\enit@a{%
        \noexpand\setkeys{enumitem}{\the\toks@}}%
     \enit@a   
     \ifx\enit@ref\relax\else  % Not a logical place, grrr
       \let\enit@saveref\enit@ref
       \let\enit@ref\relax
     \fi}}

% And now, the three environments are redefined.
% First, code shared by enumerate and itemize.
     
\newdimen\enit@outerparindent
     
\def\enit@preset{%
   \def\makelabel##1{\hss\llap{##1}}%
   \let\enit@calcleft\relax
   \let\enit@widest\@empty
   \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@enumerate#1{%
  \ifnum \@enumdepth >\thr@@
    \@toodeep
  \else
    \advance\@enumdepth\@ne
    \edef\@enumctr{enum\romannumeral\@enumdepth}%
    \expandafter
    \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@enum}%
       \enit@setkeys
         {enit@\@enumctr}%
       \setkeys{enumitem}{#1}%
       \enit@calcleft
       \ifx\enit@ref\relax
         \enit@saveref
       \else
         \enit@ref
       \fi}%
  \fi}

\def\enit@endenumerate{%
  \endlist
  \xdef\enit@resume{%
    \csname c@\@listctr\endcsname
    \the\csname c@\@listctr\endcsname}}
    
\renewenvironment{enumerate}[1][]
  {\enit@enumerate{#1}}
  {\enit@endenumerate}
  
\def\enit@itemize#1{%
  \ifnum \@itemdepth >\thr@@
    \@toodeep
  \else
    \advance\@itemdepth\@ne
    \edef\@itemitem{labelitem\romannumeral\@itemdepth}%
    \expandafter
    \list
      \csname\@itemitem\endcsname
       {\enit@preset
        \enit@setkeys
         {enit@item}%
        \enit@setkeys
         {enit@item\romannumeral\@itemdepth}%
        \setkeys{enumitem}{#1}%
        \enit@calcleft}%
  \fi}
  
\let\enit@enditemize\itemize

\renewcommand{\itemize}[1][]{\enit@itemize{#1}}
  
\renewcommand{\description}[1][]{%
  \list{}%
    {\labelwidth\z@
     \let\makelabel\descriptionlabel
     \let\enit@descstyle\enit@normalstyle
     \labelindent\z@skip
     \enit@setkeys
       {enit@list}%
     \enit@setkeys
       {enit@list\romannumeral\@listdepth}%
     \enit@setkeys
       {enit@desc}%
     \setkeys{enumitem}{#1}%
     \itemindent-\leftmargin
     \advance\itemindent\labelindent
     \let\enit@makelabel\makelabel
     \def\makelabel##1{%
       \enit@descstyle{\enit@makelabel{##1}}}}}

% Option ignoredisplayed (see below).

\def\enit@trivlist{%
  \parsep\parskip
  \csname @list\romannumeral\the\@listdepth\endcsname
  \@nmbrlistfalse
  \enit@setkeys
    {enit@triv}%
  \enit@setkeys
    {enit@triv\romannumeral\@listdepth}%
  \@trivlist
  \labelwidth\z@
  \leftmargin\z@
  \itemindent\z@
  \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 whithout 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.

\def\enit@nextlinestyle#1{%
  \hskip-\itemindent % quick & dirty --what's happening?
  \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
         {\advance\leftskip-\leftmargin
          \advance\leftskip\labelindent
          \hskip-\labelsep
          #1%
          \vskip-\parskip}%
       \else
         \hskip-\leftmargin\hskip-\labelsep\hskip\labelindent
         \rlap{#1}%
         \hskip\leftmargin\hskip\labelsep\hskip-\labelindent
       \fi}%
    \fi
    \if@nobreak
      \@nobreakfalse
      \clubpenalty \@M
    \else
      \clubpenalty \@clubpenalty
      \everypar{}%
    \fi}}

\def\enit@multilinestyle#1{%
  \dimen@\leftmargin
  \advance\dimen@-\labelsep
  \advance\dimen@-\labelindent
  \sbox\z@{%
    \parbox[t]\dimen@{%
      \raggedright\hskip-\labelsep#1}}%
  \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}%
    \fi
    \if@nobreak
      \@nobreakfalse
      \clubpenalty \@M
    \else
      \clubpenalty \@clubpenalty
      \global\everypar{}%
    \fi}}

\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}%
    \fi
    \if@nobreak
      \@nobreakfalse
      \clubpenalty \@M
    \else
      \clubpenalty \@clubpenalty
      \everypar{}%
    \fi}}

% Formatting lists globally

\newcommand\setenumerate[1][0]{%
  \expandafter\def\csname enit@enum\romannumeral#1\endcsname}

\newcommand\setitemize[1][0]{%
  \expandafter\def\csname enit@item\romannumeral#1\endcsname}

\def\setdescription{\def\enit@desc}

\newcommand\setlist[1][0]{%
  \expandafter\def\csname enit@list\romannumeral#1\endcsname}

\newcommand\setdisplayed[1][0]{%
  \expandafter\def\csname enit@triv\romannumeral#1\endcsname}

% A few useful predefined keys
  
\define@key{enumitem}{nolistsep}[true]{%
  \partopsep=\z@skip
  \topsep=\z@ plus .1pt
  \itemsep=\z@skip
  \parsep=\z@skip}

\define@key{enumitem}{noitemsep}[true]{%
  \itemsep=\z@skip
  \parsep=\z@skip}

\define@key{enumitem}{fullwidth}[true]{%
  \leftmargin\z@
  \labelwidth\z@
  \def\makelabel##1{%
    \hskip\labelsep##1}}
    
% And options

\DeclareOption{ignoredisplayed}{\let\enit@trivlist\trivlist}

\ProcessOptions

\let\trivlist\enit@trivlist

\endinput
