[NTG-context] 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 pgpzESMbggoT5.pgp Description: PGP signature ___ 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 ___
Re: [NTG-context] need help with macro
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 ___ 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 ___
Re: [NTG-context] need help with macro
· > 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 pgpVn3fl4w27P.pgp Description: PGP signature ___ 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 ___