1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23\writestatus{loading}{ConTeXt Core Macros Line Numbering}
24
25\unprotect
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43\registerctxluafile{pagelin}{autosuffix}
44
45\definesystemattribute[linenumber] [public]
46\definesystemattribute[linereference][public]
47
48\appendtoks
49 \c_attr_linenumber\attributeunsetvalue
50\to \everyforgetall
51
52\appendtoks
53 \c_attr_linenumber\attributeunsetvalue
54\to \everyinsidefloat
55
56\mutable\let\linenumber\!!zerocount
57
58\newbox \b_page_lines_scratch
59\newinteger \c_page_lines_reference
60\newconstant\c_page_lines_nesting
61
62\newconditional\tracelinenumbering
63
64\installtextracker
65 {lines.numbers.show}
66 {\tracelinenumbering\conditionaltrue}
67 {\tracelinenumbering\conditionalfalse}
68
69
70
71\installcorenamespace{linenumberinginstance}
72
73
74
75\permanent\let\makelinenumber\gobblefivearguments
76
77\newconditional\page_postprocessors_needed_box
78
79\protected\def\page_postprocessors_linenumbers_page_indeed #tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \zerocount}
80\protected\def\page_postprocessors_linenumbers_box_indeed #tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \zerocount}
81\protected\def\page_postprocessors_linenumbers_deepbox_indeed#tag{\page_lines_add_numbers_to_box{#tag}\plusone \plusone \plusone }
82\protected\def\page_postprocessors_linenumbers_column_indeed #tag{\page_lines_add_numbers_to_box{#tag}\currentcolumn\nofcolumns\zerocount}
83
84\let\page_postprocessors_linenumbers_page \gobbleoneargument
85\let\page_postprocessors_linenumbers_box \gobbleoneargument
86\let\page_postprocessors_linenumbers_deepbox\gobbleoneargument
87\let\page_postprocessors_linenumbers_column \gobbleoneargument
88
89\protected\def\page_postprocessors_linenumbers_check
90 {\glet\page_postprocessors_linenumbers_check \relax
91 \glet\page_postprocessors_linenumbers_page \page_postprocessors_linenumbers_page_indeed
92 \glet\page_postprocessors_linenumbers_box \page_postprocessors_linenumbers_box_indeed
93 \glet\page_postprocessors_linenumbers_deepbox\page_postprocessors_linenumbers_deepbox_indeed
94 \glet\page_postprocessors_linenumbers_column \page_postprocessors_linenumbers_column_indeed}
95
96\def\page_lines_start_define
97 {\xdefcsname\??linenumberinginstance\currentlinenumbering\endcsname
98 {\clf_registerlinenumbering
99
100 continue {\ifzero\c_page_lines_mode\v!yes\else\v!no\fi}
101 start \linenumberingparameter\c!start
102 step \linenumberingparameter\c!step
103 method {\linenumberingparameter\c!method}
104 tag {\currentlinenumbering}
105 }}
106
107\def\page_lines_start_update
108 {\clf_setuplinenumbering
109 \csname\??linenumberinginstance\currentlinenumbering\endcsname
110 {
111
112 continue {\ifzero\c_page_lines_mode\v!yes\else\v!no\fi}
113 }
114 \relax}
115
116\def\page_lines_setup
117 {\ifcsname \??linenumberinginstance\currentlinenumbering\endcsname
118 \clf_setuplinenumbering
119 \lastnamedcs
120 {
121
122 continue {\ifzero\c_page_lines_mode\v!yes\else\v!no\fi}
123 start \linenumberingparameter\c!start
124 step \linenumberingparameter\c!step
125 method {\linenumberingparameter\c!method}
126 tag {\currentlinenumbering}
127 }
128 \relax
129 \fi}
130
131
132
133
134\protected\def\page_lines_some_reference#1#2#3
135 {\dontleavehmode\begingroup
136 \global\advanceby\c_page_lines_reference\plusone
137 \c_attr_linereference\c_page_lines_reference
138 #3
139
140 \c_strc_references_bind_state\zerocount
141 \normalexpanded{\strc_references_set_named_reference{line}{#2}{conversion=\linenumberingparameter\c!conversion}{\the\c_page_lines_reference}}
142 \endgroup}
143
144
145
146
147
148
149
150\newif\ifnumberinglines
151\newif\iftypesettinglines
152
153\installcorenamespace{linenumbering}
154
155\installcommandhandler \??linenumbering {linenumbering} \??linenumbering
156
157\setnewconstant\c_page_lines_mode \plusone
158\setnewconstant\c_page_lines_location \plusone
159\setnewconstant\c_page_lines_alignment\plusfive
160
161\newdimension \d_page_lines_width
162\newdimension \d_page_lines_distance
163
164\newinteger \c_pages_lines_nesting
165
166\newevery \beforeeverylinenumbering \relax
167\newevery \aftereverylinenumbering \relax
168\newevery \everylinenumber \relax
169
170\appendtoks
171 \page_lines_setup
172\to \everysetuplinenumbering
173
174\appendtoks
175 \page_lines_start_define
176\to \everydefinelinenumbering
177
178\setuplinenumbering
179 [\c!conversion=\v!numbers,
180 \c!start=1,
181 \c!step=1,
182 \c!method=\v!first,
183 \c!continue=\v!no,
184 \c!style=,
185 \c!color=,
186 \c!width=2\emwidth,
187 \c!left=,
188 \c!right=,
189 \c!command=,
190 \c!margin=2.5\emwidth,
191 \c!distance=\zeropoint,
192 \c!location=\v!default,
193 \c!align=\v!auto]
194
195\definelinenumbering
196 []
197
198
199
200
201\permanent\tolerant\protected\def\startlinenumbering[#1]#*[#S#2]
202 {\begingroup
203 \page_postprocessors_linenumbers_check
204 \advanceby\c_pages_lines_nesting\plusone
205 \ifnum\c_pages_lines_nesting>\plusone
206 \expandafter\gobbletwooptionals
207 \orelse\ifparameter#2\or
208 \expandafter\page_lines_start_two
209 \orelse\ifparameter#1\or
210 \expandafter\page_lines_start_one
211 \else
212 \expandafter\page_lines_start_zero
213 \fi[#1][#2]}
214
215\def\page_lines_start_zero[#1][#2]
216 {\edef\m_argument{\linenumberingparameter\c!continue}
217 \ifx\m_argument\v!yes
218 \c_page_lines_mode\zerocount
219 \else
220 \c_page_lines_mode\plusone
221 \fi
222 \page_lines_start_followup}
223
224\def\page_lines_start_one[#S#1][#2]
225 {\edef\m_argument{#1}
226 \ifx\m_argument\v!continue
227 \c_page_lines_mode\zerocount
228 \lettonothing\currentlinenumbering
229 \else
230 \ifx\m_argument\v!empty
231 \lettonothing\currentlinenumbering
232 \orelse\ifhastok={#1}
233 \lettonothing\currentlinenumbering
234 \setupcurrentlinenumbering[#1]
235 \orelse\ifchknum\m_argument\or
236 \lettonothing\currentlinenumbering
237 \letlinenumberingparameter\c!start\m_argument
238 \else
239 \let\currentlinenumbering\m_argument
240 \fi
241 \ifcstok{\linenumberingparameter\c!continue}\v!yes
242 \c_page_lines_mode\zerocount
243 \else
244 \c_page_lines_mode\plusone
245 \fi
246 \fi
247 \page_lines_start_followup}
248
249\def\page_lines_start_two[#1][#S#2]
250 {\cdef\currentlinenumbering{#1}
251 \edef\m_argument{#2}
252 \ifx\m_argument\v!continue
253 \c_page_lines_mode\zerocount
254 \else
255 \ifx\m_argument\v!empty \else
256 \ifhastok={#2}
257 \setupcurrentlinenumbering[#2]
258 \orelse\ifchknum\m_argument\or
259 \letlinenumberingparameter\c!start\m_argument
260 \fi
261 \fi
262 \ifcstok{\linenumberingparameter\c!continue}\v!yes
263 \c_page_lines_mode\zerocount
264 \else
265 \c_page_lines_mode\plusone
266 \fi
267 \fi
268 \page_lines_start_followup}
269
270\newconditional\c_page_lines_auto_narrow
271
272
273\appendtoks
274 \ifconditional\page_postprocessors_needed_box
275 \page_postprocessors_linenumbers_page\b_page_postprocessor
276 \fi
277\to \t_page_postprocessors_page
278
279\appendtoks
280 \ifconditional\page_postprocessors_needed_box
281 \page_postprocessors_linenumbers_column\b_page_postprocessor
282 \fi
283\to \t_page_postprocessors_column
284
285\def\page_lines_start_followup
286 {\numberinglinestrue
287 \edef\p_location{\linenumberingparameter\c!location}
288 \c_page_lines_auto_narrow\conditionalfalse
289 \ifhmode \else
290 \ifx\p_location\v!text
291 \ifdim\leftskip>\zeropoint \else
292 \advanceby\leftskip{\linenumberingparameter\c!margin}
293 \c_page_lines_auto_narrow\conditionaltrue
294 \fi
295 \orelse\ifx\p_location\v!begin
296 \ifdim\leftskip>\zeropoint \else
297 \advanceby\leftskip{\linenumberingparameter\c!margin}
298 \c_page_lines_auto_narrow\conditionaltrue
299 \fi
300 \orelse\ifx\p_location\v!end
301 \ifdim\leftskip>\zeropoint \else
302 \advanceby\rightskip{\linenumberingparameter\c!margin}
303 \c_page_lines_auto_narrow\conditionaltrue
304 \fi
305 \fi
306 \fi
307 \expand\beforeeverylinenumbering
308
309 \global\page_postprocessors_needed_box\conditionaltrue
310 \ifcase\c_page_lines_mode\relax
311 \page_lines_start_update
312 \or
313 \page_lines_start_define
314 \fi
315 \c_attr_linenumber\csname\??linenumberinginstance\currentlinenumbering\endcsname\relax}
316
317\permanent\protected\def\stoplinenumbering
318 {\ifconditional\c_pages_lines_nesting=\plusone
319 \c_attr_linenumber\attributeunsetvalue
320 \expand\aftereverylinenumbering
321 \ifconditional\c_page_lines_auto_narrow\par\fi
322 \fi
323 \endgroup}
324
325
326
327\newconditional\c_page_lines_fake_number
328\newconstant \b_page_lines_number
329\newconstant \c_page_lines_column
330\newconstant \c_page_lines_last_column
331\newdimen \d_page_lines_line_width
332\newconditional\c_page_lines_dir_left_to_right \c_page_lines_dir_left_to_right\conditionaltrue
333
334\installcorenamespace{linenumberinghandler}
335
336\def\page_line_swap_align
337 {\ifx\p_align\v!inner \let\p_align\v!outer \orelse
338 \ifx\p_align\v!outer \let\p_align\v!inner \orelse
339 \ifx\p_align\v!flushleft \let\p_align\v!flushright\orelse
340 \ifx\p_align\v!flushright\let\p_align\v!flushleft \orelse
341 \ifx\p_align\v!left \let\p_align\v!right \orelse
342 \ifx\p_align\v!right \let\p_align\v!left \fi}
343
344\let\page_lines_make_number_indeed\relax
345
346
347
348
349\def\page_lines_add_numbers_to_box#box#column#max#nesting
350 {\bgroup
351 \ifconditional\c_strc_tags_enabled
352 \strc_tags_enable_indeed
353 \fi
354 \b_page_lines_number #box\relax
355 \c_page_lines_column #column\relax
356 \c_page_lines_last_column#max\relax
357 \fullrestoreglobalbodyfont
358 \enforced\let\makelinenumber\page_lines_make_number
359 \clf_addlinenumbers
360 \b_page_lines_number
361 \scratchbox
362 #nesting
363 \relax
364 \egroup}
365
366\def\page_lines_make_number#tag#linenumber#width#dir
367 {\setbox\scratchbox\naturalhbox to \zeropoint \bgroup
368 \cdef\currentlinenumbering{#tag}
369 \def\linenumber{#linenumber}
370 \d_page_lines_line_width#width\scaledpoint\relax
371 \d_page_lines_distance{\linenumberingparameter\c!distance}
372 \edef\p_align{\linenumberingparameter\c!align}
373 \edef\p_location{\linenumberingparameter\c!location}
374 \ifcase#dir\relax
375 \c_page_lines_dir_left_to_right\conditionaltrue
376 \else
377 \c_page_lines_dir_left_to_right\conditionalfalse
378 \fi
379
380
381
382
383 \ifcase\c_page_lines_last_column\relax
384 \c_page_lines_fake_number\conditionaltrue
385 \or
386
387 \or
388
389 \ifx\p_location\v!default
390 \ifcase\c_page_lines_column\relax
391 \c_page_lines_fake_number\conditionaltrue
392 \or
393 \let\p_location\v!left
394 \else
395 \let\p_location\v!right
396 \page_line_swap_align
397 \fi
398 \fi
399 \fi
400 \ifx\p_location\v!default
401 \ifconditional\c_page_lines_dir_left_to_right
402 \let\p_location\v!left
403 \else
404 \let\p_location\v!right
405 \page_line_swap_align
406 \fi
407 \fi
408
409 \begincsname\??linenumberinghandler\p_location\endcsname
410 \egroup}
411
412\def\page_lines_number_inject#align#width
413 {\edef\p_width{\linenumberingparameter\c!width}
414 \ifx\p_width\v!margin
415 \d_page_lines_width#width
416 \else
417 \d_page_lines_width{\p_width}
418 \fi
419 \relax
420 \ifdim\d_page_lines_width>\zeropoint
421 \ifconditional\tracelinenumbering
422 \ruledhbox{\simplealignedbox\d_page_lines_width#align{\page_lines_number_inject_indeed}}
423 \else
424 \simplealignedbox\d_page_lines_width#align{\page_lines_number_inject_indeed}
425 \fi
426 \else
427 \ifconditional\tracelinenumbering
428 \ruledhbox
429
430
431 \fi
432 {\page_lines_number_inject_indeed}
433 \fi}
434
435\def\page_lines_number_inject_indeed
436 {\uselinenumberingstyleandcolor\c!style\c!color
437 \linenumberingparameter\c!command
438 {\linenumberingparameter\c!left
439 \convertnumber{\linenumberingparameter\c!conversion}\linenumber
440 \linenumberingparameter\c!right}}
441
442
443
444
445\def\page_line_handle_left#align#width#distance
446 {\dostarttaggednodetail\t!linenumber
447 \llap
448 {\page_lines_number_inject#align#width
449 \dostarttaggednodetail\t!ignore
450 \kern{
451 #distance\d_page_lines_distance
452 \ifconditional\c_page_lines_dir_left_to_right\else\d_page_lines_line_width\fi
453 }
454 \expand\everylinenumber
455 \hss
456 \dostoptagged}
457 \dostoptagged}
458
459\def\page_line_handle_right#align#width#distance
460 {\dostarttaggednodetail\t!linenumber
461 \rlap
462 {\dostarttaggednodetail\t!ignore
463 \kern{
464 #distance\d_page_lines_distance
465 \ifconditional\c_page_lines_dir_left_to_right\d_page_lines_line_width\fi
466 }
467 \dostoptagged
468 \page_lines_number_inject#align#width
469 \dostarttaggednodetail\t!ignore
470 \expand\everylinenumber
471 \hss
472 \dostoptagged}
473 \dostoptagged}
474
475\protected\defcsname\??linenumberinghandler\v!left\endcsname
476 {\page_line_handle_left\p_align\leftmarginwidth\leftmargindistance}
477
478\protected\defcsname\??linenumberinghandler\v!right\endcsname
479 {\page_line_handle_right\p_align\rightmarginwidth\rightmargindistance}
480
481\protected\defcsname\??linenumberinghandler\v!inner\endcsname
482 {\ifodd\realpageno
483 \ifx\p_align\v!inner
484 \page_line_handle_left\v!flushleft\leftmarginwidth\leftmargindistance
485 \orelse\ifx\p_align\v!outer
486 \page_line_handle_left\v!flushright\leftmarginwidth\leftmargindistance
487 \else
488 \page_line_handle_left\p_align\leftmarginwidth\leftmargindistance
489 \fi
490 \else
491 \ifx\p_align\v!inner
492 \page_line_handle_right\v!flushright\rightmarginwidth\rightmargindistance
493 \orelse\ifx\p_align\v!outer
494 \page_line_handle_right\v!flushleft\rightmarginwidth\rightmargindistance
495 \else
496 \page_line_handle_right\p_align\rightmarginwidth\rightmargindistance
497 \fi
498 \fi}
499
500\protected\defcsname\??linenumberinghandler\v!outer\endcsname
501 {\ifodd\realpageno
502 \ifx\p_align\v!inner
503 \page_line_handle_right\v!flushleft\leftmarginwidth\leftmargindistance
504 \orelse\ifx\p_align\v!outer
505 \page_line_handle_right\v!flushright\leftmarginwidth\leftmargindistance
506 \else
507 \page_line_handle_right\p_align\leftmarginwidth\leftmargindistance
508 \fi
509 \else
510 \ifx\p_align\v!inner
511 \page_line_handle_left\v!flushright\rightmarginwidth\rightmargindistance
512 \orelse\ifx\p_align\v!outer
513 \page_line_handle_left\v!flushleft\rightmarginwidth\rightmargindistance
514 \else
515 \page_line_handle_left\p_align\rightmarginwidth\rightmargindistance
516 \fi
517 \fi}
518
519\def\page_line_handle_begin#align
520 {\rlap
521 {\kern\d_page_lines_distance
522 \page_lines_number_inject#align\zeropoint
523 \expand\everylinenumber}}
524
525\def\page_line_handle_end#align
526 {\rlap
527 {\kern\d_page_lines_line_width\relax
528 \llap
529 {\page_lines_number_inject#align\zeropoint
530 \kern\d_page_lines_distance
531 \expand\everylinenumber}}}
532
533\protected\defcsname\??linenumberinghandler\v!begin\endcsname{\page_line_handle_begin\p_align}
534\protected\defcsname\??linenumberinghandler\v!end \endcsname{\page_line_handle_end \p_align}
535\protected\defcsname\??linenumberinghandler\v!text \endcsname{\page_line_handle_begin\p_align}
536
537\letcsname\??linenumberinghandler\v!inleft \expandafter\endcsname\csname\??linenumberinghandler\v!left \endcsname
538\letcsname\??linenumberinghandler\v!inmargin\expandafter\endcsname\csname\??linenumberinghandler\v!left \endcsname
539\letcsname\??linenumberinghandler\v!margin \expandafter\endcsname\csname\??linenumberinghandler\v!left \endcsname
540\letcsname\??linenumberinghandler\v!inright \expandafter\endcsname\csname\??linenumberinghandler\v!right\endcsname
541
542
543
544\permanent\protected\def\someline [#1]{\page_lines_reference_start{#1}\page_lines_reference_stop{#1}}
545\permanent\protected\def\startline[#1]{\page_lines_reference_start{#1}\permithyphenation\ignorespaces}
546\permanent\protected\def\stopline [#1]{\removeunwantedspaces\permithyphenation\page_lines_reference_stop{#1}}
547
548\def\page_lines_reference_show_start
549 {\ifconditional\tracelinenumbering
550 \expandafter\page_lines_reference_show_start_indeed
551 \else
552 \expandafter\gobbleoneargument
553 \fi}
554
555\def\page_lines_reference_show_stop
556 {\ifconditional\tracelinenumbering
557 \expandafter\page_lines_reference_show_stop_indeed
558 \else
559 \expandafter\gobbleoneargument
560 \fi}
561
562\def\page_lines_reference_show_start_indeed#1
563 {\setbox\scratchbox\hpack{\llap
564 {\vrule\s!width\onepoint\s!depth\strutdp\s!height.8\strutht\raise.85\strutht\hpack{\llap{\tt\txx#1}}}}
565 \smashbox\scratchbox
566 \box\scratchbox}
567
568\def\page_lines_reference_show_stop_indeed#1
569 {\setbox\scratchbox\hpack{\rlap
570 {\raise.85\strutht\hpack{\rlap{\tt\txx#1}}\vrule\s!width\onepoint\s!depth\strutdp\s!height.8\strutht}}
571 \smashbox\scratchbox
572 \box\scratchbox}
573
574\def\page_lines_reference_start#1{\page_lines_some_reference{#1}{lr:b:#1}{\page_lines_reference_show_start{#1}}}
575\def\page_lines_reference_stop #1{\page_lines_some_reference{#1}{lr:e:#1}{\page_lines_reference_show_stop {#1}}}
576
577
578
579\permanent\def\currentreferencelinenumber{\clf_filterreference{linenumber}}
580
581\lettonothing\m_page_lines_from
582\lettonothing\m_page_lines_to
583
584\permanent\protected\def\doifelsesamelinereference#1#2#3
585 {\doifelsereferencefound{lr:b:#1}
586 {\edef\m_page_lines_from{\currentreferencelinenumber}
587 \doifelsereferencefound{lr:e:#1}
588 {\edef\m_page_lines_to{\currentreferencelinenumber}
589
590 \ifx\m_page_lines_from\m_page_lines_to#2\else#3\fi}
591 {#2}}
592 {#2}}
593
594\aliased\let\doifsamelinereferenceelse\doifelsesamelinereference
595
596\permanent\protected\def\inline#1[#2]
597 {\ifempty{#1}
598 \doifelsesamelinereference{#2}
599 {\in{\leftlabeltext\v!line}{\rightlabeltext\v!line}[lr:b:#2]}
600 {\in{\leftlabeltext\v!lines}{}[lr:b:#2]\in{}{\rightlabeltext\v!lines}[lr:e:#2]}
601 \else
602 \doifelsesamelinereference{#2}
603 {\in{#1}[lr:b:#2]}
604 {\in{#1}[lr:b:#2]\in[lr:e:#2]}
605 \fi}
606
607\permanent\protected\def\inlinerange[#1]
608 {\doifelsesamelinereference{#1}
609 {\in[lr:b:#1]}
610 {\in[lr:b:#1]\endash\in[lr:e:#1]}}
611
612\protect \endinput
613 |