You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
6.5 KiB
166 lines
6.5 KiB
8 months ago
|
%% TOPIC AND CONTENTS BOXES
|
||
|
%
|
||
|
% change this info string if making any custom modification
|
||
|
\ProvidesFile{sphinxlatexshadowbox.sty}[2022/07/03 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}
|
||
|
|
||
|
\def\spx@shadowbox@boxes@fcolorbox@setup{%
|
||
|
%
|
||
|
\spx@boxes@border@top \spx@topic@border@top
|
||
|
\spx@boxes@border@right \spx@topic@border@right
|
||
|
\spx@boxes@border@bottom\spx@topic@border@bottom
|
||
|
\spx@boxes@border@left \spx@topic@border@left
|
||
|
\spx@boxes@border \spxdimen@topic@border
|
||
|
%
|
||
|
\spx@boxes@padding@top \spx@topic@padding@top
|
||
|
\spx@boxes@padding@right \spx@topic@padding@right
|
||
|
\spx@boxes@padding@bottom\spx@topic@padding@bottom
|
||
|
\spx@boxes@padding@left \spx@topic@padding@left
|
||
|
%
|
||
|
\spx@boxes@radius@topleft \spx@topic@radius@topleft
|
||
|
\spx@boxes@radius@topright \spx@topic@radius@topright
|
||
|
\spx@boxes@radius@bottomright \spx@topic@radius@bottomright
|
||
|
\spx@boxes@radius@bottomleft \spx@topic@radius@bottomleft\relax
|
||
|
%
|
||
|
\ifspx@topic@withshadow
|
||
|
\spx@boxes@withshadowtrue
|
||
|
\spx@boxes@shadow@xoffset \spx@topic@shadow@xoffset
|
||
|
\spx@boxes@shadow@yoffset \spx@topic@shadow@yoffset\relax
|
||
|
\else
|
||
|
\spx@boxes@withshadowfalse
|
||
|
\fi
|
||
|
\ifspx@topic@insetshadow\spx@boxes@insetshadowtrue\else
|
||
|
\spx@boxes@insetshadowfalse\fi
|
||
|
\ifspx@topic@withshadowcolor\spx@boxes@withshadowcolortrue\else
|
||
|
\spx@boxes@withshadowcolorfalse\fi
|
||
|
%
|
||
|
\ifspx@topic@withbackgroundcolor\spx@boxes@withbackgroundcolortrue\else
|
||
|
\spx@boxes@withbackgroundcolorfalse\fi
|
||
|
\sphinxcolorlet{spx@boxes@backgroundcolor}{sphinxTopicBackgroundColor}%
|
||
|
%
|
||
|
\ifspx@topic@withbordercolor\spx@boxes@withbordercolortrue\else
|
||
|
\spx@boxes@withbordercolorfalse\fi
|
||
|
\sphinxcolorlet{spx@boxes@bordercolor}{sphinxTopicBorderColor}%
|
||
|
%
|
||
|
\ifspx@topic@withshadowcolor\spx@boxes@withshadowcolortrue\else
|
||
|
\spx@boxes@withshadowcolorfalse\fi
|
||
|
\sphinxcolorlet{spx@boxes@shadowcolor}{sphinxTopicShadowColor}%
|
||
|
}%
|
||
|
|
||
|
% At 5.1.0 the code formerly here has been refactored and incorporated
|
||
|
% into more powerful \spx@boxes@fcolorbox from sphinxpackageboxes.sty
|
||
|
\long\def\spx@ShadowFBox#1{%
|
||
|
\leavevmode
|
||
|
\setbox\z@\hbox{#1}%
|
||
|
\ifspx@topic@withshadow
|
||
|
\ifspx@topic@insetshadow\else
|
||
|
\ifdim\spx@topic@shadow@xoffset<\z@\hskip\spx@topic@shadow@xoffset\relax
|
||
|
\fi
|
||
|
\fi
|
||
|
\fi
|
||
|
\if1% use rounded boxes only if needed and possible
|
||
|
\ifdim\spx@topic@radius@topleft >\z@0\fi
|
||
|
\ifdim\spx@topic@radius@topright >\z@0\fi
|
||
|
\ifdim\spx@topic@radius@bottomright>\z@0\fi
|
||
|
\ifdim\spx@topic@radius@bottomleft >\z@0\fi
|
||
|
1\spx@boxes@fcolorbox{\box\z@}%
|
||
|
\else
|
||
|
\spx@ifpackageloaded@pictiie
|
||
|
{\ifspx@topic@insetshadow
|
||
|
\spx@boxes@fcolorbox{\box\z@}%
|
||
|
\else
|
||
|
\spx@boxes@fcolorbox@rounded{\box\z@}%
|
||
|
\fi}%
|
||
|
{\spx@boxes@fcolorbox{\box\z@}}%
|
||
|
\fi
|
||
|
\ifspx@topic@withshadow
|
||
|
\ifspx@topic@insetshadow\else
|
||
|
\ifdim\spx@topic@shadow@xoffset>\z@\hskip\spx@topic@shadow@xoffset\relax
|
||
|
\fi
|
||
|
\fi
|
||
|
\fi
|
||
|
}
|
||
|
|
||
|
% 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@shadowbox@boxes@fcolorbox@setup
|
||
|
\def\FrameCommand {\spx@ShadowFBox }%
|
||
|
\advance\spx@image@maxheight
|
||
|
-\dimexpr\spx@topic@border@top+\spx@topic@border@bottom
|
||
|
+\spx@topic@padding@top+\spx@topic@padding@bottom
|
||
|
+\ifdim\spx@topic@shadow@yoffset<\z@-\fi\spx@topic@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 (=2shadowsep+2shadowrule)
|
||
|
% 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
|
||
|
}%
|
||
|
{% 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
|