On 6/10/2024 7:08 AM, Max Chernoff wrote:
Hi Hraban,
On Sun, 2024-06-09 at 22:12 +0200, Henning Hraban Ramm wrote:
when I define a measure on the TeX side, I used to get at the value in Lua with tex.getdim, like:
\definemeasure[Bleed][3mm]
tex.getdimen("Bleed")
But now I get "incorrect dimen name". I need it as a dimension, since I do calculations with other dimensions like "topspace".
How should I do this correctly?
There doesn't appear to be any official interfaces to get the value of a measure from Lua, but the following should work okay:
\definemeasure[mymeasure][10pt]
\newdimen\mydimen \mydimen=10pt
\definemeasure[measureexpr][1in + 27.73pt]
\startluacode -- Returns the unexpanded value of some variable in a namespace. local function get_variable(namespace, variable) -- -- Doesn't work since "measure" is defined as a "system namespace". -- namespace = interfaces.getnamespace(namespace) namespace = tokens.getters.macro("??" .. namespace) return tokens.getters.macro(namespace .. variable) end
-- Gets the value of a measure and converts it to an integer in sp units. local function get_measure(name) return tex.sp(get_variable("measure", name)) end
-- Gets the \dimexpr-evaluated value of a measure, in sp units. local function get_measure_expr(name) local namespace = tokens.getters.macro("??measure") -- Undocumented, but seems to work as expected. return tex.getdimensionvalue(namespace .. name) end
-- Print the values of the lengths. print(("="):rep(80)) print("mymeasure:" , get_measure("mymeasure") ) print("mydimen:" , tex.dimen["mydimen"] ) print("measureexpr:", get_measure_expr("measureexpr")) print(("="):rep(80)) \stopluacode
\startTEXpage \measure{mymeasure} \the\mydimen \measure{measureexpr} \stopTEXpage
Thanks, -- Max
Indeed we can have: local namespace = tokens.getters.macro("??measure") function tex.getmeasure(name,asdimen) local value = tex.getdimensionvalue(namespace..name) if asdimen then return value .. "sp" else return value end and when you want to avoid the namespace you can do: function tex.getmeasure(name,asdimen) local value = token.getexpansion("\\tointeger\\measured{"..name.."}") if asdimen then return value .. "sp" else return tonumber(value) end end which is some 4 times slower. It'sindeed not documented (although there are some examples in accessors-001.tex) but it's in one of my todo's because I can use it in some places (there ar emopre such todo's) after which it will be discussed in one of the lowlelvel manuals i'll add tex.getmeasure to the core (but a bit different) 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 -----------------------------------------------------------------