149 lines
6.1 KiB
TeX
149 lines
6.1 KiB
TeX
%% NOTICES AND ADMONITIONS
|
|
%
|
|
% change this info string if making any custom modification
|
|
\ProvidesFile{sphinxlatexadmonitions.sty}[2021/01/27 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{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
|
|
% Code adapted from framed.sty's "snugshade" environment.
|
|
% Nesting works (inner frames do not allow page breaks).
|
|
\newenvironment{sphinxheavybox}{\par
|
|
\setlength{\FrameRule}{\spx@notice@border}%
|
|
\setlength{\FrameSep}{\dimexpr.6\baselineskip-\FrameRule\relax}
|
|
\advance\spx@image@maxheight
|
|
-\dimexpr2\FrameRule
|
|
+2\FrameSep
|
|
+\baselineskip\relax % will happen again if nested, needed indeed!
|
|
% 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
|
|
\def\FrameCommand##1{\hskip\@totalleftmargin
|
|
\fboxsep\FrameSep \fboxrule\FrameRule
|
|
\fcolorbox{spx@notice@bordercolor}{spx@notice@bgcolor}{##1}%
|
|
\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 }%
|
|
}
|
|
{%
|
|
\par\unskip
|
|
\@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 \colorlet of xcolor (if at all loaded) is overkill for our use case
|
|
\newcommand{\sphinxcolorlet}[2]
|
|
{\expandafter\let\csname\@backslashchar color@#1\expandafter\endcsname
|
|
\csname\@backslashchar color@#2\endcsname }
|
|
|
|
% 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
|