%D \module %D [ file=strc-itm, % updated %D version=1997.03.31, %D title=\CONTEXT\ Structure Macros, %D subtitle=itemgroups, %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. % new: text + lefttext=(,righttext=) % start= \writestatus{loading}{ConTeXt Structure Macros / Itemgroups} \unprotect % - instellingen in macro % - [0] voor start op 0 % - start=2 \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 \newcount\noflists \newcount\currentnoflists \newcount\itemcolumndepth \newcount\itemdepth \newcount\maxitemdepth \definetwopasslist\s!list \let\currentitemlevel \!!zerocount \let\currentitemgroup \empty \let\currentnofitems \!!zerocount \let\currentmaxnofitems\!!zerocount \let\currentminnofitems\!!zerocount \let\currentitemoffset \!!zerocount \def\currentitemnumber{\countervalue{\@@itemcounter\currentitemlevel}} % tricky ... we cannot use trialtypesetting here because there can be % multiple itemizes in e.g. a table, so we need something more advanced % where counters etc are reset to pre-outertrial values \def\dolistreference {\ifconditional\continuelistitems \savetaggedtwopassdata\s!list{\number\currentnoflists}{\number\currentnoflists}% {\currentitemlevel:\noflistelements:c:\getitemparameter\currentitemlevel\c!maxwidth}% \else \savetaggedtwopassdata\s!list{\number\currentnoflists}{\number\currentnoflists}% {\currentitemlevel:\noflistelements:n:\getitemparameter\currentitemlevel\c!maxwidth}% \fi} \def\splititemtwopassdata#1% {\expanded{\findtwopassdata{\s!list}{\number#1}}% \expandafter\dosplititemtwopassdata\twopassdata:0:0:0:0:0\relax} \def\dosplititemtwopassdata#1:#2:#3:#4:#5\relax {\edef\itemdatal{#1}\edef\itemdatan{#2}\edef\itemdatat{#3}\edef\itemdataw{#4}} \def\checkcurrentnofitems {\splititemtwopassdata\currentnoflists \iftwopassdatafound \ifcase\itemdatan\relax % \scratchcounter \let\currentnofitems \!!zerocount \let\currentminnofitems\!!plusone \let\currentmaxnofitems\!!zerocount \else \scratchcounter\itemdatan\relax \edef\currentnofitems{\the\scratchcounter}% \let\currentitemtag\itemdatat \doloop {\splititemtwopassdata{\numexpr\currentnoflists+\recurselevel\relax}% \iftwopassdatafound \ifnum\itemdatal=\currentitemlevel\relax \doifelse{c}\itemdatat {\advance\scratchcounter\itemdatan\relax} {\exitloop}% \fi \else \exitloop \fi}% \edef\currentmaxnofitems{\the\scratchcounter}% \scratchcounter\zerocount \doif{c}\currentitemtag {\doloop {\splititemtwopassdata{\numexpr\currentnoflists-\recurselevel\relax}% \iftwopassdatafound \ifnum\itemdatal=\currentitemlevel\relax \doifelse{c}\itemdatat {\advance\scratchcounter\itemdatan\relax} {\advance\scratchcounter\itemdatan\exitloop}% \fi \else \exitloop \fi}}% \advance\scratchcounter\plusone \edef\currentminnofitems{\the\scratchcounter}% % [[\currentnofitems,\currentminnofitems,\currentmaxnofitems]] \fi \else % new, when no tuo yet \let\currentnofitems \!!zerocount \let\currentminnofitems\!!plusone \let\currentmaxnofitems\!!zerocount \fi} % [[\currentnofitems,\currentminnofitems,\currentmaxnofitems]] % \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\unknownitemreference{0} \let\itemreferences\unknownitemreference % #1=level #2=parameter \def\getitemparameter #1#2{\csname\??op\currentitemgroup#1#2\endcsname} \def\setitemparameter #1#2{\@EA\def\csname\??op\currentitemgroup#1#2\endcsname} % #3 -> {#3} \def\letitemparameter #1#2{\@EA\let\csname\??op\currentitemgroup#1#2\endcsname} % works ok but not needed (also possible compatibility problem) % % \def\getitemparameter#1#2% % {\executeifdefined{\??op\currentitemgroup#1#2}% % {\executeifdefined{\??op\currentitemgroup #2}% % {\executeifdefined{\??oo #2}% % {}}}} % test this: saves hash entries and is also faster % % \let\doinitializeitemgrouplevel\gobbleoneargument % todo ! ! ! \def\getitemparameter#1#2% {\executeifdefined{\??op\currentitemgroup#1#2}% {\executeifdefined{\??op\currentitemgroup #2}% {\executeifdefined{\??oo #2}% {}}}} \def\doitemattributes #1{\doattributes{\??op\currentitemgroup#1}} \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\textlistitem\else\dosomebreak#1\fi} % % s-pre-61 / pre-dis, test extensively, 2004/5 \def\doitembreak#1{\ifconditional\optimizelistitem\ifconditional\textlistitem\else\dosomebreak#1\fi\fi} \def\initializeitemgroupslevel#1% {\ifundefined{\@@globalitemsymbol{#1}}% \edef\itemreferences{\itemreferences,#1}% \makecounter{\@@itemcounter#1}% \setevalue{\@@globalitemsymbol{#1}}{#1}% \fi} \def\initializeitemgrouplevel#1% safeguard {\ifundefined{\??op\currentitemgroup#1\c!width}% \doinitializeitemgrouplevel{#1}% \fi} \def\doinitializeitemgrouplevel#1% {\copyparameters [\??op\currentitemgroup#1][\??oo] [\c!width,\c!factor,\c!distance,\c!align,\c!symalign,\c!option,% \c!style,\c!marstyle,\c!symstyle,\c!headstyle,% \c!color,\c!marcolor,\c!symcolor,\c!headcolor,% \c!beforehead,\c!afterhead,\c!before,\c!inbetween,\c!after,% \c!stopper,\c!placestopper,\c!indenting,% \c!n,\c!inner,\c!symbol,\c!margin,\c!items,% \c!leftmargin,\c!rightmargin,\c!indentnext,% \c!command,% \c!start,\c!lefttext,\c!righttext]} \def\setupitemgroups {\dosingleargument\dosetupitemgroups} \def\dosetupitemgroups[#1]% still undocumented {\getparameters[\??oo][\c!levels=4,#1]% % will change (remove) \ifnum\@@oolevels>\maxitemdepth \maxitemdepth\@@oolevels\relax \dorecurse\maxitemdepth{\initializeitemgroupslevel\recurselevel}% \fi} \def\doitemreference#1,#2,#3\\% {\ifnum\currentitemlevel>#1\relax \ifnum#1>\zerocount \tempsymbol \fi \getvalue{\@@currentitemsymbol{#2}}% \doitemreference#2,#3\\% \fi} \def\itemreference {\expandafter\doitemreference\itemreferences,,\\} \def\packitems {\ifcase\currentitemlevel \else \settrue\packlistitem \fi} \def\dosetupitemgroupvariable[#1]% [#2]% niveau instellingen {\doifelsenothing{#1} {\getparameters[\??op\currentitemgroup\currentitemlevel]}% [#2]}% {\getparameters[\??op\currentitemgroup#1]}}% [#2]}} \newconditional\inlinelistitem \setfalse\inlinelistitem \def\dododosetupitemgroupconstant[#1][#2#3#4]% * permits [2] {\global\setitemparameter\currentitemlevel\c!maxwidth{0}% \processaction [#2#3#4] [ \v!packed*=>\packitems, \v!intro*=>\settrue\introlistitem, % here? not set to false % no: \v!random*=>\settrue\randomizeitems,% here? not set to false \v!autointro*=>\settrue\autointrolistitem, \v!broad*=>\setitemparameter{#1}\c!factor{1}, #2#3*\v!broad*=>\setitemparameter{#1}\c!factor{#2#3}, #2*\v!broad*=>\setitemparameter{#1}\c!factor{#2}, \v!text*=>\settrue\textlistitem \settrue\inlinelistitem \settrue\joinedlistitem % \dosetuppackeditemgroup{#1}% \packitems, \v!columns*=>\packitems, \v!before*=>\settrue\beforelistitem, \v!after*=>\settrue\afterlistitem, \v!nowhite*=>\settrue\nowhitelistitem, % \def\packeditemspacing{\nowhitespace}, \v!margin*=>\setitemparameter{#1}\c!width{-2em}, % signal \v!inmargin*=>\setitemparameter{#1}\c!width{-2em}, % signal \v!atmargin*=>\doifnot{#1}{1}{\setitemparameter{#1}\c!width{0em}}, % signal \v!intext*=>\settrue\inlinelistitem, % new \v!loose*=>\setfalse\optimizelistitem, \v!fit*=>\settrue\fittinglistitems, \v!nofit*=>\setfalse\fittinglistitems, \v!paragraph*=>\settrue\paragraphlistitem \packitems, \v!joinedup*=>\settrue\joinedlistitem % \dosetuppackeditemgroup{#1}% \packitems, \v!serried*=>\setitemparameter{#1}\c!factor{-1}, #2#3*\v!serried*=>\setitemparameter{#1}\c!factor{-#2#3}, #2*\v!serried*=>\setitemparameter{#1}\c!factor{-#2}, \v!stopper*=>\setitemparameter{#1}\c!placestopper{\v!yes}, % keep {} \v!unpacked*=>\setfalse\packlistitem, \v!repeat*=>\settrue\repeatlistitem, % new \v!reverse*=>\settrue\reverselistitem, \v!standard*=>\dosetupstandarditemgroup{#1}]} \def\dosetupstandarditemgroup#1% {\getparameters [\??op\currentitemgroup#1] [\c!width=1.5em, \c!factor=0, \c!distance=.5em, \c!beforehead=, \c!afterhead=\blank, \c!before=\blank, \c!inbetween=\blank, \c!after=\blank, \c!inner=]} % \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\dosetuppackeditemgroup#1% % {\setitemparameter{#1}\c!beforehead{\packeditemspacing}% % \setitemparameter{#1}\c!afterhead {\packeditemspacing}% % \setitemparameter{#1}\c!before {\packeditemspacing}% % \setitemparameter{#1}\c!after {\packeditemspacing}% % \setitemparameter{#1}\c!inbetween {\packeditemspacing}} \def\dosetupitemgroupconstant[#1][#2]% {\def\dodosetupitemgroupconstant##1% catches empty in [a,b,] handy for xml {\doifsomething{##1}{\dododosetupitemgroupconstant[#1][##1*]}}% \processcommacommand[#2]\dodosetupitemgroupconstant} % expansion of #2 is handy for xml \def\dododododosetupitemgroup[#1][#2]% {\doifassignmentelse{#2}% {\dosetupitemgroupvariable[#1][#2]}% {\setitemparameter{#1}\c!option{#2}}}% \def\dodododosetupitemgroup[#1][#2]% {\ConvertToConstant\doifnot{#2}{} {\doifelse{#1}\v!each {\dorecurse\maxitemdepth{\ExpandFirstAfter\dododododosetupitemgroup[\recurselevel][#2]}} {\ExpandFirstAfter\dododododosetupitemgroup[#1][#2]}}} \def\dododosetupitemgroup[#1][#2]% {\ConvertToConstant\doifelse{#2}{} {\ifcase\currentitemlevel\relax \dodododosetupitemgroup[\v!each][#1]% \else \dodododosetupitemgroup[\currentitemlevel][#1]% \fi} {\doifelsenothing{#1} {\dodododosetupitemgroup[\currentitemlevel][#2]} {\dodododosetupitemgroup[#1][#2]}}} \def\dodosetupitemgroup[#1][#2][#3][#4]% {\pushmacro\currentitemgroup \def\currentitemgroup{#1}% \dododosetupitemgroup[#2][#3]% \ConvertToConstant\doifnot{#4}{} % anders wordt #2 overruled {\dododosetupitemgroup[#2][#4]}% \popmacro\currentitemgroup} \def\dosetupitemgroup[#1][#2][#3][#4]% {\def\docommand##1{\dodosetupitemgroup[##1][#2][#3][#4]}% \processcommalist[#1]\docommand} \def\setupitemgroup {\doquadrupleempty\dosetupitemgroup} \def\doadvanceitem {\ifconditional\sublistitem\else\ifconditional\symbollistitem\else \pluscounter{\@@itemcounter\currentitemlevel}% \fi\fi} \def\setitemlevel#1% {\ifnum\currentitemlevel>\zerocount \settrue\firstlistitem % \expanded{\setitemparameter{\currentitemlevel}{\c!start}{1}}% *** \doifinset{0}{#1}{\setitemparameter\currentitemlevel\c!start{0}}% *** \setcounter{\@@itemcounter\currentitemlevel}{\the\numexpr\getitemparameter\currentitemlevel\c!start-1\relax}% *** \doifelsenothing{\getitemparameter\currentitemlevel\c!start} {\def\currentitemoffset{1}} {\def\currentitemoffset{\getitemparameter\currentitemlevel\c!start}% \letitemparameter\currentitemlevel\c!start\empty}% \def\tempnumber {\countervalue{\@@itemcounter\currentitemlevel}}% \doifelse{\getitemparameter\currentitemlevel\c!placestopper}\v!yes {\def\tempsymbol{\getitemparameter\currentitemlevel\c!stopper}} {\let\tempsymbol\empty}% \fi} \def\actualitemnumber {\ifconditional\reverselistitem \convertnumber\currentitemsymbol{\numexpr\currentmaxnofitems+\currentitemoffset-\currentitemnumber+1\relax}% \else \convertnumber\currentitemsymbol{\numexpr\currentminnofitems+\currentitemoffset+\currentitemnumber-1\relax}% \fi} % PAS OP: ook 'opelkaar' en zo worden getest, nog eens afvangen! \def\unknownitemsymbol{?} \def\setitemmark#1% % en pas op: resets \docommand {\doifsymboldefinedelse{#1} {\edef\currentitemsymbol{#1}% \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}% \setgvalue{\@@localitemsymbol \currentitemlevel}{\unknownitemsymbol}% \def\listitem{\symbol[\currentitemsymbol]}% \let\@@opsymbol\empty}% \let\docommand\gobbleoneargument} {\doifconversiondefinedelse{#1} {\edef\currentitemsymbol{#1}% \setxvalue{\@@globalitemsymbol\currentitemlevel}{\currentitemsymbol}% \setgvalue{\@@localitemsymbol\currentitemlevel }{\actualitemnumber }% \ifconditional\textlistitem \doifsomething{\getitemparameter\currentitemlevel\c!lefttext} {\let\tempsymbol\empty}% \fi \def\listitem {\getitemparameter\currentitemlevel {\ifconditional\textlistitem\c!lefttext\else\c!left\fi}% \getvalue{\@@localitemsymbol\currentitemlevel}\tempsymbol \getitemparameter\currentitemlevel {\ifconditional\textlistitem\c!righttext\else\c!right\fi}}% \let\@@opsymbol\empty}%\let\docommand\gobbleoneargument} {}}} \def\calculatelistwidth#1#2% distance deals with 'broad' {#2=\getitemparameter{#1}\c!distance\relax \ifnum\getitemparameter{#1}\c!factor>\zerocount \ifdim#2=\zeropoint #2=.5em\fi \fi \multiply#2 \getitemparameter{#1}\c!factor \advance #2 \getitemparameter{#1}\c!width\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 \def\startitemgroup {\dotripleempty\dostartitemgroup} % \def\dostartitemgroup[#1][#2][#3]% % {\bgroup % \def\currentitemgroup{#1}% % \ifthirdargument % \dodostartitemgroup[#2][#3]% % \else % \doifassignmentelse{#2} % {\dodostartitemgroup[][#2]} % {\dodostartitemgroup[#2][]}% % \fi} \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}% \initializeitemgrouplevel\currentitemlevel % safeguard \edef\itemgroupoptions{\getitemparameter\currentitemlevel\c!option}% \ifx\itemgroupoptions\empty \edef\itemgroupoptions{#1}% \else \doifsomething{#1}{\edef\itemgroupoptions{\itemgroupoptions,#1}}% \fi \expanded{\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} \def\stopcollectitems {\ifconditional\randomizeitems \newcounter\itemcollectcounterdone \ifnum\itemcollectcounter>\zerocount \@EAEAEA\flushcollecteditems \fi \fi} \def\startcollectitems {\ifconditional\randomizeitems \newcounter\itemcollectcounter \letvalue{\e!start\v!item}\collectitemgroupitem \fi} %D End of plugin. \ifx\startcolumns\undefined \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]} \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 \newcounter\noflistelements \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{\getitemparameter\currentitemlevel\c!symbol}% \letgvalueempty{\@@globalitemsymbol\currentitemlevel}% \global\letitemparameter\currentitemlevel\v!continue\empty % \setitemmark\@@opsymbol % ** default value \dosetupitemgroupvariable[\currentitemlevel][#2]} {\dosetupitemgroupconstant[\currentitemlevel][#1]% \dosetupitemgroupvariable[\currentitemlevel][#2]% \doifinsetelse\v!continue{#1}% \noexpand, else problems in non-etex with chinese {\edef\@@opsymbol{\noexpand\getvalue{\@@globalitemsymbol\currentitemlevel}}% \getitemparameter\currentitemlevel\v!continue} {\edef\@@opsymbol{\noexpand\getitemparameter{\currentitemlevel}{\c!symbol}}% \global\setitemparameter\currentitemlevel\v!continue {\dosetupitemgroupconstant[\currentitemlevel][#1]% \dosetupitemgroupvariable[\currentitemlevel][#2]}}% \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 {\getitemparameter1\c!margin}% \doadaptleftskip {\getitemparameter1\c!leftmargin}% \doadaptrightskip{\getitemparameter1\c!rightmargin}% \fi \dosetraggedcommand{\getitemparameter\currentitemlevel\c!align}\raggedcommand \dosetsymalign{\getitemparameter\currentitemlevel\c!symalign}% \doifsomething{\getitemparameter\currentitemlevel\c!indenting} {% is \expanded needed? \expanded{\setupindenting[\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=>\!!counta1\relax, \v!two=>\!!counta2\relax, \v!three=>\!!counta3\relax, \v!four=>\!!counta4\relax, \v!five=>\!!counta5\relax, \s!unknown=>\@EA\!!counta\getitemparameter\currentitemlevel\c!n]% \startcolumns [\c!n=\!!counta, % netter \??op\currentitemlevel\c!n \c!height=, \c!rule=\v!off, \c!balance=\v!yes, \c!align=\v!no]% \fi\fi}% \ifconditional\fittinglistitems \splititemtwopassdata\currentnoflists \ifdim\itemdataw sp>\zeropoint \expanded{\setitemparameter{\currentitemlevel}{\c!width}{\itemdataw sp}}% \fi \fi \calculatelistwidth\currentitemlevel{\dimen0}% \ifdim\dimen0>\zeropoint\relax \ifconditional\inlinelistitem\else \advance\leftskip \dimen0\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 \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 \doitembreak\allowbreak % toegevoegd \itemaftercommand % \getitemparameter\currentitemlevel\c!after % was: \dochecknextindentation\??oo, is now: \dochecknextindentation{\??op\currentitemgroup\currentitemlevel}% \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 \def\itemgroupitem {\doitemgroupitem} \def\itemgroupnoitem {\doitemgroupnoitem} \def\itemgroupbutton[#1]% {\gdef\doitemdestination{#1}% \itemgroupitem} \def\itemgroupdummy {\itemgroupsymbol{\strut}\strut} \def\itemgroupsubitem {\settrue\sublistitem \itemgroupitem} \def\itemgroupsymbol#1% {\def\symsymbol{\doitemattributes\currentitemlevel\c!symstyle\c!symcolor{#1}}% \settrue\symbollistitem \itemgroupitem} \def\itemgroupedge#1% {\itemgroupsymbol {\calculatelistwidth\currentitemlevel{\dimen0}% \hbox to \dimen0 {#1\hskip\getitemparameter\currentitemlevel\c!distance}}} \def\itemgrouphead {\settrue\headlistitem\doitemgrouphead} \def\itemgroupitems {\dosingleempty\doitemgroupitems} \def\doitemgroupitems[#1]% {\itemgroupedge {\dorecurse{0\getitemparameter\currentitemlevel\c!items}{\listitem\hss}% \unskip}} \def\itemgroupmargin#1% {\def\marsymbol {\llap {\doitemattributes\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 \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{\doitemattributes\currentitemlevel\c!symstyle\c!symcolor{#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{\doitemattributes\currentitemlevel\c!headstyle\c!headcolor{#1}}% \settrue\symbollistitem \settrue\txtlistitem \itemgroupitem} \def\itembreak % -10 {\flushnotes\penalty-5\relax} \def\itemnobreak % +5 {\flushnotes\penalty+5\ifinsidecolumns\else00\fi\relax} \def\dodotxtitem {\scratchdimen\wd8 \advance \scratchdimen \getitemparameter\currentitemlevel\c!distance\relax \ifdim\scratchdimen>\dimen0 \advance\scratchdimen -\dimen0 \else \scratchdimen\zeropoint \fi \llap{\hbox to \dimen0{\ifconditional\sublistitem\llap{+}\fi\box8\hss}}% was: \hfill \hskip\scratchdimen} \def\optimizelistitemsbreak {\ifcase\itemcolumndepth \ifconditional\optimizelistitem \ifcase \currentnofitems \else \ifnum\currentnofitems=\plusthree \ifnum\noflistelements>\plusone \doitembreak\itemnobreak \fi \else\ifnum\currentnofitems>\plusthree \ifnum\noflistelements=\plustwo \ifconditional\introlistitem \doitembreak\nobreak \else \doitembreak\itemnobreak \fi \else\ifnum\currentnofitems=\noflistelements\relax \doitembreak\itemnobreak \else\ifnum\noflistelements>\plustwo \doitembreak\itembreak \else \ifconditional\introlistitem\else\doitembreak\itembreak\fi \fi\fi\fi \fi\fi \fi \fi\fi} \def\dolistitem % evt aantal items opslaan per niveau, scheelt zoeken {\ifconditional\textlistitem % begin of item \else \par \fi % \ignorespaces \increment\noflistelements \optimizelistitemsbreak \noindent \setbox8\hbox {\ifconditional\headlistitem \ifconditional\symbollistitem \symsymbol \else \doitemattributes\currentitemlevel\c!headstyle\c!headcolor{\listitem}% \fi \else \ifconditional\symbollistitem \symsymbol % no attributes, why? \else \doitemattributes\currentitemlevel\c!style\c!color{\listitem}% \fi \fi}% \ifconditional\fittinglistitems \ifdim\wd8>\getitemparameter\currentitemlevel\c!maxwidth sp\relax \expanded{\global\noexpand\setitemparameter{\currentitemlevel}{\c!maxwidth}{\number\wd8}}% \fi \splititemtwopassdata\currentnoflists \ifdim\itemdataw sp>\zeropoint \setbox8\simplealignedbox{\getitemparameter\currentitemlevel\c!itemalign}{\itemdataw sp}{\box8}% \fi \fi \doifsomething\doitemdestination {\setbox8\hbox{\goto{\box8}[\doitemdestination]}}% \globallet\doitemdestination\empty \dimen2=\getitemparameter\currentitemlevel\c!width\relax % new, prevents loops when symbol is (not yet found) graphic \ht8=\strutheight \dp8=\strutdepth % so that content differs per run (esp mp graphics afterwards) \checkforrepeatedlistitem \ifdim\dimen2<\zeropoint\relax \llap{\ifconditional\sublistitem\llap{+}\fi\box8\hskip\leftmargindistance}% \else \ifdim\dimen2=\zeropoint\relax \calculatelistwidth1{\dimen0}% \else \calculatelistwidth\currentitemlevel{\dimen0}% \fi \ifconditional\textlistitem \hbox{\ifconditional\sublistitem+\fi\box8\hskip\interwordspace}\nobreak \else\ifconditional\inlinelistitem \hbox to \dimen0{\ifconditional\sublistitem\llap{+}\fi\box8\hss}% was: \hfill \else\ifconditional\txtlistitem \dodotxtitem \else % todo: align+marge binnen de hbox % \llap{\hbox to \dimen0{\ifconditional\sublistitem\llap{+}\fi\box8\hfill}}% \llap{\hbox to \dimen0{\ifconditional\sublistitem\llap{+}\fi \symalignleft \box8\hfil \hskip\getitemparameter\currentitemlevel\c!distance% T h }}% \fi\fi\fi \fi \forceunexpanded % needed for m conversion (\os) / i need to look into this \setevalue{\@@currentitemsymbol\currentitemlevel}% {\getvalue{\@@localitemsymbol\currentitemlevel}}% still problems with \uchar ? %{\noexpand\getvalue{\@@localitemsymbol\currentitemlevel}}% no, spoils subrefs \resetunexpanded \setfalse\headlistitem \setfalse\sublistitem \setfalse\symbollistitem \EveryPar{\ignorespaces}% needed ? \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 {\increment\noflistelements \setbox8\hbox {\doitemattributes\currentitemlevel\c!style\c!color{\listitem}}% \checkforrepeatedlistitem \ignorespaces} \def\doitemgroupnoitem {\doadvanceitem\donolistitem} % For Frank Grieshaber and Mojca Miklavec: \newconditional\repeatlistitem \def\checkforrepeatedlistitem {\ifnum\currentitemlevel=\plusone \initializeboxstack{item}% \fi \ifconditional\repeatlistitem \savebox{item}{\currentitemlevel}{\hbox{\copy8}}% \setbox8\hbox to \wd8 {\setbox\scratchbox\hbox {\scratchcounter\currentitemlevel \advance\scratchcounter\minusone \dorecurse\scratchcounter{\foundbox{item}{\recurselevel}}}% \ifnum\currentitemlevel>\plusone \ifdim\wd\scratchbox>\zeropoint \hskip-\dimen2 \box\scratchbox \fi \fi \box8 }% \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]% {\ifconditional\textlistitem % begin of item \else \par \fi % \ignorespaces \ifconditional\concatnextitem % new, concat \doitembreak\nobreak % new, concat \fi % new, concat \doadvanceitem \ifcase\itemcolumndepth \ifnum\noflistelements>0\relax % wrong, but why was this here in the first place, probably some % mistaken change when cleaning up: \doitembreak\nobreak \fi\fi \ifconditional\firstlistitem \setfalse\firstlistitem \begingroup \ifcase\currentitemlevel \or % 1 \ifcase\itemcolumndepth \ifconditional\introlistitem\doitembreak\nobreak\fi \itembeforecommand % \getitemparameter\currentitemlevel\c!before \ifconditional\introlistitem\doitembreak\nobreak\fi \fi \else % 2 en hoger \ifconditional\paragraphlistitem \else \let\previtemlevel\currentitemlevel \decrement\previtemlevel \ifcase\autoitemgroupspacing\relax % nieuw \itembeforecommand \or \doifelsenothing{\itembeforecommand} {\itembeforecommand} {\getitemparameter\previtemlevel\c!inbetween}% \else \getitemparameter\previtemlevel\c!inbetween % == itemlevel-1 \fi \fi \fi \else \ifconditional\textlistitem % was bugged: \inlinelistitem % \removeunwantedspaces\hskip\interwordspace\!!plus\emwidth\relax % new per 2006/10/20 \removeunwantedspaces\hskip\emwidth\!!plus\interwordstretch\!!minus\interwordshrink\relax % new per 2006/10/20 \else \iteminbetweencommand \fi \fi \ifconditional\concatnextitem % new, concat \vskip-\lastskip % new, concat \vskip-\lineheight % new, concat \nobreak % new, concat \fi % new, concat % \ignorespaces \dolistitem \relax \ifconditional\packlistitem \setupwhitespace[\v!none]% \fi \getitemparameter\currentitemlevel\c!inner \marsymbol \let\marsymbol\relax \doifsomething{#1} {\doifnot\itemreference\unknownitemreference {\bgroup \protectconversion \rawreference\s!lst{#1}\itemreference \egroup}}% \strut % added 11-08-99 \setfalse\concatnextitem % new, concat \nobreak % else problems with intext items \hskip\itemsignal % new, concat \getitemparameter\currentitemlevel\c!command} % \defaultitemcommand \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} % \def\complexdoitemgrouphead[#1]#2\par% % beter in \complexdosom hangen met een if % {\ifconditional\firstlistitem\else\doitembreak\allowbreak\fi % \ifconditional\packlistitem\else\itembeforeheadcommand\fi % \ifconditional\firstlistitem\ifconditional\introlistitem\else\ifcase\currentitemlevel % incr in \complexdosom % \doitembreak\allowbreak % \fi\fi\fi % \complexdoitemgroupitem[#1]{\doitemattributes\currentitemlevel\c!headstyle\c!headcolor % {\ignorespaces#2}}% % \ifconditional\textlistitem % \removeunwantedspaces\space\ignorespaces % \else % \par % \fi % \doitembreak\nobreak % \ifconditional\packlistitem\else\itemafterheadcommand\fi % \doitembreak\nobreak % \noindentation} % % the next solution accepts \head test \type{x{x}x} test ... \def\dostartitemattributes#1{\dostartattributes{\??op\currentitemgroup#1}} \def\dostopitemattributes {\dostopattributes} \def\complexdoitemgrouphead[#1]% beter in \complexdosom hangen met een if {\ifconditional\firstlistitem\else\doitembreak\allowbreak\fi \ifconditional\packlistitem\else\itembeforeheadcommand\fi \ifconditional\firstlistitem\ifconditional\introlistitem\else\ifcase\currentitemlevel % incr in \complexdosom \doitembreak\allowbreak \fi\fi\fi \complexdoitemgroupitem[#1]% \bgroup \dostartitemattributes\currentitemlevel\c!headstyle\c!headcolor\empty \ignorespaces \let\par\enditemhead} % brrrr but simple anyway \def\enditemhead {\removeunwantedspaces \dostopitemattributes \egroup \ifconditional\textlistitem \space\ignorespaces \else \par \fi \doitembreak\nobreak \ifconditional\packlistitem\else\itemafterheadcommand\fi \doitembreak\nobreak \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}% % \hangindent\wd\scratchbox % \box\scratchbox % \endgroup % \ignorespaces} \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}% \expanded{\box\scratchbox\endgroup\hangindent\the\wd\scratchbox}% \ignorespaces} \setupitemgroups % undocumented [\c!levels=6, \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!color=, \c!style=, % kan tzt weg \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!inner=, \c!n=2, \c!items=4, \c!lefttext=(, \c!righttext=), \c!start=1, \c!option=, \c!command=\defaultitemcommand, \c!symbol=\currentitemlevel] % \v!niveau \def\defineitemgroup {\dodoubleempty\dodefineitemgroup} \def\dodefineitemgroup[#1][#2]% {\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]}% \getparameters[\??ig#1][\c!levels=3,#2]% \ifnum\getvalue{\??ig#1\c!levels}<\maxitemdepth\relax \setevalue{\??ig#1\c!levels}{\number\maxitemdepth}% \fi \dorecurse{\getvalue{\??ig#1\c!levels}}{\initializeitemgrouplevel\recurselevel}% \popmacro\currentitemgroup}} % efficient default itemize as well as upward compatible % definition: \defineitemgroup [\v!itemize] [\c!levels=6] % keep these, needed for styles: % \def\startitemize {\startitemgroup[\v!itemize]} % \def\stopitemize {\stopitemgroup} % \def\setupitemize {\setupitemgroup[\v!itemize]} \protect \endinput