summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/ltxmisc/framed.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/ltxmisc/framed.sty')
-rw-r--r--Master/texmf-dist/tex/latex/ltxmisc/framed.sty255
1 files changed, 255 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/ltxmisc/framed.sty b/Master/texmf-dist/tex/latex/ltxmisc/framed.sty
new file mode 100644
index 00000000000..3f1967b19c9
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/ltxmisc/framed.sty
@@ -0,0 +1,255 @@
+% framed.sty v 0.8a 21-Jul-2003
+% Copyright (C) 1992-2003 by Donald Arseneau
+% These macros may be freely transmitted, reproduced, or modified
+% provided that this notice is left intact.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Create framed or shaded regions that can break across pages using
+% \begin{framed} ... \end{framed} -- ordinary frame box (box at margin)
+% \begin{shaded} ... \end{shaded} -- shaded background (into margin)
+% ... leftbar ... -- line on left side
+% \begin{MakeFramed}{settings} ... \end{MakeFramed}
+% -- generic frame (for new environments)
+%
+% The "framed" environment puts the text into "\fbox" with the
+% settings "\fboxrule=\FrameRule" and "\fboxsep=\FrameSep".
+% You can change these lengths (using "\setlength") and you
+% can even change the definition of "\FrameCommand" to use
+% much fancier boxes.
+%
+% In fact, the "shaded" environment just redefines "\FrameCommand"
+% to use "\colorbox{shadecolor}" (and you have to define the
+% color "shadecolor": \newcolor{shadecolor}...).
+%
+% A page break is allowed, and even encouraged, before the framed
+% environment. If you want to attach some text (a box title) to the
+% frame, then the text should be inserted by \FrameCommand
+%
+% The contents of the framed regions are restricted:
+% Floats, footnotes, marginpars and head-line entries will be lost.
+% (Some of these may be handled in a later version.)
+% This package will not work with the page breaking of multicol.sty,
+% or other systems that perform column-balancing.
+%
+% The MakeFramed environment does the work. Its "settings" argument
+% should contain any adjustments to the text width (applied to \hsize,
+% and using the "\width" of the frame itself) as well as a `restore'
+% command -- \@parboxrestore or \FrameRestore or something similar.
+%
+% Expert commands:
+% \MakeFramed, \endMakeFramed: the "MakeFramed" environment
+% \FrameCommand: command to draw the frame around its argument
+% \FrameRestore: restore some text settings, but fewer than \@parboxrestore
+% \FrameRule: length register; \fboxrule for default "framed".
+% \FrameSep: length register; \fboxsep for default "framed".
+% \FrameHeightAdjust: macro; height of frame above baseline at top of page
+%
+% This is still a `pre-production' version because I can think of many
+% features/improvements that should be made. Nevertheless, starting
+% with version 0.5 it should be bug-free.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\ProvidesPackage{framed}[2003/07/21 v 0.8a:
+ framed or shaded text with page breaks]
+
+\newenvironment{framed}% using default \FrameCommand
+ {\MakeFramed {\advance\hsize-\width \FrameRestore}}%
+ {\endMakeFramed}
+
+\newenvironment{shaded}{%
+ \def\FrameCommand{\colorbox{shadecolor}}%
+ \MakeFramed {\FrameRestore}}%
+ {\endMakeFramed}
+
+\newenvironment{leftbar}{%
+ \def\FrameCommand{\vrule width 3pt \hspace{10pt}}%
+ \MakeFramed {\advance\hsize-\width \FrameRestore}}%
+ {\endMakeFramed}
+
+\chardef\FrameRestore=\catcode`\| % for debug
+\catcode`\|=\catcode`\% % (debug: insert space after backslash)
+
+\def\MakeFramed#1{\par
+ % measure added width and height; call result \width and \height
+ \setbox\z@\vbox{\vskip-1in \hbox{\hskip-1in
+ \FrameCommand{\hbox{\vrule \@height .7in \@depth.3in \@width 1in}}}%
+ \vskip\z@skip}%
+ \def\width{\wd\z@}\def\height{\ht\z@}%
+ \edef\fb@frw{\the\width}\edef\fb@frh{\the\height}%
+ % insert pre-penalties and skips
+ \begingroup
+ \skip@\lastskip
+ \if@nobreak\else
+ \penalty9999 % updates \page parameters
+ \ifdim\pagefilstretch=\z@ \ifdim\pagefillstretch=\z@
+ \edef\@tempa{\the\skip@}%
+ \ifx\@tempa\zero@glue \penalty-30
+ \else \vskip-\skip@ \penalty-30 \vskip\skip@
+ \fi\fi\fi
+ \penalty\z@
+ % Give a stretchy breakpoint that will always be taken in preference
+ % to the \penalty 9999 used to update page parameters. The cube root
+ % of 10000/100 indicates a multiplier of 0.21545, but the maximum
+ % calculated badness is really 8192, not 10000, so the multiplier
+ % is 0.2301.
+ \advance\skip@ \z@ plus-.5\baselineskip
+ \advance\skip@ \z@ plus-.231\height
+ \advance\skip@ \z@ plus-.231\skip@
+ \advance\skip@ \z@ plus-.231\topsep
+ \vskip-\skip@ \penalty 1800 \vskip\skip@
+ \fi
+ \addvspace{\topsep}%
+ \endgroup
+ % clear out pending page break
+ \penalty\@M \vskip 2\baselineskip \vskip\height
+ \penalty9999 \vskip -2\baselineskip \vskip-\height
+ \penalty9999 % updates \pagetotal
+|\message{After clearout, \pagetotal=\the\pagetotal, \pagegoal=\the\pagegoal. }%
+ \fb@adjheight
+ \setbox\@tempboxa\vbox\bgroup
+ #1% Modifications to \hsize (can use \width and \height)
+ \textwidth\hsize \columnwidth\hsize
+}
+
+\def\endMakeFramed{\par
+ \kern\z@ \penalty-100 % put depth into height
+ \egroup
+ \begingroup \put@frame \endgroup
+}
+
+% \put@frame takes the contents of \@tempboxa and puts all, or a piece,
+% of it on the page with a frame (\FrameCommand). It recurses until
+% all of \@tempboxa has been used up. (\@tempboxa must have zero depth.)
+
+\def\put@frame{\relax
+ \ifdim\pagegoal=\maxdimen \pagegoal\vsize \fi
+| \message{=============== Entering putframe ====================^^J
+| \pagegoal=\the\pagegoal, \pagetotal=\the\pagetotal. }%
+ \ifinner \else
+ \dimen@\pagegoal \advance\dimen@-\pagetotal % natural space left on page
+ \ifdim\dimen@<2\baselineskip
+| \message{Page has only \the\dimen@\space room left; eject. }%
+ \eject \fb@adjheight \put@frame
+ \else % there's appreciable room left on the page
+| \message{\string\pagetotal=\the\pagetotal,
+| \string\pagegoal=\the\pagegoal,
+| \string\pagestretch=\the\pagestretch,
+| \string\pageshrink=\the\pageshrink,
+| \string\fb@frh=\fb@frh. \space}
+| \message{Box of size \the\ht\@tempboxa\space + \fb@frh}%
+ \begingroup % temporarily set \dimen@ to be...
+ \advance\dimen@.8\pageshrink % maximum space available on page
+ \advance\dimen@-\fb@frh\relax % space available for frame's contents
+ \expandafter\endgroup
+ % restore \dimen@ to real room left on page
+ \ifdim\dimen@>\ht\@tempboxa % whole box does fit
+| \message{fits in \the\dimen@. }%
+ \else % box must be split
+| \message{must be split to fit in \the\dimen@. }%
+ \setbox\@tempboxa\vbox{% simulate frame and flexiblity of the page:
+ \vskip \fb@frh \@plus\pagestretch \@minus.8\pageshrink
+ \kern137sp\kern-137sp\penalty-30
+ \unvbox\@tempboxa}%
+ \edef\fb@resto@set{\boxmaxdepth\the\boxmaxdepth \splittopskip\the\splittopskip}%
+ \boxmaxdepth\z@ \splittopskip\z@
+ \setbox\tw@\vsplit\@tempboxa to\dimen@
+ \setbox\tw@\vbox{\unvbox\tw@}% natural-sized
+| \message{Box of size \the\ht\@tempboxa\space split to \the\dimen@.
+| Natural height of split box is \the\ht\tw@. }%
+ % If the split-to size > (\vsize-\topskip), then set box to full size
+ \begingroup
+ \advance\dimen@\topskip
+ \expandafter\endgroup
+ \ifdim\dimen@>\pagegoal
+| \message{Frame is big -- Use up the full column. }%
+ \dimen@ii\pagegoal
+ \advance\dimen@ii -\topskip
+ \advance\dimen@ii \FrameHeightAdjust\relax
+ \else % suspect this is wrong:
+ % If the split-to size > feasible room_on_page, rebox it smaller.
+ \advance\dimen@.8\pageshrink
+ \ifdim\ht\tw@>\dimen@
+| \message{Box too tall; rebox it to \the\dimen@. }%
+ \dimen@ii\dimen@
+ \else % use natural size
+ \dimen@ii\ht\tw@
+ \fi
+ \fi
+ % Re-box contents to desired size \dimen@ii
+ \advance\dimen@ii -\fb@frh
+ \setbox\tw@\vbox to\dimen@ii \bgroup
+ % remove simulated frame and page flexibility:
+ \vskip -\fb@frh \@plus-\pagestretch \@minus-.8\pageshrink
+ \unvbox\tw@ \unpenalty\unpenalty
+ \ifdim\lastkern=-137sp % whole box went to next page
+| \message{box split at beginning! }%
+ \egroup \fb@resto@set \eject % (\vskip for frame size was discarded)
+ \fb@adjheight
+ \else %
+ \egroup \fb@resto@set
+ \ifvoid\@tempboxa % it all fit after all
+| \message{box split at end! }%
+ \setbox\@tempboxa\box\tw@
+ \else % it really did split
+| \message{box split as expected. Its reboxed height is \the\ht\tw@. }%
+ \ifdim\wd\tw@>\z@
+ \centerline{\FrameCommand{\box\tw@}}% ??? \centerline bad idea
+ \else
+| \message{Zero width means likely blank. Don't frame it (guess)}%
+ \box\tw@
+ \fi
+ \hrule \@height\z@
+ \eject
+ \fb@adjheight
+ \put@frame
+ \fi\fi\fi\fi\fi
+ \ifvoid\@tempboxa\else
+ \centerline{\FrameCommand{\box\@tempboxa}}%
+ \nointerlineskip \null %{\showoutput \showlists}
+ \penalty-30 \vskip\topsep
+ \fi}
+
+\def\fb@adjheight{%
+ \vbox to\FrameHeightAdjust{}% get proper baseline skip from above.
+ \penalty\@M \nointerlineskip
+ \vskip-\FrameHeightAdjust
+ \penalty\@M} % useful for tops of pages
+
+\edef\zero@glue{\the\z@skip}
+
+\catcode`\|=\FrameRestore
+
+% Provide configuration commands:
+\providecommand\FrameCommand{\fboxrule=\FrameRule \fboxsep=\FrameSep \fbox}
+\@ifundefined{FrameRule}{\newdimen\FrameRule \FrameRule=\fboxrule}{}
+\@ifundefined{FrameSep} {\newdimen\FrameSep \FrameSep =3\fboxsep}{}
+
+% Height of frame above first baseline when frame starts a page:
+\providecommand\FrameHeightAdjust{6pt}
+
+% \FrameRestore has parts of \@parboxrestore. See how it is used in the
+% "settings" argument of \MakeFrame. Previous behavior can be restored by
+% using \@parboxrestore there, or redefining:
+% \makeatletter \renewcommand\FrameRestore{\@parboxrestore} \makeatother
+\def\FrameRestore{%
+ \let\if@nobreak\iffalse
+ \let\if@noskipsec\iffalse
+% \let\par\@@par ??
+ \let\-\@dischyph
+ \let\'\@acci\let\`\@accii\let\=\@acciii
+% \parindent\z@ \parskip\z@skip Definitely omit!
+% \everypar{}% ??
+ \linewidth\hsize
+% \@totalleftmargin\z@
+% \leftskip\z@skip \rightskip\z@skip \@rightskip\z@skip
+% \parfillskip\@flushglue \lineskip\normallineskip
+% \baselineskip\normalbaselineskip
+ \sloppy
+% \let\\\@normalcr
+}
+
+% Compatibility with previous versions (temporary!):
+\let\fram@d=\MakeFramed \let\endfram@d=\endMakeFramed
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%