| %% 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 |