need help with macro
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 ······································································· -- () ascii ribbon campaign - against html e-mail /\ www.asciiribbon.org - against proprietary attachments
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
···
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{…}}})
Thanks a lot, I rewrote my macros according to your the first suggestion and it works like a breeze. Best regards Philipp
\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
___________________________________________________________________________________ If your question is of interest to others as well, please add an entry to the Wiki!
maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context webpage : http://www.pragma-ade.nl / http://tex.aanhet.net archive : http://foundry.supelec.fr/projects/contextrev/ wiki : http://contextgarden.net ___________________________________________________________________________________
-- () ascii ribbon campaign - against html e-mail /\ www.asciiribbon.org - against proprietary attachments
participants (2)
-
Philipp Gesang
-
Wolfgang Schuster