Thanks again, Hans, for all the different approaches, very instructive!

However, after playing around a bit, I do have a question that I can't work 
out: 

\getdummyparameters[headtitle=,#1]

\ifempty{\dummyparameter{headtitle}}

will never be true? See below in context:

> On Dec 14, 2021, at 19:16, Hans Hagen <j.ha...@xs4all.nl> wrote:
> 
> On 12/14/2021 6:16 PM, Benjamin Buchmuller via ntg-context wrote:
>> Hi!
>> I'd like to follow up on a problem that Denis came across recently with the 
>> titles argument in tabulate. (It's more a solution than a question, but any 
>> hints to improve the answer are welcome.) I wanted to use this argument for 
>> an easy specification of, well, a title for a "recipe". The advantage is 
>> that all information is held together and it's easy to use for people who 
>> are not (too) familiar with ConTeXt.
>> So, in one file I can define all styles (which the end-user would not need 
>> to see):
>> \definetabulate[recipe][|l|l|p|l|]
>> \setuptabulate
>>      [recipe]
>>      [
>>      bodyfont=small,
>>      distance=medium,
>>      before={\blank[back, small]},
>>      header=text,
>>      headstyle=\bi, % this formats the "\BC" cells
>>      headcolor=red, % this formats the "\BC" cells
>>      ]
>> \starttext
>> And then use:
>> \startrecipe[title={Whatever mixture 1}]
>> \FL
>> \NC Absolute \BC Stock \NC Ingredient \NC Final \NR
>> \HL
>> \NC 1 \NR
>> \LL
>> \stoprecipe
>> \startrecipe[title={Whatever mixture 2}]
>> \FL
>> \BC Absolute \BC Stock \BC Ingredient \BC Final \NR
>> \HL
>> \NC 1 \NR
>> \LL
>> \stoprecipe
>> \stoptext
>> etc.
>> However, I cannot change the way the title is styled (or spaced from the 
>> table) unless I do "title={\bi Some text.}". However, blank commands are 
>> also stripped off at this place. (I also don't get a clue from the source if 
>> there is any argument to spike-in some formatting.)
>> So, if there is no easy way to access this one, we can work around:
>> \definetabulate[recipetab][|l|l|p|l|]
>> \setuptabulate
>>      [recipetab]
>>      [
>>      bodyfont=small,
>>      distance=medium,
>>      before={\blank[back, small]},
>>      % header=text, % THIS MUST NOT BE "text"
>>      headstyle=bold,
>>      headcolor=red,
>>      ]
>> \define\startrecipe{\dodoubleempty\dostartrecipe}
>> \long\def\dostartrecipe[#1][#2]#3\stoprecipe{%
>>      \iffirstargument
>>              {\bi #1}\blank[medium]
>>      \fi
>>      \ifsecondargument
>>              \startrecipetab[#2]
>>              #3
>>              \stoprecipetab
>>      \else
>>              \startrecipetab
>>              #3
>>              \stoprecipetab
>>      \fi
>> }
>> \startrecipe[Head 1]
>> \FL
>> \BC Absolute \BC Stock \BC Ingredient \BC Final \NR
>> \HL
>> \NC 1 \NR
>> \LL
>> \stoprecipe
>> \startrecipe[Head 2][headcolor=blue] % pass on arguments to tabulate
>> \FL
>> \BC Absolute \BC Stock \BC Ingredient \BC Final \NR
>> \HL
>> \NC 1 \NR
>> \LL
>> \stoprecipe
>> Small question though: Is there a ConTeXt way to "\long\def" or a simple way 
>> ("user interface") to filter a list of arguments for a specific key=val 
>> pair, e.g. to make a single optional argument with headertitle={Some 
>> header.}?
> context has no (need for) \long ... all is long (i mever saw a reason for 
> using it)
> 
> (1) use a proper head:
> 
> \definehead[RecipeHead][subsubsubsubsubsubject]
> \setuphead [RecipeHead][style=bolditalic,after={\blank[medium]}]
> 
> \definetabulate[recipetab][|l|l|p|l|]
> 
> \setuptabulate
>  [recipetab]
>  [bodyfont=small,
>   distance=medium,
>   before={\blank[back, small]},
>   headstyle=bold,
>   headcolor=red]
> 
> here's a one-step lmtx solution:
> 
> \let\stoprecipe\relax
> 
> \tolerant\protected\def\startrecipe[#1]#*[#2]#3\stoprecipe
>  {\ifcstok{#1}\emptytoks\else
>     \RecipeHead{#1}
>   \fi
>   \ifcstok{#2}\emptytoks
>     \startrecipetab#3\stoprecipetab
>   \else
>     \startrecipetab[#2]#3\stoprecipetab
>   \fi}
> 
> or just
> 
> \tolerant\protected\def\startrecipe[#1]#*[#2]#3\stoprecipe
>  {\ifempty{#1}\else
>     \RecipeHead{#1}
>   \fi
>   \ifempty{#2}%
>     \startrecipetab#3\stoprecipetab
>   \else
>     \startrecipetab[#2]#3\stoprecipetab
>   \fi}
> 
> 
> and here's one that does what you ask (in the core i'd try to avoid grabbing 
> too much arguments and if real core we'd make sure dummy parameters don;t 
> interfere):
> 
> \tolerant\protected\def\startrecipe[#1]#2\stoprecipe
>  {\ifempty{#1}%
>     \startrecipetab#2\stoprecipetab
>   \orelse\ifhastok={#1}%
>     \getdummyparameters[headtitle=,#1]
>     \ifempty{\dummyparameter{headtitle}}\else
>       \normalexpanded{\RecipeHead{\dummyparameter{headtitle}}}
>     \fi
>     \startrecipetab[#1]#2\stoprecipetab
>   \else
>     \RecipeHead{#1}
>     \startrecipetab#2\stoprecipetab
>   \fi}
> 
> \startrecipe[headtitle={Head 3},headcolor=blue] % pass on arguments to 
> tabulate
> \FL
> \BC Absolute \BC Stock \BC Ingredient \BC Final \NR
> \HL
> \NC 1 \NR
> \LL
> \stoprecipe

Consider:

\startrecipe[headcolor=darkyellow] % pass on arguments to tabulate
\FL
\BC Absolute \BC Stock \BC Ingredient \BC Final \NR
\HL
\NC 1 \NR
\LL
\stoprecipe

This leaves a blank header line instead of none.

Complete example with XXXXX control:

\definehead[RecipeHead][subsubsubsubsubsubject]
\setuphead [RecipeHead][style=bolditalic,after={\blank[medium]}]

\definetabulate[recipetab][|l|l|p|l|]

\setuptabulate
 [recipetab]
 [bodyfont=small,
  distance=medium,
  before={\blank[back, small]},
  headstyle=bold,
  headcolor=red]

\let\stoprecipe\relax

\tolerant\protected\def\startrecipe[#1]#2\stoprecipe
 {\ifempty{#1}%
    \startrecipetab#2\stoprecipetab
  \orelse\ifhastok={#1}%
    \getdummyparameters[headtitle=,#1] % this should make headtitle by default 
empty, but doesn't?
    \ifempty{\dummyparameter{headtitle}}XXXXX\else
      \normalexpanded{\RecipeHead{\dummyparameter{headtitle}YYYY}}
    \fi
    \startrecipetab[#1]#2\stoprecipetab
  \else
    \RecipeHead{#1}
    \startrecipetab#2\stoprecipetab
  \fi}

some text

\startrecipe[headtitle={Head 3},headcolor=blue] % pass on arguments to tabulate
\FL
\BC Absolute \BC Stock \BC Ingredient \BC Final \NR
\HL
\NC 1 \NR
\LL
\stoprecipe

some text

\startrecipe[headcolor=darkyellow] % pass on arguments to tabulate
\FL
\BC Absolute \BC Stock \BC Ingredient \BC Final \NR
\HL
\NC 1 \NR
\LL
\stoprecipe

> 
> Here's a variant:
> 
> \def\theparameter#1#2%
>  {\beginlocalcontrol
>   \begingroup
>   \getdummyparameters[#1=,#2]%
>   \normalexpanded{\endgroup\endlocalcontrol\dummyparameter{#1}}}
> 
> \tolerant\protected\def\startrecipe[#1]#2\stoprecipe
>  {\ifempty{#1}%
>     \startrecipetab#2\stoprecipetab
>   \orelse\ifhastok={#1}%
>     \edef\MyHeadTitle{\theparameter{headtitle}{#1}}%
>     \ifempty\MyHeadTitle\else
>       \normalexpanded{\RecipeHead{\MyHeadTitle}}
>     \fi
>     \startrecipetab[#1]#2\stoprecipetab
>   \else
>     \RecipeHead{#1}
>     \startrecipetab#2\stoprecipetab
>   \fi}
> 
> or just
> 
> \tolerant\protected\def\startrecipe[#1]#2\stoprecipe
>  {\ifempty{#1}%
>     \startrecipetab#2\stoprecipetab
>   \else
>     \edef\MyHeadTitle{\theparameter{headtitle}{#1}}%
>     \ifempty\MyHeadTitle\else
>       \normalexpanded{\RecipeHead{\MyHeadTitle}}
>     \fi
>     \startrecipetab[#1]#2\stoprecipetab
>   \fi}
> 
> or
> 
> \tolerant\protected\def\startrecipe[#1]#2\stoprecipe
>  {\ifempty{#1}%
>     \startrecipetab#2\stoprecipetab
>   \else
>     \ifcstok{\theparameter{headtitle}{#1}}\emptytoks\else
>       \normalexpanded{\RecipeHead{\theparameter{headtitle}{#1}}}
>     \fi
>     \startrecipetab[#1]#2\stoprecipetab
>   \fi}
> 
> or ... or ... or ...
> 
> just play with it a bit till you have something that looks nice in code too
> 
> Hans
> 
> -----------------------------------------------------------------
>                                          Hans Hagen | PRAGMA ADE
>              Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
>       tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
> -----------------------------------------------------------------

___________________________________________________________________________________
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://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

Reply via email to