Reading ConTeXt metadata values into Lua
Hello All, I was trying to read the value of '\totalnumberofpages' into lua to do something with it. As an example, see below. Now, as I understand it, my example would not work as TeX gets the first go at this and therefore the variable 'pages' is the string '\totalnumberofpages' and not the actual value itself. And Lua cannot process this "calculation". I tried to go thru the manual - *cld-mkiv.pdf *- in the distro but could not catch on how to read a metadata value (not print). I am sure that I am missing a small trick somewhere (or is it something more involved?). \startluacode function myFancyCalculations(pages) -- some fancy stuff but as an example local myCal = tonumber(pages) + 1 return myCal \stopluacode \starttext \blah \ctxlua{context(myFancyCalculations("\\totalnumberofpages"))} \stoptext Thank you in advance for any tips. best regards, Ramkumar
Ramkumar KB via ntg-context schrieb am 16.10.2021 um 06:00:
Hello All,
I was trying to read the value of '\totalnumberofpages' into lua to do something with it. As an example, see below.
Now, as I understand it, my example would not work as TeX gets the first go at this and therefore the variable 'pages' is the string '\totalnumberofpages' and not the actual value itself. And Lua cannot process this "calculation".
I tried to go thru the manual - *cld-mkiv.pdf *- in the distro but could not catch on how to read a metadata value (not print). I am sure that I am missing a small trick somewhere (or is it something more involved?).
\startluacode function myFancyCalculations(pages) -- some fancy stuff but as an example local myCal = tonumber(pages) + 1 return myCal \stopluacode \starttext
\blah
\ctxlua{context(myFancyCalculations("\\totalnumberofpages"))}
\stoptext
Everything gets easier when you use the Lua functions to access the counter values but be aware the values can be wrong when you're at a page break. \startbuffer[pagenumber] \startluacode context.starttabulate() context.NC() context("Current page") context.EQ() context(structures.counters.get("realpage",1,"number")) context.NC() context.NR() context.NC() context("Last page") context.EQ() context(structures.counters.get("realpage",1,"last")) context.NC() context.NR() context.stoptabulate() \stopluacode \stopbuffer \starttext \dorecurse {\randomnumber{5}{10}} {\getbuffer[pagenumber] \page} \stoptext Wolfgang
On 10/16/2021 10:33 AM, Wolfgang Schuster via ntg-context wrote:
Ramkumar KB via ntg-context schrieb am 16.10.2021 um 06:00:
Hello All,
I was trying to read the value of '\totalnumberofpages' into lua to do something with it. As an example, see below.
Now, as I understand it, my example would not work as TeX gets the first go at this and therefore the variable 'pages' is the string '\totalnumberofpages' and not the actual value itself. And Lua cannot process this "calculation".
I tried to go thru the manual - *cld-mkiv.pdf *- in the distro but could not catch on how to read a metadata value (not print). I am sure that I am missing a small trick somewhere (or is it something more involved?).
\startluacode function myFancyCalculations(pages) -- some fancy stuff but as an example local myCal = tonumber(pages) + 1 return myCal \stopluacode \starttext
\blah
\ctxlua{context(myFancyCalculations("\\totalnumberofpages"))}
\stoptext
Everything gets easier when you use the Lua functions to access the counter values but be aware the values can be wrong when you're at a page break.
\startbuffer[pagenumber] \startluacode context.starttabulate() context.NC() context("Current page") context.EQ() context(structures.counters.get("realpage",1,"number")) context.NC() context.NR() context.NC() context("Last page") context.EQ() context(structures.counters.get("realpage",1,"last")) context.NC() context.NR() context.stoptabulate() \stopluacode \stopbuffer
\starttext
\dorecurse {\randomnumber{5}{10}} {\getbuffer[pagenumber] \page}
\stoptext
As addendum ... The problem in general with macros is that one doesn't really knows by looking at the name what actually happens when it expands, which can be a lot. Now, because \totalnumberofpages is supposed to 'return' a number and not typeset something styled (which itself involved macro expansion) you can actually do this: \startluacode local n = tokens.getters.macro("totalnumberofpages",true) print(">>>",type(n),n) \stopluacode but beware of the fact that you actually get back a string: \startluacode local n = tokens.getters.macro("totalnumberofpages",true) print(">>>",type(n),n) local n = tonumber(n) print(">>>",type(n),n) \stopluacode etc etc 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 -----------------------------------------------------------------
Hans / Wolfgang, Thank you for your quick feedback and the tips. Yes, this works for now. In general, I will try to avoid going into such "deep-end" APIs (at least for now, until such time I read all the manuals in depth!). IMHO, the standard ConTeXt system is itself quite powerful for 98% of the Typesetting usecases. best regards, Ramkumar On Sat, Oct 16, 2021 at 4:59 PM Hans Hagen via ntg-context < ntg-context@ntg.nl> wrote:
On 10/16/2021 10:33 AM, Wolfgang Schuster via ntg-context wrote:
Ramkumar KB via ntg-context schrieb am 16.10.2021 um 06:00:
Hello All,
I was trying to read the value of '\totalnumberofpages' into lua to do something with it. As an example, see below.
Now, as I understand it, my example would not work as TeX gets the first go at this and therefore the variable 'pages' is the string '\totalnumberofpages' and not the actual value itself. And Lua cannot process this "calculation".
I tried to go thru the manual - *cld-mkiv.pdf *- in the distro but could not catch on how to read a metadata value (not print). I am sure that I am missing a small trick somewhere (or is it something more involved?).
\startluacode function myFancyCalculations(pages) -- some fancy stuff but as an example local myCal = tonumber(pages) + 1 return myCal \stopluacode \starttext
\blah
\ctxlua{context(myFancyCalculations("\\totalnumberofpages"))}
\stoptext
Everything gets easier when you use the Lua functions to access the counter values but be aware the values can be wrong when you're at a page break.
\startbuffer[pagenumber] \startluacode context.starttabulate() context.NC() context("Current page") context.EQ() context(structures.counters.get("realpage",1,"number")) context.NC() context.NR() context.NC() context("Last page") context.EQ() context(structures.counters.get("realpage",1,"last")) context.NC() context.NR() context.stoptabulate() \stopluacode \stopbuffer
\starttext
\dorecurse {\randomnumber{5}{10}} {\getbuffer[pagenumber] \page}
\stoptext
As addendum ... The problem in general with macros is that one doesn't really knows by looking at the name what actually happens when it expands, which can be a lot. Now, because \totalnumberofpages is supposed to 'return' a number and not typeset something styled (which itself involved macro expansion) you can actually do this:
\startluacode local n = tokens.getters.macro("totalnumberofpages",true) print(">>>",type(n),n) \stopluacode
but beware of the fact that you actually get back a string:
\startluacode local n = tokens.getters.macro("totalnumberofpages",true) print(">>>",type(n),n) local n = tonumber(n) print(">>>",type(n),n) \stopluacode
etc etc
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
___________________________________________________________________________________
participants (3)
-
Hans Hagen
-
Ramkumar KB
-
Wolfgang Schuster