%D \module %D [ file=strc-lab, % was part of strc-des, %D version=2008.10.20, %D title=\CONTEXT\ Structure Macros, %D subtitle=Labels, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. \writestatus{loading}{ConTeXt Structure Macros / Labels} \unprotect % todo: reset and increment will go %D Labels are implemented somewhat inefficient but have the advantage that they %D can be controlled like other constructions. Who knows when that comes in %D handy? \installcorenamespace{labels} \installcommandhandler \??labels {label} \??labels % plural hash, else clash with label (or rename that one) \installcounterassociation{label} \let\setuplabels\setuplabel \setuplabel [\c!alternative=\v!intext, \c!headstyle=\v!bold, \c!titlestyle=\v!bold, \c!distance=\zeropoint, \c!width=\v!fit, \c!titledistance=.5\emwidth, \c!margin=\v!no, \c!titleleft=(, \c!titleright=), \c!display=\v!no, \c!titlecommand=, \c!expansion=\v!no, \c!way=\v!by\v!text, \c!prefix=\v!no, \c!prefixconnector=., \c!text=\currentlabel, \c!number=\v!yes, % else description \c!start=0, \c!state=\v!start, \c!levels=3] \protected\def\strc_define_commands_label#1#2#3% current level parent {\ifempty{#3}% \normalexpanded{\defineconstruction[#1][\s!handler=\v!label,\c!level=#2]}% \edefcsname\??label#1:\s!parent\endcsname{\??label}% \else \normalexpanded{\defineconstruction[#1][#3][\s!handler=\v!label,\c!level=#2]}% \edefcsname\??label#1:\s!parent\endcsname{\??label#3}% \fi \ifconditional\c_strc_constructions_define_commands \frozen\instance\protected\edefcsname\e!next #1\endcsname{\strc_labels_next {#1}{\number#2}}% obsolete \frozen\instance\protected\edefcsname\v!reset#1\endcsname{\strc_labels_reset{#1}{\number#2}}% obsolete % should be \e!reset anyway %frozen\instance\protected\edefcsname\c!set #1\endcsname{\strc_labels_set {#1}{\number#2}}% obsolete \ifcsname\v!current#1\endcsname % we play safe \else \protected\edefcsname\v!current#1\endcsname{\strc_labels_current{#1}}% % obsolete % should be \e!current anyway \fi \frozen\instance\protected\edefcsname#1\endcsname{\strc_labels_command[#1]}% \fi} % todo: \strc_labels_command for user \lettonothing\m_strc_labels_sub \appendtoks \lettonothing\m_strc_labels_sub \ifempty\currentlabelparent % clone => parent | subclone => clone | subsubclone => subclone \strc_define_commands_label {\m_strc_labels_sub\currentlabel}% \plusone \empty \edef\p_levels{\labelparameter\c!levels}% \dostepwiserecurse\plustwo\p_levels\plusone {\strc_define_commands_label {\v!sub\m_strc_labels_sub\currentlabel}% \recurselevel {\m_strc_labels_sub\currentlabel}% \edef\m_strc_labels_sub{\v!sub\m_strc_labels_sub}}% \else % clone => parent | subclone => subparent | subsubclone => subsubparent \edef\p_levels{\labelparameter\c!levels}% \dorecurse\p_levels {\strc_define_commands_label {\m_strc_labels_sub\currentlabel}% \recurselevel {\m_strc_labels_sub\currentlabelparent}% \edef\m_strc_labels_sub{\v!sub\m_strc_labels_sub}}% \fi \edef\p_counter{\labelparameter\s!counter}% can inherit from parent \ifempty\p_counter % \let\p_counter\currentlabel \fi \doifelsecounter\p_counter\donothing{\strc_labels_define_counter\p_counter}% \letlabelparameter\s!counter\p_counter \to \everydefinelabel \newconditional\c_strc_constructions_number_keep \defcsname\??constructioninitializer\v!label\endcsname {\let \currentlabel \currentconstruction \enforced\let\constructionparameter \labelparameter \enforced\let\constructionnamespace \??label \enforced\let\detokenizedconstructionparameter\detokenizedlabelparameter \enforced\let\letconstructionparameter \letlabelparameter \enforced\let\useconstructionstyleandcolor \uselabelstyleandcolor \enforced\let\setupcurrentconstruction \setupcurrentlabel % shared with enumerations \ifcstok{\constructionparameter\c!number}\v!yes \c_strc_constructions_number_state\conditionaltrue \iftrialtypesetting \strc_counters_save\currentconstructionnumber \fi \ifconditional\c_strc_constructions_number_keep \else \strc_counters_increment_sub\currentconstructionnumber\currentconstructionlevel \fi \else \c_strc_constructions_number_state\conditionalfalse \fi \ifcstok{\constructionparameter\c!title}\v!yes \c_strc_constructions_title_state\conditionaltrue \else \c_strc_constructions_title_state\conditionalfalse \fi} \defcsname\??constructionfinalizer\v!label\endcsname {\ifconditional\c_strc_constructions_number_state \iftrialtypesetting \strc_counters_restore\currentconstructionnumber \fi \fi} %D Interfaces: \protected\def\strc_labels_command{\c_strc_constructions_number_keep\conditionalfalse\nameddescription} \protected\def\strc_labels_current{\c_strc_constructions_number_keep\conditionaltrue\nameddescription} \protected\def\strc_labels_next {\strc_constructions_next_indeed \namedlabelparameter} % #1#2 \protected\def\strc_labels_reset {\strc_constructions_reset_indeed\namedlabelparameter} % #1#2 %protected\def\strc_labels_set {\strc_constructions_set_indeed \namedlabelparameter} % #1#2 % similar to enumerations \def\strc_labels_define_counter#1% {\definecounter[#1]% \registerlabelcounter{#1}} \appendtoks \synchronizelabelcounters \to \everysetuplabel \appendtoks \synchronizelabelcounters \to \everydefinelabel % no start stop here \letcsname\??constructionmainhandler\v!label\expandafter\endcsname\csname\??constructionmainhandler\v!description\endcsname \protected\edefcsname\??constructioncommandhandler\v!label\endcsname {\csname\??constructionstarthandler\v!construction\endcsname \csname\??constructionstophandler \v!construction\endcsname \endgroup} \protected\defcsname\??constructiontexthandler\v!label\endcsname {\begingroup \useconstructionstyleandcolor\c!headstyle\c!headcolor \strc_labels_text \endgroup} \let\strc_labels_text\strc_enumerations_text % inline variant \defineconstructionalternative [\v!intext] [\c!renderingsetup=\??constructionrenderings:\v!intext] \startsetups[\??constructionrenderings:\v!intext] \dontleavehmode\box\constructionheadbox \stopsetups \protect \endinput