typo-itm.mkiv / last modification: 2020-01-30 14:16
%D \module
%D   [       file=typo-itm, % comes from core-mis
%D        version=2012.06.28,
%D          title=\CONTEXT\ Typesetting Macros,
%D       subtitle=Item Lists,
%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 Node Macros / Item Lists}

\unprotect

%D This is a real old mechanism that we once used for questionaries. As it is documented
%D we keep it around. A more modern implementation would probably use another approach
%D but I don't want to spend too much time on it now. There are a couple of changes:
%D
%D \startitemize
%D \startitem textwidth sets the combined width \stopitem
%D \startitem width sets the symbolwidth \stopitem
%D \startitem alternative is used instead of location \stopitem
%D \stopitemize
%D
%D \startbuffer
%D \items[alternative=left]{a,b,c}
%D \items[alternative=left,align=middle,textalign=flushright,distance=1em]{a,b,c}
%D \items[alternative=right]{a,b,c}
%D \items[alternative=inmargin]{a,b,c}
%D \items[alternative=top]{a,b,c}
%D \items[alternative=bottom]{a,b,c}
%D \items[alternative=bottom,align=flushleft,textstyle=bold,color=red,textcolor=green]{a,b,c}
%D \stopbuffer
%D
%D \typebuffer
%D
%D This renders as:
%D
%D \getbuffer

\installcorenamespace{items}
\installcorenamespace{itemsalternatives}
\installcorenamespace{itemshorizontal}
\installcorenamespace{itemsvertical}

\installcommandhandler \??items {items} \??items

\setupitems
  [\c!alternative=\v!left,
   \c!symbol=5,
   \c!textwidth=\availablehsize,
   \c!align=\v!middle,
   \c!textalign=\v!flushleft,
   \c!distance=\zeropoint,
  %\c!n=,
   \c!before=\blank,
   \c!inbetween={\blank[\v!medium]},
   \c!after=\blank]

\unexpanded\def\items
  {\dosingleempty\typo_items_process}

\newcount\c_typo_items_n
\newcount\c_typo_items_m
\newdimen\d_typo_items_text_width
\newdimen\d_typo_items_symbol_width
\newdimen\d_typo_items_distance
\newbox  \b_typo_items_symbols
\newbox  \b_typo_items_texts

