core-des.tex / last modification: 2007-11-30 09:51
%D \module
%D   [       file=core-des,
%D        version=1997.03.31,
%D          title=\CONTEXT\ Core Macros,
%D       subtitle=Descriptions,
%D         author=Hans Hagen,
%D           date=\currentdate,
%D      copyright={PRAGMA / Hans Hagen \& Ton Otten}]
%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 Core Macros / Descriptions}

%D In order to be more flexible with theorems Aditya Mahajan added
%D support for titles and endsymbols. At the same time we some more
%D flexible support for inheriting numbers was added.

%D \startbuffer
%D \defineenumeration[one]
%D \defineenumeration[two]   [one]
%D \defineenumeration[three] [number=one,style=slanted]
%D \defineenumeration[four]  [three]
%D \defineenumeration[five]  [three] [number=five]
%D
%D \startone   test test 1 \stopone
%D \starttwo   test test 2 \stoptwo
%D \startthree test test 3 \stopthree
%D \startfour  test test 4 \stopfour
%D \startfive  test test 1 \stopfive
%D \stopbuffer
%D
%D \typebuffer \start \getbuffer \stop

\unprotect

% Dit kan en moet dus anders:
%
% \start... :  \vbox\bgroup
% \stop...  :  \egroup
% llap enz.
% geen indent!
%
% enz. enz.
%
% Op die manier is meer mogelijk en worden \par's geskipt.
%
% De macro \??dd#1\s!do\c!commando levert de koppeling tussen
% \doornumberen en \doordefinieren. Deze constructie is nodig
% omdat doornummeren geen argument heeft en omdat subnummers
% niet worden genest binnen het hogere niveau.
%
% herimplementeren met \nextbox en \unhbox\unvbox

% list and titles are experiental
%
% \definedescription[test] [location=left,hang=4,headalign={right},distance=1em,list=test]
% \defineenumeration[lemma][title=yes,right=:,textdistance=1em, location=top, titlestyle=\bs,list=lemma]
% \defineenumeration[ammel][title=yes,right=:,textdistance=.5em,location=left,titlestyle=\it,width=9em]
%
% \placelist[enumeration:lemma]
% \placelist[description:test][width=0pt]
%
% \starttest  {something something something}    \input zapf  \stoptest
% \startlemma {with a title of a certain length} \input tufte \stoplemma
% \startammel {with a title}                     \input zapf  \stopammel
%
% \defineenumeration[lemma][...]
% \defineenumeration[titledlemma][lemma][title=yes,right=:,text=lemma,list=lemma]

\newbox\@@descriptionbox

\def\descriptionparameter#1{\csname\??dd\currentdescription#1\endcsname}

\def\@@descriptionhandler{\descriptionparameter{\s!do\c!command}}

