%D \module %D [ file=strc-ren, %D version=2008.10.20, %D title=\CONTEXT\ Structure Macros, %D subtitle=Section Rendering, %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 / Section Rendering} \unprotect \chardef\headtimingmode=0 % \chardef\headtimingmode=1 % 0 also works ok now too % % Martin Kolarik's problem: % % \setuphead[section][command=\doTitle] % \def\doTitle#1#2{\ruledvbox{\forgetall \hsize=4cm \ruledhbox{\ruledvtop{#1}\ruledvtop{#2}}}} % \section{test test test test test test test test test test test test test test test test test} \newevery \everyheadstart \relax \unexpanded\def\placeheadmargintexts {\the\everyheadstart \doif{\structureheadparameter\c!margintext}\v!yes\placemargincontent} \unexpanded\def\setupheadcomponentfont#1#2% {\ifconditional\structureheadisdisplay \edef\askedstructureheadinterlinespace{\structureheadparameter\c!interlinespace}% \ifx\askedstructureheadinterlinespace\empty % here the interline space is only set when style sets no space \setfalse\fontattributeisset \setfalse\interlinespaceisset \dosetstructureheadattributes\c!style\c!color \ifconditional\fontattributeisset \ifconditional\interlinespaceisset \else \setupinterlinespace \fi \fi \setfalse\fontattributeisset \dosetstructureheadattributes#1#2% \ifconditional\fontattributeisset \ifconditional\interlinespaceisset \else \setupinterlinespace \fi \fi \else % here the set interline space overloads any other set space in the style \setfalse\fontattributeisset \dosetstructureheadattributes\c!style\c!color \ifconditional\fontattributeisset \dosetupcheckedinterlinespace\askedstructureheadinterlinespace \fi \setfalse\fontattributeisset \dosetstructureheadattributes#1#2% \ifconditional\fontattributeisset \dosetupcheckedinterlinespace\askedstructureheadinterlinespace \fi \fi \else \setfalse\fontattributeisset \dosetstructureheadattributes\c!style\c!color \ifconditional\fontattributeisset \setupspacing \fi \setfalse\fontattributeisset \dosetstructureheadattributes#1#2% \ifconditional\fontattributeisset \setupspacing \fi \fi \dontconvertfont} \def\doplaceheadtextcomponent#1#2% {\begingroup \setupheadcomponentfont\c!textstyle\c!textcolor % \ifcase\headtimingmode#1\fi % can introduce cr \structureheadparameter\c!commandbefore \placeheadmargintexts \ifconditional\structureheadisdisplay % \ifdisplaysectionhead \structureheadparameter\c!textcommand% struts can be nilled with \setnostrut {\setstrut \begstrut \ifcase\headtimingmode\hbox{#1}\fi \executeifdefined{\??nh\currentstructurehead\c!deeptextcommand}\firstofoneargument{#2}% \endstrut}% \hbox prevents break \xdef\localheadheight {\the\strutht}% \xdef\localheaddepth {\the\strutdp}% \xdef\localheadlineheight{\the\lineheight}% % == \globallet\localheaddepth\strutdepth \else \ifcase\headtimingmode#1\fi \structureheadparameter\c!textcommand {\executeifdefined{\??nh\currentstructurehead\c!deeptextcommand}\firstofoneargument{#2}}% \fi \structureheadparameter\c!commandafter \ifconditional\structureheadisdisplay % \ifdisplaysectionhead \endgraf \fi \endgroup} \def\doplaceheadnumbercomponent#1#2% {\begingroup \setupheadcomponentfont\c!numberstyle\c!numbercolor % \getvalue{\??ko\currentstructurehead\c!commandbefore}% strange, why here? moved 21/11/2005 \placeheadmargintexts \ifconditional\structureheadisdisplay % \ifdisplaysectionhead % can be nilled with \setnostrut \structureheadparameter\c!numbercommand {\setstrut \begstrut \executeifdefined{\??nh\currentstructurehead\c!deepnumbercommand}\firstofoneargument{#2}% \endstrut}% \else \structureheadparameter\c!numbercommand {\executeifdefined{\??nh\currentstructurehead\c!deepnumbercommand}\firstofoneargument{#2}}% \fi \endgroup} % \newif\ifheadnumbercontent % \newif\ifemptyhead % \newif\ifdisplaysectionhead \def\structureheadattribute{\iflocation attr \destinationattribute \currentstructureattribute\fi} \def\doplacestructureheadtext#1#2#3% nodes, text, endstuff {\beginheadplacement \doresettructureheadnumbercontent \ifconditional\structureheadleaveempty \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint {#1}% \makestrutofbox\sectionheadbox \else \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute {\doresettructureheadnumbercontent \ifcase\headtimingmode\or#1\fi % outerside font determines distance \dosetfontattribute{\??nh\currentstructurehead}\c!style % but we don't want color to influence user command, todo: get the if-else out of it \structureheadparameter\c!command{}{\doplaceheadtextcomponent{#1}{#2}}}% \fi \endheadplacement{#3}} \def\doplacestructureheadnumbertext#1#2#3#4% nodes number text nodes {\beginheadplacement \doiftextelse{#2}\dosettructureheadnumbercontent\doresettructureheadnumbercontent \ifconditional\structureheadleaveempty \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute to \zeropoint{#1}% \makestrutofbox\sectionheadbox \else % = needed \setbox\sectionheadbox\ifvertical\vbox\else\hbox\fi \structureheadattribute {\ifcase\headtimingmode\or#1\fi \dosetfontattribute{\??nh\currentstructurehead}\c!style \structureheadparameter\c!command{\doplaceheadnumbercomponent{#1}{#2}}{\doplaceheadtextcomponent{#1}{#3}}}% \fi \endheadplacement{#4}} \unexpanded\def\placestructureheadnumbertext {\doplacestructureheadnumbertext\empty\getstructureheadnumber\getstructureheadtitle\getstructureheadsyncs} \unexpanded\def\placestructureheadtext {\doplacestructureheadtext\empty\getstructureheadtitle\getstructureheadsyncs} \unexpanded\def\placestructureheadempty {\hbox \structureheadattribute {\getstructureheadsyncs}} %D \starttyping %D \def\StretchedBox#1% %D {\framed %D [frame=off,offset=.5em,align=middle,width=broad] %D {\sc\def\stretchedspaceamount{.3em}\stretchednormalcase{#1}}} %D %D \definehead[MySubject][subject] %D \setuphead [MySubject][deeptextcommand=\StretchedBox] %D %D \MySubject{feeling stretched feeling stretched feeling stretched feeling stretched} %D \stoptyping \let\headlastlinewidth\!!zeropoint \def\localheadheight {\strutht} \def\localheaddepth {\strutdp} \def\localheadlineheight{\lineheight} \def\dolocalheadsetup % koppeling met standaard kopcommando / engels {\forgetall % traag dus ... \doifsomething{\structureheadparameter\c!align } {\normalexpanded{\noexpand\setupalign [\structureheadparameter\c!align ]}}% \doifsomething{\structureheadparameter\c!tolerance} {\normalexpanded{\noexpand\setuptolerance[\structureheadparameter\c!tolerance]}}% \doif {\structureheadparameter\c!strut }\v!no{\setnostrut}% new \def\\{\crlf\strut\ignorespaces}} \def\beginheadplacement {\bgroup \setsystemmode\currentstructurehead \xdef\localheadheight {\the\strutht}% \xdef\localheaddepth {\the\strutdp}% \xdef\localheadlineheight{\the\lineheight}% % == \globallet\localheaddepth\strutdp \everypar\emptytoks % needed indeed \noindent % ipv \whitespace elders, na \forgetall ! \bgroup \doifinsetelse{\structureheadparameter\c!aligntitle}{\v!yes,\v!float}% new {\skip0 1\leftskip \skip2 1\rightskip \xdef\localheadskip{\the\skip0}% \forgetall \leftskip\skip0 \rightskip\skip2 \setlocalhsize\hsize\localhsize \forgetbothskips} {\globallet\localheadskip\!!zeropoint \forgetall}% \dontcomplain \postponenotes \iflocation \ifconditional\structureheadisdisplay % \ifdisplaysectionhead \else \noninterferingmarks \fi \fi \resetinteractionparameter\c!style \resetinteractionparameter\c!color \resetinteractionparameter\c!contrastcolor %\strictouterreferencestrue % tzt instelling \let\localheadsetup\dolocalheadsetup} % \setuphead[chapter] [style=\bfd,after=,hang=line] % fit broad 2 % \setuphead[section] [style=\bfc,after=,hang=line] % \setuphead[subsection] [style=\bfb,after=,hang=line] % \setuphead[subsubsection] [style=\bfa,after=,hang=line] % \setuphead[subsubsubsection][style=\bf ,after=,hang=line] % % \chapter {Test} \input tufte \page % \section {Test} \input tufte \page % \subsection {Test} \input tufte \page % \subsubsection {Test} \input tufte \page % \subsubsubsection{Test} \input tufte \page % % \chapter {Test\\Test} \input tufte \page % \section {Test\\Test} \input tufte \page % \subsection {Test\\Test} \input tufte \page % \subsubsection {Test\\Test} \input tufte \page % \subsubsubsection{Test\\Test} \input tufte \page \def\hangheadplacement {\scratchdimen\localheadlineheight \bgroup \openlineheight\scratchdimen \scratchdimen\htdp0% \getnoflines\scratchdimen \advance\noflines\minusone \normalexpanded{\egroup\noflines\the\noflines}% brrr \setbox0\hbox{\lower\noflines\scratchdimen\box0}% \scratchdimen\dimexpr\htdp0-\localheadheight+\strutdp\relax \ht0 \strutht \dp0 \strutdp \edef\localheaddepth{\the\strutdp}} \newconditional\continuoussectionhead % oeps, \newif\ifcontinuoushead got lost \newbox\sectionheadbox \def\endheadplacement#1% {\noflines\zerocount \ifconditional\structureheadisdisplay % \ifdisplaysectionhead % new (todo tight == one following line up) \processaction [\structureheadparameter\c!hang] [ \v!line=>\hangheadplacement\noflines\zerocount, \v!broad=>\hangheadplacement\getnoflines\scratchdimen, \v!fit=>\hangheadplacement\getrawnoflines\scratchdimen, \v!none=>\noflines\zerocount, \v!default=>\noflines\zerocount, \v!unknown=>\hangheadplacement\noflines\numexpr0\commalistelement-1\relax]% % so far \let\headlastlinewidth\!!zeropoint % kind of special, we want to snap heads also according to local specs local \ifgridsnapping \begingroup \edef\currentstructureheadgridsnapping{\structureheadparameter\c!grid}% \ifconditional\structureheadisdisplay \ifx\currentstructureheadgridsnapping\empty\else \dosetstructureheadattributes\c!style\c!color \setupinterlinespace \dosetstructureheadattributes\c!textstyle\c!textcolor \setupinterlinespace \fi \fi \snaptogrid[\currentstructureheadgridsnapping]\hbox {\hskip\localheadskip\hskip\structureheadparameter\c!margin\box\sectionheadbox}% \endgroup \else \hbox {\hskip\localheadskip\hskip\structureheadparameter\c!margin\box\sectionheadbox}% \fi \flushnotes % new, not really needed \endgraf \ifvmode \ifnum\noflines>\zerocount \dorecurse\noflines{\nointerlineskip\dosomebreak\nobreak\strut\endgraf}% to be checked \fi \nointerlineskip \dosomebreak\nobreak \fi #1% \else \strut \flushnotes % new, here since we're in par mode \unhbox\sectionheadbox \globallet\headlastlinewidth\!!zeropoint #1% \hskip\numberheaddistance\!!plus\numberheaddistance\!!minus.25\dimexpr\numberheaddistance\relax \hskip\continuousstructureheadsignal\ignorespaces \fi \ifconditional\structureheadisdisplay % \ifdisplaysectionhead \ifvmode \ifgridsnapping % important, font related depth, see comment \prevdepth\strutdp \else \prevdepth\localheaddepth \fi \fi \fi \egroup \egroup \ifconditional\structureheadisdisplay % \ifdisplaysectionhead \checknextindentation[\structureheadparameter\c!indentnext]% \else \nonoindentation % recently added, was a bug \fi} % nice testcase % % \setupheads[aligntitle=yes] % % \startnarrower % \subject{\dorecurse{100}{x }} % \section{\dorecurse{100}{x }} % \input tufte \par % \setupheads[alternative=inmargin] % \subject{\dorecurse{100}{x }} % \section{\dorecurse{100}{x }} % \input tufte \par % \stopnarrower \let\numberheadalternative\v!normal \unexpanded\def\defineheadplacement {\dodoubleargument\dodefineheadplacement} \def\dodefineheadplacement[#1][#2]% #3#4 {\setvalue{\??ns:#1}{#2}% \setvalue{\??ns::#1}} \def\presetnumberheadalternative {\doifelsevalue{\??ns:\numberheadalternative}\v!horizontal\setfalse\settrue\structureheadisdisplay} % \def\normalplacehead % {\executeifdefined % {\??ns::\numberheadalternative} % {\getvalue{\??ns::\v!normal}}} \def\normalplacehead {\csname\??ns::\ifcsname\??ns::\numberheadalternative\endcsname\numberheadalternative\else\v!normal\fi\endcsname} \defineheadplacement[\v!paragraph][\v!vertical]#1#2% {\vbox {\localheadsetup \begstrut \ifconditional\structureheadshownumber % \ifheadnumbercontent #1\hskip\numberheaddistance \fi #2}} % \defineheadplacement[\v!normal][\v!vertical]#1#2% % {\ifconditional\structureheadshownumber % \ifheadnumbercontent % \setbox0\hbox{{#1}\hskip\numberheaddistance}% % \vbox % {\localheadsetup % \hangindent 1\wd0 % \hangafter 1 % \noindent % \unhbox0 % don't use \strut's here! % #2}% % \else % \vbox % {\localheadsetup\noindent#2}% % \fi} % % enhanced version: % \setuphead % [chapter] % [numberwidth=2cm,hang=line,after={\blank[3*line]}] % % \chapter{Oeps oeps oeps} \input tufte \section{Oeps} % \chapter{Oeps oeps oeps} \section{Oeps} \input tufte \defineheadplacement[\v!normal][\v!vertical]#1#2% {\vbox {\localheadsetup \edef\headwidth {\structureheadparameter\c!width }% \edef\headnumberwidth{\structureheadparameter\c!numberwidth}% \edef\headtextwidth {\structureheadparameter\c!textwidth }% \ifconditional\structureheadshownumber % \ifheadnumbercontent \ifx\headwidth\empty \else \ifx\headnumberwidth\empty \ifx\headtextwidth\empty\else \edef\headnumberwidth{\the\dimexpr\headwidth-\headtextwidth\relax}% \fi \else \ifx\headtextwidth\empty \edef\headtextwidth{\the\dimexpr\headwidth-\headnumberwidth\relax}% \fi \fi \hsize\headwidth \fi \ifx\headnumberwidth\empty\else \let\numberheaddistance\!!zeropoint \fi \setbox\scratchbox\hbox \ifx\headnumberwidth\empty\else to \headnumberwidth\fi{{#1}}% \scratchdimen\dimexpr\wd\scratchbox+\numberheaddistance\relax \ifx\headtextwidth\empty\else \hsize\dimexpr\scratchdimen+\headparameter\c!textwidth\relax \fi \hangindent\scratchdimen \hangafter \plusone \noindent \box\scratchbox\hskip\numberheaddistance \else \ifx\headtextwidth\empty \ifx\headwidth\empty \else \hsize\headwidth \fi \else \hsize\headtextwidth \fi \noindent \fi #2}} \unexpanded\def\placeheadmargin#1#2% {\vbox {\localheadsetup \begstrut % use one \strut here! \dontleavehmode % in case there is no strut, else side effects with llap \ifconditional\structureheadshownumber % \ifheadnumbercontent \llap{\hbox to 5em{\hfill{#1}\hskip\localheadskip\hskip\leftmargindistance}}% introduces whitespace % maybe better: % \inleftmargin{\hbox{\hss{#1}\hskip\localheadskip}}% \fi {#2}}} \defineheadplacement[\v!inmargin][\v!vertical]#1#2{\placeheadmargin{#1}{#2}} \defineheadplacement[\v!margin] [\v!vertical]#1#2{\placeheadmargin{#1}{#2}} \defineheadplacement[\v!middle][\v!vertical]#1#2% {\vbox {\localheadsetup \veryraggedcenter \let\\\endgraf \let\crlf\endgraf \ifconditional\structureheadshownumber % \ifheadnumbercontent \strut#1\par \fi \begstrut#2}} \defineheadplacement[\v!text][\v!horizontal]#1#2% {\bgroup \localheadsetup % no stretch in distance \ifconditional\structureheadshownumber % \ifheadnumbercontent {#1}\kern\numberheaddistance \fi {\begstrut#2}% \egroup} \unexpanded\def\placeheadlohi#1#2#3% {\ifconditional\structureheadshownumber % \ifheadnumbercontent \setbox0\hbox{#2} \setbox2=#1{\localheadsetup\advance\hsize-\wd0\relax#3}% \hbox{\box0\hskip\numberheaddistance\box2}% \else #1{\localheadsetup\noindent#3}% \fi} % onder/boven lijnt het nummer op de onderste/bovenste regel % uit van een meerregelige kop \defineheadplacement[\v!bottom][\v!vertical]#1#2{\placeheadlohi\vbox{#1}{#2}} \defineheadplacement[\v!top] [\v!vertical]#1#2{\placeheadlohi\vtop{#1}{#2}} \protect \endinput