%% % \iffalse meta-comment % -------------------------------------------------------------- % Part of the TeXPower bundle % Copyright (C) 2003-2005 Hans Fredrik Nordhaug % % This program is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License % as published by the Free Software Foundation; either version 2 % of the License, or (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % -------------------------------------------------------------- % % tplists.dtx,v 1.6 2005/04/07 21:43:07 hansfn Exp % % \fi % % \iffalse % %<*driver> \ProvidesFile{tplists.dtx} % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{tplists} %<*tplists> [2005/04/07 v0.2 Easy Dynamic Lists using TeXPower] % % %<*driver> \documentclass{ltxdoc} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{tplists.dtx} \end{document} % % % \fi % % \CheckSum{634} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % \GetFileInfo{tplists.dtx} % % \DoNotIndex{\newcommand,\newenvironment} % % \title{The \textsf{tplists} package\thanks{This document % corresponds to \textsf{tplists}~\fileversion, dated \filedate.}} % \author{ Hans Fredrik Nordhaug \\ \texttt{hans@nordhaug.priv.no}} % % \maketitle % % \tableofcontents % % \section{Introduction} % % The package provides easy dynamic lists. The following % environments/lists are available % \begin{enumerate} % \item |stepenum|, |stepitem|, |stepdesc|, |stepeqlist|, |stepcompactenum| % |stepcompactitem| and |stepcompacteqlist|. % \item |flipenum|, |flipitem|, |flipdesc|, |flipeqlist|, |flipcompactenum|, % |flipcompactitem|, and |flipcompacteqlist| % \item |dimenum|, |dimitem|, |dimdesc|, |dimeqlist|, |dimcompactenum|, % |dimcompactitem|, and |dimcompacteqlist| % \end{enumerate} % where |step| is short for stepped, |flip| for flipped and |dim| for dimmed. % The packages |paralist| and |eqlist| must be loaded before this package to % use the *eqlist and *compact* lists. |enum|, |item| and |desc| is of course % short for |enumerate|, |itemize| and |description| respectively. % % \section{User interface} % % The package is loaded in the normal fashion, eg: |\usepackage{tplists}| The package % works better (the lists look better) if TeXPower uses colors. % % All lists (except *eqlist) takes an optional parameter adding to the indent % of the list. Note that dim* and flip* lists do not nest, and that step* lists % inside dim*/flip* will behave as a dim*/flip* list respectively. % (The normal |itemize|, |enumerate| and |description| lists are modified so they accept the % optional parameter and work nested with the new lists.) % % Example: % % \begin{verbatim} % \documentclass[a4paper]{article} % \usepackage[darkbackground,display]{texpower} % \usepackage{tplists} % \begin{document} % \begin{flipitem}[2cm] % \item Before % \begin{enumerate}[1cm] % \item An item % \item Another item % \end{enumerate} % \item After % \end{flipitem} % \end{document} % \end{verbatim} % % \section{Description of package options} % % The following options exist: % \begin{description} % \item[|pausestep|] makes step* lists use |\pause|% % \item[|noflipendstep|] avoids the extra step at the end of a flipped list. % \end{description} % % All options can be set anywhere in the document using a setup command, for example % |\tplsetup{pausestep,noflipendstep=false}|. If the keys in the setup command have no % value true is assumed. % % \section{Issues} % % The step* lists use |\vstep| (as default) which give weird results with % structured backgrounds. Using the pausestep option fixes this, but then you % can't nest step* lists inside dim* or flip* lists. There are also some % unresolved problems when using french babel. % % \StopEventually{\PrintChanges\PrintIndex} % % \section{Implementation} % % \changes{v0.1}{2003/10/03}{First public release.} % % \changes{v0.1a}{2003/10/04}{Removed redefinition of eqlist (since it didn't work).} % % \changes{v0.1b}{2003/10/07}{Corrected some typos in this documentation. % Added option pausestep and made dim* (and all variants of flip*) lists work without % colors by using boldface for active items.} % % \changes{v0.2}{2005/04/07}{Added flipdesc, stepdesc, dimdesc environments for % easy dynamic description lists. Improved behaviour when not in display mode. % Fixed step lists behaviour when in display mode, but without colors. Added % noflipendstep option and a setup command to enable setting of all options % anywhere in the document } % % \subsection{Loading of packages} % % \begin{macrocode} \RequirePackage{texpower} % \end{macrocode} % Compact enum/item. % \begin{macrocode} \newboolean{tpl@paralist} \@ifpackageloaded{paralist}{\setboolean{tpl@paralist}{true}}{} % \end{macrocode} % Lists with equal indentation. % \begin{macrocode} \newboolean{tpl@eqlist} \@ifpackageloaded{eqlist}{\setboolean{tpl@eqlist}{true}}{} % \end{macrocode} % % \subsection{Defining options} % % Use |\pause| for steplists (too avoid problems with structured backgrounds). % \begin{macrocode} \newboolean{tpl@pausestep} \DeclareOption{pausestep}{\setboolean{tpl@pausestep}{true}} % \end{macrocode} % Don't add an extra step at the end of a flipped list. % \begin{macrocode} \newboolean{tpl@noflipendstep} \DeclareOption{noflipendstep}{\setboolean{tpl@noflipendstep}{true}} \ProcessOptions % \end{macrocode} % Defining setup command to enable change of options anywhere in the document. % \begin{macrocode} \define@key{tpl}{pausestep}[true]{% \setboolean{tpl@pausestep}{#1} } \define@key{tpl}{noflipendstep}[true]{% \setboolean{tpl@noflipendstep}{#1} } \newcommand*{\tplsetup}{\setkeys{tpl}} % \end{macrocode} % % \subsection{Flipped/dimmed/stepped lists/environments} % % |\iftpl@instepenv| indicates if we are in some kind of stepped list % environment. |\iftpl@indimenv| / |\tpl@inflipenv| indicates that we are % using one of the stepwise environments from texpower (that doesn't % nest). |\iftpl@inpausestepenv| indicates that we are in a stepped % list that uses |\pause|. % % using |tpl@| as prefix for internals. % \begin{macrocode} \newif\iftpl@instepenv \tpl@instepenvfalse \newif\iftpl@inpausestepenv \tpl@inpausestepenvfalse \newif\iftpl@indimenv \tpl@indimenvfalse \newif\iftpl@inflipenv \tpl@inflipenvfalse \let\oldenumerate=\enumerate \let\olditemize=\itemize \let\olddescription=\description \let\endoldenumerate=\endenumerate \let\endolditemize=\enditemize \let\endolddescription=\enddescription \ifthenelse{\boolean{tpl@eqlist}}{% \let\oldeqlist=\eqlist \let\endoldeqlist=\endeqlist }{} \ifthenelse{\boolean{tpl@paralist}}{% \let\oldcompactenum=\compactenum \let\oldcompactitem=\compactitem \let\endoldcompactenum=\endcompactenum \let\endoldcompactitem=\endcompactitem }{} % \end{macrocode} % % Defining |\tpl@collect@body| - command used to scan the list % environments. Definition borrowed from 'amsmath.sty' - slightly % modified to allow for 'long' arguments % \begin{macrocode} \let\tpl@nx\noexpand \let\tpl@xp\expandafter \newtoks\tpl@emptytoks \newtoks\tpl@envbody \long\def\tpl@addto@envbody#1{\global\tpl@envbody\tpl@xp{\the\tpl@envbody#1}} \def\tpl@collect@body#1{% \tpl@envbody{\tpl@xp#1\tpl@xp{\the\tpl@envbody}}% \edef\tpl@process@envbody{\the\tpl@envbody\tpl@nx\end{\@currenvir}}% \tpl@envbody\tpl@emptytoks \def\begin@stack{b}% \begingroup \tpl@xp\let\csname\@currenvir\endcsname\tpl@collect@@body \edef\tpl@process@envbody{\tpl@xp\tpl@nx\csname\@currenvir\endcsname}% \tpl@process@envbody } \long\def\tpl@push@begins#1\begin#2{% \ifx\end#2\else b\tpl@xp\tpl@push@begins\fi } \long\def\tpl@collect@@body#1\end#2{% \edef\begin@stack{\tpl@push@begins#1\begin\end \tpl@xp\@gobble\begin@stack}% \ifx\@empty\begin@stack \endgroup \@checkend{#2}% \tpl@addto@envbody{#1}% \else \tpl@addto@envbody{#1\end{#2}}% \fi \tpl@process@envbody } % \end{macrocode} % % Defining command |\tpl@addmargin| used to add a length to % the leftmargin of the current level in a list. % \begin{macrocode} \def\tpl@addmargin#1{% \advance\@listdepth 1 \addtolength{\csname leftmargin\romannumeral\@listdepth\endcsname}{#1} \advance\@listdepth -1 } \ifthenelse{\boolean{display}}{% % % Defining a flipped step command if we are in display mode. % Note that |\tpl@flipstep| takes no argument. % \begin{macrocode} \ifthenelse{\boolean{TPcolor}}% Can we use colors? {% Yes. In this case highlighting is implemented by switching color. \def\tpl@flipstep{% \step{\ifthenelse{\boolean{firstactivation}}% {\color{textcolor}}% {\color{inactivecolor}}% }% }% } {% No. In this case highlighting is implemented by putting the item in boldface. \def\tpl@flipstep{% \step{\ifthenelse{\boolean{firstactivation}}{\bfseries}{\mdseries}} }% } % \end{macrocode} % % Defining a dimmed step command if we are in display mode. % Note that |\tpl@dimstep| takes no argument. % \begin{macrocode} \ifthenelse{\boolean{TPcolor}}% Can we use colors? {% Yes. In this case highlighting is implemented by using \dstep \def\tpl@dimstep{\dstep}% } {% No. In this case highlighting is implemented by putting the item in boldface. \def\tpl@dimstep{% \step{\bfseries}% \ifthenelse{\boolean{active}}{}{\mdseries}% }% } % \end{macrocode} % % Defining a (normal) step command if we are in display mode. % Note that |\tpl@step| takes no argument. % \begin{macrocode} \ifthenelse{\boolean{TPcolor}}% Can we use colors? {% Yes. In this case stepping is implemented by using \vstep \def\tpl@step{\vstep}% } {% No. In this case stepping is implemented using \pause \def\tpl@step{\pause}% } % \end{macrocode} % TeXPower not in display mode - no need for a dimmed/flipped/normal step command. % \begin{macrocode} }{% \boolean{display} is false \def\tpl@flipstep{\relax}% \def\tpl@dimstep{\relax}% \def\tpl@step{\relax}% } % \end{macrocode} % % Defining flipped stepped - itemize / description / enumerate / eqlist % compact itemize / compact enumerate / compact eqlist - environments. % \begin{macrocode} \newenvironment{flipitem}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@flipitem}% {\global\@ignoretrue} \newenvironment{flipdesc}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@flipdesc}% {\global\@ignoretrue} \newenvironment{flipenum}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@flipenum}% {\global\@ignoretrue} \ifthenelse{\boolean{tpl@eqlist}}{% \newenvironment{flipeqlist}[1][0cm]{% \tpl@collect@body\@flipeqlist}% {\global\@ignoretrue} \newenvironment{flipcompacteqlist}[1][0cm]{% \tpl@collect@body\@flipcompacteqlist}% {\global\@ignoretrue} }{} \ifthenelse{\boolean{tpl@paralist}}{% \newenvironment{flipcompactitem}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@flipcompactitem}% {\global\@ignoretrue} \newenvironment{flipcompactenum}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@flipcompactenum}% {\global\@ignoretrue} }{} \newcommand\@fliplist[2]{% \iftpl@indimenv \PackageError{tplists}{% dim* and flip* environments do NOT nest}{% Do not continue! Type 'q' to stop and fix the nested list. } \else\iftpl@instepenv \begin{#1} \let\hidestepcontents=\displaystepcontents \renewcommand{\item}{\tpl@flipstep\tpl@origitem}% #2 \end{#1}% \else \iftpl@inpausestepenv\let\liststepwise=\stepwise\fi \liststepwise[\let\hidestepcontents=\displaystepcontents]{% \begin{#1} \iftpl@inpausestepenv\else \iftpl@instepenv\else\let\tpl@origitem=\item\fi \fi \tpl@instepenvtrue \tpl@inflipenvtrue \renewcommand{\item}{\tpl@flipstep\tpl@origitem}% #2 \ifthenelse{\boolean{tpl@noflipendstep}}{}{\step{}}% \end{#1}} \fi\fi } \newcommand\@flipitem[1]{% \@fliplist{olditemize}{#1}} \newcommand\@flipdesc[1]{% \@fliplist{olddescription}{#1}} \newcommand\@flipenum[1]{% \@fliplist{oldenumerate}{#1}} \ifthenelse{\boolean{tpl@eqlist}}{% \newcommand\@flipeqlist[1]{% \@fliplist{oldeqlist}{#1}} \newcommand\@flipcompacteqlist[1]{% \@fliplist{compacteqlist}{#1}} }{} \ifthenelse{\boolean{tpl@paralist}}{% \newcommand\@flipcompactitem[1]{% \@fliplist{oldcompactitem}{#1}} \newcommand\@flipcompactenum[1]{% \@fliplist{oldcompactenum}{#1}} }{} % \end{macrocode} % % Defining dimmed stepped - itemize / description / enumerate / eqlist / % compact itemize / compact enumerate / compact eqlist - environments. % \begin{macrocode} \newenvironment{dimitem}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@dimitem}% {\global\@ignoretrue} \newenvironment{dimdesc}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@dimdesc}% {\global\@ignoretrue} \newenvironment{dimenum}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@dimenum}% {\global\@ignoretrue} \ifthenelse{\boolean{tpl@eqlist}}{% \newenvironment{dimeqlist}[1][0cm]{% \tpl@collect@body\@dimeqlist}% {\global\@ignoretrue} \newenvironment{dimcompacteqlist}[1][0cm]{% \tpl@collect@body\@dimcompacteqlist}% {\global\@ignoretrue} }{} \ifthenelse{\boolean{tpl@paralist}}{% \newenvironment{dimcompactitem}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@dimcompactitem}% {\global\@ignoretrue} \newenvironment{dimcompactenum}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@dimcompactenum}% {\global\@ignoretrue} }{} \newcommand\@dimlist[2]{% \iftpl@inflipenv \PackageError{tplists}{% dim* and flip* environments do NOT nest}{% Do not continue! Type to stop and fix the nested list. } \else\iftpl@instepenv \begin{#1} \renewcommand{\item}{\tpl@dimstep\tpl@origitem}% #2 \end{#1}% \else \iftpl@inpausestepenv\let\liststepwise=\stepwise\fi \liststepwise{% \begin{#1} \iftpl@inpausestepenv\else \iftpl@instepenv\else\let\tpl@origitem=\item\fi \fi \tpl@instepenvtrue \tpl@indimenvtrue \renewcommand{\item}{\tpl@dimstep\tpl@origitem}% #2 \end{#1}} \fi\fi } \newcommand\@dimitem[1]{% \@dimlist{olditemize}{#1}} \newcommand\@dimdesc[1]{% \@dimlist{olddescription}{#1}} \newcommand\@dimenum[1]{% \@dimlist{oldenumerate}{#1}} \ifthenelse{\boolean{tpl@eqlist}}{% \newcommand\@dimeqlist[1]{% \@dimlist{oldeqlist}{#1}} \newcommand\@dimcompacteqlist[1]{% \@dimlist{compacteqlist}{#1}} }{} \ifthenelse{\boolean{tpl@paralist}}{% \newcommand\@dimcompactitem[1]{% \@dimlist{oldcompactitem}{#1}} \newcommand\@dimcompactenum[1]{% \@dimlist{oldcompactenum}{#1}} }{} % \end{macrocode} % % Defining stepped - itemize / description / enumerate / eqlist / % compact itemize / compact enumerate / compact eqlist - environments. % \begin{macrocode} \newenvironment{stepitem}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@stepitem}% {\global\@ignoretrue} \newenvironment{stepdesc}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@stepdesc}% {\global\@ignoretrue} \newenvironment{stepenum}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@stepenum}% {\global\@ignoretrue} \ifthenelse{\boolean{tpl@eqlist}}{% \newenvironment{stepeqlist}[1][0cm]{% \tpl@collect@body\@stepeqlist}% {\global\@ignoretrue} \newenvironment{stepcompacteqlist}[1][0cm]{% \tpl@collect@body\@stepcompacteqlist}% {\global\@ignoretrue} }{} \ifthenelse{\boolean{tpl@paralist}}{% \newenvironment{stepcompactitem}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@stepcompactitem}% {\global\@ignoretrue} \newenvironment{stepcompactenum}[1][0cm]{% \tpl@addmargin{#1} \tpl@collect@body\@stepcompactenum}% {\global\@ignoretrue} }{} % \end{macrocode} % Using |\pause| for step* lists if |tpl@pausestep| is true % \begin{macrocode} \newcommand\@steplist[2]{% \ifthenelse{\boolean{tpl@pausestep}}{% \iftpl@inflipenv \PackageError{tplists}{% flip* followed by step* environment does NOT work \MessageBreak when the pausestep option is used}{% Do not continue! Type to stop and fix the nested list. } \else\iftpl@indimenv \PackageError{tplists}{% dim* followed by step* environment does NOT work \MessageBreak when the pausestep option is used}{% Do not continue! Type to stop and fix the nested list. } \else \begin{#1} \iftpl@inpausestepenv\else\let\tpl@origitem=\item\fi \tpl@inpausestepenvtrue \renewcommand{\item}{\pause\tpl@origitem}% #2 \end{#1} \fi\fi }{ % \end{macrocode} % Using |\liststepwise| for step* lists if |tpl@pausestep| is false % \begin{macrocode} \iftpl@inflipenv \begin{#1} \renewcommand{\item}{\tpl@flipstep\tpl@origitem} #2 \end{#1}% \else\iftpl@indimenv \begin{#1} \renewcommand{\item}{\dstep\tpl@origitem}% #2 \end{#1}% \else\iftpl@instepenv \begin{#1} \renewcommand{\item}{\tpl@step\tpl@origitem}% #2 \end{#1}% \else \liststepwise{% \begin{#1} \iftpl@instepenv\else\let\tpl@origitem=\item\fi \tpl@instepenvtrue \renewcommand{\item}{\tpl@step\tpl@origitem}% #2 \end{#1}} \fi\fi\fi } } \newcommand\@stepitem[1]{% \@steplist{olditemize}{#1}} \newcommand\@stepdesc[1]{% \@steplist{olddescription}{#1}} \newcommand\@stepenum[1]{% \@steplist{oldenumerate}{#1}} \ifthenelse{\boolean{tpl@eqlist}}{% \newcommand\@stepeqlist[1]{% \@steplist{oldeqlist}{#1}} \newcommand\@stepcompacteqlist[1]{% \@steplist{compacteqlist}{#1}} }{} \ifthenelse{\boolean{tpl@paralist}}{% \newcommand\@stepcompactitem[1]{% \@steplist{oldcompactitem}{#1}} \newcommand\@stepcompactenum[1]{% \@steplist{oldcompactenum}{#1}} }{} % \end{macrocode} % % Defining compact eqlist % \begin{macrocode} \newenvironment{compacteqlist}[1][0cm]{% % \tpl@addmargin{#1} \begin{eqlist}[\parsep0pt\itemsep0pt]}% {\end{eqlist}} % \end{macrocode} % % Redefining enumerate, itemize and description to handle changes made by % introducing steps and leftmargini-option. % \begin{macrocode} \renewenvironment{enumerate}[1][0cm]{% \tpl@addmargin{#1} \begin{oldenumerate} \iftpl@instepenv \renewcommand{\item}{\tpl@origitem}% \fi }% {\end{oldenumerate}} \renewenvironment{itemize}[1][0cm]{% \tpl@addmargin{#1} \begin{olditemize} \iftpl@instepenv \renewcommand{\item}{\tpl@origitem}% \fi }% {\end{olditemize}} \renewenvironment{description}[1][0cm]{% % \tpl@addmargin{#1} % Has no effect - FIXME \begin{olddescription} \iftpl@instepenv \renewcommand{\item}{\tpl@origitem}% \fi }% {\end{olddescription}} % \end{macrocode} % % Redefining compactenum and compactitem to handle changes made by % introducing steps and leftmargini-option. % \begin{macrocode} \ifthenelse{\boolean{tpl@paralist}}{% \renewenvironment{compactenum}[1][0cm]{% \tpl@addmargin{#1} \begin{oldcompactenum} \iftpl@instepenv \renewcommand{\item}{\tpl@origitem}% \fi }% {\end{oldcompactenum}} \renewenvironment{compactitem}[1][0cm]{% \tpl@addmargin{#1} \begin{oldcompactitem} \iftpl@instepenv \renewcommand{\item}{\tpl@origitem}% \fi }% {\end{oldcompactitem}} }{} % \end{macrocode} % \Finale \endinput