strange behavior with \groupedcommand in recent versions of LMTX
Hello list, this is a MWE that worked right in MkIV and in LMTX versions (at least) until April 22nd, 2020. There's a macro, \wordorparagraphright, that takes one argument, makes a hbox with it and measures its width - if its width is less than \hsize, then it calls \wordright - if its width is more than \hsize, then it ends the current paragraph and starts a right-aligned paragraph with the argument There are two implementations in the MWE: one is through \groupedcommand, and that's the one that worked once and doesn't now. ---------------------------------------------------- \unexpanded\def\groupedwordorparagraphright{\dosingleempty\dogroupedwordorparagraphright} \def\dogroupedwordorparagraphright[#1]{\groupedcommand{\setbox\scratchbox\hbox\bgroup} {\egroup\ifdim\wd\scratchbox < \hsize \wordright{\unhbox\scratchbox} \else \par\penalty10000 \startalignment[flushright]\unhbox\scratchbox\stopalignment \fi}} \unexpanded\def\wordorparagraphright#1{% \setbox\scratchbox\hbox{#1} \ifdim\wd\scratchbox < \hsize \wordright{#1} \else \par\penalty10000 \startalignment[flushright]\unhbox\scratchbox\stopalignment \fi} \starttext \type{\wordorparagraphright} should use \type{\wordright} if its argument is narrower than \type{\hsize}, or make a right-aligned paragraph with it when it's wider. Below, \type{\wordorparagraphright} is tested with a short text, that has enough room on the same line. \blank Reference: \input ward\wordright{same line, right} \blank Implementation as a grouped command (it doesn't work): \input ward\groupedwordorparagraphright{same line, right} \blank Normal implementation, not as a grouped command (it works): \input ward\wordorparagraphright{same line, right} \stoptext ---------------------------------------------------- Unfortunately the grouped version is the one I need, because it's used in a register, and it would give an error if not defined through \groupedcommand: \setupregister[myregister] [pageleft=\wordorparagraphright\bgroup,pageright=\egroup] TIA, Massi
On 9/1/2020 5:47 PM, mf wrote:
\unexpanded\def\groupedwordorparagraphright{\dosingleempty\dogroupedwordorparagraphright}
\def\dogroupedwordorparagraphright[#1]{\groupedcommand{\setbox\scratchbox\hbox\bgroup}
{\egroup\ifdim\wd\scratchbox < \hsize \wordright{\unhbox\scratchbox} \else \par\penalty10000 \startalignment[flushright]\unhbox\scratchbox\stopalignment \fi}}
\unexpanded\def\wordorparagraphright#1{% \setbox\scratchbox\hbox{#1} \ifdim\wd\scratchbox < \hsize \wordright{#1} \else \par\penalty10000 \startalignment[flushright]\unhbox\scratchbox\stopalignment \fi}
\starttext \type{\wordorparagraphright} should use \type{\wordright} if its argument is narrower than \type{\hsize}, or make a right-aligned paragraph with it when it's wider.
Below, \type{\wordorparagraphright} is tested with a short text, that has enough room on the same line. \blank
Reference:
\input ward\wordright{same line, right}
\blank
Implementation as a grouped command (it doesn't work):
\input ward\groupedwordorparagraphright{same line, right}
\blank
Normal implementation, not as a grouped command (it works):
\input ward\wordorparagraphright{same line, right} \stoptext ----------------------------------------------------
Unfortunately the grouped version is the one I need, because it's used in a register, and it would give an error if not defined through \groupedcommand:
\setupregister[myregister] [pageleft=\wordorparagraphright\bgroup,pageright=\egroup]
fortunately there is a solution that takes less code: \unexpanded\def\whatever {\dosingleempty\dowhatever} \def\dowhatever[#1]% {\dowithnextbox {\ifdim\wd\nextbox<\hsize \wordright{\box\nextbox}% \par \else \par \penalty10000 \startalignment[flushright]\unhbox\nextbox\stopalignment \fi}\hbox} \starttext \input ward \whatever{same line, right} \blank \input ward \whatever{\input tufte } \stoptext ----------------------------------------------------------------- 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 Hans, this solves the problem I had with the new implementation of \wordright. It's not exactly a problem of \wordright, but the combination with \groupedcommand. Is \nextbox a new entry of latest versions? I've seen also \nextboxwd, \nextboxht, etc. So you can measure the next box to come in advance. Is it like that? Is it a vbox when you're in vertical mode and a hbox when you are in horizontal mode? Is this interpretation of \dowithnextbox in \dowhatever right? \dowithnextbox {.1.} \.2. {.3.} 1 COMMAND = {\ifdim\wd\nextbox<\hsize...} 2 CSNAME = \hbox 3 CONTENT = {#1} Massi Il 01/09/20 19:22, Hans Hagen ha scritto:
fortunately there is a solution that takes less code:
\unexpanded\def\whatever {\dosingleempty\dowhatever}
\def\dowhatever[#1]% {\dowithnextbox {\ifdim\wd\nextbox<\hsize \wordright{\box\nextbox}% \par \else \par \penalty10000 \startalignment[flushright]\unhbox\nextbox\stopalignment \fi}\hbox}
\starttext
\input ward \whatever{same line, right}
\blank
\input ward \whatever{\input tufte }
\stoptext
On 9/2/2020 11:10 AM, mf wrote:
Thanks Hans, this solves the problem I had with the new implementation of \wordright. It's not exactly a problem of \wordright, but the combination with \groupedcommand.
that is always tricky as what happens is postponing till the group ends but wordright now kind of hooks into the par construction
Is \nextbox a new entry of latest versions?
no, actually one of the oldest things
I've seen also \nextboxwd, \nextboxht, etc. So you can measure the next box to come in advance. Is it like that?
Is it a vbox when you're in vertical mode and a hbox when you are in horizontal mode?
you just pass the box
Is this interpretation of \dowithnextbox in \dowhatever right?
\dowithnextbox {.1.} \.2. {.3.} 1 COMMAND = {\ifdim\wd\nextbox<\hsize...} 2 CSNAME = \hbox or \vbox 3 CONTENT = {#1} yes
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)
-
Hans Hagen
-
mf