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