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
|
% \iffalse meta-comment
%
% Copyright (C) 2010-2014 by Ulrich M. Schwarz
% Copyright (C) 2019 by Frank Mittelbach
% Copyright (C) 2020- by Yukai Chou
%
% This file may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, version 1.3c.
% The license can be obtained from
% http://www.latex-project.org/lppl/lppl-1-3c.txt
%
%\fi
%
%\iffalse (hide this from DocInput)
%<*shaded>
%\fi
%
% Mostly, this key wraps the theorem in a |shadebox| environment.
% The parameters are set by treating the value we are given as
% a new key-val list, see below.
%
% \begin{macrocode}
\define@key{thmdef}{shaded}[{}]{%
\thmt@trytwice{}{%
\RequirePackage{shadethm}%
\RequirePackage{thm-patch}%
\addtotheorempreheadhook[\thmt@envname]{%
\setlength\shadedtextwidth{\linewidth}%
\kvsetkeys{thmt@shade}{#1}\begin{shadebox}}%
\addtotheorempostfoothook[\thmt@envname]{\end{shadebox}}%
}%
}
% \end{macrocode}
% The docs for |shadethm| say:
% \begin{quote}
% There are some parameters you could set the default for (try them as is,
% first).
% \begin{itemize}
% \item |shadethmcolor|\quad The shading color of the background. See the
% documentation for the color package, but with a `gray' model, I find .97
% looks good out of my printer, while a darker shade like .92 is needed
% to make it copy well. (Black is 0, white is 1.)
% \item |shaderulecolor|\quad The shading color of the border of the shaded box.
% See (i). If shadeboxrule is set to 0pt then this won't print anyway.
% \item |shadeboxrule|\quad The width of the border around the shading. Set it to
% 0pt (not just 0) to make it disappear.
% \item |shadeboxsep|\quad The length by which the shade box surrounds the text.
% \end{itemize}
% \end{quote}
%
% So, let's just define keys for all of these.
%
% \begin{macrocode}
\define@key{thmt@shade}{textwidth} {\setlength\shadedtextwidth{#1}}
\define@key{thmt@shade}{bgcolor} {\thmt@definecolor{shadethmcolor}{#1}}
\define@key{thmt@shade}{rulecolor} {\thmt@definecolor{shaderulecolor}{#1}}
\define@key{thmt@shade}{rulewidth} {\setlength\shadeboxrule{#1}}
\define@key{thmt@shade}{margin} {\setlength\shadeboxsep{#1}}
\define@key{thmt@shade}{padding} {\setlength\shadeboxsep{#1}}
\define@key{thmt@shade}{leftmargin} {\setlength\shadeleftshift{#1}}
\define@key{thmt@shade}{rightmargin}{\setlength\shaderightshift{#1}}
% \end{macrocode}
%
% What follows is wizardry you don't have to understand. In essence,
% we want to support two notions of color: one is ``everything that goes
% after |\definecolor{shadethmcolor}|'', such as
% |{rgb}{0.8,0.85,1}|. On the other hand, we'd also like
% to recognize an already defined color name such as |blue|.
%
% To handle the latter case, we need to copy the definition of one color
% into another. The \pkg{xcolor} package offers |\colorlet| for that,
% for the \pkg{color} package, we just cross our fingers.
% \begin{macrocode}
\def\thmt@colorlet#1#2{%
%\typeout{don't know how to let color `#1' be like color `#2'!}%
\@xa\let\csname\string\color@#1\@xa\endcsname
\csname\string\color@#2\endcsname
% this is dubious at best, we don't know what a backend does.
}
\AtBeginDocument{%
\ifcsname colorlet\endcsname
\let\thmt@colorlet\colorlet
\fi
}
% \end{macrocode}
% Now comes the interesting part: we assume that a simple color name
% must not be in braces, and a color definition starts with an opening
% curly brace. (So, if |\definecolor| ever gets an optional arg,
% we are in a world of pain.)
%
% If the second argument to |\thmt@definecolor| (the key) starts
% with a brace,
% then |\thmt@def@color| will have an empty second argument,
% delimited by the brace of the key. Hopefully, the key will have exactly
% enough arguments to satisfy |\definecolor|. Then,
% |thmt@drop@relax| will be executed and gobble the fallback
% values and the |\thmt@colorlet|.
%
% If the key does not contain an opening brace, |\thmt@def@color|
% will drop everything up to |{gray}{0.5}|. So, first the color
% gets defined to a medium gray, but then, it immediately gets overwritten
% with the definition corresponding to the color name.
% \begin{macrocode}
\def\thmt@drop@relax#1\relax{}
\def\thmt@definecolor#1#2{%
\thmt@def@color{#1}#2\thmt@drop@relax
{gray}{0.5}%
\thmt@colorlet{#1}{#2}%
\relax
}
\def\thmt@def@color#1#2#{%
\definecolor{#1}}
% \end{macrocode}
%\iffalse (hide this from DocInput)
%</shaded>
%\fi
|