summaryrefslogtreecommitdiffstats
path: root/sphinx/texinputs/sphinxlatexshadowbox.sty
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/texinputs/sphinxlatexshadowbox.sty')
-rw-r--r--sphinx/texinputs/sphinxlatexshadowbox.sty116
1 files changed, 116 insertions, 0 deletions
diff --git a/sphinx/texinputs/sphinxlatexshadowbox.sty b/sphinx/texinputs/sphinxlatexshadowbox.sty
new file mode 100644
index 0000000..a2a1a0e
--- /dev/null
+++ b/sphinx/texinputs/sphinxlatexshadowbox.sty
@@ -0,0 +1,116 @@
+%% TOPIC AND CONTENTS BOXES
+%
+% change this info string if making any custom modification
+\ProvidesFile{sphinxlatexshadowbox.sty}[2023/03/19 sphinxShadowBox]
+
+% Provides support for this output mark-up from Sphinx latex writer:
+%
+% - sphinxShadowBox (environment)
+%
+% Dependencies (they do not need to be defined at time of loading):
+%
+% - of course the various colour and dimension options handled via sphinx.sty
+% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty
+% - \savenotes/\spewnotes from sphinxpackagefootnote
+% - \ifspx@inframed defined in sphinx.sty
+%
+% Requires:
+\RequirePackage{framed}
+\RequirePackage{sphinxpackageboxes}
+
+% At 5.1.0 the code formerly here in a definition of \spx@ShadowFBox has been
+% refactored to hand over to a more powerful \spx@boxes@fcolorbox provided by
+% file sphinxpackageboxes.sty, it can draw rounded corners and add a background
+% color.
+
+% At 6.2.0, \spx@ShadowFBox is so much simplified that it is now not
+% separately defined but directly incorporated into the \FrameCommand
+% definition done by sphinxShadowBox environment below.
+
+% Use framed.sty \MakeFramed/\endMakeFramed to allow page breaks for topic
+% boxes. Originally Sphinx used \shadowbox from fancybox.sty but it did not
+% allow pagebreaks (which was problematic for "contents" directive if there
+% are many subsections).
+%
+% Docutils does not allow topic to be nested within topics or other body
+% elements. But the LaTeX code here does allow it:
+%
+% - a topic inside another topic would be rendered in a minipage (thus not
+% allowing pagebreaks). Its external frame would adapt perfectly to
+% the *current (smaller) width for text*.
+%
+% - a topic inside (nested) lists or quote environments would have its frame
+% take the *full width* of the page, but its text contents on the other hand
+% would obey exactly the current indentation plus inner separation. This is
+% in contrast with the framing used for literal blocks, also based, but in a
+% more sophisticated way on usage of \MakeFramed/\endMakeFramed, and
+% adjusting to current text indentation.
+\newenvironment{sphinxShadowBox}
+ {%
+ \spx@boxes@fcolorbox@setup{topic}%
+ % we will use the dimen registers from sphinxpackageboxes.sty which now hold
+ % the values from options related to topic/contents
+ % MEMO: \spx@boxes@fcolorbox creates an \hbox but does not quit vertical
+ % mode; but in context of framed.sty's \FrameCommand TeX is already
+ % in restricted horizontal mode, so no need for a \leavevmode here.
+ \def\FrameCommand {\spx@boxes@fcolorbox}%
+ % 6.2.0 adds support for div.topic_box-decoration-break=slice.
+ % (it is yet undecided if slice style should inhibit a bottom shadow)
+ \ifspx@topic@border@open
+ \def\FirstFrameCommand
+ {\spx@boxes@fcolorbox@setup@openbottom\FrameCommand}%
+ \def\MidFrameCommand
+ {\spx@boxes@fcolorbox@setup@openboth \FrameCommand}%
+ \def\LastFrameCommand
+ {\spx@boxes@fcolorbox@setup@opentop \FrameCommand}%
+ \fi
+ \advance\spx@image@maxheight
+ -\dimexpr\spx@boxes@border@top+\spx@boxes@border@bottom
+ +\spx@boxes@padding@top+\spx@boxes@padding@bottom
+ +\ifdim\spx@boxes@shadow@yoffset<\z@-\fi\spx@boxes@shadow@yoffset
+ +\baselineskip\relax
+ % configure framed.sty not to add extra vertical spacing
+ \ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}%
+ % the \trivlist will add the vertical spacing on top and bottom which is
+ % typical of center environment as used in Sphinx <= 1.4.1
+ % the \noindent has the effet of an extra blank line on top, to
+ % imitate closely the layout from Sphinx <= 1.4.1; the \FrameHeightAdjust
+ % will put top part of frame on this baseline.
+ \def\FrameHeightAdjust {\baselineskip}%
+ % use package footnote to handle footnotes
+ \savenotes
+ \trivlist\item\noindent
+ % use a minipage if we are already inside a framed environment
+ \ifspx@inframed\begin{minipage}{\linewidth}\fi
+ \MakeFramed {\spx@inframedtrue
+ % framed.sty puts into "\width" the added width (padding+border widths)
+ % adjust \hsize to what the contents must use
+ \advance\hsize-\width
+ % adjust LaTeX parameters to behave properly in indented/quoted contexts
+ \FrameRestore
+ % typeset the contents as in a minipage (Sphinx <= 1.4.1 used a minipage and
+ % itemize/enumerate are therein typeset more tightly, we want to keep
+ % that). We copy-paste from LaTeX source code but don't do a real minipage.
+ \@pboxswfalse
+ \let\@listdepth\@mplistdepth \@mplistdepth\z@
+ \@minipagerestore
+ \@setminipage
+ }%
+ \color@begingroup % workaround upstream framed.sty bug
+ \ifspx@topic@withtextcolor
+ \color{sphinxtopicTextColor}%
+ \fi
+ \spx@topic@TeXextras
+ }%
+ {% insert the "endminipage" code
+ \par\unskip
+ \color@endgroup % matches the \color@begingroup
+ \@minipagefalse
+ \endMakeFramed
+ \ifspx@inframed\end{minipage}\fi
+ \endtrivlist
+ % output the stored footnotes
+ \spewnotes
+ }
+
+\endinput