ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Hans Hagen <j.hagen@xs4all.nl>
To: Thangalin <thangalin@gmail.com>,
	mailing list for ConTeXt users <ntg-context@ntg.nl>
Subject: [NTG-context] Re: Pass string into text background graphic
Date: Fri, 11 Aug 2023 23:53:20 +0200	[thread overview]
Message-ID: <550cf663-274f-106c-e930-03fb0b092643@xs4all.nl> (raw)
In-Reply-To: <CAANrE7rTZ5-PEeF4Zn82=wjAn52Z_Pkzf-3BgCh21wc=Q4rqPA@mail.gmail.com>

On 8/11/2023 9:57 PM, Thangalin wrote:
> Hi list,
> 
> I'm attempting to make a stylized border around paragraphs that can span
> pages. The border runs along the side and the top. (Ideally the top border
> wouldn't repeat, but that's a minor issue.) The issue I'm having is that
> the title for the text doesn't always appear. Instead, there's a small gap
> along the top border where the title should be.
> 
> Am I going about this the wrong way?
> 
> % SOT
> \startbuffer[demo]
> <html>
> <body>
> <div class="concurrent" data-title="Berth 5" data-location="San Diego">
> Text Goes Here
> </div>
> <div class="concurrent" data-title="Road" data-location="Beale AFB">
> Different Text Goes Here
> </div>
> </body>
> </html>\stopbuffer
> \startxmlsetups xml:xhtml
>    \xmlsetsetup{\xmldocument}{*}{-}
>    \xmlsetsetup{\xmldocument}{html|body}{xml:*}
>    \xmlsetsetup{\xmldocument}{div}{xml:*}\stopxmlsetups
> \xmlregistersetup{xml:xhtml}
> \startxmlsetups xml:html
>    \xmlflush{#1}\stopxmlsetups
> \startxmlsetups xml:body
>    \xmlflush{#1}\stopxmlsetups
> \startxmlsetups xml:div
>    \setvariable{div}{\xmlatt{#1}{class}}{#1}
>    \start[\xmlatt{#1}{class}]\xmlflush{#1}\stop\stopxmlsetups
> \startusableMPgraphic{GraphicConcurrent}
>    begingroup;
>      string legend;
> 
>      picture title;
>      picture border;
>      picture bg;
> 
>      numeric tw;
>      numeric th;
> 
>      legend := \MPstring{concurrent};
> 
>      title := nullpicture;
>      border := nullpicture;
>      bg := textext( "\strut " & legend );
> 
>      tw := xpart lrcorner bg - xpart llcorner bg;
>      th := ypart ulcorner bg - ypart llcorner bg;
> 
>      addto title also image(
>        fill unitsquare
>          xysized (tw + 8, th)
>          shifted ulcorner multipars[1]
>          shifted 28 right
>          shifted 8 down
>          withcolor white;
> 
>        draw
>          textext.drt( legend )
>          shifted ulcorner multipars[1]
>          shifted 32 right
>          shifted 3 down;
>      );
> 
>      addto border also image(
>        for i = 1 upto nofmultipars:
>          draw
>            llcorner multipars[i] --
>            ulcorner multipars[i] shifted 8 down ..
>            ulcorner multipars[i] shifted 8 right --
>            urcorner multipars[i]
>            withpen pencircle scaled 0.75 withcolor black;
>        endfor;
>      );
> 
>      draw image(
>        draw border;
>        draw title;
>      );
>    endgroup;\stopusableMPgraphic
> \definetextbackground[TextConcurrentFrame][
>    mp=GraphicConcurrent,
>    frame=off,
>    topoffset=1em,
>    leftoffset=1em,
>    location=paragraph,
> ]
> \definestartstop[concurrent][
>    before={%
>      \blank[big]%
>      LEGEND: \xmlatt{\getvariable{div}{concurrent}}{data-title}%
>      \blank[big]%
>      \setMPtext{concurrent}{\xmlatt{\getvariable{div}{concurrent}}{data-title}}
>      \startTextConcurrentFrame},
>    after={\stopTextConcurrentFrame\blank[big]},
> ]
> \starttext
>    \xmlprocessbuffer{main}{demo}{}\stoptext
> % EOT
> 
> If I change the following line:
> 
> legend := \MPstring{concurrent};
> 
> to:
> 
> legend := "some string";
> 
> Then the title "some string" is repeated. It seems like the value for
> \MPstring{concurrent} is being cached in some situations and ignored in
> others.
> 
> Essentially, I'm trying to visually offset multiple paragraphs using a
> left-hand vertical rule along with a top horizontal rule that has a title.
> Each new "concurrent" section needs its own header that doesn't repeat.
> 
> Is there a ConTeXt-way to accomplish this feat?
There's always a way out but not always a pretty one.

One problem is that these graphics are done later, when a page gets 
assembled, so you get the current value at that time. Then there is 
grouping so you need to assign global.  Now, there can be caching but 
you use expanded string so that's not the issue.

  %  draw image ( draw rawtextext(legend) notcached) ;

That is seldom needed. So below is a solution. When you cross pages with 
a frame you need to make sure the text is done once. I let you figure 
that out (after all you came this far so i guess you know). For historic 
reasons (mkii / performance) it's not the easiest mechanism.

% We store each one independent:

\newinteger\ConcurrentTextSetCounter
\newinteger\ConcurrentTextGetCounter

\protected\def\ConcurrentTextSet#1%
   {\global\advance\ConcurrentTextSetCounter\plusone
    \setxvariable
       {concurrent}
       {text:\the\ConcurrentTextSetCounter}
       {#1}}

\def\ConcurrentTextGet % we want full expansion here
   {\localcontrolled{\global\advance\ConcurrentTextGetCounter\plusone}%
    \getvariable
       {concurrent}
       {text:\the\ConcurrentTextGetCounter}}

% We also use the helpers (so at least we can see what we do):

\startuseMPgraphic{GraphicConcurrent}{text} %  % {mpos:region:draw}
  %  draw_multi_pars ;
     string legend ; legend := "\ConcurrentTextGet";
     show legend;
  %  draw image ( draw rawtextext(legend) notcached) ;
     picture p ; p := textext.rt(legend)
         shifted ulcorner multipars[1]
         shifted (1cm,0)
     ;
     draw
       llcorner multipars[1] --
       ulcorner multipars[1] --
       ulcorner multipars[1] shifted (9mm,0)
     ;
     draw
       ulcorner multipars[1] shifted (1mm + xpart lrcorner p,0) --
       urcorner multipars[1]
     ;
     draw p ;
\stopuseMPgraphic

% Watch how i moved the before/after blanks here:

\definetextbackground
   [TextConcurrentFrame]
   [mp=GraphicConcurrent,
  % mp=mpos:region:draw,
    method=mpos:region,
    frame=off,
    topoffset=1em,
    leftoffset=1em,
    before=\blank[2*big],
    after=\blank,
    location=paragraph]

% And use setups to get a nicer definition:

\startsetups concurrent:before
     \ConcurrentTextSet{\xmlatt{\getvariable{div}{concurrent}}{data-title}}
     \startTextConcurrentFrame
\stopsetups

\startsetups concurrent:after
     \stopTextConcurrentFrame
\stopsetups

\definestartstop
   [concurrent]
   [before=\directsetup{concurrent:before},
    after=\directsetup{concurrent:after}]

One problem with variables is that currently we cannot bind a "current" 
value so I need to think a bit about it. Maybe the solution here, a bit 
more robust is one. One can actually pass variables with a graphic but 
again, these are then overwritten by a later one.

In lmtx we have a few better tex-mp communication tricks but these are 
not yet documented in the manual. Contrary to mkii (intermediate as well 
as runtime processing) and mkiv (runtime two pass in a run processing) 
we can make some interfaces a bit simpler in mkxl but that happens 
stepwise because we need to remain compatible. Much of the positional 
graphic trickery is stil a bit mkii-ish in nature (where we had more mem 
and runtime constraints).

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 / https://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : https://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : https://contextgarden.net
___________________________________________________________________________________

  reply	other threads:[~2023-08-11 21:54 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-11 19:57 [NTG-context] " Thangalin
2023-08-11 21:53 ` Hans Hagen [this message]
2023-08-12 17:19   ` [NTG-context] " Thangalin
2023-08-12 20:04     ` Hans Hagen via ntg-context
2023-08-13 19:33       ` Thangalin

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=550cf663-274f-106c-e930-03fb0b092643@xs4all.nl \
    --to=j.hagen@xs4all.nl \
    --cc=ntg-context@ntg.nl \
    --cc=thangalin@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).