anch-bar.mkxl /size: 6250 b    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=anch-bar,
3%D        version=2003.03.16,
4%D          title=\CONTEXT\ Anchoring Macros,
5%D       subtitle=Margin Bars and alike,
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\writestatus{loading}{ConTeXt Anchoring Macros / Margin Bars}
15
16\unprotect
17
18%D We will implement a sidebar mechanism using the functionality from \type
19%D {core-pos}.
20%D
21%D \starttyping
22%D \definesidebar[whow][rulecolor=green,distance=0pt]
23%D
24%D \input tufte \par
25%D \startsidebar
26%D   \input tufte \par
27%D   \input tufte \par
28%D   \startsidebar[whow]
29%D     \input tufte \par
30%D     \input tufte \par
31%D     \input tufte
32%D   \stopsidebar \par
33%D   \input tufte \par
34%D   \input tufte
35%D \stopsidebar \par
36%D \input tufte \par
37%D \input tufte \par
38%D \startsidebar
39%D   \input tufte \par
40%D   \input tufte \par
41%D   \input tufte \par
42%D   \input tufte \par
43%D   \input tufte
44%D \stopsidebar \par
45%D \input tufte \par
46%D \input tufte \par
47%D \startsidebar
48%D   \input tufte
49%D   \input tufte
50%D   \input tufte
51%D   \input tufte
52%D   \input tufte
53%D \stopsidebar
54%D \stoptyping
55%D
56%D This can be done better now ... maybe also by using the syncpos features.
57
58\installcorenamespace{sidebar}
59
60\installcommandhandler \??sidebar {sidebar} \??sidebar
61
62\newinteger  \c_anch_sidebars_n
63\newinteger  \c_anch_sidebars_current % local
64\newdimension\d_anch_sidebars_distance
65\newinteger  \c_anch_sidebars_level
66
67% \setupMPvariables
68%   [mpos:sidebar]
69%   [linecolor=red,
70%    linewidth=2pt,
71%    distance=5pt]
72
73\setupsidebar
74  [\c!rulethickness=\dimexpr\bodyfontsize/6\relax, % 2pt default
75   \c!rulecolor=\s!black,
76   \c!alternative=0,
77   \c!topoffset=\zeropoint,
78   \c!bottomoffset=\zeropoint,
79   \c!distance=.5\bodyfontsize,
80   \c!level=,
81   \c!location=\v!left,
82   \c!leftmargindistance=\zeropoint]
83
84\aliased\let\setupsidebars\setupsidebar
85
86\permanent\tolerant\protected\def\startsidebar[#S#1]#*[#S#2]%
87  {\bgroup
88   \dontleavehmode
89   \advanceby\c_anch_sidebars_level\plusone
90   \global\advanceby\c_anch_sidebars_n\plusone
91   \c_anch_sidebars_current\c_anch_sidebars_n\relax % relax needed
92   \ifhastok={#1}%
93     \cdef\currentsidebar{\the\c_anch_sidebars_level}%
94     \checksidebarparent
95     \setupcurrentsidebar[#1]%
96   \else
97     \cdef\currentsidebar{#1}%
98     \setupcurrentsidebar[#2]%
99   \fi
100   \scratchdistance\sidebarparameter\c!distance\relax
101   \scratchdimen\sidebarparameter\c!leftmargindistance\relax
102   \edef\m_level{\sidebarparameter\c!level}%
103   \ifempty\m_level
104     \ifnum\c_anch_sidebars_level=\plusone
105       \ifzeropt\scratchdimen
106         \advanceby\d_anch_sidebars_distance\scratchdistance\relax
107       \else
108         \d_anch_sidebars_distance\scratchdimen
109       \fi
110     \else
111       \advanceby\d_anch_sidebars_distance\scratchdistance\relax
112     \fi
113   \orelse\ifnum\m_level=\plusone
114     \ifzeropt\scratchdimen
115       \advanceby\d_anch_sidebars_distance\scratchdistance\relax
116     \else
117       \d_anch_sidebars_distance\scratchdimen
118     \fi
119   \else
120     \d_anch_sidebars_distance\dimexpr\scratchdimen+\numexpr\m_level-\plusone\relax\dimexpr\scratchdistance\relax\relax
121   \fi
122   \startpositionoverlay{\v!text-1}%
123     \normalexpanded{\setMPpositiongraphicrange % maybe expand in definition
124       {b:sidebar:\the\c_anch_sidebars_n}%
125       {e:sidebar:\the\c_anch_sidebars_n}%
126       {mpos:sidebar}%
127       {self=sidebar:\the\c_anch_sidebars_n,
128        location=\mplocation{\sidebarparameter\c!location},
129        linewidth=\sidebarparameter\c!rulethickness,
130        linecolor=\sidebarparameter\c!rulecolor,
131        alternative=\sidebarparameter\c!alternative,
132        topoffset=\the\dimexpr\sidebarparameter\c!topoffset,
133        bottomoffset=\the\dimexpr\sidebarparameter\c!bottomoffset,
134        distance=\the\d_anch_sidebars_distance}%
135     }%
136   \stoppositionoverlay
137   \bpos{sidebar:\the\c_anch_sidebars_current}%
138   \ignorespaces}
139
140\permanent\protected\def\stopsidebar
141  {\removelastspace
142   \epos{sidebar:\the\c_anch_sidebars_current}
143   \carryoverpar\egroup}
144
145%D Let's keep this nice and simple (okay, we could pass the 6 variables in
146%D one lua call).
147
148\startMPpositionmethod{mpos:sidebar}
149    \startMPpositiongraphic{mpos:sidebar}{linecolor,linewidth,distance,alternative}
150        anch_sidebars_draw("\MPbself", "\MPeself", "\textanchor") ;
151    \stopMPpositiongraphic
152    \MPpositiongraphic{mpos:sidebar}{}%
153\stopMPpositionmethod
154
155%D We now reimplement the \MKII\ margin rules handler in a more modern way.
156%D
157%D \setupmarginrules
158%D   [rulecolor=darkred,
159%D    rulethickness=2pt]
160%D
161%D \setupmarginrules % sidebar
162%D   [2]
163%D   [rulecolor=darkblue]
164%D
165%D \startmarginrule[1]
166%D     \input ward
167%D     \startmarginrule[2]
168%D         \input ward
169%D         \startmarginrule[3]
170%D             \input ward
171%D             \startmarginrule[level=6,rulecolor=darkgreen]
172%D                 \input ward
173%D             \stopmarginrule
174%D             \input ward
175%D         \stopmarginrule
176%D         \input ward
177%D     \stopmarginrule
178%D     \input ward
179%D \stopmarginrule
180%D
181%D Compared to the old mechanism we now can pass settings too.
182
183\definesidebar
184  [\v!margin]
185  [\c!leftmargindistance=\dimexpr\leftmargindistance+\sidebarparameter\c!rulethickness/2\relax]
186
187\dorecurse{5}{\definesidebar[\v!margin:#1][\v!margin]} % let's be nice and predefine 5 levels
188
189\permanent\tolerant\protected\def\setupmarginrule[#S#1]#*[#S#2]%
190  {\ifarguments\or
191     \setupsidebar[\v!margin][#1]%
192   \or
193     \setupsidebar[\v!margin:#1][#2]%
194   \fi}
195
196\aliased\let\setupmarginrules\setupmarginrule
197
198\permanent\tolerant\protected\def\startmarginrule[#S#1]% pretty inefficient checking
199  {\edef\m_anch_marginrules_kind{#1}%
200   \ifempty\m_anch_marginrules_kind
201     \startsidebar[\v!margin][]%
202   \orelse\ifhastok={#1}%
203     \startsidebar[\v!margin][#1]%
204   \else
205     \anch_marginrules_check{#1}%
206     \startsidebar[\v!margin:#1][\c!level=#1]%
207   \fi}
208
209\def\anch_marginrules_check#1%
210  {\doifnotcommandhandler\??sidebar{\v!margin:#1}{\definesidebar[\v!margin:#1][\v!margin]}}
211
212\aliased\let\stopmarginrule\stopsidebar
213
214\protect \endinput
215