Re: [NTG-context] Title for tabulate
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.}? Best Benjamin
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 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 -----------------------------------------------------------------
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
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 -----------------------------------------------------------------
On 12/16/2021 11:39 AM, Benjamin Buchmuller wrote:
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}} can you try
\ifcstok{\dummyparameter{headtitle}}\emptytoks instead ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
Yes, this works! Thanks! I'll try to add a section on the Wiki. Is there a reason why the second approach works while the other doesn't?
On Dec 16, 2021, at 12:46, Hans Hagen
wrote: On 12/16/2021 11:39 AM, Benjamin Buchmuller wrote:
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}} can you try
\ifcstok{\dummyparameter{headtitle}}\emptytoks
instead
----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl -----------------------------------------------------------------
On 12/17/2021 8:25 AM, Benjamin Buchmuller wrote:
Yes, this works! Thanks!
I'll try to add a section on the Wiki. Is there a reason why the second approach works while the other doesn't?
expansion etc so just stick to what works 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 -----------------------------------------------------------------
participants (2)
-
Benjamin Buchmuller
-
Hans Hagen