Am 23.09.2012 um 15:33 schrieb Philipp Gesang
Hi all,
I have a macro “mogrify” that eats three tokens of a string and treats them differently from the rest of the string. I can’t however use it inside more complex macros. Is there a way out or an alternative using macros? (No Lua.) Other formatting macros work fine in the same place.
Any help will be greatly appreciated Philipp
············· Example Code ············································ % macros=mkvi
\unprotect
\def\mogrify#content{% \begingroup \let\stopper\relax \def\get_first_three##1##2##3##4\stopper{% \def\first_three{##1##2##3}% \def\rest{##4}% }% \get_first_three#content\stopper% \colored[red]{\first_three}% \colored[green]{\rest}% \endgraf \endgroup% }
\installnamespace {ww} \installcommandhandler \????ww {ww} \????ww
\appendtoks \setuevalue{\currentww}{\wont_work[\currentww]} \to \everydefineww
\unexpanded\def\wont_work[#id]{% \edef\current_wont_work{#id}% \dosingleempty\wont_work_indeed% }
\def\wont_work_indeed[#setups]#content{% \iffirstargument\setupcurrentww[#setups]\fi %% here is the problem: \doifsomething{\wwparameter{param}}{\mogrify{\wwparameter{param}}}% \endgraf \framed{#content}% }
\defineww[wontwork]
\protect
\starttext
\mogrify{foobar}\par%% the macro does work in isolation
\wontwork[param=whatever]{will it work?} \wontwork[param=] {this, however, does work}
\stoptext
It’s a expansion problem, you can either expand the content in the definition of \mogrify (as seen below) or you make the \mogrify command unexpanded and you expand the content of the \wwparameter (i.e. \doifsomething{…}{\normalexpanded{\mogrify{…}}}) \unprotect \def\mogrify_scan#first#second#third#rest\relax {\def\m_mogrify_three{#first#second#third}% \def\m_mogrify_rest {#rest}} \def\mogrify#content% {\begingroup \edef\m_mogrify_content{#content}% \expandafter\mogrify_scan\m_mogrify_content\relax \colored [red]{\m_mogrify_three}% \colored[green]{\m_mogrify_rest }% \endgraf \endgroup} \installnamespace {ww} \installcommandhandler \????ww {ww} \????ww \appendtoks \setuevalue{\currentww}{\wont_work[\currentww]} \to \everydefineww \unexpanded\def\wont_work[#id]% {\edef\currentww{#id}% \dosingleempty\wont_work_indeed} \def\wont_work_indeed[#setups]#content% {\iffirstargument\setupcurrentww[#setups]\fi \doifsomething{\wwparameter{param}}{\mogrify{\wwparameter{param}}}% \endgraf \framed{#content}} \defineww[wontwork] \protect \starttext \mogrify{foobar}\par%% the macro does work in isolation \wontwork[param=whatever]{will it work?} \wontwork[param=] {this, however, does work} \stoptext Wolfgang