strc-lab.mkiv /size: 6737 b    last modification: 2020-07-01 14:35
1%D \module
2%D   [       file=strc-lab, % was part of strc-des,
3%D        version=2008.10.20,
4%D          title=\CONTEXT\ Structure Macros,
5%D       subtitle=Labels,
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 Structure Macros / Labels}
15
16\unprotect
17
18% todo: reset and increment will go
19
20%D Labels are implemented somewhat inefficient but have the advantage that they
21%D can be controlled like other constructions. Who knows when that comes in
22%D handy?
23
24\installcorenamespace{labels}
25
26\installcommandhandler \??labels {label} \??labels % plural hash, else clash with label (or rename that one)
27
28\installcounterassociation{label}
29
30\let\setuplabels\setuplabel
31
32\setuplabel
33  [\c!alternative=\v!intext,
34   \c!headstyle=\v!bold,
35   \c!titlestyle=\v!bold,
36   \c!distance=\zeropoint,
37   \c!width=\v!fit,
38   \c!titledistance=.5\emwidth,
39   \c!margin=\v!no,
40   \c!titleleft=(,
41   \c!titleright=),
42   \c!display=\v!no,
43   \c!titlecommand=,
44   \c!expansion=\v!no,
45   \c!way=\v!by\v!text,
46   \c!prefix=\v!no,
47   \c!prefixconnector=.,
48   \c!text=\currentlabel,
49   \c!number=\v!yes, % else description
50   \c!start=0,
51   \c!state=\v!start,
52   \c!levels=3]
53
54\unexpanded\def\strc_define_commands_label#1#2#3% current level parent
55  {\doifelsenothing{#3}
56     {\normalexpanded{\defineconstruction[#1][\s!handler=\v!label,\c!level=#2]}%
57      \setevalue{\??label#1:\s!parent}{\??label}}%
58     {\normalexpanded{\defineconstruction[#1][#3][\s!handler=\v!label,\c!level=#2]}%
59      \setevalue{\??label#1:\s!parent}{\??label#3}}%
60   \ifconditional\c_strc_constructions_define_commands
61     \setuevalue{\e!next   #1}{\strc_labels_next   {#1}{\number#2}}% obsolete
62     \setuevalue{\v!reset  #1}{\strc_labels_reset  {#1}{\number#2}}% obsolete % should be \e!reset anyway
63     %setuevalue{\c!set    #1}{\strc_labels_set    {#1}{\number#2}}% obsolete
64   \ifcsname\v!current#1\endcsname
65     % we play safe
66   \else
67     \setuevalue{\v!current#1}{\strc_labels_current{#1}}%          % obsolete % should be \e!current anyway
68   \fi
69     \setuevalue          {#1}{\strc_labels_command{#1}}%
70   \fi}
71
72% todo: \strc_labels_command for user
73
74\appendtoks
75    \ifx\currentlabelparent\empty
76       % clone => parent | subclone => clone | subsubclone => subclone
77       \let\currentlabelsub\empty
78       \strc_define_commands_label
79         {\currentlabelsub\currentlabel}%
80         \plusone
81         \empty
82       \edef\p_levels{\labelparameter\c!levels}%
83       \dostepwiserecurse\plustwo\p_levels\plusone
84         {\strc_define_commands_label
85            {\v!sub\currentlabelsub\currentlabel}%
86            \recurselevel
87            {\currentlabelsub\currentlabel}%
88          \edef\currentlabelsub{\v!sub\currentlabelsub}}%
89   \else
90       % clone => parent | subclone => subparent | subsubclone => subsubparent
91       \let\currentlabelsub\empty
92       \edef\p_levels{\labelparameter\c!levels}%
93       \dorecurse\p_levels
94         {\strc_define_commands_label
95            {\currentlabelsub\currentlabel}%
96            \recurselevel
97            {\currentlabelsub\currentlabelparent}%
98          \edef\currentlabelsub{\v!sub\currentlabelsub}}%
99   \fi
100   \edef\p_counter{\labelparameter\s!counter}% can inherit from parent
101   \ifx\p_counter\empty %
102       \let\p_counter\currentlabel
103   \fi
104   \doifelsecounter\p_counter\donothing{\strc_labels_define_counter\p_counter}%
105   \letlabelparameter\s!counter\p_counter
106\to \everydefinelabel
107
108\let\p_strc_constructions_title \empty
109\let\p_strc_constructions_number\empty
110
111\newconditional\c_strc_constructions_number_keep
112
113\setvalue{\??constructioninitializer\v!label}%
114  {\let\currentlabel                    \currentconstruction
115   \let\constructionparameter           \labelparameter
116   \let\constructionnamespace           \??label
117   \let\detokenizedconstructionparameter\detokenizedlabelparameter
118   \let\letconstructionparameter        \letlabelparameter
119   \let\useconstructionstyleandcolor    \uselabelstyleandcolor
120   \let\setupcurrentconstruction        \setupcurrentlabel
121   % shared with enumerations
122   \edef\p_strc_constructions_number{\constructionparameter\c!number}%
123   \ifx\p_strc_constructions_number\v!yes
124     \settrue\c_strc_constructions_number_state
125     \iftrialtypesetting
126       \strc_counters_save\currentconstructionnumber
127     \fi
128     \ifconditional\c_strc_constructions_number_keep \else
129       \strc_counters_increment_sub\currentconstructionnumber\currentconstructionlevel
130     \fi
131   \else
132     \setfalse\c_strc_constructions_number_state
133   \fi
134   \edef\p_strc_constructions_title{\constructionparameter\c!title}%
135   \ifx\p_strc_constructions_title\v!yes
136     \settrue\c_strc_constructions_title_state
137   \else
138     \setfalse\c_strc_constructions_title_state
139   \fi}
140
141\setvalue{\??constructionfinalizer\v!label}%
142  {\ifconditional\c_strc_constructions_number_state
143     \iftrialtypesetting
144       \strc_counters_restore\currentconstructionnumber
145     \fi
146   \fi}
147
148%D Interfaces:
149
150\unexpanded\def\strc_labels_command{\setfalse\c_strc_constructions_number_keep\strc_descriptions_command}
151\unexpanded\def\strc_labels_current{\settrue \c_strc_constructions_number_keep\strc_descriptions_command}
152
153\unexpanded\def\strc_labels_next   {\strc_constructions_next_indeed \namedlabelparameter} % #1#2
154\unexpanded\def\strc_labels_reset  {\strc_constructions_reset_indeed\namedlabelparameter} % #1#2
155%unexpanded\def\strc_labels_set    {\strc_constructions_set_indeed  \namedlabelparameter} % #1#2
156
157% similar to enumerations
158
159\def\strc_labels_define_counter#1%
160  {\definecounter[#1]%
161   \registerlabelcounter{#1}}
162
163\appendtoks
164    \synchronizelabelcounters
165\to \everysetuplabel
166
167\appendtoks
168    \synchronizelabelcounters
169\to \everydefinelabel
170
171% no start stop here
172
173\expandafter\let\csname\??constructionmainhandler\v!label\expandafter\endcsname\csname\??constructionmainhandler\v!description\endcsname
174
175\unexpanded\setevalue{\??constructioncommandhandler\v!label}%
176  {\csname\??constructionstarthandler\v!construction\endcsname
177   \csname\??constructionstophandler \v!construction\endcsname
178   \endgroup}
179
180\unexpanded\setvalue{\??constructiontexthandler\v!label}%
181  {\begingroup
182   \useconstructionstyleandcolor\c!headstyle\c!headcolor
183   \strc_labels_text
184   \endgroup}
185
186\let\strc_labels_text\strc_enumerations_text
187
188% inline variant
189
190\defineconstructionalternative
191  [\v!intext]
192  [\c!renderingsetup=\??constructionrenderings:\v!intext]
193
194\startsetups[\??constructionrenderings:\v!intext]
195    \dontleavehmode\box\constructionheadbox
196\stopsetups
197
198\protect \endinput
199