forked from rhodrin/ci_mpm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsphinxlatexshadowbox.sty
165 lines (160 loc) · 6.53 KB
/
sphinxlatexshadowbox.sty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
%% 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