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 via email to