AIM-CU / docs /build /latex /sphinxlatexshadowbox.sty
dhavalkadia-fda's picture
Upload 114 files
128403f verified
%% 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: sphinx<type>TextColor and
% spx@<type>@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