[NTG-context] need help with macro

2012-09-23 Thread 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
···


-- 
()  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

2012-09-23 Thread Wolfgang Schuster

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

2012-09-23 Thread Philipp Gesang
·

> 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
___