% \iffalse %% File: revnum.dtx, Copyright (C) 1996 Joern Wilms %% wilms@astro.uni-tuebingen.de % % This file contains the LaTeX-environment revnumerate and its % documentation. To obtain the style-file revnum.sty, do a % latex docstrip with infileext=dtx, outfileext=sty, no options, and % filename=revnum. To obtain the documentation do a % latex revnum.dtx % makeindex -s gglo.ist -o revnum.gls revnum.glo % latex revnum.dtx % TWO latex-runs are necessary to produce a correct output, if you do % not want the list of changes you can omit the makeindex-run. % %<*dtx> \ProvidesFile{revnum.dtx}[1997/05/10 v1.0 reverse enumerate, jw] % % \fi % % % \iffalse %<*driver> \documentclass{ltxdoc} \usepackage{doc} \usepackage{revnum} \RecordChanges \CodelineIndex \setlength{\parindent}{0pt} \begin{document} \DocInput{revnum.dtx} \PrintChanges \end{document} % % \fi % % \CheckSum{114} % \changes{v1.0}{10 May 1997}{First Release} % % \GlossaryPrologue{\section*{Changes}} % % \MakeShortVerb{\|} % % \GetFileInfo{revnum.dtx} % % \title{\texttt{revnumerate} --- a reverse % \texttt{enumerate}-environment\thanks{This file has version number % \fileversion, last revised \filedate.}} % \author{J\"orn Wilms\thanks{Universit\"at T\"ubingen, Institut f\"ur % Astronomie und Astrophysik, Abt.\ Astronomie, Wald\-h\"auser Str.~64, % D-72076 T\"ubingen, Germany, \textsf{email:} % \texttt{wilms@astro.uni-tuebingen.de}}} % \maketitle % % \section{Introduction} % While writing on a style-file for the list of references section of my CV % I realized that there is no environment in \LaTeX\ that enumerates items % in reverse order. In my case I needed such an environment to present my % list of publications in descending temporal order, while keeping them % numbered in ascending temporal order. In other words, the first publication % should be labeled with ``1.'' while still being the last in the list, since % the most recent publications should be presented first. % % While this % problem is easily stated at first, a solution of it was more % difficult: Since the number of items in the list is not known at the % beginning, they need to be counted first, then the number of items % in the environment needs to be written in \LaTeX{}s |aux|-File, to % be used in the next \LaTeX-run. In addition, the environment should % fit smoothly into the already existing environments of \LaTeX\ and % the interface should just behave like the normal % |enumerate|-environment, so that style-changes to % |enumi|\ldots|enumvi| would also affect the |revnumerate| % environment. % % My solution to the problem is documented below, if you have % comments, if you have found bugs, or if you have extensions to the % environment, send me email at |wilms@astro.uni-tuebingen.de|. % % \section{The User-Interface} % \DescribeEnv{revnumerate} % The user-interface to the |revnumerate|-environment is very % simple. For example, % \begin{verbatim} % \begin{revnumerate} % \item Point three is the most important, % \item Point two is not as nice, % \item and Point one is uninteresting. % \end{revnumerate} % \end{verbatim} % and running \LaTeX\ twice gives % \begin{quote} % \begin{revnumerate} % \item Point three is the most important, % \item Point two is not as nice, % \item and Point one is uninteresting. % \end{revnumerate} % \end{quote} % The |revnumerate|-environment has an optional argument that gives % the starting number: % \begin{verbatim} % \begin{revnumerate}[10] % \item One % \item Two % \item Three % \item Four % \end{revnumerate} % \end{verbatim} % results in % \begin{quote} % \begin{revnumerate}[10] % \item One % \item Two % \item Three % \item Four % \end{revnumerate} % \end{quote} % It is possible to nest the environment with the other % \LaTeX-environments without any problems, as well as using the % normal redefinition of |\theenumi| to |\theenumiv| to get a different % behaviour of the output: % \begin{verbatim} % \renewcommand{\labelenumi}{\S\theenumi.} % \renewcommand{\theenumii}{\roman{enumii}} % \begin{enumerate} % \item This is point one % \item This section has two subpoints: % \begin{revnumerate} % \item Subpoint two\label{pt22} % \item Subpoint one % \end{revnumerate} % \item and Point three. % \end{enumerate} % Where point~\ref{pt22}\ldots % \end{verbatim} % The above text gives % \begin{quote} % \renewcommand{\labelenumi}{\S\theenumi.} % \renewcommand{\theenumii}{\roman{enumii}} % \begin{enumerate} % \item This is point one % \item This section has two subpoints: % \begin{revnumerate} % \item Subpoint two\label{pt22} % \item Subpoint one % \end{revnumerate} % \item and Point three. % \end{enumerate} % Where point~\ref{pt22}\ldots % \end{quote} % Pretty nice, isn't it? % % \StopEventually % % \section{The Code} % First we identify the style-file. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{revnum}[1997/05/10 v1.0 reverse enumerate, jw] % \end{macrocode} % Next, we need to create four new counters, |rev@cnti| to % |rev@cntiv|. These counters are used in the environment to count % the number of |revnumerate|-environments present at each possible % level. Since we need to keep track on how many % entries each environment contains, we need a way to create % counters such that they uniquely define each environment. The % solution to this is to use an ``index'', provided by |rev@cnti| % to |rev@cntiv| that gets appended to the counter for each % environment. If that confuses you, see below. % \begin{macrocode} \newcounter{rev@cnti} \def\therev@cnti{i\arabic{rev@cnti}} \newcounter{rev@cntii} \def\therev@cntii{ii\arabic{rev@cntii}} \newcounter{rev@cntiii} \def\therev@cntiii{iii\arabic{rev@cntiii}} \newcounter{rev@cntiv} \def\therev@cntiv{vi\arabic{rev@cntiv}} % \end{macrocode} % %% \begin{environment}{revnumerate} % Now let's start with the |revnumerate|-environment. We have one % option, the start number. If it is not given we initialize the % start-number to $-1$, to indicate to the code that we want to use % the value from the |.aux|-file. % \begin{macrocode} \newenvironment{revnumerate}[1][-1]% {% % \end{macrocode} % As in the case of generic \LaTeX-environments, only four nestings % are possible. The current depth is given by the counter |\@enumdepth|, % and if it is larger than three we need to output an error-message. If % not, we increase the nesting-depth by one. % \begin{macrocode} \ifnum\@enumdepth >\thr@@\@toodeep\else \advance\@enumdepth\@ne % \end{macrocode} % As the generic environments, we use one of the counters |enumi| % to |enumiv| as the counter for our environment. This way, all % changes made to the counters |\theenumi|\ldots|\theenumiv| will % also affect the |revnumerate| environment. % \begin{macrocode} \edef\@enumctr{enum\romannumeral\the\@enumdepth} % \end{macrocode} % To count uniquely identify the current |revnumerate|-environment, % we use one of the counters |rev@cnti| to |rev@cntiv|. We first % define, which counter to use, call it |\@revcnt| and then % increase it by one to get the number of the current environment. % \begin{macrocode} \edef\@revcnt{rev@cnt\romannumeral\the\@enumdepth} \stepcounter{\@revcnt} % \end{macrocode} % The number of items in the current list will be counted with a % counter called something like |revi1|, |revii1|, |revii2|, % etc. The name of this counter is created by appending the value % of |rev@cnti| to |rev@cntiv| to the string |rev|. % \begin{macrocode} \edef\the@revcnt{rev\csname the\@revcnt\endcsname} % \end{macrocode} % If the current counter is {\em not} known yet, i.e.\ if the % counter has not been defined in the |.aux|-file, then we need to % define it with |\newcounter| and initialize it. Just using % |\newcounter| is not enough, since that will initialize the % counter to 0. Since the |revnumerate|-environment counts the % counter backwards, this would give negative counter-values, which % would result in bogus error-messages if the counter is output, % e.g. in alphabetical manner. We therefore initialize it to 26, % which should give positive numbers for all % |revnumerate|-environments where alphabetical output is desired. % The strange |\ifx|\ldots|\relax| sequence is an % |\if@undefined|. I don't know why I didn't use |\if@undefined| % directly\ldots % \begin{macrocode} \expandafter\ifx\csname c@\the@revcnt\endcsname\relax% \newcounter{\the@revcnt} \setcounter{\the@revcnt}{26} \fi % \end{macrocode} % In the next step we need to initialize |\@enumctr|, which will % produce the labels to be output, to its starting value. This % value is either the value given by the counter |\the@revcnt|, or % it is the argument of the environment. In the default-case, when % the argument did not have an argument, |#1| gets set to $-1$. % \begin{macrocode} \ifnum #1 <0 \setcounter{\@enumctr}{\value{\the@revcnt}} \else \setcounter{\@enumctr}{#1} \fi % \end{macrocode} % Since we need to add $-1$ to |\@enumctr| before we output the % label. Only in this case the |\label|-command will work % correctly. I don't know why, but at least the current implementation % works. In addition we need to reset the |\the@revcnt|-counter % back to zero to count the number of items in the current % environment. % \begin{macrocode} \stepcounter{\@enumctr}% \setcounter{\the@revcnt}{0}% % \end{macrocode} % The |revnumerate|-environment is defined via the % |list|-environment, thus making it easily changeable. For outputting % the label we first reduce the environment-counter |\@enumctr| by one % and then add one to |\the@revcnt|. Then the % ``variable'' |\@currentlabel|, which % contains the way the current position in the text will be referenced % with |\ref| gets set to something like |\p@enumi \the@enumi|. The % commands |\p@enumi| to |\p@enumiv| are usually defined in the class % and are used to make labels more meaningful. For example, a % reference to subpoint ``b'' of item number 3 will result in a % ``3b'', and not just ``b''. Finally, the label is output using one % of the commands |\labelenumi| to |\labelenumiv|. % \begin{macrocode} \begin{list}% {\addtocounter{\@enumctr}{-1}% \stepcounter{\the@revcnt}% \global\edef\@currentlabel {\csname p@\@enumctr\endcsname\csname the\@enumctr\endcsname}% \csname label\@enumctr\endcsname% }{}% \fi }{% % \end{macrocode} % At the end of the environment, we need to write the number of % items in the current environment to the |aux|-file. Since the % |aux|-file is read twice during the processing of a \LaTeX-file, % once at the beginning and once at the end of the document, it is % not sufficient to just output a |\newcounter| and a % |\setcounter|. Instead, we have to output the % |\if@undefined|-sequence to only do a |\newcounter| if necessary % (i.e. during the first read on the |aux|-file). % What I have not figured out yet is how to warn the user that the % file needs to be processed twice. This could be done using a % label, but that seems unelegant. So far, we'll just hope that % everybody is \TeX{}ing the file at least twice\ldots % \begin{macrocode} \end{list} \protected@write\@auxout{}{% \string\expandafter% \string\ifx\string\csname\space c@\the@revcnt\string\endcsname\relax% \string\newcounter {\the@revcnt}\string\fi } \protected@write\@auxout{}{% \string\setcounter {\the@revcnt}% {\number\csname c@\the@revcnt\endcsname} } } % \end{macrocode} %% \end{environment} % % \Finale \endinput