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.
238 lines
9.9 KiB
238 lines
9.9 KiB
%% NOTICES AND ADMONITIONS
|
|
%
|
|
% change this info string if making any custom modification
|
|
\ProvidesFile{sphinxlatexadmonitions.sty}[2022/07/03 admonitions]
|
|
|
|
% Provides support for this output mark-up from Sphinx latex writer:
|
|
%
|
|
% - sphinxadmonition (environment)
|
|
% This is a dispatch supporting
|
|
%
|
|
% - note, hint, important, tip (via sphinxlightbox)
|
|
% - warning, caution, attention, danger, error (via sphinxheavybox)
|
|
%
|
|
% Each sphinx<notice name> environment can be redefined by user.
|
|
% The defaults are customizable via various colour and dimension
|
|
% settings, cf sphinx docs (latex customization).
|
|
%
|
|
% Requires:
|
|
\RequirePackage{sphinxpackageboxes}
|
|
\RequirePackage{framed}% used by sphinxheavybox
|
|
%
|
|
% Dependencies (they do not need to be defined at time of loading):
|
|
% - of course the various colour and dimension options handled via sphinx.sty
|
|
% - \sphinxstrong (for sphinxlightbox and sphinxheavybox)
|
|
% - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty
|
|
% - \savenotes/\spewnotes from sphinxpackagefootnote (for sphinxheavybox)
|
|
|
|
% Provides: (also in sphinxlatexliterals.sty)
|
|
\providecommand*\sphinxvspacefixafterfrenchlists{%
|
|
\ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi
|
|
}
|
|
|
|
% Some are quite plain
|
|
% the spx@notice@bordercolor etc are set in the sphinxadmonition environment
|
|
\newenvironment{sphinxlightbox}{%
|
|
\par
|
|
\noindent{\color{spx@notice@bordercolor}%
|
|
\rule{\linewidth}{\spx@notice@border}}\par\nobreak
|
|
{\parskip\z@skip\noindent}%
|
|
}
|
|
{%
|
|
% counteract previous possible negative skip (French lists!):
|
|
% (we can't cancel that any earlier \vskip introduced a potential pagebreak)
|
|
\sphinxvspacefixafterfrenchlists
|
|
\nobreak\vbox{\noindent\kern\@totalleftmargin
|
|
{\color{spx@notice@bordercolor}%
|
|
\rule[\dimexpr.4\baselineskip-\spx@notice@border\relax]
|
|
{\linewidth}{\spx@notice@border}}\hss}\allowbreak
|
|
}% end of sphinxlightbox environment definition
|
|
% may be renewenvironment'd by user for complete customization
|
|
\newenvironment{sphinxnote}[1]
|
|
{\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}}
|
|
\newenvironment{sphinxhint}[1]
|
|
{\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}}
|
|
\newenvironment{sphinximportant}[1]
|
|
{\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}}
|
|
\newenvironment{sphinxtip}[1]
|
|
{\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}}
|
|
% or just use the package options
|
|
% these are needed for common handling by notice environment of lightbox
|
|
% and heavybox but they are currently not used by lightbox environment
|
|
% and there is consequently no corresponding package option
|
|
\definecolor{sphinxnoteBgColor}{rgb}{1,1,1}
|
|
\definecolor{sphinxhintBgColor}{rgb}{1,1,1}
|
|
\definecolor{sphinximportantBgColor}{rgb}{1,1,1}
|
|
\definecolor{sphinxtipBgColor}{rgb}{1,1,1}
|
|
|
|
% Others get more distinction
|
|
\def\spx@admonitions@boxes@fcolorbox@setup{%
|
|
\spx@boxes@border@top \@nameuse{spx@\spx@noticetype @border@top}%
|
|
\spx@boxes@border@right \@nameuse{spx@\spx@noticetype @border@right}%
|
|
\spx@boxes@border@bottom\@nameuse{spx@\spx@noticetype @border@bottom}%
|
|
\spx@boxes@border@left \@nameuse{spx@\spx@noticetype @border@left}%
|
|
\spx@boxes@border \spx@notice@border
|
|
%
|
|
\spx@boxes@padding@top \@nameuse{spx@\spx@noticetype @padding@top}%
|
|
\spx@boxes@padding@right \@nameuse{spx@\spx@noticetype @padding@right}%
|
|
\spx@boxes@padding@bottom\@nameuse{spx@\spx@noticetype @padding@bottom}%
|
|
\spx@boxes@padding@left \@nameuse{spx@\spx@noticetype @padding@left}%
|
|
%
|
|
\spx@boxes@radius@topleft \@nameuse{spx@\spx@noticetype @radius@topleft}%
|
|
\spx@boxes@radius@topright \@nameuse{spx@\spx@noticetype @radius@topright}%
|
|
\spx@boxes@radius@bottomright \@nameuse{spx@\spx@noticetype @radius@bottomright}%
|
|
\spx@boxes@radius@bottomleft \@nameuse{spx@\spx@noticetype @radius@bottomleft}%
|
|
\relax
|
|
\iftrue\@nameuse{ifspx@\spx@noticetype @withshadow}%
|
|
\spx@boxes@withshadowtrue
|
|
\spx@boxes@shadow@xoffset \@nameuse{spx@\spx@noticetype @box@shadow@xoffset}%
|
|
\spx@boxes@shadow@yoffset \@nameuse{spx@\spx@noticetype @box@shadow@yoffset}\relax
|
|
\else
|
|
\spx@boxes@withshadowfalse
|
|
\fi\@nameuse{fi}%
|
|
\iftrue\@nameuse{ifspx@\spx@noticetype @insetshadow}%
|
|
\spx@boxes@insetshadowtrue
|
|
\else
|
|
\spx@boxes@insetshadowfalse
|
|
\fi\@nameuse{fi}%
|
|
\iftrue\@nameuse{ifspx@\spx@noticetype @withshadowcolor}%
|
|
\spx@boxes@withshadowcolortrue
|
|
\else
|
|
\spx@boxes@withshadowcolorfalse
|
|
\fi\@nameuse{fi}%
|
|
%
|
|
\iftrue\@nameuse{ifspx@\spx@noticetype @withbackgroundcolor}%
|
|
\spx@boxes@withbackgroundcolortrue
|
|
\else
|
|
\spx@boxes@withbackgroundcolorfalse
|
|
\fi\@nameuse{fi}%
|
|
\sphinxcolorlet{spx@boxes@backgroundcolor}{spx@notice@bgcolor}%
|
|
%
|
|
\iftrue\@nameuse{ifspx@\spx@noticetype @withbordercolor}%
|
|
\spx@boxes@withbordercolortrue
|
|
\else
|
|
\spx@boxes@withbordercolorfalse
|
|
\fi\@nameuse{fi}%
|
|
\sphinxcolorlet{spx@boxes@bordercolor}{spx@notice@bordercolor}%
|
|
%
|
|
\iftrue\@nameuse{ifspx@\spx@noticetype @withshadowcolor}%
|
|
\spx@boxes@withshadowcolortrue
|
|
\else
|
|
\spx@boxes@withshadowcolorfalse
|
|
\fi\@nameuse{fi}%
|
|
\sphinxcolorlet{spx@boxes@shadowcolor}{sphinx\spx@noticetype ShadowColor}%
|
|
}
|
|
% Code adapted from framed.sty's "snugshade" environment.
|
|
% Nesting works (inner frames do not allow page breaks).
|
|
\newenvironment{sphinxheavybox}{\par
|
|
\spx@admonitions@boxes@fcolorbox@setup
|
|
% Those are used by sphinxVerbatim if the \ifspx@inframed boolean is true
|
|
\setlength{\FrameRule}{0.5\dimexpr\spx@boxes@border@top+\spx@boxes@border@bottom\relax}%
|
|
% MEMO: prior to 5.1.0 \FrameSep was determined as 0.6\baselineskip -
|
|
% \FrameRule, and there was no possibility for user to adjust padding.
|
|
% Then \fcolorbox was used with \fboxrule set to \FrameRule and \fboxsep
|
|
% set to \FrameSep.
|
|
% The 5.1.0 default calculation of padding parameters maintains PDF output
|
|
% identical to legacy behaviour, as long as padding is not set by user.
|
|
\setlength{\FrameSep}{0.5\dimexpr\spx@boxes@padding@top+\spx@boxes@padding@bottom\relax}%
|
|
\advance\spx@image@maxheight
|
|
-\dimexpr\spx@boxes@border@top+\spx@boxes@border@bottom
|
|
+\spx@boxes@padding@top+\spx@boxes@padding@bottom
|
|
+\baselineskip\relax % will happen again if nested, needed indeed!
|
|
% MEMO: the next comment is before boxing was extended to allow padding and
|
|
% multiple border-widths, not to mention shadows...
|
|
% configure framed.sty's parameters to obtain same vertical spacing
|
|
% as for "light" boxes. We need for this to manually insert parskip glue and
|
|
% revert a skip done by framed before the frame.
|
|
\ltx@ifundefined{OuterFrameSep}{}{\OuterFrameSep\z@skip}%
|
|
\vspace{\FrameHeightAdjust}
|
|
% copied/adapted from framed.sty's snugshade
|
|
% but now using in place of \fcolorbox the Sphinx sophisticated own
|
|
\def\FrameCommand##1{\hskip\@totalleftmargin
|
|
\ifspx@boxes@withshadow
|
|
\ifspx@boxes@insetshadow\else
|
|
\ifdim\spx@boxes@shadow@xoffset<\z@\hskip\spx@boxes@shadow@xoffset\relax
|
|
\fi
|
|
\fi
|
|
\fi
|
|
\if1% use rounded boxes only if needed and possible
|
|
\ifdim\spx@boxes@radius@topleft >\z@0\fi
|
|
\ifdim\spx@boxes@radius@topright >\z@0\fi
|
|
\ifdim\spx@boxes@radius@bottomright>\z@0\fi
|
|
\ifdim\spx@boxes@radius@bottomleft >\z@0\fi
|
|
1\spx@boxes@fcolorbox{##1}%
|
|
\else
|
|
\spx@ifpackageloaded@pictiie
|
|
{\ifspx@boxes@insetshadow
|
|
\spx@boxes@fcolorbox{##1}%
|
|
\else
|
|
\spx@boxes@fcolorbox@rounded{##1}%
|
|
\fi}%
|
|
{\spx@boxes@fcolorbox{##1}}%
|
|
\fi
|
|
\ifspx@boxes@withshadow
|
|
\ifspx@boxes@insetshadow\else
|
|
\ifdim\spx@boxes@shadow@xoffset>\z@\hskip-\spx@boxes@shadow@xoffset\relax
|
|
\fi
|
|
\fi
|
|
\fi
|
|
\hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}%
|
|
\savenotes
|
|
% use a minipage if we are already inside a framed environment
|
|
\ifspx@inframed
|
|
\noindent\begin{minipage}{\linewidth}
|
|
\else
|
|
% handle case where notice is first thing in a list item (or is quoted)
|
|
\if@inlabel
|
|
\noindent\par\vspace{-\baselineskip}
|
|
\else
|
|
\vspace{\parskip}
|
|
\fi
|
|
\fi
|
|
\MakeFramed {\spx@inframedtrue
|
|
\advance\hsize-\width \@totalleftmargin\z@ \linewidth\hsize
|
|
% minipage initialization copied from LaTeX source code.
|
|
\@pboxswfalse
|
|
\let\@listdepth\@mplistdepth \@mplistdepth\z@
|
|
\@minipagerestore
|
|
\@setminipage }%
|
|
\color@begingroup % workaround to an upstream framed.sty bug
|
|
}
|
|
{%
|
|
\par\unskip
|
|
\color@endgroup % matches the \color@begingroup
|
|
\@minipagefalse
|
|
\endMakeFramed
|
|
\ifspx@inframed\end{minipage}\fi
|
|
% set footnotes at bottom of page
|
|
\spewnotes
|
|
% arrange for similar spacing below frame as for "light" boxes.
|
|
\vskip .4\baselineskip
|
|
}% end of sphinxheavybox environment definition
|
|
% may be renewenvironment'd by user for complete customization
|
|
\newenvironment{sphinxwarning}[1]
|
|
{\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
|
|
\newenvironment{sphinxcaution}[1]
|
|
{\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
|
|
\newenvironment{sphinxattention}[1]
|
|
{\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
|
|
\newenvironment{sphinxdanger}[1]
|
|
{\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
|
|
\newenvironment{sphinxerror}[1]
|
|
{\begin{sphinxheavybox}\sphinxstrong{#1} }{\end{sphinxheavybox}}
|
|
% or just use package options
|
|
|
|
% the main dispatch for all types of notices
|
|
\newenvironment{sphinxadmonition}[2]{% #1=type, #2=heading
|
|
% can't use #1 directly in definition of end part
|
|
\def\spx@noticetype {#1}%
|
|
% set parameters of heavybox/lightbox
|
|
\sphinxcolorlet{spx@notice@bordercolor}{sphinx#1BorderColor}%
|
|
\sphinxcolorlet{spx@notice@bgcolor}{sphinx#1BgColor}%
|
|
\spx@notice@border \dimexpr\csname spx@opt@#1border\endcsname\relax
|
|
% start specific environment, passing the heading as argument
|
|
\begin{sphinx#1}{#2}}
|
|
% workaround some LaTeX "feature" of \end command
|
|
{\edef\spx@temp{\noexpand\end{sphinx\spx@noticetype}}\spx@temp}
|
|
|
|
\endinput
|
|
|