diff options
author | Hans Hagen <pragma@wxs.nl> | 2012-01-05 19:27:50 +0100 |
---|---|---|
committer | Hans Hagen <pragma@wxs.nl> | 2012-01-05 19:27:50 +0100 |
commit | e9c601bac72745359ce28a511bf54c3202e4ead6 (patch) | |
tree | 90ceba360ad36d78da048c4b44f955579f1669e1 /tex/context/base/pack-rul.mkiv | |
parent | 8d0f99447733416abc3331598edd923fb68226f4 (diff) | |
download | context-e9c601bac72745359ce28a511bf54c3202e4ead6.tar.gz |
beta 2011.12.22 14:43
Diffstat (limited to 'tex/context/base/pack-rul.mkiv')
-rw-r--r-- | tex/context/base/pack-rul.mkiv | 2961 |
1 files changed, 1046 insertions, 1915 deletions
diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv index a7af6b50c..e7620b43e 100644 --- a/tex/context/base/pack-rul.mkiv +++ b/tex/context/base/pack-rul.mkiv @@ -13,31 +13,19 @@ \writestatus{loading}{ConTeXt Packaging Macros / Ruled Content} -% eventually this will use the commandhandler code (same trick as with itemize) -% rulethickness push/pop will go +%D The code here is expanded lots of time as framed is used in +%D many places. This is why the code here is (and gets) optimized +%D as much as possible. Also, by avoiding packaging and expansion +%D we also keep tracing reasonable. For instance, multiple stacked +%D backgrounds can slow down a run if not optimized this way. -%D redo framedtexts like framedcontent (parameter stuff) - -%D After a few months testing this solution is now added -%D to the core. This introduces a possible incompatibility -%D between \MKII\ and \MKIV\ but for the better. +% eventually this will use the commandhandler code (same trick as +% with itemize) \registerctxluafile{pack-rul}{1.001} -% old off new -% 4 lines oeps : 3.6 2.8 3.0 -% tufte 7.5 4.1 4.3 - \unprotect -%D We have removed the rather old and out dated raster methods. They -%D have not been used for ages. You can still find the old code in -%D the \MKII\ counterpart of this module. - -%D This module is rather optimized so sometimes readability has been -%D sacrisfied for speed. This is because the framing mechanism is used -%D all over the place. - %D \macros %D {linewidth, setuplinewidth} %D @@ -53,99 +41,260 @@ \newdimen\linewidth -\def\dosetuplinewidth[#1]% - {\assigndimension{#1}\linewidth{.2\points}{.4\points}{.6\points}} - \unexpanded\def\setuplinewidth - {\dosingleargument\dosetuplinewidth} + {\dosingleargument\framed_setup_line_width} -%D \macros -%D {ruledlinewidth, inheritruledlinewidth} -%D -%D Inside framed boxed we will use a private dimensions. As -%D an option one can let the linewidth inherit its value from -%D this one. - -\newdimen\ruledlinewidth \newif\ifinheritruledlinewidth +\def\framed_setup_line_width[#1]% + {\assigndimension{#1}\linewidth{.2\points}{.4\points}{.6\points}} %D \macros %D {setupscreens} %D -%D The previous macro uses a predefined constant -%D \type{\@@rsfactor}. This factor can be set by: +%D Sort of obsolete: %D %D \showsetup{setupscreens} \unexpanded\def\setupscreens {\dodoubleargument\getparameters[\??rs]} -%D We will communicate through module specific variables, current -%D framed parameters and some reserved dimension registers. +%D The parameter handler: -\newdimen \frameddimenwd -\newdimen \frameddimenht -\newdimen \frameddimendp +\let\currentframed\s!unknown % brrr must have a value -%D We don't have to stick to a \TEX\ drawn rule, but -%D also can use rounded or even fancier shapes, as we will -%D see later on. +% \def\framedparameter #1{\csname\doframedparameter\currentframed{#1}\endcsname} +% \def\framedparameterhash#1{\doframedparameterhash \currentframed#1} -\def\dofilledbox - {\bgroup - \edef\@@framedfilledmod{\framedparameter\c!backgroundcorner}% - \ifx\@@framedfilledmod\v!rectangular - \dofilledlinedbox - \else\ifzeropt\dimexpr\framedparameter\c!backgroundradius\relax % just in case of .x\bodyfontsize - \dofilledlinedbox - \else - \dofilledroundbox - \fi\fi - \egroup} +\def\framedparameter #1{\csname\ifcsname\currentframed#1\endcsname\currentframed#1\else\expandafter\doframedparentparameter\csname\currentframed\s!parent\endcsname{#1}\fi\endcsname} +\def\framedparameterhash#1{\ifcsname\currentframed#1\endcsname\currentframed\else\expandafter\doframedparentparameterhash\csname\currentframed\s!parent\endcsname#1\fi} -\def\dophantombox - {\hphantom{\dofilledbox}} +\def\doframedparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedparentparameter \csname#1\s!parent\endcsname{#2}\fi} +\def\doframedparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doframedparentparameterhash\csname#1\s!parent\endcsname#2\fi} -\def\dofilledlinedbox - {\vrule\!!width\frameddimenwd\!!height\frameddimenht\!!depth\frameddimendp\relax}% +\def\doframedparentparameter #1#2{\ifx#1\relax\s!empty\else\doframedparameter #1{#2}\fi} +\def\doframedparentparameterhash#1#2{\ifx#1\relax \else\doframedparameterhash#1#2\fi} -\def\dostrokedroundbox - {\doif{\framedparameter\c!frame}\v!on\dodostrokedroundbox} +\def\doframedparentparameter#1#2{\ifx#1\relax\doframedrootparameter#2\else\doframedparameter#1{#2}\fi} +\def\doframedrootparameter #1{\ifcsname\??oi#1\endcsname\??oi#1\else\s!empty\fi} -\def\dodostrokedroundbox - {\bgroup - \edef\ovalmod{\framedparameter\c!framecorner}% - \ifx\ovalmod\v!round - \let\ovalmod\!!zerocount +\def\useframedstyleandcolor#1#2% style color + {\edef\currentstyleparameter{\framedparameter#1}% + \edef\currentcolorparameter{\framedparameter#2}% + \ifx\currentstyleparameter\empty\else\dousestyleparameter\currentstyleparameter\fi + \ifx\currentcolorparameter\empty\else\dousecolorparameter\currentcolorparameter\fi} + +\def\frameddimension#1{\the\dimexpr\framedparameter{#1}\relax} + +% \unexpanded\def\installsomebackground#1#2{\inheritlocalframed[\??ma#1#2][\??od]} + +\let\normalframedparameter \framedparameter +\let\normalframedparameterhash\framedparameterhash + +\def\framed_initialize#1% will be inlined + {\inframedtrue + \edef\currentframed{#1}% + \let\framedparameter \normalframedparameter + \let\framedparameterhash\normalframedparameterhash} + +\def\installinheritedframed#1% + {\normalexpanded{\doinstallinheritedframed + \expandafter\noexpand\csname current#1\endcsname + \expandafter\noexpand\csname #1parameter\endcsname + \expandafter\noexpand\csname #1parameterhash\endcsname + \expandafter\noexpand\csname do#1parameter\endcsname + \expandafter\noexpand\csname do#1parentparameter\endcsname + \expandafter\noexpand\csname do#1rootparameter\endcsname + \expandafter\noexpand\csname inherited#1framed\endcsname + \noexpand\??oi}} % if needed we can have a variant + +\unexpanded\def\doinstallinheritedframed#1#2#3#4#5#6#7#8% + {\def#5##1##2{\ifx##1\relax#6{##2}\else#4##1{##2}\fi}% + \def#6##1{\ifcsname#8##1\endcsname#8##1\else\s!empty\fi}% + \unexpanded\def#7% + {\bgroup + \bgroup + \inframedtrue + \let\currentframed #1% not used (more for tracing) + \let\framedparameter #2% + \let\framedparameterhash#3% + \framed_process_indeed}} + +\unexpanded\def\installframedcommandhandler#1#2#3% + {\installcommandhandler{#1}{#2}{#3}% + \installinheritedframed{#2}} + +\unexpanded\def\installframedautocommandhandler#1#2#3% + {\installautocommandhandler{#1}{#2}{#3}% + \installinheritedframed{#2}} + +\unexpanded\def\installsimpleframedcommandhandler#1#2#3% + {\installsimplecommandhandler{#1}{#2}{#3}% + \installinheritedframed{#2}} + +% for regular framed + +\getparameters + [\??oi] + [\c!width=\v!fit, + \c!height=\v!broad, + %\c!lines=, + \c!offset=0.25ex, % \defaultframeoffset + \c!empty=\v!no, + \c!frame=\v!on, + %\c!topframe=, + %\c!bottomframe=, + %\c!leftframe=, + %\c!rightframe=, + \c!radius=.5\bodyfontsize, + \c!rulethickness=\linewidth, + \c!corner=\v!rectangular, + \c!depth=\zeropoint, + %\c!foregroundcolor=, + %\c!foregroundstyle=, + %\c!background=, + %\c!backgroundscreen=, + %\c!backgroundcolor=, + \c!backgroundoffset=\zeropoint, + %\c!framecolor=, + \c!frameoffset=\zeropoint, + \c!backgroundcorner=\framedparameter\c!corner, + \c!backgroundradius=\framedparameter\c!radius, + \c!backgrounddepth=\framedparameter\c!depth, + \c!framecorner=\framedparameter\c!corner, + \c!frameradius=\framedparameter\c!radius, + \c!framedepth=\framedparameter\c!depth, + %\c!component=, + %\c!align=, + \c!bottom=\vss, + %\c!top=, + \c!strut=\v!yes, + \c!autostrut=\v!yes, + \c!location=\v!normal, + %\c!orientation=, + \c!autowidth=\v!yes, + %\c!setups= +] + +% for backgrounds + +\getparameters + [\??od] % for fast version + [\c!frame=\v!off, + \c!depth=\zeropoint, + \c!offset=\v!overlay, + %\c!component=, + \c!radius=.5\bodyfontsize, + \c!rulethickness=\linewidth, + \c!corner=\v!rectangular, + \c!backgroundoffset=\zeropoint, + \c!frameoffset=\zeropoint, + \c!backgroundcorner=\framedparameter\c!corner, + \c!backgroundradius=\framedparameter\c!radius, + \c!backgrounddepth=\framedparameter\c!depth, + \c!framecorner=\framedparameter\c!corner, + \c!frameradius=\framedparameter\c!radius, + \c!framedepth=\framedparameter\c!depth, + \c!location=\v!normal] + +%D We will communicate through module specific variables, current +%D framed parameters and some reserved dimension registers. + +\newdimen\d_framed_target_wd +\newdimen\d_framed_target_ht +\newdimen\d_framed_target_dp +\newdimen\d_framed_linewidth + +\let\p_framed_frame \empty % \framedparameter\c!frame +\let\p_framed_backgroundoffset\empty +\let\p_framed_foregroundstyle \empty +\let\p_framed_autostrut \empty +\let\p_framed_location \empty +\let\p_framed_orientation \empty +\let\p_framed_autowidth \empty +\let\p_framed_franalyze \empty +\let\p_framed_backgroundcorner\empty +\let\p_framed_backgroundradius\empty +\let\p_framed_framecorner \empty +\let\p_framed_frameradius \empty +\let\p_framed_lines \empty +\let\p_framed_empty \empty +\let\p_framed_backgroundcolor \empty +\let\p_framed_backgroundscreen\empty +\let\p_framed_framecolor \empty +\let\p_framed_component \empty +\let\p_framed_background \empty +\let\p_framed_rulethickness \empty +\let\p_framed_foregroundcolor \empty +\let\p_framed_setups \empty + +%D We don't have to stick to a \TEX\ drawn rule, but also can use rounded +%D or even fancier shapes, as we will see later on. + +\def\framed_filled_box + {\edef\p_framed_backgroundcorner{\framedparameter\c!backgroundcorner}% + \ifx\p_framed_backgroundcorner\v!rectangular + \framed_filled_box_normal \else - \edef\ovalmod{\number\ovalmod}% - \fi - \edef\ovalwid{\the\frameddimenwd}% - \edef\ovalhei{\the\frameddimenht}% - \edef\ovaldep{\the\frameddimendp}% - \edef\ovallin{\the\dimexpr\ruledlinewidth}% - \edef\ovalrad{\the\dimexpr\framedparameter\c!frameradius}% - \let\ovalstr\!!plusone - \let\ovalfil\!!zerocount - \doovalbox\ovalwid\ovalhei\ovaldep\ovallin\ovalrad\ovalstr\ovalfil\ovalmod - \egroup} + \framed_filled_box_radius + \fi} -\def\dofilledroundbox - {\bgroup - \edef\ovalmod{\framedparameter\c!backgroundcorner}% - \ifx\ovalmod\v!round - \let\ovalmod\!!zerocount +\def\framed_filled_box_normal + {\vrule + \!!width \d_framed_target_wd + \!!height\d_framed_target_ht + \!!depth \d_framed_target_dp + \relax} + +\def\framed_filled_box_radius + {\edef\p_framed_backgroundradius{\framedparameter\c!backgroundradius}% + \ifzeropt\dimexpr\p_framed_backgroundradius\relax % just in case of .x\bodyfontsize + \framed_filled_box_normal \else - \edef\ovalmod{\number\ovalmod}% - \fi - \edef\ovalwid{\the\frameddimenwd}% - \edef\ovalhei{\the\frameddimenht}% - \edef\ovaldep{\the\frameddimendp}% - \edef\ovallin{\the\dimexpr\ruledlinewidth\relax}% - \edef\ovalrad{\the\dimexpr\framedparameter\c!backgroundradius\relax}% - \let\ovalstr\!!zerocount - \let\ovalfil\!!plusone - \doovalbox\ovalwid\ovalhei\ovaldep\ovallin\ovalrad\ovalstr\ovalfil\ovalmod - \egroup} + \framed_filled_box_round + \fi} + +\def\framed_filled_box_round + {\normalexpanded{\doovalbox + {\the\d_framed_target_wd}% + {\the\d_framed_target_ht}% + {\the\d_framed_target_dp}% + {\the\dimexpr\d_framed_linewidth\relax}% + {\the\dimexpr\p_framed_backgroundradius\relax}% + {0}% + {1}% + {\ifx\p_framed_backgroundcorner\v!round0\else\number\p_framed_backgroundcorner\fi}% + }} + +\def\framed_stroked_box + {\edef\p_framed_framecorner{\framedparameter\c!framecorner}% + \ifx\p_framed_framecorner\v!rectangular + \framed_stroked_box_normal + \else + \framed_stroked_box_radius + \fi} + +\def\framed_stroked_box_radius + {\edef\p_framed_frameradius{\framedparameter\c!frameradius}% + \ifzeropt\dimexpr\p_framed_frameradius\relax % just in case of .x\bodyfontsize + \framed_stroked_box_normal + \else + \ifx\p_framed_frame\v!on + \framed_stroked_box_round + \fi + \fi} + +% \framed_stroked_box_normal % later + +\def\framed_stroked_box_round + {\normalexpanded{\doovalbox + {\the\d_framed_target_wd}% + {\the\d_framed_target_ht}% + {\the\d_framed_target_dp}% + {\the\dimexpr\d_framed_linewidth\relax}% + {\the\dimexpr\p_framed_frameradius\relax}% + {1}% + {0}% + {\ifx\p_framed_framecorner\v!round0\else\number\p_framed_framecorner\fi}% + }} % a lot of weird corners % @@ -196,30 +345,27 @@ %D The oval box is drawn using a special macro, depending on %D the driver in use. -\def\dograybox % avoid black rules when no gray - {\doifelsenothing{\framedparameter\c!backgroundscreen} - {\dophantombox} - {\raster[\framedparameter\c!backgroundscreen]{\dofilledbox}}} +\def\framed_background_box_gray % avoid black rules when no gray + {\edef\p_framed_backgroundscreen{\framedparameter\c!backgroundscreen}% + \ifx\p_framed_backgroundscreen\empty \else + \framed_background_box_gray_indeed + \fi} + +\def\framed_background_box_gray_indeed + {\raster[\p_framed_backgroundscreen]{\framed_filled_box}} % can be more direct but who cares %D It won't be a surprise that we not only provide gray boxes, %D but also colored ones. Here it is: -\def\dobackgroundcolorbox - {\hbox{\faststartcolor[\framedbackgroundcolor]\dofilledbox\faststopcolor}} - %{\hbox{\doactivatecolor\framedbackgroundcolor\dofilledbox}} - -\def\docolorbox % can be more of \color[] -> \faststartcolor in mkiv - {\ifincolor - \edef\framedbackgroundcolor{\framedparameter\c!backgroundcolor}% - \ifx\framedbackgroundcolor\empty - \dophantombox - \else - \doifcolorelse\framedbackgroundcolor\dobackgroundcolorbox\dophantombox - \fi - \else - \dophantombox +\def\framed_background_box_color % can be more of \color[] -> \faststartcolor in mkiv + {\edef\p_framed_backgroundcolor{\framedparameter\c!backgroundcolor}% + \ifx\p_framed_backgroundcolor\empty \else + \doifcolor\p_framed_backgroundcolor\framed_background_box_color_indeed \fi} +\def\framed_background_box_color_indeed + {\hbox{\doactivatecolor\p_framed_backgroundcolor\framed_filled_box}} + %D \macros %D {defineoverlay, doifoverlayelse, overlayoffset, %D overlaywidth, overlayheight, overlaydepth, @@ -280,11 +426,11 @@ \def\overlaywidth {\the\hsize\space} % We preset the variables \def\overlayheight {\the\vsize\space} % to some reasonable default -\let\overlaydepth \!!zeropoint % values. The attributes -\let\overlayoffset \!!zeropoint % of the frame can be (are) -\let\overlaycolor \empty % set somewhere else. -\let\overlaylinewidth \!!zeropoint % -\let\overlaylinecolor \empty % +\def\overlaydepth {0pt } % values. The attributes +\let\overlayoffset \overlaydepth % of the frame can be (are) +\let\overlaylinewidth \overlaydepth % set somewhere else. +\let\overlaycolor \empty +\let\overlaylinecolor \empty %D The next register is used to initialize overlays. @@ -294,150 +440,176 @@ %D can contain text and be executed under an regime where %D interlineskip is off). -\appendtoks \oninterlineskip \to \everyoverlay +\appendtoks + \oninterlineskip +\to \everyoverlay + +\prependtoks + \hsize\overlaywidth + \vsize\overlayheight +\to \everyoverlay \unexpanded\def\defineoverlay - {\dodoubleargument\dodefineoverlay} + {\dodoubleargument\framed_define_overlay} -\def\dodefineoverlay[#1][#2]% - {\def\docommand##1{\setvalue{\??ov##1}{\executedefinedoverlay{##1}{#2}}}% - \processcommalist[#1]\docommand} +\def\framed_define_overlay[#1][#2]% + {\def\framed_define_overlay_indeed##1{\setvalue{\??ov##1}{\executedefinedoverlay{##1}{#2}}}% + \processcommalist[#1]\framed_define_overlay_indeed} -\prependtoks - \hsize\overlaywidth - \vsize\overlayheight -\to\everyoverlay - -\long\def\executedefinedoverlay#1#2% - {\bgroup +\unexpanded\def\executedefinedoverlay#1#2% we can share the definitions + {\bgroup % redundant grouping + \setbox\scratchbox\hbox\bgroup + \ifzeropt\d_framed_target_dp + \the\everyoverlay#2% saves wrapping (and lua call) + \else + \lower\d_framed_target_dp + \hbox{\the\everyoverlay#2}% + \fi + \egroup \setlayoutcomponentattribute{\v!overlay:#1}% - \edef\overlaywidth {\the\frameddimenwd\space}% - \edef\overlayheight{\the\dimexpr\frameddimenht+\frameddimendp\relax\space}% - \edef\overlaydepth {\the\frameddimendp\space}% - \edef\overlaycolor {\framedparameter\c!backgroundcolor}% - %\edef\overlaycorner{\framedparameter\c!backgroundcorner}% - %\edef\overlayradius{\framedparameter\c!backgroundradius}% - \let\overlayoffset\backgroundoffset % we steal this one - \setbox\scratchbox\hbox{\lower\overlaydepth\hbox{\the\everyoverlay#2}}% \setbox\scratchbox\hbox \layoutcomponentboxattribute - {\hskip-.5\dimexpr\wd\scratchbox-\overlaywidth \relax - \raise-.5\dimexpr\ht\scratchbox-\frameddimenht\relax % not overlayheight ! + {\kern -.5\dimexpr\wd\scratchbox-\d_framed_target_wd\relax % was \overlaywidth + \raise-.5\dimexpr\ht\scratchbox-\d_framed_target_ht\relax % not \overlayheight ! \box\scratchbox}% - \wd\scratchbox\frameddimenwd - \ht\scratchbox\frameddimenht - \dp\scratchbox\frameddimendp + \wd\scratchbox\d_framed_target_wd + \ht\scratchbox\d_framed_target_ht + \dp\scratchbox\d_framed_target_dp \box\scratchbox \egroup} %D \macros %D {overlayfakebox} -\def\overlayfakebox +\unexpanded\def\overlayfakebox {\hbox {\setbox\scratchbox\emptyhbox \wd\scratchbox\overlaywidth \ht\scratchbox\overlayheight \box\scratchbox}} -%D The empty case is: - -\let\executeoverlay\gobblesevenarguments - %D For testing we provide: -\def\doifoverlayelse#1% +\def\doifoverlayelse#1% only tests external overlays {\ifcsname\??ov#1\endcsname \expandafter\firstoftwoarguments \else \expandafter\secondoftwoarguments \fi} -%D We predefine two already familiar backgrounds: - -\setvalue{\??ov\v!screen}{\dograybox } -\setvalue{\??ov\v!color }{\docolorbox} - -% %D After all these preparations, the background macro does no -% %D bring to many surprises. One has to keep in mind that this -% %D macro starts up a call chain, depending on the background -% %D one needs: -% %D -% %D \startitemize[packed] -% %D \item a raster, color or user defined shape -% %D \item square or round corners -% %D \item a \TEX\ or driver based method -% %D \stopitemize -% %D -% %D The macro can be extended by adding commands to the token -% %D list register \type {\everybackgroundbox}. For this -% %D purpose, the name of the current background is available in -% %D \type {\currentbackgound}. - %D The content of the box will be (temporary) saved in a box. We %D also have an extra box for backgrounds. -\newbox\framebox -\newbox\extraframebox +\newbox\b_framed_normal +\newbox\b_framed_extra \newtoks\everybackgroundbox \let\currentbackground\empty -\def\dodobackgroundbox +\def\framed_process_background + {\ifcsname\??ov:\currentbackground\endcsname + \framed_process_background_indeed_internal + \else\ifcsname\??ov\currentbackground\endcsname + \framed_process_background_indeed_external + \fi\fi} + +\def\framed_process_background_indeed_internal % : in name {\bgroup - \ifcsname\??ov\currentbackground\endcsname - \the\everybackgroundbox - \setbox\extraframebox\hbox{\vbox{\moveleft\backgroundoffset\hbox{\csname\??ov\currentbackground\endcsname}}}% - \wd\extraframebox\zeropoint % \backgroundwidth - \ht\extraframebox\backgroundheight - \dp\extraframebox\backgrounddepth - \box\extraframebox % \hskip-\backgroundwidth - \fi + \setbox\b_framed_extra\hbox{%\bgroup + \ifzeropt\framedbackgroundoffset + \csname\??ov:\currentbackground\endcsname + \else + \kern-\framedbackgroundoffset + \hbox{\csname\??ov:\currentbackground\endcsname}% + \fi + }%\egroup + \wd\b_framed_extra\zeropoint + \ht\b_framed_extra\framedbackgroundheight + \dp\b_framed_extra\framedbackgrounddepth + \box\b_framed_extra \egroup} -\def\dododobackgroundbox#1,#2% #2 gobbles spaces +\def\framed_process_background_indeed_external + {\framed_overlay_initialize + \bgroup + \setbox\b_framed_extra\hbox{%\bgroup + \ifzeropt\framedbackgroundoffset + \csname\??ov\currentbackground\endcsname + \else + \kern-\framedbackgroundoffset + \hbox{\csname\??ov\currentbackground\endcsname}% + \fi + }%\egroup + \wd\b_framed_extra\zeropoint + \ht\b_framed_extra\framedbackgroundheight + \dp\b_framed_extra\framedbackgrounddepth + \box\b_framed_extra + \egroup} + +\def\framed_process_backgrounds#1,#2% #2 gobbles spaces (we could avoid one catch if we have nextbackground) {\edef\currentbackground{#1}% - \ifx\currentbackground\s!unknown\else % use $ instead of s!unknown - \dodobackgroundbox\expandafter\dododobackgroundbox + \ifx\currentbackground\s!unknown\else + \framed_process_background + \expandafter\framed_process_backgrounds \fi#2} -\let\backgroundoffset\!!zeropoint -\let\backgrounddepth \!!zeropoint -\def\backgroundwidth {\the\hsize} -\def\backgroundheight{\the\vsize} +% beware, a backgroundbox can be empty which is another reason +% why we set the width to zero instead of back-skipping + +\newdimen\framedbackgroundwidth +\newdimen\framedbackgroundheight +\newdimen\framedbackgrounddepth +\newdimen\framedbackgroundoffset -\def\normalforegroundbox% fuzzy but needed hack, this \vss, otherwise - {\vbox to \backgroundheight{\vss\box\framebox\vss}}% vertical shift +\def\framed_background_box_content% fuzzy but needed hack, this \vss, otherwise + {\vbox to \framedbackgroundheight{\vss\box\b_framed_normal\vss}} % vertical shift \backgroundheight -\def\dobackedbox - {\setbox\framebox\vbox - {\framedforgetall +\def\framed_add_background + {\setbox\b_framed_normal\hbox % was vbox + {\framed_forgetall % can be relaxed \boxmaxdepth\maxdimen - \frameddimenwd\dimexpr\wd\framebox+2\!!framedbackgroundoffset\relax - \frameddimenht\dimexpr\ht\framebox+ \!!framedbackgroundoffset\relax - \frameddimendp\dimexpr\dp\framebox+ \!!framedbackgroundoffset+\framedparameter\c!backgrounddepth\relax - \edef\backgroundoffset{\the\!!framedbackgroundoffset}% - \edef\backgroundwidth {\the\wd\framebox}% - \edef\backgroundheight{\the\ht\framebox}% - \edef\backgrounddepth {\the\dp\framebox}% - \edef\overlaylinecolor{\framedparameter\c!framecolor}% - \edef\overlaylinewidth{\the\ruledlinewidth}% - %\edef\foregroundbox{\box#1}% - \edef\component{\framedparameter\c!component}% - \ifx\component\empty + \framedbackgroundoffset\d_framed_backgroundoffset + \framedbackgroundwidth \wd\b_framed_normal + \framedbackgroundheight\ht\b_framed_normal + \framedbackgrounddepth \dp\b_framed_normal + \d_framed_target_wd\dimexpr\framedbackgroundwidth +2\framedbackgroundoffset\relax + \d_framed_target_ht\dimexpr\framedbackgroundheight+ \framedbackgroundoffset\relax + \d_framed_target_dp\dimexpr\framedbackgrounddepth + \framedbackgroundoffset+\framedparameter\c!backgrounddepth\relax + \let\framed_overlay_initialize\framed_overlay_initialize_indeed + \ifx\p_framed_component\empty \resetlayoutcomponentattribute \else - \setlayoutcomponentattribute{\v!background:\component}% + \setlayoutcomponentattribute{\v!background:\p_framed_component}% \fi - \let\foregroundbox\normalforegroundbox - \hbox \layoutcomponentboxattribute to \backgroundwidth % width in case 'foreground' is used as overlay - {\expandafter\dododobackgroundbox\framedbackground,\s!unknown,\relax % hm, messy .. look into it - \box\framebox\hss}}} + \let\foregroundbox\framed_background_box_content + \hbox \layoutcomponentboxattribute to \framedbackgroundwidth\bgroup % width in case 'foreground' is used as overlay + \the\everybackgroundbox % moved + \expandafter\framed_process_backgrounds\p_framed_background,\s!unknown,\relax % hm, messy .. look into it + \box\b_framed_normal + \hss + \egroup}} + +\def\framed_overlay_initialize_indeed + {%\writestatus{!!!!}{<<<<<}% + \edef\overlaywidth {\the\d_framed_target_wd\space}% + \edef\overlayheight {\the\dimexpr\d_framed_target_ht+\d_framed_target_dp\relax\space}% + \edef\overlaydepth {\the\d_framed_target_dp\space}% + \edef\overlaycolor {\framedparameter\c!backgroundcolor}% let ? + \edef\overlaylinecolor{\framedparameter\c!framecolor}% only needed for layers + \edef\overlaylinewidth{\the\d_framed_linewidth\space}% + %\edef\overlaycorner {\framedparameter\c!backgroundcorner}% + %\edef\overlayradius {\framedparameter\c!backgroundradius}% + \edef\overlayoffset {\the\framedbackgroundoffset\space}% \backgroundoffset % we steal this one + \let\framed_overlay_initialize\relax} %D One can explictly insert the foreground box. For that %D purpose we introduce the overlay \type {foreground}. +%D +%D We predefine two already familiar backgrounds: -\defineoverlay[\v!foreground][\foregroundbox] +\letvalue{\??ov:\v!screen }\framed_background_box_gray +\letvalue{\??ov:\v!color }\framed_background_box_color +\letvalue{\??ov:\v!foreground}\framed_background_box_content % replaces: \defineoverlay[\v!foreground][\foregroundbox] %D We can specify overlays as a comma separated list of %D overlays, a sometimes handy feature. @@ -448,112 +620,94 @@ %D by \TEX\ itself, the latter one depends on the driver. This %D macro also support a negative offset. -\def\dooutlinebox % we needed to move the color command in order to apply attributes properly - {\setbox\framebox\vbox % rules on top of box - {\frameddimenwd\dimexpr\wd\framebox+2\!!framedframeoffset\relax - \frameddimenht\dimexpr\ht\framebox+ \!!framedframeoffset\relax - \frameddimendp\dimexpr\dp\framebox+ \!!framedframeoffset+\framedparameter\c!framedepth\relax - \ifdim\frameddimendp<\zeropoint - \advance\frameddimenht \frameddimendp - \scratchdimen-\frameddimendp - \frameddimendp\zeropoint +\def\framed_add_outline + {\setbox\b_framed_normal\hbox % rules on top of box + {\d_framed_target_wd\dimexpr\wd\b_framed_normal+2\d_framed_frameoffset\relax + \d_framed_target_ht\dimexpr\ht\b_framed_normal+ \d_framed_frameoffset\relax + \d_framed_target_dp\dimexpr\dp\b_framed_normal+ \d_framed_frameoffset+\framedparameter\c!framedepth\relax + \ifdim\d_framed_target_dp<\zeropoint + \advance\d_framed_target_ht \d_framed_target_dp + \scratchdimen-\d_framed_target_dp + \d_framed_target_dp\zeropoint \else \scratchdimen\zeropoint \fi - \setbox\extraframebox\hbox - {\doifsomething{\framedparameter\c!framecolor}{\color[\framedparameter\c!framecolor]}{\dostrokedbox}}% - \setbox\extraframebox\hbox - {\raise\scratchdimen\vbox - {\moveleft\!!framedframeoffset - \box\extraframebox}}% - \wd\extraframebox\wd\framebox - \ht\extraframebox\ht\framebox - \dp\extraframebox\dp\framebox - \hbox{\box\framebox\hskip-\wd\extraframebox\box\extraframebox}}} - -\def\dostrokedbox - {\edef\@@framedcornermod{\framedparameter\c!framecorner}% - \ifx\@@framedcornermod\v!rectangular - \dostrokedlinedbox - \else\ifzeropt\dimexpr\framedparameter\c!frameradius\relax % just in case of .x\bodyfontsize - \dostrokedlinedbox - \else - \dostrokedroundbox - \fi\fi} - - -\def\dostrokedlinedbox % will move to pack-rul + \edef\overlaylinecolor{\framedparameter\c!framecolor}% twice, also in background + \setbox\b_framed_extra\hbox + {\kern-\d_framed_frameoffset + \raise\scratchdimen + \hbox{\ifx\overlaylinecolor\empty\else\doactivatecolor\overlaylinecolor\fi\framed_stroked_box}}% + \wd\b_framed_extra\wd\b_framed_normal + \ht\b_framed_extra\ht\b_framed_normal + \dp\b_framed_extra\dp\b_framed_normal + \wd\b_framed_normal\zeropoint + \box\b_framed_normal + \box\b_framed_extra}} + +\def\framed_stroked_box_normal {\setbox\scratchbox\emptyhbox - \wd\scratchbox\frameddimenwd - \ht\scratchbox\frameddimenht - \dp\scratchbox\frameddimendp + \wd\scratchbox\d_framed_target_wd + \ht\scratchbox\d_framed_target_ht + \dp\scratchbox\d_framed_target_dp \setbox\scratchbox\vbox \bgroup - \csname t\@@frame@@\framedparameter\c!frame\framedparameter\c!topframe \endcsname -\nointerlineskip % new (needed for fences), maybe \offinterlineskip + \csname \??hf t\p_framed_frame\framedparameter\c!topframe \endcsname + \nointerlineskip % new (needed for fences) \hbox \bgroup - \csname l\@@frame@@\framedparameter\c!frame\framedparameter\c!leftframe \endcsname + \csname \??hf l\p_framed_frame\framedparameter\c!leftframe \endcsname \box\scratchbox - \csname r\@@frame@@\framedparameter\c!frame\framedparameter\c!rightframe \endcsname + \csname \??hf r\p_framed_frame\framedparameter\c!rightframe \endcsname \egroup -\nointerlineskip % new (needed for fences) - \csname b\@@frame@@\framedparameter\c!frame\framedparameter\c!bottomframe\endcsname + \nointerlineskip % new (needed for fences) + \csname \??hf b\p_framed_frame\framedparameter\c!bottomframe\endcsname \egroup - \wd\scratchbox\frameddimenwd - \ht\scratchbox\frameddimenht - \dp\scratchbox\frameddimendp + \wd\scratchbox\d_framed_target_wd + \ht\scratchbox\d_framed_target_ht + \dp\scratchbox\d_framed_target_dp \box\scratchbox} -\def\@@frame@@{@@frame@@} - -\def\@@frame@@trule{\hrule\!!height\ruledlinewidth\kern-\ruledlinewidth} -\def\@@frame@@brule{\kern-\ruledlinewidth\hrule\!!height\ruledlinewidth} -\def\@@frame@@rrule{\kern-\ruledlinewidth\vrule\!!width\ruledlinewidth} -\def\@@frame@@lrule{\vrule\!!width\ruledlinewidth\kern-\ruledlinewidth} +\def\framed_t_rule{\hrule\!!height\d_framed_linewidth\kern-\d_framed_linewidth} +\def\framed_b_rule{\kern-\d_framed_linewidth\hrule\!!height\d_framed_linewidth} +\def\framed_r_rule{\kern-\d_framed_linewidth\vrule\!!width\d_framed_linewidth} +\def\framed_l_rule{\vrule\!!width\d_framed_linewidth\kern-\d_framed_linewidth} -\letvalue{t\@@frame@@\v!on \v!on}\@@frame@@trule -\letvalue{t\@@frame@@\v!off\v!on}\@@frame@@trule -\letvalue{t\@@frame@@\v!on }\@@frame@@trule +\letvalue{\??hf t\v!on \v!on}\framed_t_rule +\letvalue{\??hf t\v!off\v!on}\framed_t_rule +\letvalue{\??hf t\v!on }\framed_t_rule -\letvalue{b\@@frame@@\v!on \v!on}\@@frame@@brule -\letvalue{b\@@frame@@\v!off\v!on}\@@frame@@brule -\letvalue{b\@@frame@@\v!on }\@@frame@@brule +\letvalue{\??hf b\v!on \v!on}\framed_b_rule +\letvalue{\??hf b\v!off\v!on}\framed_b_rule +\letvalue{\??hf b\v!on }\framed_b_rule -\letvalue{l\@@frame@@\v!on \v!on}\@@frame@@lrule -\letvalue{l\@@frame@@\v!off\v!on}\@@frame@@lrule -\letvalue{l\@@frame@@\v!on }\@@frame@@lrule +\letvalue{\??hf l\v!on \v!on}\framed_l_rule +\letvalue{\??hf l\v!off\v!on}\framed_l_rule +\letvalue{\??hf l\v!on }\framed_l_rule -\letvalue{r\@@frame@@\v!on \v!on}\@@frame@@rrule -\letvalue{r\@@frame@@\v!off\v!on}\@@frame@@rrule -\letvalue{r\@@frame@@\v!on }\@@frame@@rrule +\letvalue{\??hf r\v!on \v!on}\framed_r_rule +\letvalue{\??hf r\v!off\v!on}\framed_r_rule +\letvalue{\??hf r\v!on }\framed_r_rule % no overlapping rules -\def\@@frame@@trules{\hbox{\kern\ruledlinewidth\vrule\!!width\dimexpr\frameddimenwd-2\ruledlinewidth\relax\!!height\ruledlinewidth}\nointerlineskip\kern-\ruledlinewidth} -\def\@@frame@@brules{\kern-\ruledlinewidth\nointerlineskip\hbox{\kern\ruledlinewidth\vrule\!!width\dimexpr\frameddimenwd-2\ruledlinewidth\relax\!!height\ruledlinewidth}} -\def\@@frame@@rrules{\kern-\ruledlinewidth\vrule\!!height\dimexpr\frameddimenht-\ruledlinewidth\relax\!!depth-\ruledlinewidth\!!width\ruledlinewidth} -\def\@@frame@@lrules{\vrule\!!height\dimexpr\frameddimenht-\ruledlinewidth\relax\!!depth-\ruledlinewidth\!!width\ruledlinewidth\kern-\ruledlinewidth} +\def\framed_t_rules{\hbox{\kern\d_framed_linewidth\vrule\!!width\dimexpr\d_framed_target_wd-2\d_framed_linewidth\relax\!!height\d_framed_linewidth}\nointerlineskip\kern-\d_framed_linewidth} +\def\framed_b_rules{\kern-\d_framed_linewidth\nointerlineskip\hbox{\kern\d_framed_linewidth\vrule\!!width\dimexpr\d_framed_target_wd-2\d_framed_linewidth\relax\!!height\d_framed_linewidth}} +\def\framed_r_rules{\kern-\d_framed_linewidth\vrule\!!height\dimexpr\d_framed_target_ht-\d_framed_linewidth\relax\!!depth-\d_framed_linewidth\!!width\d_framed_linewidth} +\def\framed_l_rules{\vrule\!!height\dimexpr\d_framed_target_ht-\d_framed_linewidth\relax\!!depth-\d_framed_linewidth\!!width\d_framed_linewidth\kern-\d_framed_linewidth} -% small is relatively new +\letvalue{\??hf t\v!small\v!small}\frame_t_rules +\letvalue{\??hf t\v!off \v!small}\frame_t_rules +\letvalue{\??hf t\v!small }\frame_t_rules -\letvalue{t\@@frame@@\v!small\v!small}\@@frame@@trules -\letvalue{t\@@frame@@\v!off \v!small}\@@frame@@trules -\letvalue{t\@@frame@@\v!small }\@@frame@@trules +\letvalue{\??hf b\v!small\v!small}\frame_b_rules +\letvalue{\??hf b\v!off \v!small}\frame_b_rules +\letvalue{\??hf b\v!small }\frame_b_rules -\letvalue{b\@@frame@@\v!small\v!small}\@@frame@@brules -\letvalue{b\@@frame@@\v!off \v!small}\@@frame@@brules -\letvalue{b\@@frame@@\v!small }\@@frame@@brules +\letvalue{\??hf l\v!small\v!small}\frame_l_rules +\letvalue{\??hf l\v!off \v!small}\frame_l_rules +\letvalue{\??hf l\v!small }\frame_l_rules -\letvalue{l\@@frame@@\v!small\v!small}\@@frame@@lrules -\letvalue{l\@@frame@@\v!off \v!small}\@@frame@@lrules -\letvalue{l\@@frame@@\v!small }\@@frame@@lrules - -\letvalue{r\@@frame@@\v!small\v!small}\@@frame@@rrules -\letvalue{r\@@frame@@\v!off \v!small}\@@frame@@rrules -\letvalue{r\@@frame@@\v!small }\@@frame@@rrules - -%D I condidered using the low level support command -%D \type{\ruledhbox}, but this would slow down processing by a -%D factor~3. +\letvalue{\??hf r\v!small\v!small}\frame_r_rules +\letvalue{\??hf r\v!off \v!small}\frame_r_rules +\letvalue{\??hf r\v!small }\frame_r_rules % \framed % [width=4cm,height=3cm,rulethickness=3mm, @@ -577,20 +731,15 @@ % todo : \c_framed_hasoffset % faster : \let\c_framed_hasoffset\falseconditional -\newif\ifboxhasoffset -\newif\ifboxhaswidth -\newif\ifboxhasheight -\newif\ifboxhasformat -\newif\ifboxhasstrut -\newif\ifboxisoverlaid -\newif\ifboxhasframe -\newif\ifdelayedstrut -\newif\ifboxhasextraoffset - -%D We also need a few \DIMENSIONS: - -\newdimen\@@localoffset -\newdimen\@@globalwidth +\newconditional\c_framed_has_offset +\newconditional\c_framed_has_width +\newconditional\c_framed_has_height +\newconditional\c_framed_has_format +\newconditional\c_framed_has_strut +\newconditional\c_framed_is_overlaid +\newconditional\c_framed_has_frame +\newconditional\c_framed_has_extra_offset +\newconditional\c_framed_text_location_none %D \macros %D {framed, setupframed} @@ -623,16 +772,16 @@ {\bgroup \advance\framednesting\plusone \expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol - \dodoubleempty\dolocalframed[\??ol:\the\framednesting]} + \dodoubleempty\framed_process[\??ol:\the\framednesting]} \unexpanded\def\startframed - {\dosingleempty\dostartframed} + {\dosingleempty\framed_start_framed} -\def\dostartframed[#1]% +\def\framed_start_framed[#1]% {\bgroup \advance\framednesting\plusone \expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol - \dolocalframed[\??ol:\the\framednesting][#1]% + \framed_process[\??ol:\the\framednesting][#1]% \bgroup} \let\stopframed\egroup @@ -644,7 +793,7 @@ {\bgroup \advance\framednesting\plusone \expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol - \dolocalframed[\??ol:\the\framednesting]} + \framed_process[\??ol:\the\framednesting]} % we can consider setting the parent of the regular framed to % something else in the otr so that we isolate it there @@ -690,31 +839,34 @@ \unexpanded\def\fastlocalframed[#1]#2[#3]#4% 3-4 {\bgroup - \doinitializeframed{#1}% - \setbox\framebox\hbox{#4}% - \getparameters[\@@framed][#3]% no \expanded ! - \!!framedframeoffset\framedparameter\c!frameoffset - \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}% - \ifx\@@framedbackgroundoffset\v!frame - \!!framedbackgroundoffset\!!framedframeoffset - \else - \!!framedbackgroundoffset\@@framedbackgroundoffset - \fi + \framed_initialize{#1}% + \setbox\b_framed_normal\hbox{#4}% + \getparameters[\currentframed][#3]% no \expanded ! + \edef\p_framed_rulethickness{\framedparameter\c!rulethickness}% also used in backgrounds + \d_framed_frameoffset\framedparameter\c!frameoffset\relax % also used in backgrounds + \edef\p_framed_frame{\framedparameter\c!frame}% + \edef\p_framed_background{\framedparameter\c!background}% % not here, in calling macro: setups - \removeframedboxdepth - \edef\@@localframing {\framedparameter\c!frame}% - \ifx\@@localframing\v!overlay \else \ifx\@@localframing\v!none \else - \edef\framedrulethickness{\framedparameter\c!rulethickness}% - \ifx\framedrulethickness\empty\else - \ruledlinewidth\framedrulethickness\relax - \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi + \framed_remove_depth + \ifx\p_framed_frame\v!overlay \else \ifx\p_framed_frame\v!none \else + \ifx\p_framed_rulethickness\empty\else + \d_framed_linewidth\p_framed_rulethickness\relax \fi - \dooutlinebox % real or invisible frame + \framed_add_outline % real or invisible frame \fi \fi - \edef\framedbackground{\framedparameter\c!background}% - \ifx\framedbackground\empty\else\dobackedbox\fi - \restoreframedboxdepth - \box\framebox + \ifx\p_framed_background\empty \else + \edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}% + \d_framed_backgroundoffset + \ifx\p_framed_backgroundoffset\v!frame + \d_framed_frameoffset + \else + \p_framed_backgroundoffset + \fi + \edef\p_framed_component{\framedparameter\c!component}% + \framed_add_background + \fi + \framed_restore_depth + \box\b_framed_normal \egroup} %D The next macro uses a box and takes its natural width and @@ -722,145 +874,34 @@ \def\localbackgroundframed#1#2#3% namespace component box {\bgroup - \doinitializeframed{#1}% - \expandafter\def\csname\@@framed\c!component\endcsname{#2}% watch out: hard coded @@framed - \setbox\framebox\box#3% - \!!framedframeoffset\framedparameter\c!frameoffset - \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}% - \ifx\@@framedbackgroundoffset\v!frame - \!!framedbackgroundoffset\!!framedframeoffset - \else - \!!framedbackgroundoffset\@@framedbackgroundoffset - \fi - \edef\framedbackground {\framedparameter\c!background}% - \edef\framedrulethickness{\framedparameter\c!rulethickness}% - \edef\@@localframing {\framedparameter\c!frame}% - \ifx\@@localframing\v!overlay \else \ifx\@@localframing\v!none \else - \ifx\framedrulethickness\empty\else - \ruledlinewidth\framedrulethickness\relax - \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi + \framed_initialize{#1}% + \setbox\b_framed_normal\box#3% + \edef\p_framed_rulethickness{\framedparameter\c!rulethickness}% also used in backgrounds + \d_framed_frameoffset\framedparameter\c!frameoffset\relax % also used in backgrounds + \edef\p_framed_frame{\framedparameter\c!frame}% + \edef\p_framed_background{\framedparameter\c!background}% + \ifx\p_framed_frame\v!overlay \else \ifx\p_framed_frame\v!none \else + \ifx\p_framed_rulethickness\empty \else + \d_framed_linewidth\p_framed_rulethickness\relax \fi - \dooutlinebox % real or invisible frame + \framed_add_outline % real or invisible frame \fi \fi - \ifx\framedbackground\empty\else\dobackedbox\fi - \box\framebox + \ifx\p_framed_background\empty \else + \edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}% + \d_framed_backgroundoffset + \ifx\p_framed_backgroundoffset\v!frame + \d_framed_frameoffset + \else + \p_framed_backgroundoffset + \fi + \edef\p_framed_component{#2}% + \framed_add_background + \fi + \box\b_framed_normal \egroup} -%D Before we go into details, we present (and implement) the -%D main framing routine. I saw no real reason for splitting the -%D next two macros into smaller pieces. The content will be -%D collected in a horizontal or vertical box with fixed or free -%D dimensions and specific settings concerning aligment and -%D offsets. -%D -%D In the first few lines, we pre||expand the frame and -%D background offsets. We do so, because the can be defined in -%D terms of the main offset. However, see for instance page -%D backgrounds, when \type {#2} sets the offset to \type -%D {overlay}, both offsets become invalid. -%D -%D Because it is used so often the he next macro is (and -%D looks) rather optimized. - -% eventually all will ue the commandhandler but now we have a -% hybrid (with and without colon) - \let\postprocessframebox\relax -\let\@@framed\s!unknown - -\def\framedparameter #1{\csname\doframedparameter\@@framed{#1}\endcsname} -\def\framedparameterhash#1{\doframedparameterhash \@@framed#1} - -\def\doframedparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedparentparameter \csname#1\s!parent\endcsname{#2}\fi} -\def\doframedparameterhash#1#2{\ifcsname#1#2\endcsname #1\else\expandafter\doframedparentparameterhash\csname#1\s!parent\endcsname#2\fi} - -\def\doframedparentparameter #1#2{\ifx#1\relax\s!empty\else\doframedparameter #1{#2}\fi} -\def\doframedparentparameterhash#1#2{\ifx#1\relax \else\doframedparameterhash#1#2\fi} - -\def\doframedparentparameter#1#2{\ifx#1\relax\doframedrootparameter#2\else\doframedparameter#1{#2}\fi} -\def\doframedrootparameter #1{\ifcsname\??oi#1\endcsname\??oi#1\else\s!empty\fi} - -\def\useframedstyleandcolor#1#2% style color - {\edef\currentstyleparameter{\framedparameter#1}% - \edef\currentcolorparameter{\framedparameter#2}% - \ifx\currentstyleparameter\empty\else\dousestyleparameter\currentstyleparameter\fi - \ifx\currentcolorparameter\empty\else\dousecolorparameter\currentcolorparameter\fi} - -\def\frameddimension#1{\the\dimexpr\framedparameter{#1}\relax} - -\let\normalframedparameter \framedparameter -\let\normalframedparameterhash\framedparameterhash - -\def\doinitializeframed#1% will be inlined - {\inframedtrue - \edef\@@framed{#1}% - \let\framedparameter \normalframedparameter - \let\framedparameterhash\normalframedparameterhash} - -% defaults, kind of isolated now - -\getparameters - [\??oi] - [\c!width=\v!fit, - \c!height=\v!broad, - %\c!lines=, - \c!offset=0.25ex, % \defaultframeoffset - \c!empty=\v!no, - \c!frame=\v!on, - %\c!topframe=, - %\c!bottomframe=, - %\c!leftframe=, - %\c!rightframe=, - \c!radius=.5\bodyfontsize, - \c!rulethickness=\linewidth, - \c!corner=\v!rectangular, - \c!depth=\zeropoint, - %\c!foregroundcolor=, - %\c!foregroundstyle=, - %\c!background=, - %\c!backgroundscreen=, - %\c!backgroundcolor=, - \c!backgroundoffset=\zeropoint, - %\c!framecolor=, - \c!frameoffset=\zeropoint, - \c!backgroundcorner=\framedparameter\c!corner, - \c!backgroundradius=\framedparameter\c!radius, - \c!backgrounddepth=\framedparameter\c!depth, - \c!framecorner=\framedparameter\c!corner, - \c!frameradius=\framedparameter\c!radius, - \c!framedepth=\framedparameter\c!depth, - %\c!component=, - %\c!align=, - \c!bottom=\vss, - %\c!top=, - \c!strut=\v!yes, - \c!autostrut=\v!yes, - \c!location=\v!normal, - %\c!orientation=, - \c!autowidth=\v!yes, - %\c!setups= -] - -\getparameters - [\??od] % for fast version - [\c!frame=\v!off, - \c!depth=\zeropoint, - \c!offset=\v!overlay, - %\c!component=, - \c!radius=.5\bodyfontsize, - \c!rulethickness=\linewidth, - \c!corner=\v!rectangular, - \c!backgroundoffset=\zeropoint, - \c!frameoffset=\zeropoint, - \c!backgroundcorner=\framedparameter\c!corner, - \c!backgroundradius=\framedparameter\c!radius, - \c!backgrounddepth=\framedparameter\c!depth, - \c!framecorner=\framedparameter\c!corner, - \c!frameradius=\framedparameter\c!radius, - \c!framedepth=\framedparameter\c!depth, - \c!location=\v!normal] - %D A nice example by Aditya: %D %D \starttyping @@ -872,78 +913,38 @@ %D \defineframed[test][hoffset=1cm] %D \stoptyping -\newdimen\!!framedwidth -\newdimen\!!framedheight -\newdimen\!!framedscratch % so that users can use \scratchdimen -\newdimen\!!framedframeoffset -\newdimen\!!framedbackgroundoffset - -\let\setextraframedoffsets \relax -\let\applyextraframedoffsets\relax +\newdimen\d_framed_width +\newdimen\d_framed_height +\newdimen\d_framed_frameoffset +\newdimen\d_framed_backgroundoffset +\newdimen\d_framed_local_offset % todo: protect local \framednames \unexpanded\def\localframed {\bgroup - \dodoubleempty\dolocalframed} + \dodoubleempty\framed_process} -\unexpanded\def\dolocalframed[#1][#2]% assumes a \dodoubleempty (slows down), also should have leading \bgroup +\unexpanded\def\framed_process[#1][#2]% assumes a \dodoubleempty (slows down), also should have leading \bgroup {\bgroup - \doinitializeframed{#1}% + \framed_initialize{#1}% \ifsecondargument % faster - \getparameters[\@@framed][#2]% here ! + \getparameters[\currentframed][#2]% here ! \fi - \dodolocalframed} + \framed_process_indeed} \unexpanded\def\directlocalframed[#1]% no optional {\bgroup \bgroup - \doinitializeframed{#1}% - \dodolocalframed} + \framed_initialize{#1}% + \framed_process_indeed} \unexpanded\def\localframedwithsettings[#1][#2]% no checking (so no spaces between) {\bgroup \bgroup - \doinitializeframed{#1}% - \getparameters[\@@framed][#2]% here ! - \dodolocalframed} - -% will probably move - -\def\installinheritedframed#1% - {\normalexpanded{\doinstallinheritedframed - \expandafter\noexpand\csname current#1\endcsname - \expandafter\noexpand\csname #1parameter\endcsname - \expandafter\noexpand\csname #1parameterhash\endcsname - \expandafter\noexpand\csname do#1parameter\endcsname - \expandafter\noexpand\csname do#1parentparameter\endcsname - \expandafter\noexpand\csname do#1rootparameter\endcsname - \expandafter\noexpand\csname inherited#1framed\endcsname - \noexpand\??oi}} % if needed we can have a variant - -\unexpanded\def\doinstallinheritedframed#1#2#3#4#5#6#7#8% - {\def#5##1##2{\ifx##1\relax#6{##2}\else#4##1{##2}\fi}% - \def#6##1{\ifcsname#8##1\endcsname#8##1\else\s!empty\fi}% - \unexpanded\def#7% - {\bgroup - \bgroup - \inframedtrue - \let\@@framed #1% not used (more for tracing) - \let\framedparameter #2% - \let\framedparameterhash#3% - \dodolocalframed}} - -\unexpanded\def\installframedcommandhandler#1#2#3% - {\installcommandhandler{#1}{#2}{#3}% - \installinheritedframed{#2}} - -\unexpanded\def\installframedautocommandhandler#1#2#3% - {\installautocommandhandler{#1}{#2}{#3}% - \installinheritedframed{#2}} - -\unexpanded\def\installsimpleframedcommandhandler#1#2#3% - {\installsimplecommandhandler{#1}{#2}{#3}% - \installinheritedframed{#2}} + \framed_initialize{#1}% + \getparameters[\currentframed][#2]% here ! + \framed_process_indeed} % done @@ -951,25 +952,23 @@ % we can make macros for the offset, width, and height branches or do an \csname -\unexpanded\def\dodolocalframed - {\!!framedframeoffset\framedparameter\c!frameoffset - \edef\@@framedbackgroundoffset{\framedparameter\c!backgroundoffset}% - \ifx\@@framedbackgroundoffset\v!frame - \!!framedbackgroundoffset\!!framedframeoffset - \else - \!!framedbackgroundoffset\@@framedbackgroundoffset - \fi +\unexpanded\def\framed_process_indeed + {\d_framed_frameoffset\framedparameter\c!frameoffset + \edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}% + \d_framed_backgroundoffset + \ifx\p_framed_backgroundoffset\v!frame + \d_framed_frameoffset + \else + \p_framed_backgroundoffset + \fi % new, experimental dirty hook \framedparameter\c!extras % to get the right spacing - \edef\!!framedforegroundstyle{\framedparameter\c!foregroundstyle}% - \ifx\!!framedforegroundstyle\empty\else\dousestyleparameter\!!framedforegroundstyle\fi + \edef\p_framed_foregroundstyle{\framedparameter\c!foregroundstyle}% + \ifx\p_framed_foregroundstyle\empty\else\dousestyleparameter\p_framed_foregroundstyle\fi % beware, both the frame and background offset can be overruled % - \edef\doframedsetups{\framedparameter\c!setups}% - \ifx\doframedsetups\empty\else - \edef\doframedsetups{\noexpand\setups[\doframedsetups]}% - \fi + \edef\p_framed_setups{\framedparameter\c!setups}% % the next macros are visible \edef\localoffset{\framedparameter\c!offset}% \edef\localwidth {\framedparameter\c!width}% @@ -977,136 +976,132 @@ \edef\localformat{\framedparameter\c!align}% \edef\localstrut {\framedparameter\c!strut}% % these are not - \edef\@@localautostrut {\framedparameter\c!autostrut}% - \edef\@@localframing {\framedparameter\c!frame}% - \edef\@@locallocation {\framedparameter\c!location}% - \edef\@@localorientation{\framedparameter\c!orientation}% + \edef\p_framed_autostrut {\framedparameter\c!autostrut}% + \edef\p_framed_frame {\framedparameter\c!frame}% + \edef\p_framed_location {\framedparameter\c!location}% + \edef\p_framed_orientation{\framedparameter\c!orientation}% % - \edef\@@localautowidth {\framedparameter\c!autowidth}% - \edef\@@localfranalyze {\framedparameter\c!fr!analyze}% experimental option + \edef\p_framed_autowidth {\framedparameter\c!autowidth}% + \edef\p_framed_franalyze {\framedparameter\c!fr!analyze}% experimental option % - \ifx\@@localframing\v!overlay % no frame, no offset, no framewidth - \boxhasframefalse + \ifx\p_framed_frame\v!overlay % no frame, no offset, no framewidth + \setfalse\c_framed_has_frame \let\localoffset\v!overlay - \else\ifx\@@localframing\v!none % no frame, no framewidth - \boxhasframefalse + \else\ifx\p_framed_frame\v!none % no frame, no framewidth + \setfalse\c_framed_has_frame \else - \boxhasframetrue + \settrue\c_framed_has_frame \fi\fi - \ifboxhasframe - \edef\framedrulethickness{\framedparameter\c!rulethickness}% - \ifx\framedrulethickness\empty\else - \ruledlinewidth\framedrulethickness\relax - \ifinheritruledlinewidth\linewidth\ruledlinewidth\fi + \ifconditional\c_framed_has_frame + \edef\p_framed_rulethickness{\framedparameter\c!rulethickness}% + \ifx\p_framed_rulethickness\empty\else + \d_framed_linewidth\p_framed_rulethickness\relax \fi \else - \ruledlinewidth\zeropoint + \d_framed_linewidth\zeropoint \fi \ifx\localformat\empty - \boxhasformatfalse + \setfalse\c_framed_has_format \else - \boxhasformattrue + \settrue\c_framed_has_format \dosetraggedcommand\localformat % not that fast - \edef\dobeforeframedbox{\raggedtopcommand\framedparameter\c!top}% - \edef\doafterframedbox {\framedparameter\c!bottom\raggedbottomcommand}% \fi \ifx\localoffset\v!none - \boxhasoffsetfalse - \boxhasstrutfalse - \boxisoverlaidfalse - \@@localoffset\ruledlinewidth + \setfalse\c_framed_has_offset + \setfalse\c_framed_has_strut + \setfalse\c_framed_is_overlaid + \d_framed_local_offset\d_framed_linewidth \else\ifx\localoffset\v!overlay - % \ifx\@@localframing\v!no \boxhasframefalse \fi % test first - \boxhasoffsetfalse - \boxhasstrutfalse - \boxisoverlaidtrue - \@@localoffset\zeropoint + % \ifx\p_framed_frame\v!no \setfalse\c_framed_has_frame \fi % test first + \setfalse\c_framed_has_offset + \setfalse\c_framed_has_strut + \settrue \c_framed_is_overlaid + \d_framed_local_offset\zeropoint % \else\ifx\localoffset\v!strut -% \boxhasoffsetfalse -% \boxhasstruttrue -% \boxisoverlaidtrue -% \@@localoffset\zeropoint +% \setfalse\c_framed_has_offset +% \settrue \c_framed_has_strut +% \settrue \c_framed_is_overlaid +% \d_framed_local_offset\zeropoint \else - \boxhasoffsettrue - \boxhasstruttrue - \boxisoverlaidfalse + \settrue \c_framed_has_offset + \settrue \c_framed_has_strut + \setfalse\c_framed_is_overlaid \ifx\localoffset\v!default % new per 2-6-2000 \let\localoffset\defaultframeoffset - %\expandafter\let\csname\@@framed\c!offset\endcsname\defaultframeoffset - \letframedparameter\c!offset\defaultframeoffset + \letframedparameter\c!offset\defaultframeoffset % brrr \else \let\defaultframeoffset\localoffset \fi - \@@localoffset\dimexpr\localoffset+\ruledlinewidth\relax + \d_framed_local_offset\dimexpr\localoffset+\d_framed_linewidth\relax \fi\fi % \fi - \!!framedheight\zeropoint - \!!framedwidth \zeropoint + \d_framed_height\zeropoint + \d_framed_width \zeropoint \ifx\localwidth\empty % fallback to fit - \ifboxhasformat - \boxhaswidthtrue - \!!framedwidth\hsize + \ifconditional\c_framed_has_format + \settrue\c_framed_has_width + \d_framed_width\hsize \else - \boxhaswidthfalse + \setfalse\c_framed_has_width \fi \else\ifx\localwidth\v!fit - \ifboxhasformat - \boxhaswidthtrue - \!!framedwidth\hsize + \ifconditional\c_framed_has_format + \settrue\c_framed_has_width + \d_framed_width\hsize \else - \boxhaswidthfalse + \setfalse\c_framed_has_width \fi \else\ifx\localwidth\v!fixed % equals \v!fit but no shapebox - \ifboxhasformat - \boxhaswidthtrue - \!!framedwidth\hsize + \ifconditional\c_framed_has_format + \settrue\c_framed_has_width + \d_framed_width\hsize \else - \boxhaswidthfalse + \setfalse\c_framed_has_width \fi \else\ifx\localwidth\v!broad - \boxhaswidthtrue - \!!framedwidth\hsize + \settrue\c_framed_has_width + \d_framed_width\hsize \else\ifx\localwidth\v!local - \boxhaswidthtrue + \settrue\c_framed_has_width \setlocalhsize - \!!framedwidth\localhsize + \d_framed_width\localhsize \else - \boxhaswidthtrue - \!!framedwidth\localwidth + \settrue\c_framed_has_width + \d_framed_width\localwidth \fi\fi\fi\fi\fi \ifx\localheight\empty % fallback to fit - \boxhasheightfalse + \setfalse\c_framed_has_height \else\ifx\localheight\v!fit - \boxhasheightfalse % no longer: \boxhasstrutfalse + \setfalse\c_framed_has_height \else\ifx\localheight\v!broad - \boxhasheightfalse + \setfalse\c_framed_has_height \else - \boxhasheighttrue - \!!framedheight\localheight + \settrue\c_framed_has_height + \d_framed_height\localheight \fi\fi\fi - \ifboxhasheight + \ifconditional\c_framed_has_height % obey user set height, also downward compatible \else - \edef\@@framedlines{\framedparameter\c!lines}% - \ifx\@@framedlines\empty\else - \ifcase\@@framedlines\else - \!!framedheight\@@framedlines\lineheight - \edef\localheight{\the\!!framedheight}% - \boxhasheighttrue + \edef\p_framed_lines{\framedparameter\c!lines}% + \ifx\p_framed_lines\empty\else + \ifcase\p_framed_lines\else + \d_framed_height\p_framed_lines\lineheight + \edef\localheight{\the\d_framed_height}% + \settrue\c_framed_has_height \fi \fi \fi % this is now an option: width=local % - % \ifdim\!!framedwidth=\hsize + % \ifdim\d_framed_width=\hsize % \parindent\zeropoint % \setlocalhsize - % \!!framedwidth\localhsize + % \d_framed_width\localhsize % \fi % i.e. disable (colsetbackgroundproblemintechniek) - \advance\!!framedwidth -2\@@localoffset - \advance\!!framedheight -2\@@localoffset + \advance\d_framed_width -2\d_framed_local_offset + \advance\d_framed_height -2\d_framed_local_offset \ifx\localstrut\v!no - \boxhasstrutfalse + \setfalse\c_framed_has_strut \else\ifx\localstrut\v!global \setstrut \else\ifx\localstrut\v!local @@ -1114,7 +1109,7 @@ \else \setstrut \fi\fi\fi - \ifboxhasstrut + \ifconditional\c_framed_has_strut \let\localbegstrut\begstrut \let\localendstrut\endstrut \let\localstrut \strut @@ -1122,12 +1117,12 @@ \let\localbegstrut\pseudobegstrut % was: \relax \let\localendstrut\pseudoendstrut % was: \relax \let\localstrut \pseudostrut % was: \relax - %\ifboxhasheight\ifdim\!!framedheight<\strutht % saveguard + %\ifconditional\c_framed_has_height\ifdim\d_framed_height<\strutht % saveguard % \let\localbegstrut\relax % but not that % \let\localstrut \relax % save after all %\fi\fi \fi - \ifx\@@localautostrut\v!yes + \ifx\p_framed_autostrut\v!yes \let\delayedbegstrut\relax \let\delayedendstrut\relax \let\delayedstrut \relax @@ -1139,64 +1134,66 @@ \let\localendstrut \relax \let\localstrut \relax \fi - \ifboxhasheight - \let\\\vboxednewline - \ifboxhaswidth - \let\hairline\vboxedhairline - \ifboxhasformat - \let\next\doformatboxSomeFormat + \ifconditional\c_framed_has_height + \let\\\framed_vboxed_newline + \ifconditional\c_framed_has_width + \let\hairline\framed_vboxed_hairline + \ifconditional\c_framed_has_format + \let\next\framed_format_format_yes \else - \let\next\doformatboxNoFormat + \let\next\framed_format_format_nop \fi \else - \let\hairline\hboxedhairline - \ifboxhasformat - \let\next\doformatboxHeight + \let\hairline\framed_hboxed_hairline + \ifconditional\c_framed_has_format + \let\next\framed_format_format_height \else - \let\next\doformatboxVSize + \let\next\framed_format_format_vsize \fi \fi \else - \ifboxhaswidth - \ifboxhasformat - \let\hairline\vboxedhairline - \let\\\vboxednewline - \let\next\doformatboxWidth + \ifconditional\c_framed_has_width + \ifconditional\c_framed_has_format + \let\hairline\framed_vboxed_hairline + \let\\\framed_vboxed_newline + \let\next\framed_format_format_width \else - \let\hairline\hboxedhairline - \let\\\hboxednewline - \let\next\doformatboxHSize + \let\hairline\framed_hboxed_hairline + \let\\\framed_hboxed_newline + \let\next\framed_format_format_hsize \fi \else - \let\hairline\hboxedhairline - \let\\\hboxednewline - \let\next\doformatboxNoSize + \let\hairline\framed_hboxed_hairline + \let\\\framed_hboxed_newline + \let\next\framed_format_format_no_size \fi \fi - \setextraframedoffsets - \edef\framedbackground{\framedparameter\c!background}% - \ifx\framedbackground\empty - \let\framedforgetall\forgetall + \framed_check_extra_offsets + \edef\p_framed_background{\framedparameter\c!background}% + \ifx\p_framed_background\empty + \let\framed_forgetall\forgetall \else - \let\framedforgetall\relax + \let\framed_forgetall\relax \forgetall \fi - \edef\framedwidth {\ifdim\!!framedwidth >\zeropoint\the\!!framedwidth \else\!!zeropoint\fi}% a new feature, visible for user - \edef\framedheight{\ifdim\!!framedheight>\zeropoint\the\!!framedheight\else\!!zeropoint\fi}% a new feature, visible for user - \edef\framedoffset{\the\dimexpr\ifboxhasoffset\localoffset\else\zeropoint\fi}% - \@@startframedorientation - \afterassignment\dodowithframebox - \setbox\framebox\next} + \edef\framedwidth {\ifdim\d_framed_width >\zeropoint\the\d_framed_width \else\!!zeropoint\fi}% a new feature, visible for user + \edef\framedheight{\ifdim\d_framed_height>\zeropoint\the\d_framed_height\else\!!zeropoint\fi}% a new feature, visible for user + \edef\framedoffset{\the\dimexpr\ifconditional\c_framed_has_offset\localoffset\else\zeropoint\fi}% + \ifx\p_framed_orientation\empty + \let\framed_stop_orientation\relax + \else + \framed_start_orientation + \fi + \afterassignment\framed_restart + \setbox\b_framed_normal\next} -\def\dowithframebox - {% moved : \let\postprocessframebox\relax - \finishlocalframed} +\let\framed_stop_orientation\relax -\def\dodowithframebox - {\aftergroup\dowithframebox} +\def\framed_restart + {\aftergroup\framed_finish} -\let\doafterframedbox \relax -\let\dobeforeframedbox\relax +\def\framed_do_top {\raggedtopcommand\framedparameter\c!top} +\def\framed_do_bottom{\framedparameter\c!bottom\raggedbottomcommand} %D Carefull analysis of this macro will learn us that not all %D branches in the last conditionals can be encountered, that @@ -1247,134 +1244,146 @@ %D ...,bottom=\kern0pt,... %D \stoptyping -% experiment ... \@@localfranalyze -> we could support 'first' as location key +% experiment ... \p_framed_franalyze -> we could support 'first' as location key % option but then we will always do an analysis and reimplement the location % options (btw, beware of location settings of derived functionality that bleed % into this -\def\finishlocalframeda +\def\framed_finish_a {\ifreshapeframebox - \doreshapeframedbox - \else\ifx\@@localfranalyze\v!yes - \doanalyzeframedbox + \framed_reshape_process + \else\ifx\p_framed_franalyze\v!yes + \framed_reshape_analyze \else - \resetshapeframebox + \framed_reshape_reset \fi\fi - \boxhaswidthfalse} + \setfalse\c_framed_has_width} -\def\finishlocalframedb - {\ifx\@@localfranalyze\v!yes - \doanalyzeframedbox +\def\framed_finish_b + {\ifx\p_framed_franalyze\v!yes + \framed_reshape_analyze \else - \resetshapeframebox + \framed_reshape_reset \fi - \boxhaswidthfalse} + \setfalse\c_framed_has_width} -\def\finishlocalframedc - {\ifx\@@localfranalyze\v!yes - \doanalyzeframedbox +\def\framed_finish_c + {\ifx\p_framed_franalyze\v!yes + \framed_reshape_analyze \else - \resetshapeframebox + \framed_reshape_reset \fi} -\unexpanded\def\finishlocalframed +\unexpanded\def\framed_finish {\dontshowcomposition - \@@stopframedorientation % hm, wrong place ! should rotate the result (after reshape) - \handleframedlocator\c!before\@@locallocation - \ifboxhasformat - \ifx\@@localautowidth\v!force - \finishlocalframeda + \framed_stop_orientation % hm, wrong place ! should rotate the result (after reshape) + \framed_locator_before\p_framed_location + \ifconditional\c_framed_has_format + \ifx\p_framed_autowidth\v!force + \framed_finish_a \else\ifx\localwidth\v!fit - \ifx\@@localautowidth\v!yes - \finishlocalframeda + \ifx\p_framed_autowidth\v!yes + \framed_finish_a \else - \finishlocalframedb + \framed_finish_b \fi \else\ifx\localwidth\v!fixed - \finishlocalframedb + \framed_finish_b \else - \finishlocalframedc + \framed_finish_c \fi\fi\fi \ifconditional\boxcontentneedsprocessing - \mkdoprocessboxcontents\framebox + \mkdoprocessboxcontents\b_framed_normal \fi \else - \finishlocalframedc + \framed_finish_c \fi - \ifboxhaswidth - \wd\framebox\!!framedwidth + \ifconditional\c_framed_has_width + \wd\b_framed_normal\d_framed_width \fi - \ifboxhasheight - \ht\framebox\!!framedheight + \ifconditional\c_framed_has_height + \ht\b_framed_normal\d_framed_height \fi - \doif{\framedparameter\c!empty}\v!yes\dosetfakedframebox - \ifboxhasextraoffset - \applyextraframedoffsets + \edef\p_framed_empty{\framedparameter\c!empty}% + \ifx\p_framed_empty\v!yes + \framed_fake_box \fi - \ifboxhasoffset - \dooffsetframebox + % + \d_framed_applied_offset + \ifconditional\c_framed_is_overlaid + \zeropoint + \else + \d_framed_linewidth + \fi + \ifconditional\c_framed_has_offset + \advance\d_framed_applied_offset\localoffset \fi - \ifboxisoverlaid \else - \dolocateframebox + \ifconditional\c_framed_has_extra_offset + \framed_apply_extra_offsets % includes \d_framed_applied_offset + \else + \ifzeropt\d_framed_applied_offset + \else + \framed_widen_box + \fi \fi + % \ifx\postprocessframebox\relax \else \let\next\postprocessframebox \let\postprocessframebox\relax % prevent nesting - \next\framebox + \next\b_framed_normal \fi \iftrialtypesetting % new \else - \ifboxhasframe % real or invisible frame - \dooutlinebox + \ifconditional\c_framed_has_frame % real or invisible frame + \framed_add_outline \fi - \ifx\framedbackground\empty \else - \dobackedbox + \ifx\p_framed_background\empty \else + \edef\p_framed_component{\framedparameter\c!component}% + \framed_add_background \fi \fi - \handleframedlocator\c!after\@@locallocation - \box\framebox + \framed_locator_after\p_framed_location + \box\b_framed_normal \global\frameddimensionstate % global so to be used directly afterwards ! - \ifboxhaswidth - \ifboxhasheight \plusthree \else \plusone \fi + \ifconditional\c_framed_has_width + \ifconditional\c_framed_has_height \plusthree \else \plusone \fi \else - \ifboxhasheight \plustwo \else \zerocount \fi + \ifconditional\c_framed_has_height \plustwo \else \zerocount \fi \fi \egroup \egroup} \newconstant\frameddimensionstate % global state: 0=unknown 1=width 2=height 3=both -\def\dosetfakedframebox +\def\framed_fake_box {\setbox\scratchbox\emptyhbox - \wd\scratchbox\wd\framebox - \ht\scratchbox\ht\framebox - \dp\scratchbox\dp\framebox - \setbox\framebox\box\scratchbox} - -% test: (saves one forgetall) -% -% \edef\framedbackground{\framedparameter\c!background}% -% \ifx\framedbackground\empty -% \let\framedforgetall\forgetall -% \else -% \let\framedforgetall\relax -% \forgetall -% \fi + \wd\scratchbox\wd\b_framed_normal + \ht\scratchbox\ht\b_framed_normal + \dp\scratchbox\dp\b_framed_normal + \setbox\b_framed_normal\box\scratchbox} \def\installframedlocator#1#2#3% - {\setvalue{\??oi:\c!location:\c!before:#1}{#2}% - \setvalue{\??oi:\c!location:\c!after :#1}{#3}} + {\setvalue{\??hf:b:#1}{#2}% + \setvalue{\??hf:a:#1}{#3}} + +\def\framed_locator_before#1% + {\csname\??hf:b:#1\endcsname} -\def\handleframedlocator#1#2% - {\csname\??oi:\c!location:#1:#2\endcsname} +\def\framed_locator_after#1% + {\csname\??hf:a:#1\endcsname} + +\newdimen\d_framed_locator_ht +\newdimen\d_framed_locator_dp \def\doprelocframedbox#1% - {\scratchdimen\dimexpr#1+\ruledlinewidth\relax - \ifboxhasoffset - \advance\scratchdimen \framedparameter\c!offset - \fi - \scratchskip\dimexpr\ht\framebox-\scratchdimen\relax} + {\d_framed_locator_ht\dimexpr + #1+\d_framed_linewidth + \ifconditional\c_framed_has_offset + +\framedparameter\c!offset + \fi + \relax + \d_framed_locator_dp\dimexpr\ht\b_framed_normal-\d_framed_locator_ht\relax} % \ruledhbox % {A @@ -1400,99 +1409,100 @@ \installframedlocator \v!hanging % best with strut=no {} - {\dp\framebox\ht\framebox - \ht\framebox\zeropoint} + {\dp\b_framed_normal\ht\b_framed_normal + \ht\b_framed_normal\zeropoint} \installframedlocator \v!depth {} - {\ht\framebox\dimexpr\ht\framebox-\strutdp\relax - \dp\framebox\strutdp - \box\framebox} + {\ht\b_framed_normal\dimexpr\ht\b_framed_normal-\strutdp\relax + \dp\b_framed_normal\strutdp + \box\b_framed_normal} \installframedlocator \v!height {} - {\dp\framebox\dimexpr\ht\framebox-\strutht\relax - \ht\framebox\strutht - \box\framebox} + {\dp\b_framed_normal\dimexpr\ht\b_framed_normal-\strutht\relax + \ht\b_framed_normal\strutht + \box\b_framed_normal} \installframedlocator \v!high {} {\doprelocframedbox\strutht - \setbox\framebox\hbox{\lower\scratchskip\box\framebox}% - \ht\framebox\strutht - \dp\framebox\strutdp - \hbox{\box\framebox}} + \setbox\b_framed_normal\hbox{\lower\d_framed_locator_dp\box\b_framed_normal}% + \ht\b_framed_normal\strutht + \dp\b_framed_normal\strutdp + \hbox{\box\b_framed_normal}} \installframedlocator \v!line {} - {\setbox\framebox\hbox{\lower.5\ht\framebox\box\framebox}% - \ht\framebox.5\lineheight - \dp\framebox.5\lineheight - \hbox{\box\framebox}} + {\setbox\b_framed_normal\hbox{\lower.5\ht\b_framed_normal\box\b_framed_normal}% + \ht\b_framed_normal.5\lineheight + \dp\b_framed_normal.5\lineheight + \hbox{\box\b_framed_normal}} \installframedlocator \v!low {} {\doprelocframedbox\strutdp - \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}% - \ht\framebox\strutht - \dp\framebox\strutdp - \box\framebox} + \setbox\b_framed_normal\hbox{\lower\d_framed_locator_ht\box\b_framed_normal}% + \ht\b_framed_normal\strutht + \dp\b_framed_normal\strutdp + \box\b_framed_normal} \installframedlocator \v!top {} {\doprelocframedbox\strutht - \setbox\framebox\hbox{\lower\scratchskip\box\framebox}% - \ht\framebox\scratchdimen - \dp\framebox\scratchskip - \hbox{\box\framebox}} + \setbox\b_framed_normal\hbox{\lower\d_framed_locator_dp\box\b_framed_normal}% + \ht\b_framed_normal\d_framed_locator_ht + \dp\b_framed_normal\d_framed_locator_dp + \hbox{\box\b_framed_normal}} \installframedlocator \v!middle {} - {\scratchdimen.5\ht\framebox - \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}% - \ht\framebox\scratchdimen - \dp\framebox\scratchdimen - \hbox{\box\framebox}} + {\scratchdimen.5\ht\b_framed_normal + \setbox\b_framed_normal\hbox{\lower\scratchdimen\box\b_framed_normal}% + \ht\b_framed_normal\d_framed_locator_ht + \dp\b_framed_normal\d_framed_locator_ht + \hbox{\box\b_framed_normal}} \installframedlocator \v!lohi - {\handleframedlocator\c!before\v!middle} - {\handleframedlocator\c!after \v!middle} + {\framed_locator_before\v!middle} + {\framed_locator_after \v!middle} \installframedlocator \v!bottom {} {\doprelocframedbox\strutdp - \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}% - \ht\framebox\scratchskip - \dp\framebox\scratchdimen - \hbox{\box\framebox}} + \setbox\b_framed_normal\hbox{\lower\d_framed_locator_ht\box\b_framed_normal}% + \ht\b_framed_normal\d_framed_locator_dp + \dp\b_framed_normal\d_framed_locator_ht + \hbox{\box\b_framed_normal}} \installframedlocator \v!keep % retains height/depth - {\removeframedboxdepth} - {\restoreframedboxdepth} + {\framed_remove_depth} + {\framed_restore_depth} % also used in fastlocalframed -\newdimen\originalframedwd -\newdimen\originalframedht -\newdimen\originalframeddp - -\def\removeframedboxdepth - {\originalframedwd\wd\framebox - \originalframedht\ht\framebox - \originalframeddp\dp\framebox - \ifzeropt\originalframeddp\else\setbox\framebox\hbox{\raise\originalframeddp\box\framebox}\fi - \wd\framebox\originalframedwd - \ht\framebox\dimexpr\originalframedht+\originalframeddp\relax - \dp\framebox\zeropoint} +\newdimen\d_framed_original_wd +\newdimen\d_framed_original_ht +\newdimen\d_framed_original_dp -\def\restoreframedboxdepth - {\ifzeropt\originalframeddp\else\setbox\framebox\hbox{\lower\originalframeddp\box\framebox}\fi - \wd\framebox\originalframedwd - \ht\framebox\originalframedht - \dp\framebox\originalframeddp} +\def\framed_remove_depth + {\d_framed_original_wd\wd\b_framed_normal + \d_framed_original_ht\ht\b_framed_normal + \d_framed_original_dp\dp\b_framed_normal + \ifzeropt\d_framed_original_dp\else + \setbox\b_framed_normal\hbox{\raise\d_framed_original_dp\box\b_framed_normal}% + \fi + \wd\b_framed_normal\d_framed_original_wd + \ht\b_framed_normal\dimexpr\d_framed_original_ht+\d_framed_original_dp\relax + \dp\b_framed_normal\zeropoint} -% \let\@@startframedorientation\relax -% \let\@@stopframedorientation \relax +\def\framed_restore_depth + {\ifzeropt\d_framed_original_dp \else + \setbox\b_framed_normal\hbox{\lower\d_framed_original_dp\box\b_framed_normal}% + \fi + \wd\b_framed_normal\d_framed_original_wd + \ht\b_framed_normal\d_framed_original_ht + \dp\b_framed_normal\d_framed_original_dp} % \framed[width=12cm,height=3cm,orientation=0]{\input ward\relax} % \framed[width=12cm,height=3cm,orientation=90]{\input ward\relax} @@ -1502,40 +1512,45 @@ % \framed[width=12cm,height=3cm,orientation=-180]{\input ward\relax} % \framed[width=12cm,height=3cm,orientation=-270]{\input ward\relax} -\def\@@startframedorientation - {\let\@@stopframedorientation \relax - \ifx\@@localorientation\empty\else - \ifcase\@@localorientation\else - \scratchcounter\@@localorientation - \divide\scratchcounter\plustwo - \ifodd\scratchcounter - \swapmacros\framedwidth \framedheight - \swapmacros\localwidth \localheight - \swapdimens\!!framedheight\!!framedwidth - \def\@@stopframedorientation{\@@dostopframedorientation\plusone}% - \else - \def\@@stopframedorientation{\@@dostopframedorientation\zerocount}% - \fi +\def\framed_start_orientation + {\ifcase\p_framed_orientation\else + \let\framed_stop_orientation\relax + \else + \scratchcounter\p_framed_orientation % weird .. why + \divide\scratchcounter\plustwo + \ifodd\scratchcounter + \swapmacros\framedwidth\framedheight + \swapmacros\localwidth\localheight + \swapdimens\d_framed_height\d_framed_width + \let\framed_stop_orientation\framed_stop_orientation_odd + \else + \let\framed_stop_orientation\framed_stop_orientation_even \fi \fi} -\def\@@dostopframedorientation#1% - {\ifcase#1\else - \swapmacros\framedwidth \framedheight - \swapmacros\localwidth \localheight - \swapdimens\!!framedheight\!!framedwidth - \fi - \setbox\framebox\hbox{\dorotatebox\@@localorientation\hbox{\box\framebox}}} +\def\framed_stop_orientation_odd + {\swapmacros\framedwidth\framedheight + \swapmacros\localwidth\localheight + \swapdimens\d_framed_height\d_framed_width + \framed_stop_orientation_even} + +\def\framed_stop_orientation_even + {\setbox\b_framed_normal\hbox{\dorotatebox\p_framed_orientation\hbox{\box\b_framed_normal}}} %D The last conditional takes care of the special situation of %D in||line \inframed[height=3cm]{framed} boxes. Such boxes have %D to be \inframed{aligned} with the running text. -\def\doinframed[#1]% we could omit #1] but readibility ... - {\framed[\c!location=\v!low,#1]} - \unexpanded\def\inframed - {\dosingleempty\doinframed} + {\dosingleempty\framed_inline} + +% \def\framed_inline[#1]% +% {\framed[\c!location=\v!low,#1]} +% +% or: + +\def\framed_inline[% + {\framed[\c!location=\v!low,} %D When we set \type{empty} to \type{yes}, we get %D ourselves a frame and/or background, but no content, so @@ -1581,26 +1596,27 @@ %D Still better is the next alternative, if only because it %D takes care of setting the super- and subscripts styles -\newcount\mframedstyle +\newcount\c_framed_mstyle + +\unexpanded\def\mframed {\dosingleempty\framed_math_display} +\unexpanded\def\inmframed{\dosingleempty\framed_math_inline } -\def\doinlinemframed[#1]#2% +\def\framed_math_inline[#1]#2% {\begingroup - \mframedstyle\mathstyle\relax - \inframed[#1]{\Ustartmath\triggermathstyle\mframedstyle#2\Ustopmath}% + \c_framed_mstyle\mathstyle + \inframed[#1]{\Ustartmath\triggermathstyle\c_framed_mstyle#2\Ustopmath}% \endgroup} -\def\funnymathstrut{\Ustartmath\triggermathstyle\mframedstyle\vphantom{(}\Ustopmath} +\unexpanded\def\funnymathstrut + {\Ustartmath\triggermathstyle\c_framed_mstyle\vphantom{(}\Ustopmath} -\def\dodisplaymframed[#1]#2% +\def\framed_math_display[#1]#2% {\begingroup - \mframedstyle\mathstyle\relax + \c_framed_mstyle\mathstyle \let\normalstrut\funnymathstrut - \framed[#1]{\Ustartmath\triggermathstyle\mframedstyle#2\Ustopmath}% + \framed[#1]{\Ustartmath\triggermathstyle\c_framed_mstyle#2\Ustopmath}% \endgroup} -\def\mframed {\dosingleempty\dodisplaymframed} -\def\inmframed{\dosingleempty\doinlinemframed } - %D So instead of the rather versatile \type {\framed}, we ue %D the \type {\mframed}. %D @@ -1645,12 +1661,44 @@ %D putting rules around boxes, inserting offsets and aligning %D text. Each step is handled by separate macros. -\def\dowidenframebox#1% - {\setbox\framebox\vbox - {\kern#1\hbox{\kern#1\box\framebox\kern#1}\kern#1}} +\newdimen\d_framed_applied_offset +\newdimen\d_framed_loffset +\newdimen\d_framed_roffset +\newdimen\d_framed_toffset +\newdimen\d_framed_boffset + +\def\framed_check_extra_offsets + {\setfalse\c_framed_has_extra_offset + \d_framed_loffset\framedparameter\c!loffset + \d_framed_roffset\framedparameter\c!roffset + \d_framed_toffset\framedparameter\c!toffset + \d_framed_boffset\framedparameter\c!boffset + \relax + \ifzeropt\d_framed_loffset\else \advance\d_framed_width -\d_framed_loffset \settrue\c_framed_has_extra_offset \fi + \ifzeropt\d_framed_roffset\else \advance\d_framed_width -\d_framed_roffset \settrue\c_framed_has_extra_offset \fi + \ifzeropt\d_framed_toffset\else \advance\d_framed_height-\d_framed_toffset \settrue\c_framed_has_extra_offset \fi + \ifzeropt\d_framed_boffset\else \advance\d_framed_height-\d_framed_boffset \settrue\c_framed_has_extra_offset \fi} + +\def\framed_apply_extra_offsets + {\setbox\b_framed_normal\vbox\bgroup + \advance\d_framed_toffset\d_framed_applied_offset + \advance\d_framed_boffset\d_framed_applied_offset + \advance\d_framed_loffset\d_framed_applied_offset + \advance\d_framed_roffset\d_framed_applied_offset + \kern\d_framed_toffset + \hbox\bgroup + \kern\d_framed_loffset + \box\b_framed_normal + \kern\d_framed_roffset + \egroup + \kern\d_framed_boffset + \egroup} -\def\dooffsetframebox{\dowidenframebox\localoffset} -\def\dolocateframebox{\dowidenframebox\ruledlinewidth} +\def\framed_widen_box + {\setbox\b_framed_normal\vbox + {\kern\d_framed_applied_offset + \hbox{\kern\d_framed_applied_offset\box\b_framed_normal\kern\d_framed_applied_offset}% + \kern\d_framed_applied_offset}} %D Let's hope that the next few examples show us enough of %D what needs to be done by the auxiliary macros. @@ -1736,9 +1784,6 @@ \expandafter\nodoformatonelinerbox \fi} -% \def\dodoformatonelinerbox % we could even have a special one -% {\dowithnextboxcontentcs\ignorespaces\dododoformatonelinerbox\hbox} - \def\dodoformatonelinerbox {\afterassignment\redoformatonelinerbox \setbox\nextbox\hbox} @@ -1759,45 +1804,60 @@ %D The handlers: -\def\framedforgetall{\forgetall} +\def\framed_forgetall{\forgetall} -\def\setframedforegroundcolor - {\edef\!!framedforegroundcolor{\framedparameter\c!foregroundcolor}% - \ifx\!!framedforegroundcolor\empty\else\dousecolorparameter\!!framedforegroundcolor\fi} +% test: (saves one forgetall) +% +% \edef\framedbackground{\framedparameter\c!background}% +% \ifx\framedbackground\empty +% \let\framed_forgetall\forgetall +% \else +% \let\framed_forgetall\relax +% \forgetall +% \fi + +\def\framed_set_foregroundcolor + {\edef\p_framed_foregroundcolor{\framedparameter\c!foregroundcolor}% + \ifx\p_framed_foregroundcolor\empty\else\dousecolorparameter\p_framed_foregroundcolor\fi} + +\def\framed_do_setups + {\ifx\p_framed_setups\empty \else + \setups[\p_framed_setups]% + \fi} -\def\doformatboxSomeFormat - {\vbox to \!!framedheight +\def\framed_format_format_yes + {\vbox to \d_framed_height \bgroup \let\postprocessframebox\relax - \framedforgetall + \framed_forgetall \iftrialtypesetting \else - \setframedforegroundcolor + \framed_set_foregroundcolor \fi \oninterlineskip - \hsize\!!framedwidth - \vsize\!!framedheight - \doframedsetups + \hsize\d_framed_width + \vsize\d_framed_height + \framed_do_setups \raggedcommand - \dobeforeframedbox + \framed_do_top \bgroup \localbegstrut \aftergroup\localendstrut - \aftergroup\doafterframedbox + \aftergroup\framed_do_bottom \aftergroup\egroup \doformatonelinerbox} -\def\doformatboxNoFormat - {\vbox to \!!framedheight +\def\framed_format_format_nop + {\vbox to \d_framed_height \bgroup \let\postprocessframebox\relax - \framedforgetall + \framed_forgetall \iftrialtypesetting \else - \setframedforegroundcolor + \framed_set_foregroundcolor \fi \oninterlineskip - \hsize\!!framedwidth - \vsize\!!framedheight - \doframedsetups + \hsize\d_framed_width + \vsize\d_framed_height + \framed_do_setups \raggedcenter \vss \bgroup @@ -1807,16 +1867,16 @@ \aftergroup\egroup \doformatonelinerbox} -\def\doformatboxHeight - {\vbox to \!!framedheight +\def\framed_format_format_height + {\vbox to \d_framed_height \bgroup \let\postprocessframebox\relax - \framedforgetall + \framed_forgetall \iftrialtypesetting \else - \setframedforegroundcolor + \framed_set_foregroundcolor \fi \oninterlineskip - \doframedsetups + \framed_do_setups \raggedcommand \vss \bgroup @@ -1826,36 +1886,36 @@ \localbegstrut \doformatonelinerbox} -\def\doformatboxWidth +\def\framed_format_format_width {\vbox \bgroup \let\postprocessframebox\relax - \framedforgetall + \framed_forgetall \iftrialtypesetting \else - \setframedforegroundcolor + \framed_set_foregroundcolor \fi \oninterlineskip - \hsize\!!framedwidth - \doframedsetups + \hsize\d_framed_width + \framed_do_setups \raggedcommand - \dobeforeframedbox + \framed_do_top \bgroup \localbegstrut \aftergroup\localendstrut - \aftergroup\doafterframedbox + \aftergroup\framed_do_bottom \aftergroup\egroup \doformatonelinerbox} -\def\doformatboxVSize - {\vbox to \!!framedheight +\def\framed_format_format_vsize + {\vbox to \d_framed_height \bgroup \let\postprocessframebox\relax - \framedforgetall + \framed_forgetall \iftrialtypesetting \else - \setframedforegroundcolor + \framed_set_foregroundcolor \fi - \vsize\!!framedheight - \doframedsetups + \vsize\d_framed_height + \framed_do_setups \vss \bgroup \aftergroup\vss @@ -1866,15 +1926,15 @@ \localstrut \doformatonelinerbox} -\def\doformatboxHSize - {\hbox to \!!framedwidth +\def\framed_format_format_hsize + {\hbox to \d_framed_width \bgroup \let\postprocessframebox\relax - \framedforgetall + \framed_forgetall \iftrialtypesetting \else - \setframedforegroundcolor + \framed_set_foregroundcolor \fi - \doframedsetups + \framed_do_setups \hss \localstrut \bgroup @@ -1882,19 +1942,17 @@ \aftergroup\egroup \doformatonelinerbox} -\def\doformatboxNoSize +\def\framed_format_format_no_size {\hbox \bgroup \iftrialtypesetting \else - \setframedforegroundcolor + \framed_set_foregroundcolor \fi \let\postprocessframebox\relax - \doframedsetups + \framed_do_setups \localstrut \doformatonelinerbox} -\let\doframedsetups\relax - %D On the next page we show some examples of how these macros %D come into action. The examples show us how %D \type {fit}, \type {broad} dimensions influence the @@ -1965,7 +2023,7 @@ \newdimen\framedmaxwidth \newdimen\framedaveragewidth -\def\resetshapeframebox +\def\framed_reshape_reset {\framednoflines \zerocount \framedfirstheight \zeropoint \framedlastdepth \zeropoint @@ -1973,12 +2031,8 @@ \framedmaxwidth \zeropoint \framedaveragewidth\zeropoint} -\let\framedboxwidth \!!zeropoint -\let\framedboxheight\!!zeropoint -\let\framedboxdepth \!!zeropoint - -\def\doreshapeframedbox{\ifvbox\framebox\ctxcommand{doreshapeframedbox(\number\framebox)}\fi} -\def\doanalyzeframedbox{\ifvbox\framebox\ctxcommand{doanalyzeframedbox(\number\framebox)}\fi} +\def\framed_reshape_process{\ifvbox\b_framed_normal\ctxcommand{doreshapeframedbox(\number\b_framed_normal)}\fi} +\def\framed_reshape_analyze{\ifvbox\b_framed_normal\ctxcommand{doanalyzeframedbox(\number\b_framed_normal)}\fi} % torture test / strange case (much depth) / method 2 needed % @@ -2048,41 +2102,6 @@ %D \egroup %D \stoppostponing -%D When typesetting the framed box inline, we have to keep the -%D baseline intact outside as well as inside the framed box. - -\def\doinlineframedbox - {\scratchdimen\dimexpr\strutdp+\ruledlinewidth\relax - \ifboxhasoffset - \advance\scratchdimen \framedparameter\c!offset - \fi - \setbox\framebox\hbox{\lower\scratchdimen\box\framebox}% - \ht\framebox\strutht - \dp\framebox\strutdp - \box\framebox} - -%D We can also lower the box over the natural depth of the -%D line. - -\def\doloweredframedbox - {\ht\framebox\dimexpr\ht\framebox+\dp\framebox-\strutdp\relax - \dp\framebox\strutdp - \box\framebox} - -%D Hanging the content is mainly meant for cases like the -%D following: -%D -%D \starttyping -%D \framed[strut=no] -%D {\framed[height=2cm,location=hanging]{test}% -%D \framed[height=1cm,location=hanging]{test}} -%D \stoptyping - -\def\dohangingframedbox % best with strut=no - {\scratchdimen\dimexpr\ht\framebox+\dp\framebox\relax - \ht\framebox\zeropoint - \dp\framebox\scratchdimen} - %D We can draw lines from left to right and top to bottom by %D using the normal \type{\hairline} command. Both directions %D need a different treatment. @@ -2103,32 +2122,29 @@ %D possible to the circumstances and act as natural as %D possible. -\def\vboxedhairline +\def\framed_vboxed_hairline {\bgroup - \dimen2=\ifboxhasoffset \localoffset \else \zeropoint \fi - \dimen4=\dimexpr\dimen2+\ruledlinewidth\relax + \dimen2=\ifconditional\c_framed_has_offset \localoffset \else \zeropoint \fi + \dimen4=\dimexpr\dimen2+\d_framed_linewidth\relax \setbox0\vbox {\advance\hsize 2\dimen4 \vskip\dimen2 \hrule - \!!height\ruledlinewidth + \!!height\d_framed_linewidth \!!depth\zeropoint \!!width\hsize \vskip\dimen2}% - %\endgraf\nointerlineskip\endgraf - %\moveleft\dimen4\box0 - %\endgraf\nointerlineskip\localbegstrut \endgraf\obeydepth\nointerlineskip \moveleft\dimen4\box0 \endgraf\nointerlineskip\localbegstrut % beware, we might kill it in a style using \vskip\lineheight \egroup} % so this must not be changed -\def\hboxedhairline % use framed dimen +\def\framed_hboxed_hairline % use framed dimen {\bgroup - \dimen2=\ifboxhasoffset \localoffset \else \zeropoint \fi - \ifboxhasheight - \dimen4\dimexpr\localheight/2+\strutdp-2\ruledlinewidth\relax - \dimen6\dimexpr\localheight/2-\strutdp+2\ruledlinewidth\relax + \dimen2=\ifconditional\c_framed_has_offset \localoffset \else \zeropoint \fi + \ifconditional\c_framed_has_height + \dimen4\dimexpr\localheight/2+\strutdp-2\d_framed_linewidth\relax + \dimen6\dimexpr\localheight/2-\strutdp+2\d_framed_linewidth\relax \else \dimen4\dimexpr\strutht+\dimen2\relax \dimen6\dimexpr\strutdp+\dimen2\relax @@ -2136,7 +2152,7 @@ \unskip \setbox\scratchbox\hbox {\hskip\dimen2 - \vrule\!!height\dimen4\!!depth\dimen6\!!width\ruledlinewidth + \vrule\!!height\dimen4\!!depth\dimen6\!!width\d_framed_linewidth \hskip\dimen2}% \ht\scratchbox\strutht \dp\scratchbox\strutdp @@ -2148,10 +2164,10 @@ %D sort of newline signal. In horizontal boxes it expands to a %D space. -\unexpanded\def\vboxednewline +\unexpanded\def\framed_vboxed_newline {\endgraf\ignorespaces} -\unexpanded\def\hboxednewline +\unexpanded\def\framed_hboxed_newline {\unskip\normalspace\ignorespaces} %D We can set each rule on or off. The default setting is @@ -2195,485 +2211,6 @@ %D \egroup %D \macros -%D {setupblackrules} -%D -%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} - -\unexpanded\def\setupblackrules - {\dodoubleargument\getparameters[\??bj]} - -%D \macros -%D {blackrule} -%D -%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} - -\definecomplexorsimple\blackrule - -\unexpanded\def\complexblackrule[#1]% - {\hbox\bgroup\getparameters[\??bj][#1]\domakeblackrule\egroup} - -\unexpanded\def\simpleblackrule - {\hbox\bgroup\domakeblackrule\egroup} - -\def\domakeblackrule - {\doif\@@bjwidth \v!max{\def\@@bjwidth {1em}}% - \doif\@@bjheight\v!max{\setstrut\let\setstrut\relax\def\@@bjheight{\strutht}}% - \doif\@@bjdepth \v!max{\setstrut\def\@@bjdepth {\strutdp}}% - \startcolor[\@@bjcolor]% can be made faster, just direct attr - \vrule - \!!width \@@bjwidth - \!!height\@@bjheight - \!!depth \@@bjdepth - \stopcolor} - -%D \macros -%D {blackrules} -%D -%D One can call for a sequence of black rules, if needed -%D equally spaced over the given width. -%D -%D \showsetup{blackrules} -%D -%D The two alternative calls are therefore: -%D -%D \startbuffer -%D Tell me, is this according to the \blackrules[n=6]? -%D These \blackrules[alternativevariant=b,n=10,distance=.2em,width=4cm] are quite clear. -%D \stopbuffer -%D -%D \typebuffer -%D -%D or: -%D -%D \startlines -%D \getbuffer -%D \stoplines -%D -%D We could of course have implemented this macro using -%D \type{\leaders}, but this would probably have taken more -%D tokens. - -\def\doblackrules[#1]% - {\hbox\bgroup - \getparameters[\??bj][#1]% - \!!widtha\@@bjwidth - \!!widthb\@@bjdistance - \doif\@@bjalternative\c!b - {\scratchcounter\@@bjn - \ifnum\scratchcounter=\plusone - \!!widthb\zeropoint - \else - \advance\scratchcounter \minusone - \advance\!!widtha -\scratchcounter\!!widthb - \divide \!!widtha \@@bjn - \fi}% - \startcolor[\@@bjcolor]% - \dorecurse\@@bjn - {\vrule - \!!width \!!widtha - \!!height\@@bjheight - \!!depth \@@bjdepth - \hskip\!!widthb}% - \unskip - \stopcolor - \egroup} - -\unexpanded\def\blackrules - {\dosingleempty\doblackrules} - -%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 -%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} - -\def\dovlwdhtdp#1#2#3% - {\bgroup - \setbox\scratchbox\hbox - {\vrule - \!!width #1\linewidth - \!!height#2\strutht - \!!depth #3\strutdp}% - \dp\scratchbox\strutdp - \ht\scratchbox\strutht - \box\scratchbox - \egroup} - -\def\complexvl[#1]% - {\dovlwdhtdp\plusone{#1}{#1}} - -\def\complexhl[#1]% - {\hbox - {\vrule - \!!width #1\s!em - \!!height\linewidth - \!!depth \zeropoint}} - -\definecomplexorsimple\vl \def\simplevl{\complexvl[1]} -\definecomplexorsimple\hl \def\simplehl{\complexhl[1]} - -%D \macros -%D {hairline, thinrule, thinrules, setupthinrules} -%D -%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 -%D -%D \hairline -%D -%D some more text -%D -%D \thinrule -%D -%D more and more text -%D -%D hi \thinrule\ there -%D -%D and then the final text -%D \stopbuffer -%D -%D \typebuffer -%D -%D becomes -%D -%D \startexample -%D \getbuffer -%D \stopexample -%D -%D So we've got -%D -%D \showsetup{hairline} -%D \showsetup{thinrule} -%D -%D Both can be set up with: -%D -%D \showsetup{setupthinrules} -%D -%D We also have -%D -%D \showsetup{thinrules} -%D -%D which looks like: \thinrules[n=2] - -\newconstant\ruletype - -\def\thinrule - {\strut - \bgroup - \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 - \ruletype\zerocount - \else - \doifnot\@@dlframe\v!on{\ruletype\zerocount}% - \fi - \ifnum\ruletype=\plusone - \doif\@@dlheight\v!max{\let\@@dlheight\!!plusone}% - \doif\@@dldepth \v!max{\let\@@dldepth \!!plusone}% - \else - \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} - -\def\hairline - {\endgraf - \thinrule - \endgraf} - -\def\dosetupthinrules[#1]% - {\getparameters[\??dl][#1]} - -\unexpanded\def\setupthinrules - {\dosingleargument\dosetupthinrules} - -\def\dothinrules[#1]% - {\bgroup - \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\@@dlinbetween\empty - \softbreak - \else - \endgraf - \nowhitespace - \@@dlinbetween - \fi - \fi}% - \doifelsenothing\@@dlafter - {\carryoverpar\egroup} - {\@@dlafter\egroup}} - -\def\thinrules - {\dosingleempty\dothinrules} - -%D A couple of examples are given below. -%D -%D \startbuffer -%D \setupthinrules[n=3,inbetween=,color=gray] -%D -%D test test \thinrules\ test test \par -%D test test \thinrules [color=green] test test \par -%D test test \thinrules [height=max, depth=max] test test \par -%D -%D \setupthinrules[height=.9,depth=.9] -%D -%D test test \thinrules\ test test \par -%D test test \thinrules [alternativevariant=b] test test \par -%D test test \thinrules [alternativevariant=c] test test \par -%D test test \thinrules [alternativevariant=c,inbetween=\vskip2ex] test test \par -%D \stopbuffer -%D -%D \typebuffer {\getbuffer} -%D -%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 -%D [n=2, -%D backgroundcolor=gray , -%D rulethickness=1pt, -%D colorkleur=donkerblauw, -%D after=\blank, -%D before=\blank] -%D \stopbuffer -%D -%D \typebuffer[a] -%D -%D \startbuffer[b] -%D \thinrules[alternativevariant=a] -%D \thinrules[alternativevariant=b] -%D \thinrules[alternativevariant=c] -%D \stopbuffer -%D -%D \typebuffer[b] \getbuffer[a,b] -%D -%D \startbuffer[b] -%D \thinrules[alternativevariant=a,background=color] -%D \thinrules[alternativevariant=b,background=color] -%D \thinrules[alternativevariant=c,background=color] -%D \stopbuffer -%D -%D \typebuffer[b] \getbuffer[a,b] -%D -%D \startbuffer[b] -%D \thinrules[alternativevariant=a,height=.8,depth=.8,background=color] -%D \thinrules[alternativevariant=b,height=.8,depth=.8,background=color] -%D \thinrules[alternativevariant=c,height=.8,depth=.8,background=color] -%D \stopbuffer -%D -%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 {startframedtext, setupframedtexts, defineframedtext} %D %D The general framing command we discussed previously, is not @@ -2795,54 +2332,56 @@ \c!margin=\v!standard] \appendtoks - \setuevalue{\e!start\currentframedtext}{\dostartframedtext{\currentframedtext}}% - \setuevalue{\e!stop \currentframedtext}{\dostopframedtext }% - \setuevalue {\currentframedtext}{\doframedtext {\currentframedtext}}% + \setuevalue{\e!start\currentframedtext}{\framed_text_start {\currentframedtext}}% + \setuevalue{\e!stop \currentframedtext}{\framed_text_stop }% + \setuevalue {\currentframedtext}{\framed_text_direct{\currentframedtext}}% \to \everydefineframedtext -\unexpanded\def\dostartframedtext#1% +\setvalue{\??kd:l:\v!left }{\letframedtextparameter\c!left \relax + \letframedtextparameter\c!right\hfill} + +\setvalue{\??kd:l:\v!right }{\letframedtextparameter\c!left \hfill + \letframedtextparameter\c!right\relax} + +\setvalue{\??kd:l:\v!middle}{\letframedtextparameter\c!left \hfill + \letframedtextparameter\c!right\hfill} + +\setvalue{\??kd:l:\v!none }{\letframedtextparameter\c!left \relax + \letframedtextparameter\c!right\relax + \settrue\c_framed_text_location_none} + +\unexpanded\def\framed_text_start#1% {\bgroup \edef\currentframedtext{#1}% - \dodoubleempty\dodostartframedtext} + \dodoubleempty\framed_text_start_indeed} -\def\dodostartframedtext[#1][#2]% +\def\framed_text_start_indeed[#1][#2]% {\doifassignmentelse{#1} - {\dododostartframedtext[][#1]} - {\dododostartframedtext[#1][#2]}} + {\framed_text_start_continue\empty{#1}} + {\framed_text_start_continue{#1}{#2}}} -\def\dododostartframedtext[#1][#2]% #2 only passed to framed, not to framedtext +\def\framed_text_start_continue#1#2% {\setupframedtexts[\currentframedtext][#2]% \doifsomething{#1}{\setframedtextparameter\c!location{#1}}% does not listen to #3 - \setfalse\framedtextlocationnone - % somewhat messy ... needs to be redone - \processaction % \v!low en \v!depth are already taken ! - [\framedtextparameter\c!location] - [ \v!left=>\letframedtextparameter\c!left \relax - \letframedtextparameter\c!right\hfill, - \v!right=>\letframedtextparameter\c!left \hfill - \letframedtextparameter\c!right\relax, - \v!middle=>\letframedtextparameter\c!left \hfill - \letframedtextparameter\c!right\hfill, - \v!none=>\letframedtextparameter\c!left \relax % new - \letframedtextparameter\c!right\relax % new - \settrue\framedtextlocationnone]% + \setfalse\c_framed_text_location_none + \csname\??kd:l:\framedtextparameter\c!location\endcsname \resetframedtextparameter\c!location % removed 06/2001 % \forgetparindent % added 06/2001 [see demo-bbv] - \localhsize\hsize \checkframedtext + \framed_text_check % so far - \setbox\framebox\vbox + \setbox\b_framed_normal\vbox \startboxedcontent \hsize\localhsize % \insidefloattrue % ? better - \normalexpanded{\noexpand\switchtobodyfont[\framedtextparameter\c!bodyfont]}% + \normalexpanded{\switchtobodyfont[\framedtextparameter\c!bodyfont]}% \startcolor[\framedtextparameter\c!color]% \letframedtextparameter\c!strut\v!no \inheritedframedtextframed\bgroup \let\\=\endgraf \framedtextparameter\c!inner % oud spul - \doif{\framedtextparameter\c!depthcorrection}\v!on\doftstartdepthcorrection + \doif{\framedtextparameter\c!depthcorrection}\v!on\framed_text_start_depth_correction \doinhibitblank % \blank[\v!disable]% plaatst signal \setupindenting[\framedtextparameter\c!indenting]% \useframedtextstyleandcolor\c!style\c!color} @@ -2853,42 +2392,37 @@ \defineplacement[\??kd][\s!parent=\??kd\currentframedtext] -\unexpanded\def\dostopframedtext % no \baselinecorrection, see faq docs +\unexpanded\def\framed_text_stop % no \baselinecorrection, see faq docs {\endgraf \removelastskip - \doif{\framedtextparameter\c!depthcorrection}\v!on\doftstopdepthcorrection + \doif{\framedtextparameter\c!depthcorrection}\v!on\framed_text_stop_depth_correction \stopboxedcontent \stopcolor - \ifconditional\framedtextlocationnone + \ifconditional\c_framed_text_location_none \egroup - \box\framebox + \box\b_framed_normal \else\ifinsidefloat \egroup - \box\framebox + \box\b_framed_normal \else \egroup - \placement[\??kd][\c!depthcorrection=\v!off]{\box\framebox}% + \placement[\??kd][\c!depthcorrection=\v!off]{\box\b_framed_normal}% \fi\fi \egroup} %D We define the general (and original) case by just saying: -\setfalse\framedtextlocationnone - -\def\checkframedtext % messy dependency - {\ifinsidefloat - \localhsize\hsize - \else\ifdim\d_page_sides_vsize>\zeropoint % also possible: \c_page_sides_checks_done>\zeropoint +\def\framed_text_check % messy dependency + {\localhsize\hsize + \ifinsidefloat \else \ifdim\d_page_sides_vsize>\zeropoint % also possible: \c_page_sides_checks_done>\zeropoint % \strut % rather clean way to invoke the sidefloat OTR % \setbox0=\lastbox % and get the widths set, so from now on we % \setlocalhsize % can have framed texts alongside sidefloats \checksidefloat \setlocalhsize - \else - \localhsize\hsize - \fi\fi} + \fi \fi} -\def\doftstartdepthcorrection +\def\framed_text_start_depth_correction {\bgroup \ifhmode \par @@ -2901,7 +2435,7 @@ \nowhitespace \fi} % na vskip ! new 20/05/2004, fails with next content being box (\scale{..}) -\def\doftstopdepthcorrection +\def\framed_text_stop_depth_correction {\ifhmode \par \fi @@ -2938,13 +2472,13 @@ %D The simple brace (or group) delimited case is typeset %D slightly different and is not aligned. -\unexpanded\def\doframedtext#1% +\unexpanded\def\framed_text_direct#1% {\bgroup \edef\currentframedtext{#1}% - \dosingleempty\dodoframedtext} + \dosingleempty\framed_text_start_direct} -\def\dodoframedtext[#1]% beware! - {\normalexpanded{\noexpand\switchtobodyfont[\framedtextparameter\c!bodyfont]}% +\def\framed_text_start_direct[#1]% + {\normalexpanded{\switchtobodyfont[\framedtextparameter\c!bodyfont]}% \letframedtextparameter\c!strut\v!no \iffirstargument \setupcurrentframedtext[#1]% @@ -2955,12 +2489,11 @@ \framedtextparameter\c!inner \useframedtextstyleandcolor\c!style\c!color \bgroup - \aftergroup\docloseframedtext + \aftergroup\framed_text_stop_direct \let\next=} -\def\docloseframedtext +\def\framed_text_stop_direct {\removelastskip - \dostopattributes \egroup \egroup} @@ -2978,22 +2511,12 @@ %D also simplified the \type {\setupframed} command. There are %D certainly more places where such improvements can be made. -% \def\defineframed -% {\dodoubleempty\dodefineframed} -% -% \def\dodefineframed[#1][#2]% -% {\ifcsname\??ol:#1\endcsname -% % already defined, keeps settings -% \else -% \expandafter\newcount\csname\??ol:#1\endcsname % \the\everypresetframed -% \fi -% \getparameters[\??ol#1][\s!parent=\??ol,#2]% -% \setuvalue{#1}{\doframed[#1]}}% % \the\everydefineframed - -\def\defineframed % also inheritance now - {\dotripleempty\dodefineframed} - -\def\dodefineframed[#1][#2][#3]% +% actually, this can be another command handler .. todo + +\def\defineframed + {\dotripleempty\framed_define} + +\def\framed_define[#1][#2][#3]% {\ifcsname\??ol:#1\endcsname % already defined, keeps settings \else @@ -3010,20 +2533,20 @@ \else \getparameters[\??ol#1][\s!parent=\??ol,#2]% \fi - \setuvalue{#1}{\doframed[#1]}}% % \the\everydefineframed + \setuvalue{#1}{\framed_defined_process[#1]}}% % \the\everydefineframed -\newcount\crapframedcount +\newcount\c_framed_crap -\def\doframed[#1]% official (not much checking, todo: parent) +\def\framed_defined_process[#1]% official (not much checking, todo: parent) {\bgroup \ifcsname\??ol:#1\endcsname - \expandafter\let\expandafter\tempframedcount\csname\??ol:#1\endcsname + \expandafter\let\expandafter\c_framed_temp\csname\??ol:#1\endcsname \else - \let\tempframedcount\crapframedcount + \let\c_framed_temp\c_framed_crap \fi - \advance\tempframedcount\plusone - \expandafter\def\csname\??ol#1:\the\tempframedcount\s!parent\endcsname{\??ol#1}% \inheritlocalframed - \dodoubleempty\dolocalframed[\??ol#1:\the\tempframedcount]} + \advance\c_framed_temp\plusone + \expandafter\def\csname\??ol#1:\the\c_framed_temp\s!parent\endcsname{\??ol#1}% \inheritlocalframed + \dodoubleempty\framed_process[\??ol#1:\the\c_framed_temp]} %D We can do: %D @@ -3033,305 +2556,6 @@ %D %D but the existing one is ok as well (less csname messy too). -%D \macros -%D {textrule, starttextrule, setuptextrules} -%D -%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} -%D \input reich -%D \textrule -%D \stopbuffer -%D -%D \start \typebuffer \getbuffer \stop -%D -%D \startbuffer -%D \setuptextrules -%D [width=90pt,distance=12pt,rulecolor=blue, -%D bodyfont=small,style=\sc,color=red] -%D -%D \starttextrule{Ship Building Tools} -%D \nl \setuptolerance[tolerant] \input materie -%D \stoptextrule -%D \stopbuffer -%D -%D \bgroup \typebuffer \getbuffer \egroup -%D -%D \startbuffer -%D \setuptextrules -%D [location=inmargin, -%D bodyfont=small,style=slantedbold] -%D -%D \starttextrule{wonderful} -%D \input tufte -%D \stoptextrule -%D \stopbuffer -%D -%D \bgroup \typebuffer \getbuffer \egroup -%D -%D The formal definition of these commands is: -%D -%D \showsetup{textrule} -%D \showsetup{starttextrule} -%D \showsetup{setuptextrules} -%D -%D The implementation looks a bit complicated due to the -%D optional arguments. - -\unexpanded\def\setuptextrules - {\dodoubleargument\getparameters[\??tl]} - -\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} - -\definecomplexorsimple\textrule - -\def\simpletextrule - {\dosinglegroupempty\dounknowntextrule} - -\def\docomplextextrule#1% - {\bgroup - \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\@@tllocation\v!inmargin - {\llap - {\dousestyleparameter\@tlstyle - \dousecolorparameter\@tlcolor - #1% - \hskip\leftmargindistance}} - {\color[\@@tlrulecolor] - {\vrule\!!height\dimen4\!!depth\dimen6\!!width\@@tlwidth}% - \hbox spread 2\dimexpr\@@tldistance\relax - {\hss - \dousestyleparameter\@tlstyle - \dousecolorparameter\@tlcolor - \strut#1% - \hss}}}% - \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\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 - \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 - \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\dounknowntextrule{\domiddletextrule} - \dotoptextrule{#1} - \bgroup - \doifsomething\@@tlbodyfont{\switchtobodyfont[\@@tlbodyfont]}} - -\unexpanded\def\stoptextrule - {\par - \egroup - \dobottomtextrule\empty - \egroup} - -%D \macros -%D {fillinrules, setupfillinrules} -%D -%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} -%D \fillinrules[n=2,width=3cm]{first} -%D \fillinrules[n=2,width=3cm,distance=.5em,separator=:]{first} -%D \fillinrules[n=2]{first}{last} -%D \fillintext{first}{last} \input reich \par -%D -%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]} - -\definecomplexorsimpleempty\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} - -\def\dodocomplexfillinrules[#1]#2#3#4% - {\endgraf - \@@ilbefore - \begingroup - \setupfillinrules[#1]% - \noindent - \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 - #4% - \doifsomething{#3} - {\kern\@@ildistance - \dousestyleparameter\@@ilstyle - \dousecolorparameter\@@ilcolor - #3\strut}% - \endgroup - \endgraf - \@@ilafter} - -%D \macros -%D {fillintext} -%D -%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} - -\definecomplexorsimpleempty\fillintext - -\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 -%D small) rule after a piece of text, like -%D -%D \startbuffer -%D \fillinline \input reich \par -%D \fillinline[margin=0cm] \input reich \par -%D \stopbuffer -%D -%D \startexample -%D \getbuffer -%D \stopexample -%D -%D which was typeset by saying: -%D -%D \typebuffer -%D -%D The two commands that take care of this are: -%D -%D \showsetup{fillinline} -%D \showsetup{setupfillinlines} - -\unexpanded\def\setupfillinlines - {\dodoubleargument\getparameters[\??iv]} - -\definecomplexorsimpleempty\fillinline - -\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 New, for the moment private; let's see when GB finds out %D about this one and its obscure usage. It's used in: %D @@ -3367,9 +2591,12 @@ %D %D \typebuffer -\def\framedcontentparameter #1{\csname\doframedcontentparameter{\??fc\@@framedcontent}#1\endcsname} +% to be redone + +\def\framedcontentparameter #1{\csname\doframedcontentparameter{\??fc\currentframedcontent}#1\endcsname} \def\doframedcontentparameter #1#2{\ifcsname#1#2\endcsname#1#2\else\expandafter\doframedcontentparentparameter\csname#1\s!parent\endcsname#2\fi} \def\doframedcontentparentparameter#1#2{\ifx#1\relax\s!empty\else\doframedcontentparameter#1#2\fi} +\def\letframedcontentparameter #1{\expandafter\let\csname\??fc\currentframedcontent#1\endcsname} \presetlocalframed[\??fc] @@ -3386,9 +2613,6 @@ %\c!width=\v!fit, \c!offset=\v!overlay] -\def\letframedcontentparameter#1% - {\letvalue{\??fc\@@framedcontent#1}} - \unexpanded\def\defineframedcontent {\dodoubleempty\dodefineframedcontent} @@ -3403,17 +2627,20 @@ \processcommacommand[#1]\docommand} \unexpanded\def\startframedcontent - {\dosingleempty\dostartframedcontent} + {\dosingleempty\framed_start_content} -\def\dostartframedcontent[#1]% +\def\framed_start_content[#1]% {\bgroup - \edef\@@framedcontent{#1}% - \let\stopframedcontent\egroup - \doifnot{#1}\v!off{\dodostartframedcontent{#1}}} + \edef\currentframedcontent{#1}% + \ifx\currentframedcontent\v!off + \let\stopframedcontent\egroup + \else + \let\stopframedcontent\framed_stop_content_indeed + \expandafter\framed_start_content_indeed + \fi} -\def\dodostartframedcontent#1% - {\unexpanded\def\stopframedcontent{\dostopframedcontent{#1}}% - \setbox\framebox\hbox\bgroup +\def\framed_start_content_indeed + {\setbox\b_framed_normal\hbox\bgroup \setlocalhsize \hsize\localhsize \advance\hsize\dimexpr-\framedcontentparameter\c!leftoffset-\framedcontentparameter\c!rightoffset \relax @@ -3425,7 +2652,7 @@ \forgetall \blank[\v!disable]} -\def\dostopframedcontent#1% +\def\framed_stop_content_indeed {\removelastskip \egroup \vskip\framedcontentparameter\c!bottomoffset @@ -3442,7 +2669,7 @@ % plaats ? \ifdone\startlinecorrection\fi \framedcontentparameter\c!left % new - \localframed[\??fc#1]{\box\framebox}% + \localframed[\??fc\currentframedcontent]{\box\b_framed_normal}% hm \framedcontentparameter\c!right % new \ifdone\stoplinecorrection\fi \egroup} @@ -3458,146 +2685,50 @@ \setupframed [\c!width=\v!fit, \c!height=\v!broad, - \c!lines=, + %\c!lines=, \c!offset=0.25ex, % \defaultframeoffset \c!empty=\v!no, \c!frame=\v!on, - \c!topframe=, - \c!bottomframe=, - \c!leftframe=, - \c!rightframe=, + %\c!topframe=, + %\c!bottomframe=, + %\c!leftframe=, + %\c!rightframe=, \c!radius=.5\bodyfontsize, \c!rulethickness=\linewidth, \c!corner=\v!rectangular, \c!depth=\zeropoint, - \c!foregroundcolor=, - \c!foregroundstyle=, - \c!background=, + %\c!foregroundcolor=, + %\c!foregroundstyle=, + %\c!background=, \c!backgroundscreen=\@@rsscreen, - \c!backgroundcolor=, + %\c!backgroundcolor=, \c!backgroundoffset=\zeropoint, - \c!framecolor=, + %\c!framecolor=, \c!frameoffset=\zeropoint, + % somewhat messy \c!backgroundcorner=\framedparameter\c!corner, \c!backgroundradius=\framedparameter\c!radius, \c!backgrounddepth=\framedparameter\c!depth, \c!framecorner=\framedparameter\c!corner, \c!frameradius=\framedparameter\c!radius, \c!framedepth=\framedparameter\c!depth, - \c!component=, - \c!align=, + % + %\c!component=, + %\c!align=, \c!bottom=\vss, - \c!top=, + %\c!top=, \c!autostrut=\v!yes, \c!location=\v!normal, - \c!orientation=, + %\c!orientation=, \c!autowidth=\v!yes, - \c!setups=, - \c!strut=\v!yes] - -\setupscreens - [%\c!factor=1.0, % obsolete - %\c!method=\v!external, % obsolete - \c!screen=0.95] - -\setupblackrules - [\c!n=3, - \c!width=1em, - \c!height=1ex, - \c!depth=\!!zeropoint, - \c!alternative=\c!a, - \c!distance=.25ex, - \c!color=] - -\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!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!inbetween=, - \c!width=2em, - \c!style=\v!bold, - \c!color=, - \c!rulecolor=, - \c!bodyfont=, - \c!distance=.5em] - -\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=] - -\setupfillinlines - [\c!width=3cm, - \c!margin=\@@ivwidth, - \c!distance=1em, - \c!before=\blank, - \c!after=\blank] - -% Experimental extension: - -\def\c!loffset{loffset} -\def\c!roffset{roffset} -\def\c!toffset{toffset} -\def\c!boffset{boffset} - -\getparameters - [\??oi] - [\c!loffset=\zeropoint, + %\c!setups=, + \c!strut=\v!yes, + \c!loffset=\zeropoint, \c!roffset=\zeropoint, \c!toffset=\zeropoint, \c!boffset=\zeropoint] -\newdimen\!!framedloffset -\newdimen\!!framedroffset -\newdimen\!!framedtoffset -\newdimen\!!framedboffset - -\def\setextraframedoffsets - {\boxhasextraoffsetfalse - \!!framedloffset\framedparameter\c!loffset - \!!framedroffset\framedparameter\c!roffset - \!!framedtoffset\framedparameter\c!toffset - \!!framedboffset\framedparameter\c!boffset - \relax - \ifzeropt\!!framedloffset\else \advance\!!framedwidth -\!!framedloffset \boxhasextraoffsettrue \fi - \ifzeropt\!!framedroffset\else \advance\!!framedwidth -\!!framedroffset \boxhasextraoffsettrue \fi - \ifzeropt\!!framedtoffset\else \advance\!!framedheight-\!!framedtoffset \boxhasextraoffsettrue \fi - \ifzeropt\!!framedboffset\else \advance\!!framedheight-\!!framedboffset \boxhasextraoffsettrue \fi} - -\def\applyextraframedoffsets - {\setbox\framebox\vbox\bgroup - \vskip\!!framedtoffset - \hbox\bgroup - \hskip\!!framedloffset - \box\framebox - \hskip\!!framedroffset - \egroup - \vskip\!!framedboffset - \egroup} +\setupscreens + [\c!screen=0.95] \protect \endinput |