node-rul.mkiv /size: 19 Kb    last modification: 2021-10-28 13:50
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!order=\v!background]
345
346\definebar[underrandom] [undergraphic][\c!mp=rules:under:random]
347\definebar[underrandoms][underrandom] [\c!continue=\v!yes]
348
349\definebar[underdash]   [undergraphic][\c!mp=rules:under:dash]
350\definebar[underdashes] [underdash]   [\c!continue=\v!yes]
351
352\definebar[underdot]    [undergraphic][\c!mp=rules:under:dots]
353\definebar[underdots]   [underdot]    [\c!continue=\v!yes]
354
355%D This will move: (a bit duplicated)
356
357\installcorenamespace{shift}
358\installcorenamespace{shiftindex}
359\installcorenamespace{shiftattribute}
360
361\installcommandhandler \??shift {shift} \??shift
362
363\newtoks\t_node_shifts_checklist
364
365\let\c_node_shifts_index\relax % temporary synonym
366
367\let\setupshifts\setupshift
368
369\appendtoks
370    \ifsecondargument
371        \node_shifts_define
372    \else
373        \the\t_node_shifts_checklist
374    \fi
375\to \everysetupshift
376
377\appendtoks
378    \ifcsname\??shiftindex\currentshift\endcsname
379        \lastnamedcs\zerocount
380    \else
381        \expandafter\newcount\csname\??shiftindex\currentshift\endcsname
382    \fi
383    \normalexpanded{\t_node_shifts_checklist{\the\t_node_shifts_checklist\node_shifts_redefine{\currentshift}}}% order ?
384    \node_shifts_define
385    \setuevalue\currentshift{\node_shifts_direct{\currentshift}}%
386\to \everydefineshift
387
388\unexpanded\def\node_shifts_define
389  {\setevalue{\??shiftattribute\currentshift}{\number
390   \clf_defineshift
391     continue {\shiftparameter\c!continue}%
392     unit     {\shiftparameter\c!unit}%
393     method    \shiftparameter\c!method
394     dy        \shiftparameter\c!dy % number
395   \relax}}
396
397\unexpanded\def\node_shifts_redefine#1%
398  {\def\currentshift{#1}\node_shifts_define}
399
400% \unexpanded\def\node_shifts_set
401%   {\clf_enableshifts
402%    \glet\node_shifts_set\node_shifts_set_indeed
403%    \node_shifts_set}
404%
405% \def\node_shifts_set_indeed#1% todo: check parent !
406
407\unexpanded\def\node_shifts_set#1% todo: check parent ! todo: move attr etc to lua
408  {\def\currentshift{#1}%
409   \expandafter\let\expandafter\c_node_shifts_index\csname\??shiftindex#1\endcsname
410   \advance\c_node_shifts_index\plusone
411   \clf_enableshifts % will be relaxed
412   \c_attr_shifted\numexpr
413      \plusthousand*\c_node_shifts_index
414     +\csname\??shiftattribute#1\ifcsname\??shift#1:\number\c_node_shifts_index\s!parent\endcsname:\number\c_node_shifts_index\fi\endcsname
415   \relax
416   \useshiftstyleandcolor\c!style\c!color
417   \dosetupisolatedalign{\shiftparameter\c!align}} % weird feature that i probably needed once
418
419\unexpanded\def\startshift[#1]%
420  {\begingroup
421   \node_shifts_set{#1}%
422   \ignorespaces}
423
424\unexpanded\def\stopshift
425  {\removeunwantedspaces
426   \endgroup}
427
428% \unexpanded\def\node_shifts_direct#1%
429%   {\doisolatedgroupedalign{\node_shifts_set{#1}}\donothing}
430
431\unexpanded\def\node_shifts_direct#1%
432  {\groupedcommand
433     {\begingroup\dostartisolation\begingroup\node_shifts_set{#1}\ignorespaces}
434     {\removeunwantedspaces\endgroup\dostopisolation\endgroup}}
435
436\setupshifts
437  [\c!method=0,
438   \c!continue=\v!no,
439   \c!dy=0,
440   \c!unit=ex,
441   \c!align=,
442   \c!style=,
443   \c!color=]
444
445\defineshift [\v!shiftup]   [\c!method=0,\c!dy=-1,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=]
446\defineshift [\v!shiftdown] [\c!method=1,\c!dy=.3,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=]
447
448% we want these always so ...
449
450\expandafter\let\expandafter\shiftup   \csname\v!shiftup   \endcsname
451\expandafter\let\expandafter\shiftdown \csname\v!shiftdown \endcsname
452
453% This is a weird helper:
454
455\unexpanded\def\dostartisolation{\signalcharacter}
456\unexpanded\def\dostopisolation {\signalcharacter}
457\unexpanded\def\doisolator      {\signalcharacter}
458
459\unexpanded\def\dosetupisolatedalign#1%
460  {\doisolator
461   \setupalign[#1]\relax}
462
463\unexpanded\def\doisolatedgroupedalign#1#2%
464  {\groupedcommand
465     {\begingroup\dostartisolation\begingroup#1}
466     {#2\endgroup\dostopisolation\endgroup}}
467
468%D More rules.
469
470% The following code rocks and was written with the Toto Live in Poland bluray
471% in loop mode on my 5.1 surround development setup (the Toto lineup with Simon
472% Phillips on drums). The Amsterdam concert is equally energizing.
473
474\installcorenamespace{linefiller}
475\installcorenamespace{linefillerindex}
476\installcorenamespace{linefillerattribute}
477
478\installcommandhandler \??linefiller {linefiller} \??linefiller
479
480\definesystemattribute[linefiller][public]
481
482\newtoks\t_node_linefiller_checklist
483
484\let\c_node_linefiller_index\relax % temporary synonym
485
486\let\setuplinefillers\setuplinefiller
487
488\appendtoks
489    \ifsecondargument
490        \node_linefiller_define
491    \else
492        \the\t_node_linefiller_checklist
493    \fi
494\to \everysetuplinefiller
495
496\appendtoks
497    \ifcsname\??linefillerindex\currentlinefiller\endcsname
498        \lastnamedcs\zerocount
499    \else
500        \expandafter\newcount\csname\??linefillerindex\currentlinefiller\endcsname
501    \fi
502    \etoksapp\t_node_linefiller_checklist{\t_node_linefiller_checklist\node_linefiller_redefine{\currentlinefiller}}%
503    \node_linefiller_define
504\to \everydefinelinefiller
505
506\unexpanded\def\node_linefiller_define
507  {\edef\p_node_rules_color{\linefillerparameter\c!color}%
508   \setevalue{\??linefillerattribute\currentlinefiller}{\number
509   \clf_definelinefiller
510    %method         \linefillerparameter\c!method
511     location      {\linefillerparameter\c!location}%
512     scope         {\linefillerparameter\c!scope}%
513     mp            {\includeMPgraphic{\linefillerparameter\c!mp}}%
514     ma             \thecolormodelattribute
515     ca             \thecolorattribute\p_node_rules_color
516     ta             \thetransparencyattribute\p_node_rules_color
517     height         \dimexpr\linefillerparameter\c!height\relax
518     depth          \dimexpr\linefillerparameter\c!depth\relax
519     distance       \dimexpr\linefillerparameter\c!distance\relax
520     threshold      \dimexpr\linefillerparameter\c!threshold\relax
521     rulethickness  \dimexpr\linefillerparameter\c!rulethickness\relax
522   \relax}}
523
524\unexpanded\def\node_linefiller_redefine#1%
525  {\def\currentlinefiller{#1}\node_linefiller_define}
526
527\unexpanded\def\node_linefiller_set#1% todo: check parent ! todo: move attr etc to lua
528  {\def\currentlinefiller{#1}%
529   \expandafter\let\expandafter\c_node_linefiller_index\csname\??linefillerindex#1\endcsname
530   \advance\c_node_linefiller_index\plusone
531   \clf_enablelinefillers
532   \c_attr_linefiller\numexpr
533      \plusthousand*\c_node_linefiller_index
534     +\csname\??linefillerattribute#1\ifcsname\??linefiller#1:\number\c_node_linefiller_index\s!parent\endcsname:\number\c_node_linefiller_index\fi\endcsname
535   \relax}
536
537\unexpanded\def\startlinefiller
538  {\dodoubleempty\node_linefiller_start}
539
540\unexpanded\def\node_linefiller_start[#1][#2]%
541  {\begingroup
542   \par
543   \def\currentlinefiller{#1}%
544   \ifsecondargument
545     % we need to update settings
546     \setuplinefiller[#1][#2]% no \setupcurrentlinefiller as we need to update settings
547   \fi
548   \node_linefiller_set{#1}%
549   \linefillerparameter\c!before
550   \usealignparameter\linefillerparameter
551   \uselinefillerstyleandcolor\c!textstyle\c!textcolor} % bars have foregroundcolor
552
553\unexpanded\def\stoplinefiller
554  {\par
555   \linefillerparameter\c!after
556   \endgroup}
557
558\unexpanded\def\setlinefiller[#1]%
559  {\node_linefiller_set{#1}}
560
561\setuplinefillers
562  [%c!method=0,
563   %c!mp=,
564   \c!location=\v!both,
565   \c!scope=\v!local,
566   \c!distance=\zeropoint,
567   \c!threshold=\zeropoint,
568   \c!rulethickness=\linewidth,
569   \c!height=\linewidth,
570   \c!depth=\zeropoint,
571  %\c!textcolor=,
572  %\c!textstyle=,
573  %\c!align=,
574  %\c!before=,
575  %\c!after=,
576   \c!color=]
577
578\definelinefiller
579  [filler]
580  [\c!height=.75\exheight,
581  %\c!mp=rules:filler:demo,
582  %\c!threshold=.25\emwidth,
583   \c!distance=.25\emwidth,
584   \c!rulethickness=.25\exheight]
585
586%D Bonus:
587%D
588%D \starttyping
589%D \startuseMPgraphic{foo}
590%D     fill unitsquare
591%D         xyscaled (RuleWidth,RuleHeight+RuleDepth) enlarged (ExHeight/4,ExHeight/8)
592%D         shifted  (-ExHeight/8,ExHeight/16)
593%D         withcolor RuleColor ;
594%D \stopuseMPgraphic
595%D
596%D \definelinefiller[foo][mp=foo,color=darkred]
597%D
598%D \linefillerhbox[foo]{OEPS}
599%D \stoptyping
600
601\unexpanded\def\node_backgrounds_filler_box#1#2[#3]%
602  {\bgroup
603   \clf_enablebackgroundboxes
604   \dowithnextbox{%
605     \node_linefiller_set{#3}% already sets the attribute
606     #1%
607        attr \backgroundattribute \plusone
608      % attr \linefillerattribute \the\c_attr_linefiller
609       {\box\nextbox}%
610     \egroup}%
611   #2}
612
613\unexpanded\def\linefillerhbox{\node_backgrounds_filler_box\hpack\hbox}
614\unexpanded\def\linefillervbox{\node_backgrounds_filler_box\vpack\vbox}
615\unexpanded\def\linefillervtop{\node_backgrounds_filler_box\tpack\vtop}
616
617%D Bonus:
618
619\unexpanded\def\autorule{\clf_autorule}
620
621\protect \endinput
622