node-rul.mkiv /size: 19 Kb    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=node-rul,
3%D        version=2009.11.03, % 1995.10.10,
4%D          title=\CONTEXT\ Core Macros,
5%D       subtitle=Bars,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14% todo: ex and and em traveling with attribute
15% todo: this will move to typo-rul + ctxcommands
16
17\writestatus{loading}{ConTeXt Core Macros / Bars}
18
19%D \macros
20%D   {underbar,underbars,
21%D    overbar,overbars,
22%D    overstrike,overstrikes,
23%D    setupbar}
24%D
25%D In the rare case that we need undelined words, for instance because all font
26%D alternatives are already in use, one can use \type {\underbar} and \type
27%D {\overstrike} and their plural forms.
28%D
29%D \startbuffer
30%D \underbars {drawing \underbar{bars} under words is a typewriter leftover}
31%D \overstrikes {striking words makes them \overstrike {unreadable} but
32%D sometimes even \overbar {top lines} come into view.}
33%D \stopbuffer
34%D
35%D \typebuffer
36%D
37%D \startlines
38%D \getbuffer
39%D \stoplines
40%D
41%D The formal definitions are:
42%D
43%D \showsetup{underbar}
44%D \showsetup{underbars}
45%D \showsetup{overbar}
46%D \showsetup{overbars}
47%D \showsetup{overstrike}
48%D \showsetup{overstrikes}
49%D
50%D \showsetup{setupbars}
51%D
52%D Units can be any normal \TEX\ unit:
53%D
54%D \startbuffer
55%D \setupbars[unit=mm,rulethickness=1]     bar\startbar[underbar]foo\stopbar bar\blank
56%D \setupbars[unit=ex,rulethickness=1]     bar\startbar[underbar]foo\stopbar bar\blank
57%D \setupbars[unit=pt,rulethickness=1]     bar\startbar[underbar]foo\stopbar bar\blank
58%D \setupbars[unit=pt,rulethickness=10pt]  bar\startbar[underbar]foo\stopbar bar
59%D \stopbuffer
60%D
61%D \typebuffer \blank \getbuffer \blank
62%D
63%D As with many early usage of \LUA\ in \MKIV\ this mechanism explores a way
64%D to deal with local settings at the \TEX\ end and remembering parameters
65%D at the \LUA\ end. We might do things differently now, but as settings normally
66%D don't change that often, we're not in a hurry to do that now. The problem at
67%D the \LUA\ end is that we don't know when to clean up.
68
69\unprotect
70
71%definesystemattribute[ruled]
72%definesystemattribute[shifted]
73
74\registerctxluafile{node-rul}{optimize}
75
76\installcorenamespace{bar}
77\installcorenamespace{barindex}
78\installcorenamespace{barattribute}
79\installcorenamespace{barstack}
80
81\installcommandhandler \??bar {bar} \??bar
82
83\newtoks\t_node_rules_checklist
84
85\let\c_node_rules_index\relax % temporary synonym
86\let\p_node_rules_color\empty
87
88\let\setupbars\setupbar
89
90\appendtoks
91    \ifsecondargument
92        \node_rules_define
93    \else
94        \the\t_node_rules_checklist
95    \fi
96\to \everysetupbar
97
98\appendtoks
99    \ifcsname\??barindex\currentbar\endcsname
100        \lastnamedcs\zerocount
101    \else
102        \expandafter\newcount\csname\??barindex\currentbar\endcsname
103    \fi
104  % \normalexpanded{\t_node_rules_checklist{\node_rules_redefine{\currentbar}\the\t_node_rules_checklist}}%
105    \normalexpanded{\t_node_rules_checklist{\the\t_node_rules_checklist\relax\node_rules_redefine{\currentbar}}}%
106  % \etoksapp\t_node_rules_checklist{\node_rules_redefine{\currentbar}}%
107    \node_rules_define
108    \setuevalue\currentbar{\node_rules_direct{\currentbar}}%
109\to \everydefinebar
110
111\newbox\b_node_rules
112
113\unexpanded\def\node_rules_define
114  {\edef\p_node_rules_color{\barparameter\c!color}%
115   \edef\p_node_text{\barparameter\c!text}%
116   \ifx\p_node_text\empty\else
117     \setbox\b_node_rules\hbox{\p_node_text}%
118   \fi
119   \setevalue{\??barattribute\currentbar}{\number
120     \clf_definerule
121        continue      {\barparameter\c!continue}%
122        unit          {\barparameter\c!unit}%
123        order         {\barparameter\c!order}%
124        rulethickness {\barparameter\c!rulethickness}%
125        method        \barparameter\c!method
126        max           \barparameter\c!max\space % number
127        mp           {\includeMPgraphic{\barparameter\c!mp}}
128        ma            \thecolormodelattribute
129        ca            \thecolorattribute\p_node_rules_color
130        ta            \thetransparencyattribute\p_node_rules_color
131        offset        \barparameter\c!offset\space % number
132        dy            \barparameter\c!dy\space % number
133        empty        {\barparameter\c!empty}%
134     \ifx\p_node_text\empty\else
135        % not that useful and efficient, more for testing something
136        text         \b_node_rules
137        repeat       {\barparameter\c!repeat}%
138     \fi
139     \relax}}
140
141\unexpanded\def\node_rules_redefine#1%
142  {\def\currentbar{#1}\node_rules_define}
143
144\unexpanded\def\node_rules_direct#1%
145  {\groupedcommand
146     {\node_rules_set{#1}\barparameter\c!left}%
147     {\relax\barparameter\c!right}}
148
149\unexpanded\def\inlinebar[#1]%
150  {\node_rules_direct{#1}}
151
152% \unexpanded\def\inlinecurrentbar
153%   {\node_rules_direct{\currentbar}}
154
155% store in properties
156
157\unexpanded\def\node_rules_set#1% maybe reverse the 1000 (also maybe use more attributes instead of settings)
158  {\edef\currentbar{#1}%
159   \usebarstyleandcolor\c!foregroundstyle\c!foregroundcolor
160   % maybe: \usebarstyleandcolor\c!textgroundstyle\c!textcolor
161   % todo: move this to lua .. we callout anyway
162   \expandafter\let\expandafter\c_node_rules_index\csname\??barindex#1\endcsname
163   \advance\c_node_rules_index\plusone
164   \clf_enablerules % will be relaxed
165   \c_attr_ruled\numexpr
166      \plusthousand*\c_node_rules_index
167      % optimizing this one needs testing
168     +\csname\??barattribute#1\ifcsname\??bar#1:\number\c_node_rules_index\s!parent\endcsname:\number\c_node_rules_index\fi\endcsname
169   \relax}
170
171\unexpanded\def\resetbar
172  {\c_attr_ruled\attributeunsetvalue}
173
174\unexpanded\def\nobar
175  {\groupedcommand
176     {\resetbar\barparameter\c!left}%
177     {\relax\barparameter\c!right}}
178
179\unexpanded\def\startbar[#1]%
180  {\begingroup
181   \node_rules_set{#1}%
182   \ignorespaces
183   \barparameter\c!left}
184
185\unexpanded\def\stopbar
186  {\removeunwantedspaces
187   \barparameter\c!right
188   \endgroup}
189
190\unexpanded\def\setbar[#1]%
191  {\node_rules_set{#1}}
192
193\let\directsetbar\node_rules_set
194
195% ungrouped
196
197\newcount\c_node_rules_nesting % todo: same as colors
198
199\unexpanded\def\pushbar[#1]%
200  {\global\advance\c_node_rules_nesting\plusone
201   \expandafter\edef\csname\??barstack\number\c_node_rules_nesting\endcsname{\c_attr_ruled\the\c_attr_ruled}%
202   \node_rules_set{#1}}
203
204\unexpanded\def\popbar
205  {\csname\??barstack\number\c_node_rules_nesting\endcsname
206   \global\advance\c_node_rules_nesting\minusone}
207
208\setupbars
209  [\c!method=0,                 % new: 0=center nested, 1=stack nested
210   \c!continue=\v!no,
211   \c!empty=,                   % new: yes = hide text
212   \c!offset=0,                 % upwards, replaces: topoffset bottomoffset
213   \c!dy=0,
214   \c!max=3,
215   \c!style=,
216   \c!rulethickness=.1,
217   \c!order=\v!foreground,
218   \c!unit=ex,                  % so now we are relative
219   \c!color=]                   % replaces: rulecolor
220
221% \definebar[touchbar]    [\c!method=0,\c!dy=-0.4,\c!offset=-0.0]
222% \definebar[touchbars]   [touchbar]   [\c!continue=\v!yes]
223
224\pushoverloadmode
225
226\let\normalmathoverbar    \overbar
227\let\normalmathunderbar   \underbar
228\let\normalmathoverstrike \overstrike
229\let\normalmathunderstrike\understrike
230
231\definebar[\v!overbar]   [\c!method=1,\c!dy=0.4,\c!offset=1.8,\c!continue=\v!yes]
232\definebar[\v!underbar]  [\c!method=1,\c!dy=-0.4,\c!offset=-0.3,\c!continue=\v!yes]
233\definebar[\v!overstrike][\c!method=0,\c!dy=0.4,\c!offset=0.5,\c!continue=\v!yes]
234
235\popoverloadmode
236
237\definebar
238  [\v!understrike]
239  [\c!method=0,
240   \c!offset=1.375,
241   \c!rulethickness=2.5,
242   \c!continue=\v!yes,
243   \c!order=\v!background,
244   \c!color=lightgray]
245
246\definebar[\v!overbars]    [\v!overbar]    [\c!continue=\v!no]
247\definebar[\v!underbars]   [\v!underbar]   [\c!continue=\v!no]
248\definebar[\v!overstrikes] [\v!overstrike] [\c!continue=\v!no]
249\definebar[\v!understrikes][\v!understrike][\c!continue=\v!no]
250
251\definebar
252  [\v!hiddenbar]
253  [\v!underbar]
254  [\c!continue=\v!yes,
255   \c!empty=\v!yes,
256   \c!left=\zwj,
257   \c!right=\zwj]
258
259% \setupbar[\v!overstrike][continue=all]
260
261% we want these always so ...
262
263\ifdefined\normalmathunderbar
264    \expandafter\let\expandafter\normaltextunderbar\csname\v!underbar\endcsname
265    \unexpanded\def\underbar{\mathortext\normalmathunderbar\normaltextunderbar}
266\else
267    \expandafter\let\expandafter\underbar\csname\v!underbar\endcsname
268\fi
269
270\ifdefined\normalmathoverbar
271    \expandafter\let\expandafter\normaltextoverbar\csname\v!overbar\endcsname
272    \unexpanded\def\overbar{\mathortext\normalmathoverbar\normaltextoverbar}
273\else
274    \expandafter\let\expandafter\overbar\csname\v!overbar\endcsname
275\fi
276
277\ifdefined\normalmathunderstrike
278    \expandafter\let\expandafter\normaltextunderstrike\csname\v!understrike\endcsname
279    \unexpanded\def\understrike{\mathortext\normalmathunderstrike\normaltextunderstrike}
280\else
281    \expandafter\let\expandafter\understrike\csname\v!understrike\endcsname
282\fi
283
284\ifdefined\normalmathoverstrike
285    \expandafter\let\expandafter\normaltextoverstrike\csname\v!overstrike\endcsname
286    \unexpanded\def\overstrike{\mathortext\normalmathoverstrike \normaltextoverstrike}
287\else
288    \expandafter\let\expandafter\overstrike\csname\v!overstrike\endcsname
289\fi
290
291\expandafter\let\expandafter\overstrikes\csname\v!overstrikes\endcsname
292\expandafter\let\expandafter\underbars  \csname\v!underbars  \endcsname
293\expandafter\let\expandafter\overbars   \csname\v!overbars   \endcsname
294
295\unexpanded\def\setupunderbar[#1]% too incompatible for the moment
296  {}
297
298%D An experimental new feature:
299%D
300%D \startbuffer
301%D test {\red\underrandoms{test me}} and \underrandom{test} or \underrandom{grep} \blank
302%D test {\red\underdashes {test me}} and \underdash  {test} or \underdash  {grep} \blank
303%D test {\red\underdots   {test me}} and \underdot   {test} or \underdot   {grep} \blank
304%D \stopbuffer
305%D
306%D \typebuffer \getbuffer
307
308\startuseMPgraphic{rules:under:random}
309    draw
310        ((0,RuleDepth) ... (RuleWidth,RuleDepth)) randomized (4*RuleThickness)
311        shifted (0,RuleFactor*RuleOffset)
312        withpen pencircle scaled RuleThickness
313        withcolor RuleColor ;
314    setbounds currentpicture to unitsquare xysized(RuleWidth,RuleHeight) ;
315\stopuseMPgraphic
316
317\startuseMPgraphic{rules:under:dash}
318    draw
319        ((0,RuleDepth) -- (RuleWidth,RuleDepth))
320        shifted (0,RuleFactor*RuleOffset)
321        dashed dashpattern(on RuleFactor/2 off RuleFactor/2)
322        withpen pencircle scaled RuleThickness
323        withcolor RuleColor ;
324    setbounds currentpicture to unitsquare xysized(RuleWidth,RuleHeight) ;
325\stopuseMPgraphic
326
327\startuseMPgraphic{rules:under:dots}
328    path p ; p := (0,RuleDepth) -- (RuleWidth,RuleDepth) ;
329    numeric l ; l := arclength(p);
330    l := l mod RuleThickness/4;
331    draw
332        p
333        shifted (l,RuleFactor*RuleOffset)
334        dashed dashpattern(off 2RuleThickness+l on 0 off 2RuleThickness)
335        withpen pencircle scaled 2RuleThickness
336        withcolor RuleColor ;
337    setbounds currentpicture to unitsquare xysized(RuleWidth,RuleHeight) ;
338\stopuseMPgraphic
339
340\definebar
341  [undergraphic]
342  [\c!mp=rules:under:dash,
343   \c!offset=-.2,
344   \c!continue=\v!yes,
345   \c!order=\v!background]
346
347\definebar[underrandom] [undergraphic][\c!mp=rules:under:random]
348\definebar[underrandoms][underrandom] [\c!continue=\v!no]
349
350\definebar[underdash]   [undergraphic][\c!mp=rules:under:dash]
351\definebar[underdashes] [underdash]   [\c!continue=\v!no]
352
353\definebar[underdot]    [undergraphic][\c!mp=rules:under:dots]
354\definebar[underdots]   [underdot]    [\c!continue=\v!no]
355
356%D This will move: (a bit duplicated)
357
358\installcorenamespace{shift}
359\installcorenamespace{shiftindex}
360\installcorenamespace{shiftattribute}
361
362\installcommandhandler \??shift {shift} \??shift
363
364\newtoks\t_node_shifts_checklist
365
366\let\c_node_shifts_index\relax % temporary synonym
367
368\let\setupshifts\setupshift
369
370\appendtoks
371    \ifsecondargument
372        \node_shifts_define
373    \else
374        \the\t_node_shifts_checklist
375    \fi
376\to \everysetupshift
377
378\appendtoks
379    \ifcsname\??shiftindex\currentshift\endcsname
380        \lastnamedcs\zerocount
381    \else
382        \expandafter\newcount\csname\??shiftindex\currentshift\endcsname
383    \fi
384    \normalexpanded{\t_node_shifts_checklist{\the\t_node_shifts_checklist\node_shifts_redefine{\currentshift}}}% order ?
385    \node_shifts_define
386    \setuevalue\currentshift{\node_shifts_direct{\currentshift}}%
387\to \everydefineshift
388
389\unexpanded\def\node_shifts_define
390  {\setevalue{\??shiftattribute\currentshift}{\number
391   \clf_defineshift
392     continue {\shiftparameter\c!continue}%
393     unit     {\shiftparameter\c!unit}%
394     method    \shiftparameter\c!method
395     dy        \shiftparameter\c!dy % number
396   \relax}}
397
398\unexpanded\def\node_shifts_redefine#1%
399  {\def\currentshift{#1}\node_shifts_define}
400
401% \unexpanded\def\node_shifts_set
402%   {\clf_enableshifts
403%    \glet\node_shifts_set\node_shifts_set_indeed
404%    \node_shifts_set}
405%
406% \def\node_shifts_set_indeed#1% todo: check parent !
407
408\unexpanded\def\node_shifts_set#1% todo: check parent ! todo: move attr etc to lua
409  {\def\currentshift{#1}%
410   \expandafter\let\expandafter\c_node_shifts_index\csname\??shiftindex#1\endcsname
411   \advance\c_node_shifts_index\plusone
412   \clf_enableshifts % will be relaxed
413   \c_attr_shifted\numexpr
414      \plusthousand*\c_node_shifts_index
415     +\csname\??shiftattribute#1\ifcsname\??shift#1:\number\c_node_shifts_index\s!parent\endcsname:\number\c_node_shifts_index\fi\endcsname
416   \relax
417   \useshiftstyleandcolor\c!style\c!color
418   \dosetupisolatedalign{\shiftparameter\c!align}} % weird feature that i probably needed once
419
420\unexpanded\def\startshift[#1]%
421  {\begingroup
422   \node_shifts_set{#1}%
423   \ignorespaces}
424
425\unexpanded\def\stopshift
426  {\removeunwantedspaces
427   \endgroup}
428
429% \unexpanded\def\node_shifts_direct#1%
430%   {\doisolatedgroupedalign{\node_shifts_set{#1}}\donothing}
431
432\unexpanded\def\node_shifts_direct#1%
433  {\groupedcommand
434     {\begingroup\dostartisolation\begingroup\node_shifts_set{#1}\ignorespaces}
435     {\removeunwantedspaces\endgroup\dostopisolation\endgroup}}
436
437\setupshifts
438  [\c!method=0,
439   \c!continue=\v!no,
440   \c!dy=0,
441   \c!unit=ex,
442   \c!align=,
443   \c!style=,
444   \c!color=]
445
446\defineshift [\v!shiftup]   [\c!method=0,\c!dy=-1,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=]
447\defineshift [\v!shiftdown] [\c!method=1,\c!dy=.3,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=]
448
449% we want these always so ...
450
451\expandafter\let\expandafter\shiftup   \csname\v!shiftup   \endcsname
452\expandafter\let\expandafter\shiftdown \csname\v!shiftdown \endcsname
453
454% This is a weird helper:
455
456\unexpanded\def\dostartisolation{\signalcharacter}
457\unexpanded\def\dostopisolation {\signalcharacter}
458\unexpanded\def\doisolator      {\signalcharacter}
459
460\unexpanded\def\dosetupisolatedalign#1%
461  {\doisolator
462   \setupalign[#1]\relax}
463
464\unexpanded\def\doisolatedgroupedalign#1#2%
465  {\groupedcommand
466     {\begingroup\dostartisolation\begingroup#1}
467     {#2\endgroup\dostopisolation\endgroup}}
468
469%D More rules.
470
471% The following code rocks and was written with the Toto Live in Poland bluray
472% in loop mode on my 5.1 surround development setup (the Toto lineup with Simon
473% Phillips on drums). The Amsterdam concert is equally energizing.
474
475\installcorenamespace{linefiller}
476\installcorenamespace{linefillerindex}
477\installcorenamespace{linefillerattribute}
478
479\installcommandhandler \??linefiller {linefiller} \??linefiller
480
481\definesystemattribute[linefiller][public]
482
483\newtoks\t_node_linefiller_checklist
484
485\let\c_node_linefiller_index\relax % temporary synonym
486
487\let\setuplinefillers\setuplinefiller
488
489\appendtoks
490    \ifsecondargument
491        \node_linefiller_define
492    \else
493        \the\t_node_linefiller_checklist
494    \fi
495\to \everysetuplinefiller
496
497\appendtoks
498    \ifcsname\??linefillerindex\currentlinefiller\endcsname
499        \lastnamedcs\zerocount
500    \else
501        \expandafter\newcount\csname\??linefillerindex\currentlinefiller\endcsname
502    \fi
503    \etoksapp\t_node_linefiller_checklist{\t_node_linefiller_checklist\node_linefiller_redefine{\currentlinefiller}}%
504    \node_linefiller_define
505\to \everydefinelinefiller
506
507\unexpanded\def\node_linefiller_define
508  {\edef\p_node_rules_color{\linefillerparameter\c!color}%
509   \setevalue{\??linefillerattribute\currentlinefiller}{\number
510   \clf_definelinefiller
511    %method         \linefillerparameter\c!method
512     location      {\linefillerparameter\c!location}%
513     scope         {\linefillerparameter\c!scope}%
514     mp            {\includeMPgraphic{\linefillerparameter\c!mp}}%
515     ma             \thecolormodelattribute
516     ca             \thecolorattribute\p_node_rules_color
517     ta             \thetransparencyattribute\p_node_rules_color
518     height         \dimexpr\linefillerparameter\c!height\relax
519     depth          \dimexpr\linefillerparameter\c!depth\relax
520     distance       \dimexpr\linefillerparameter\c!distance\relax
521     threshold      \dimexpr\linefillerparameter\c!threshold\relax
522     rulethickness  \dimexpr\linefillerparameter\c!rulethickness\relax
523   \relax}}
524
525\unexpanded\def\node_linefiller_redefine#1%
526  {\def\currentlinefiller{#1}\node_linefiller_define}
527
528\unexpanded\def\node_linefiller_set#1% todo: check parent ! todo: move attr etc to lua
529  {\def\currentlinefiller{#1}%
530   \expandafter\let\expandafter\c_node_linefiller_index\csname\??linefillerindex#1\endcsname
531   \advance\c_node_linefiller_index\plusone
532   \clf_enablelinefillers
533   \c_attr_linefiller\numexpr
534      \plusthousand*\c_node_linefiller_index
535     +\csname\??linefillerattribute#1\ifcsname\??linefiller#1:\number\c_node_linefiller_index\s!parent\endcsname:\number\c_node_linefiller_index\fi\endcsname
536   \relax}
537
538\unexpanded\def\startlinefiller
539  {\dodoubleempty\node_linefiller_start}
540
541\unexpanded\def\node_linefiller_start[#1][#2]%
542  {\begingroup
543   \par
544   \def\currentlinefiller{#1}%
545   \ifsecondargument
546     % we need to update settings
547     \setuplinefiller[#1][#2]% no \setupcurrentlinefiller as we need to update settings
548   \fi
549   \node_linefiller_set{#1}%
550   \linefillerparameter\c!before
551   \usealignparameter\linefillerparameter
552   \uselinefillerstyleandcolor\c!textstyle\c!textcolor} % bars have foregroundcolor
553
554\unexpanded\def\stoplinefiller
555  {\par
556   \linefillerparameter\c!after
557   \endgroup}
558
559\unexpanded\def\setlinefiller[#1]%
560  {\node_linefiller_set{#1}}
561
562\setuplinefillers
563  [%c!method=0,
564   %c!mp=,
565   \c!location=\v!both,
566   \c!scope=\v!local,
567   \c!distance=\zeropoint,
568   \c!threshold=\zeropoint,
569   \c!rulethickness=\linewidth,
570   \c!height=\linewidth,
571   \c!depth=\zeropoint,
572  %\c!textcolor=,
573  %\c!textstyle=,
574  %\c!align=,
575  %\c!before=,
576  %\c!after=,
577   \c!color=]
578
579\definelinefiller
580  [filler]
581  [\c!height=.75\exheight,
582  %\c!mp=rules:filler:demo,
583  %\c!threshold=.25\emwidth,
584   \c!distance=.25\emwidth,
585   \c!rulethickness=.25\exheight]
586
587%D Bonus:
588%D
589%D \starttyping
590%D \startuseMPgraphic{foo}
591%D     fill unitsquare
592%D         xyscaled (RuleWidth,RuleHeight+RuleDepth) enlarged (ExHeight/4,ExHeight/8)
593%D         shifted  (-ExHeight/8,ExHeight/16)
594%D         withcolor RuleColor ;
595%D \stopuseMPgraphic
596%D
597%D \definelinefiller[foo][mp=foo,color=darkred]
598%D
599%D \linefillerhbox[foo]{OEPS}
600%D \stoptyping
601
602\unexpanded\def\node_backgrounds_filler_box#1#2[#3]%
603  {\bgroup
604   \clf_enablebackgroundboxes
605   \dowithnextbox{%
606     \node_linefiller_set{#3}% already sets the attribute
607     #1%
608        attr \backgroundattribute \plusone
609      % attr \linefillerattribute \the\c_attr_linefiller
610       {\box\nextbox}%
611     \egroup}%
612   #2}
613
614\unexpanded\def\linefillerhbox{\node_backgrounds_filler_box\hpack\hbox}
615\unexpanded\def\linefillervbox{\node_backgrounds_filler_box\vpack\vbox}
616\unexpanded\def\linefillervtop{\node_backgrounds_filler_box\tpack\vtop}
617
618%D Bonus:
619
620\unexpanded\def\autorule{\clf_autorule}
621
622\protect \endinput
623