\do(single|double|etc)empty behaviour
Hello there. I was writing a small macro to emulate a custom \part command, and I broke my head against \dosingleempty (but finally I won). Why this example is working: %%%%%%%%% start %%%%%%%%%%%%%%%%% \definelist[talpart] \define\talpart{\page[right]% \blank[2*big]% \startalignment[center]% \dosingleempty\doTalPart} \def\doTalPart[#1]#2{% \iffirstargument debug: I have the optional arg \bfc#1\blank[2*big] \writetolist[talpart]{}{{#1. }#2} \else debug: I don't have any arg \blank[2*big] \writetolist[talpart]{}{#2} \fi \bfd#2 \stopalignment \blank[2*big] } \starttext \placelist[talpart] \talpart[optional]{With optional argument} \input knuth \talpart{No argument} \input ward \stoptext %%%%%%%%%%% stop %%%%%%%%%%%%%%%% While this, the original one, is definitively not working? %%%%%%%%% start %%%%%%%%%%%%%%%%% \definelist[talpart] \define\talpart{\dosingleempty\doTalPart} \def\doTalPart[#1]#2{% \page[right] \startalignment[center] \blank[force,2*big] \iffirstargument debug: I have the optional arg \noindent{\bfc#1}\blank[2*big] \writetolist[talpart]{}{{#1. }#2} \else debug: I don't have any arg \blank[2*big] \writetolist[talpart]{}{#2} \fi {\noindent \bfd#2} \stopalignment \page[left] } \starttext \placelist[talpart] \talpart[optional]{With optional argument} \input knuth \talpart{No argument} \input ward \stoptext %%%%%%%%%%% stop %%%%%%%%%%%%%%%% It's unclear to me how the arguments are passed between macros. Probably it's just a matter of knowledge of TeX macro programming (which obviously I don't have). My source of inspiration was: http://wiki.contextgarden.net/Commands_with_optional_arguments Bests -- Marco
Am 15.12.2010 um 19:40 schrieb Marco Pessotto:
Hello there.
I was writing a small macro to emulate a custom \part command, and I broke my head against \dosingleempty (but finally I won).
[…]
It's unclear to me how the arguments are passed between macros. Probably it's just a matter of knowledge of TeX macro programming (which obviously I don't have).
Your test with \iffirstargument fails because you perform it after \startalignment which has itself a argument which sets \iffirstargument to true, a better way to check for content of the optional argument is \doifsomethingelse. \def\talpart {\dosingleempty\dotalpart} \def\dotalpart[#1]#2% {\page[right] \blank[force,2*big] \startalignment[center] \doifsomethingelse{#1} {{\bfc#1}\writetolist[talpart]{}{#1. #2}} {\writetolist[talpart]{}{#2}}% \blank[2*big] {\bfd#2} \stopalignment \page[left]} Wolfgang
Wolfgang Schuster
Am 15.12.2010 um 19:40 schrieb Marco Pessotto:
Hello there.
I was writing a small macro to emulate a custom \part command, and I broke my head against \dosingleempty (but finally I won).
[…]
It's unclear to me how the arguments are passed between macros. Probably it's just a matter of knowledge of TeX macro programming (which obviously I don't have).
Your test with \iffirstargument fails because you perform it after \startalignment which has itself a argument which sets \iffirstargument to true, a better way to check for content of the optional argument is \doifsomethingelse.
\def\talpart {\dosingleempty\dotalpart}
\def\dotalpart[#1]#2% {\page[right] \blank[force,2*big] \startalignment[center] \doifsomethingelse{#1} {{\bfc#1}\writetolist[talpart]{}{#1. #2}} {\writetolist[talpart]{}{#2}}% \blank[2*big] {\bfd#2} \stopalignment \page[left]}
Wolfgang
Thanks a lot for your explanation. I've added a "pitfalls" section to http://wiki.contextgarden.net/Commands_with_optional_arguments#Pitfalls (well, it was a pitfall at least for me) -- Marco
participants (2)
-
Marco Pessotto
-
Wolfgang Schuster