Skip to content

Commit

Permalink
Merge pull request #10619 from jfbu/latex_coloredshadows
Browse files Browse the repository at this point in the history
LaTeX: refactor sphinxShadowBox to allow colors for frame and shadow
  • Loading branch information
jfbu committed Jul 3, 2022
2 parents a9cd517 + 0d3f606 commit aae64ba
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 20 deletions.
16 changes: 15 additions & 1 deletion doc/latex.rst
Expand Up @@ -846,7 +846,7 @@ Do not use quotes to enclose values, whether numerical or strings.
Default: ``5pt``

``shadowsize``
The width of the lateral "shadow" to the right.
The width of the lateral "shadow" to the right and bottom.

Default: ``4pt``

Expand All @@ -855,6 +855,20 @@ Do not use quotes to enclose values, whether numerical or strings.

Default: ``\fboxrule``

``shadowBorderColor``
The color of the frame around :dudir:`topic` boxes.

Default: ``{rgb}{0,0,0}`` (black)

.. versionadded:: 5.1.0

``shadowShadowColor``
The color of the lateral "shadow" to the right and bottom.

Default: ``{rgb}{0,0,0}`` (black)

.. versionadded:: 5.1.0

|notebdcolors|
The colour for the two horizontal rules used by Sphinx in LaTeX for styling
a :dudir:`note` type admonition.
Expand Down
5 changes: 4 additions & 1 deletion sphinx/texinputs/sphinx.sty
Expand Up @@ -6,7 +6,7 @@
%

\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesPackage{sphinx}[2021/01/27 v4.0.0 LaTeX package (Sphinx markup)]
\ProvidesPackage{sphinx}[2022/06/30 v5.1.0 LaTeX package (Sphinx markup)]

% provides \ltx@ifundefined
% (many packages load ltxcmds: graphicx does for pdftex and lualatex but
Expand Down Expand Up @@ -154,6 +154,9 @@
}%
% Default color chosen to be as in minted.sty LaTeX package!
\sphinxDeclareSphinxColorOption{VerbatimHighlightColor}{{rgb}{0.878,1,1}}
% topic and contents boxes
\sphinxDeclareSphinxColorOption{shadowBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{shadowShadowColor}{{rgb}{0,0,0}}
% admonition boxes, "light" style
\sphinxDeclareSphinxColorOption{noteBorderColor}{{rgb}{0,0,0}}
\sphinxDeclareSphinxColorOption{hintBorderColor}{{rgb}{0,0,0}}
Expand Down
88 changes: 70 additions & 18 deletions sphinx/texinputs/sphinxlatexshadowbox.sty
@@ -1,7 +1,7 @@
%% TOPIC AND CONTENTS BOXES
%
% change this info string if making any custom modification
\ProvidesFile{sphinxlatexshadowbox.sty}[2021/01/27 sphinxShadowBox]
\ProvidesFile{sphinxlatexshadowbox.sty}[2022/06/30 sphinxShadowBox]

% Provides support for this output mark-up from Sphinx latex writer:
%
Expand All @@ -17,41 +17,93 @@
% Requires:
\RequirePackage{framed}

% Again based on use of "framed.sty", this allows breakable framed boxes.
% Let's draw the contents first, then the frame and the shadow last,
% to avoid problems with some pdf viewers.
\long\def\spx@ShadowFBox#1{%
\leavevmode\begingroup
% first we frame the box #1
% First we prepare a box with the contents and some reserved space for the
% frame and inner separation; with more parameters we could allow various
% border widths for top, bottom, left, right, but here all are equal.
\setbox\@tempboxa
\hbox{\vrule\@width\sphinxshadowrule
\vbox{\hrule\@height\sphinxshadowrule
\hbox{\kern\sphinxshadowrule
\vbox{\kern\sphinxshadowrule
\kern\sphinxshadowsep
\hbox{\kern\sphinxshadowsep #1\kern\sphinxshadowsep}%
\kern\sphinxshadowsep
\hrule\@height\sphinxshadowrule}%
\vrule\@width\sphinxshadowrule}%
% Now we add the shadow, like \shadowbox from fancybox.sty would do
\dimen@\dimexpr.5\sphinxshadowrule+\sphinxshadowsize\relax
\kern\sphinxshadowrule}%
\kern\sphinxshadowrule}%
% Now we rebox, adding the colored frame for which space was reserved.
\setbox\@tempboxa
\hbox{\unhcopy\@tempboxa % not \unhbox to be able to refer to \ht, \wd later
\kern-\wd\@tempboxa
{\color{sphinxshadowBorderColor}% color push here
\vrule\@width\sphinxshadowrule% TeX auto-computes the height
\vbox{\hrule\@height\sphinxshadowrule% TeX auto-computes the width
\kern\dimexpr\ht\@tempboxa-\sphinxshadowrule\relax
% This empty \hbox is here to give width used by \hrule
% As \dp\@tempboxa is zero, the \hbox location is at the
% bottom of frame.
\hbox{\kern\dimexpr\wd\@tempboxa-2\sphinxshadowrule\relax}%
\kern\dimexpr\dp\@tempboxa-\sphinxshadowrule\relax
\hrule\@height\sphinxshadowrule% TeX auto-computes the width
}%
\vrule\@width\sphinxshadowrule% TeX auto-computes the height
}% color pop will happen here
}%
% Now we add the shadow.
%
% Formerly, shadow was drawn partly on top of frame, but this was before
% both frame and shadow acquired colors. The width of the part of the
% shadow on the right is hidden, so it will stick into the right page
% margin.
%
% The frame borders are included into this final \hbox, which is sent back
% to \MakeFramed/\endMakeFramed measurements and then finally to page
% shipout. As \advance\hsize-\width appears in \MakeFramed, where \width is
% the computed extra width added by the framing plus inner separation (so
% actually 2\sphinxshadowrule+2\sphinxshadowsep), this all means that
% horizontally the frame will be perfectly adjusted to the *total* text
% width limits (i.e. independent of current list nesting; but anyhow
% Docutils does not allow nesting of topic within topics or body elements).
\hbox{\vbox{\offinterlineskip
\hbox{\copy\@tempboxa\kern-.5\sphinxshadowrule
\hbox{\copy\@tempboxa % not \box as we need \wd and \ht next
% add shadow on right side
\lower\sphinxshadowsize
\hbox{\vrule\@height\ht\@tempboxa \@width\dimen@}%
\hbox{{\color{sphinxshadowShadowColor}%
\vrule\@height\ht\@tempboxa \@width\sphinxshadowsize}}%
}%
\kern-\dimen@ % shift back vertically to bottom of frame
\kern-\sphinxshadowsize % shift back vertically to bottom of frame
% and add shadow at bottom
\moveright\sphinxshadowsize
\vbox{\hrule\@width\wd\@tempboxa \@height\dimen@}%
\vbox{{\color{sphinxshadowShadowColor}%
\hrule\@width\wd\@tempboxa \@height\sphinxshadowsize}}%
}%
% move left by the size of right shadow so shadow adds no width
% move left by the size of right shadow so shadow adds no width, and
% will stick into right margin
% (we did not conceal of course from TeX the depth)
\kern-\sphinxshadowsize
}%
\endgroup
}

% use framed.sty to allow page breaks in frame+shadow
% works well inside Lists and Quote-like environments
% produced by ``topic'' directive (or local contents)
% could nest if LaTeX writer authorized it
% 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}
{\def\FrameCommand {\spx@ShadowFBox }%
\advance\spx@image@maxheight
Expand Down

0 comments on commit aae64ba

Please sign in to comment.