From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 macros/generic/dowith/dowith.sty | 204 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 204 insertions(+)
 create mode 100644 macros/generic/dowith/dowith.sty

(limited to 'macros/generic/dowith/dowith.sty')

diff --git a/macros/generic/dowith/dowith.sty b/macros/generic/dowith/dowith.sty
new file mode 100644
index 0000000000..a4625aade3
--- /dev/null
+++ b/macros/generic/dowith/dowith.sty
@@ -0,0 +1,204 @@
+\def\filename{dowith}     \def\fileinfo{simple list loop (UL)}
+\def\filedate{2012/11/05} \def\fileversion{v0.3}
+%%
+%% Copyright (C) 2011 2012 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 ==
+%% v0.3 mainly replaces imitating the 
+%% \CtanPkgRef{german}{german.sty} approach to genericity 
+%% by \ctanpkgref{plainpkg}:
+\input plainpkg
+\ProvidesPackage{\filename}[\filedate\space 
+                 \fileversion\space \fileinfo]
+\PushCatMakeLetterAt
+%% If \LaTeX\ is not present ... 
+\ifltx \else
+%% ... an old version of its `\in@' is introduced. 
+%% It is bad as a subword test 
+%% (false positive cases, cf. \CtanPkgRef{nicetext}{fifinddo} 
+%%  documentation), but 'dowith' will check for single tokens only. 
+%% If \LaTeX\ \emph{is} present, 
+%% on the other hand, `\ifin@' is recognized while skipping 
+%% `false' parts of conditionals, without being matched 
+%% by some `\fi' before the next `\else', so I hide it by `\csname':
+  \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@@}
+\fi
+%% 
+%% == Applying a Command ==                             %% 2011/11/07
+%% \label{sec:apply}
+%% === Core ===
+%% \label{sec:core}
+%% |\DoWith{<cmd>}<list>\StopDoing| applies <cmd> to all elements 
+%% of <list>. An element of <list> (after tokenizing) 
+%% may be either a single token or a group `{<balanced>}'.
+\def\DoWith#1#2{%
+    \ifx\StopDoing#2\empty
+%% The previous `\empty' (replacing `%') is a bug fix as of v0.22 
+%% (June 2012),                                             %% 2012/11/05
+%% while in my extension draft I already had it in January 2012. 
+%% It allows ``empty" arglist items \qtd{\lbtok\rbtok}. 
+%% Before v0.22, such an empty brace group would have resulted 
+%% in comparing `\StopDoing' with `\else', so \qtd{\lbtok\rbtok}
+%% would have had the same effect as `\StopDoing', the token text 
+%% after `\else' until `\fi' would have been skipped. 
+%% Instead, the user may have a reason to allow empty arguments\slash
+%% brace groups.
+        \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{<cmd>}{<list>}| works like 
+%% \[`\DoWith{<cmd>}<list>\StopDoing':\]
+\def\DoWithAllOf#1#2{\DoWith#1#2\StopDoing}
+%% 
+%% === `&\do' being the Command ===
+%% \label{sec:do}
+%% When the <list> is worked at a single time in the \TeX\ run 
+%% where assignments are possible, instead of introducing a new 
+%% macro name for <cmd> you can use `\do' for <cmd> as a 
+%% ``temporary" macro and define it right before 
+%% \[`\DoWith{\do}<list>\StopDoing'\] 
+%% However, we provide \[|\DoDoWith{<cmd>}<list>\StopDoing|\] 
+%% as a substitute for the former line that at least saves one token. 
+%% For the definition of `\do', we provide
+%% |\setdo{<def-text>}|.
+%% It works similarly to \[`\renewcommand{\do}[1]{<def-text>}',\] 
+%% so <def-text> should contain a `#1': 
+\def\setdo{\long\def\do##1}
+%% With |\letdo<cmd>| that is provided next where <cmd> is defined 
+%% elsewhere, you could type 
+%% \[`\letdo<cmd>\DoDoWith<list>\StopDoing'\]
+%% It seems to me, however, that you better type 
+%% \[`\dowith<cmd><list>\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{<list>}|:
+\def\DoDoWithAllOf{\DoWithAllOf\do}
+%%
+%% === Expand List Macro ===
+%% The former facilities may be quite useless
+%% as such a <list> will not be typed at a single place in the 
+%% source code, rather the items to run <cmd> on may be collected 
+%% occasionally when some routines run. The elements may be collected 
+%% in a macro <list-macro> expanding to <list>. 
+%% So we provide \[|\DoWithAllIn{<cmd>}{<list-macro>}|\]
+%% (or `\DoWithAllIn<cmd><list-macro>').
+%% There is no need to type `\StopDoing' here:
+\def\DoWithAllIn#1#2{%
+    \expandafter\DoWith\expandafter#1#2\StopDoing}
+%% |\DoDoWithAllIn{<list-macro>}| 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<cmd>\empty', perhaps a little 
+%% irrelevant for practical purposes. Both
+%% \[|\InitializeListMacro{<list-macro>}|\] and 
+%% \[|\ReInitializeListMacro{<list-macro>}|\] attempt to ``empty" 
+%% <list-macro>, and when we don't believe that \LaTeX\ has been 
+%% loaded, both do the same indeed. Otherwise the first one 
+%% complains when <list-macro> seems to have been used earlier 
+%% while the second complains when <list-macro> seems \emph{not} to 
+%% have been used before:
+\ifltx                                                  %% v0.3
+  \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}}
+\else
+  \def\InitializeListMacro#1{\let#1\empty} %% not \@empty 2011/11/07
+  \let\ReInitializeListMacro\InitializeListMacro
+\fi
+%% |\ToListMacroAdd{<list-macro>}{<cmd-or>}|
+%% appends <cmd-or> to the replacement token list of <list-macro>. 
+%% <cmd-or> may either be tokenized into a single token,
+%% or it is some `{<balanced>}'.
+\def\ToListMacroAdd#1#2{\DefExpandStart#1{#1#2}}
+\def\DefExpandStart#1{\expandafter\def\expandafter#1\expandafter}
+%% 
+%% === Testing for Occurrence of a Token ===
+%% |\TestListMacroForToken{<list-macro>}{<cmd>}|
+%% sets `\in@true' when <cmd> occurs in <list-macro> 
+%% 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{<list-macro>}{<cmd>}| 
+%% removes the token corresponding to <cmd> from the list 
+%% stored in <list-macro> 
+%% (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{<list-macro>}{<cmd>}|\]
+%% avoids multiple entries of a token 
+%% by \emph{not} adding anything when <cmd>
+%% already occurs in <list-macro> (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 ==
+\PopLetterCatAt                                         %% v0.3
+\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
+v0.21   2012/05/14     fix for "generic" and `typeoutfileinfo': 
+                       @ before ...!
+v0.21a  2012/05/19     \labels sec:apply, sec:core; \pagebreak?
+v0.22   2012/06/04     allow {} items
+v0.3    2012/11/05     updating copyright, using `plainpkg', 
+                       rewording documentation there
-- 
cgit v1.2.3

