% (c) 2001-2005 Javier Bezos \def\mem@protected#1#2#3{% \ifx\thepage\relax \string#2{#3}% \else\ifx\protect\@unexpandable@protect \noexpand#2{#3}% \else #1% \fi\fi} % \mem@foreach{list}{code}: % for each element in the comma separated list, % do code with ##1 being the current item. % Cannot be nested. \def\mem@foreach#1#2{% \def\mem@forcmd##1{#2}% \mem@fornext#1,\@nil} \def\mem@fornext#1,#2{% \mem@forcmd{#1}% \ifx#2\@nil \expandafter\@gobble \else \expandafter\mem@fornext \fi #2} % \mem@lastfor makes the following elements % in the list to be ignored. \def\mem@lastfor{\let\mem@forcmd\@gobble} % mem@eforeach is like mem@foreach but list % is expanded first. That means that a list % item cannot be a macro name as such % (except if unexpandable). mem@forcmd is used % as a temporary macro. \def\mem@eforeach#1{% \edef\mem@forcmd{#1}% \expandafter\mem@foreach\expandafter{\mem@forcmd}} \def\mem@error#1{\PackageError{mem}{#1}% {See mem documentation for explanation}} \def\mem@bug#1{\mem@error{Bug found (#1)}} % \mem@after\macro{code}: % Adds code at the end of macro, without expansion. \def\mem@after#1#2{% \toks@\expandafter{#1}% \@temptokena{#2}% \edef#1{\the\toks@\the\@temptokena}} % \mem@eafter\macro{code}: % As above, but expands code before adding it to \macro % (whose previous code is not expanded). \def\mem@eafter#1#2{% \toks@\expandafter{#1}% \edef#1{\the\toks@#2}} % \mem@lafter\macro\eltmacro{list} % Yet another variant. This time {list} is a comma % separated list which is converted first to % \eltmacro{elem}\eltmacro{elem}... Empty items are % ignored. \def\mem@lafter#1#2#3{% \def\mem@a{\noexpand#2}% \mem@eafter#1{\mem@lafterget#3,\@nil,}} \def\mem@lafterget#1,{% \ifx\@nil#1\@empty\else % if #1=\@nil, #1 can be {} \ifx\\#1\\\else\mem@a{#1}\fi % if #1={} \expandafter\mem@lafterget \fi} % Macros to show info for debugging \newcounter{memdebuglevel} \c@memdebuglevel\@ne \def\mem@debug#1#2{% \ifnum\c@memdebuglevel=\@ne \typeout{(Mem) #2}% \fi} % \mem@setcsvar\macro % If \macro is undefined, define it as empty \def\mem@setcsvar#1{% \@ifundefined{#1}% {\mem@ecs\let{#1}\@empty}% {}} % \mem@ecs\macro{name} % A convenient shorthand -- the same as \macro\name. \def\mem@ecs#1#2{% \expandafter#1% \csname#2\endcsname} %%% \mem@csuse %%% Like \csname\mem@use{prefix}{suffix}\endcsname %%% ny implemented \endinput %% %% End of file `mem-comm.sty'.