% fenixtok.sty Version 0.92, 18th November, 2011
%
% (c) Javier A. M\'ugica, 2007 2011
% License: LPPL version 1.3
% 
% LPPL maintenance status: maintained
% Current Maintainer: Javier A. M\'ugica
%
%	For bug reports and comments:
%
%	Javier M\'ugica,   javier at digi21.net
%
% Description:
%
% This file provides a few user macros to add material to a token register (typically \everypar)
% to be automatically removed when the token list is executed or later on request,
% without interfering with existing material in that register.
% Supose for example that you want the code \hbox to0pt{\kern-20pt$\ast$\hss} to be
% executed by the next \everypar. Then you would type
% \fornexttokl{everypar}{\hbox to0pt{\kern-20pt$\ast$\hss}}.
%	\fornexttokl adds the material as a stack: last added, first executed.
%	If you want to add material to be executed after whatever may be on the register,
% use \fornexttokr instead.
% If you need \fornexttok often (or even twice) you may _define_ that type of everypar:
%
%	\NewTypeoftok{everypar}{asterisk}{\hbox to0pt{\kern-20pt$\ast$\hss}}
%
% And later you would type \NexteveryparL{asterisk} (or \NexteveryparR).
% If you want several consecutive paragraphs to be signaled with the asterisk
% you may enclose them between \AlleveryparsL{asterisk} (or ...R) and \Endeverypars{asterisk}.
%
% For any token register 'mytok' you can use \nextmytokl (...r) as an abreviation for
% \fornexttokl{mytok} (...r), but it will fail if you have not yet used \NewTypeoftok{mytok}
% or \fornexttok{mytok}.
%
% The commands \All... and \End..., can be mixed in any order; in particular, they don't need
% to be nested. They may also be mixed in any way with respect to \Next.. or \fornext...
%
\chardef\atcatcode=\catcode`\@
\catcode`\@=11\relax
\def\exp@noex{\expandafter\noexpand}
\def\noexp@name#1{\exp@noex\csname#1\endcsname}
\def\tok@newtoks{\csname newtoks\endcsname}%	\newtoks not allowed in definitios
\def\@namedef#1{\expandafter\def\csname#1\endcsname}%	This is LaTeX definition
\long\def\@gobbletwo#1#2{}%	So is this one.
%Almost everything is done by this macro. See the example below.
\def\NewTypeoftok#1#2#3{%
	\toktype@Registerifnotyet{#1}%
	\expandafter\tok@newtoks\csname #1/#2\endcsname
	\csname #1/#2\endcsname{#3}%
	\@namedef{next@#1/#2}{%
		\edef\tok@type{\csname #1\endcsname}%	We need it very often
		\edef\if@nextrequired{\noexp@name{if@next#1@required}}%Idem
		\def\make@ifnextrequired@false{\let\exp@noex\if@nextrequired\noexpand\iffalse}%
		\edef\tempa{\csname previous@#1@\endcsname\tok@type}\tempa
		\if@nextrequired\else
			\edef\tempa{\csname former@#1@\endcsname\tok@type}\tempa
		\fi
		\edef\tempa{\tok@type{\if\foo L\expandafter\the\csname #1/#2\endcsname\fi
			\if@nextrequired\else\tok@type\csname former@#1@\endcsname\fi\make@ifnextrequired@false%	the \fi should be after \make@..., but if another macro (@startsection, for instance) changes everypar before it is executed, or builds the paragraph inside a group and later outside the group changes it, we would never recover.
			\expandafter\the\csname previous@#1@\endcsname
			\if\foo R\expandafter\the\csname #1/#2\endcsname\fi}}%
		\tempa
		\expandafter\let\if@nextrequired\iftrue
	}%
	\expandafter\edef\csname the@#1/#2\endcsname{\expandafter\the\csname #1/#2\endcsname}%
	\@namedef{every@#1/#2}{%
	  \def\tempb####1{\edef\tempa{\csname####1\endcsname{\if\foo L\noexp@name{the@#1/#2}\fi\expandafter\the\csname####1\endcsname\if\foo R\noexp@name{the@#1/#2}\fi}}}%
		\tempb{#1}\tempa
		%Also add it to the saved \former... if necesary:
		\csname if@next#1@required\endcsname
			\tempb{former@#1@}\tempa
		\fi
	}%
	\@namedef{end@#1/#2}{%
		\edef\tempa{\noexpand\see@if@present\noexp@name{#1}\noexp@name{the@#1/#2}}\tempa
		\if@tok@present
		\def\tempb####1{\edef\tempa{\csname ####1\endcsname\noexpand\expandafter\noexp@name{strip@#1/#2}\noexpand\the\csname####1\endcsname}%
			\expandafter\expandafter\tempa\mark@end@fenixtok}%
		\tempb{#1}%
		%Remove it from \former... if necesary:
		\iftrue
		\csname if@next#1@required\endcsname
			\tempb{former@#1@}%
		\fi
		\csname fi\endcsname
		\else
		\newlinechar=`^^J%
		\edef\tempa{\noexpand\errhelp{Probably another macro redefined \noexp@name{#1} behind the scenes.^^J%
			Simply proceed and remember to check if the effect of {#2}^^J%
			is missing from some prior point up to here.}}%
		\tempa
		\errmessage{The material of {#2} has already been removed from \noexp@name{#1}.^^J%
		I will ignore End#1s{#2}}%
		\errhelp{}%
		\fi
	}%
	\edef\tempa{\noexp@name{strip@#1/#2}####1\noexp@name{the@#1/#2}}%
	\expandafter\def\tempa##2\mark@end@fenixtok{{##1##2}}%
}

%This one must receive the \xxx already built, for if not the definition would be (more) cumbersome.
\def\see@if@present#1#2{%
	\def\save@first@part ##1#2##2\mark@end@fenixtok{\toks0{##1}}%
	\expandafter\save@first@part\the#1#2\mark@end@fenixtok\edef\tempa{\the\toks0}\edef\tempb{\the#1}%
	\expandafter\let\expandafter\if@tok@present\csname\ifx\tempa\tempb iffalse\else iftrue\fi\endcsname \toks0{}%
}

\let\tempb\fi \let\tempc\iffalse
\catcode`f=12 \catcode`s=12 %
\tempc
%If #1 is {mytok} and #2 is {foo}, the previous unexcrutable \csname's and \edef's
%will result arfter expansion of \NewTypeoftok in something like
	\toktype@Registerifnotyet{mytok}%
	\newtoks\mytok/foo
	\mytok/foo{#3}%
	\def\next@mytok/foo{%
		% The two auxiliary   %\def\tok@type{\mytok}
		% edef lines          %\def\if@nextrequired{\if@nextmytok@required}
		% Another auxiliary line, for easier reading of the edef where it apears
		% \def\make@ifnextrequired@false{\let\exp@noex\if@nextrequired\noexpand\iffalse}
		\previous@mytok@\mytok
		\if@nextmytok@required\else
			\former@mytok@\mytok
		\fi
		\edef\tempa{\mytok{\if\foo L\the\mytok/foo\fi		%The first \foo is real
			\if@nextmytok@required\else\mytok\former@mytok@\let\noexpand\if@nextmytok@required\noexpand\iffalse\fi
			\the\previous@mytok@
			\if\foo R\the\mytok/foo\fi
			}}%
		\tempa
		\let\if@nextmytok@required\iftrue
	}%
	\edef\the@mytok/foo{\the\mytok/foo}%
	\def\every@mytok/foo{%
		%Axuliary definition of \tempb in order to edefine \tempa, not shown.
		\edef\tempa{\mytok{\if\foo L\noexpand\the@mytok@foo\fi \the\mytok \if\foo L\noexpand\the@mytok@foo\fi}}%
		\tempa
		\if@nextmytok@required
			%Same definition as above with \former@mytok@ istead of \mytok
			\tempa
		\fi
	}%
	\def\end@mytok/foo{%
		%Axuliary definition of \tempb not shown
		%Only shown the case where \if@tok@present is true
		\def\tempa{\mytok\expandafter\strip@mytok/foo \the\mytok}%
		\expandafter\mytok\expandafter\strip@mytok/foo\the\mytok\mark@end@fenixtok
		\if@nextmytok@required
			\def\tempa{\expandafter\strip@mytok/foo \noexpand\the\mytok}%
			\expandafter\former@mytok@\expandafter\strip@mytok/foo\the\former@mytok@\mark@end@fenixtok
		\fi
	}%
	\def\tempa{\strip@mytok/foo ####1\the@mytok/foo}%
	\def\strip@mytok/foo##1\the@mytok/foo##2\mark@end@fenixtok{\mytok{##1##2}}%
\fi
%end of example
\tempb
\catcode`f=11 \catcode`s=11 %
\let\fi\tempb \let\iffalse\tempc
\let\tempb\relax \let\tempc\relax

%Now the Register macros
\def\toktype@Registerifnotyet#1{%
	\ifcsname if@next#1@required\endcsname
		\def\next{}%
	\else\def\next{\toktype@Register{#1}}%
	\fi
	\next
}
\def\toktype@Register#1{%
	\expandafter\tok@newtoks\csname former@#1@\endcsname
	\expandafter\tok@newtoks\csname previous@#1@\endcsname
	\expandafter\global\expandafter\let\csname if@next#1@required\endcsname\iffalse
%
	\@namedef{Next#1L}##1{\def\foo{L}\csname next@#1/##1\endcsname}%	If you think
	\@namedef{Next#1R}##1{\def\foo{R}\csname next@#1/##1\endcsname}%
	\@namedef{All#1sL}##1{\def\foo{L}\csname every@#1/##1\endcsname}%	these should not be user level,
	\@namedef{All#1sR}##1{\def\foo{R}\csname every@#1/##1\endcsname}%	these should not be user level,
	\@namedef{End#1s}##1{\csname end@#1/##1\endcsname}%		just insert an @
%
	\NewTypeoftok{#1}{@scratch@}{}%
	\@namedef{next#1l}##1{\csname #1/@scratch@\endcsname{##1}\csname Next#1L\endcsname{@scratch@}}% inside the argument
	\@namedef{next#1r}##1{\csname #1/@scratch@\endcsname{##1}\csname Next#1R\endcsname{@scratch@}}% to the @namedef's
}

\def\fornexttokl#1#2{%
	\toktype@Registerifnotyet{#1}%
	\csname next#1l\endcsname{#2}%	Also here.
}
\def\fornexttokr#1#2{%
	\toktype@Registerifnotyet{#1}%
	\csname next#1r\endcsname{#2}%	and here.
}
\catcode`@=\atcatcode
\let\atcatcode\relax
\endinput
