ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Marcus Vinicius Mesquita via ntg-context <ntg-context@ntg.nl>
To: mailing list for ConTeXt users <ntg-context@ntg.nl>
Cc: Marcus Vinicius Mesquita <marcusvinicius.mesquita@gmail.com>
Subject: Re: new upload, new trickery
Date: Tue, 16 Nov 2021 10:52:44 -0300	[thread overview]
Message-ID: <CAK9ODgRevjtcabaPa30p_myELcD4CsfMRi4B55WrW6GnaGdO-g@mail.gmail.com> (raw)
In-Reply-To: <f3e8c51c-66b1-2631-5f94-e87edc6d7ef4@xs4all.nl>


[-- Attachment #1.1: Type: text/plain, Size: 11302 bytes --]

Hi, Hans

I tried to run your first example, but ConTeXt throws an error and
complains that \resetleftparbox was never defined.
Using version: 2021.11.13

Regards

Marcus Vinicius


On Thu, Oct 28, 2021 at 6:24 AM Hans Hagen via ntg-context <
ntg-context@ntg.nl> wrote:

> Hi,
>
> Among the 'can they be made better' candidates in the engine are
> \vadjust and \local[left|right]box primitives that are not really used
> in context (okay, vadjust is used in mkii).
>
> The \vadjust vertical injector can be illustrated with
>
> \starttext
>      \ignorespaces\input tufte \removeunwantedspaces
>      we want a break before this line \vadjust pre {\break}%
>      \ignorespaces\input tufte \removeunwantedspaces
>
>      \page
>
>      \ignorespaces\input tufte \removeunwantedspaces
>      we want seperate lines now \leftparbox{\vadjust post {\break}}%
>      \ignorespaces\input tufte \removeunwantedspaces
>      \resetleftparbox{}
> \stoptext
>
> It's a signal that injects something in a vertical list without
> interupting the horizontal text flow. One can inject before (pre) or
> after (post which is default). New is that we can also influence the
> order: after vs before preceding \vadjust in the same line.  Also new is
> that deeply nested adjustments can migrate (so the hole los: marks,
> inserts and vadjust are now in sync) which is demonstrated with the next
> example:
>
> \starttext
>      \showstruts
>      \input tufte \removeunwantedspaces\space
>      \localleftbox  par {%
>         \hbox to 0pt{%
>            \llap{L}%
>            \vadjust{\strut\blackrule[width=1cm,color=red]}%
>            \hbox{\vadjust pre{\strut\blackrule[width=1cm,color=green]}}%
>         }\hss
>      }%
>      \localrightbox par {}%
>      \input tufte \removeunwantedspaces\space
>      \vadjust pre    {\strut BEFORE 1}%
>      \vadjust pre    {\strut BEFORE 2}%
>      \vadjust before {\strut AFTER  1}%
>      \vadjust before {\strut AFTER  2}%
>      \ignorespaces
>      \input tufte
> \stoptext
>
> Indeed it looks bad (ugly) but it illustrates the idea. What makes
> vadjust sort of useless for content is that it messes up spacing (but if
> there is real demand and usage i can sort that out at some point, maybe
> some new options or so). Thsi example also brings us to local boxes:
>
> \showframe
>
> \starttext
>
> \showmakeup[hbox]
>
> \startnarrower[2*left] \raggedleft
> {\localleftbox par {L1}\input tufte  \par}
> \stopnarrower
> \blank
>
> \startnarrower[2*middle] \raggedcenter
> {\localrightbox par {R1}\input tufte  \par}
> \stopnarrower
> \blank
>
> \stoptext
>
> New is the par keyword that forces the setting to be applied from the
> first line downards (fyio: these commands, when display set registers,
> when inline they set registers and inject a node). Watch out: one needs
> to use grouping in order not to bleed into other mechanisms.
>
> Also new is that we can query the content of these registers using \the,
> as in:
>
> \dorecurse{10}{
>      \showboxes
>      \localleftbox{\ruledhbox {\smallinfofont\setstrut\strut[L #1.0]}}%
>      \localleftbox{\ruledhbox {\smallinfofont\setstrut\strut[L
> #1.1]}\the\localleftbox}%
>      \localleftbox{\ruledhbox {\smallinfofont\setstrut\strut[L
> #1.2]}\the\localleftbox}%
>      \localleftbox{\ruledhbox {\smallinfofont\setstrut\strut[L
> #1.3]}\the\localleftbox}%
>      %
>      \localrightbox{\ruledhbox
> {\smallinfofont\setstrut\strut[R #1.0]}}%
>
> \localrightbox{\the\localrightbox\ruledhbox{\smallinfofont\setstrut\strut[R
>
> #1.1]}}%
>
> \localrightbox{\the\localrightbox\ruledhbox{\smallinfofont\setstrut\strut[R
>
> #1.2]}}%
>      \localrightbox{\the\localrightbox\ruledhbox{\smallinfofont[R #1.3]}}%
>      % \localrightbox{}%
>      \samplefile{tufte}
> }
>
> Flushing permits us to append and prepend but it's still ugly so that is
> why we now have a new interface (context layer on top of engine):
>
> \dorecurse{10}{
>      \showboxes
>      %
>      \resetleftparbox
>      \resetrightparbox
>      %
>      \prependleftparbox {\ruledhbox{\smallinfofont\setstrut\strut[L
> #1.0]}}%
>      \prependleftparbox {\ruledhbox{\smallinfofont\setstrut\strut[L
> #1.1]}}%
>      \prependleftparbox {\ruledhbox{\smallinfofont\setstrut\strut[L
> #1.2]}}%
>      \prependleftparbox {\ruledhbox{\smallinfofont\setstrut\strut[L
> #1.3]}}%
>      %
>      \appendrightparbox{\ruledhbox{\smallinfofont\setstrut\strut[R #1.0]}}%
>      \appendrightparbox{\ruledhbox{\smallinfofont\setstrut\strut[R #1.1]}}%
>      \appendrightparbox{\ruledhbox{\smallinfofont\setstrut\strut[R #1.2]}}%
>      \appendrightparbox{\ruledhbox{\smallinfofont[R #1.3]}}%
>      %
>      \samplefile{tufte}
> }
>
> But as this is not really user friendly, there is more: a mechanism for
> hooking in handlers.
>
> \definelocalboxes
>    [linenumber]
>    [command=\LeftNumber,
>     location=left,
>     width=3em,
>     style=\bs,
>     color=darkred]
>
> \definelocalboxes
>    [linenumbertwo]
>    [linenumber]
>    [command=\RightNumber,
>     location=right,
>     width=6em,
>     style=\bf,
>     color=darkgreen]
>
> \definelocalboxes
>    [linetext]
>    [command=\LeftText,
>     location=lefttext,
>     style=\bs,
>     color=darkblue]
>
> \definelocalboxes
>    [linetexttwo]
>    [linetext]
>    [command=\RightText,
>     location=righttext,
>     style=\bf,
>     color=darkgray]
>
> % just using the content
>
> % \protected\def\LeftNumber {\hbox to
> \localboxesparameter{width}{\strut\box\localboxcontentbox\hss)}}
> % \protected\def\RightNumber{\hbox to
> \localboxesparameter{width}{\strut(\hss\box\localboxcontentbox)}}
>
> % using the provided line number:
>
> % \def\LineNumberL{\the\localboxlinenumber}
> % \def\LineNumberR{\the\localboxlinenumber}
>
> % using a tex counter
>
> % \newcount\MyLineNumberL
> % \newcount\MyLineNumberR
> % \def\LineNumberL{\global\advance\MyLineNumberL\plusone\the\MyLineNumberL}
> % \def\LineNumberR{\global\advance\MyLineNumberR\plusone\the\MyLineNumberR}
>
> % using proper counters
>
> \definecounter[MyLineNumberL]
> \definecounter[MyLineNumberR]
>
> \setupcounter[MyLineNumberL][numberconversion=characters]
> \setupcounter[MyLineNumberR][numberconversion=romannumerals]
>
>
> \def\LineNumberL{\incrementcounter[MyLineNumberL]\convertedcounter[MyLineNumberL]}
>
> \def\LineNumberR{\incrementcounter[MyLineNumberR]\convertedcounter[MyLineNumberR]}
>
> \protected\def\LeftNumber {\hbox to
> \localboxesparameter{width}{\strut(\LineNumberL\hss)}}
> \protected\def\RightNumber{\hbox to
> \localboxesparameter{width}{\strut(\hss\LineNumberR)}}
>
> \protected\def\LeftText #1{#1\quad}
> \protected\def\RightText#1{\quad#1}
>
> \showframe
>
> \starttext
>
> \start
>      \localbox[linenumber]{}%
>      \localbox[linenumbertwo]{}%
>      \localbox[linetext]{L}%
>      \startlocalbox[linetexttwo]
>          R
>      \stoplocalbox
>      \dorecurse{100}{
>          \samplefile{tufte}
>          \par
>      }
> \stop
>
> If you play a bit with these low level mechanism the luametatex /
> context combination now permits weird applications (which for sure some
> of you will (ab)use). The above example shows how to implement line
> numbers (there are drawbacks compared to the existing mechanisms) and
> other stuff in the margins and text edges but the most important aspect
> is that when the content in these boxes has width, it will be taken into
> account in the par builder because that is what this is about: these
> local boxes are taken into acount when breaking lines. When the handlers
> kick in, you have
>
> \localboxattribute         : more for internal use
> \localboxlinenumber        : as the par builder sees it
> \localboxwidth             : the local box width
> \localboxoffset            : the total distance to the edge
> \localboxleftskip          : the effective leftskip
> \localboxrightskip         : the effective rightskip
> \localboxlefthang          : the current shape related value
> \localboxrighthang         : the current shape related value
> \localboxindent            : only first line
> \localboxparfillleftskip   : effective value (onky last line)
> \localboxparfillrightskip  : effective value (only last line)
> \localboxovershoot         : overfull compensation
>
> most of these relate to normalized lines and as such there is plenty to
> play with. Others can be seen in the examples.
>
> I might add some more control to both these 'injection' mechanism
> because directly out of the (pdftex/omega/luatex) they are not that
> useful (which is probably also why we don't use them.) These are cheap
> extensions so they don't really influence runtime much, so .. when not
> used ... no harm done. I really have no clue how useful this is.
>
> I need to ponder this usage:
>
> \definelocalboxes
>    [linetextA]
>    [command=\LeftTextA,
>     location=lefttext,
>     style=\bs,
>     color=darkblue]
>
> \protected\def\LeftTextA#1{\llap{#1}\quad}
>
> \definelocalboxes
>    [linetextB]
>    [command=\LeftTextB,
>     location=left,
>     style=\bs,
>     color=darkgreen]
>
> \protected\def\LeftTextB{\llap{\unhbox\localboxcontentbox}\quad}
>
> \starttext
>
> \dorecurse{10}{some text #1 }
> \leftparbox {\red \bf keyword}HERE\leftparbox{}
> \dorecurse{10}{some text #1 }
> \blank
>
> {\dorecurse{10}{some text #1 }
> \leftparbox {\red \bf keyword}test
> \dorecurse{10}{some text #1 }}
> \blank
>
> {\dorecurse{10}{some text #1 }
> \localbox[linetextA]{keyword}HERE
> \dorecurse{10}{some text #1 }}
>
> {\dorecurse{10}{some text #1 }
> \localbox[linetextB]{keyword}HERE
> \dorecurse{10}{some text #1 }}
>
> {\dorecurse{10}{some text #1 }
> \localbox[linetextB]{keyword 1}HERE1
> \dorecurse{10}{some text #1 }
> \localbox[linetextB]{keyword 2}HERE2
> \dorecurse{10}{some text #1 }}
>
> \stoptext
>
> so there's always so echallenge left.
>
> 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
>
> ___________________________________________________________________________________
>


-- 
Todas as coisas fatigam o corpo, salvo a música, que não fatiga nem o corpo
nem seus membros, por ser descanso da alma, primavera do coração, distração
do aflito, entretenimento do solitário, e viático do viajante.

Kunnâsh al-Hâ'ik (Cancioneiro de al-Hâ'ik)

[-- Attachment #1.2: Type: text/html, Size: 13499 bytes --]

[-- Attachment #2: Type: text/plain, Size: 493 bytes --]

___________________________________________________________________________________
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
___________________________________________________________________________________

  parent reply	other threads:[~2021-11-16 13:52 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-28  9:24 Hans Hagen via ntg-context
2021-10-29  8:24 ` Wiki's ConTeXt updated Taco Hoekwater via ntg-context
2021-11-16 13:52 ` Marcus Vinicius Mesquita via ntg-context [this message]
2021-11-16 17:44   ` new upload, new trickery Hans Hagen via ntg-context

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAK9ODgRevjtcabaPa30p_myELcD4CsfMRi4B55WrW6GnaGdO-g@mail.gmail.com \
    --to=ntg-context@ntg.nl \
    --cc=marcusvinicius.mesquita@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).