diff options
Diffstat (limited to 'tex/context/base/pack-mrl.mkiv')
-rw-r--r-- | tex/context/base/pack-mrl.mkiv | 920 |
1 files changed, 474 insertions, 446 deletions
diff --git a/tex/context/base/pack-mrl.mkiv b/tex/context/base/pack-mrl.mkiv index ec214d4f3..f3f3d11d9 100644 --- a/tex/context/base/pack-mrl.mkiv +++ b/tex/context/base/pack-mrl.mkiv @@ -13,24 +13,26 @@ \writestatus{loading}{ConTeXt Packaging Macros / More Rules} -%D The (re)implementation of margin rules has been moved elsewhere. +%D This module needs an overhaul. \unprotect %D \macros %D {setupblackrules,blackrule} %D -%D The graphic capabilities of \TEX\ do not go beyond simple filled rules, except of -%D course when using specials or, in \MKIV, manipulate node lists. Let's start with -%D a warning: using this commands is far more slower than using the \TEX\ primitives -%D \type {\hrule} and \type {\vrule}, but they save us some tokens. The +%D The graphic capabilities of \TEX\ do not go beyond simple +%D filled rules, except of course when using specials. Let's +%D start with a warning: using this commands is far more slower +%D than using the \TEX\ primitives \type{\hrule} and +%D \type{\vrule}, but they save us some tokens. The %D characteristics of these rule drawing command can be set by: %D %D \showsetup{setupblackrules} %D -%D The simple command draws only one rule. Its optional argument can be used to -%D specify the dimensions. By setting the width, height or depth to \type {max}, one -%D gets the natural dimensions. +%D The simple command draws only one rule. Its optional +%D argument can be used to specify the dimensions. By setting +%D the width, height or depth to \type {max}, one gets the +%D natural dimensions. %D %D \showsetup{blackrule} @@ -57,9 +59,9 @@ \fi\fi \useblackrulesstyleandcolor\c!style\c!color \vrule - \s!width \ifx\p_width \v!max\emwidth\else\p_width \fi - \s!height\ifx\p_height\v!max\strutht\else\p_height\fi - \s!depth \ifx\p_depth \v!max\strutdp\else\p_depth \fi + \!!width \ifx\p_width \v!max\emwidth\else\p_width \fi + \!!height\ifx\p_height\v!max\strutht\else\p_height\fi + \!!depth \ifx\p_depth \v!max\strutdp\else\p_depth \fi \egroup} \setupblackrules @@ -71,8 +73,8 @@ %D \macros %D {blackrules} %D -%D One can call for a sequence of black rules, if needed equally spaced over the -%D given width. +%D One can call for a sequence of black rules, if needed +%D equally spaced over the given width. %D %D \showsetup{blackrules} %D @@ -91,8 +93,9 @@ %D \getbuffer %D \stoplines %D -%D We could of course have implemented this macro using \type {\leaders}, but this -%D would probably have taken more tokens. +%D We could of course have implemented this macro using +%D \type{\leaders}, but this would probably have taken more +%D tokens. \unexpanded\def\blackrules % probably never used {\hbox\bgroup @@ -119,9 +122,9 @@ \useblackrulesstyleandcolor\c!style\c!color \dorecurse\scratchcounter % a typical case of where we can use a simple loop {\vrule - \s!width \scratchwidth - \s!height\scratchheight - \s!depth \scratchdepth + \!!width \scratchwidth + \!!height\scratchheight + \!!depth \scratchdepth \hskip\scratchdistance}% \unskip \egroup} @@ -132,51 +135,169 @@ \c!distance=.25\emwidth, \c!color=] +%D Marginrules will either become obsolete or be redone. + +%D The next commands can be used to draw margin rules. We +%D support two methods: \marginrule{one for in||line use} and +%D one that acts on a paragraph. Drawing a margin rule is +%D rather straightforward because we can use the commands that +%D put text in the margin. + +\def\dodrawmarginrule + {\setbox\scratchbox\hbox + {\vrule\!!depth\strutdepth\!!height\strutheight\!!width\@@karulethickness}% + \smashbox\scratchbox % no \vsmash !!! + \box\scratchbox} + +\def\drawmarginrule + {\strut\inleft{\dodrawmarginrule}} + +%D \macros +%D {marginrule} +%D +%D The first method gobbles words and simply puts a bar in the +%D margin. This method is not entirely robust. +%D +%D \showsetup{marginrule} + +\definecomplexorsimple\marginrule + +\def\simplemarginrule + {\let\processword\drawmarginrule + \processwords} + +\def\complexmarginrule[#1]% + {\ifnum#1<\@@kalevel\relax \else + \def\@@kadefaultwidth{#1}% + \expandafter\simplemarginrule + \fi} + +%D We need an auxiliary variable + +\def\@@kadefaultwidth{1} + +%D \macros +%D {setupmarginrules} +%D +%D This macro definitions show us that we can pass an optional +%D level, which is matched against the previous set one. The +%D level can be set up with +%D +%D \showsetup{setupmarginrules} + +\unexpanded\def\setupmarginrules + {\dodoubleargument\getparameters[\??ka]} + +%D \macros +%D {startmarginrule} +%D +%D The second method collects text and reformats it afterwards, +%D using the shapebox macros. We prevent local margin rules. +%D +%D \showsetup{startmarginrule} + +\definecomplexorsimple\startmarginrule + +\def\simplestartmarginrule + {\bgroup + \let\drawmarginrule\relax + \let\stopmarginrule\dostopmarginrule + \beginofshapebox} + +\def\complexstartmarginrule[#1]% + {\bgroup + \let\drawmarginrule\relax + \ifnum#1<\@@kalevel\relax + \let\stopmarginrule\egroup + \else + \def\@@kadefaultwidth{#1}% + \let\stopmarginrule\dostopmarginrule + \expandafter\beginofshapebox + \fi} + +\def\dostopmarginrule + {\endofshapebox + \reshapebox + {\hbox{\inleftmargin{\dodrawmarginrule}\box\shapebox}}% + \flushshapebox + \egroup} + +%D \startbuffer +%D \setupmarginrules[level=5] +%D +%D \startmarginrule[1] +%D First we set the level at~5. Next we typeset this first +%D paragraph as a level~1 one. As expected no rule show up. +%D \stopmarginrule +%D +%D \startmarginrule[5] +%D The second paragraph is a level~5 one. As we can see here, +%D the marginal rule gets a width according to its level. +%D \stopmarginrule +%D +%D \startmarginrule[8] +%D It will of course be no surprise that this third paragraph +%D has a even thicker margin rule. This behavior can be +%D overruled by specifying the width explictly. +%D \stopmarginrule +%D \stopbuffer +%D +%D In next example we show most features. Watch the rule +%D thickness adapting itself to the level. +%D +%D \startexample +%D \getbuffer +%D \stopexample +%D +%D We just said: +%D +%D \typebuffer + %D \macros %D {vl, hl} %D -%D The command \type {\vl} draws a vertical rule \vl\ with strut dimensions, -%D multiplied with the factor specified in the optional argument. The height and -%D depth are clipped \vl [3] to the baselinedistance. Its horizontal counterpart -%D \type {\hl} draws a horizontal rule \hl\ with a width of 1em, multiplied with the -%D optional factor. The horizontal rule is drawn on top of the baseline. +%D The command \type{\vl} draws a vertical rule \vl\ with strut +%D dimensions, multiplied with the factor specified in the +%D optional argument. The height and depth are clipped \vl[3] +%D to the baselinedistance. Its horizontal counterpart +%D \type{\hl} draws a horizontal rule \hl\ with a width of 1em, +%D multiplied with the optional factor. The horizontal rule is +%D drawn on top of the baseline. %D %D \showsetup{vl} %D \showsetup{hl} -\unexpanded\def\pack_rule_vl_indeed#1#2#3% +\unexpanded\def\dovlwdhtdp#1#2#3% used elsewhere {\bgroup \setbox\scratchbox\hbox {\vrule - \s!width #1\linewidth - \s!height#2\strutht - \s!depth #3\strutdp}% + \!!width #1\linewidth + \!!height#2\strutht + \!!depth #3\strutdp}% \dp\scratchbox\strutdp \ht\scratchbox\strutht \box\scratchbox \egroup} -\def\pack_rule_vl[#1]% - {\pack_rule_vl_indeed{#1}{#1}{#1}} +\def\complexvl[#1]% + {\dovlwdhtdp\plusone{#1}{#1}} -\def\pack_rule_hl[#1]% +\def\complexhl[#1]% {\hbox {\vrule - \s!width #1\emwidth - \s!height\linewidth - \s!depth \zeropoint}} - -\unexpanded\def\vl{\dosingleempty\pack_rule_vl} -\unexpanded\def\hl{\dosingleempty\pack_rule_hl} + \!!width #1\emwidth + \!!height\linewidth + \!!depth \zeropoint}} -\let\dovlwdhtdp\pack_rule_vl_indeed % used elsewhere +\definecomplexorsimple\vl \def\simplevl{\complexvl[\plusone]} +\definecomplexorsimple\hl \def\simplehl{\complexhl[\plusone]} %D \macros %D {hairline, thinrule, thinrules, setupthinrules} %D -%D Drawing thin lines can of course easily be accomplished by the \TEX\ -%D primitives \type{\hrule} and \type{\vrule}. The next few macros however -%D free us from some specifications. +%D Drawing thin lines can of course easily be accomplished by +%D the \TEX\ primitives \type{\hrule} and \type{\vrule}. The +%D next few macros however free us from some specifications. %D %D \startbuffer %D some text @@ -217,158 +338,112 @@ %D %D which looks like: \thinrules[n=2] -\installcorenamespace{thinrules} -\installcorenamespace{thinrulealternatives} - -\installdirectcommandhandler \??thinrules {thinrules} - -\setupthinrules - [\c!interlinespace=\v!small, - \c!n=3, - \c!before=, - \c!inbetween={\blank[\v!white]}, - \c!after=, - \c!color=, - \c!height=.5\linewidth, - \c!depth=.5\linewidth, - \c!frame=\v!on, % compatible with textbackgrounds - \c!alternative=\v!b, - \c!backgroundcolor=, - \c!background=, - \c!rulethickness=\linewidth] - -\letvalue{\??thinrulealternatives\v!a }\zerocount -\letvalue{\??thinrulealternatives\v!b }\plusone -\letvalue{\??thinrulealternatives\v!c }\plustwo -\letvalue{\??thinrulealternatives\v!none}\zerocount - -\newconstant\c_pack_thinrules_type +\newconstant\ruletype \def\thinrule {\strut \bgroup - \edef\p_height {\directthinrulesparameter\c!height}% - \edef\p_depth {\directthinrulesparameter\c!depth}% - \edef\p_background{\directthinrulesparameter\c!background}% - \edef\p_frame {\directthinrulesparameter\c!frame}% - \linewidth\dimexpr\directthinrulesparameter\c!rulethickness/\plustwo\relax + \ruletype\plusone + \processaction + [\@@dlalternative] + [ \v!a=>\ruletype\zerocount,% no line + %\v!b=>\ruletype\plusone ,% height/depth + \v!c=>\ruletype\plustwo ,% topheight/botdepth + % 11=>\ruletype\plusone ,% fallback for backgrounds + 0=>\ruletype\zerocount,% compatible with backgrounds + % 1=>\ruletype\plusone ,% compatible with backgrounds + 2=>\ruletype\plustwo ]% compatible with backgrounds + \doifsomething\@@dlrulethickness + {\linewidth\@@dlrulethickness}% \ifdim\linewidth=\zeropoint - \c_pack_thinrules_type\zerocount - \else\ifx\p_frame\v!on - \c_pack_thinrules_type\expandcheckedcsname\??thinrulealternatives{\directthinrulesparameter\c!alternative}\v!b\relax + \ruletype\zerocount \else - \c_pack_thinrules_type\zerocount - \fi\fi - \ifnum\c_pack_thinrules_type=\plusone - \ifx\p_height\v!max - \scratchheight\strutht - \else - \setdimensionwithunit\scratchheight\p_height\strutht - \fi - \ifx\p_depth\v!max - \scratchdepth\strutdp - \else - \setdimensionwithunit\scratchdepth\p_depth\strutdp - \fi - \else - \scratchheight\strutht - \scratchdepth \strutdp + \doifnot\@@dlframe\v!on{\ruletype\zerocount}% \fi - \ifx\p_background\v!color - \startcolor[\directthinrulesparameter\c!backgroundcolor]% - \ifnum\c_pack_thinrules_type=\plustwo % prevent overshoot due to rounding - \leaders - \hrule - \s!height\dimexpr\scratchheight-\linewidth\relax - \s!depth \dimexpr\scratchdepth -\linewidth\relax - \hfill - \else - \leaders - \hrule - \s!height\scratchheight - \s!depth \scratchdepth - \hfill - \fi - \stopcolor - \ifcase\c_pack_thinrules_type - % no rule - \or - \startcolor[\directthinrulesparameter\c!color]% - \hfillneg - \leaders - \hrule - \s!height\linewidth - \s!depth \linewidth - \hfill - \stopcolor - \or - \startcolor[\directthinrulesparameter\c!color]% - \hfillneg - \leaders - \hrule - \s!height\dimexpr-\scratchdepth+\linewidth\relax - \s!depth \scratchdepth - \hfill - \hfillneg - \leaders - \hrule - \s!height\scratchheight - \s!depth \dimexpr-\scratchheight+\linewidth\relax - \hfill - \stopcolor - \fi + \ifnum\ruletype=\plusone + \doif\@@dlheight\v!max{\let\@@dlheight\!!plusone}% + \doif\@@dldepth \v!max{\let\@@dldepth \!!plusone}% \else - \ifcase\c_pack_thinrules_type - % no rule - \else - \startcolor[\directthinrulesparameter\c!color]% - \leaders - \hrule - \s!height\scratchheight - \s!depth \scratchdepth - \hfill - \stopcolor - \fi + \let\@@dlheight\!!plusone + \let\@@dldepth\!!plusone \fi + \freezedimensionwithunit\@@dlheight\strutht + \freezedimensionwithunit\@@dldepth\strutdp + \divide\linewidth \plustwo + \doifelse\@@dlbackground\v!color + {\startcolor[\@@dlbackgroundcolor]% + \ifnum\ruletype=\plustwo % prevent overshoot due to rounding + \leaders + \hrule + \!!height\dimexpr\@@dlheight-.5\linewidth\relax + \!!depth \dimexpr\@@dldepth -.5\linewidth\relax + \hfill + \else + \leaders + \hrule + \!!height\@@dlheight + \!!depth \@@dldepth + \hfill + \fi + \stopcolor + \ifcase\ruletype + % no rule + \or + \startcolor[\@@dlcolor]% + \hfillneg + \leaders\hrule\!!height\linewidth\!!depth\linewidth\hfill + \stopcolor + \or + \startcolor[\@@dlcolor]% + \hfillneg\leaders\hrule\!!height\dimexpr-\@@dldepth+\linewidth\relax\!!depth\@@dldepth\hfill + \hfillneg\leaders\hrule\!!height\@@dlheight\!!depth\dimexpr-\@@dlheight+\linewidth\relax\hfill + \stopcolor + \fi} + {\ifcase\ruletype \else + \startcolor[\@@dlcolor]% + \leaders\hrule\!!height\@@dlheight\!!depth\@@dldepth\hfill + \stopcolor + \fi}% \strut \carryoverpar\egroup} -\unexpanded\def\hairline +\def\hairline {\endgraf \thinrule \endgraf} -\unexpanded\def\thinrules - {\dosingleempty\pack_thinrules} +\def\dosetupthinrules[#1]% + {\getparameters[\??dl][#1]} -\def\pack_thinrules[#1]% +\unexpanded\def\setupthinrules + {\dosingleargument\dosetupthinrules} + +\def\dothinrules[#1]% {\bgroup - \setupcurrentthinrules[#1]% - \assignvalue{\directthinrulesparameter\c!interlinespace}\m_pack_thinrules_interlinespace{1.0}{1.5}{2.0}% - \spacing\m_pack_thinrules_interlinespace - \edef\p_after {\directthinrulesparameter\c!after}% - \edef\p_inbetween{\directthinrulesparameter\c!inbetween}% - \directthinrulesparameter\c!before - \scratchcounter\directthinrulesparameter\c!n\relax - \dorecurse\scratchcounter - {\ifnum\recurselevel=\scratchcounter \penalty500 \else - \ifnum\recurselevel=\plustwo \penalty500 \fi\fi - \thinrule - \ifnum\recurselevel<\scratchcounter\relax + \dosetupthinrules[#1]% + \@@dlbefore + \assignvalue\@@dlinterlinespace\@@dlinterlinespace{1.0}{1.5}{2.0}% + \spacing\@@dlinterlinespace + \dorecurse\@@dln + {\ifnum\recurselevel=\@@dln \dothinrulesnobreak \else + \ifnum\recurselevel=2 \dothinrulesnobreak \fi\fi + \thinrule + \ifnum\recurselevel<\@@dln\relax % test needed, else messed up whitespace - \ifx\p_inbetween\empty - \softbreak % \ifhmode \hskip \parfillskip \break \fi + \ifx\@@dlinbetween\empty + \softbreak \else \endgraf \nowhitespace - \p_inbetween + \@@dlinbetween \fi \fi}% - \ifx\p_after\empty - \carryoverpar\egroup - \else - \p_after\egroup - \fi{}} + \doifelsenothing\@@dlafter + {\carryoverpar\egroup} + {\@@dlafter\egroup}} + +\def\thinrules + {\dosingleempty\dothinrules} %D A couple of examples are given below. %D @@ -389,10 +464,11 @@ %D %D \typebuffer {\getbuffer} %D -%D There are a couple of alternative ways to visualize rules using backgrounds. At -%D first sight these may look strange, but they make sense in educational settings. -%D The alternatives are more or less compatible with the more advanced \METAPOST\ -%D based implementation. +%D There are a couple of alternative ways to visualize rules +%D using backgrounds. At first sight these may look strange, +%D but they make sense in educational settings. The +%D alternatives are more or less compatible with the more +%D advanced \METAPOST\ based implementation. %D %D \startbuffer[a] %D \setupthinrules @@ -431,10 +507,22 @@ %D \typebuffer[b] \getbuffer[a,b] %D \macros +%D {optimizethinrules} +%D +%D By saying \type {\thinrulestrue} or \type {-false}, we +%D can influence the way dangling lines are handled. + +\newif\ifoptimizethinrules \optimizethinrulestrue + +\def\dothinrulesnobreak + {\ifoptimizethinrules\penalty500\fi} + +%D \macros %D {textrule, starttextrule, setuptextrules} %D -%D Putting rules before and after a paragraph is very space sensitive, but the -%D next command handles that quite well. It comes in two disguises: +%D Putting rules before and after a paragraph is very space +%D sensitive, but the next command handles that quite well. It +%D comes in two disguises: %D %D \startbuffer %D \textrule[top]{fragments} @@ -474,176 +562,132 @@ %D \showsetup{starttextrule} %D \showsetup{setuptextrules} %D -%D The implementation looks a bit complicated due to the optional arguments. +%D The implementation looks a bit complicated due to the +%D optional arguments. -\installcorenamespace{textrules} -\installcorenamespace{textrulealternatives} +\unexpanded\def\setuptextrules + {\dodoubleargument\getparameters[\??tl]} -\installdirectcommandhandler \??textrules {textrules} +\def\complextextrule[#1]% if needed we can make it installable + {\let\next\dobottomtextrule + \processaction + [#1] + [ \v!top=>\let\next\dotoptextrule, + \v!middle=>\let\next\domiddletextrule, + \v!bottom=>\let\next\dobottomtextrule]% + \dosinglegroupempty\next} -\setuptextrules - [\c!location=\v!left, - \c!before=\blank, - \c!after=\blank, - \c!inbetween=, - \c!width=2\emwidth, - \c!style=\v!bold, - \c!color=, - \c!rulecolor=, - \c!bodyfont=, - \c!depthcorrection=\v!on, - \c!rulethickness=\linewidth, - \c!distance=.5\emwidth] +\definecomplexorsimple\textrule -\unexpanded\def\textrule - {\dosingleempty\pack_textrule} +\def\simpletextrule + {\dosinglegroupempty\dounknowntextrule} -\def\pack_textrule - {\iffirstargument - \expandafter\pack_textrule_yes - \else - \expandafter\pack_textrule_nop - \fi} - -\def\pack_textrule_yes[#1]% - {\expandcheckedcsname\??textrulealternatives{#1}\v!bottom} - -\def\pack_textrule_nop[#1]% - {\dosinglegroupempty\pack_textrule_nop_indeed} - -\def\pack_textrule_nop_indeed - {\iffirstargument - \expandafter\pack_textrule_nop_indeed_yes - \else - \expandafter\pack_textrule_nop_indeed_nop - \fi} - -\def\pack_textrule_nop_indeed_yes - {\csname\??textrulealternatives\v!top\endcsname} - -\def\pack_textrule_nop_indeed_nop - {\csname\??textrulealternatives\v!bottom\endcsname\empty} - -%D\startbuffer -%D\showstruts -%D -%D\setupwhitespace[none] -%D -%D\textrule[top]{test} xxxxx\smash{\strut} \textrule[bottom]{test} -%D\textrule[top]{test} xxxxx\strut \textrule[bottom]{test} -%D -%D\setupwhitespace[big] -%D -%D\textrule[top]{test} xxxxx\smash{\strut} \textrule[bottom]{test} -%D\textrule[top]{test} xxxxx\strut \textrule[bottom]{test} -%D\stoptyping -%D -%D \typebuffer \start \getbuffer \stop - -\setvalue{\??textrulealternatives\v!top}#1% - {\page[\v!preference] % interferes - \directtextrulesparameter\c!before\relax - \blank[\v!samepage,\v!nowhite]% - \pack_textrule_with_text{#1}% - \blank[\v!samepage,\v!nowhite]% - \directtextrulesparameter\c!inbetween\relax - \endgraf} - -\setvalue{\??textrulealternatives\v!bottom}#1% - {\blank[\v!samepage,\v!nowhite]% - \pack_textrule_following{#1}% - \blank[\v!samepage,\v!nowhite]% - \directtextrulesparameter\c!after\relax - \page[\v!preference]} - -\setvalue{\??textrulealternatives\v!middle}#1% - {\blank[\v!samepage,\v!nowhite]% - \directtextrulesparameter\c!inbetween\relax - \pack_textrule_following{#1}% - \blank[\v!samepage,\v!nowhite]% - \directtextrulesparameter\c!inbetween\relax - \page[\v!preference]} - -\def\pack_textrule_with_text#1% +\def\docomplextextrule#1% {\bgroup - \setbox\scratchbox\hbox to \availablehsize - {\scratchwidth \directtextrulesparameter\c!rulethickness\relax - \scratchheight\dimexpr .5\exheight+.5\scratchwidth\relax - \scratchdepth \dimexpr-.5\exheight+.5\scratchwidth\relax + \advance\hsize\dimexpr-\rightskip-\leftskip\relax + \setbox\scratchbox\hbox to \hsize + {\dimen4\dimexpr .5ex+.5\linewidth\relax + \dimen6\dimexpr-.5ex+.5\linewidth\relax \doifsomething{#1} - {\doifelse{\directtextrulesparameter\c!location}\v!inmargin + {\doifelse\@@tllocation\v!inmargin {\llap - {\usetextrulesstyleandcolor\c!style\c!color + {\dousestyleparameter\@@tlstyle + \dousecolorparameter\@@tlcolor #1% \hskip\leftmargindistance}} - {\color[\directtextrulesparameter\c!rulecolor] - {\vrule\s!height\scratchheight\s!depth\scratchdepth\s!width\directtextrulesparameter\c!width}% - \hbox spread 2\dimexpr\directtextrulesparameter\c!distance\relax + {\color[\@@tlrulecolor] + {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlwidth}% + \hbox spread 2\dimexpr\@@tldistance\relax {\hss - \usetextrulesstyleandcolor\c!style\c!color + \dousestyleparameter\@@tlstyle + \dousecolorparameter\@@tlcolor \strut#1% \hss}}}% - \color[\directtextrulesparameter\c!rulecolor] - {\leaders\hrule\s!height\scratchheight\s!depth\scratchdepth\hfill}}% + \color[\@@tlrulecolor] + {\leaders\hrule\!!height\dimen4\!!depth\dimen6\hfill}}% \ht\scratchbox\strutht \dp\scratchbox\strutdp \noindent\box\scratchbox +%\nobreak\verticalstrut\kern-\struttotal +% evt \witruimte \egroup} -\def\pack_textrule_correct_depth_yes - {\vskip\dimexpr - \strutdp +.5\exheight - \ifdim\prevdepth>\strutdp\else - \ifdim\prevdepth>\zeropoint - -\prevdepth - \fi +\def\dotoptextrule#1% + {\page[\v!preference] % interferes + %\whitespace % no + \@@tlbefore + \docomplextextrule{#1}% +% todo, option: \doifnothing{#1}{\ruledvskip-.5ex} + \nowhitespace + \@@tlinbetween + \endgraf} + +\def\dodobottomtextrule#1#2% + {\ifhmode + \endgraf + \fi + \dimen0\strutdp + \ifdim\prevdepth>\strutdp\else % was <\strutdp + \ifdim\prevdepth>\zeropoint + \advance\dimen0 -\prevdepth \fi - \relax - \relax} - -\def\pack_textrule_correct_depth_nop - {\vskip\dimexpr - \strutdp +.5\exheight - \relax - \relax} - -\def\pack_textrule_following#1% - {\doifelsenothing{#1} - {\ifhmode - \endgraf - \fi - \doifelse{\directtextrulesparameter\c!depthcorrection}\v!on\pack_textrule_correct_depth_yes\pack_textrule_correct_depth_nop + \fi + \advance\dimen0 .5ex + \vskip\dimen0 +% == +% \vskip\dimexpr \strutdp + .5ex +% \ifdim\prevdepth>\strutdp\else\ifdim\prevdepth>\zeropoint-\prevdepth\fi\fi\relax +% + \@@tlinbetween + \doifelsenothing{#2} + {\bgroup + \advance\hsize\dimexpr-\rightskip-\leftskip\relax \nointerlineskip - \dontleavehmode\vbox - {\color[\directtextrulesparameter\c!rulecolor] - {\hrule\s!depth\directtextrulesparameter\c!rulethickness\s!height\zeropoint\s!width\availablehsize}}} - {\pack_textrule_with_text{#1}}% - \ifvmode - \prevdepth\zeropoint + \moveleft-\leftskip\vbox + {\color[\@@tlrulecolor] + {\hrule\!!depth\linewidth\!!height\zeropoint\!!width\hsize}}% + \egroup} + {\docomplextextrule{#2}}% + \ifvmode\prevdepth\zeropoint\fi + #1% + \page[\v!preference]} + +\def\dobottomtextrule + {\dodobottomtextrule\@@tlafter} + +\def\domiddletextrule + {\dodobottomtextrule\@@tlinbetween} + +\def\dounknowntextrule + {\iffirstargument + \@EA\dotoptextrule + \else + \@EA\dobottomtextrule\@EA\empty \fi} %D The grouped commands also supports bodyfont switching: \unexpanded\def\starttextrule#1% {\bgroup - \def\pack_textrule_nop_indeed{\csname\??textrulealternatives\v!middle\endcsname}% - \csname\??textrulealternatives\v!top\endcsname{#1}% + \def\dounknowntextrule{\domiddletextrule} + \dotoptextrule{#1} \bgroup - \doifsomething{\directtextrulesparameter\c!bodyfont}{\switchtobodyfont[\directtextrulesparameter\c!bodyfont]}} + \doifsomething\@@tlbodyfont{\switchtobodyfont[\@@tlbodyfont]}} \unexpanded\def\stoptextrule {\par \egroup - \csname\??textrulealternatives\v!bottom\endcsname\empty + \dobottomtextrule\empty \egroup} %D \macros %D {fillinrules, setupfillinrules} %D -%D The next few commands do not really deserve a place in a core module, because -%D they deal with specific typography. Nevertheless I decided to make them part of -%D the core, because they permit us to make questionaires. Let's start with some -%D examples. +%D The next few commands do not really deserve a place in a +%D core module, because they deal with specific typography. +%D Nevertheless I decided to make them part of the core, +%D because they permit us to make questionaires. Let's start +%D with some examples. %D %D \fillinrules[n=2,width=fit]{first} %D \fillinrules[n=2,width=broad]{first} @@ -652,112 +696,85 @@ %D \fillinrules[n=2]{first}{last} %D \fillintext{first}{last} \input reich \par %D -%D The main command is \type{\fillinrules}. This command takes one and an optional -%D second argument and sets a paragraph with empty visualized lines. +%D The main command is \type{\fillinrules}. This command takes +%D one and an optional second argument and sets a paragraph with +%D empty visualized lines. %D %D \showsetup{fillinrules} %D \showsetup{setupfillinrules} +\unexpanded\def\setupfillinrules + {\dodoubleargument\getparameters[\??il]} -\installcorenamespace{fillinrules} +\definecomplexorsimpleempty\fillinrules -\installdirectcommandhandler \??fillinrules {fillinrules} +\def\complexfillinrules[#1]% + {\def\docomplexfillinrules##1##2% + {\dodocomplexfillinrules[#1]{##1}{##2}{\thinrules + [\c!n=\@@iln,\c!interlinespace=\@@ilinterlinespace,\c!before=,\c!after=]}}% + \dodoublegroupempty\docomplexfillinrules} -\setupfillinrules - [\c!width=\v!broad, - \c!distance=\emwidth, - \c!before=\blank, - \c!after=\blank, - \c!n=\plusone, - \c!interlinespace=\v!small, - \c!separator=, - \c!style=, - \c!color=] - -\unexpanded\def\fillinrules - {\dosingleempty\pack_fillinrules} - -\def\pack_fillinrules[#1]% +\def\dodocomplexfillinrules[#1]#2#3#4% {\endgraf + \@@ilbefore \begingroup - \setupcurrentfillinrules[#1]% - \let\pack_fillinrules_rule\thinrules - \dodoublegroupempty\pack_fillinrules_indeed} - -\def\pack_fillinrules_indeed#1#2% - {\directfillinrulesparameter\c!before - \setupcurrentthinrules - [\c!n=\directfillinrulesparameter\c!n, - \c!interlinespace=\directfillinrulesparameter\c!interlinespace, - \c!before=, - \c!after=]% - \scratchdistance\directfillinrulesparameter\c!distance\relax - \edef\m_fillinrules_one{#1}% - \edef\m_fillinrules_two{#2}% + \setupfillinrules[#1]% \noindent - \ifx\m_fillinrules_one\empty \else - \edef\p_width{\directfillinrulesparameter\c!width}% - \ifx\p_width\v!fit - \scratchdistance\zeropoint - \hbox - \else\ifx\p_width\v!broad - \hbox - \else - \hbox to \directfillinrulesparameter\c!width - \fi\fi - \bgroup - \usefillinrulesstyleandcolor\c!style\c!color - \strut - \m_fillinrules_one - \hfill\directfillinrulesparameter\c!separator - \hskip\scratchdistance - \egroup - \fi + \doifsomething{#2} + {\doifelse\@@ilwidth\v!fit + {\let\@@ildistance\!!zeropoint + \hbox} + {\doifelse\@@ilwidth\v!broad + {\hbox} + {\hbox to \@@ilwidth}}% + \bgroup + \dousestyleparameter\@@ilstyle + \dousecolorparameter\@@ilcolor + \strut#2\hfill\@@ilseparator\hskip\@@ildistance + \egroup}% + %\hangindent=\wd0\relax % tzt hang=yes,n + %\parindent=\hangindent + %\box0\relax \setupwhitespace[\v!big]% \ignorespaces - \pack_fillinrules_rule - \ifx\m_fillinrules_two\empty \else - \kern\scratchdistance - \usefillinrulesstyleandcolor\c!style\c!color - \m_fillinrules_two - \strut - \fi + #4% + \doifsomething{#3} + {\kern\@@ildistance + \dousestyleparameter\@@ilstyle + \dousecolorparameter\@@ilcolor + #3\strut}% + \endgroup \endgraf - \directfillinrulesparameter\c!after - \endgroup} + \@@ilafter} %D \macros %D {fillintext} %D -%D To provide compatible layouts when texts and lines are mixed, one can typeset -%D a paragraph by using the command \type {\fillintext}. +%D To provide compatible layouts when texts and lines are +%D mixed, one can typeset a paragraph by using the command +%D \type{\fillintext}. %D %D \showsetup{fillintext} -\unexpanded\def\fillintext - {\dosingleempty\pack_fillintext} - -\def\pack_fillintext[#1]% ugly - {\endgraf - \begingroup - \setupcurrentfillinrules[#1]% - \dodoublegroupempty\pack_fillintext_indeed} +\definecomplexorsimpleempty\fillintext -\def\pack_fillintext_indeed#1#2% - {\def\pack_fillinrules_rule{\unhbox\nextbox\unskip}% - \dowithnextbox{\pack_fillinrules_indeed{#1}{\hfill#2}}% - \hbox\bgroup\let\par\egroup\ignorespaces} +\def\complexfillintext[#1]% rather rough, using an \unhbox is suboptimal + {\def\docomplexfillintext##1##2% + {\dowithnextbox + {\dodocomplexfillinrules[#1]{##1}{\hfill##2}{\unhbox\nextbox\unskip}}% + \hbox\bgroup\let\par\egroup\ignorespaces}% + \dodoublegroupempty\docomplexfillintext} %D \macros %D {fillinline, setupfillinlines} %D -%D Another member of the family takes care of putting a (often small) rule after -%D a piece of text, like +%D Another member of the family takes care of putting a (often +%D small) rule after a piece of text, like %D %D \startbuffer -%D -%D \stopbuffer\fillinline \input reich \par +%D \fillinline \input reich \par %D \fillinline[margin=0cm] \input reich \par +%D \stopbuffer %D %D \startexample %D \getbuffer @@ -772,71 +789,82 @@ %D \showsetup{fillinline} %D \showsetup{setupfillinlines} -\installcorenamespace{fillinlines} +\unexpanded\def\setupfillinlines + {\dodoubleargument\getparameters[\??iv]} -\installdirectcommandhandler \??fillinlines {fillinlines} +\definecomplexorsimpleempty\fillinline -\setupfillinlines - [\c!width=8\emwidth, % was 3cm - \c!margin=\directfillinlinesparameter\c!width, - \c!rulethickness=\linewidth, +\def\complexfillinline[#1]% + {%\endgraf % interferes with \definedescription cum suis + \@@ivbefore + \begingroup + \setupfillinlines[#1]% + \advance\rightskip \@@ivmargin + \parfillskip\zeropoint + \def\par % very dangerous + {\let\par\endgraf % -) + \ifhmode\unskip\hfill\fi + \scratchdimen\dimexpr\@@ivwidth-\@@ivdistance\relax + \ifdim\scratchdimen>\@@ivmargin\else\expandafter\rlap\fi + {\kern\@@ivdistance + \vrule + \!!width \scratchdimen + \!!height.5\linewidth + \!!depth .5\linewidth}% + \endgraf % ! + \endgroup + \endgraf % ! + \@@ilafter}} + +%D Will move up: + +\setupmarginrules + [\c!level=0, + \c!rulethickness=\@@kadefaultwidth\linewidth] + +\setupthinrules + [\c!interlinespace=\v!small, + \c!n=3, + \c!before=, + \c!inbetween={\blank[\v!white]}, + \c!after=, \c!color=, - \c!distance=\emwidth, + \c!height=.5\linewidth, + \c!depth=.5\linewidth, + \c!frame=\v!on, % compatible with textbackgrounds + \c!alternative=\v!b, + \c!backgroundcolor=, + \c!background=, + \c!rulethickness=] + +\setuptextrules + [\c!location=\v!left, \c!before=\blank, - \c!after=\blank] + \c!after=\blank, + \c!inbetween=, + \c!width=2em, + \c!style=\v!bold, + \c!color=, + \c!rulecolor=, + \c!bodyfont=, + \c!distance=.5em] -\unexpanded\def\fillinline - {\dosingleempty\pack_fillinline} - -\ifdefined\endpar % experiment with \endpar - - \def\pack_fillinline[#1]% - {% \endpar % no, as it interferes with \definedescription cum suis - \begingroup - \setupcurrentfillinlines[#1]% - \directfillinlinesparameter\c!before - \begingroup - \advance\rightskip \directfillinlinesparameter\c!margin\relax - \parfillskip\zeropoint - \pushmacro\endpar - \def\endpar - {\popmacro\endpar - \ifhmode\unskip\hfill\fi - \scratchwidth\dimexpr\directfillinlinesparameter\c!width-\directfillinlinesparameter\c!distance\relax - \ifdim\scratchwidth>\directfillinlinesparameter\c!margin\else\expandafter\rlap\fi - {\kern\directfillinlinesparameter\c!distance - \scratchheight\dimexpr\directfillinlinesparameter\c!rulethickness/\plustwo\relax - \color[\directfillinlinesparameter\c!color]{\vrule\s!width\scratchwidth\s!height\scratchheight\s!depth\scratchheight}}% - \endpar - \endgroup - \endpar - \directfillinlinesparameter\c!after - \endgroup}} % carryover ? - -\else - - \def\pack_fillinline[#1]% - {%\endgraf % no, as it interferes with \definedescription cum suis - \begingroup - \setupcurrentfillinlines[#1]% - \directfillinlinesparameter\c!before - \begingroup - \advance\rightskip \directfillinlinesparameter\c!margin\relax - \parfillskip\zeropoint - \def\par - {\let\par\endgraf - \ifhmode\unskip\hfill\fi - \scratchwidth\dimexpr\directfillinlinesparameter\c!width-\directfillinlinesparameter\c!distance\relax - \ifdim\scratchwidth>\directfillinlinesparameter\c!margin\else\expandafter\rlap\fi - {\kern\directfillinlinesparameter\c!distance - \scratchheight\dimexpr\directfillinlinesparameter\c!rulethickness/\plustwo\relax - \color[\directfillinlinesparameter\c!color]{\vrule\s!width\scratchwidth\s!height\scratchheight\s!depth\scratchheight}}% - \endgraf - \endgroup - \endgraf - \directfillinlinesparameter\c!after - \endgroup}} % carryover ? +\setupfillinrules + [\c!width=\v!broad, + \c!distance=1em, + \c!before=\blank, + \c!after=\blank, + \c!n=1, + \c!interlinespace=\v!small, + \c!separator=, + \c!style=\v!normal, + \c!color=] -\fi +\setupfillinlines + [\c!width=3cm, + \c!margin=\@@ivwidth, + \c!distance=1em, + \c!before=\blank, + \c!after=\blank] \protect \endinput |