%% TOPIC AND CONTENTS BOXES % % change this info string if making any custom modification \ProvidesPackage{sphinxlatexshadowbox}[2024/07/28 v8.1.0 sphinxShadowBox] % Provides support for this output mark-up from Sphinx latex writer: % % - Environments: sphinxtopic, sphinxcontents, and sphinxsidebar. % % These wrappers replace at 8.1.0 former direct use of sphinxShadowBox % environment which did not allow separate styling. % % - Commands: \sphinxstyletopictitle, \sphinxstylecontentstitle, and % \sphinxstylesidebartitle. % % At 8.1.0 they default to use \sphinxdotitlerow whose definiion is done in % sphinxlatexadmonitions.sty. There is also \sphinxstylesidebarsubtitle % which does not use \sphinxdotitlerow. % % 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.sty % - \ifspx@inframed defined in sphinx.sty % - \sphinxdotitlerow from sphinxlatexadmonitions.sty % - \spx@boxes@fcolorbox@setup from sphinxpackageboxes.sty % \RequirePackage{framed} % Those are required either before or after by sphinx.sty anyhow, but for % clarity we list them here: \RequirePackage{sphinxlatexgraphics} \RequirePackage{sphinxpackagefootnote} \RequirePackage{sphinxlatexadmonitions} \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. % % At 8.1.0, sphinxShadowBox takes an optional argument #1 and uses it as % \spx@boxes@fcolorbox@setup{#1} rather than \spx@boxes@fcolorbox@setup{topic}. % Some hesitation whether to move this line to newly added sphinxtopic, % sphinxcontents and sphinxsidebar environmments. But anyhow the environment % also requires later knowing a few more things: sphinxTextColor and % spx@@texextras. % % The #1 defaulting to topic must be such that all parameters expected by % \spx@boxes@fcolorbox@setup actually do exist, see CSS options in sphinx.sty % which is what defines them for contents, topic, and sidebar. % % Fortunately the #1 is not needed in \end{sphinxShadowBox} so we don't have % to work around a LaTeX conception bug that such #1 can not be used as is in % the definition of the \end part of an environment. % % MEMO: the "shadow" is not really drawn directly by this environment but % indirectly via the configuration which is passed over to \spx@boxes@fcolorbox, % which is the macro creating frame and (perhaps but not necessarily) a shadow. \newenvironment{sphinxShadowBox}[1][topic]% {% \spx@boxes@fcolorbox@setup{#1}% % 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) \@nameuse{ifspx@#1@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 \@nameuse{ifspx@#1@withtextcolor}% \color{sphinx#1TextColor}% \fi \@nameuse{spx@#1@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 } % 8.1.0 \newenvironment{sphinxtopic} {\begin{sphinxShadowBox}[topic]}{\end{sphinxShadowBox}} \newenvironment{sphinxcontents} {\begin{sphinxShadowBox}[contents]}{\end{sphinxShadowBox}} % Arguably sphinxsidebar should rather use a wrapfig or similar environment % but this is so dysfunctional in LaTeX (except for self-written documents) % so we prefer to not venture into such a potential quagmire and keep the % legacy rendering using a full width display. \newenvironment{sphinxsidebar} {\begin{sphinxShadowBox}[sidebar]}{\end{sphinxShadowBox}} % TODO: decide if this should be in sphinxlatexstyletext.sty rather % % 8.1.0 styles topic/contents/sidebar with a title row, too. % Prior to 8.1.0, definitions use \protected\def but there does not seem % to be any reason so back to \newcommand. \newcommand*\sphinxstyletopictitle[1]{\sphinxdotitlerow{topic}{#1}} \newcommand*\sphinxstylecontentstitle[1]{\sphinxdotitlerow{contents}{#1}} \newcommand*\sphinxstylesidebartitle[1]{\sphinxdotitlerow{sidebar}{#1}} % No default color background for subtitle. The contents next are injected by % LaTeX writer after a blank line in source hence will start a new paragrpah. % The \sphinxAtStartPar here is only for coherence with other text paragraphs, % but does not have serious necessity (its general role is to allow hyphenation % for first word in narrow table cells). \newcommand*\sphinxstylesidebarsubtitle[1]{\sphinxAtStartPar\textbf{#1}} \endinput