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 ___________________________________________________________________________________