%D \module %D [ file=node-rul, %D version=2009.11.03, % 1995.10.10, %D title=\CONTEXT\ Core Macros, %D subtitle=Bars, %D author=Hans Hagen, %D date=\currentdate, %D copyright={PRAGMA / Hans Hagen \& Ton Otten}] %C %C This module is part of the \CONTEXT\ macro||package and is %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. % todo: ex and and em traveling with attribute \writestatus{loading}{ConTeXt Core Macros / Bars} %D The name of this file might change. %D \macros %D {underbar,underbars, %D overbar,overbars, %D overstrike,overstrikes, %D setupbar} %D %D In the rare case that we need undelined words, for instance %D because all font alternatives are already in use, one can %D use \type{\underbar} and \type{\overstrike} and their plural %D forms. %D %D \startbuffer %D \underbars{drawing \underbar{bars} under words is a typewriter leftover} %D \overstrikes{striking words makes them \overstrike{unreadable} but %D sometimes even \overbar{top lines} come into view.} %D \stopbuffer %D %D \typebuffer %D %D \startvoorbeeld %D \startlines %D \getbuffer %D \stoplines %D \stopvoorbeeld %D %D The next macros are derived from the \PLAIN\ \TEX\ one, but %D also supports nesting. The \type{$} keeps us in horizontal %D mode and at the same time applies grouping. %D %D \showsetup{underbar} %D \showsetup{underbars} %D \showsetup{overbar} %D \showsetup{overbars} %D \showsetup{overstrike} %D \showsetup{overstrikes} %D %D \showsetup{setupunderbar} \unprotect %definesystemattribute[ruled] %definesystemattribute[shifted] \registerctxluafile{node-rul}{1.001} \newtoks\checkalldefinedbars \def\barparameter #1{\csname\dobarparameter\currentbar#1\endcsname} \def\dobarparameter #1#2{\ifcsname\??on#1#2\endcsname\??on#1#2\else\expandafter\dobarparentparameter\csname\??on#1\s!parent\endcsname#2\fi} \def\dobarparentparameter#1#2{\ifx#1\relax\s!empty\else\dobarparameter#1#2\fi} \unexpanded\def\definebar {\dotripleempty\dodefinebar} \def\dodefinebar[#1][#2][#3]% {\ifthirdargument \getparameters[\??on#1][\s!parent=#2,#3]% \else \getparameters[\??on#1][\s!parent=,#2]% \fi % %\setvalue{\??on:#1}{0}% % \ifcsname\??on:#1:c\endcsname \csname\??on:#1:c\endcsname\zerocount \else \expandafter\newcount\csname\??on:#1:c\endcsname \fi \normalexpanded{\checkalldefinedbars{\noexpand\doredefinebar{#1}\the\checkalldefinedbars}}% \dodefinebarindeed{#1}% \setuvalue{#1}{\doruled{#1}}} \def\dodefinebarindeed#1% {\bgroup \def\currentbar{#1}% \doifsomethingelse{\barparameter\c!color} {\donetrue\colored[\barparameter\c!color]} {\donefalse}% \normalexpanded {\egroup \scratchcounter\ctxlua{nodes.rules.define { method = \barparameter\c!method, offset = \barparameter\c!offset, continue = "\barparameter\c!continue", dy = \barparameter\c!dy, rulethickness = \barparameter\c!rulethickness, unit = "\barparameter\c!unit", order = "\barparameter\c!order", max = \barparameter\c!max, ma = \ifdone\the\attribute\colormodelattribute \else0\fi, ca = \ifdone\the\attribute\colorattribute \else0\fi, ta = \ifdone\the\attribute\transparencyattribute\else0\fi }}}% \setevalue{\??on#1:a}{\the\scratchcounter}} \let\doredefinebar\dodefinebarindeed \def\doruled#1% {\groupedcommand{\dodoruled{#1}}\relax} \def\dodoruled {\ctxlua{nodes.rules.enable()}% \glet\dodoruled\dodoruledindeed \dodoruled} \def\dodoruledindeed#1% {\advance\csname\??on:#1:c\endcsname\plusone \scratchcounter\csname\??on:#1:c\endcsname \attribute\ruledattribute\numexpr1000*\scratchcounter +\csname\??on#1\ifcsname\??on#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname} % ungrouped \unexpanded\def\startbar[#1]% {\begingroup \dodoruled{#1}} \unexpanded\def\stopbar {\endgroup} \newcount\currentbarnesting % todo: same as colors \unexpanded\def\pushbar[#1]% {\global\advance\currentbarnesting\plusone \expandafter\edef\csname\??on:s:\number\currentbarnesting\endcsname {\attribute\ruledattribute\the\attribute\ruledattribute}% stack \dodoruled{#1}} \unexpanded\def\popbar {\csname\??on:s:\number\currentbarnesting\endcsname \global\advance\currentbarnesting\minusone} \unexpanded\def\setupbars {\dodoubleempty\dosetupbars} \def\dosetupbars[#1][#2]% not that efficient {\ifsecondargument \getparameters[\??on#1][#2]% \dodefinebarindeed{#1}% \else \getparameters[\??on][#1]% \the\checkalldefinedbars \fi} \setupbars [\c!method=0, % new: 0=center nested, 1=stack nested \c!continue=\v!no, \c!offset=0, % upwards, replaces: topoffset bottomoffset \c!dy=0, \c!max=3, \c!rulethickness=.1, \c!order=\v!foreground, \c!unit=ex, % so now we are relative \c!color=] % replaces: rulecolor % \definebar[touchbar] [\c!method=0,\c!dy=-0.4,\c!offset=-0.0] % \definebar[touchbars] [touchbar] [\c!continue=\v!yes] \definebar[\v!overstrike] [\c!method=0,\c!dy= 0.4,\c!offset= 0.5,\c!continue=\v!yes] \definebar[\v!underbar] [\c!method=1,\c!dy=-0.4,\c!offset=-0.3,\c!continue=\v!yes] \definebar[\v!overbar] [\c!method=1,\c!dy= 0.4,\c!offset= 1.8,\c!continue=\v!yes] \definebar[\v!overstrikes] [\v!overstrike] [\c!continue=\v!no] \definebar[\v!underbars] [\v!underbar] [\c!continue=\v!no] \definebar[\v!overbars] [\v!overbar] [\c!continue=\v!no] % we want these always so ... \expandafter\let\expandafter\overstrike \csname\v!overstrike \endcsname \expandafter\let\expandafter\underbar \csname\v!underbar \endcsname \expandafter\let\expandafter\overbar \csname\v!overbar \endcsname \expandafter\let\expandafter\overstrikes\csname\v!overstrikes\endcsname \expandafter\let\expandafter\underbars \csname\v!underbars \endcsname \expandafter\let\expandafter\overbars \csname\v!overbars \endcsname \unexpanded\def\setupunderbar[#1]% too incompatible for the moment {} %D This will move: (a bit duplicated) \newtoks\checkalldefinedshifts \def\shiftparameter #1{\csname\doshiftparameter\currentshift#1\endcsname} \def\shiftparameterhash#1{\doshiftparameterhash{\??ra\currentshift}#1} \def\doshiftparameter #1#2{\ifcsname\??ra#1#2\endcsname\??ra#1#2\else\expandafter\doshiftparentparameter\csname\??ra#1\s!parent\endcsname#2\fi} \def\doshiftparameterhash#1#2{\ifcsname#1#2\endcsname#1\else\expandafter\doshiftparentparameterhash\csname#1\s!parent\endcsname#2\fi} \def\doshiftparentparameter #1#2{\ifx#1\relax\s!empty\else\doshiftparameter #1#2\fi} \def\doshiftparentparameterhash#1#2{\ifx#1\relax \else\doshiftparameterhash#1#2\fi} \def\dosetshiftattributes#1#2% style color {\edef\fontattributehash {\shiftparameterhash#1}% \edef\colorattributehash{\shiftparameterhash#2}% \ifx\fontattributehash \empty\else\dosetfontattribute \fontattributehash #1\fi \ifx\colorattributehash\empty\else\dosetcolorattribute\colorattributehash#2\fi} \unexpanded\def\defineshift {\dotripleempty\dodefineshift} \def\dodefineshift[#1][#2][#3]% {\ifthirdargument \getparameters[\??ra#1][\s!parent=#2,#3]% \else \getparameters[\??ra#1][\s!parent=,#2]% \fi % %\setvalue{\??ra:#1}{0}% % \ifcsname\??ra:#1:c\endcsname \csname\??ra:#1:c\endcsname\zerocount \else \expandafter\newcount\csname\??ra:#1:c\endcsname \fi \normalexpanded{\checkalldefinedshifts{\noexpand\doredefineshift{#1}\the\checkalldefinedshifts}}% \dodefineshiftindeed{#1}% \setuvalue{#1}{\doshifted{#1}}} \def\dodefineshiftindeed#1% {\bgroup \def\currentshift{#1}% \normalexpanded {\egroup \scratchcounter\ctxlua{nodes.shifts.define { method = \shiftparameter\c!method, continue = "\shiftparameter\c!continue", dy = \shiftparameter\c!dy, unit = "\shiftparameter\c!unit", }}}% \setevalue{\??ra#1:a}{\the\scratchcounter}} \let\doredefineshift\dodefineshiftindeed \def\doshifted#1% {\groupedcommand{\dodoshifted{#1}}\relax} \def\dodoshifted {\ctxlua{nodes.shifts.enable()}% \glet\dodoshifted\dodoshiftedindeed \dodoshifted} % \def\dodoshiftedindeed#1% % {\def\currentshift{#1}% % \advance\csname\??ra:#1:c\endcsname\plusone % \scratchcounter\csname\??ra:#1:c\endcsname % \attribute\shiftedattribute\numexpr1000*\scratchcounter % +\csname\??ra#1\ifcsname\??ra#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname % \setupalign[\shiftparameter\c!align]% % \dosetshiftattributes\c!style\c!color} \def\dostartisolation{\char0 } \def\dostopisolation {\char0 } \def\doisolator {\char0 } \def\doisolatedgroupedalign#1#2% {\groupedcommand {\begingroup\dostartisolation\begingroup#1} {#2\endgroup\dostopisolation\endgroup}} \def\dosetupisolatedalign#1% {\doisolator \setupalign[#1]\relax} \def\dodoshiftedindeed#1% {\def\currentshift{#1}% \advance\csname\??ra:#1:c\endcsname\plusone \scratchcounter\csname\??ra:#1:c\endcsname \attribute\shiftedattribute\numexpr1000*\scratchcounter +\csname\??ra#1\ifcsname\??ra#1:\number\scratchcounter\s!parent\endcsname:\number\scratchcounter\fi:a\endcsname \dosetshiftattributes\c!style\c!color \dosetupisolatedalign{\shiftparameter\c!align}} \def\doshifted#1% {\doisolatedgroupedalign{\dodoshifted{#1}}{}} \unexpanded\def\startshift[#1]% {\begingroup \dodoshifted{#1}} \unexpanded\def\stopshift {\endgroup} \unexpanded\def\setupshifts {\dodoubleempty\dosetupshifts} \def\dosetupshifts[#1][#2]% not that efficient {\ifsecondargument \getparameters[\??ra#1][#2]% \dodefineshiftindeed{#1}% \else \getparameters[\??ra][#1]% \the\checkalldefinedshifts \fi} \setupshifts [\c!method=0, \c!continue=\v!no, \c!dy=0, \c!unit=ex, \c!align=, \c!style=, \c!color=] \def\v!shiftup {shiftup} \def\v!shiftdown{shiftdown} \defineshift [\v!shiftup] [\c!method=0,\c!dy=-1,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=] \defineshift [\v!shiftdown] [\c!method=1,\c!dy=.3,\c!unit=ex,\c!continue=\v!yes,\c!style=\txx,\c!color=] % we want these always so ... \expandafter\let\expandafter\shiftup \csname\v!shiftup \endcsname \expandafter\let\expandafter\shiftdown \csname\v!shiftdown \endcsname \protect \endinput % obsolete: \setupunderbar [\c!alternative=a, \c!rulethickness=\linewidth, \c!bottomoffset=1.5pt, \c!topoffset=2.5pt, \c!rulecolor=]