summaryrefslogtreecommitdiff
path: root/tex/context/base/pack-rul.mkiv
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/pack-rul.mkiv')
-rw-r--r--tex/context/base/pack-rul.mkiv1021
1 files changed, 538 insertions, 483 deletions
diff --git a/tex/context/base/pack-rul.mkiv b/tex/context/base/pack-rul.mkiv
index 9eb44b747..480997919 100644
--- a/tex/context/base/pack-rul.mkiv
+++ b/tex/context/base/pack-rul.mkiv
@@ -13,27 +13,31 @@
\writestatus{loading}{ConTeXt Packaging Macros / Ruled Content}
-%D The code here is expanded lots of time as framed is used in many places. This is
-%D why the code here is (and gets) optimized as much as possible. Also, by avoiding
-%D packaging and expansion we also keep tracing reasonable. For instance, multiple
-%D stacked backgrounds can slow down a run if not optimized this way.
+%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.
+
+% eventually this will use the commandhandler code (same trick as
+% with itemize)
\registerctxluafile{pack-rul}{1.001}
\unprotect
-\definesystemvariable {ol} % OmLijnd -> check scrn-fld too
-
%D \macros
%D {linewidth, setuplinewidth}
%D
-%D This module deals with rules (lines) in several ways. First we introduce two
-%D macros that can be used to set some common characteristics.
+%D This module deals with rules (lines) in several ways. First
+%D we introduce two macros that can be used to set some common
+%D characteristics.
%D
%D \showsetup{setuplinewidth}
%D
-%D The linewidth is available in \type{\linewidth}. The preset value of .4pt equals
-%D the default hard coded \TEX\ rule width.
+%D The linewidth is available in \type{\linewidth}. The
+%D preset value of .4pt equals the default hard coded \TEX\
+%D rule width.
\newdimen\linewidth
@@ -50,16 +54,8 @@
%D
%D \showsetup{setupscreens}
-\installcorenamespace{screens}
-
-\installsetuponlycommandhandler \??screens {screens}
-
-\appendtoks
- \edef\defaultbackgroundscreen{\directscreensparameter\c!screen}
-\to \everysetupscreens
-
-\setupscreens
- [\c!screen=.90] % was .95 but that's hardly visible
+\unexpanded\def\setupscreens
+ {\dodoubleargument\getparameters[\??rs]}
%D The parameter handler:
@@ -69,26 +65,41 @@
\installcorenamespace{framedleft}
\installcorenamespace{framedright}
-\installcorenamespace{regularframed}
-\installcorenamespace{simplifiedframed}
+\let\currentframed\s!unknown % brrr must have a value
+
+% \def\framedparameter #1{\csname\doframedparameter\currentframed{#1}\endcsname}
+% \def\framedparameterhash#1{\doframedparameterhash \currentframed#1}
+
+\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}
-\installcommandhandler \??framed {framed} \??framed
+\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}
-\let\pack_framed_framedparameter \framedparameter
-\let\pack_framed_framedparameterhash\framedparameterhash
-\let\pack_framed_setupcurrentframed \setupcurrentframed
+\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\pack_framed_initialize
- {\let\framedparameter \pack_framed_framedparameter
- \let\framedparameterhash\pack_framed_framedparameterhash
- \let\setupcurrentframed \pack_framed_setupcurrentframed
- \inframedtrue}
+\def\doframedparentparameter#1#2{\ifx#1\relax\doframedrootparameter#2\else\doframedparameter#1{#2}\fi}
+\def\doframedrootparameter #1{\ifcsname\??framed#1\endcsname\??framed#1\else\s!empty\fi}
-%D A helper:
+\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}
-%D Inheritance:
+% \unexpanded\def\installsomebackground#1#2{\inheritlocalframed[\??ma#1#2][\??od]}
+
+\let\normalframedparameter \framedparameter
+\let\normalframedparameterhash\framedparameterhash
+
+\def\pack_framed_initialize#1% will be inlined
+ {\inframedtrue
+ \edef\currentframed{#1}%
+ \let\framedparameter \normalframedparameter
+ \let\framedparameterhash\normalframedparameterhash}
\def\installinheritedframed#1%
{\normalexpanded{\doinstallinheritedframed
@@ -98,21 +109,19 @@
\expandafter\noexpand\csname do#1parameter\endcsname
\expandafter\noexpand\csname do#1parentparameter\endcsname
\expandafter\noexpand\csname do#1rootparameter\endcsname
- \expandafter\noexpand\csname setupcurrent#1\endcsname
\expandafter\noexpand\csname inherited#1framed\endcsname
\noexpand\??framed}} % if needed we can have a variant
-\unexpanded\def\doinstallinheritedframed#1#2#3#4#5#6#7#8#9%
- {\def#5##1##2{\ifx##1\relax#6{##2}\else#4{##1}{##2}\fi}%
- \def#6##1{\ifcsname#9:##1\endcsname#9:##1\else\s!empty\fi}% root
- \unexpanded\def#8%
+\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%
+ \let\currentframed #1% not used (more for tracing)
\let\framedparameter #2%
\let\framedparameterhash#3%
- \let\setupcurrentframed #7%
\pack_framed_process_indeed}}
\unexpanded\def\installframedcommandhandler#1#2#3%
@@ -129,11 +138,12 @@
% for regular framed
-\setupframed
+\getparameters
+ [\??framed]
[\c!width=\v!fit,
\c!height=\v!broad,
%\c!lines=,
- \c!offset=.25ex, % \defaultframeoffset
+ \c!offset=0.25ex, % \defaultframeoffset
\c!empty=\v!no,
\c!frame=\v!on,
%\c!topframe=,
@@ -148,12 +158,11 @@
%\c!foregroundstyle=,
%\c!background=,
%\c!backgroundscreen=,
- \c!backgroundscreen=\defaultbackgroundscreen,
%\c!backgroundcolor=,
\c!backgroundoffset=\zeropoint,
%\c!framecolor=,
\c!frameoffset=\zeropoint,
- \c!backgroundcorner=\framedparameter\c!corner, % use \p_ here
+ \c!backgroundcorner=\framedparameter\c!corner,
\c!backgroundradius=\framedparameter\c!radius,
\c!backgrounddepth=\framedparameter\c!depth,
\c!framecorner=\framedparameter\c!corner,
@@ -175,21 +184,21 @@
\c!toffset=\zeropoint,
\c!boffset=\zeropoint]
-%D For backgrounds and such:
+% for backgrounds
-\defineframed
- [\??simplifiedframed]
+\getparameters
+ [\??od] % for fast version
[\c!frame=\v!off,
\c!depth=\zeropoint,
\c!offset=\v!overlay,
- \c!component=,
- \c!region=,
+ %\c!component=,
+ %\c!region=,
\c!radius=.5\bodyfontsize,
\c!rulethickness=\linewidth,
\c!corner=\v!rectangular,
\c!backgroundoffset=\zeropoint,
\c!frameoffset=\zeropoint,
- \c!backgroundcorner=\framedparameter\c!corner, % use \p_ here
+ \c!backgroundcorner=\framedparameter\c!corner,
\c!backgroundradius=\framedparameter\c!radius,
\c!backgrounddepth=\framedparameter\c!depth,
\c!framecorner=\framedparameter\c!corner,
@@ -201,19 +210,13 @@
\c!toffset=\zeropoint,
\c!boffset=\zeropoint]
-\unexpanded\def\definesimplifiedframed[#1]% no settings
- {\defineframed[#1][\??simplifiedframed]%
- \expandafter\let\csname#1\endcsname\undefined}
-
-\expandafter\let\csname\??simplifiedframed\endcsname\undefined
-
-%D We will communicate through module specific variables, current framed
-%D parameters and some reserved dimension registers.
+%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\ruledlinewidth\d_framed_linewidth % needed at lua end
+\newdimen\d_framed_linewidth
\let\p_framed_frame \empty % \framedparameter\c!frame
\let\p_framed_backgroundoffset\empty
@@ -252,9 +255,9 @@
\def\pack_framed_filled_box_normal
{\vrule
- \s!width \d_framed_target_wd
- \s!height\d_framed_target_ht
- \s!depth \d_framed_target_dp
+ \!!width \d_framed_target_wd
+ \!!height\d_framed_target_ht
+ \!!depth \d_framed_target_dp
\relax}
\def\pack_framed_filled_box_radius
@@ -266,10 +269,16 @@
\fi}
\def\pack_framed_filled_box_round
- {\back_ovalbox
- \d_framed_target_wd \d_framed_target_ht \d_framed_target_dp
- \d_framed_linewidth \p_framed_backgroundradius
- \zerocount \plusone {\ifx\p_framed_backgroundcorner\v!round0\else\number\p_framed_backgroundcorner\fi}}
+ {\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\pack_framed_stroked_box
{\edef\p_framed_framecorner{\framedparameter\c!framecorner}%
@@ -283,17 +292,25 @@
{\edef\p_framed_frameradius{\framedparameter\c!frameradius}%
\ifzeropt\dimexpr\p_framed_frameradius\relax % just in case of .x\bodyfontsize
\pack_framed_stroked_box_normal
- \else\ifx\p_framed_frame\v!on
- \pack_framed_stroked_box_round
- \fi\fi}
+ \else
+ \ifx\p_framed_frame\v!on
+ \pack_framed_stroked_box_round
+ \fi
+ \fi}
% \pack_framed_stroked_box_normal % later
\def\pack_framed_stroked_box_round
- {\back_ovalbox
- \d_framed_target_wd \d_framed_target_ht \d_framed_target_dp
- \d_framed_linewidth \p_framed_frameradius
- \plusone \zerocount {\ifx\p_framed_framecorner\v!round0\else\number\p_framed_framecorner\fi}}
+ {\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
%
@@ -353,8 +370,8 @@
\def\pack_framed_background_box_gray_indeed % can be more direct but who cares, just compatibility
{\colored[s=\p_framed_backgroundscreen]{\pack_framed_filled_box}}
-%D It won't be a surprise that we not only provide gray boxes, but also colored
-%D ones. Here it is:
+%D It won't be a surprise that we not only provide gray boxes,
+%D but also colored ones. Here it is:
\def\pack_framed_background_box_color
{\edef\p_framed_backgroundcolor{\framedparameter\c!backgroundcolor}%
@@ -370,9 +387,10 @@
%D overlaywidth, overlayheight, overlaydepth,
%D overlaycolor, overlaylinecolor, overlaylinewidth}
%D
-%D Before we define the macro that actually takes card of the backgrounds, we
-%D introduce overlays. An overlay is something that contrary to its name lays {\em
-%D under} the text. An example of an overlay definition is:
+%D Before we define the macro that actually takes card of the
+%D backgrounds, we introduce overlays. An overlay is something
+%D that contrary to its name lays {\em under} the text. An
+%D example of an overlay definition is:
%D
%D \startbuffer[tmp-1]
%D \defineoverlay
@@ -402,16 +420,17 @@
%D
%D \showsetup{defineoverlay}
%D
-%D This macro's definition is a bit obscure, due the many non||used arguments and
-%D the two step call that enable the setting of the width, height and depth
-%D variables. Multiple backgrounds are possible and are specified as:
+%D This macro's definition is a bit obscure, due the many
+%D non||used arguments and the two step call that enable the
+%D setting of the width, height and depth variables.
+%D Multiple backgrounds are possible and are specified as:
%D
%D \starttyping
%D \framed[background={one,two,three}]{Three backgrounds!}
%D \stoptyping
%D
-%D Most drawing packages only know width and height. Therefore the dimensions have a
-%D slightly different meaning here:
+%D Most drawing packages only know width and height. Therefore
+%D the dimensions have a slightly different meaning here:
%D
%D \startitemize[packed]
%D \item \type{\overlaywidth }: width of the overlay
@@ -433,8 +452,9 @@
\newtoks\everyoverlay
-%D An example of an initialization is the following (overlays can contain text
-%D and be executed under an regime where interlineskip is off).
+%D An example of an initialization is the following (overlays
+%D can contain text and be executed under an regime where
+%D interlineskip is off).
\installcorenamespace{overlay}
\installcorenamespace{overlaybuiltin}
@@ -495,8 +515,8 @@
\expandafter\secondoftwoarguments
\fi}
-%D The content of the box will be (temporary) saved in a box. We also have an
-%D extra box for backgrounds.
+%D The content of the box will be (temporary) saved in a box. We
+%D also have an extra box for backgrounds.
\newbox\b_framed_normal
\newbox\b_framed_extra
@@ -552,8 +572,8 @@
\expandafter\pack_framed_process_backgrounds
\fi#2}
-%D Beware, a backgroundbox can be empty which is another reason why we set the
-%D width to zero instead of back-skipping.
+% 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
@@ -592,7 +612,8 @@
\egroup}}
\def\pack_framed_overlay_initialize_indeed
- {\edef\overlaywidth {\the\d_framed_target_wd\space}%
+ {%\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 ?
@@ -603,8 +624,8 @@
\edef\overlayoffset {\the\framedbackgroundoffset\space}% \backgroundoffset % we steal this one
\let\pack_framed_overlay_initialize\relax}
-%D One can explictly insert the foreground box. For that purpose we introduce the
-%D overlay \type {foreground}.
+%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:
@@ -612,13 +633,14 @@
\letvalue{\??overlaybuiltin\v!color }\pack_framed_background_box_color
\letvalue{\??overlaybuiltin\v!foreground}\pack_framed_background_box_content % replaces: \defineoverlay[\v!foreground][\foregroundbox]
-%D We can specify overlays as a comma separated list of overlays, a sometimes
-%D handy feature.
-%D
-%D Besides backgrounds (overlays) we also need some macros to draw outlines (ruled
-%D borders). Again we have to deal with square and round corners. The first category
-%D can be handled by \TEX\ itself, the latter one depends on the driver. This macro
-%D also support a negative offset.
+%D We can specify overlays as a comma separated list of
+%D overlays, a sometimes handy feature.
+
+%D Besides backgrounds (overlays) we also need some macros to
+%D draw outlines (ruled borders). Again we have to deal with
+%D square and round corners. The first category can be handled
+%D by \TEX\ itself, the latter one depends on the driver. This
+%D macro also support a negative offset.
\def\pack_framed_add_outline
{\setbox\b_framed_normal\hbox % rules on top of box
@@ -665,10 +687,10 @@
\dp\scratchbox\d_framed_target_dp
\box\scratchbox}
-\def\pack_framed_t_rule{\hrule\s!height\d_framed_linewidth\kern-\d_framed_linewidth}
-\def\pack_framed_b_rule{\kern-\d_framed_linewidth\hrule\s!height\d_framed_linewidth}
-\def\pack_framed_r_rule{\kern-\d_framed_linewidth\vrule\s!width\d_framed_linewidth}
-\def\pack_framed_l_rule{\vrule\s!width\d_framed_linewidth\kern-\d_framed_linewidth}
+\def\pack_framed_t_rule{\hrule\!!height\d_framed_linewidth\kern-\d_framed_linewidth}
+\def\pack_framed_b_rule{\kern-\d_framed_linewidth\hrule\!!height\d_framed_linewidth}
+\def\pack_framed_r_rule{\kern-\d_framed_linewidth\vrule\!!width\d_framed_linewidth}
+\def\pack_framed_l_rule{\vrule\!!width\d_framed_linewidth\kern-\d_framed_linewidth}
\letvalue{\??framedtop \v!on \v!on}\pack_framed_t_rule
\letvalue{\??framedtop \v!off\v!on}\pack_framed_t_rule
@@ -688,10 +710,10 @@
% no overlapping rules
-\def\pack_framed_t_rules{\hbox{\kern\d_framed_linewidth\vrule\s!width\dimexpr\d_framed_target_wd-2\d_framed_linewidth\relax\s!height\d_framed_linewidth}\nointerlineskip\kern-\d_framed_linewidth}
-\def\pack_framed_b_rules{\kern-\d_framed_linewidth\nointerlineskip\hbox{\kern\d_framed_linewidth\vrule\s!width\dimexpr\d_framed_target_wd-2\d_framed_linewidth\relax\s!height\d_framed_linewidth}}
-\def\pack_framed_r_rules{\kern-\d_framed_linewidth\vrule\s!height\dimexpr\d_framed_target_ht-\d_framed_linewidth\relax\s!depth-\d_framed_linewidth\s!width\d_framed_linewidth}
-\def\pack_framed_l_rules{\vrule\s!height\dimexpr\d_framed_target_ht-\d_framed_linewidth\relax\s!depth-\d_framed_linewidth\s!width\d_framed_linewidth\kern-\d_framed_linewidth}
+\def\pack_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\pack_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\pack_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\pack_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}
\letvalue{\??framedtop \v!small\v!small}\pack_framed_t_rules
\letvalue{\??framedtop \v!off \v!small}\pack_framed_t_rules
@@ -722,10 +744,11 @@
% frame=off,rightframe=small,leftframe=small,topframe=small,bottomframe=on]
% {}
-%D The next few macros are probably the most misused ones in \CONTEXT. They deal
-%D with putting rules around boxes, provide backgrounds, offer alignment features,
-%D and some more. We start with defining some booleans. These give an impression of
-%D what we are going to take into account.
+%D The next few macros are probably the most misused ones in
+%D \CONTEXT. They deal with putting rules around boxes, provide
+%D backgrounds, offer alignment features, and some more. We
+%D start with defining some booleans. These give an impression
+%D of what we are going to take into account.
% todo : \c_framed_hasoffset
% faster : \let\c_framed_hasoffset\falseconditional
@@ -743,72 +766,67 @@
%D \macros
%D {framed, setupframed}
%D
-%D Ruled boxes are typeset using \type{\framed}. This command is quite versatile
-%D and, although some users will probably seldom use it, one cannot overlook its
-%D features.
+%D Ruled boxes are typeset using \type{\framed}. This command
+%D is quite versatile and, although some users will probably
+%D seldom use it, one cannot overlook its features.
%D
-%D \showsetup{setupframed}
-%D \showsetup{framed}
+%D \showsetup{setupframed}
+%D \showsetup{framed}
%D
-%D This general macro is a special version of an even more general case, that can
-%D easily be linked into other macros that need some kind of framing. The local
-%D version is called with an extra parameter: the variable identifier. The reason
-%D for passing this identifier between brackets lays in the mere fact that this way
-%D we can use the optional argument grabbers.
+%D This general macro is a special version of an even more
+%D general case, that can easily be linked into other macros
+%D that need some kind of framing. The local version is called
+%D with an extra parameter: the variable identifier. The reason
+%D for passing this identifier between brackets lays in the
+%D mere fact that this way we can use the optional argument
+%D grabbers.
\def\defaultframeoffset{.25ex}
-\installcorenamespace{regularframedlevel}
-
-\unexpanded\def\installregularframed#1%
- {\defineframed[#1]}
-
-\unexpanded\def\presetlocalframed[#1]%
- {\defineframed[#1]}
+\def\presetlocalframed [#1]{\letvalue {#1\s!parent}\??framed}
+\def\inheritlocalframed[#1]#2[#3]{\setevalue{#1\s!parent}{#3}}
-% \presetlocalframed[\??framed]
+\presetlocalframed[\??ol]
-\newcount\c_pack_framed_nesting
-
-\unexpanded\def\pack_framed_process_framed[#1]%
- {\bgroup
- \iffirstargument % faster
- \setupcurrentframed[#1]% here !
- \fi
- \pack_framed_process_indeed}
+\newcount\framednesting
\unexpanded\def\framed
{\bgroup
- \advance\c_pack_framed_nesting\plusone
- \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
- \edef\currentframed{>\the\c_pack_framed_nesting}%
- \pack_framed_initialize
- \dosingleempty\pack_framed_process_framed}
+ \advance\framednesting\plusone
+ \expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol
+ \dodoubleempty\pack_framed_process[\??ol:\the\framednesting]}
\unexpanded\def\startframed
{\dosingleempty\pack_framed_start_framed}
\def\pack_framed_start_framed[#1]%
{\bgroup
- \advance\c_pack_framed_nesting\plusone
- \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
+ \advance\framednesting\plusone
+ \expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol
\iffirstargument\secondargumenttrue\fi % dirty trick
- \edef\currentframed{>\the\c_pack_framed_nesting}%
- \pack_framed_initialize
- \pack_framed_process_framed[#1]% can be inlined
+ \pack_framed_process[\??ol:\the\framednesting][#1]%
\bgroup}
\let\stopframed\egroup
-\unexpanded\def\normalframedwithsettings[#1]%
+\unexpanded\def\setupframed
+ {\dodoubleempty\dosetupframed}
+
+\unexpanded\def\normalframedwithsettings
{\bgroup
- \advance\c_pack_framed_nesting\plusone
- \expandafter\let\csname\??framed>\the\c_pack_framed_nesting:\s!parent\endcsname\??framed
- \bgroup
- \edef\currentframed{>\the\c_pack_framed_nesting}%
- \pack_framed_initialize
- \setupcurrentframed[#1]%
- \pack_framed_process_indeed}
+ \advance\framednesting\plusone
+ \expandafter\let\csname\??ol:\the\framednesting\s!parent\endcsname\??ol
+ \pack_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
+
+\def\dosetupframed[#1][#2]%
+ {\ifsecondargument
+ \getparameters[\??ol#1][#2]%
+ \else
+ \getparameters[\??ol][#1]%
+ \fi}
%D \startbuffer
%D \setupframed [framecolor=yellow] \framed{A}
@@ -828,11 +846,13 @@
%D \macros
%D {ifinframed}
%D
-%D The normal case first presets all parameters and next starts looking for the user
-%D supplied ones. The first step is omitted in the local case, because these are
-%D preset at declaration time and keep their values unless explictly changed. By
-%D presetting the variables everytime the normal command is called, we can use this
-%D command nested, without the unwanted side effect of inheritance. The boolean is
+%D The normal case first presets all parameters and next starts
+%D looking for the user supplied ones. The first step is
+%D omitted in the local case, because these are preset at
+%D declaration time and keep their values unless explictly
+%D changed. By presetting the variables everytime the normal
+%D command is called, we can use this command nested, without
+%D the unwanted side effect of inheritance. The boolean is
%D used to speed up the color stack.
\newif\ifinframed
@@ -842,8 +862,7 @@
\unexpanded\def\fastlocalframed[#1]#2[#3]#4% 3-4
{\bgroup
- \edef\currentframed{#1}%
- \pack_framed_initialize
+ \pack_framed_initialize{#1}%
\setbox\b_framed_normal\hbox{#4}%
\edef\p_framed_region{\framedparameter\c!region}%
\ifx\p_framed_region\v!yes % maybe later named
@@ -861,7 +880,8 @@
\d_framed_linewidth\p_framed_rulethickness\relax
\fi
\pack_framed_add_outline % real or invisible frame
- \fi\fi
+ \fi \fi
+ \fi
\ifx\p_framed_background\empty \else
\edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}%
\d_framed_backgroundoffset
@@ -877,13 +897,12 @@
\box\b_framed_normal
\egroup}
-%D The next macro uses a box and takes its natural width and height so these
-%D can better be correct.
+%D The next macro uses a box and takes its natural width and
+%D height so these can better be correct.
-\unexpanded\def\localbackgroundframed#1#2#3% namespace component box
+\def\localbackgroundframed#1#2#3% namespace component box
{\bgroup
- \edef\currentframed{#1}%
- \pack_framed_initialize
+ \pack_framed_initialize{#1}%
\setbox\b_framed_normal\box#3%
\edef\p_framed_region{\framedparameter\c!region}%
\ifx\p_framed_region\v!yes % maybe later named
@@ -898,7 +917,7 @@
\d_framed_linewidth\p_framed_rulethickness\relax
\fi
\pack_framed_add_outline % real or invisible frame
- \fi\fi
+ \fi \fi
\ifx\p_framed_background\empty \else
\edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}%
\d_framed_backgroundoffset
@@ -936,36 +955,35 @@
\unexpanded\def\localframed
{\bgroup
- \dodoubleempty\pack_framed_local}
+ \dodoubleempty\pack_framed_process}
-\unexpanded\def\pack_framed_local[#1][#2]%
+\unexpanded\def\pack_framed_process[#1][#2]% assumes a \dodoubleempty (slows down), also should have leading \bgroup
{\bgroup
- \edef\currentframed{#1}%
- \pack_framed_initialize
+ \pack_framed_initialize{#1}%
\ifsecondargument % faster
- \setupcurrentframed[#2]% here !
+ \getparameters[\currentframed][#2]% here !
\fi
\pack_framed_process_indeed}
\unexpanded\def\directlocalframed[#1]% no optional
{\bgroup
\bgroup
- \edef\currentframed{#1}%
- \pack_framed_initialize
+ \pack_framed_initialize{#1}%
\pack_framed_process_indeed}
\unexpanded\def\localframedwithsettings[#1][#2]% no checking (so no spaces between)
{\bgroup
\bgroup
- \edef\currentframed{#1}%
- \pack_framed_initialize
- \setupcurrentframed[#2]% here !
+ \pack_framed_initialize{#1}%
+ \getparameters[\currentframed][#2]% here !
\pack_framed_process_indeed}
% done
\def\c!fr!analyze{fr:analyze} % private option
+% we can make macros for the offset, width, and height branches or do an \csname
+
\unexpanded\def\pack_framed_process_indeed
{\d_framed_frameoffset\framedparameter\c!frameoffset
\edef\p_framed_backgroundoffset{\framedparameter\c!backgroundoffset}%
@@ -1020,28 +1038,78 @@
\settrue\c_framed_has_format
\dosetraggedcommand\localformat % not that fast
\fi
- \csname\??framedoffsetalternative
- \ifcsname\??framedoffsetalternative\localoffset\endcsname
- \localoffset
+ \ifx\localoffset\v!none
+ \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\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
+% \setfalse\c_framed_has_offset
+% \settrue \c_framed_has_strut
+% \settrue \c_framed_is_overlaid
+% \d_framed_local_offset\zeropoint
+ \else
+ \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
+ \letframedparameter\c!offset\defaultframeoffset % brrr
\else
- \s!unknown
+ \let\defaultframeoffset\localoffset
\fi
- \endcsname
- \csname\??framedwidthalternative
- \ifcsname\??framedwidthalternative\localwidth\endcsname
- \localwidth
+ \d_framed_local_offset\dimexpr\localoffset+\d_framed_linewidth\relax
+ \fi\fi % \fi
+ \d_framed_height\zeropoint
+ \d_framed_width \zeropoint
+ \ifx\localwidth\empty % fallback to fit
+ \ifconditional\c_framed_has_format
+ \settrue\c_framed_has_width
+ \d_framed_width\hsize
\else
- \s!unknown
+ \setfalse\c_framed_has_width
\fi
- \endcsname
- \csname\??framedheightalternative
- \ifcsname\??framedheightalternative\localheight\endcsname
- \localheight
+ \else\ifx\localwidth\v!fit
+ \ifconditional\c_framed_has_format
+ \settrue\c_framed_has_width
+ \d_framed_width\hsize
\else
- \s!unknown
+ \setfalse\c_framed_has_width
\fi
- \endcsname
- % the next check could move to heightalternative
+ \else\ifx\localwidth\v!fixed % equals \v!fit but no shapebox
+ \ifconditional\c_framed_has_format
+ \settrue\c_framed_has_width
+ \d_framed_width\hsize
+ \else
+ \setfalse\c_framed_has_width
+ \fi
+ \else\ifx\localwidth\v!broad
+ \settrue\c_framed_has_width
+ \d_framed_width\hsize
+ \else\ifx\localwidth\v!local
+ \settrue\c_framed_has_width
+ \setlocalhsize
+ \d_framed_width\localhsize
+ \else
+ \settrue\c_framed_has_width
+ \d_framed_width\localwidth
+ \fi\fi\fi\fi\fi
+ \ifx\localheight\empty % fallback to fit
+ \setfalse\c_framed_has_height
+ \else\ifx\localheight\v!fit
+ \setfalse\c_framed_has_height
+ \else\ifx\localheight\v!broad
+ \setfalse\c_framed_has_height
+ \else
+ \settrue\c_framed_has_height
+ \d_framed_height\localheight
+ \fi\fi\fi
\ifconditional\c_framed_has_height
% obey user set height, also downward compatible
\else
@@ -1064,14 +1132,15 @@
% i.e. disable (colsetbackgroundproblemintechniek)
\advance\d_framed_width -2\d_framed_local_offset
\advance\d_framed_height -2\d_framed_local_offset
- \csname\??framedstrutalternative
- \ifcsname\??framedstrutalternative\localstrut\endcsname
- \localstrut
- \else
- \s!unknown
- \fi
- \endcsname
- % the next check could move to strutalternative
+ \ifx\localstrut\v!no
+ \setfalse\c_framed_has_strut
+ \else\ifx\localstrut\v!global
+ \setstrut
+ \else\ifx\localstrut\v!local
+ \setfontstrut
+ \else
+ \setstrut
+ \fi\fi\fi
\ifconditional\c_framed_has_strut
\let\localbegstrut\begstrut
\let\localendstrut\endstrut
@@ -1150,136 +1219,6 @@
\afterassignment\pack_framed_restart
\setbox\b_framed_normal\next}
-% alternatives for width, height, strut and offset
-
-\installcorenamespace{framedwidthalternative}
-\installcorenamespace{framedheightalternative}
-\installcorenamespace{framedstrutalternative}
-\installcorenamespace{framedoffsetalternative}
-
-% widths
-
-\setvalue{\??framedwidthalternative\empty}%
- {\ifconditional\c_framed_has_format
- \settrue\c_framed_has_width
- \d_framed_width\hsize
- \else
- \setfalse\c_framed_has_width
- \d_framed_width\zeropoint
- \fi}
-
-\setvalue{\??framedwidthalternative\v!fit}%
- {\ifconditional\c_framed_has_format
- \settrue\c_framed_has_width
- \d_framed_width\hsize
- \else
- \setfalse\c_framed_has_width
- \d_framed_width\zeropoint
- \fi}
-
-\setvalue{\??framedwidthalternative\v!fixed}% equals \v!fit but no shapebox
- {\ifconditional\c_framed_has_format
- \settrue\c_framed_has_width
- \d_framed_width\hsize
- \else
- \setfalse\c_framed_has_width
- \d_framed_width\zeropoint
- \fi}
-
-\setvalue{\??framedwidthalternative\v!broad}%
- {\settrue\c_framed_has_width
- \d_framed_width\hsize}
-
-\setvalue{\??framedwidthalternative\v!max}% idem broad
- {\settrue\c_framed_has_width
- \d_framed_width\hsize}
-
-\setvalue{\??framedwidthalternative\v!local}%
- {\settrue\c_framed_has_width
- \setlocalhsize
- \d_framed_width\localhsize}
-
-\setvalue{\??framedwidthalternative\s!unknown}%
- {\settrue\c_framed_has_width
- \d_framed_width\localwidth}
-
-% heights
-
-\setvalue{\??framedheightalternative\empty}%
- {\setfalse\c_framed_has_height
- \d_framed_height\zeropoint}
-
-\setvalue{\??framedheightalternative\v!fit}%
- {\setfalse\c_framed_has_height
- \d_framed_height\zeropoint}
-
-\setvalue{\??framedheightalternative\v!broad}%
- {\setfalse\c_framed_has_height
- \d_framed_height\zeropoint}
-
-\setvalue{\??framedheightalternative\v!max}%
- {\settrue\c_framed_has_height
- \d_framed_height\vsize}
-
-\setvalue{\??framedheightalternative\s!unknown}%
- {\settrue\c_framed_has_height
- \d_framed_height\localheight}
-
-% struts
-
-\setvalue{\??framedstrutalternative\v!no}%
- {\setfalse\c_framed_has_strut}
-
-\setvalue{\??framedstrutalternative\v!global}%
- {\setstrut}
-
-\setvalue{\??framedstrutalternative\v!local}%
- {\setfontstrut}
-
-\setvalue{\??framedstrutalternative\v!yes}%
- {\setstrut}
-
-\setvalue{\??framedstrutalternative\s!unknown}%
- {\setstrut}
-
-% offsets
-
-\setvalue{\??framedoffsetalternative\v!none}%
- {\setfalse\c_framed_has_offset
- \setfalse\c_framed_has_strut
- \setfalse\c_framed_is_overlaid
- \d_framed_local_offset\d_framed_linewidth}
-
-\setvalue{\??framedoffsetalternative\v!overlay}%
- {% \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}
-
-% \setvalue{\??framedoffsetalternative\v!strut}%
-% {\setfalse\c_framed_has_offset
-% \settrue \c_framed_has_strut
-% \settrue \c_framed_is_overlaid
-% \d_framed_local_offset\zeropoint}
-
-\setvalue{\??framedoffsetalternative\v!default}% new per 2-6-2000
- {\settrue \c_framed_has_offset
- \settrue \c_framed_has_strut
- \setfalse\c_framed_is_overlaid
- \let\localoffset\defaultframeoffset
- \letframedparameter\c!offset\defaultframeoffset % brrr
- \d_framed_local_offset\dimexpr\localoffset+\d_framed_linewidth\relax}
-
-\setvalue{\??framedoffsetalternative\s!unknown}%
- {\settrue \c_framed_has_offset
- \settrue \c_framed_has_strut
- \setfalse\c_framed_is_overlaid
- \let\defaultframeoffset\localoffset
- \d_framed_local_offset\dimexpr\localoffset+\d_framed_linewidth\relax}
-
-% so far for alternatives
-
\let\pack_framed_stop_orientation\relax
\def\pack_framed_restart
@@ -1288,17 +1227,18 @@
\def\pack_framed_do_top {\raggedtopcommand\framedparameter\c!top}
\def\pack_framed_do_bottom{\framedparameter\c!bottom\raggedbottomcommand}
-%D Carefull analysis of this macro will learn us that not all branches in the last
-%D conditionals can be encountered, that is, some assignments to \type{\next} will
-%D never occur. Nevertheless we implement the whole scheme, if not for future
-%D extensions.
+%D Carefull analysis of this macro will learn us that not all
+%D branches in the last conditionals can be encountered, that
+%D is, some assignments to \type{\next} will never occur.
+%D Nevertheless we implement the whole scheme, if not for
+%D future extensions.
%D \macros
%D {doassigncheckedframeoffset}
%D
%D Offset helper (see menus):
-\def\doassigncheckedframeoffset#1#2% could be a fast \csname .. \endcsname
+\def\doassigncheckedframeoffset#1#2%
{\edef\checkedframeoffset{#2}%
#1%
\ifx\checkedframeoffset\empty \zeropoint\else
@@ -1313,10 +1253,11 @@
%D \macros
%D {ifreshapeframebox}
%D
-%D The last few lines tell what to do after the content of the box is collected and
-%D passed to the next macro. In the case of a fixed width and centered alignment,
-%D the content is evaluated and used to determine the most natural width. The rest
-%D of the code deals with backgrounds and frames.
+%D The last few lines tell what to do after the content of the
+%D box is collected and passed to the next macro. In the case
+%D of a fixed width and centered alignment, the content is
+%D evaluated and used to determine the most natural width. The
+%D rest of the code deals with backgrounds and frames.
\newif\ifreshapeframebox \reshapeframeboxtrue
@@ -1382,8 +1323,8 @@
\else
\pack_framed_finish_c
\fi\fi\fi
- \ifconditional\page_postprocessors_needed_box
- \page_postprocessors_linenumbers_box\b_framed_normal
+ \ifconditional\boxcontentneedsprocessing
+ \mkdoprocessboxcontents\b_framed_normal
\fi
\else
\pack_framed_finish_c
@@ -1629,9 +1570,9 @@
\def\pack_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 in||line \inframed
-%D [height=3cm] {framed} boxes. Such boxes have to be \inframed {aligned} with the
-%D running text.
+%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.
\unexpanded\def\inframed
{\dosingleempty\pack_framed_inline}
@@ -1644,14 +1585,15 @@
\def\pack_framed_inline[%
{\framed[\c!location=\v!low,}
-%D When we set \type{empty} to \type{yes}, we get ourselves a frame and/or background,
-%D but no content, so actually we have a sort of phantom framed box.
+%D When we set \type{empty} to \type{yes}, we get
+%D ourselves a frame and/or background, but no content, so
+%D actually we have a sort of phantom framed box.
%D \macros
%D {mframed, minframed}
%D
-%D When Tobias asked how to frame mathematical elements in formulas, Taco's posted the
-%D next macro:
+%D When Tobias asked how to frame mathematical elements in
+%D formulas, Taco's posted the next macro:
%D
%D \starttyping
%D \def\mframed#1%
@@ -1663,8 +1605,9 @@
%D \fi}
%D \stoptyping
%D
-%D Because \type {\ifinner} does not (always) reports what one would expect, we move the
-%D test to the outer level. We also want to pass arguments,
+%D Because \type {\ifinner} does not (always) reports what
+%D one would expect, we move the test to the outer level. We
+%D also want to pass arguments,
%D
%D \starttyping
%D \def\mframed%
@@ -1683,8 +1626,8 @@
%D \fi}
%D \stoptyping
%D
-%D Still better is the next alternative, if only because it takes care of setting the super-
-%D and subscripts styles
+%D Still better is the next alternative, if only because it
+%D takes care of setting the super- and subscripts styles
\newcount\c_framed_mstyle
@@ -1694,6 +1637,22 @@
\vphantom{(}%
\Ustopmath}
+% \unexpanded\def\mframed {\dosingleempty\pack_framed_math_display}
+% \unexpanded\def\inmframed{\dosingleempty\pack_framed_math_inline }
+%
+% \def\pack_framed_math_inline[#1]#2%
+% {\begingroup
+% \c_framed_mstyle\mathstyle
+% \inframed[#1]{\Ustartmath\triggermathstyle\c_framed_mstyle#2\Ustopmath}%
+% \endgroup}
+%
+% \def\pack_framed_math_display[#1]#2%
+% {\begingroup
+% \c_framed_mstyle\mathstyle
+% \let\normalstrut\pack_framed_math_strut
+% \framed[#1]{\Ustartmath\triggermathstyle\c_framed_mstyle#2\Ustopmath}%
+% \endgroup}
+
\installcorenamespace{mathframed}
\installframedcommandhandler \??mathframed {mathframed} \??mathframed
@@ -1719,7 +1678,8 @@
\definemathframed[mframed]
\definemathframed[inmframed][\c!location=\v!low]
-%D So instead of the rather versatile \type {\framed}, we use \type {\mframed}:
+%D So instead of the rather versatile \type {\framed}, we ue
+%D the \type {\mframed}.
%D
%D \startbuffer
%D \startformula
@@ -1740,9 +1700,11 @@
%D
%D \typebuffer \getbuffer
%D
-%D As usual, one can specify in what way the text should be framed. One should be
-%D aware of the fact that, inorder to preserve the proper spacing, the \type
-%D {offset} is set to \type {overlay} and \type {frameoffset} is used used instead.
+%D As usual, one can specify in what way the text should be
+%D framed. One should be aware of the fact that, inorder to
+%D preserve the proper spacing, the \type {offset} is set to
+%D \type {overlay} and \type {frameoffset} is used used
+%D instead.
%D
%D \startbuffer
%D \startformula
@@ -1752,11 +1714,13 @@
%D
%D \typebuffer \getbuffer
%D
-%D For inline use, we also provide the \type {\inmframed} alternative: we want $x
-%D \times \inmframed{y}$ in inline math, right?
+%D For inline use, we also provide the \type {\inmframed}
+%D alternative: we want $x \times \inmframed{y}$ in inline
+%D math, right?
-%D This previous framing macros needs a lot of alternatives for putting rules around
-%D boxes, inserting offsets and aligning text. Each step is handled by separate macros.
+%D This previous framing macros needs a lot of alternatives for
+%D putting rules around boxes, inserting offsets and aligning
+%D text. Each step is handled by separate macros.
\newdimen\d_framed_applied_offset
\newdimen\d_framed_loffset
@@ -1796,8 +1760,8 @@
\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 what needs to be
-%D done by the auxiliary macros.
+%D Let's hope that the next few examples show us enough of
+%D what needs to be done by the auxiliary macros.
%D
%D \startbuffer
%D \framed[height=1cm,offset=.5cm] {rule based learning}
@@ -1851,21 +1815,25 @@
%D \hbox{\dontcomplain\getbuffer}
%D \stoplinecorrection
%D
-%D So now we're ready for the complicated stuff. We distinguish between borders with
-%D straight lines and those with round corners. When using the first alternative it
-%D is possible to turn off one or more lines. More fancy shapes are also possible by
-%D specifying dedicated backgrounds. Turning lines on and off is implemented as
-%D efficient as possible and as a result is interface language dependant. This next
-%D implementation evolved from simpler ones. It puts for instance the rules on top
-%D of the content and provides additional offset capabilities. The lot of calls to
-%D other macros makes this mechanism not that easy to comprehend.
-%D
-%D We handle left, right or middle alignment as well as fixed or free widths and
-%D heights. Each combination gets its own macro.
-%D
-%D The following code handles one-liners: \type {align={line,flushright}}. Beware,
-%D since we entered a group and either or not grab the next bgroup token, we need to
-%D finish the group in the oneliner mode.
+%D So now we're ready for the complicated stuff. We distinguish
+%D between borders with straight lines and those with round
+%D corners. When using the first alternative it is possible to
+%D turn off one or more lines. More fancy shapes are also
+%D possible by specifying dedicated backgrounds. Turning lines
+%D on and off is implemented as efficient as possible and as a
+%D result is interface language dependant. This next
+%D implementation evolved from simpler ones. It puts for
+%D instance the rules on top of the content and provides
+%D additional offset capabilities. The lot of calls to other
+%D macros makes this mechanism not that easy to comprehend.
+
+%D We handle left, right or middle alignment as well as fixed
+%D or free widths and heights. Each combination gets its own
+%D macro.
+
+%D The following code handles one-liners: \type{align={line,flushright}}.
+%D Beware, since we entered a group and either or not grab the next
+%D bgroup token, we need to finish the group in the oneliner mode.
\ifdefined\raggedonelinerstate \else \newconditional\raggedonelinerstate \fi
@@ -2045,10 +2013,11 @@
\localstrut
\doformatonelinerbox}
-%D On the next page we show some examples of how these macros come into action. The
-%D examples show us how \type {fit}, \type {broad} dimensions influence the
-%D formatting. Watch the visualized struts. \footnote {Here we used \type
-%D {\showstruts}.}
+%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
+%D formatting. Watch the visualized struts. \footnote {Here we
+%D used \type {\showstruts}.}
%D
%D \startpostponing
%D \bgroup
@@ -2103,8 +2072,9 @@
%D \macros
%D {framednoflines, framedlastlength}
%D
-%D It is possible to let the frame macro calculate the width of a centered box
-%D automatically (\type {fit}). When doing so, we need to reshape the box:
+%D It is possible to let the frame macro calculate the width
+%D of a centered box automatically (\type {fit}). When
+%D doing so, we need to reshape the box:
\newcount\framednoflines
\newdimen\framedfirstheight
@@ -2136,12 +2106,13 @@
% \startformula \startalign \NC \int_01 \NC B \NR \intertext{test} \NC \int_01 \NC D \NR \stopalign \stopformula
% \stopTEXpage
-%D The examples on the next page show how one can give the frame as well as the
-%D background an additional offset and even a bit more depth. The blue outline is
-%D the frame, the red box is the background and the small black outline is the
-%D visualization of the resulting box, that is, we applied \type {\ruledhbox} to
-%D the result.
-%D
+%D The examples on the next page show how one can give the
+%D frame as well as the background an additional offset and
+%D even a bit more depth. The blue outline is the frame, the
+%D red box is the background and the small black outline is the
+%D visualization of the resulting box, that is, we applied
+%D \type{\ruledhbox} to the result.
+
%D \startpostponing
%D \bgroup
%D \unprotect
@@ -2191,8 +2162,9 @@
%D \egroup
%D \stoppostponing
-%D We can draw lines from left to right and top to bottom by using the normal \type
-%D {\hairline} command. Both directions need a different treatment.
+%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.
%D
%D \startbuffer
%D \framed[width=4cm] {alfa\hairline beta\hairline gamma}
@@ -2206,8 +2178,26 @@
%D \hbox{\getbuffer}
%D \stoplinecorrection
%D
-%D These macros try to adapt their behaviour as good as possible to the circumstances
-%D and act as natural as possible.
+%D These macros try to adapt their behaviour as good as
+%D possible to the circumstances and act as natural as
+%D possible.
+
+% \unexpanded\def\pack_framed_vboxed_hairline
+% {\bgroup
+% \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\d_framed_linewidth
+% \!!depth\zeropoint
+% \!!width\hsize
+% \vskip\dimen2}%
+% \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
\unexpanded\def\pack_framed_vboxed_hairline % nasty overlay mess .. needed for autowidth
{\begingroup
@@ -2217,13 +2207,13 @@
\nointerlineskip
\kern\scratchoffset
\dontleavehmode
- \hrule\s!height\d_framed_linewidth\s!depth\zeropoint
+ \hrule\!!height\d_framed_linewidth\!!depth\zeropoint
\par
\kern-\d_framed_linewidth
\dontleavehmode
- \hbox to \zeropoint{\normalhss\vrule\s!height\d_framed_linewidth\s!depth\zeropoint\s!width\scratchwidth}%
+ \hbox to \zeropoint{\normalhss\vrule\!!height\d_framed_linewidth\!!depth\zeropoint\!!width\scratchwidth}%
\hfill
- \hbox to \zeropoint{\vrule\s!height\d_framed_linewidth\s!depth\zeropoint\s!width\scratchwidth\normalhss}%
+ \hbox to \zeropoint{\vrule\!!height\d_framed_linewidth\!!depth\zeropoint\!!width\scratchwidth\normalhss}%
\par
\nointerlineskip
\kern\scratchoffset
@@ -2233,29 +2223,32 @@
\localbegstrut
\endgroup}
+% todo:
+
\unexpanded\def\pack_framed_hboxed_hairline % use framed dimen
{\bgroup
- \scratchoffset\ifconditional\c_framed_has_offset \localoffset \else \zeropoint \fi
+ \dimen2=\ifconditional\c_framed_has_offset \localoffset \else \zeropoint \fi
\ifconditional\c_framed_has_height
- \dimen\scratchheight\dimexpr\localheight/\plustwo+\strutdp-\plustwo\d_framed_linewidth\relax
- \dimen\scratchdepth \dimexpr\localheight/\plustwo-\strutdp+\plustwo\d_framed_linewidth\relax
+ \dimen4\dimexpr\localheight/2+\strutdp-2\d_framed_linewidth\relax
+ \dimen6\dimexpr\localheight/2-\strutdp+2\d_framed_linewidth\relax
\else
- \dimen\scratchheight\dimexpr\strutht+\scratchoffset\relax
- \dimen\scratchdepth \dimexpr\strutdp+\scratchoffset\relax
+ \dimen4\dimexpr\strutht+\dimen2\relax
+ \dimen6\dimexpr\strutdp+\dimen2\relax
\fi
\unskip
\setbox\scratchbox\hbox
- {\hskip\scratchoffset
- \vrule\s!height\dimen\scratchheight\s!depth\dimen\scratchdepth\s!width\d_framed_linewidth
- \hskip\scratchoffset}%
+ {\hskip\dimen2
+ \vrule\!!height\dimen4\!!depth\dimen6\!!width\d_framed_linewidth
+ \hskip\dimen2}%
\ht\scratchbox\strutht
\dp\scratchbox\strutdp
\box\scratchbox
\ignorespaces
\egroup}
-%D The argument of the frame command accepts \type{\\} as a sort of newline signal. In
-%D horizontal boxes it expands to a space.
+%D The argument of the frame command accepts \type{\\} as a
+%D sort of newline signal. In horizontal boxes it expands to a
+%D space.
\unexpanded\def\pack_framed_vboxed_newline
{\endgraf\ignorespaces}
@@ -2263,9 +2256,10 @@
\unexpanded\def\pack_framed_hboxed_newline
{\unskip\normalspace\ignorespaces}
-%D We can set each rule on or off. The default setting is inherited from
-%D \type {frame}. An earlier implementation use a bit different approach, but the new
-%D one seems more natural:
+%D We can set each rule on or off. The default setting is
+%D inherited from \type{frame}. An earlier implementation
+%D use a bit different approach, but the new one seems more
+%D natural:
%D
%D \bgroup
%D \setuptyping[margin=0pt]
@@ -2305,9 +2299,10 @@
%D \macros
%D {startframedtext, setupframedtexts, defineframedtext}
%D
-%D The general framing command we discussed previously, is not entirely suited for
-%D what we call framed texts, as for instance used in intermezzo's. The next
-%D examples show what we have in mind.
+%D The general framing command we discussed previously, is not
+%D entirely suited for what we call framed texts, as for
+%D instance used in intermezzo's. The next examples show what
+%D we have in mind.
%D
%D \startbuffer[framed-0]
%D \setupframedtexts
@@ -2369,8 +2364,8 @@
%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-3] \egroup
%D \bgroup \setuptyping[margin=0pt] \getbuffer[framed-4] \egroup
%D
-%D Here we can see that we have a predefined framed text class as well as the
-%D tools for defining our own. So we have:
+%D Here we can see that we have a predefined framed text class
+%D as well as the tools for defining our own. So we have:
%D
%D \showsetup{setupframedtexts}
%D
@@ -2393,7 +2388,7 @@
\let\setupframedtexts\setupframedtext
\setupframedtext
- [\c!width=.75\hsize,
+ [\c!width=0.75\hsize,
\c!height=\v!fit,
\c!align=\v!yes,
%\c!top=,
@@ -2420,7 +2415,7 @@
%\c!foregroundstyle=,
%\c!background=,
%\c!backgroundcolor=,
- \c!backgroundscreen=\defaultbackgroundscreen,
+ \c!backgroundscreen=\@@rsscreen,
\c!linecorrection=\v!on,
\c!depthcorrection=\v!on,
\c!margin=\v!standard]
@@ -2466,6 +2461,7 @@
\hsize\localhsize
% \insidefloattrue % ? better
\normalexpanded{\switchtobodyfont[\framedtextparameter\c!bodyfont]}%
+% \startcolor[\framedtextparameter\c!color]%
\letframedtextparameter\c!strut\v!no
\inheritedframedtextframed\bgroup
\let\\=\endgraf
@@ -2475,8 +2471,9 @@
\setupindenting[\framedtextparameter\c!indenting]%
\useframedtextstyleandcolor\c!style\c!color}
-%D The \type {none} option is handy for nested usage, as in the presentation
-%D styles, where we don't want interference.
+%D The \type {none} option is handy for nested usage, as
+%D in the presentation styles, where we don't want
+%D interference.
\defineplacement[\??framedtext][\s!parent=\??framedtext\currentframedtext]
@@ -2485,6 +2482,7 @@
\removelastskip
\doif{\framedtextparameter\c!depthcorrection}\v!on\pack_framed_text_stop_depth_correction
\stopboxedcontent
+% \stopcolor
\ifconditional\c_framed_text_location_none
\egroup
\box\b_framed_normal
@@ -2553,8 +2551,8 @@
%D \egroup
%D \stoptyping
-%D The simple brace (or group) delimited case is typeset slightly different
-%D and is not aligned.
+%D The simple brace (or group) delimited case is typeset
+%D slightly different and is not aligned.
\unexpanded\def\pack_framed_text_direct#1%
{\bgroup
@@ -2581,8 +2579,7 @@
\egroup
\egroup}
-\defineframedtext
- [\v!framedtext]
+\defineframedtext[\v!framedtext]
%D \macros
%D {defineframed}
@@ -2591,44 +2588,47 @@
%D
%D \showsetup{defineframed}
%D
-%D As suggested by Wolfgang we can now use the new \MKIV\ inheritance model instead
-%D of passing a combination of arguments. This also also simplified the \type
-%D {\setupframed} command. There are certainly more places where such improvements
-%D can be made.
+%D As suggested by Wolfgang we can now use the new \MKIV\ inheritance
+%D model instead of passing a combination of arguments. This also
+%D also simplified the \type {\setupframed} command. There are
+%D certainly more places where such improvements can be made.
-\appendtoks
- \ifcsname\??regularframedlevel\currentframed\endcsname
- % already defined, keeps settings
- \else
- \expandafter\newcount\csname\??regularframedlevel\currentframed\endcsname
- \fi
-\to \everypresetframed
+% actually, this can be another command handler .. todo
-\appendtoks
- \setuevalue\currentframed{\pack_framed_defined_process[\currentframed]}%
-\to \everydefineframed
+\unexpanded\def\defineframed
+ {\dotripleempty\pack_framed_define}
-\newcount\c_temp_framed_crap
+\def\pack_framed_define[#1][#2][#3]%
+ {\ifcsname\??ol:#1\endcsname
+ % already defined, keeps settings
+ \else
+ \expandafter\newcount\csname\??ol:#1\endcsname % \the\everypresetframed
+ \fi
+ \ifsecondargument
+ \doifassignmentelse{#2}
+ {\getparameters[\??ol#1][\s!parent=\??ol,#2]}%
+ {\ifcsname#2\endcsname
+ \getparameters[\??ol#1][\s!parent=\??ol#2,#3]%
+ \else
+ \getparameters[\??ol#1][\s!parent=\??ol,#3]%
+ \fi}%
+ \else
+ \getparameters[\??ol#1][\s!parent=\??ol,#2]%
+ \fi
+ \setuvalue{#1}{\pack_framed_defined_process[#1]}}% % \the\everydefineframed
+
+\newcount\c_framed_crap
\unexpanded\def\pack_framed_defined_process[#1]% official (not much checking, todo: parent)
{\bgroup
- \ifcsname\??regularframedlevel#1\endcsname
- \expandafter\let\expandafter\c_pack_framed_temp\csname\??regularframedlevel#1\endcsname
+ \ifcsname\??ol:#1\endcsname
+ \expandafter\let\expandafter\c_framed_temp\csname\??ol:#1\endcsname
\else
- \let\c_pack_framed_temp\c_temp_framed_crap
- \fi
- \advance\c_pack_framed_temp\plusone
- \expandafter\def\csname\??framed#1>\the\c_pack_framed_temp:\s!parent\endcsname{\??framed#1}% \inheritlocalframed
- \bgroup
- \edef\currentframed{#1>\the\c_pack_framed_temp}%
- \pack_framed_initialize
- \dosingleempty\pack_framed_defined_process_indeed}
-
-\def\pack_framed_defined_process_indeed[#1]%
- {\iffirstargument % faster
- \setupcurrentframed[#1]% here !
+ \let\c_framed_temp\c_framed_crap
\fi
- \pack_framed_process_indeed}
+ \advance\c_framed_temp\plusone
+ \expandafter\def\csname\??ol#1:\the\c_framed_temp\s!parent\endcsname{\??ol#1}% \inheritlocalframed
+ \dodoubleempty\pack_framed_process[\??ol#1:\the\c_framed_temp]}
\let\placeframed\pack_framed_defined_process % new per 2012/04/23
@@ -2640,8 +2640,8 @@
%D
%D but the existing one is ok as well (less csname messy too).
-%D New, for the moment private; let's see when GB finds out about this one and its
-%D obscure usage. It's used in:
+%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
%D \startbuffer
%D \defineframedtext
@@ -2675,17 +2675,21 @@
%D
%D \typebuffer
-\installcorenamespace{framedcontent}
+% to be redone
-\installframedcommandhandler \??framedcontent {framedcontent} \??framedcontent
+\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}
-\setupframedcontent
+\presetlocalframed[\??fc]
+
+\getparameters
+ [\??fc]
[\c!leftoffset=\zeropoint,
- %\c!rightoffset=\framedcontentparameter\c!leftoffset,
- \c!rightoffset=\scratchleftoffset,
+ \c!rightoffset=\framedcontentparameter\c!leftoffset,
\c!topoffset=\zeropoint,
- %\c!bottomoffset=\framedcontentparameter\c!topoffset,
- \c!bottomoffset=\scratchtopoffset,
+ \c!bottomoffset=\framedcontentparameter\c!topoffset,
\c!strut=\v!no,
%\c!linecorrection=\v!no,
%\c!left=,
@@ -2693,6 +2697,19 @@
%\c!width=\v!fit,
\c!offset=\v!overlay]
+\unexpanded\def\defineframedcontent
+ {\dodoubleempty\dodefineframedcontent}
+
+\def\dodefineframedcontent[#1][#2]%
+ {\getparameters[\??fc#1][\s!parent=\??fc,#2]}
+
+\unexpanded\def\setupframedcontent
+ {\dodoubleempty\dosetupframedcontent}
+
+\def\dosetupframedcontent[#1][#2]%
+ {\def\docommand##1{\getparameters[\??fc##1][#2]}%
+ \processcommacommand[#1]\docommand}
+
\unexpanded\def\startframedcontent
{\dosingleempty\pack_framed_start_content}
@@ -2710,15 +2727,11 @@
{\setbox\b_framed_normal\hbox\bgroup
\setlocalhsize
\hsize\localhsize
- \scratchleftoffset \framedcontentparameter\c!leftoffset \relax
- \scratchrightoffset \framedcontentparameter\c!rightoffset \relax
- \scratchtopoffset \framedcontentparameter\c!topoffset \relax
- \scratchbottomoffset\framedcontentparameter\c!bottomoffset\relax
- \advance\hsize\dimexpr-\scratchleftoffset-\scratchrightoffset \relax
- \advance\vsize\dimexpr-\scratchtopoffset -\scratchbottomoffset\relax
- \hskip\scratchleftoffset
+ \advance\hsize\dimexpr-\framedcontentparameter\c!leftoffset-\framedcontentparameter\c!rightoffset \relax
+ \advance\vsize\dimexpr-\framedcontentparameter\c!topoffset -\framedcontentparameter\c!bottomoffset\relax
+ \hskip\framedcontentparameter\c!leftoffset
\vbox\bgroup
- \vskip\scratchtopoffset
+ \vskip\framedcontentparameter\c!topoffset
\vbox\bgroup
\forgetall
\blank[\v!disable]}
@@ -2726,9 +2739,9 @@
\def\pack_framed_stop_content_indeed
{\removelastskip
\egroup
- \vskip\scratchbottomoffset
+ \vskip\framedcontentparameter\c!bottomoffset
\egroup
- \hskip\scratchrightoffset
+ \hskip\framedcontentparameter\c!rightoffset
\egroup
\doif{\framedcontentparameter\c!width}\v!fit
{\letframedcontentparameter\c!width\v!fixed}% no shapebox
@@ -2740,7 +2753,7 @@
% plaats ?
\ifdone\startlinecorrection\fi
\framedcontentparameter\c!left % new
- \inheritedframedcontentframed{\box\b_framed_normal}% hm
+ \localframed[\??fc\currentframedcontent]{\box\b_framed_normal}% hm
\framedcontentparameter\c!right % new
\ifdone\stoplinecorrection\fi
\egroup}
@@ -2750,15 +2763,57 @@
\setuplinewidth
[\v!medium]
-%D A Goodie:
+% We could omit the empty setings but that is some 10% slower due to
+% extra testing in the chain.
-\def\v!unframed{unframed}
+\setupframed
+ [\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=\@@rsscreen,
+ %\c!backgroundcolor=,
+ \c!backgroundoffset=\zeropoint,
+ %\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!region=,
+ %\c!align=,
+ \c!bottom=\vss,
+ %\c!top=,
+ \c!autostrut=\v!yes,
+ \c!location=\v!normal,
+ %\c!orientation=,
+ \c!autowidth=\v!yes,
+ %\c!setups=,
+ \c!strut=\v!yes,
+ %\c!loffset=\zeropoint,
+ %\c!roffset=\zeropoint,
+ %\c!toffset=\zeropoint,
+ ]%\c!boffset=\zeropoint]
-\defineframed
- [\v!unframed]
- [\c!frame=\v!off,
- \c!rulethickness=\zeropoint,
- \c!foregroundstyle=\framedparameter\c!style,
- \c!foregroundcolor=\framedparameter\c!color]
+\setupscreens
+ [\c!screen=0.95]
\protect \endinput