strc-usr.mkxl /size: 5631 b    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=strc-bkm,
3%D        version=2009.04.01,
4%D          title=\CONTEXT\ Structure Macros,
5%D       subtitle=Bookmarks,
6%D         author=Wolfgang Schuster,
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 Structure Macros / Userdata}
15
16\registerctxluafile{strc-usr}{}
17
18%D It's a bit like blocks that also use buffers but more lightweight and with
19%D inplace settings.
20%D
21%D \starttyping
22%D \defineuserdata [test] [style=italic]
23%D
24%D \samplefile{klein}
25%D
26%D \startuserdata [before=\blank,after=\blank,color=red]
27%D     \samplefile{greenfield}
28%D \stopuserdata
29%D
30%D \samplefile{sapolsky}
31%D
32%D \startuserdata [test]
33%D     \samplefile{bryson}
34%D \stopuserdata
35%D
36%D \samplefile{jojomayer}
37%D
38%D \startuserdata [test] [before=\blank,after=\blank,color=red]
39%D     \samplefile{linden}
40%D \stopuserdata
41%D
42%D \samplefile{montgomery}
43%D \stoptyping
44%D
45%D Or from \LUA:
46%D
47%D \starttyping
48%D \startluacode
49%D     context.startuserdata({color="blue"})
50%D         context.samplefile("klein")
51%D     context.stopuserdata()
52%D \stopluacode
53%D \stoptyping
54%D
55%D An example of an alternative:
56%D
57%D \starttyping
58%D \defineuserdataalternative [epigraph] [renderingsetup=userdata:epigraph]
59%D
60%D \startsetups [userdata:epigraph]
61%D     \startframedtext [location=right,frame=off,align={flushleft,broad},style=\tfx,offset=.25ex,width=.5\textwidth]
62%D         \begstrut\inlinebuffer[userdata]\endstrut
63%D         \hairline
64%D         \wordright{\userdataparameter{author}}
65%D     \stopframedtext
66%D \stopsetups
67%D
68%D \defineuserdata
69%D   [epigraph]
70%D   [alternative=epigraph]
71%D
72%D \startuserdata [epigraph] [author={Sean B. Carrol}]
73%D     The fraction of fossil olfactory receptor genes is significantly higher in
74%D     all species with full color vision. This suggests that the evolution of
75%D     trichromatic vision --- which allows these primates to detect food, mates,
76%D     and danger with visual cues --- has reduced their reliance on the sense of
77%D     smell.
78%D \stopuserdata
79%D
80%D \startuserdata [epigraph] [author={Sean B. Carrol}]
81%D     \samplefile{carrol}
82%D \stopuserdata
83%D \stoptyping
84
85\unprotect
86
87\installnamespace {userdata}
88\installnamespace {userdataalternative}
89\installnamespace {userdatarenderings}
90
91\installcommandhandler \????userdata            {userdata}            \????userdata
92\installcommandhandler \????userdataalternative {userdataalternative} \????userdataalternative
93
94\appendtoks
95    \frozen\protected\instance\edefcsname\e!start\currentuserdata\endcsname{\userdata_start_instance{\currentuserdata}}%
96    \frozen\protected\instance\letcsname \e!stop \currentuserdata\endcsname\userdata_stop_instance
97\to \everydefineuserdata
98
99\permanent\protected\def\startuserdata
100  {\begingroup
101   \lettonothing\currentuserdata
102   \doifelsenextoptionalcs\userdata_start_delayed\userdata_start_indeed}
103
104\def\userdata_start_delayed[#S#1]%
105  {\doifelseassignmentcs{#1}%
106     \userdata_start_delayed_parameters
107     \userdata_start_delayed_name
108   [#1]}
109
110\def\userdata_start_delayed_parameters[#S#1]%
111  {\setupcurrentuserdata[#1]%
112   \userdata_start_indeed}
113
114\def\userdata_start_delayed_name[#1]%
115  {\cdef\currentuserdata{#1}%
116   \checkuserdataparent
117   \doifelsenextoptionalcs\userdata_start_delayed_parameters\userdata_start_indeed}
118
119\protected\tolerant\def\userdata_start_instance#1#*[#S#2]%
120  {\begingroup
121   \cdef\currentuserdata{#1}%
122   \setupcurrentuserdata[#2]%
123   \grabbufferdatadirect
124   % {\s!userdata:\currentuserdata}%
125     {\s!userdata}% unnested, as before
126     {\e!start\currentuserdata}%
127     {\e!stop \currentuserdata}}
128
129\def\userdata_start_indeed
130  {\grabbufferdatadirect
131   % {\s!userdata:\currentuserdata}%
132     {\s!userdata}% unnested, as before
133     {\csstring\startuserdata}%
134     {\csstring\stopuserdata}}
135
136\permanent\protected\def\stopuserdata
137  {\userdataparameter\c!before
138   \dostarttagged\t!userdata\currentuserdata
139   \begingroup
140   \useuserdatastyleandcolor\c!style\c!color
141   \usealignparameter\userdataparameter
142   \edef\currentuserdataalternative{\userdataparameter\c!alternative}%
143   \ifcsname\currentuserdataalternativehash\s!parent\endcsname \else
144     \let\currentuserdataalternative\s!default
145   \fi
146   \usesetupsparameter\userdataparameter
147   \edef\p_renderingsetup{\userdataalternativeparameter\c!renderingsetup}%
148   \directsetup\p_renderingsetup
149   \endgroup
150   \dostoptagged
151   \userdataparameter\c!after
152   \endgroup}
153
154\aliased\let\userdata_stop_instance\stopuserdata
155
156% kind of nested, when we need it:
157%
158% \permanent\tolerant\protected\def\getuserdata      [#1]{\normalexpanded{\getbufferdata[\s!userdata:\ifparameter#1\or#1\else\currentuserdata\fi]}}
159% \permanent\tolerant\protected\def\getinlineuserdata[#1]{\normalexpanded{\inlinebuffer [\s!userdata:\ifparameter#1\or#1\else\currentuserdata\fi]}}
160
161% unnested, as before:
162
163\permanent\tolerant\protected\def\getuserdata      [#1]{\getbufferdata[\s!userdata]}
164\permanent\tolerant\protected\def\getinlineuserdata[#1]{\inlinebuffer [\s!userdata]}
165
166\defineuserdataalternative
167  [\s!default]
168  [\c!renderingsetup=\????userdatarenderings:\s!default]
169
170% \startsetups[\????userdatarenderings:\s!default]
171%     \userdataparameter\c!before
172%     \usesetupsparameter\userdataparameter
173%     \getbufferdata[\s!userdata]
174%     \userdataparameter\c!after
175% \stopsetups
176
177\startsetups[\????userdatarenderings:\s!default]
178    \getuserdata
179\stopsetups
180
181\setupuserdata
182  [\c!alternative=\s!default]
183
184\protect
185