ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Max Chernoff via ntg-context <ntg-context@ntg.nl>
To: ntg-context@ntg.nl
Cc: Max Chernoff <mseven@telus.net>
Subject: Re: Accessing inserts from Lua in LuaMetaTeX
Date: Mon, 15 Aug 2022 19:56:35 -0600	[thread overview]
Message-ID: <59a3908808b46dfb8765ba43c409e962424a532c.camel@telus.net> (raw)


Hi Hans,

> > First, how do I get an insert's class/type from the "insert" nodes on
> > the page? With LuaTeX, the insert's class/type is the same as the
> > subtype of the "ins" nodes, but the subtype of the "insert" nodes is
> > always zero in LuaMetaTeX, so I'm not sure how to get the class/type.

After playing around, I found that this is stored in "<insert
node>.index". I'm able to write to this value just fine, but whenever I
read it I get an error.

This minimal example:

   \starttext
       \setbox999=\vbox{\hrule width 10pt height 10pt}
   
       \startluacode
           local insert = node.new("insert")
           local rule = tex.box[999].list
           insert.list = rule
           insert.index = 4
   
           node.write(insert)
       \stopluacode
   \stoptext
   
works perfectly, but this example:

   \startluacode
       local insert = node.new "insert"
       insert.index = 4
       print(insert.index)
   \stopluacode
   
gives this error message:

   In \insertmode 2 you can't use zero as index.
   
I suspect that this is a bug, but I may just be doing something wrong.

> Indeed, we don't use these boxes and registers because we run in 
> \insertmode=2. This gives us more state info (i kept the old method 
> around for now).

Inserts always felt a little hacky in TeX, so I think that the new
methods are a huge improvement.

> > Second, how do I get the head of the insert box from Lua? With LuaTeX,
> > from TeX you would use "\box<class>" and from Lua you can use
> > "tex.box[<class>]". With LuaMetaTeX, you use "\insertbox<class>" from
> > TeX, but I'm not sure how to get at the insert box from Lua.
> 
> tex.getinsertdistance
> tex.getinsertmultiplier
> tex.getinsertlimit
> tex.getinsertheight
> tex.getinsertdepth
> tex.getinsertwidth
> tex.getinsertcontent
> tex.setinsertdistance
> tex.setinsertmultiplier
> tex.setinsertlimit
> tex.setinsertcontent

Perfect! "tex.getinsertcontent" does exactly what I need.

Really minor, but I would expect that

   tex.insertcontent[4] = <some node>
   <some node> = tex.insertcontent[4]
   
would be exist and be equivalent to

   <some node> = tex.getinsertcontent(4)
   tex.setinsertcontent(4, <some node>)

> The insert (etc) handler is more clever and flexible. So, for instance
> we can bubble up inserts. I think you do a preroll so in that case you
> can set the migrations related parameter to not bubble up.
> 
> \starttext
> 
> \holdingmigrations\numexpr1+2+4\relax
> 
> \setbox0\hbox{test \footnote{test} test}
> 
> \setbox2\vbox{\unhcopy0}
> 
> \holdingmigrations0
> 
> \setbox4\vbox{\unhcopy0}
> 
> \unhbox0
> 
> \unvbox2
> 
> \unvbox4
> 
> \stoptext
> 
> But I have no clue how all that will work out with (lua) code that 
> manipulates these things. In list nodes you can consult the pre and post 
> fields to what got migrated.

I don't think that that will work in this case. I'm doing most of the
work in "pre_output_filter", which is after all of the insert nodes have
been removed from the page and put into their respective boxes. And I
can't postpone setting any inserts until then because TeX needs to know
their height for when it breaks the page. I don't really like how I have
to move the footnotes, but I can't find any better way of doing things.

If you're curious, most of the insert code is in these two functions:

   
   https://github.com/gucci-on-fleek/lua-widow-control/blob/2bca90/source/lua-widow-control.lua#L612-L669
   https://github.com/gucci-on-fleek/lua-widow-control/blob/2bca90/source/lua-widow-control.lua#L843-L924

Thanks,
-- Max

___________________________________________________________________________________
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:[~2022-08-16  1:56 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-16  1:56 Max Chernoff via ntg-context [this message]
  -- strict thread matches above, loose matches on Subject: below --
2022-08-15  6:18 Max Chernoff via ntg-context
2022-08-15 14:24 ` 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=59a3908808b46dfb8765ba43c409e962424a532c.camel@telus.net \
    --to=ntg-context@ntg.nl \
    --cc=mseven@telus.net \
    /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).