From 2b98282d58db23ce342019c8f3aacfa417eb61b1 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 10 May 2012 23:11:16 +0000 Subject: new generic package dowith (10may12) git-svn-id: svn://tug.org/texlive/trunk@26292 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/generic/dowith/dowith.sty | 192 ++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 Master/texmf-dist/tex/generic/dowith/dowith.sty (limited to 'Master/texmf-dist/tex') diff --git a/Master/texmf-dist/tex/generic/dowith/dowith.sty b/Master/texmf-dist/tex/generic/dowith/dowith.sty new file mode 100644 index 00000000000..89e34b74d3c --- /dev/null +++ b/Master/texmf-dist/tex/generic/dowith/dowith.sty @@ -0,0 +1,192 @@ +\def\filename{dowith} \def\fileinfo{simple list loop (UL)} +\def\filedate{2011/11/19} \def\fileversion{v0.2} +%% Copyright (C) 2011 Uwe Lueck, +%% http://www.contact-ednotes.sty.de.vu +%% -- author-maintained in the sense of LPPL below -- +%% +%% This file can be redistributed and/or modified under +%% the terms of the LaTeX Project Public License; either +%% version 1.3c of the License, or any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% We did our best to help you, but there is NO WARRANTY. +%% +%% Please report bugs, problems, and suggestions via +%% +%% http://www.contact-ednotes.sty.de.vu +%% +%% == Proceeding without \LaTeX == +%% A little \LaTeX\ as in Bernd Raichle's %% 2011/11/19 +%% \CtanPkgRef{ngerman}{ngerman.sty}: +\begingroup\expandafter\expandafter\expandafter\endgroup +%% I need `\ProvidesPackage' for \ctanpkgref{fileinfo}, +%% my package version tools. +\expandafter\ifx\csname ProvidesPackage\endcsname\relax +%% %% 2011/11/07: +%% When `\ProvidesPackage' is not defined, we provide +%% a version of \LaTeX's `\in@' +%% (an old version that may wrongly +%% claim to have found an occurrence of a sequence, +%% but is correct for single tokens) +%% for checking token list macros. +%% \LaTeX\ must not see `\ifin@' when it parses the +%% `\ifx' conditional: + \expandafter\newif\csname ifin@\endcsname + \def\in@#1#2{% + \def\in@@##1#1##2##3\in@@{% + \ifx\in@##2\in@false\else\in@true\fi}% + \in@@#2#1\in@\in@@} +%% 'readprov' stops reading the file at `\Provides'\texttt{...}, +%% therefore ... + \long\def\@gobble#1{} \expandafter\@gobble +\else + \expandafter\@firstofone +\fi +{ \ProvidesPackage{\filename}[\filedate\space + \fileversion\space \fileinfo] } +\chardef\atcode=\catcode`\@ +\catcode`\@=11 % \makeatletter +%% +%% == Applying a Command == %% 2011/11/07 +%% === Core === +%% |\DoWith{}\StopDoing| applies to all elements +%% of . An element of (after tokenizing) +%% may be either a single token or a group `{}'. +\def\DoWith#1#2{% + \ifx\StopDoing#2% + \else#1{#2}\expandafter\DoWith\expandafter#1\fi} +%% |\StopDoing| delimits the list: +\let\StopDoing\DoWith +%% ... something arbitrary that is not expected to occur in a list. +%% With \[`\let\StopDoing*'\] instead, the star would end lists. +%% +%% |\DoWithAllOf{}{}| works like +%% \[`\DoWith{}\StopDoing':\] +\def\DoWithAllOf#1#2{\DoWith#1#2\StopDoing} +%% +%% === `&\do' being the Command === +%% \label{sec:do} +%% When the is worked at a single time in the \TeX\ run +%% where assignments are possible, instead of introducing a new +%% macro name for you can use `\do' for as a +%% ``temporary" macro and define it right before +%% \[`\DoWith{\do}\StopDoing'\] +%% However, we provide \[|\DoDoWith{}\StopDoing|\] +%% as a substitute for the former line that at least saves one token. +%% For the definition of `\do', we provide +%% |\setdo{}|. +%% It works similarly to \[`\renewcommand{\do}[1]{}',\] +%% so should contain a `#1': +\def\setdo{\long\def\do##1} +%% With |\letdo| that is provided next where is defined +%% elsewhere, you could type +%% \[`\letdo\DoDoWith\StopDoing'\] +%% It seems to me, however, that you better type +%% \[`\dowith\StopDoing'\] instead. +%% So I provide `\letdo' although I consider it useless here. +%% It is provided somewhat for the sake of ``completeness," +%% thinking that it might be useful at other occasions such as +%% preceding `\dospecials'. +\def\letdo{\let\do} +%% |\DoDoWith| has been described above: +\def\DoDoWith{\DoWith\do} +%% By analogy to `\DoWithAllOf', we provide +%% |\DoDoWithAllOf{}|: +\def\DoDoWithAllOf{\DoWithAllOf\do} +%% +%% === Expand List Macro === +%% The former facilities may be quite useless +%% as such a will not be typed at a single place in the +%% source code, rather the items to run on may be collected +%% occasionally when some routines run. The elements may be collected +%% in a macro expanding to . +%% So we provide \[|\DoWithAllIn{}{}|\] +%% (or `\DoWithAllIn'). +%% There is no need to type `\StopDoing' here: +\def\DoWithAllIn#1#2{% + \expandafter\DoWith\expandafter#1#2\StopDoing} +%% |\DoDoWithAllIn{}| saves a backslash or token +%% for `\do' as above in Sec.~\ref{sec:do}: +\def\DoDoWithAllIn{\DoWithAllIn\do} +%% +%% +%% == Handling List Macros == +%% === Initializing === +%% Here is some advanced `\let\empty', perhaps a little +%% irrelevant for practical purposes. Both +%% \[|\InitializeListMacro{}|\] and +%% \[|\ReInitializeListMacro{}|\] attempt to ``empty" +%% , and when we don't believe that \LaTeX\ has been +%% loaded, both do the same indeed. Otherwise the first one +%% complains when seems to have been used earlier +%% while the second complains when seems \emph{not} to +%% have been used before: +\expandafter\ifx\csname @latex@error\endcsname\relax + \def\InitializeListMacro#1{\let#1\empty} %% not \@empty 2011/11/07 + \let\ReInitializeListMacro\InitializeListMacro +\else + \def\InitializeListMacro#1{\@ifdefinable#1{\let#1\empty}} + \def\ReInitializeListMacro#1{% + \edef\@tempa{\expandafter\@gobble\string#1}% + \expandafter\@ifundefined\expandafter{\@tempa}% + {\@latex@error{\noexpand#1undefined}\@ehc}% + {\let#1\empty}} +\fi +%% |\ToListMacroAdd{}{}| +%% appends to the replacement token list of . +%% may either be tokenized into a single token, +%% or it is some `{}'. +\def\ToListMacroAdd#1#2{\DefExpandStart#1{#1#2}} +\def\DefExpandStart#1{\expandafter\def\expandafter#1\expandafter} +%% +%% === Testing for Occurrence of a Token === +%% |\TestListMacroForToken{}{}| +%% sets `\in@true' when occurs in +%% and sets `\in@false' otherwise: %% 2011/11/07 +\def\TestListMacroForToken#1#2{% + \expandafter \in@ \expandafter #2\expandafter{#1}} +%% Indeed I removed an earlier `\IfTokenInListMacro', +%% now it's a kind of compromise between having a shorthand macro +%% below and a generalization for users of the package. +%% +%% === Adding and Removing === +%% |\FromTokenListMacroRemove{}{}| +%% removes the token corresponding to from the list +%% stored in +%% (our parsing method does not work with braces): %% 2011/11/07 +\def\FromTokenListMacroRemove#1#2{% +%% I am not happy about defining \emph{two} parser macros, +%% but for now ... + \TestListMacroForToken#1#2% + \ifin@ + \def\RemoveThisToken##1#2{##1}% + \expandafter \DefExpandStart + \expandafter #1\expandafter {% + \expandafter\RemoveThisToken #1}% +%% TODO warning otherwise? + \fi} +%% %% 2011/11/07: +%% ... but this only removes a single occurrence ... +%% \[|\InTokenListMacroProvide{}{}|\] +%% avoids multiple entries of a token +%% by \emph{not} adding anything when +%% already occurs in (again, this does not work with +%% braces, try `\in@{{}}{{}}'). +\def\InTokenListMacroProvide#1#2{% + \TestListMacroForToken#1#2% + \ifin@ \else %% TODO warning? + \ToListMacroAdd#1#2% + \fi} +%% +%% +%% == Leaving and History == +\catcode`\@=\atcode +\endinput + +VERSION HISTORY +v0.1 2011/06/23/28 stored separately +v0.2 2011/11/02 simpler, documented + 2011/11/03 corrected \if/\else for init + 2011/11/07 \TestListMacroForToken, \InListMacroProvide; + doc.: \pagebreak, structure + 2011/11/19 modified LaTeX supplements -- cgit v1.2.3