page-lin.mklx /size: 21 Kb    last modification: 2023-12-21 09:44
1%D \module
2%D   [       file=page-lin,
3%D        version=2007.11.29,
4%D          title=\CONTEXT\ Core Macros,
5%D       subtitle=Line Numbering,
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% generic or not ... maybe not bother too much and simplify to mkiv only get rid of
15% \mk* (left over from experimental times)
16%
17% to be redone (was experiment) .. can be hooked into margin code reshuffle
18% arguments
19%
20% this is early luatex code, 2007 or even before that, and it shows ... we have
21% better tricks now
22
23\writestatus{loading}{ConTeXt Core Macros / Line Numbering}
24
25\unprotect
26
27% todo: save settings
28%
29% low level interface
30%
31% we should use normal counters but then we need to sync settings
32
33% some line
34%
35% \startlocallinenumbering
36% some source code 1\par
37% some source code 2\par
38% some source code 3\par
39% \stoplocallinenumbering
40%
41% some line
42
43\registerctxluafile{page-lin}{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 % we keep this for old times sake
63
64\installtextracker
65  {lines.numbers.show}
66  {\tracelinenumbering\conditionaltrue}
67  {\tracelinenumbering\conditionalfalse}
68
69% id nr shift width leftskip dir
70
71\installcorenamespace{linenumberinginstance}
72
73% tag skipflag s getfield(n,"shift") getfield(n,"width") leftmarginwidth(getlist(n)) getfield(n,"dir"))
74
75\permanent\let\makelinenumber\gobblefivearguments % used at lua end
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      % continue {\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi}%
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      % continue {\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi}%
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          % continue {\ifnum\c_page_lines_mode=\zerocount\v!yes\else\v!no\fi}%
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% we could make this a bit more efficient by putting the end reference
132% in the same table as the start one but why make things complex ...
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% todo: #3{#1} as there is no need to pass #1 as part of #3
139   % for the moment we use a simple system i.e. no prefixes etc .. todo: store as number
140   \c_strc_references_bind_state\zerocount % we don't want the prewordbreak and manage it here
141   \normalexpanded{\strc_references_set_named_reference{line}{#2}{conversion=\linenumberingparameter\c!conversion}{\the\c_page_lines_reference}}% kind labels userdata text
142   \endgroup}
143
144% \def\page_lines_reference_start#1{\page_lines_some_reference{#1}{lr:b:#1}{}} % reimplemented later
145% \def\page_lines_reference_stop #1{\page_lines_some_reference{#1}{lr:e:#1}{}} % reimplemented later
146
147% \def\mklinestartreference#1[#2]{\in{#1}[lr:b:#2]} % not interfaced/ not used
148% \def\mklinestopreference #1[#2]{\in{#1}[lr:e:#2]} % not interfaced/ not used
149
150\newif\ifnumberinglines   % will change
151\newif\iftypesettinglines % will change
152
153\installcorenamespace{linenumbering}
154
155\installcommandhandler \??linenumbering {linenumbering} \??linenumbering
156
157\setnewconstant\c_page_lines_mode     \plusone  % 0=continue, 1=restart
158\setnewconstant\c_page_lines_location \plusone  % 0=middle, 1=left, 2=right, 3=inner, 4=outer, 5=text, 6=begin, 7=end
159\setnewconstant\c_page_lines_alignment\plusfive % 0=middle, 1=left, 2=right, 5=auto
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, % depends on direction, columns etc
193   \c!align=\v!auto]
194
195\definelinenumbering
196  []
197
198% \startlinenumbering[<startvalue>|continue|settings|name]
199% \startlinenumbering[name][<startvalue>|continue|settings]
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]% [continue|<number>|settings] % historic
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]% [tag][continue|<number>|settings]
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%\newconditional\c_page_lines_enabled
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   %\global\c_page_lines_enabled\conditionaltrue           %
309   \global\page_postprocessors_needed_box\conditionaltrue % see core-rul.mkiv
310   \ifcase\c_page_lines_mode\relax
311     \page_lines_start_update % continue
312   \or
313     \page_lines_start_define % only when assignment
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% number placement .. will change into (the new) margin code
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 % can become a helper
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% \def\page_lines_rlap{\ifconditional\c_page_lines_dir_left_to_right\expandafter\rlap\else\expandafter\llap\fi}
347% \def\page_lines_llap{\ifconditional\c_page_lines_dir_left_to_right\expandafter\llap\else\expandafter\rlap\fi}
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 % used at lua end
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% with hang and parindent and skips we have to compensate for \hsize
367  {\setbox\scratchbox\naturalhbox to \zeropoint \bgroup
368     \cdef\currentlinenumbering{#tag}%
369     \def\linenumber{#linenumber}% unsafe
370     \d_page_lines_line_width#width\scaledpoint\relax
371     \d_page_lines_distance\linenumberingparameter\c!distance\relax
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     % maybe we also need an option to ignore columns, so that we renumber
381     % once but on the other hand this assumes aligned lines
382     %
383     \ifcase\c_page_lines_last_column\relax
384       \c_page_lines_fake_number\conditionaltrue % why
385     \or
386       % one column
387     \or
388       % two columns
389       \ifx\p_location\v!default % or just margin
390         \ifcase\c_page_lines_column\relax
391           \c_page_lines_fake_number\conditionaltrue % why
392         \or
393           \let\p_location\v!left % one
394         \else
395           \let\p_location\v!right % two
396           \page_line_swap_align % can become a helper
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 % yes or no
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   % \else
430     % \hbox
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% \def\dodorlap{\hbox to \zeropoint{\box\nextbox\normalhss}\endgroup}
443% \def\dodollap{\hbox to \zeropoint{\normalhss\box\nextbox}\endgroup}
444
445\def\page_line_handle_left#align#width#distance%
446  {\dostarttagged\t!linenumber\empty
447   \llap
448     {\page_lines_number_inject#align#width%
449      \dostarttagged\t!ignore\empty
450      \kern\dimexpr
451        #distance+\d_page_lines_distance
452        \ifconditional\c_page_lines_dir_left_to_right\else+\d_page_lines_line_width\fi
453      \relax
454      \expand\everylinenumber
455      \hss
456      \dostoptagged}%
457   \dostoptagged}
458
459\def\page_line_handle_right#align#width#distance%
460  {\dostarttagged\t!linenumber\empty
461   \rlap
462     {\dostarttagged\t!ignore\empty
463      \kern\dimexpr
464        #distance+\d_page_lines_distance
465        \ifconditional\c_page_lines_dir_left_to_right+\d_page_lines_line_width\fi
466      \relax
467      \dostoptagged
468      \page_lines_number_inject#align#width%
469      \dostarttagged\t!ignore\empty
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% referencing: \permithyphenation, also removes leading spaces (new per 29-11-2013)
543
544\permanent\protected\def\someline [#1]{\page_lines_reference_start{#1}\page_lines_reference_stop{#1}} % was just a def
545\permanent\protected\def\startline[#1]{\page_lines_reference_start{#1}\permithyphenation\ignorespaces} %okay?
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% eventually we will do this in lua
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         %[\m_page_lines_from,\m_page_lines_to]
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