Remove more random +x properties
[latex2e.git] / trunk / required / tools / enumerate.dtx
blob172e3711f9b4dac5e19494ef1ced447faa252a9a
1 % \iffalse meta-comment
3 % Copyright 1993-2016
5 % The LaTeX3 Project and any individual authors listed elsewhere
6 % in this file.
8 % This file is part of the Standard LaTeX `Tools Bundle'.
9 % -------------------------------------------------------
11 % It may be distributed and/or modified under the
12 % conditions of the LaTeX Project Public License, either version 1.3c
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.3c or later is part of all distributions of LaTeX
17 % version 2005/12/01 or later.
19 % The list of all files belonging to the LaTeX `Tools Bundle' is
20 % given in the file `manifest.txt'.
22 % \fi
23 % \iffalse
24 %% File: enumerate.dtx Copyright  1993 1994 1999 David Carlisle
26 %<*dtx>
27           \ProvidesFile{enumerate.dtx}
28 %</dtx>
29 %<package>\NeedsTeXFormat{LaTeX2e}
30 %<package>\ProvidesPackage{enumerate}
31 %<driver> \ProvidesFile{enumerate.drv}
32 % \fi
33 %         \ProvidesFile{enumerate.dtx}
34           [2015/07/23 v3.00 enumerate extensions (DPC)]
36 % \iffalse
37 %<*driver>
38 \documentclass{ltxdoc}
39 \usepackage{enumerate}
40 \begin{document}
41 \DocInput{enumerate.dtx}
42 \end{document}
43 %</driver>
44 % \fi
46 % \GetFileInfo{enumerate.dtx}
47 % \title{The \textsf{enumerate} package\thanks{This file
48 %        has version number \fileversion, last
49 %        revised \filedate.}}
50 % \author{David Carlisle}
51 % \date{\filedate}
52 % \MaintainedByLaTeXTeam{tools}
53 % \maketitle
55 % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
58 % \changes{v1.00}{1990/00/00}{First version (since lost)}
59 % \changes{v2.00}{1991/07/25}{New Algorithm}
60 % \changes{v2.01}{1992/06/26}{Re-issue for the new doc and docstrip.}
61 % \changes{v2.02}{1994/01/31}{Update for LaTeX2e}
62 % \changes{v3.00}{1999/03/05}{Add extension hook for tools/2916}
63 % \changes{v3.00}{2015/07/23}{Documentation fixes tools/2916}
65 % \begin{abstract}
66 % This package gives the enumerate environment an optional argument
67 % which determines the style in which the counter is printed.
69 % An occurrence of one of the tokens |A a I i| or |1| produces the value
70 % of the counter printed with (respectively) |\Alph \alph \Roman \roman|
71 % or |\arabic|.
73 % These letters may be surrounded by any strings involving any other
74 % \TeX\ expressions, however the tokens |A a I i 1| must be inside a
75 % |{ }| group if they are not to be taken as special.
76 % \end{abstract}
78 % \section{Examples}
79 %\showboxdepth=10
80 % \showboxbreadth=10
81 % \[
82 % \parbox{2.2in}{\hbadness2000
83 % \begin{enumerate}[EX i.]
84 % \item one one one one one one one
85 %        one one one one one\label{LA}
86 % \item two
87 %     \begin{enumerate}[{example} a)]
88 %     \item one of two  one of two  one of two\label{LB}
89 %     \item two of two
90 %     \end{enumerate}
91 % \end{enumerate}
92 % \begin{enumerate}[{A}-1]
93 % \item one\label{LC}
94 % \item two
95 % \end{enumerate}}
96 % \hspace{20pt}
97 % \vcenter{\hsize=2.4in
98 % \begin{verbatim}
99 % \begin{enumerate}[EX i.]
100 % \item one one one one one one one
101 %        one one one one\label{LA}
102 % \item two
103 %     \begin{enumerate}[{example} a)]
104 %     \item one of two  one of two
105 %           one of two\label{LB}
106 %     \item two of two
107 %     \end{enumerate}
108 % \end{enumerate}
110 % \begin{enumerate}[{A}-1]
111 % \item one\label{LC}
112 % \item two
113 % \end{enumerate}
114 % \end{verbatim}
115 % }\]
117 % |\label| and |\ref| may be used as with the standard {\tt
118 % enumerate} environment. |\ref| only produces the counter value,
119 % not the whole label. |\ref| prints the value in the same style
120 % as |\item|, as determined by the presence of one of the tokens
121 % |A a I i 1| in the optional argument. In the above example
122 % |\ref{LA}|, |\ref{LB}| and |\ref{LC}| produce
123 % `\ref{LA}',  `\ref{LB}' and `\ref{LC}' respectively.
125 % \StopEventually{}
127 %\section{Macros}
129 %    \begin{macrocode}
130 %<*package>
131 %    \end{macrocode}
133 % \begin{macro}{\@enlab}
134 % Internal token register used to build up the label command from the
135 % optional argument.
136 %    \begin{macrocode}
137 \newtoks\@enLab
138 %    \end{macrocode}
139 % \end{macro}
141 % \begin{macro}{\@enQmark}
142 % This just expands to a `?'. |\ref| will produce this, if no counter
143 % is printed.
144 %    \begin{macrocode}
145 \def\@enQmark{?}
146 %    \end{macrocode}
147 % \end{macro}
149 % The next four macros build up the command that will print the item
150 % label. They each gobble one token or group from the optional argument,
151 % and add corresponding tokens to the register |\@enLab|. They each end
152 % with a call to |\@enloop|, which starts the processing of the next
153 % token.
154 % \begin{macro}{\@enLabel}
155 % Add the counter to the label. |#2| will be one of the `special'
156 % tokens |A a I i 1|, and is thrown away. |#1| will be a command
157 % like |\Roman|.
158 %    \begin{macrocode}
159 \def\@enLabel#1#2{%
160   \edef\@enThe{\noexpand#1{\@enumctr}}%
161   \@enLab\expandafter{\the\@enLab\csname the\@enumctr\endcsname}%
162   \@enloop}
163 %    \end{macrocode}
164 % \end{macro}
166 % \begin{macro}{\@enSpace}
167 % \begin{macro}{\@enSp@ce}
168 % Add a space to the label. The tricky bit is to gobble the space token,
169 % as you can not do this with a macro argument.
170 %    \begin{macrocode}
171 \def\@enSpace{\afterassignment\@enSp@ce\let\@tempa= }
172 \def\@enSp@ce{\@enLab\expandafter{\the\@enLab\space}\@enloop}
173 %    \end{macrocode}
174 % \end{macro}
175 % \end{macro}
177 % \begin{macro}{\@enGroup}
178 % Add a |{ }| group to the label.
179 %    \begin{macrocode}
180 \def\@enGroup#1{\@enLab\expandafter{\the\@enLab{#1}}\@enloop}
181 %    \end{macrocode}
182 % \end{macro}
184 % \begin{macro}{\@enOther}
185 % Add anything else to the label
186 %    \begin{macrocode}
187 \def\@enOther#1{\@enLab\expandafter{\the\@enLab#1}\@enloop}
188 %    \end{macrocode}
189 % \end{macro}
191 % \begin{macro}{\@enloop}
192 % \begin{macro}{\@enloop@}
193 % The body of the main loop.
194 % Eating tokens this way instead of using |\@tfor| lets you see
195 % spaces and {\bf all} braces. |\@tfor| would treat {\tt a} and
196 % |{a}| as  special, but not |{{a}}|.
197 %    \begin{macrocode}
198 \def\@enloop{\futurelet\@entemp\@enloop@}
199 %    \end{macrocode}
200 %    \begin{macrocode}
201 \def\@enloop@{%
202   \ifx A\@entemp         \def\@tempa{\@enLabel\Alph  }\else
203   \ifx a\@entemp         \def\@tempa{\@enLabel\alph  }\else
204   \ifx i\@entemp         \def\@tempa{\@enLabel\roman }\else
205   \ifx I\@entemp         \def\@tempa{\@enLabel\Roman }\else
206   \ifx 1\@entemp         \def\@tempa{\@enLabel\arabic}\else
207   \ifx \@sptoken\@entemp \let\@tempa\@enSpace         \else
208   \ifx \bgroup\@entemp   \let\@tempa\@enGroup         \else
209   \ifx \@enum@\@entemp   \let\@tempa\@gobble          \else
210                          \let\@tempa\@enOther
211 %    \end{macrocode}
212 %    Hook for possible extensions
213 %    \begin{macrocode}
214                          \@enhook
215 %    \end{macrocode}
217 %    \begin{macrocode}
218              \fi\fi\fi\fi\fi\fi\fi\fi
219 %    \end{macrocode}
220 % \end{macro}
221 % Process the current token, then look at the next.
222 %    \begin{macrocode}
223   \@tempa}
224 %    \end{macrocode}
225 % \end{macro}
227 % \begin{macro}{\@enhook}
228 % Hook for possible extensions.
229 % Some packages may want to extend the number of special characters
230 % that are associated with counter representations. This feature
231 % was requested to enable Russian alphabetic counting, but here
232 % I give an example of a footnote symbol counter, triggered by |*|.
234 % To enable a new counter type based on a letter, you just need
235 % to add a new |\ifx| clause by analogy with the code above.
236 % So for example to make |*| trigger footnote symbol counting.
237 % a package should do the following.
239 % Initialise the hook, in case the package is loaded before
240 % \textsf{enumerate}.
241 %\begin{verbatim}
242 % \providecommand\@enhook{}
243 %\end{verbatim}
245 % Add to the hook a new |\ifx| clause that associates |*| with the
246 % |\fnsymbol| counter command.
247 %\begin{verbatim}
248 % \g@addto@macro\@enhook{%
249 %   \ifx *\@entemp
250 %     \def\@tempa{\@enLabel\fnsymbol}%
251 %   \fi}
252 %\end{verbatim}
253 % This code sequence should work whether it is loaded before or after
254 % this enumerate package. Any number of new counter types may be added
255 % in this way.
257 % At this point we just need initialise the hook, taking care not
258 % to over write any definitions another package may already have added.
259 %    \begin{macrocode}
260 \providecommand\@enhook{}
261 %    \end{macrocode}
262 % \end{macro}
264 % \begin{macro}{\enumerate}
265 % The new {\tt enumerate} environment. This is the first half of the
266 % original enumerate environment. If there is an optional argument, call
267 % |\@@enum@| to define the label commands, otherwise call
268 % |\@enum@| which is the second half of the original definition.
269 %    \begin{macrocode}
270 \def\enumerate{%
271   \ifnum \@enumdepth >3 \@toodeep\else
272       \advance\@enumdepth \@ne
273       \edef\@enumctr{enum\romannumeral\the\@enumdepth}\fi
274   \@ifnextchar[{\@@enum@}{\@enum@}}
275 %    \end{macrocode}
276 % \end{macro}
278 % \begin{macro}{\@@enum@}
279 % Handle the optional argument..
280 %    \begin{macrocode}
281 \def\@@enum@[#1]{%
282 %    \end{macrocode}
283 % Initialise the loop which will break apart the optional argument.
284 % The command to print the label is built up in |\@enlab|.
285 % |\@enThe| will be used to define |\theenum|\,$n$.
286 %    \begin{macrocode}
287   \@enLab{}\let\@enThe\@enQmark
288 %    \end{macrocode}
289 % The |\@enum@| below is never expanded, it is used to detect the end
290 % of the token list.
291 %    \begin{macrocode}
292   \@enloop#1\@enum@
293 %    \end{macrocode}
294 % Issue a warning if we did not find one of the `special' tokens.
295 %    \begin{macrocode}
296   \ifx\@enThe\@enQmark\@warning{The counter will not be printed.%
297    ^^J\space\@spaces\@spaces\@spaces The label is: \the\@enLab}\fi
298 %    \end{macrocode}
299 % Define |\labelenum|$\,n$ and |\theenum|$\,n$.
300 %    \begin{macrocode}
301   \expandafter\edef\csname label\@enumctr\endcsname{\the\@enLab}%
302   \expandafter\let\csname the\@enumctr\endcsname\@enThe
303 %    \end{macrocode}
304 % Set the counter to 7 so that we get the width of `vii' if roman
305 % numbering is in force then set |\leftmargin|$\,n$. to the width of the
306 % label plus |\labelsep|.
307 %    \begin{macrocode}
308   \csname c@\@enumctr\endcsname7
309   \expandafter\settowidth
310             \csname leftmargin\romannumeral\@enumdepth\endcsname
311             {\the\@enLab\hspace{\labelsep}}%
312 %    \end{macrocode}
313 % Finally call |\@enum@| which is the second half of the original
314 % definition.
315 %    \begin{macrocode}
316   \@enum@}
317 %    \end{macrocode}
318 % \end{macro}
320 % \begin{macro}{\@enum@}
321 % All the list parameters have now been defined, so call |\list|. This
322 % is taken straight from the original definition of |\enumerate|.
323 %    \begin{macrocode}
324 \def\@enum@{\list{\csname label\@enumctr\endcsname}%
325            {\usecounter{\@enumctr}\def\makelabel##1{\hss\llap{##1}}}}
326 %    \end{macrocode}
327 % \end{macro}
329 %    \begin{macrocode}
330 %</package>
331 %    \end{macrocode}
333 % \Finale
335 \endinput