% \def\normal@@descriptionhandler[#1]#2#3%
%   {\doattributes
%      {\??dd\currentdescription}\c!headstyle\c!headcolor
%      {\descriptionparameter\c!command{#3}}% NAAR BUITENSTE NIVEAU !
%    \rawreference\s!def{#1}{#2}} % brrr moet in #4

\def\normal@@descriptionhandler[#1]#2#3%
  {\doattributes
     {\??dd\currentdescription}\c!headstyle\c!headcolor
     {\descriptionparameter\c!command{#3}}% NAAR BUITENSTE NIVEAU !
   \doifsomething{\descriptionparameter\c!list}
     {\dowritetolist
        {\descriptionparameter\c!type:\descriptionparameter\c!list}
        {}{#2}{\currentdescription}}%
   \rawreference\s!def{#1}{#2}} % brrr moet in #4

\setvalue{@@description\v!left}%
  {\@@descriptionhang\@@descriptionleftpure\@@descriptionlefthang}

\setvalue{@@description\v!right}%
  {\@@descriptionhang\@@descriptionrightpure\@@descriptionrighthang}

\def\@@descriptionhang#1#2%
  {\processaction
     [\descriptionparameter\c!hang]
     [   \v!none=>\let\next#1,%
               0=>\let\next#1,%
      \s!unknown=>\let\next#2,%
      \s!default=>\let\next#1]%
   \next}

\def\@@descriptionleftpure[#1]#2%
  {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
   \noindent\ignorespaces
   \leftskip\@@leftdescriptionskip
   \rightskip\@@rightdescriptionskip
   \advance\leftskip \!!widtha
   \@@makedescriptionpurebox\raggedright
   \advance\leftskip \!!widthb
   \llap
     {\hbox to \leftskip
        {\hskip\@@leftdescriptionskip
         \copy\@@descriptionbox\hss}}%
   \@@dodescription}

\def\@@descriptionrightpure[#1]#2%
  {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
   \noindent\ignorespaces
   \leftskip\@@leftdescriptionskip
   \rightskip\@@rightdescriptionskip
   \advance\rightskip \!!widtha
   \@@makedescriptionpurebox\raggedleft
   \rlap
     {\hskip\hsize
      \hskip-\leftskip
      \hskip-\rightskip
      \copy\@@descriptionbox
      \hskip\@@rightdescriptionskip}%
   \advance\rightskip \!!widthb
   \@@dodescription}

\def\@@makedescriptionpurebox#1%
  {\setbox\@@descriptionbox\vtop
     {\dontcomplain
      \hsize\!!widtha
      \leftskip\zeropoint
      \rightskip\zeropoint
      #1\setupalign[\descriptionparameter\c!align]%
      \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox}%
   \ht\@@descriptionbox\strutht
   \dp\@@descriptionbox\strutdp}

\def\@@descriptionlefthang[#1]#2%
  {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
   \dontcomplain
   \advance\!!widtha \!!widthb
   \hangindent\!!widtha
   \@@makedescriptionhangbox\raggedright{\advance\rightskip \!!widthb}%
   \noindent\ignorespaces
   \llap
     {\dontshowcomposition
      \vtop to \zeropoint{\box\@@descriptionbox}}%
   \@@dodescription}

\def\@@descriptionrighthang[#1]#2%
  {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
   \dontcomplain
   \advance\!!widtha \!!widthb
   \hangindent-\!!widtha
   \@@makedescriptionhangbox\raggedleft{\advance\leftskip \!!widthb}%
   \noindent\ignorespaces
   \rlap
     {\dontcomplain
      \dontshowcomposition
      \scratchdimen\hsize
      \advance\scratchdimen -\leftskip
      \advance\scratchdimen -\rightskip
      \hbox to \scratchdimen
        {\hss\vtop to \zeropoint{\box\@@descriptionbox}}}%
   \@@dodescription}

\def\@@makedescriptionhangbox#1#2%
  {\setbox\@@descriptionbox\vtop % \vbox gaat fout in hang
     {\forgetall
      \dontcomplain
      \hsize\!!widtha
      #1\setupalign[\descriptionparameter\c!align]#2%
      \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox}%
   \ht\@@descriptionbox\strutht
   \dp\@@descriptionbox\strutdp
   \doifsomething{\descriptionparameter\c!hang}
     {\doifinsetelse{\descriptionparameter\c!hang}{\v!fit,\v!broad}
        {\scratchdimen\ht\@@descriptionbox
         \advance\scratchdimen \dp\@@descriptionbox
         \doif{\descriptionparameter\c!hang}\v!broad
           {\advance\scratchdimen .5\strutht}%
         \getnoflines\scratchdimen
         \hangafter-\noflines}
        {\hangafter-\descriptionparameter\c!hang}}}

\setvalue{@@description\v!top}[#1]#2%
  {%\page[\v!preference]%       % Weg ermee!
   %\dosomebreak{\goodbreak}%   % Dit is beter en nodig!
   \dohandlepagebreakX\plusone  % En dit moet het maar worden.
   \@@dostartdescription[#1]{\let\\=\space}{#2}%
   \noindent\ignorespaces
   \copy\@@descriptionbox\par
   \nobreak
   \descriptionparameter\c!inbetween
   \nobreak
   \@@dodescription}

\def\do@@description#1[#2]#3%
  {\@@dostartdescription[#2]{\def\\{\crlf}}{#3}%
   \noindent\ignorespaces % not needed this ignore
   #1{\ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox}%
   \@@dodescription}

\setvalue{@@description\v!inmargin    }{\do@@description\inmargin}
\setvalue{@@description\v!inleft      }{\do@@description\inleft  }
\setvalue{@@description\v!inright     }{\do@@description\inright }
\setvalue{@@description\v!margin      }{\do@@description\inmargin}
\setvalue{@@description\v!leftmargin  }{\do@@description\inleft  }
\setvalue{@@description\v!rightmargin }{\do@@description\inright }
\setvalue{@@description\v!innermargin }{\do@@description\ininner }
\setvalue{@@description\v!outermargin }{\do@@description\inouter }

\setvalue{@@description\v!serried\v!fit}[#1]#2%
  {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
   \noindent\ignorespaces
   \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox
   \hskip\!!widthb % toegevoegd
   \@@dodescription}

\setvalue{@@description\v!serried\v!broad}[#1]#2%
  {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
   \noindent\ignorespaces
   \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox
   \hskip\!!widthb \!!plus .5\!!widthb \!!minus .25\!!widthb
   \@@dodescription}

\setvalue{@@description\v!serried\v!wide}[#1]#2%
  {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}%
   \noindent\ignorespaces
   \hbox to \!!widtha
     {\ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox\hss}%
   \hskip\!!widthb
   \ignorespaces
   \@@dodescription}

\setvalue{@@description\v!serried}[#1]#2%
  {\processaction
      [\descriptionparameter\c!width]
      [     \v!fit=>\let\next\v!fit,
          \v!broad=>\let\next\v!broad,
        \s!unknown=>\let\next\v!wide,
        \s!default=>\let\next\v!broad]%
   \getvalue{@@description\v!serried\next}[#1]{#2}}

\setvalue{@@description\v!hanging}[#1]#2%
  {\@@dostartdescription[#1]{\def\\{\crlf}}{#2}% % adds \c!margin to \leftskip
   \noindent\ignorespaces
   \advance\leftskip -\leftskipadaption \relax
   \ifdim\leftskipadaption=\zeropoint
     \leftskipadaption1.5em % just some default
     \ifnum\nesteddescriptionstate=\plusone
       \ifdim\leftskip>\zeropoint \relax
         \leftskipadaption\leftskip
       \fi
     \fi
   \fi
   \ifnum\nesteddescriptionstate>\zerocount % was \ifnum\nesteddescriptionstate=\plusone
     \advance\leftskip \leftskipadaption % but we're already further on
   \fi
   \hskip-\leftskipadaption
   \ifhbox\@@descriptionbox\unhcopy\else\copy\fi\@@descriptionbox
   \kern\ifdim\!!widthb=\zeropoint .75em\else\!!widthb\fi
   \ignorespaces
   \@@dodescription}

%D A bonus definition
%D
%D \starttyping
%D \setupfootnotedefinition[location=command,headcommand=\llap]
%D \stoptyping

\setvalue{@@description\v!command}#1%
  {\do@@description{\executeifdefined{\??dd#1\c!headcommand}\framed}{#1}}

%D A new key 'headalign' in definitions.

\def\resetdescriptions % to be used in e.g. footnotes
  {\chardef\nesteddescriptionstate\zerocount}

\resetdescriptions

\let\@@leftdescriptionskip \!!zeropoint
\let\@@rightdescriptionskip\!!zeropoint

\def\@@dostartdescription[#1]#2#3%
  {\descriptionparameter\c!before
   \begingroup
   \doadaptleftskip{\descriptionparameter\c!margin}%
   \showcomposition
   \!!widthb\descriptionparameter\c!distance\relax
   \ifdim\!!widthb=\zeropoint\relax
     \doif{\descriptionparameter\c!width}\v!broad{\!!widthb=1em}%
   \fi
   % temp hack, we need to avoid this kind of preprocessing
   \setbox\@@descriptionbox\hbox % preroll
     {\forgetall
      \trialtypesettingtrue
      \dontcomplain
      #2% sets \\ to space or \crlf
      \@@descriptionhandler[#1]{#3}{\begstrut\descriptionparameter\c!text\ignorespaces#3\endstrut}}%
   % so far
   \assignwidth
     \!!widtha
     {\descriptionparameter\c!width}%
     {\doifelsenothing{\descriptionparameter\c!sample}%
        {% preroll can move here (test first)
         \ifhbox\@@descriptionbox\unhcopy\else\copy\fi \@@descriptionbox}%
        {\@@descriptionhandler[#1]{#3}{\descriptionparameter\c!text\descriptionparameter\c!sample}}}
     \!!widthb
   \setbox\@@descriptionbox\hbox
     {\forgetall
      \dontcomplain
      #2% sets \\ to space or \crlf
      \doifelse{\descriptionparameter\c!location}\v!serried
        {\@@descriptionhandler[#1]{#3}{\begstrut\descriptionparameter\c!text#3\endstrut}}
        {\@@descriptionhandler[#1]{#3}{\vtop{\hsize\!!widtha\advance\hsize-\!!widthb
           \begstrut\descriptionparameter\c!text\ignorespaces#3\endstrut}}}}%
   \doifelse{\descriptionparameter\c!aligntitle}\v!no
     {\edef\@@leftdescriptionskip {\the\leftskip }%
      \edef\@@rightdescriptionskip{\the\rightskip}}
     {\ifcase\nesteddescriptionstate
        \edef\@@leftdescriptionskip {\the\leftskip }%
        \edef\@@rightdescriptionskip{\the\rightskip}%
      \fi}%
   \expanded{\indenting[\descriptionparameter\c!indenting]}%
   % better a system mode
   \ifcase\nesteddescriptionstate
     \chardef\nesteddescriptionstate\plusone
   \or
     \chardef\nesteddescriptionstate\plustwo
   \fi% now happens elsewhere : \noindent\ignorespaces
   \@@resetdescriptionclosesymbol}

\def\@@stopdescription#1%
  {\def\currentdescription{#1}%
   \@@placedescriptionclosesymbol
   % was \par \dostopattributes % here, else problems with interlinespace and font change
   \dostopparbasedattributes % == \settrue\parbasedattributes \dostopattributes
   \endgroup
   \descriptionparameter\c!after %hm, which currentdescription?
   \egroup % temporary hack
   \def\currentdescription{#1}%
   \dochecknextindentation{\??dd\currentdescription}%
   \dorechecknextindentation}

\def\@@dodescription
  {\dostartattributes{\??dd\currentdescription}\c!style\c!color\empty
   \ignorespaces}

% starters:

\def\@@startdescription[#1][#2]%
  {\def\currentdescription{#1}%
   \doifelse{\descriptionparameter\c!title}\v!yes
  %  {\dowithwargument{\@@startsomedescription{#1}[#2]}} % patched for theorems
     {\permitspacesbetweengroups
      \dodoublegroupempty{\@@startsomedescription{#1}[#2]}}
     {\@@startsomedescription{#1}[#2]{}}}

\def\@@description[#1][#2]%
  {\def\currentdescription{#1}%
   \doifelse{\descriptionparameter\c!title}\v!yes
   % {\dowithwargument{\@@somedescription{#1}[#2]}} % patched for theorems
     {\permitspacesbetweengroups
      \dodoublegroupempty{\@@somedescription{#1}[#2]}}
     {\@@somedescription{#1}[#2]{}}}

% these call:

\def\@@somedescription#1[#2]#3%
  {\dowithpar
     {\bgroup\@@makedescription{#1}[#2]{#3}}%
     {\@@stopdescription{#1}}}

\def\@@startsomedescription#1[#2]#3%
  {\bgroup % temporary hack
   \BeforePar{\@@makedescription{#1}[#2]{#3}}%
   \GotoPar}

% which calls:

\def\@@makedescription#1%
  {\postponefootnotes % new, assumes grouping
   \def\currentdescription{#1}%
   \executeifdefined
     {@@description\descriptionparameter\c!location}
     {\getvalue{@@description\v!left}}}

% \def\@@makedescription#1%
%   {\def\currentdescription{#1}%
%    \ifundefined{@@description\descriptionparameter\c!location}%
%      \letvalue{\??dd#1\c!location}\v!left
%    \fi
%    \getvalue{@@description\descriptionparameter\c!location}}

% definitions

\def\setupdescriptions
  {\dodoubleempty\dosetupdescriptions}

\def\dosetupdescriptions[#1][#2]% % beter: \iffirstargument
  {\ConvertToConstant\doifelse{#2}{}
     {\dodosetupdescriptions[][#1]}
     {\dodoubleargumentwithset\dodosetupdescriptions[#1][#2]}}

\def\dodosetupdescriptions[#1]% [#2]%
  {\getparameters[\??dd#1]}   % [#2]}

\def\dodefinedescription[#1][#2]%
  {\copyparameters[\??dd#1][\??dd]
     [\c!location,\c!headstyle,\c!style,\c!color,\c!headcolor,\c!title,
      \c!width,\c!hang,\c!sample,\c!before,\c!inbetween,\c!after,\c!margin,
      \c!indenting,\c!indentnext,\c!align,\c!text,\c!distance,\c!titledistance,\c!command,
      \c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]%
   \getparameters[\??dd#1]
     [\c!title=\v!yes,\s!do\c!command=\normal@@descriptionhandler,
      \c!type=\v!description,\c!list=,\c!listtext=,
      \c!level=,#2]%AM?? Why do we have title=yes here?
  %\doifvalue{\??dd#1\c!location}\v!top{\doassign[\??dd#1][\c!inbetween=\blank]}%
   \doifvalue{\??dd#1\c!location}\v!top % we actually need more granularity
     {\doifnotvalue{\??dd#1\c!inbetween}{\doassign[\??dd#1][\c!inbetween=\blank]}}%
   \doifvaluesomething{\??dd#1\c!list}
     {\definelist[\getvalue{\??dd#1\c!type}:\getvalue{\??dd#1\c!list}]}% new
   \setvalue        {#1}{\dodoubleempty\@@description[#1]}%
   \setvalue{\e!start#1}{\dodoubleempty\@@startdescription[#1]}%
   \setvalue{\e!stop #1}{\@@stopdescription{#1}}}

\def\definedescription
  {\dodoubleemptywithset\dodefinedescription}

\def\currentdescriptionnumber
  {\csname\??dd\currentdescription\??dd\c!number\endcsname}

\ifx\preparednumber\undefined \let\preparednumber\empty \fi

\def\special@@descriptionhandler[#1]#2#3%
  {\strut
   \doifelse{\descriptionparameter\c!number}\v!no
     \!!doneafalse{\doifelse{#1}{-}\!!doneafalse\!!doneatrue}%
   \chardef\descriptioncoupling\zerocount
   \iflocation
     \doifsomething{\descriptionparameter\c!coupling}
       {\processaction % genereert > of <
          [\descriptionparameter\c!couplingway]
          [ \v!local=>\chardef\descriptioncoupling\plusone, % old: default
           \v!global=>\chardef\descriptioncoupling\plustwo]}% new: global crosslinking
   \fi
   \setupnumber % the number is called indirectly
     [\currentdescriptionnumber]
     [\c!sectionnumber=\descriptionparameter\c!sectionnumber]%
   \if!!donea
     \makeprecedingsectionnumber[\currentdescriptionnumber]%
     \prepareprefixnumber{\??dd\currentdescription}\precedingsectionnumber\preparednumber
     \iftrialtypesetting\startlocal\fi
     \getvalue{\e!next\currentdescription}% tricky but we need the preroll
     \iftrialtypesetting\stoplocal\fi
     % \getvalue{\e!next#2#1}%
     \iflocation
       \bgroup
       \letvalue{\??dd\currentdescription\c!sectionnumber}\v!yes
       \protectconversion
       \makeprecedingsectionnumber[\currentdescriptionnumber]%
       \prepareprefixnumber{\??dd\currentdescription}\precedingsectionnumber\preparednumber
       \ifcase\descriptioncoupling \or
         \xdef\@@internalenumber{\doshowdnnumber}%
         \rawreference\s!num{#1:\@@internalenumber}{}%
       \or
         \xdef\@@internalenumber{\countervalue{\??dd\c!coupling\currentdescription}}%
         \rawreference\s!num{\currentdescription:\@@internalenumber}{}%
       \fi
       \egroup
     \fi
    %\makeprecedingsectionnumber[\currentdescriptionnumber]%
    %\prepareprefixnumber{\??dd\currentdescription}\precedingsectionnumber\preparednumber
     \disablepseudocaps   % sorry, uppercase causes troubles
     \doattributes        % \nocase primitive needed
       {\??dd\currentdescription}\c!headstyle\c!headcolor % todo: sub as well
       {\descriptionparameter\c!command
          {\showdntext
           \descriptionparameter\c!left
           \strut\doshowdnnumber
           \showdntitle{#2}%
           \descriptionparameter\c!stopper
           \descriptionparameter\c!right}}%
     \doifsomething{\descriptionparameter\c!list}
       {\dowritetolist
          {\descriptionparameter\c!type:\descriptionparameter\c!list}
          {\showdnlisttext\doshowdnnumber}{#2}{\currentdescription}}%
     \iflocation\ifcase\descriptioncoupling \else
       \edef\localconnection{\descriptionparameter\c!coupling:\@@internalenumber}%
       \doifreferencefoundelse\localconnection
         {\in[\localconnection]}\donothing % genereert > of <
     \fi\fi
     \doifnot{#1}{-}{\rawreference\s!num{#1}{{\doshowdnnumber}{#2}}}%
  \else
     \doattributes{\??dd\currentdescription}\c!headstyle\c!headcolor
      {\descriptionparameter\c!command
         {\showdnpuretext
         \descriptionparameter\c!left
         \showdntitle{#2}%
         \descriptionparameter\c!stopper
         \descriptionparameter\c!right}}%
     \doifnot{#1}{-}{\rawreference\s!num{#1}{{}{#2}}}%
   \fi}

\def\showdntitle#1%
  {\doif{\descriptionparameter\c!title}\v!yes % new, for david antos
   {\doifsomething{#1}
     {\doattributes{\??dd\currentdescription}\c!titlestyle\c!titlecolor
        {\hskip\descriptionparameter\c!titledistance
         \descriptionparameter\c!titlecommand
            {\descriptionparameter\c!titleleft
             \begstrut#1\endstrut
             \descriptionparameter\c!titleright}}}}}


\def\showdnpuretext
  {\strut\descriptionparameter\c!text} % geen spatie

\def\showdnlisttext
  {\descriptionparameter\c!listtext} % space in default

\def\showdntext
  {\doifelsenothing{\descriptionparameter\c!text}
     {\ignorespaces}
     {\strut
      \descriptionparameter\c!text
      \removeunwantedspaces\fixedspace}}

\def\doshowdnnumber
  {\getvalue{showdn\descriptionparameter\c!level\c!number}}

% maybe recursive until end condition undefined

\setvalue{showdn\c!number}%
  {\preparednumber
   \convertednumber[\currentdescriptionnumber]}

\setvalue{showdn\v!sub\c!number}%
  {\getvalue{showdn\c!number}%
   \spr{\descriptionparameter\c!separator}%
   \convertednumber[\v!sub\currentdescriptionnumber]}

\setvalue{showdn\v!sub\v!sub\c!number}%
  {\getvalue{showdn\v!sub\c!number}%
   \spr{\descriptionparameter\c!separator}%
   \convertednumber[\v!sub\v!sub\currentdescriptionnumber]}

\setvalue{showdn\v!sub\v!sub\v!sub\c!number}%
  {\getvalue{showdn\v!sub\v!sub\c!number}%
   \spr{\descriptionparameter\c!separator}%
   \convertednumber[\v!sub\v!sub\v!sub\currentdescriptionnumber]}

\def\domakednnumber
  {\descriptionparameter\c!left
   \strut\doshowdnnumber
   \descriptionparameter\c!stopper
   \descriptionparameter\c!right}

\setvalue{\??dd\s!set\v!sub\s!sub\s!sub\c!number}#1%
  {\edef\@@descriptionnumber{\currentdescriptionnumber}%
   \setnumber[\v!sub\v!sub\v!sub\@@descriptionnumber]}

\setvalue{\??dd\s!set\v!sub\s!sub\c!number}#1%
  {\getvalue{\??dd\s!reset\v!sub\v!sub\v!sub\c!number}{#1}%
   \setnumber[\v!sub\v!sub\@@descriptionnumber]}

\setvalue{\??dd\s!set\v!sub\c!number}#1%
  {\getvalue{\??dd\s!reset\v!sub\v!sub\c!number}{#1}%
   \setnumber[\v!sub\@@descriptionnumber]}

\setvalue{\??dd\s!set\c!number}#1%
  {\getvalue{\??dd\s!reset\v!sub\c!number}