anch-bar.mkxl /size: 6411 b    last modification: 2025-02-21 11:03
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=\bodyfontsize/6, % 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}%
101   \scratchdimen{\sidebarparameter\c!leftmargindistance}%
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     % test: {\scratchdimen+(\m_level-\plusone)*\scratchdistance}
121     \d_anch_sidebars_distance{\scratchdimen+\numexpr\m_level-\plusone\relax\dimexpr\scratchdistance\relax}%
122   \fi
123   \startpositionoverlay{\v!text-1}%
124     \normalexpanded{\setMPpositiongraphicrange % maybe expand in definition
125       {b:sidebar:\tointeger\c_anch_sidebars_n}%
126       {e:sidebar:\tointeger\c_anch_sidebars_n}%
127       {mpos:sidebar}%
128       {self=sidebar:\tointeger\c_anch_sidebars_n,
129        location=\mplocation{\sidebarparameter\c!location},
130        linewidth=\todimension{\sidebarparameter\c!rulethickness},
131        linecolor=\sidebarparameter\c!rulecolor,
132        alternative=\sidebarparameter\c!alternative,
133        topoffset=\todimension{\sidebarparameter\c!topoffset},
134        bottomoffset=\todimension{\sidebarparameter\c!bottomoffset},
135        distance=\todimension\d_anch_sidebars_distance}%
136     }%
137   \stoppositionoverlay
138   \bpos{sidebar:\the\c_anch_sidebars_current}%
139   \ignorespaces}
140
141\permanent\protected\def\stopsidebar
142  {\removelastspace
143   \epos{sidebar:\the\c_anch_sidebars_current}
144   \carryoverpar\egroup}
145
146%D Let's keep this nice and simple (okay, we could pass the 6 variables in
147%D one lua call).
148
149\startMPpositionmethod{mpos:sidebar}
150    \startMPpositiongraphic{mpos:sidebar}{linecolor,linewidth,distance,alternative}
151        anch_sidebars_draw("\MPbself", "\MPeself", "\textanchor") ;
152    \stopMPpositiongraphic
153    \MPpositiongraphic{mpos:sidebar}{}%
154\stopMPpositionmethod
155
156%D We now reimplement the \MKII\ margin rules handler in a more modern way.
157%D
158%D \setupmarginrules
159%D   [rulecolor=darkred,
160%D    rulethickness=2pt]
161%D
162%D \setupmarginrules % sidebar
163%D   [2]
164%D   [rulecolor=darkblue]
165%D
166%D \startmarginrule[1]
167%D     \input ward
168%D     \startmarginrule[2]
169%D         \input ward
170%D         \startmarginrule[3]
171%D             \input ward
172%D             \startmarginrule[level=6,rulecolor=darkgreen]
173%D                 \input ward
174%D             \stopmarginrule
175%D             \input ward
176%D         \stopmarginrule
177%D         \input ward
178%D     \stopmarginrule
179%D     \input ward
180%D \stopmarginrule
181%D
182%D Compared to the old mechanism we now can pass settings too.
183
184\definesidebar
185  [\v!margin]
186  [\c!leftmargindistance=\dimexpr\leftmargindistance+\sidebarparameter\c!rulethickness/2\relax]
187 %[\c!leftmargindistance=\leftmargindistance+\sidebarparameter\c!rulethickness/2]
188
189\dorecurse{5}{\definesidebar[\v!margin:#1][\v!margin]} % let's be nice and predefine 5 levels
190
191\permanent\tolerant\protected\def\setupmarginrule[#S#1]#*[#S#2]%
192  {\ifarguments\or
193     \setupsidebar[\v!margin][#1]%
194   \or
195     \setupsidebar[\v!margin:#1][#2]%
196   \fi}
197
198\aliased\let\setupmarginrules\setupmarginrule
199
200\permanent\tolerant\protected\def\startmarginrule[#S#1]% pretty inefficient checking
201  {\edef\m_anch_marginrules_kind{#1}%
202   \ifempty\m_anch_marginrules_kind
203     \startsidebar[\v!margin][]%
204   \orelse\ifhastok={#1}%
205     \startsidebar[\v!margin][#1]%
206   \else
207     \anch_marginrules_check{#1}%
208     \startsidebar[\v!margin:#1][\c!level=#1]%
209   \fi}
210
211\def\anch_marginrules_check#1%
212  {\doifnotcommandhandler\??sidebar{\v!margin:#1}{\definesidebar[\v!margin:#1][\v!margin]}}
213
214\aliased\let\stopmarginrule\stopsidebar
215
216\protect \endinput
217