spac-lin.mkxl /size: 6346 b    last modification: 2025-02-21 11:03
1%D \module
2%D   [       file=spac-lin,
3%D        version=2012.01.08, % 2009.10.16 (core-ver) 1997.03.31 (core-spa)
4%D          title=\CONTEXT\ Spacing Macros,
5%D       subtitle=Vertical,
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 Spacing Macros / Lines}
15
16\unprotect
17
18%D When spacing is active we need to handle commands in a special way:
19%D
20%D \starttyping
21%D \setuplines[space=on]
22%D
23%D \startlines
24%D Let's talk about this{\ttsl\gobbleoneargument or}that.
25%D \stoplines
26%D
27%D \startlines
28%D Let's talk about this{\getvalue{ttsl}or}that.
29%D \stoplines
30%D \stoptyping
31%D
32%D One can indent in several ways:
33%D
34%D \starttyping
35%D \setupindenting[medium] \setuplines[indenting=odd] % no yes odd even
36%D
37%D \startlines
38%D first
39%D second
40%D third
41%D fourth
42%D \stoplines
43%D \stoptyping
44
45%D Contrary to \MKII\ we can now define classes of lines (generalized by
46%D Wolfgang). I will probably rewrite bits in \LUA.
47
48\installcorenamespace{lines}
49
50\installcommandhandler \??lines {lines} \??lines
51
52\setuplines
53  [\c!option=,
54   \c!command=,
55   \c!before=\blank,
56   \c!after=\blank,
57   \c!inbetween=\blank,
58   \c!indenting=\v!no,
59   \c!space=\v!default]
60
61\appendtoks
62   \frozen\instance\protected\edefcsname\e!start\currentlines\endcsname{\spac_lines_start[\currentlines]}%
63   \frozen\instance\letcsname           \e!stop \currentlines\endcsname \spac_lines_stop
64\to \everydefinelines
65
66% \lettonothing\p_lines_option
67
68\let\spac_lines_break            \relax
69\let\spac_after_first_obeyed_line\relax
70\let\spac_lines_indent           \relax
71
72%D See \type {indentation-005.tex}:
73%D
74%D \starttyping
75%D \setuplines[indentlist={0pt,10pt,15pt,20pt}]
76%D
77%D \setupindenting[yes,1em]
78%D \setuplines[indentlist={0pt,*,*}]
79%D
80%D \setuplines[indentlist={0pt,1em,*}]
81%D \starttyping
82
83\newinteger  \c_spac_lines_indent_cnt
84\newinteger  \c_spac_lines_indent_max
85\newdimension\d_spac_lines_indent
86
87\def\spac_lines_indent_indeed
88  {\ifnum\c_spac_lines_indent_cnt=\c_spac_lines_indent_max
89     \c_spac_lines_indent_cnt\plusone
90   \else
91     \advanceby\c_spac_lines_indent_cnt\plusone
92   \fi
93   \getfromcommacommand[\m_spac_lines_indentlist][\c_spac_lines_indent_cnt]%
94   \ifx\commalistelement\wildcardsymbol
95     \hskip\d_spac_lines_indent
96   \else
97     \scratchdimen{\commalistelement}%
98     \hskip
99       \ifzeropt\scratchdimen
100         \zeropoint
101       \else
102         \scratchdimen
103         \d_spac_lines_indent\scratchdimen
104       \fi
105   \fi
106   \relax}
107
108%D \startbuffer
109%D \startlines[keeptogether=paragraph]
110%D test test
111%D test test
112%D test test
113%D test test
114%D \stoplines
115%D \stopbuffer
116%D
117%D \start \showmakeup[vpenalty] \getbuffer \stop
118
119\permanent\tolerant\protected\def\spac_lines_start[#1]%
120  {\bgroup
121   \cdef\currentlines{#1}%
122   \obeylines
123   \spac_lines_start_indeed}
124
125\tolerant\def\spac_lines_start_indeed[#S#1]% new: optional second argument (WS)
126  {\ifarguments\or
127     \setupcurrentlines[#1]%
128   \fi
129%    \edef\p_lines_option{\linesparameter\c!option}%
130%    \ifx\p_lines_option\v!packed
131   \ifcstok{\linesparameter\c!option}\v!packed
132     \let\spac_lines_break\nobreak
133     \c_spac_lines_as_paragraph\conditionalfalse
134   \orelse\ifcstok{\linesparameter\c!keeptogether}\v!paragraph
135     \let\spac_lines_break\relax
136     \c_spac_lines_as_paragraph\conditionaltrue
137   \else
138     \let\spac_lines_break\relax
139     \c_spac_lines_as_paragraph\conditionalfalse
140   \fi
141   \linesparameter\c!before
142   \push_macro_checkindentation
143   \whitespace
144   \dostarttaggedchained\t!lines\currentlines\currentlines\??lines
145   \begingroup
146   \uselinesstyleandcolor\c!style\c!color
147   \useindentingparameter\linesparameter
148   \usealignparameter\linesparameter
149   \typesettinglinestrue
150   \setupwhitespace[\v!none]% todo use fast variant
151   %\obeylines % move upwards to keep spaces in the first line due to optional argument
152   %
153   \edef\m_spac_lines_indentlist{\linesparameter\c!indentlist}%
154   \getcommacommandsize[\m_spac_lines_indentlist]%
155   \c_spac_lines_indent_max\commalistsize
156   \c_spac_lines_indent_cnt\zerocount
157   \ifnum\c_spac_lines_indent_max>\plusone
158     \let\spac_lines_indent\spac_lines_indent_indeed
159     \d_spac_lines_indent\d_spac_indentation_par
160   \else
161     \let\spac_lines_indent\relax
162   \fi
163   %
164   \ignorespaces
165   \glet\spac_after_first_obeyed_line\spac_lines_after_first_obeyed_line_a
166   \enforced\let\obeyedline\spac_lines_obeyed_line
167   \activatespacehandler{\linesparameter\c!space}%
168   \dostarttaggednodetail\t!line
169   \ignorepars}
170
171% we could have states instead and handle option in there
172
173\def\spac_lines_after_first_obeyed_line_a % tzt two pass, like itemize
174  {\linesparameter\c!command
175   \spac_lines_indent
176   \linesparameter\c!left
177   \glet\spac_after_first_obeyed_line\spac_lines_after_first_obeyed_line_b}
178
179\def\spac_lines_after_first_obeyed_line_b
180  {\spac_lines_break
181   \linesparameter\c!command
182   \spac_lines_indent
183   \linesparameter\c!left}
184
185\newconditional \c_spac_lines_as_paragraph
186
187\def\spac_lines_obeyed_line
188  {\ifdone\linesparameter\c!right\fi
189   \dostoptagged % can be a dummy one as we don't look ahead
190   \ifconditional\c_spac_lines_as_paragraph
191     \parbreak
192   \else
193     \par
194   \fi
195   \dostarttaggednodetail\t!line
196   \futurelet\nexttoken\spac_lines_between}
197
198\protected\def\spac_lines_stop
199  {\dostoptagged
200   \endgroup
201   \dostoptagged
202   \pop_macro_checkindentation
203   \linesparameter\c!after
204   \egroup}
205
206\def\spac_lines_between
207  {\ifx\nexttoken\spac_lines_stop
208     \donefalse
209   \else
210     \doifelsemeaning\nexttoken\obeyedline % brrr
211       {\donefalse\linesparameter\c!inbetween}
212       {\donetrue\spac_after_first_obeyed_line}%
213   \fi}
214
215\definelines[\v!lines]
216
217\permanent\tolerant\protected\def\emptylines[#1]%
218  {\endgraf
219   \begingroup
220  %\forgetall % debatable
221   \ifhmode
222      \crlf % finish the current line
223   \fi
224   \scratchcounter\ifparameter#1\or#1\else3\fi\relax
225   \dorecurse\scratchcounter{\strut\crlf}%
226   \endgroup}
227
228\ifdefined\startlines \else
229    \aliased\expandafter\let\expandafter\startlines\csname\e!start\v!lines\endcsname
230    \aliased\expandafter\let\expandafter\stoplines \csname\e!stop \v!lines\endcsname
231\fi
232
233\protect \endinput
234