\def\typo_items_process[#1]#2%
  {\bgroup
   \setupitems[#1]%
   \edef\p_typo_items_alternative{\itemsparameter\c!alternative}%
   \ifcsname\??itemsalternatives\p_typo_items_alternative\endcsname \else
     \let\p_typo_items_alternative\v!left
   \fi
   \let\currentitems\p_typo_items_alternative
   \setupcurrentitems[#1]%
   %
   \edef\p_typo_items_textwidth{\itemsparameter\c!textwidth}%
   \ifx\p_typo_items_textwidth\empty
     \d_typo_items_text_width\availablehsize
   \else
     \d_typo_items_text_width\p_typo_items_textwidth\relax
   \fi
   %
   \edef\p_typo_items_width{\itemsparameter\c!width}%
   \ifx\p_typo_items_width\empty
     \d_typo_items_symbol_width1.5\emwidth
   \else
     \d_typo_items_symbol_width\p_typo_items_width\relax
   \fi
   %
   \edef\p_typo_items_distance{\itemsparameter\c!distance}%
   \ifx\p_typo_items_distance\empty
     \d_typo_items_distance\zeropoint
   \else
     \d_typo_items_distance\p_typo_items_distance\relax
   \fi
   %
   \edef\p_typo_items_symbol{\itemsparameter\c!symbol}%
   \ifx\p_typo_items_symbol\empty
     \let\m_typo_items_symbol\firstofoneargument
   \else\ifx\p_typo_items_symbol\v!none
     \let\p_typo_items_symbol\empty
     \let\m_typo_items_symbol\firstofoneargument
   \else
     \doifelseconversiondefined\p_typo_items_symbol
       {\def\m_typo_items_symbol{\convertnumber\p_typo_items_symbol}}
       {\doifelsesymboldefined\p_typo_items_symbol
          {\def\m_typo_items_symbol{\symbol[\p_typo_items_symbol]\gobbleoneargument}}
          {\let\m_typo_items_symbol\firstofoneargument}}%
   \fi\fi
   %
   \edef\p_typo_items_align{\itemsparameter\c!align}%
   \edef\p_typo_items_textalign{\itemsparameter\c!textalign}%
   %
   \edef\p_typo_items_n{\itemsparameter\c!n}%
   \ifx\p_typo_items_n\empty
     \getcommalistsize[#2]%
     \c_typo_items_n\commalistsize\relax
   \else
     \c_typo_items_n\p_typo_items_n\relax
   \fi
   %
   \parindent\zeropoint
   \dontcomplain
   %
   \itemsparameter\c!before
   \csname\??itemsalternatives\p_typo_items_alternative\endcsname{#2}%
   \itemsparameter\c!after
   \egroup}

% rendering

\setvalue{\??itemshorizontal\v!margin}#1%
  {\ifnum\c_typo_items_m=\plusone\hss\else\hfill\fi
   \strut#1%
   \ifnum\c_typo_items_m=\c_typo_items_n\hss\else\hfill\fi}

\setvalue{\??itemshorizontal\s!unknown}%
  {\simplealignedbox\scratchwidth\m_typo_items_align}

\def\typo_items_item_horizontal
  {\advance\c_typo_items_m\plusone
   \csname\??itemshorizontal
     \ifcsname\??itemshorizontal\p_typo_items_align\endcsname
       \p_typo_items_align
     \else
       \s!unknown
     \fi
   \endcsname}

\setvalue{\??itemsvertical\s!unknown}%
  {\simplealignedbox\scratchwidth\m_typo_items_align}

\def\typo_items_item_vertical
  {\advance\c_typo_items_m\plusone
   \csname\??itemsvertical
     \ifcsname\??itemsvertical\p_typo_items_align\endcsname
       \p_typo_items_align
     \else
       \s!unknown
     \fi
   \endcsname}

\def\typo_items_make_horizontal#1%
  {\divide\scratchwidth\c_typo_items_n
   \hbox{#1}}

\def\typo_items_make_vertical#1%
  {\vbox{#1}}

\def\typo_items_construct_items_boxes#1%
  {\setbox\b_typo_items_texts\hbox
     {\c_typo_items_m\zerocount
      \let\m_typo_items_align\p_typo_items_textalign
      \scratchwidth\d_typo_items_text_width
      \useitemsstyleandcolor\c!textstyle\c!textcolor
      \typo_items_make{\processcommalist[#1]\typo_items_item}}%
   \ifx\p_typo_items_symbol\empty
     \setbox\b_typo_items_symbols\emptyhbox
   \else
     \setbox\b_typo_items_symbols\hbox
       {\c_typo_items_m\zerocount
        \let\m_typo_items_align\p_typo_items_align
        \scratchwidth\d_typo_items_symbol_width
        \useitemsstyleandcolor\c!style\c!color
        \typo_items_make{\dorecurse\c_typo_items_n{\typo_items_item{\strut\m_typo_items_symbol\recurselevel}}}}%
   \fi}

% alternatives:

\defineitems[\v!top][\c!width=\d_typo_items_text_width,\c!textalign=\itemsparameter\c!align]

\setvalue{\??itemsalternatives\v!top}#1%
  {\let\typo_items_make\typo_items_make_horizontal
   \let\typo_items_item\typo_items_item_horizontal
   \typo_items_construct_items_boxes{#1}%
   \noindent\vbox\bgroup
     \forgetall
     \ifvoid\b_typo_items_symbols \else
       \box\b_typo_items_symbols
       \itemsparameter\c!inbetween
       \nointerlineskip
     \fi
     \box\b_typo_items_texts\
   \egroup}

\defineitems[\v!bottom][\c!width=\d_typo_items_text_width,\c!textalign=\itemsparameter\c!align]

\setvalue{\??itemsalternatives\v!bottom}#1%
  {\let\typo_items_make\typo_items_make_horizontal
   \let\typo_items_item\typo_items_item_horizontal
   \typo_items_construct_items_boxes{#1}%
   \noindent\vbox\bgroup
     \forgetall
     \box\b_typo_items_texts
     \ifvoid\b_typo_items_symbols \else
       \itemsparameter\c!inbetween
       \nointerlineskip
       \box\b_typo_items_symbols
     \fi
   \egroup}

\defineitems[\v!inmargin][\c!width=1.5\emwidth,\c!align=\v!flushright,\c!distance=\leftmargindistance]

\setvalue{\??itemsalternatives\v!inmargin}#1%
  {\let\typo_items_make\typo_items_make_vertical
   \let\typo_items_item\typo_items_item_vertical
   \typo_items_construct_items_boxes{#1}%
   \noindent\hbox\bgroup
     \ifvoid\b_typo_items_symbols \else
       \llap{\box\b_typo_items_symbols\hskip\d_typo_items_distance}%
     \fi
     \box\b_typo_items_texts
   \egroup}

\defineitems[\v!left][\c!width=1.5\emwidth,\c!align=\v!flushleft]

\setvalue{\??itemsalternatives\v!left}#1%
  {\let\typo_items_make\typo_items_make_vertical
   \let\typo_items_item\typo_items_item_vertical
   \advance\d_typo_items_text_width-\dimexpr\d_typo_items_symbol_width+\d_typo_items_distance\relax
   \typo_items_construct_items_boxes{#1}%
   \noindent\hbox\bgroup
     \ifvoid\b_typo_items_symbols \else
       \box\b_typo_items_symbols
       \kern\d_typo_items_distance
     \fi
     \box\b_typo_items_texts
   \egroup}

\defineitems[\v!right][\c!width=1.5\emwidth,\c!align=\v!flushright]

\setvalue{\??itemsalternatives\v!right}#1%
  {\let\typo_items_make\typo_items_make_vertical
   \let\typo_items_item\typo_items_item_vertical
   \advance\d_typo_items_text_width-\dimexpr\d_typo_items_symbol_width+\d_typo_items_distance\relax
   \typo_items_construct_items_boxes{#1}%
   \noindent\hbox\bgroup
     \box\b_typo_items_texts
     \ifvoid\b_typo_items_symbols \else
       \kern\d_typo_items_distance
       \box\b_typo_items_symbols
     \fi
   \egroup}

\protect \endinput