%% NOTICES AND ADMONITIONS % % change this info string if making any custom modification \ProvidesFile{sphinxlatexadmonitions.sty}[2024/07/01 v7.4.0 admonitions] % Provides support for this output mark-up from Sphinx latex writer: % % - sphinxseealso environment added at 6.1.0. % % At 7.4.0 it too now uses sphinxheavybox, and has the same associated % sphinxsetup CSS keys as admonitions do. % % - sphinxtodo environment added at 7.4.0. % % - sphinxadmonition (environment) % This is a dispatch which formerly configured % % - note, hint, important, tip to use sphinxlightbox (or optionally % sphinxheavybox since 6.2.0), % - warning, caution, attention, danger, error to use sphinxheavybox. % % At 7.4.0 all admonitions use sphinxheavybox. % % - All environments sphinxnote, sphinxwarning, etc... can be redefined as % will by user. Thay have a single parameter #1 which is the title. % % - The default sphinxnote, sphinxwarning, etc... use associated % one-argument macros \sphinxstylenotetitle, \sphinxstylewarningtitle, etc % which can be redefined. Their default is to use \sphinxdotitlerowwithicon % to typeset the title in a coloured header row at top of the % admonition. (new with 7.4.0) % % The sphinxlightbox environment is kept for backward compatiblity, for user % custom code which used it via custom definitions done in preamble or via % raw latex directive. % MEMO: here is for example how sphinxnote was formerly defined: % (where #1 is the localized string Note, followed with a colon) % \newenvironment{sphinxnote}[1] % {\begin{sphinxlightbox}\sphinxstrong{#1} } % {\end{sphinxlightbox}} % Use this if you want to revert the 7.4.0 switch to usage of sphinxheavybox. % (the 7.4.0 redefined \sphinxstylenotetitle will not work in sphinxlightbox, % so \sphinxstrong{#1} which was its former default is used above). % % Requires: \RequirePackage{sphinxpackageboxes} % 7.4.0 removes unneeded \spx@boxes@border \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 % % - dimension register \spx@image@maxheight from sphinxlatexgraphics.sty % % - \savenotes/\spewnotes from sphinxpackagefootnote (for sphinxheavybox) % Provides: (also in sphinxlatexliterals.sty) % Only needed here by legacy (deprecated) sphinxlightbox environment. \providecommand*\sphinxvspacefixafterfrenchlists{% \ifvmode\ifdim\lastskip<\z@ \vskip\parskip\fi\else\par\fi } % This \dimen register is a legacy relic from Sphinx 1.5 which is used now % only for sphinxlightbox. It is set in the sphinxadmonition environment. \newdimen\spx@notice@border % sphinxlightbox is now also a legacy relic, not used by Sphinx anymore \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 % Since 1.5 these environments are named individually sphinxnote, sphinxhint, % etc... to allow user to redefine them entirely. % % The Sphinx definitions for note/hint/important/tip notices were done like % this, prior to 6.2.0: % % \newenvironment{sphinxhint}[1] % {\begin{sphinxlightbox}\sphinxstrong{#1} }{\end{sphinxlightbox}} % % Then from 6.2.0 to 7.4.0 (exclusive) a more complex definition decided % to use either sphinxlightbox or sphinxheavybox according to whether % some CSS-like options had been used, for example for a background color. % % 6.2.0 also added one layer of mark-up via \sphinxnotetitle etc..., because % the former \sphinxstrong{#1} used a too generic \sphinxstrong. % % At 7.4.0, sphinxheavybox environment is default for all types of notices % and also for the seealso and todo directives. % % Code adapted from framed.sty's "snugshade" environment. % Nesting works (inner frames do not allow page breaks). \newenvironment{sphinxheavybox}{\par % (MEMO: it is not a problem here if there is no sphinxShadowColor, % as it used only if set) \spx@boxes@fcolorbox@setup{\spx@noticetype}% % 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}% % "setup" macro has prepared the \spx@boxes@... dimen registers \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 % "setup" macro MUST have been called before \spx@boxes@fcolorbox{##1}% \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth }% % 6.2.0 adds support for div._box-decoration-break=slice. % (it is yet undecided if slice style should inhibit a bottom shadow) \csname ifspx@\spx@noticetype @border@open\endcsname \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 \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 % - Since 1.5 these environments are named individually to allow user to % redefine them entirely. % % - Since 5.1.0, sphinxheavybox is more versatile and four border widths, four % padding widths, four corner radii, optional shadow, and three colors can all % be modified via CSS-named alike options. % % - Since 6.2.0, also note/hint/important/tip notices can use these options % and then they go automatically via sphinxheavybox. If only the legacy options % are used, they keep using sphinxlightbox. % % - Since 6.2.0, \sphinxwarningtitle etc... add one level of mark-up (they % expand to \sphinxstrong{#1} which was former hard-coded mark-up). % Example: % \renewcommand{\sphinxwarningtitle}[1]{\textbf{#1}\par\smallskip % {\color{sphinxwarningBorderColor}\hrule height1pt}\smallskip} % % - Since 7.4.0, all types of notices use sphinxheavybox and the default % for \sphinxstyletitle is mapped to using \sphinxdotitlerowwithicon{} % % MEMO: except for the generic admonition directive (which uses "note" type) % the argument #1 in these environments has a postfixed colon originating % in Sphinx LaTeX writer legacy code. The % \sphinxremovefinalcolon utility in sphinxlatexstyletext.sty can be used as % \sphinxremovefinalcolon{#1} from inside the definitions of % \sphinxstylenotetitle et al. commands. % Important: even prior to 5.1.0 it was not really possible to use directly % sphinxheavybox if not triggered from sphinxadmonition, because some % parameters were defined in sphinxadmonition. This meant that the % sphinxwarning, sphinxcaution etc... environments (defined below) could not % be used directly in a document, they had to be triggered via % sphinxadmonition. The sole data since 5.1.0 needed by sphinxheavybox is the % type of the notice which sphinxadmonition stores into \spx@noticetype. % % In order to facilitate recycling or imitation of the sphinx % environments, 7.4.0 inserts an extra \def\spx@noticetype{} in their % definitions, so that they can be used independently of sphinxadmonition % dispatcher. % % MEMO: direct usage of these environments does not execute the div._TeXextras % and div._TexColor code, there are only done from the sphinxadmonition wrapper. \newenvironment{sphinxnote}[1] {\def\spx@noticetype{note}\begin{sphinxheavybox}\sphinxstylenotetitle{#1}} {\end{sphinxheavybox}} \newenvironment{sphinxhint}[1] {\def\spx@noticetype{hint}\begin{sphinxheavybox}\sphinxstylehinttitle{#1}} {\end{sphinxheavybox}} \newenvironment{sphinxtip}[1] {\def\spx@noticetype{tip}\begin{sphinxheavybox}\sphinxstyletiptitle{#1}} {\end{sphinxheavybox}} \newenvironment{sphinximportant}[1] {\def\spx@noticetype{important}\begin{sphinxheavybox}\sphinxstyleimportanttitle{#1}} {\end{sphinxheavybox}} \newenvironment{sphinxwarning}[1] {\def\spx@noticetype{warning}\begin{sphinxheavybox}\sphinxstylewarningtitle{#1}} {\end{sphinxheavybox}} \newenvironment{sphinxcaution}[1] {\def\spx@noticetype{caution}\begin{sphinxheavybox}\sphinxstylecautiontitle{#1}} {\end{sphinxheavybox}} \newenvironment{sphinxattention}[1] {\def\spx@noticetype{attention}\begin{sphinxheavybox}\sphinxstyleattentiontitle{#1}} {\end{sphinxheavybox}} \newenvironment{sphinxdanger}[1] {\def\spx@noticetype{danger}\begin{sphinxheavybox}\sphinxstyledangertitle{#1}} {\end{sphinxheavybox}} \newenvironment{sphinxerror}[1] {\def\spx@noticetype{error}\begin{sphinxheavybox}\sphinxstyleerrortitle{#1}} {\end{sphinxheavybox}} % The "see also" was quite plain until 7.4.0 as it simply did % \newenvironment{sphinxseealso}[1]{\sphinxstyleseealsotitle{#1}}{} % Here we need to manually insert execution of div.seealso_TeX{color,extras} values \newenvironment{sphinxseealso}[1] {\def\spx@noticetype{seealso}% \begin{sphinxheavybox}\sphinxstyleseealsotitle{#1}% \ifspx@seealso@withtextcolor\color{sphinxseealsoTextColor}\fi \spx@seealso@TeXextras } {\end{sphinxheavybox}} % There was no sphinxtodo environment until 7.4.0 because sphinx.ext.todo % generated \begin{sphinxadmonition}{note}{Todo:} mark-up. \newcounter{sphinxtodo}% to provide targets from todolist directive output \newenvironment{sphinxtodo}[1] {\refstepcounter{sphinxtodo}\def\spx@noticetype{todo}% \begin{sphinxheavybox}\sphinxstyletodotitle{#1}% \ifspx@todo@withtextcolor\color{sphinxtodoTextColor}\fi \spx@todo@TeXextras } {\end{sphinxheavybox}} % 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}% % those next three are a remnant of legacy code; they are not used at % all by sphinxheavybox, and their usage could be disposed of by sphinxlightbox % but we keep for backward compatibility and also because it may be simpler % for user redefinitions to employ for example "spx@notice@bgcolor" and not % the more bulky "sphinx\spx@noticetype BgColor". \sphinxcolorlet{spx@notice@bordercolor}{sphinx#1BorderColor}% \sphinxcolorlet{spx@notice@bgcolor}{sphinx#1BgColor}% % At 7.4.0 there are no \spx@@boder macros anymore only top, left, % bottom, right. For this legacy \spx@notice@border only needed by % sphinxlightbox (which is not used by own Sphinx environments anymore) % we thus use here @top \spx@notice@border \dimexpr\csname spx@#1@border@top\endcsname\relax % trigger the sphinx environment, #2=heading is passed as argument \begin{sphinx#1}{#2}% % MEMO: the heading #2 will be typeset before the next lines are executed % 6.2.0 support of div._TeX{color,extras} options \csname ifspx@\spx@noticetype @withtextcolor\endcsname \color{sphinx\spx@noticetype TextColor}% \fi % Other code to be executed at start of contents (after title) \csname spx@\spx@noticetype @TeXextras\endcsname } % workaround some LaTeX "feature" of \end command (i.e. can't use "sphinx#1" here) {\edef\spx@temp{\noexpand\end{sphinx\spx@noticetype}}\spx@temp} \newcommand\sphinxtitlerowtoppadding{5pt} \newcommand\sphinxtitlerowbottompadding{3pt} \newcommand\sphinxtitlerowaftericonspacecmd{\hskip0.5em\relax} \newcommand\sphinxdotitlerowwithicon[2]{% #1=type, #2=heading (without final colon) \begingroup \kern-\spx@boxes@padding@top \parskip\z@skip % the \parskip business is a workaround to a vertical % glue issue showing in LaTeX earlier than 2023-06-01 \noindent \kern-\spx@boxes@padding@left % must have been configured by a prior % \spx@boxes@fcolorbox@setup{} % inherit settings from the enclosing box and modify what is needed \spx@boxes@border@top =\z@ \spx@boxes@border@right =\z@ \spx@boxes@border@bottom =\z@ \spx@boxes@border@left =\z@ \spx@boxes@radius@bottomright@x=\z@ \spx@boxes@radius@bottomright@y=\z@ \spx@boxes@radius@bottomleft@x=\z@ \spx@boxes@radius@bottomleft@x=\z@ \spx@boxes@padding@top =\sphinxtitlerowtoppadding\relax \spx@boxes@padding@bottom=\sphinxtitlerowbottompadding\relax \spx@boxes@withshadowfalse \sphinxcolorlet{spx@boxes@backgroundcolor}{sphinx#1TtlBgColor}% \spx@boxes@fcolorbox{% \makebox[\linewidth][l]{% \textcolor{sphinx#1TtlFgColor}{% \@nameuse{sphinx#1TtlIcon}% % This macro is located here and not after the closing brace % for reasons of fall-back \spx@faIcon definition in sphinx.sty % in case fontawesome5 package not found. \sphinxtitlerowaftericonspacecmd }% \sphinxstrong{#2}% \strut}% }% \kern-\spx@boxes@padding@right \par \endgroup \vskip-\parskip \kern\spx@boxes@padding@top } % #1 holds the localized name of the notice, postfixed with a colon. % \sphinxremovefinalcolon{#1} will typeset #1 without the colon. % Legacy definitions (done in sphinxlatexstyletext.sty) were all using % a boring plain \sphinxstrong{#1}, now we use a coloured title row. \newcommand\sphinxstylenotetitle [1]{\sphinxdotitlerowwithicon{note}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstylehinttitle [1]{\sphinxdotitlerowwithicon{hint}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstyleimportanttitle[1]{\sphinxdotitlerowwithicon{important}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstyletiptitle [1]{\sphinxdotitlerowwithicon{tip}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstylewarningtitle [1]{\sphinxdotitlerowwithicon{warning}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstylecautiontitle [1]{\sphinxdotitlerowwithicon{caution}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstyleattentiontitle[1]{\sphinxdotitlerowwithicon{attention}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstyledangertitle [1]{\sphinxdotitlerowwithicon{danger}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstyleerrortitle [1]{\sphinxdotitlerowwithicon{error}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstyleseealsotitle [1]{\sphinxdotitlerowwithicon{seealso}{\sphinxremovefinalcolon{#1}}} \newcommand\sphinxstyletodotitle [1]{\sphinxdotitlerowwithicon{todo}{\sphinxremovefinalcolon{#1}}} % % A utility to remove a final colon. Removing last token is not easy in % LaTeX, and there are additional complications: % - some languages will make the : "active" in document body, % - the generic admonition ends up using "note", so for \sphinxnotetitle to % use it safely, the utility has to allow an input not having any final colon. % - a bit far-fetched but maybe there is more than one colon inside the input % (possible from a generic admonition title). % Hence the scary code. \newcommand\sphinxremovefinalcolon[1]{% #1 is the "active" : TeX token % Prior to 7.4.0 this was defined with \protected\def but we do not % see what usefulness this could have. \renewcommand\sphinxremovefinalcolon[1]{% % complications due to : possibly "active" \begingroup\ifnum\catcode`:=\active \def\x####1#1\relax{####1}% \else\def\x####1:\relax{####1}\fi \expandafter\endgroup\x##1\relax % trick to let \x work also if input ##1 has no ending colon \@gobblefour#1\relax:\relax\relax\relax }% }% end of wrapper to inject active : \begingroup\catcode`:\active\expandafter\endgroup\sphinxremovefinalcolon: \endinput