mlib-int.lmt /size: 17 Kb    last modification: 2025-02-21 11:03
1if not modules then modules = { } end modules ['mlib-int'] = {
2    version   = 1.001,
3    comment   = "companion to mlib-ctx.mkiv",
4    author    = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5    copyright = "PRAGMA ADE / ConTeXt Development Team",
6    license   = "see context related readme files",
7}
8
9local bpfactor       <const> = number.dimenfactors.bp
10
11local isdimen        = tex.isdimen
12local iscount        = tex.iscount
13local getdimen       = tex.getdimen
14local getcount       = tex.getcount
15local getmacro       = tokens.getters.macro
16local get            = tex.get
17
18local registerscript = metapost.registerscript
19local registerdirect = metapost.registerdirect
20
21do
22
23    local t = os.date("*t") -- maybe this should be a very early on global
24
25    -- If we want to do a vardef then we first need to catch an endgroup and
26    -- that then fails because we have a variable sitting there, so they need
27    -- to be def's at the mp end.
28
29    local assignment_code = metapost.codes.assignment
30
31    local mpscannext      = mp.scan.next
32    local mpscaninteger   = mp.scan.integer
33
34    local function item(name)
35        local n = mpscannext(true) -- keep
36        if n == assignment_code then
37            mpscannext()
38            t[name] = mpscaninteger()
39        else
40            return t[name]
41        end
42    end
43
44    registerdirect("year",   function() return item("year")  end)
45    registerdirect("month",  function() return item("month") end)
46    registerdirect("day",    function() return item("day")   end)
47    registerdirect("hour",   function() return item("hour")  end)
48    registerdirect("minute", function() return item("min")   end)
49    registerdirect("second", function() return item("sec")   end)
50
51end
52
53do
54
55        -- These get swapped so the d_ numbers change.
56
57        registerdirect("PaperHeight",         function() return getdimen("paperheight")         * bpfactor end)
58        registerdirect("PaperWidth",          function() return getdimen("paperwidth")          * bpfactor end)
59        registerdirect("PrintPaperHeight",    function() return getdimen("printpaperheight")    * bpfactor end)
60        registerdirect("PrintPaperWidth",     function() return getdimen("printpaperwidth")     * bpfactor end)
61        registerdirect("BackSpace",           function() return getdimen("backspace")           * bpfactor end)
62        registerdirect("CutSpace",            function() return getdimen("cutspace")            * bpfactor end)
63
64        registerdirect("LeftEdgeWidth",       function() return getdimen("leftedgewidth")       * bpfactor end)
65        registerdirect("LeftEdgeDistance",    function() return getdimen("leftedgedistance")    * bpfactor end)
66        registerdirect("LeftMarginWidth",     function() return getdimen("leftmarginwidth")     * bpfactor end)
67        registerdirect("LeftMarginDistance",  function() return getdimen("leftmargindistance")  * bpfactor end)
68        registerdirect("RightMarginDistance", function() return getdimen("rightmargindistance") * bpfactor end)
69        registerdirect("RightMarginWidth",    function() return getdimen("rightmarginwidth")    * bpfactor end)
70        registerdirect("RightEdgeDistance",   function() return getdimen("rightedgedistance")   * bpfactor end)
71        registerdirect("RightEdgeWidth",      function() return getdimen("rightedgewidth")      * bpfactor end)
72
73        -- leftmargintotal   rightmargintotal -- not yet
74        -- leftedgetotal     rightedgetotal
75        -- leftsidetotal     rightsidetotal
76        -- leftcombitotal    rightcombitotal
77        -- innermargintotal  outermargintotal
78        -- inneredgetotal    outeredgetotal
79        -- innercombitotal   outercombitotal
80        -- innersidetotal    outersidetotal
81
82        local d_leftedgewidth       <const> = isdimen("leftedgewidth")
83        local d_leftedgedistance    <const> = isdimen("leftedgedistance")
84        local d_leftmarginwidth     <const> = isdimen("leftmarginwidth")
85        local d_leftmargindistance  <const> = isdimen("leftmargindistance")
86        local d_rightmargindistance <const> = isdimen("rightmargindistance")
87        local d_rightmarginwidth    <const> = isdimen("rightmarginwidth")
88        local d_rightedgedistance   <const> = isdimen("rightedgedistance")
89        local d_rightedgewidth      <const> = isdimen("rightedgewidth")
90
91        registerdirect("InnerMarginDistance",  function() return getdimen(d_leftmargindistance ) * bpfactor end)
92        registerdirect("InnerMarginWidth",     function() return getdimen(d_leftmarginwidth    ) * bpfactor end)
93        registerdirect("OuterMarginDistance",  function() return getdimen(d_rightmargindistance) * bpfactor end)
94        registerdirect("OuterMarginWidth",     function() return getdimen(d_rightmarginwidth   ) * bpfactor end)
95        registerdirect("InnerEdgeDistance",    function() return getdimen(d_leftmargindistance ) * bpfactor end)
96        registerdirect("InnerEdgeWidth",       function() return getdimen(d_leftmarginwidth    ) * bpfactor end)
97        registerdirect("OuterEdgeDistance",    function() return getdimen(d_rightedgedistance  ) * bpfactor end)
98        registerdirect("OuterEdgeWidth",       function() return getdimen(d_rightedgewidth     ) * bpfactor end)
99
100        -- local onrightpage = structures.pages.on_right
101
102        -- registerdirect("InnerMarginDistance",  function() return getdimen(onrightpage() and "leftmargindistance"  or "rightmargindistance") * bpfactor end)
103        -- registerdirect("InnerMarginWidth",     function() return getdimen(onrightpage() and "leftmarginwidth"     or "rightmarginwidth"   ) * bpfactor end)
104        -- registerdirect("OuterMarginDistance",  function() return getdimen(onrightpage() and "rightmargindistance" or "leftmargindistance" ) * bpfactor end)
105        -- registerdirect("OuterMarginWidth",     function() return getdimen(onrightpage() and "rightmarginwidth"    or "leftmarginwidth"    ) * bpfactor end)
106        -- registerdirect("InnerEdgeDistance",    function() return getdimen(onrightpage() and "leftmargindistance"  or "rightmargindistance") * bpfactor end)
107        -- registerdirect("InnerEdgeWidth",       function() return getdimen(onrightpage() and "leftmarginwidth"     or "rightmarginwidth"   ) * bpfactor end)
108        -- registerdirect("OuterEdgeDistance",    function() return getdimen(onrightpage() and "rightedgedistance"   or "leftedgedistance"   ) * bpfactor end)
109        -- registerdirect("OuterEdgeWidth",       function() return getdimen(onrightpage() and "rightedgewidth"      or "leftedgewidth"      ) * bpfactor end)
110
111        -- These have stable d_ numbers.
112
113        local d_topspace       <const> = isdimen("topspace")       registerdirect("TopSpace",       function() return getdimen(d_topspace)       * bpfactor end)
114        local d_bottomspace    <const> = isdimen("bottomspace")    registerdirect("BottomSpace",    function() return getdimen(d_bottomspace)    * bpfactor end)
115        local d_makeupheight   <const> = isdimen("makeupheight")   registerdirect("MakeupHeight",   function() return getdimen(d_makeupheight)   * bpfactor end)
116        local d_makeupwidth    <const> = isdimen("makeupwidth")    registerdirect("MakeupWidth",    function() return getdimen(d_makeupwidth)    * bpfactor end)
117        local d_topheight      <const> = isdimen("topheight")      registerdirect("TopHeight",      function() return getdimen(d_topheight)      * bpfactor end)
118        local d_topdistance    <const> = isdimen("topdistance")    registerdirect("TopDistance",    function() return getdimen(d_topdistance)    * bpfactor end)
119        local d_headerheight   <const> = isdimen("headerheight")   registerdirect("HeaderHeight",   function() return getdimen(d_headerheight)   * bpfactor end)
120        local d_headerdistance <const> = isdimen("headerdistance") registerdirect("HeaderDistance", function() return getdimen(d_headerdistance) * bpfactor end)
121        local d_textheight     <const> = isdimen("textheight")     registerdirect("TextHeight",     function() return getdimen(d_textheight)     * bpfactor end)
122        local d_footerdistance <const> = isdimen("footerdistance") registerdirect("FooterDistance", function() return getdimen(d_footerdistance) * bpfactor end)
123        local d_footerheight   <const> = isdimen("footerheight")   registerdirect("FooterHeight",   function() return getdimen(d_footerheight)   * bpfactor end)
124        local d_bottomdistance <const> = isdimen("bottomdistance") registerdirect("BottomDistance", function() return getdimen(d_bottomdistance) * bpfactor end)
125        local d_bottomheight   <const> = isdimen("bottomheight")   registerdirect("BottomHeight",   function() return getdimen(d_bottomheight)   * bpfactor end)
126        local d_textwidth      <const> = isdimen("textwidth")      registerdirect("TextWidth",      function() return getdimen(d_textwidth)      * bpfactor end)
127
128end
129
130do
131
132    local d_pagebackgroundoffset <const> = isdimen("pagebackgroundoffset") registerdirect("PageOffset",           function() return getdimen(d_pagebackgroundoffset) * bpfactor end)
133    local d_pagebackgrounddepth  <const> = isdimen("pagebackgrounddepth")  registerdirect("PageDepth",            function() return getdimen(d_pagebackgrounddepth)  * bpfactor end)
134    local c_layoutcolumns        <const> = iscount("layoutcolumns")        registerdirect("LayoutColumns",        function() return getcount(c_layoutcolumns)                   end)
135    local d_layoutcolumndistance <const> = isdimen("layoutcolumndistance") registerdirect("LayoutColumnDistance", function() return getdimen(d_layoutcolumndistance) * bpfactor end)
136    local d_layoutcolumnwidth    <const> = isdimen("layoutcolumnwidth")    registerdirect("LayoutColumnWidth",    function() return getdimen(d_layoutcolumnwidth)    * bpfactor end)
137    local d_spinewidth           <const> = isdimen("spinewidth")           registerdirect("SpineWidth",           function() return getdimen(d_spinewidth)           * bpfactor end)
138    local d_paperbleed           <const> = isdimen("paperbleed")           registerdirect("PaperBleed",           function() return getdimen(d_paperbleed)           * bpfactor end)
139
140end
141
142do
143
144    local c_realpageno    <const> = iscount("realpageno")    registerdirect("RealPageNumber", function() return getcount(c_realpageno)    end)
145    local c_lastpageno    <const> = iscount("lastpageno")    registerdirect("LastPageNumber", function() return getcount(c_lastpageno)    end)
146
147    local c_userpageno    <const> = iscount("userpageno")    registerdirect("PageNumber",     function() return getcount(c_userpageno)    end)
148    local c_lastpageno    <const> = iscount("lastpageno")    registerdirect("NOfPages",       function() return getcount(c_lastpageno)    end)
149
150    local c_subpageno     <const> = iscount("subpageno")     registerdirect("SubPageNumber",  function() return getcount(c_subpageno)     end)
151    local c_lastsubpageno <const> = iscount("lastsubpageno") registerdirect("NOfSubPages",    function() return getcount(c_lastsubpageno) end)
152
153    local c_mofcolumns    <const> = iscount("mofcolumns")    registerdirect("CurrentColumn",  function() return getcount(c_mofcolumns)    end)
154    local c_nofcolumns    <const> = iscount("nofcolumns")    registerdirect("NOfColumns",     function() return getcount(c_nofcolumns)    end)
155
156end
157
158do
159
160    registerdirect("BaseLineSkip",  function() return get("baselineskip",true) * bpfactor end)
161    registerdirect("TopSkip",       function() return get("topskip",true)      * bpfactor end)
162    registerdirect("CurrentWidth",  function() return get("hsize")             * bpfactor end)
163    registerdirect("CurrentHeight", function() return get("vsize")             * bpfactor end)
164    registerdirect("HSize",         function() return get("hsize")             * bpfactor end)
165    registerdirect("VSize",         function() return get("vsize")             * bpfactor end)
166
167    local emwidths  = fonts.hashes.emwidths
168    local exheights = fonts.hashes.exheights
169
170    registerdirect("EmWidth",  function() return emwidths [false] * bpfactor end)
171    registerdirect("ExHeight", function() return exheights[false] * bpfactor end)
172
173    local d_uunit <const> = isdimen("uunit") registerdirect("uunit", function() return getdimen(d_uunit) * bpfactor end)
174
175end
176
177do
178
179    local d_lineheight   <const> = isdimen("lineheight")   registerdirect("LineHeight",   function() return getdimen(d_lineheight)   * bpfactor end)
180    local d_bodyfontsize <const> = isdimen("bodyfontsize") registerdirect("BodyFontSize", function() return getdimen(d_bodyfontsize) * bpfactor end)
181    local d_strutht      <const> = isdimen("strutht")      registerdirect("StrutHeight",  function() return getdimen(d_strutht)      * bpfactor end)
182    local d_strutdp      <const> = isdimen("strutdp")      registerdirect("StrutDepth",   function() return getdimen(d_strutdp)      * bpfactor end)
183
184end
185
186do
187
188    local d_overlay_width        <const> = isdimen("d_overlay_width")        registerdirect("OverlayWidth",        function() return getdimen(d_overlay_width)        * bpfactor end)
189    local d_overlay_height       <const> = isdimen("d_overlay_height")       registerdirect("OverlayHeight",       function() return getdimen(d_overlay_height)       * bpfactor end)
190    local d_overlay_depth        <const> = isdimen("d_overlay_depth")        registerdirect("OverlayDepth",        function() return getdimen(d_overlay_depth)        * bpfactor end)
191    local d_overlay_linewidth    <const> = isdimen("d_overlay_linewidth")    registerdirect("OverlayLineWidth",    function() return getdimen(d_overlay_linewidth)    * bpfactor end)
192    local d_overlay_offset       <const> = isdimen("d_overlay_offset")       registerdirect("OverlayOffset",       function() return getdimen(d_overlay_offset)       * bpfactor end)
193    local d_overlay_mathaxis     <const> = isdimen("d_overlay_mathaxis")     registerdirect("OverlayMathAxis",     function() return getdimen(d_overlay_mathaxis)     * bpfactor end)
194    local d_overlay_mathexheight <const> = isdimen("d_overlay_mathexheight") registerdirect("OverlayMathExHeight", function() return getdimen(d_overlay_mathexheight) * bpfactor end)
195    local d_overlay_mathemwidth  <const> = isdimen("d_overlay_mathemwidth")  registerdirect("OverlayMathEmWidth",  function() return getdimen(d_overlay_mathemwidth)  * bpfactor end)
196
197    registerdirect("OverlayRegion",    function() return getmacro("m_overlay_region") end)
198    registerdirect("CurrentLayout",    function() return getmacro("currentlayout")    end)
199    registerdirect("OverlayColor",     function() return getmacro("overlaycolor")     end)
200    registerdirect("OverlayLineColor", function() return getmacro("overlaylinecolor") end)
201
202end
203
204do
205
206    registerdirect("LastChangedLayoutPage",function() return getcount("c_page_layouts_changed") end)
207    registerdirect("SwapMarginDimensions", function() token.expandmacro("swapmargindimensions") end)
208
209    registerdirect("PageFraction",     structures.pages.fraction)
210    registerdirect("OnRightPage",      structures.pages.on_right)
211    registerdirect("OnOddPage",        structures.pages.is_odd)
212    registerdirect("InPageBody",       structures.pages.in_body)
213    --------------("LayoutHasChanged", structures.pages.has_changed)
214
215end
216
217do
218
219    local function defaultcolormodel() -- can be helper
220        local colormethod = getcount("MPcolormethod")
221        return (colormethod == 0 or colormethod == 1) and 1 or 3
222    end
223
224    registerdirect("defaultcolormodel", defaultcolormodel)
225
226end
227
228do
229
230    -- see node-rul.*
231    -- offset is a multiplier
232    -- factor is the amount
233
234    -- TODO: dimensions are yet undefined so we will move this
235
236    registerdirect("RuleWidth",     function() return getdimen("d_rule_width")  * bpfactor end)
237    registerdirect("RuleHeight",    function() return getdimen("d_rule_height") * bpfactor end)
238    registerdirect("RuleDepth",     function() return getdimen("d_rule_depth")  * bpfactor end)
239    registerdirect("RuleH",         function() return getdimen("d_rule_h")      * bpfactor end)
240    registerdirect("RuleV",         function() return getdimen("d_rule_v")      * bpfactor end)
241    registerdirect("RuleThickness", function() return getdimen("d_rule_line")   * bpfactor end)
242    registerdirect("RuleOffset",    function() return getdimen("d_rule_offset") / 65536    end) -- not factor
243    registerdirect("RuleDirection", function() return getmacro("m_rule_direction")         end)
244    registerdirect("RuleFactor",    function() return getdimen("d_rule_factor") * bpfactor end)
245    registerdirect("RuleOption",    function() return getmacro("m_rule_option")            end)
246    registerscript("RuleColor",     function() return getmacro("m_rule_color")             end)
247
248end
249
250-- see typo-ada.*
251
252do
253
254    local d_adaptive_width  <const> = isdimen("d_adaptive_width")  registerdirect("AdaptiveWidth",     function() return getdimen(d_adaptive_width)  * bpfactor end)
255    local d_adaptive_height <const> = isdimen("d_adaptive_height") registerdirect("AdaptiveHeight",    function() return getdimen(d_adaptive_height) * bpfactor end)
256    local d_adaptive_depth  <const> = isdimen("d_adaptive_depth")  registerdirect("AdaptiveDepth",     function() return getdimen(d_adaptive_depth)  * bpfactor end)
257    local d_adaptive_line   <const> = isdimen("d_adaptive_line")   registerdirect("AdaptiveThickness", function() return getdimen(d_adaptive_line)   * bpfactor end)
258                                                                   registerdirect("AdaptiveColor",     function() return getmacro("m_adaptive_color")           end)
259
260    registerdirect("AdaptiveTotal", function()
261        return (getdimen(d_adaptive_height) + getdimen(d_adaptive_depth)) * bpfactor
262    end)
263
264end
265