1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40\unprotect
41
42\definesystemvariable {fx}
43\definesystemvariable {fy}
44\definesystemvariable {fz}
45
46\def\defineformatblock
47 {\dodoubleempty\dodefineformatblock}
48
49\def\dodefineformatblock[#1][#2]
50 {\setupformatblock
51 [#1]
52 [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank,
53 \c!textstyle=,\c!textcolor=,#2]
54 \setvalue{\e!start#1}{\startformatblock[#1]}
55 \setvalue{\e!stop #1}{\stopformatblock}}
56
57\def\setupformatblock
58 {\dodoubleempty\dosetupformatblock}
59
60\def\setupformatblock[#1]
61 {\getparameters[\??fx#1]}
62
63\def\startformatblock[#1]
64 {\dotriplegroupempty\dostartformatblock{#1}}
65
66\def\dostartformatblock#1#2#3
67 {\bgroup
68 \getvalue{\??fx#1\c!before}
69 \doglobal\newcounter\formatsegmentcounter
70 \doglobal\newcounter\formatlinecounter
71 \doglobal\newcounter\formatlinesubcounter
72 \doglobal\newcounter\formatlinemaxcounter
73 \doifsomething{#2}{\leftaligned{#2}\getvalue{\??fx#1\c!inbetween}}
74 \def\stopformatblock
75 {\doifsomething{#3}{\getvalue{\??fx#1\c!inbetween}\leftaligned{#3}}
76 \getvalue{\??fx#1\c!after}
77 \egroup}}
78
79\def\defineformatsegment
80 {\dodoubleempty\dodefineformatsegment}
81
82\def\dodefineformatsegment[#1][#2]
83 {\setupformatsegment
84 [#1]
85 [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank,
86 \c!textstyle=,\c!textcolor=,\c!left=,\c!right=,
87 \c!leftoffset=\!!zeropoint,\c!rightoffset=\!!zeropoint,
88
89 \c!width=\hsize,\c!numberstyle=,\c!numbercolor=,\c!number=\v!no,
90 \c!numbercommand=,\c!conversion=,\c!label=,
91 #2]
92 \setvalue{\e!start#1}{\startformatsegment[#1]}
93 \setvalue{\e!stop #1}{\stopformatsegment}}
94
95\def\setupformatsegment
96 {\dodoubleempty\dosetupformatsegment}
97
98\def\setupformatsegment[#1]
99 {\getparameters[\??fy#1]}
100
101\def\placeformatsegmentcounter
102 {\formatsegmentcounter\quad\hphantom{\placeformatlinecounter}}
103
104\def\placeformatlinecounter
105 {\formatlinecounter}
106
107\def\startformatsegment[#1]
108 {\bgroup
109 \doifelsevalue{\??fy#1\c!number}\v!yes
110 {\def\doplaceformatsegmentcounter
111 {\inleftmargin
112 {\doattributes{\??fy#1}\c!numberstyle\c!numbercolor
113 {\placeformatsegmentcounter}}}}
114 {\let\doplaceformatsegmentcounter\relax}
115 \getvalue{\??fy#1\c!before}
116 \doglobal\increment\formatsegmentcounter
117 \def\formatrightoffset{\getvalue{\??fy#1\c!rightoffset}}
118 \def\formatleftoffset {\getvalue{\??fy#1\c!leftoffset}}
119 \def\formatminwidth {\getvalue{\??fy#1\c!minwidth}}
120 \def\formatwidth {\getvalue{\??fy#1\c!width}}
121
122 \def\formatbefore {\getvalue{\??fy#1\c!before}}
123 \def\formatinbetween {\getvalue{\??fy#1\c!inbetween}}
124 \def\formatafter {\getvalue{\??fy#1\c!after}}
125 \def\formatleft {\getvalue{\??fy#1\c!left}}
126 \def\formatright {\getvalue{\??fy#1\c!right}}
127 \@@segmentvarianta
128 \getvalue{@@segmentvariant\getvalue{\??fy#1\c!alternative}}
129 \def\stopformatsegment
130 {\getvalue{\??fy#1\c!after}
131 \egroup}}
132
133\newif\iftraceformatblock
134
135\def\@@segmentvarianta
136 {\let\formatraggedness\raggedright
137 \let\dostartformatline\dostartformatlineab
138 \let\formatleftfirst\relax \let\formatrightfirst\hfill
139 \let\formatleftnext \hfill \let\formatrightnext \relax}
140
141\def\@@segmentvariantb
142 {\let\formatraggedness\raggedcenter
143 \let\dostartformatline\dostartformatlineab
144 \let\formatleftfirst\relax \let\formatrightfirst\hfill
145 \let\formatleftnext \hfill \let\formatrightnext \relax}
146
147\def\@@segmentvariantc
148 {\let\formatraggedness\veryraggedright
149 \let\dostartformatline\dostartformatlinecde
150 \let\formatleftnext\relax \let\formatrightnext\hfill}
151
152\def\@@segmentvariantd
153 {\let\formatraggedness\veryraggedcenter
154 \let\dostartformatline\dostartformatlinecde
155 \let\formatleftnext\hfill \let\formatrightnext\hfill}
156
157\def\@@segmentvariante
158 {\let\formatraggedness\veryraggedleft
159 \let\dostartformatline\dostartformatlinecde
160 \let\formatleftnext\hfill \let\formatrightnext\relax}
161
162\def\defineformatline
163 {\dodoubleempty\dodefineformatline}
164
165\def\dodefineformatline[#1][#2]
166 {\setupformatline
167 [#1]
168 [\c!before=\blank,\c!after=\blank,\c!inbetween=\blank,
169 \c!textstyle=,\c!textcolor=,
170 \c!number=\v!no,\c!numbercommand=,\c!conversion=,
171 \c!numberstyle=,\c!numbercolor=,\c!label=,
172 #2]
173 \setvalue{\e!start#1}{\startformatline[#1]}
174 \setvalue{\e!stop #1}{\stopformatline}}
175
176\def\setupformatline
177 {\dodoubleempty\dosetupformatline}
178
179\def\setupformatline[#1]
180 {\getparameters[\??fz#1]}
181
182\newconditional\formatforcedbreak
183
184\def\startformatline[#1]
185 {\bgroup
186 \doifelsevalue{\??fz#1\c!number}\v!yes
187 {\def\doplaceformatlinecounter
188 {\inleftmargin
189 {\doattributes{\??fz#1}\c!numberstyle\c!numbercolor
190 {\placeformatlinecounter}}}}
191 {\let\doplaceformatlinecounter\relax}
192 \global\setfalse\formatforcedbreak
193 \enforced\def\\{\break\global\settrue\formatforcedbreak}
194 \hsize\formatwidth
195 \doglobal\increment\formatlinecounter
196 \par
197 \nobreak
198 \def\stopformatline
199 {\unskip\unskip\unskip\unskip\unskip\egroup
200 \let\doplaceformatsegmentcounter\relax}
201 \postponenotes
202 \dowithnextbox{\dostartformatline}\hbox\bgroup\ignorespaces}
203
204\def\dostartformatlineab
205 {
206
207 \ifdim\nextboxwd>\hsize
208 \beginofshapebox
209 \forgetall
210 \hangafter\plusone
211 \hangindent\formatleftoffset
212 \formatraggedness
213 \hskip\formatrightoffset
214 \unhbox\nextbox\par
215 \endofshapebox
216
217 \doglobal\newcounter\formatlinesubcounter
218 \reshapebox
219 {\doglobal\increment\formatlinesubcounter}
220 \glet\formatlinemaxcounter\formatlinesubcounter
221 \reshapebox
222 {\doglobal\decrement\formatlinesubcounter
223 \ifnum\formatlinesubcounter=\zerocount
224 \doplaceformatsegmentcounter
225 \doplaceformatlinecounter
226 \hskip\formatrightoffset
227
228 \formatleftfirst
229 \unhbox\shapebox
230 \ifnum\formatlinemaxcounter>\plusone
231 \ifx\formatright\empty\else
232 \shapedhbox to \zeropoint{\formatright\hss}
233 \fi
234 \fi
235 \formatrightfirst
236 \iftraceformatblock
237 \ruledhskip\formatrightoffset\hskip\formatrightoffset
238 \fi
239 \else
240
241 \iftraceformatblock
242 \ruledhskip\formatleftoffset\hskip\formatleftoffset
243 \fi
244 \formatleftnext
245 \ifx\formatleft\empty\else
246 \shapedhbox to \zeropoint{\hss\formatleft}
247 \fi
248 \unhbox\shapebox
249 \formatrightnext
250 \fi}
251 \flushshapebox
252 \else
253 \dontleavehmode\hbox
254 {\doplaceformatsegmentcounter
255 \doplaceformatlinecounter
256
257 \formatleftfirst
258 \unhbox\nextbox
259 \formatrightfirst}
260 \fi
261 \par
262 \egroup}
263
264\def\dostartformatlinecde
265 {
266
267 \dimen0=\hsize
268 \ifconditional\formatforcedbreak\else
269 \ifdim\formatminwidth>\zeropoint\relax
270 \ifdim\nextboxwd>\hsize
271 \doloop
272 {\global\dimen1=\dimen0
273 \beginofshapebox
274 \hsize\dimen0
275 \forgetall
276 \formatraggedness
277 \unhcopy\nextbox\par
278 \endofshapebox
279 \reshapebox
280 {\setbox\scratchbox=\hbox{\unhbox\shapebox}
281 \ifdim\wd\scratchbox<\dimen1
282 \global\dimen1=\wd\scratchbox
283 \fi}
284 \ifdim\dimen1<\formatminwidth\relax
285 \advance\dimen0 by .25em
286 \else
287 \exitloop
288 \fi
289 \ifdim\dimen0<10em
290 \dimen0=\hsize
291 \exitloop
292 \fi}
293 \fi
294 \fi
295 \fi
296 \beginofshapebox
297 \hsize\dimen0
298 \forgetall
299 \formatraggedness
300 \unhcopy\nextbox\par
301 \endofshapebox
302
303 \doglobal\newcounter\formatlinesubcounter
304 \reshapebox
305 {\doglobal\increment\formatlinesubcounter}
306 \glet\formatlinemaxcounter\formatlinesubcounter
307 \reshapebox
308 {\doglobal\decrement\formatlinesubcounter
309 \ifnum\formatlinesubcounter=\zerocount
310 \doplaceformatsegmentcounter
311 \doplaceformatlinecounter
312 \fi
313
314 \formatleftnext
315 \unhbox\shapebox
316 \formatrightnext\strut}
317 \flushshapebox
318 \par
319 \egroup}
320
321\defineformatblock[poem]
322 [\c!before=\blank,
323 \c!inbetween={\blank[\v!medium]},
324 \c!after=\blank]
325
326\defineformatsegment[verse]
327 [\c!alternative=\v!left,
328 \c!width=\hsize,
329
330 \c!before={\blank[\v!medium]},
331 \c!after={\blank[\v!medium]},
332 \c!inbetween={\blank[\v!medium]},
333 \c!leftoffset=3em,
334 \c!rightoffset=2em,
335 \c!minwidth=5em,
336 \c!left={\mathematics{[}\enspace},
337 \c!right={\enspace\mathematics{]}}]
338
339\defineformatline[line]
340 []
341
342\protect
343
344\doifnotmode{demo} {\endinput}
345
346
347
348
349
350\usemodule[visual]
351
352\setuplayout[height=middle,topspace=1cm,header=0pt,footer=0pt]
353\setupbodyfont[10pt]
354
355
356
357
358
359\starttext
360
361\startbuffer
362\startbuffer[poem]
363\startpoem{A Random Poem}{Hans Hagen}
364 \startverse
365 \startline \fakewords{4}{8} \stopline
366 \startline \fakewords{4}{8} \stopline
367 \startline \fakewords{4}{8} \stopline
368 \startline \fakewords{4}{8} \stopline
369 \stopverse
370 \startverse
371 \startline \fakewords{4}{8} \stopline
372 \startline \fakewords{4}{8} \stopline
373 \startline \fakewords{4}{8} \stopline
374 \startline \fakewords{4}{8} \stopline
375 \stopverse
376\stoppoem
377\stopbuffer
378
379\setupformatsegment[verse][width=.4\hsize,number=yes,numberstyle=slanted]
380\setupformatline [line] [number=yes,numberstyle=smallslanted]
381
382\startbuffer[x]
383\setupformatsegment[verse][leftoffset=0pt,rightoffset=0pt,left=,right=]
384\stopbuffer
385
386\section{Alternative A}
387
388\setupformatsegment[verse][alternative=a] {\getbuffer[poem]}
389\setupformatsegment[verse][alternative=a] {\getbuffer[x,poem]}
390
391\section{Alternative B}
392
393\setupformatsegment[verse][alternative=b] {\getbuffer[poem]}
394\setupformatsegment[verse][alternative=b] {\getbuffer[x,poem]}
395
396\section{Alternative C}
397
398\setupformatsegment[verse][alternative=c] {\getbuffer[poem]}
399
400\section{Alternative D}
401
402\setupformatsegment[verse][alternative=d] {\getbuffer[poem]}
403
404\section{Alternative E}
405
406\setupformatsegment[verse][alternative=e] {\getbuffer[poem]}
407\stopbuffer
408
409\typebuffer \getbuffer
410
411\stoptext
412 |