%D \module %D [ file=strc-itm, %D version=2008.10.20, %D title=\CONTEXT\ Structure Macros, %D subtitle=Itemgroups, %D author=Hans Hagen, %D date=\currentdate, %D copyright=PRAGMA-ADE / Hans Hagen] %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 / Itemgroups} \registerctxluafile{strc-itm}{1.001} \unprotect \newconditional\sublistitem \setfalse\sublistitem \newconditional\symbollistitem \setfalse\symbollistitem \newconditional\headlistitem \setfalse\headlistitem \newconditional\introlistitem \setfalse\introlistitem \newconditional\randomizeitems \setfalse\randomizeitems \newconditional\autointrolistitem \setfalse\autointrolistitem \newconditional\optimizelistitem \settrue \optimizelistitem \newconditional\packlistitem \setfalse\packlistitem \newconditional\paragraphlistitem \setfalse\paragraphlistitem \newconditional\textlistitem \setfalse\textlistitem \newconditional\firstlistitem \setfalse\firstlistitem \newconditional\beforelistitem \setfalse\beforelistitem \newconditional\afterlistitem \setfalse\afterlistitem \newconditional\nowhitelistitem \setfalse\nowhitelistitem \newconditional\joinedlistitem \setfalse\joinedwhitelistitem \newconditional\reverselistitem \setfalse\reverselistitem \newconditional\continuelistitems \setfalse\continuelistitems \newconditional\fittinglistitems \setfalse\fittinglistitems \newconditional\indentedfirstlistitem \setfalse\indentedfirstlistitem \newconditional\inlinelistitem \setfalse\inlinelistitem \newcount\noflists \newcount\currentnoflists \newcount\noflistelements \newcount\itemcolumndepth \newcount\itemdepth \newcount\maxitemdepth \maxitemdepth=6 \newdimen\itemgrouplistwidth \newdimen\itemgroupaskedwidth \newbox \itemgroupitembox \def\currentitemgroupcounter{itemgroup:\currentitemgroup} \let\currentitemlevel \!!zerocount \let\currentitemgroup \empty \let\currentnofitems \!!zerocount \def\currentitemnumber {\dorawsubstructurecounter[\currentitemgroupcounter][\currentitemlevel]} \let\currentrepeatstart \empty \def\dolistreference {\iftrialtypesetting \else % no need for different treatment of \continuelistitems \ctxlua{structure.itemgroups.register("\currentitemgroup",\number\noflistelements,"\getitemparameter\currentitemlevel\c!maxwidth")}% \fi} \def\checkcurrentnofitems % we could do this at the lua end and save a call {\edef\currentnofitems {\ctxlua{structure.itemgroups.nofitems("\currentitemgroup",\number\currentnoflists)}}% \edef\currentitemmaxwidth{\ctxlua{structure.itemgroups.maxwidth("\currentitemgroup",\number\currentnoflists)}\scaledpoint}} % todo: \dodosetreference -> \dostructurecountercomponent (to be checked) \def\dohandleitemreference % we will make a decent number helper {\ifx\currentitemreference \empty \else \setnextinternalreference \ctxlua { jobreferences.setandgetattribute("\s!full", "\referenceprefix","\currentitemreference", { metadata = { kind = "item",% ? catcodes = \the\catcodetable, xmlroot = \ifx\currentreferencecoding\s!xml "\xmldocument" \else nil \fi, % only useful when text }, references = { internal = \nextinternalreference, section = structure.sections.currentid(), }, prefixdata = structure.helpers.simplify { prefix = "\structurecounterparameter\currentitemgroupcounter\c!prefix", separatorset = "\structurecounterparameter\currentitemgroupcounter\c!prefixseparatorset", conversion = \!!bs\structurecounterparameter\currentitemgroupcounter\c!prefixconversion\!!es, conversionset = "\structurecounterparameter\currentitemgroupcounter\c!prefixconversionset", set = "\structurecounterparameter\currentitemgroupcounter\c!prefixset", segments = "\structurecounterparameter\currentitemgroupcounter\c!prefixsegments", % segments = "\askedprefixsegments", connector = \!!bs\structurecounterparameter\currentitemgroupcounter\c!prefixconnector\!!es, }, numberdata = structure.helpers.simplify { numbers = structure.counters.compact("\currentitemgroupcounter",nil,true), separatorset = "\structurecounterparameter\currentitemgroupcounter\c!numberseparatorset", conversion = "\structurecounterparameter\currentitemgroupcounter\c!numberconversion", conversionset = "\structurecounterparameter\currentitemgroupcounter\c!numberconversionset", % for the moment no stopper, we need to make references configurable first % stopper = \!!bs\structurecounterparameter\currentitemgroupcounter\c!numberstopper\!!es, segments = "\structurecounterparameter\currentitemgroupcounter\c!numbersegments", }, }) }% \xdef\currentitemattribute{\number\lastdestinationattribute}% \begingroup\attribute\destinationattribute\currentitemattribute\kern\zeropoint\endgroup % todo \fi} % \startitemize[n,packed] % \item test \item test \item test % \stopitemize % % \startitemize[n,packed,reverse] % \item test \item test \item test % \stopitemize % % \startitemize[n,packed,reverse] \item test \item test \stopitemize % \startitemize[continue] % \item test \startitemize[n,packed] \item test \item test \stopitemize % \item test % \item test % \stopitemize % \startitemize[continue] \item test \stopitemize % % \startitemize[n,packed] \item test \item test \stopitemize % \startitemize[continue] \item test \stopitemize % \startitemize[continue] \item test \stopitemize \def\itemparameter #1#2{\csname\doitemparameter{\??op\currentitemgroup#1}#2\endcsname} \def\itemparameterhash#1#2{\doitemparameterhash {\??op\currentitemgroup#1}#2} \def\doitemparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doitemparentparameter \csname#1\s!parent\endcsname#2\fi} \def\doitemparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doitemparentparameterhash\csname#1\s!parent\endcsname#2\fi} \def\doitemparentparameter #1#2{\ifx#1\relax\s!empty\else\doitemparameter #1#2\fi} \def\doitemparentparameterhash#1#2{\ifx#1\relax \else\doitemparameterhash#1#2\fi} \def\dosetitemattributes#1#2#3% style color {\edef\fontattributehash {\itemparameterhash#1#2}% \edef\colorattributehash{\itemparameterhash#1#3}% \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #2\fi \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#3\fi} \def\setitemparameter #1#2{\@EA \def\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3} \def\esetitemparameter#1#2{\@EA\edef\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3} \def\xsetitemparameter#1#2{\@EA\xdef\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3} \def\letitemparameter #1#2{\@EA \let\csname\??op\currentitemgroup#1#2\endcsname} \let\getitemparameter \itemparameter \def\@@globalitemsymbol #1{\??op\currentitemgroup\c!symbol\s!global#1} \def\@@localitemsymbol #1{\??op\currentitemgroup\c!symbol\s!local #1} \def\@@currentitemsymbol#1{\??op\currentitemgroup\c!symbol #1} \def\@@itemcounter{\s!itemcount\currentitemgroup} % \def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else\dosomebreak#1\fi\fi} % % \def\allowitembreak {\doitembreak\allowbreak} % \def\noitembreak {\doitembreak\nobreak} % \def\itembreakspecial {\doitembreak\itembreak} % \def\noitembreakspecial{\doitembreak\itemnobreak} % % \def\itembreak {\flushnotes\penalty-5\relax} % -10 % \def\itemnobreak{\flushnotes\penalty+5\ifinsidecolumns\else00\fi\relax} % +5 \definevspacing[\v!item @0] [penalty:0] % allow \definevspacing[\v!item @10000] [penalty:10000] % no \definevspacing[\v!item @-5] [penalty:-5] \definevspacing[\v!item @5] [penalty:5] \definevspacing[\v!item @500] [penalty:500] \def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else#1\fi\fi} \def\allowitembreak {\doitembreak\itembreakallow} \def\noitembreak {\doitembreak\itembreakno} \def\itembreakspecial {\doitembreak\itembreak} \def\noitembreakspecial{\doitembreak\itemnobreak} \def\itembreakallow{\vspacing[\v!item @0]} \def\itembreakno {\vspacing[\v!item @10000]} \def\itembreak {\flushnotes\vspacing[\v!item @-5]} \def\itemnobreak {\flushnotes\ifinsidecolumns\vspacing[\v!item @5]\else\vspacing[\v!item @500]\fi} % cool but wrong: % % \def\initializeitemgrouplevel#1% % {\ifcsname\??op\currentitemgroup#1\s!parent\endcsname % % ok % \else\ifnum#1>\plusone % \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup\the\numexpr#1-1\relax}% % \else % \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup}% % \fi\fi} % % so we have: \def\initializeitemgrouplevel#1% {\ifcsname\??op\currentitemgroup#1\s!parent\endcsname % ok \else \setevalue{\??op\currentitemgroup#1\s!parent}{\??op\currentitemgroup}% \fi} \unexpanded\def\defineitemgroup {\dotripleempty\dodefineitemgroup} \def\dodefineitemgroup[#1][#2][#3]% todo: clone {\doifsomething{#1} {\pushmacro\currentitemgroup \def\currentitemgroup{#1}% \setvalue{\e!start#1}{\startitemgroup[#1]}% \setvalue{\e!stop#1}{\stopitemgroup}% \setvalue{\e!setup#1\e!endsetup}{\setupitemgroup[#1]}% for old times sake \doifelsenothing{#2} {\getparameters[\??op#1][\s!parent=\??oo,#3]}% {\doifassignmentelse{#2} {\getparameters[\??op#1][\s!parent=\??oo,#2]}% {\getparameters[\??op#1][\s!parent=\??op#2,#3]}}% \dorecurse\maxitemdepth{\initializeitemgrouplevel\recurselevel}% \definestructurecounter[itemgroup:#1]% \popmacro\currentitemgroup}} \newtoks\everysetupitemgroup \unexpanded\def\setupitemgroups % [#1] {\dodoubleargument\getparameters[\??oo]} % [#1] \def\packitems {\ifcase\currentitemlevel \else \settrue\packlistitem \fi} \def\dosetupitemgroupvariable[#1]% [#2]% niveau instellingen {\doifelsenothing{#1} {\getparameters[\??op\currentitemgroup\currentitemlevel]}% {\getparameters[\??op\currentitemgroup#1]}} \def\dosetupitemgroupconstant#1% {\global\setitemparameter\currentitemlevel\c!maxwidth{0}% \processcommacommand[#1]\dodosetupitemgroupconstant} % expansion of #2 is handy for xml \def\dodosetupitemgroupconstant#1% {\edef\itemgroupconstantvalue{#1}% \ifx\itemgroupconstantvalue\empty\else \splitstring\itemgroupconstantvalue\at*\to\itemgroupfirst\and\itemgroupsecond \ifx\itemgroupsecond\empty \let\itemgroupsecond\itemgroupfirst \let\itemgroupfirst\!!plusone \fi \ifcsname\??op:::\itemgroupsecond\endcsname\csname\??op:::\itemgroupsecond\endcsname\fi \fi} \setvalue{\??op:::\v!packed }{\packitems} \setvalue{\??op:::\v!intro }{\settrue\introlistitem} % here? not set to false \setvalue{\??op:::\v!autointro}{\settrue\autointrolistitem} \setvalue{\??op:::\v!broad }{\ifx\itemgroupfirst\empty\def\itemgroupfirst{1}\fi \letitemparameter\currentitemlevel\c!factor\itemgroupfirst} \setvalue{\??op:::\v!text }{\settrue\textlistitem \settrue\inlinelistitem \settrue\joinedlistitem \packitems} \setvalue{\??op:::\v!columns }{\packitems} \setvalue{\??op:::\v!before }{\settrue\beforelistitem} \setvalue{\??op:::\v!after }{\settrue\afterlistitem} \setvalue{\??op:::\v!nowhite }{\settrue\nowhitelistitem} \setvalue{\??op:::\v!margin }{\setitemparameter\currentitemlevel\c!width{-2em}} % signal \setvalue{\??op:::\v!inmargin }{\setitemparameter\currentitemlevel\c!width{-2em}} % signal \setvalue{\??op:::\v!atmargin }{\doifnot\currentitemlevel{1}{\setitemparameter\currentitemlevel\c!width{0em}}} % signal \setvalue{\??op:::\v!intext }{\settrue\inlinelistitem} \setvalue{\??op:::\v!loose }{\setfalse\optimizelistitem} \setvalue{\??op:::\v!fit }{\settrue\fittinglistitems} \setvalue{\??op:::\v!nofit }{\setfalse\fittinglistitems} \setvalue{\??op:::\v!paragraph}{\settrue\paragraphlistitem \packitems} \setvalue{\??op:::\v!joinedup }{\settrue\joinedlistitem \packitems} \setvalue{\??op:::\v!serried }{\edef\itemgroupfirst{-\ifx\itemgroupfirst\empty1\else\itemgroupfirst\fi}% \letitemparameter\currentitemlevel\c!factor\itemgroupfirst} \setvalue{\??op:::\v!stopper }{\letitemparameter\currentitemlevel\c!placestopper\v!yes} % keep {} \setvalue{\??op:::\v!unpacked }{\setfalse\packlistitem} \setvalue{\??op:::\v!repeat }{\settrue\repeatlistitem} \setvalue{\??op:::\v!reverse }{\settrue\reverselistitem} \setvalue{\??op:::\v!standard }{\dosetupstandarditemgroup\currentitemlevel} \def\dosetupstandarditemgroup#1% {\getparameters [\??op\currentitemgroup#1] [\c!width=1.5em,\c!factor=0,\c!distance=.5em,\c!inner=,\c!factor=0, \c!beforehead=,\c!afterhead=\blank,\c!before=\blank,\c!inbetween=\blank,\c!after=\blank]} % \def\packeditemspacing{\empty} % \setupwhitespace[big] % \starttext % test \startitemize[joinedup] \item test \item test \stopitemize test \par % test \startitemize[joinedup,nowhite] \item test \item test \stopitemize test \par % test \startitemize[joinedup,nowhite,before] \item test \item test \stopitemize test \par % test \startitemize[joinedup,nowhite,after] \item test \item test \stopitemize test \par % \stoptext \def\itembeforecommand {\ifconditional\nowhitelistitem \ifconditional\beforelistitem \ifcase\currentitemlevel\or\getitemparameter\currentitemlevel\c!before\fi \else \nowhitespace \fi \else\ifconditional\joinedlistitem % \empty \else \getitemparameter\currentitemlevel\c!before \fi\fi} \def\itemaftercommand {\ifconditional\nowhitelistitem \ifconditional\afterlistitem \ifcase\currentitemlevel\or\getitemparameter\currentitemlevel\c!after\fi \else \nowhitespace \fi \else\ifconditional\joinedlistitem % \empty \else \getitemparameter\currentitemlevel\c!after \fi\fi} \def\iteminbetweencommand {\ifconditional\nowhitelistitem \nowhitespace \else\ifconditional\joinedlistitem % \empty \else \getitemparameter\currentitemlevel\c!inbetween \fi\fi} \def\itembeforeheadcommand {\ifconditional\nowhitelistitem \nowhitespace \else\ifconditional\joinedlistitem % \empty \else \getitemparameter\currentitemlevel\c!beforehead \fi\fi} \def\itemafterheadcommand {\ifconditional\nowhitelistitem \nowhitespace \else\ifconditional\joinedlistitem % \empty \else \getitemparameter\currentitemlevel\c!afterhead \fi\fi} \def\dododododosetupitemgroup[#1][#2]% {\doifassignmentelse{#2}% {\dosetupitemgroupvariable[#1][#2]}% {\setitemparameter{#1}\c!option{#2}}}% \def\dodododosetupitemgroup[#1][#2]% {\doifsomething{#2} {\doifelse{#1}\v!each {\dorecurse\maxitemdepth{\normalexpanded{\noexpand\dododododosetupitemgroup[\recurselevel]}[#2]}} {\normalexpanded{\noexpand\dododododosetupitemgroup[#1]}[#2]}}} % \def\dododosetupitemgroup[#1][#2]% % {\doifelsenothing{#2} % {\doifelsenothing{#1} % {\dodododosetupitemgroup[\currentitemlevel][#2]} % {\dodododosetupitemgroup[#1][#2]}} % {\ifcase\currentitemlevel\relax % \dodododosetupitemgroup[\v!each][#1]% % \else % \dodododosetupitemgroup[\currentitemlevel][#1]% % \fi}} \def\dododosetupitemgroup[#1][#2]% {\doifelsenothing{#2} {\doifsomething{#1} {\ifcase\currentitemlevel\relax \dodododosetupitemgroup[\v!each][#1]% \else \dodododosetupitemgroup[\currentitemlevel][#1]% \fi}}% {\doifelsenothing{#1} {\ifcase\currentitemlevel\relax \dodododosetupitemgroup[\v!each][#2]% \else \dodododosetupitemgroup[\currentitemlevel][#2]% \fi} {\dodododosetupitemgroup[#1][#2]}}} \def\dodosetupitemgroup[#1][#2][#3][#4]% {\pushmacro\currentitemgroup \def\currentitemgroup{#1}% \dododosetupitemgroup[#2][#3]% \doifsomething{#4}{\dododosetupitemgroup[#2][#4]}% \the\everysetupitemgroup \popmacro\currentitemgroup} \def\dosetupitemgroup[#1][#2][#3][#4]% {\def\docommand##1{\dodosetupitemgroup[##1][#2][#3][#4]}% \processcommalist[#1]\docommand} \unexpanded\def\setupitemgroup {\doquadrupleempty\dosetupitemgroup} \def\doadvanceitem {\ifconditional\sublistitem\else\ifconditional\symbollistitem\else \doincrementsubstructurecounter[\currentitemgroupcounter][\currentitemlevel]% \fi\fi} \def\setitemlevel#1% {\ifnum\currentitemlevel>\zerocount \settrue\firstlistitem \ifconditional\continuelistitems\else \dorestartsubstructurecounter[\currentitemgroupcounter][\currentitemlevel]{\the\numexpr\getitemparameter\currentitemlevel\c!start-1\relax}% \fi \fi} \unexpanded\def\actualitemnumber {\ifconditional\repeatlistitem \ifcase\currentitemlevel\or\else \doactualitemnumber \fi \else \doactualitemnumber \fi} \def\doactualitemnumber {\begingroup \setupstructurecounter [\currentitemgroupcounter] [%\c!prefix=\v!no, \c!prefix=\getitemparameter\currentitemlevel\c!prefix, \c!prefixstopper=\getitemparameter\currentitemlevel\c!prefixstopper, \c!prefixseparatorset=\getitemparameter\currentitemlevel\c!prefixseparatorset, \c!prefixconversion=\getitemparameter\currentitemlevel\c!prefixconversion, \c!prefixconversionset=\getitemparameter\currentitemlevel\c!prefixseparatorset, \c!prefixset=\getitemparameter\currentitemlevel\c!prefixset, \c!prefixsegments=\getitemparameter\currentitemlevel\c!prefixsegments, \c!prefixconnector=\getitemparameter\currentitemlevel\c!prefixconnector, \c!criterium=\getitemparameter\currentitemlevel\c!criterium, \c!numberorder=\ifconditional\reverselistitem\v!reverse\else\v!normal\fi, \c!numberstopper=\expdoif{\getitemparameter\currentitemlevel\c!placestopper}\v!yes{\getitemparameter\currentitemlevel\c!stopper}, %\c!numberseparatorset=, %\c!numberconversionset=, \c!numberconversion=\currentitemsymbol, \c!numbersegments=\ifx\currentrepeatstart\empty\else\currentrepeatstart:\fi\number\currentitemlevel]% \ifconditional\reverselistitem \convertedstructurecounter[\currentitemgroupcounter]% [\number\currentitemlevel]% \else \convertedstructurecounter[\currentitemgroupcounter]% [\number\currentitemlevel]% \fi \dohandleitemreference \endgroup} \def\unknownitemsymbol{?} \def\setitemmark#1% % en pas op: resets \docommand ; todo: conversionset {\doifsymboldefinedelse{#1} {\edef\currentitemsymbol{#1}% \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}% \setgvalue{\@@localitemsymbol \currentitemlevel}{\unknownitemsymbol}% \def\listitem{\symbol[\currentitemsymbol]}% \let\@@opsymbol\empty}% {\doifconversiondefinedelse{#1} {\edef\currentitemsymbol{#1}% \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}% \setgvalue{\@@localitemsymbol\currentitemlevel }{\actualitemnumber }% \def\listitem {\ifconditional\textlistitem % maybe block stopper here, but one can as well clone an % itemgroup then \getitemparameter\currentitemlevel\c!lefttext \getvalue{\@@localitemsymbol\currentitemlevel}% \getitemparameter\currentitemlevel\c!righttext \else \getitemparameter\currentitemlevel\c!left \getvalue{\@@localitemsymbol\currentitemlevel}% \getitemparameter\currentitemlevel\c!right \fi}% \let\@@opsymbol\empty}% {}}} % \def\calculatelistwidth#1% distance deals with 'broad' % {\itemgrouplistwidth\getitemparameter#1\c!distance\relax % \ifnum\getitemparameter#1\c!factor>\zerocount % \ifdim\itemgrouplistwidth=\zeropoint \itemgrouplistwidth=.5em\fi % \fi % \multiply\itemgrouplistwidth \getitemparameter#1\c!factor % \advance \itemgrouplistwidth \getitemparameter#1\c!width\relax} \def\calculatelistwidth#1% {\ifdim\currentitemmaxwidth>\zeropoint \itemgrouplistwidth\currentitemmaxwidth \else\ifnum\getitemparameter#1\c!factor>\zerocount \itemgrouplistwidth\getitemparameter#1\c!step\relax \ifdim\itemgrouplistwidth=\zeropoint \itemgrouplistwidth=.5em\fi \multiply\itemgrouplistwidth \getitemparameter#1\c!factor \advance\itemgrouplistwidth\getitemparameter#1\c!width\relax \else \itemgrouplistwidth\getitemparameter#1\c!width\relax \fi\fi \advance\itemgrouplistwidth\getitemparameter#1\c!distance\relax} % The next conditionals deal with \item \startitemgroup. It % looks like a hack to skip back, but that way we preserve % the indentation and bullet placement. It's a rather % untested feature. \newconditional\concatnextitem \setfalse\concatnextitem \newconditional\autoconcatnextitem \settrue \autoconcatnextitem \newsignal \itemsignal \unexpanded\def\startitemgroup {\dotripleempty\dostartitemgroup} \def\dostartitemgroup[#1][#2][#3]% {\bgroup \ifnum\currentitemlevel=\zerocount \def\currentitemgroup{#1}% no nested mixing of itemgroups \fi \ifthirdargument \dodostartitemgroup[#2][#3]% \else \doifassignmentelse{#2} {\dodostartitemgroup[][#2]} {\dodostartitemgroup[#2][]}% \fi} \def\dodostartitemgroup[#1]% [#2]% {\relax % prevents lookahead \ifnum\currentitemlevel=\maxitemdepth\relax \showmessage\m!layouts9{\number\maxitemdepth}% \let\itemincrement\zerocount \else \let\itemincrement\plusone \fi \global\advance\itemdepth\itemincrement \xdef\currentitemlevel{\number\itemdepth}% \edef\itemgroupoptions{\getitemparameter\currentitemlevel\c!option}% \ifx\itemgroupoptions\empty \edef\itemgroupoptions{#1}% \else \doifsomething{#1}{\edef\itemgroupoptions{\itemgroupoptions,#1}}% \fi \normalexpanded{\noexpand\redostartitemgroup[\itemgroupoptions]}}% [#2] \let\startcollectitems\relax \let\stopcollectitems \relax %D A nice example of a plugin: %D %D \startbuffer %D \startitemize[a,random,packed] %D \startitem first \stopitem \startitem second \stopitem %D \startitem third \stopitem \startitem fourth \stopitem %D \stopitemize %D %D \startitemize[a,random,packed] %D \startitem first \stopitem \startitem second \stopitem %D \startitem third \stopitem \startitem fourth \stopitem %D \stopitemize %D %D \startitemize[a,packed] %D \startitem first \stopitem \startitem second \stopitem %D \startitem third \stopitem \startitem fourth \stopitem %D \stopitemize %D \stopbuffer %D %D \typebuffer \getbuffer % better collectitems als conditional and a real plugin mechanism (some day) \@EA\long\@EA\def\@EA\collectitemgroupitem\@EA#\@EA1\csname\e!stop\v!item\endcsname {\increment\itemcollectcounter \long\setvalue{\v!item*\itemcollectcounter}{\item#1\par}} \def\flushcollecteditems {\ifconditional\randomizeitems \getrandomnumber\itemcollectcounternow\plusone\itemcollectcounter \else \increment\itemcollectcounternow \fi \doifdefined{\v!item*\itemcollectcounternow} {\getvalue{\v!item*\itemcollectcounternow}% \letbeundefined{\v!item*\itemcollectcounternow}% \increment\itemcollectcounterdone}% \ifnum\itemcollectcounterdone<\itemcollectcounter\relax \expandafter\flushcollecteditems \fi} \unexpanded\def\stopcollectitems {\ifconditional\randomizeitems \newcounter\itemcollectcounterdone \ifnum\itemcollectcounter>\zerocount \@EAEAEA\flushcollecteditems \fi \fi} \unexpanded\def\startcollectitems {\ifconditional\randomizeitems \newcounter\itemcollectcounter \letvalue{\e!start\v!item}\collectitemgroupitem \fi} %D End of plugin. \ifx\startcolumns\undefined \unexpanded\def\startcolumns[#1]{} \fi \ifx\stopcolumns \undefined \let\stopcolumns\relax \fi \def\dosetsymalign#1% hm, we should use one of the core-spa macros or make a helper {\processaction [#1] [ \v!flushleft=>\let\symalignleft\relax, \v!right=>\let\symalignleft\relax, \v!flushright=>\let\symalignleft\hfill, \v!left=>\let\symalignleft\hfill, \v!middle=>\let\symalignleft\hfil, \v!center=>\let\symalignleft\hfil]} \let\currentitemindenting\empty \def\redostartitemgroup[#1][#2]% {\setfalse\inlinelistitem % new, no indent (leftskip) \setfalse\concatnextitem % new, concat \setfalse\txtlistitem \ifhmode \ifconditional\autoconcatnextitem % new, concat \ifdim\lastskip=\itemsignal % new, concat \settrue\concatnextitem % new, concat \fi % new, concat \fi % new, concat \ifconditional\textlistitem\else\doifnotinset\v!text{#1}\par\fi % suboptimal \fi \begingroup % new where, ok or not / we should integrate random, intro, continue here % beware, the following no longer inherit from the previous level, is this ok? \setfalse\reverselistitem \setfalse\introlistitem \setfalse\autointrolistitem \setfalse\beforelistitem \setfalse\afterlistitem \setfalse\nowhitelistitem \setfalse\randomizeitems % \doifinsetelse\v!intro {#1}{\settrue\introlistitem }{\setfalse\introlistitem }% \doifinsetelse\v!random {#1}{\settrue\randomizeitems }{\setfalse\randomizeitems }% \doifinsetelse\v!continue{#1}{\settrue\continuelistitems}{\setfalse\continuelistitems}% % == \doifinsetelse\v!intro{#1}\settrue\setfalse\introlistitem \global\advance\noflists\plusone \currentnoflists\noflists \noflistelements\zerocount \setfalse\headlistitem \setfalse\sublistitem \setfalse\symbollistitem \let\marsymbol\relax \globallet\doitemdestination\empty \let\symsymbol\empty \let\symalignleft\relax \the\itemgroupcommands \checkcurrentnofitems % \getitemparameter\currentitemlevel\empty \let\listitem\empty % ** start value \doifelsenothing{#1} % iffirstargument {\edef\@@opsymbol{\noexpand\getitemparameter\currentitemlevel\noexpand\c!symbol}% \letgvalueempty{\@@globalitemsymbol\currentitemlevel}% \global\letitemparameter\currentitemlevel\v!continue\empty \dosetupitemgroupvariable[\currentitemlevel][#2]} {\dosetupitemgroupconstant{#1}% \dosetupitemgroupvariable[\currentitemlevel][#2]% \ifconditional\continuelistitems \edef\@@opsymbol{\executeifdefined{\@@globalitemsymbol\currentitemlevel}{\currentitemlevel}}% \getitemparameter\currentitemlevel\v!continue \else \edef\@@opsymbol{\noexpand\getitemparameter\currentitemlevel\noexpand\c!symbol}% \global\setitemparameter\currentitemlevel\v!continue {\dosetupitemgroupconstant{#1}% \dosetupitemgroupvariable[\currentitemlevel][#2]}% \fi \def\docommand##1% \setitemmark resets \docommand {\doifnot{##1}{0}{\setitemmark{##1}}}% % \processcommalist[#1,\@@opsymbol]\docommand \processcommalist[#1]\docommand}% ** preset sequence or provided sequence % moved to here, after settings \ifnum\currentitemlevel=\plusone % NIEUW \doadaptleftskip {\getitemparameter\currentitemlevel\c!margin}% \doadaptleftskip {\getitemparameter\currentitemlevel\c!leftmargin}% \doadaptrightskip{\getitemparameter\currentitemlevel\c!rightmargin}% \fi \dosetraggedcommand{\getitemparameter\currentitemlevel\c!align}\raggedcommand \dosetsymalign{\getitemparameter\currentitemlevel\c!symalign}% %\doifsomething{\getitemparameter\currentitemlevel\c!indenting} % {\normalexpanded{\noexpand\setupindenting[\v!reset,\v!yes,\getitemparameter\currentitemlevel\c!indenting]}}% % {\normalexpanded{\noexpand\setupindenting[\getitemparameter\currentitemlevel\c!indenting]}}% % \edef\currentitemindenting{\getitemparameter\currentitemlevel\c!indenting}% % \setitemlevel{#1}% moved to here \ifx\listitem\empty \setitemmark\@@opsymbol % ** default value \ifx\listitem\empty \edef\currentitemsymbol{\currentitemlevel}% ** fall back \fi \fi \ifconditional\autointrolistitem\ifnum\prevgraf<3 \settrue\introlistitem \fi\fi \ifconditional\paragraphlistitem \ifnum\currentitemlevel>\plusone \letitemparameter\currentitemlevel\c!inbetween\empty \fi \fi \ifconditional\packlistitem \letitemparameter\currentitemlevel\c!inbetween\empty \fi \doifinset\v!columns{#1}% {\ifinsidecolumns\else\ifcase\itemcolumndepth \global\itemcolumndepth\currentitemlevel\relax \itembeforecommand \processfirstactioninset [#1] [ \v!one=>\setitemparameter\currentitemlevel\c!n{1}, \v!two=>\setitemparameter\currentitemlevel\c!n{2}, \v!three=>\setitemparameter\currentitemlevel\c!n{3}, \v!four=>\setitemparameter\currentitemlevel\c!n{4}, \v!five=>\setitemparameter\currentitemlevel\c!n{5}, \s!unknown=>\@EA\!!counta\getitemparameter\currentitemlevel\c!n]% \startcolumns [\c!n=\getitemparameter\currentitemlevel\c!n, \c!height=, \c!rule=\v!off, \c!balance=\v!yes, \c!align=\v!no]% \fi\fi}% \ifconditional\fittinglistitems \ifdim\currentitemmaxwidth>\zeropoint \esetitemparameter\currentitemlevel\c!width{\currentitemmaxwidth}% \fi \fi \calculatelistwidth\currentitemlevel \ifdim\itemgrouplistwidth>\zeropoint\relax \ifconditional\inlinelistitem\else \advance\leftskip\itemgrouplistwidth\relax \fi \fi \startcollectitems} % test / example % % \startnarrower[left] \startcolumns[n=3] \startitemize % \item \input ward \item \input ward \item \input ward % \stopitemize \stopcolumns\stopnarrower \blank % % \startnarrower[left] \startitemize[columns,three] % \item \input ward \item \input ward \item \input ward % \stopitemize \stopnarrower \blank % % \setupitemize[leftmargin=1.5em] \startitemize[columns,three] % \item \input ward \item \input ward \item \input ward % \stopitemize \blank \unexpanded\def\stopitemgroup {\stopcollectitems \ifconditional\textlistitem \removeunwantedspaces\space\ignorespaces \else \par \fi \dolistreference \ifconditional\firstlistitem \else \endgroup \fi % toegevoegd, eerste \som opent groep \ifnum\itemcolumndepth=\currentitemlevel\relax \stopcolumns \global\itemcolumndepth\zerocount \itemaftercommand \dontrechecknextindentation \else \ifnum\currentitemlevel=\plusone \allowitembreak \itemaftercommand \checknextindentation[\getitemparameter\currentitemlevel\c!indentnext]% \else % nieuw, not yet nobreak handling \ifcase\autoitemgroupspacing \itemaftercommand \or \itemaftercommand \fi \dontrechecknextindentation \fi \fi % new test, needed in sidefloats (surfaced in volker's proceedings) \ifconditional\textlistitem % else forgotten \endgroup \global\advance\itemdepth-\itemincrement \xdef\currentitemlevel{\number\itemdepth}% \egroup \else \endgroup \global\advance\itemdepth-\itemincrement \xdef\currentitemlevel{\number\itemdepth}% \egroup \par \fi \dorechecknextindentation} \newtoks\itemgroupcommands \newtoks\itemgroupfinalizer \def\itemgroupitem {\the\itemgroupfinalizer \doitemgroupitem} \def\itemgroupnoitem {\the\itemgroupfinalizer \doitemgroupnoitem} \def\itemgroupbutton[#1]% {\the\itemgroupfinalizer \gdef\doitemdestination{#1}% \itemgroupitem} \def\itemgroupdummy {\the\itemgroupfinalizer \itemgroupsymbol{\strut}\strut} \def\itemgroupsubitem {\the\itemgroupfinalizer \settrue\sublistitem \itemgroupitem} \def\itemgroupsymbol#1% {\the\itemgroupfinalizer \def\symsymbol{#1}% \settrue\symbollistitem \itemgroupitem} \def\itemgroupedge#1% {\the\itemgroupfinalizer \itemgroupsymbol {\calculatelistwidth\currentitemlevel \hbox to \itemgrouplistwidth {#1\hskip\getitemparameter\currentitemlevel\c!distance}}} \def\itemgrouphead {\the\itemgroupfinalizer \settrue\headlistitem\doitemgrouphead} \def\itemgroupitems {\the\itemgroupfinalizer \dosingleempty\doitemgroupitems} \def\doitemgroupitems[#1]% {\itemgroupedge {\dorecurse{0\getitemparameter\currentitemlevel\c!items}{\listitem\hss}% \unskip}} \def\itemgroupmargin#1% {\the\itemgroupfinalizer \def\marsymbol {\llap {\dosetitemattributes\currentitemlevel\c!marstyle\c!marcolor{#1}% \hskip\leftskip\hskip\leftmargindistance}}% \itemgroupitem} \appendtoks \let\item \itemgroupitem \to \itemgroupcommands \appendtoks \let\noitem \itemgroupnoitem \to \itemgroupcommands \appendtoks \letvalue\v!item \itemgroupitem \to \itemgroupcommands \appendtoks \let\itm \itemgroupitem \to \itemgroupcommands \appendtoks \let\but \itemgroupbutton \to \itemgroupcommands \appendtoks \let\nop \itemgroupdummy \to \itemgroupcommands \appendtoks \letvalue\v!sub \itemgroupsubitem \to \itemgroupcommands \appendtoks \letvalue\v!sym \itemgroupsymbol \to \itemgroupcommands \appendtoks \letvalue\v!ran \itemgroupedge \to \itemgroupcommands \appendtoks \letvalue\v!head \itemgrouphead \to \itemgroupcommands \appendtoks \letvalue\v!its \itemgroupitems \to \itemgroupcommands \appendtoks \letvalue\v!mar \itemgroupmargin \to \itemgroupcommands % todo : \startitem .. \stopitem % % beware, we don't group (yet) as we want to keep the left/right skip % % \startitemize % \startitem \stopitem % some intermediate text that will properly indent % \startitem \stopitem % \stopitem % % so we need to keep that property \appendtoks \letvalue{\e!start\v!item}\itemgroupitem \letvalue{\e!stop \v!item}\endgraf \to \itemgroupcommands \appendtoks \setvalue{\e!start\v!head}#1{\itemgrouphead#1\par}% \letvalue{\e!stop \v!head}\endgraf \to \itemgroupcommands % \startitemize % \starthead {xx} test \stophead % \startitem test \stopitem % \startitem test \stopitem % \stopitemize % Sometimes the user demands get pretty weird: % % \startitemize % \item test % \item test % \headsym{xx} test \par test % \stopitemize % aligned items % % \startitemize[n,fit,broad][itemalign=flushright] % \dorecurse{100}{\item The first item.} % \stopitemize % % \setupitemgroup[itemize][each][fit] % \setupitemgroup[itemize][each][distance=.5em,factor=1,itemalign=flushright] % % \startitemize[n] % \dorecurse{100}{\item The first item.} % \stopitemize \appendtoks \let\headsym \itemgroupheadsym \to \itemgroupcommands \def\itemgroupheadsym#1% {\def\symsymbol{#1}% \settrue\symbollistitem \settrue\headlistitem \doitemgrouphead} % \defineitemgroup[gbitemize] % \setupitemgroup[gbitemize][each][headstyle=bold] % \startgbitemize % \txt{italian} some italians like this kind of cross||breed between % an itemize and a description % \txt{sicilians} i wonder how many sicilian mathematicians do a thesis % on the math involved in predicting the next big bang of the vulcano % \stopgbitemize \appendtoks \letvalue\v!txt\itemgrouptext \to \itemgroupcommands \newconditional\txtlistitem \setfalse\txtlistitem \def\itemgrouptext#1% {\def\symsymbol{#1}% \settrue\symbollistitem \settrue\txtlistitem \itemgroupitem} \def\dodotxtitem {\scratchdimen\wd\itemgroupitembox \advance \scratchdimen \getitemparameter\currentitemlevel\c!distance\relax \ifdim\scratchdimen>\itemgrouplistwidth \advance\scratchdimen -\itemgrouplistwidth \else \scratchdimen\zeropoint \fi \llap{\hbox to \itemgrouplistwidth{\ifconditional\sublistitem\llap{+\enspace}\fi\box\itemgroupitembox\hss}}% was: \hfill \hskip\scratchdimen} \def\optimizelistitemsbreak {\ifcase\itemcolumndepth \ifconditional\optimizelistitem \ifcase \currentnofitems \else \ifnum\currentnofitems=\plusthree \ifnum\noflistelements>\plusone \noitembreakspecial \fi \else\ifnum\currentnofitems>\plusthree \ifnum\noflistelements=\plustwo \ifconditional\introlistitem \noitembreak \else \noitembreakspecial \fi \else\ifnum\currentnofitems=\noflistelements\relax \noitembreakspecial \else\ifnum\noflistelements>\plustwo \itembreakspecial \else \ifconditional\introlistitem\else\itembreakspecial\fi \fi\fi\fi \fi\fi \fi \fi\fi} \def\dodosubitem {\ifconditional\sublistitem\llap{+\enspace}\fi} \def\dodolapitem {\llap {\hbox to \itemgrouplistwidth {\dodosubitem \symalignleft \box\itemgroupitembox % can already have a forced widt, only factor handled here \hfil \hskip\getitemparameter\currentitemlevel\c!distance}}} \def\dolistitem % evt aantal items opslaan per niveau, scheelt zoeken {\ifconditional\textlistitem % begin of item \else \par \fi \advance\noflistelements\plusone \optimizelistitemsbreak \setfalse\indentedfirstlistitem \ifx\currentitemindenting\empty \else \normalexpanded{\noexpand\setupindenting[\v!reset,\v!yes,\currentitemindenting]}% \doifnot{\getitemparameter\currentitemlevel\c!alignsymbol}\v!yes {\ifindentfirstparagraph\settrue\indentedfirstlistitem\fi}% \fi \dontleavehmode \ifconditional\indentedfirstlistitem \hskip-\parindent \fi \setbox\itemgroupitembox\hbox {\ifconditional\headlistitem \ifconditional\symbollistitem \dosetitemattributes\currentitemlevel\c!symstyle\c!symcolor{\symsymbol}% \else \dosetitemattributes\currentitemlevel\c!headstyle\c!headcolor{\listitem}% \fi \else \ifconditional\symbollistitem \dosetitemattributes\currentitemlevel\c!symstyle\c!symcolor{\symsymbol}% \else \dosetitemattributes\currentitemlevel\c!style\c!color{\listitem}% \fi \fi}% \doifsomething\doitemdestination {\setbox\itemgroupitembox\hbox{\directgotobox{\box\itemgroupitembox}[\doitemdestination]}}% \itemgroupaskedwidth\getitemparameter\currentitemlevel\c!width\relax \ifconditional\fittinglistitems \ifdim\wd\itemgroupitembox>\getitemparameter\currentitemlevel\c!maxwidth sp\relax \xsetitemparameter\currentitemlevel\c!maxwidth{\number\wd\itemgroupitembox}% \fi \ifdim\currentitemmaxwidth>\zeropoint \setbox\itemgroupitembox\simplealignedbox {\getitemparameter\currentitemlevel\c!itemalign} {\dimexpr\currentitemmaxwidth+\getitemparameter\currentitemlevel\c!distance\relax} {\box\itemgroupitembox\hskip\getitemparameter\currentitemlevel\c!distance}% \fi \else\ifdim\itemgroupaskedwidth>\zeropoint \doifsomething{\getitemparameter\currentitemlevel\c!itemalign} {\setbox\itemgroupitembox\simplealignedbox {\getitemparameter\currentitemlevel\c!itemalign} {\dimexpr\itemgroupaskedwidth+\getitemparameter\currentitemlevel\c!distance\relax} {\box\itemgroupitembox\hskip\getitemparameter\currentitemlevel\c!distance}}% \fi\fi \globallet\doitemdestination\empty % new, prevents loops when symbol is (not yet found) graphic \ht\itemgroupitembox\strutheight \dp\itemgroupitembox\strutdepth % so that content differs per run (esp mp graphics afterwards) \checkforrepeatedlistitem \ifdim\itemgroupaskedwidth<\zeropoint\relax \llap{\ifconditional\sublistitem\llap{+\enspace}\fi\box\itemgroupitembox\hskip\leftmargindistance}% \else \ifdim\itemgroupaskedwidth=\zeropoint\relax \calculatelistwidth1% \else \calculatelistwidth\currentitemlevel \fi \ifconditional\textlistitem \hbox{\ifconditional\sublistitem+\enspace\fi\box\itemgroupitembox\hskip\interwordspace}\nobreak \else\ifconditional\inlinelistitem \hbox to \itemgrouplistwidth{\ifconditional\sublistitem\llap{+\enspace}\fi\box\itemgroupitembox\hss}% was: \hfill \else\ifconditional\txtlistitem \dodotxtitem \else \dodolapitem \fi\fi\fi \fi \setevalue{\@@currentitemsymbol\currentitemlevel}% {\getvalue{\@@localitemsymbol\currentitemlevel}}% still problems with \uchar ? %{\noexpand\getvalue{\@@localitemsymbol\currentitemlevel}}% no, spoils subrefs \setfalse\headlistitem \setfalse\sublistitem \setfalse\symbollistitem \EveryPar{\ignorespaces}% needed ? \ifconditional\indentedfirstlistitem \hskip\parindent \fi \ignorespaces} % For Wolfgang Schuster % \startitemize[n,repeat] % \noitem \startitemize[a] \item Item 1.a. \item Item 1.b. \stopitemize % \noitem \startitemize[a] \item Item 2.a. \item Item 2.b. \stopitemize % \stopitemize \def\donolistitem % reduced \dolistitem {\advance\noflistelements\plusone \setbox\itemgroupitembox\hbox {\dosetitemattributes\currentitemlevel\c!style\c!color{\listitem}}% \checkforrepeatedlistitem \ignorespaces} \def\doitemgroupnoitem {\doadvanceitem\donolistitem} % For Frank Grieshaber and Mojca Miklavec: \newconditional\repeatlistitem \def\checkforrepeatedlistitem {\ifconditional\repeatlistitem \ifx\currentrepeatstart\empty \let\currentrepeatstart\currentitemlevel \fi \setbox\itemgroupitembox\hbox to \wd\itemgroupitembox{\hskip-\itemgroupaskedwidth\box\itemgroupitembox}% what a hack ! \fi} % \startbuffer % \item % \startitemize[n] % \item item 1.1 % \item item 1.2 % \startitemize[n] \item item 1.2.1 \item item 1.2.2 \stopitemize % \item item 1.3 % \stopitemize % \item % \startitemize[n] \item item 2.1 \item item 2.2 \stopitemize % \item item 3 % \startitemize[n] \item item 3.1 \item item 3.2 \stopitemize % \item % \startitemize[n] \item item 4.1 \item item 4.2 \stopitemize % \stopbuffer % % \startitemize[n,repeat,6*broad,packed] \getbuffer \stopitemize \blank[3*big] % \startitemize[n,repeat,packed] \getbuffer \stopitemize \blank[3*big] % \setupitemize[each][atmargin][width=3em] % \startitemize[n,repeat,packed] \getbuffer \stopitemize \chardef\autoitemgroupspacing=2 % 0 = voor/na, 1=tussen als geen voor 2=(prev)tussen=old/normal \def\complexdoitemgroupitem[#1]% {\def\currentitemreference{#1}% \ifconditional\textlistitem % begin of item \else \par \fi \ifconditional\concatnextitem % new, concat \noitembreak % new, concat \fi % new, concat \doadvanceitem \ifconditional\firstlistitem \setfalse\firstlistitem \begingroup \ifcase\currentitemlevel \or % 1 \ifcase\itemcolumndepth \ifconditional\introlistitem\noitembreak\fi \itembeforecommand \ifconditional\introlistitem\noitembreak\fi \fi \else % 2 en hoger \ifconditional\paragraphlistitem \else \edef\previtemlevel{\the\numexpr\currentitemlevel-1}% \ifcase\autoitemgroupspacing\relax % nieuw \itembeforecommand \or \doifelsenothing\itembeforecommand\itembeforecommand{\getitemparameter\previtemlevel\c!inbetween}% \else \getitemparameter\previtemlevel\c!inbetween \fi \fi \fi \else \ifconditional\textlistitem % was bugged: \inlinelistitem \ifhmode % WS: make the distance between items customizable, think about better default values -> see itemize-1.tex \normalexpanded{\doassigntextitemdistance{\getitemparameter\currentitemlevel\c!textdistance}}% HH: moved out and made configurable (sort of) \removeunwantedspaces\hskip\textitemdistance\relax \fi \else \iteminbetweencommand \fi \fi \ifconditional\concatnextitem \vskip-\dimexpr\lastskip+\lineheight\relax \nobreak \fi \dolistitem \relax \ifconditional\packlistitem \setupwhitespace[\v!none]% \fi \getitemparameter\currentitemlevel\c!inner \marsymbol \let\marsymbol\relax \strut % added 11-08-99 \setfalse\concatnextitem % new, concat \nobreak % else problems with intext items \hskip\itemsignal % new, concat \getitemparameter\currentitemlevel\c!command} % \defaultitemcommand % \startitemize[text][space=medium] % \item one \item two \item three % \stopitemize \setvalue{\??op:\??op:\c!textdistance:\v!none}% {\def\textitemdistance{\zeropoint}} \def\doassigngiventextitemdistance#1% {\assignvalue {#1}% \textitemdistance {.5\interwordspace\!!plus.5\emwidth}% {\interwordspace \!!plus \emwidth}% {\emwidth \!!plus \interwordstretch\!!minus\interwordshrink}} \unexpanded\def\doassigntextitemdistance#1% {\ifcsname\??op:\??op:\c!textdistance:#1\endcsname \csname\??op:\??op:\c!textdistance:#1\endcsname \else \doassigngiventextitemdistance{#1}% \fi} \def\defaultitemcommand {\EveryPar{\ignorespaces}% needed ? \ignorespaces} % For Giuseppe "Oblomov" Bilotta, inspired on a suggestion by Taco % Hoekwater. % % \def\MyItemCommand#1{{\bf#1}\quad} % \setupitemgroup[itemize][command=\MyItemCommand] % % \startitemize % \item {test} is this okay? % \item {test} is this okay? % \item {test} is this okay? % \stopitemize \def\complexitem[#1]#2\par % todo: no two pass data {\startitemgroup[#1]% \complexdoitemgroupitem[]\begstrut#2\endstrut\par \stopitemgroup} \definecomplexorsimpleempty\item \definecomplexorsimpleempty\doitemgroupitem \def\complexhead[#1]#2\par#3\par {\startitemgroup[#1]% \complexdoitemgrouphead[]\begstrut#2\endstrut\par\begstrut#3\endstrut\par \stopitemgroup} % the next solution accepts \head test \type{x{x}x} test ... \let\doenditemhead\relax \def\complexdoitemgrouphead[#1]% beter in \complexdosom hangen met een if {\ifconditional\firstlistitem\else\allowitembreak\fi \ifconditional\packlistitem\else\itembeforeheadcommand\fi \ifconditional\firstlistitem\ifconditional\introlistitem\else\ifcase\currentitemlevel % incr in \complexdosom \allowitembreak \fi\fi\fi \complexdoitemgroupitem[#1]% \bgroup \dosetitemattributes\currentitemlevel\c!headstyle\c!headcolor\empty \ignorespaces \itemgroupfinalizer{\enditemhead}% \let\par\enditemhead} % brrrr but simple anyway \def\enditemhead {\removeunwantedspaces \egroup \ifconditional\textlistitem \space\ignorespaces \else \par \fi \noitembreak \ifconditional\packlistitem\else\itemafterheadcommand\fi \noitembreak \noindentation} \definecomplexorsimpleempty\head \definecomplexorsimpleempty\doitemgrouphead \def\sym#1% {\noindent \begingroup \setbox\scratchbox\hbox{\trialtypesettingtrue#1}% \setbox\scratchbox\hbox \ifdim\wd\scratchbox<1em to 1.5\else spread 1\fi em{#1\hfil}% \normalexpanded{\box\scratchbox\endgroup\hangindent\the\wd\scratchbox}% \ignorespaces} \setupitemgroups [\c!margin=\zeropoint, \c!leftmargin=\zeropoint, \c!rightmargin=\zeropoint, \c!indentnext=\v!yes, \c!width=1.5em, \c!factor=0, \c!distance=.5em, %\c!align=\v!normal, % definitely not \v!normal, see mails and %\c!align=, % debug reports of David A & Patrick G on context list %\c!symalign=, %\c!color=, %\c!indenting=, % untouched if empty %\c!style=, \c!marstyle=\c!type, % \c! ??? %\c!symstyle=, %\c!headstyle=, %\c!marcolor=, %\c!symcolor=, %\c!headcolor=, %\c!beforehead=, \c!afterhead=\blank, \c!before=\blank, \c!inbetween=\blank, \c!after=\blank, %\c!stopper=., \c!placestopper=\v!yes, \c!stopper=., %\c!inner=, \c!n=2, \c!items=4, \c!lefttext=(, \c!righttext=), \c!start=1, \c!criterium=\v!all, % permits 0 and negative numbers %\c!option=, \c!textdistance=\v!big, \c!command=\defaultitemcommand, \c!indenting=\v!next, %\c!alignsymbol=v!no, \c!symbol=\currentitemlevel] % new: \setupitemgroups [\c!step=.5em, % deals with broad \c!distance=\zeropoint] \setupitemgroups [\c!prefix=\v!no, % \c!prefixstopper=., % \c!prefixseparatorset=, % \c!prefixconversion=, % \c!prefixconversionset=, % \c!prefixset=, % \c!prefixsegments=1:100, \c!prefixconnector=., % \c!numberseparatorset=, \c!numberconversionset=, \c!numberstopper=., \c!numbersegments=1] \defineitemgroup [\v!itemize] \protect \endinput