m-format.mkiv /size: 11 Kb    last modification: 2021-10-28 13:51
1%D \module
2%D   [       file=m-formay,
3%D        version=ancient,
4%D          title=\CONTEXT\ Modules,
5%D       subtitle=Ancient Formatting Code,
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%D Here is some code that I had laying around and had forgotten
15%D about. Let's make it a module and see if there is interest in
16%D such things.
17
18% \defineformatblock   [poem]
19% \defineformatsegment [verse] % [poem]
20% \defineformatline    [line]  % [verse]
21%
22% \startpoem  [title] [author]
23% \startverse [ref]
24% \startline  [ref]
25%
26% block   : voor na tussen *tekstletter *tekstkleur
27%
28% segment : voor na tussen *tekstletter *tekstkleur
29%         : links rechts linkeroffset rechteroffset
30%         : ?marge *evenmarge *onevenmarge breedte
31%         : nummer *nummercommando *conversie
32%         : nummerletter nummerkleur *label
33%
34% line    : voor na tussen *tekstletter *tekstkleur
35%         : nummer *nummercommando *conversie
36%         : nummerletter nummerkleur *label
37%
38% * = todo
39
40\unprotect
41
42\definesystemvariable {fx}   % format block
43\definesystemvariable {fy}   % format segment
44\definesystemvariable {fz}   % format line
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     %\c!margin=\!!zeropoint,\c!evenmargin=\!!zeropoint,\c!oddmargin=\hsize,
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  %\def\formatmargin     {\getvalue{\??fy#1\c!margin}}
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 % ragged right, symbols
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 % ragged right, equal parts, symbols
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 % ragged right
148  {\let\formatraggedness\veryraggedright
149   \let\dostartformatline\dostartformatlinecde
150   \let\formatleftnext\relax \let\formatrightnext\hfill}
151
152\def\@@segmentvariantd % ragged center
153  {\let\formatraggedness\veryraggedcenter
154   \let\dostartformatline\dostartformatlinecde
155   \let\formatleftnext\hfill \let\formatrightnext\hfill}
156
157\def\@@segmentvariante % ragged left
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  {%\dosetleftskipadaption\formatmargin
206   %\advance\hsize-\leftskipadaption\relax
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    %\advance\hsize \leftskipadaption
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         %\hskip\leftskipadaption
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         %\hskip\leftskipadaption
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       %\hskip\leftskipadaption
257        \formatleftfirst
258        \unhbox\nextbox
259        \formatrightfirst}
260   \fi
261   \par
262   \egroup}
263
264\def\dostartformatlinecde
265  {%\dosetleftskipadaption\formatmargin
266   %\advance\hsize -\leftskipadaption\relax
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  %\advance\hsize \leftskipadaption
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     %\hskip\leftskipadaption
314      \formatleftnext
315      \unhbox\shapebox
316      \formatrightnext\strut}% strut prevents unskip
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  %\c!margin=\!!zeropoint,
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% evt defineblank[formatbefore,formatinbetween,formatafter]
347
348%\showframe \traceformatblocktrue
349
350\usemodule[visual]
351
352\setuplayout[height=middle,topspace=1cm,header=0pt,footer=0pt]
353\setupbodyfont[10pt]
354
355% All interfaces supported, but testing with english; todo:
356% more options, more alternatives, inheritance and mixed
357% definitions, and so.
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