我正在尝试重现类似于下图的阴影: 如您所见,阴影从左上角开始,颜色环是圆形。但是,阴影也正确地随矩形的大小缩放。它总是合理地填充区域,并且环保持圆形。此结果是使用 Powerpoint 生成的。
现在我想用 LaTeX 重现相同(或至少类似)的效果。在考虑了几个问题和答案之后(例如Tikz 可以实现可调位置的多停止渐变填充吗?),我得到了以下代码:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\pgfdeclareradialshading{fradial}{\pgfpoint{-40bp}{40bp}}{
rgb(0)=(0.0,0.0,0.0);
rgb(13bp)=(1.0,0.0,0.0);
rgb(32bp)=(0.0,1.0,0.0);
rgb(40bp)=(0.0,0.0,1.0)
}
\begin{tikzpicture}
\fill[shading=fradial] (0,0) rectangle (34,11);
\end{tikzpicture}
\end{document}
此代码产生以下结果: 有点类似,但还不够接近。目前有两个问题:
- 阴影没有正确地从左上角开始
- 阴影被扭曲成椭圆形而不是周期性的。
我猜第一点和上面提到的事情有关这里,阴影的那部分未使用。不幸的是,我并不完全理解 tikz 手册中的这一部分。我以为我已经理解了,并将我的值放大到,100bp
但后来我的框架中几乎只有黑色部分。这很奇怪。
那么我该如何实现这两者:从左上角正确开始并保持阴影循环。
我担心解决方案会与剪辑有关。但我对出现的解决方案非常感兴趣。
还有一件事。为了简化 MWE,我使用 -command 重现了我的结果\fill
。稍后将对 进行阴影处理\node
。
先感谢您。
答案1
您可以\clip
在阴影方块上使用。如果更改阴影的定义,会更容易。
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\pgfdeclareradialshading{fradial}{\pgfpoint{0bp}{0bp}}{
rgb(0)=(0.0,0.0,0.0);
rgb(13bp)=(1.0,0.0,0.0);
rgb(32bp)=(0.0,1.0,0.0);
rgb(40bp)=(0.0,0.0,1.0)
}
\begin{tikzpicture}
\clip (0,0) rectangle (34,-11);
\fill[shading=fradial] (-34,-34) rectangle (34,34);
\end{tikzpicture}
\end{document}
答案2
您可以使用一些技巧来实现它,例如修改阴影方块,使用一些颜色选择器来获得所需的颜色,当然还可以使用\clip.
结果:
梅威瑟:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\pgfdeclareradialshading{fradial}{\pgfpoint{-34bp}{34bp}}{
rgb(0bp)=(0,0,0);
rgb(9bp)=(0.2,0,0);
rgb(14bp)=(1,0,0);
rgb(20bp)=(0.42,0.39,0.17);
rgb(24bp)=(0.015,0.675,0.304);%4, 173, 78
rgb(26bp)=(0.015,0.675,0.304);%4, 173, 78
rgb(28bp)=(0,0.687,0.546);%0, 176, 140
rgb(32bp)=(0,0.687,0.917);%0, 176, 235
rgb(36bp)=(0,0.687,0.917)%0, 176, 140
}
\begin{tikzpicture}
\clip (0,0) rectangle ++(34,11);
\fill[shading=fradial] (0,-21) rectangle ++(34,38); %(34,11);
\end{tikzpicture}
\end{document}
答案3
非常感谢 J Leon V. 和 user272921 指出了正确的方向。有了这些信息,我就能构建解决方案。
首先:我现在明白了径向阴影的缩放是如何工作的。在 pgfmanual 中,它详细描述了水平阴影,但没有描述径向阴影。径向阴影的缩放使得为 25bp 定义的颜色恰好位于要着色的路径边界框的边框上。对于我的矩形,这意味着 25bp 的颜色恰好位于矩形的边缘。
此外,中指定的点\pgfdeclareradialshading
不会移动阴影,而是会扭曲它。如果移动点实际上在圆圈之外,这会产生奇怪的结果。我应该早点打印阴影\pgfuseshading
才能注意到这一点。
将这两个发现与特别是path picture
(也方便剪辑)结合起来,产生了一个很好的结果:
代码:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\pgfdeclareradialshading{fradial}{\pgfpoint{0bp}{0bp}}{
rgb(0)=(0.0,0.0,0.0);
rgb(9bp)=(1.0,0.0,0.0);
rgb(20bp)=(0.0,0.690,0.314);
rgb(25bp)=(0.0,0.690,0.941)
}
\begin{document}
\begin{tikzpicture}[
myshading/.style = {
path picture={
\fill[shading=fradial]
let
\p0 = (path picture bounding box.north west),
\p1 = ($ (path picture bounding box.south east) - (path picture bounding box.north west) $),
\n0 = {veclen(\x1,\y1)},
\p{upper left} = (\x0-\n0, \y0+\n0),
\p{lower right} = (\x0 + \n0, \y0 - \n0)
in
(\p{upper left}) rectangle (\p{lower right});
}
}
]
\Huge
\node[minimum width = 34 cm, minimum height = 11 cm, text=white,myshading] at (0,0) {Hello World};
\end{tikzpicture}
\end{document}
首先,我将阴影的定义移到文档之外,以消除由此产生的一些额外的空白。
我使用了我在 Powerpoint 中使用的颜色定义(抱歉,我应该首先在原始问题中这样做,但没想到有人会照顾颜色,因为我对原理更感兴趣)。
在里面path picture
我做了一些计算来自动计算正方形的大小,需要绘制正方形才能获得正确的阴影。它需要是一个正方形,这样颜色实际上是圆形而不是椭圆形。它需要稍微大一点,这样 25bp 的颜色就不会在矩形的边缘,而是在最远的角落。否则右下角会是黑色(可以通过用 替换 的定义来测试这\n0
一点\n0={max(abs(\x1),abs(\y1))}
。
在这个解决方案中,除了奇怪的 25bp 之外,几乎没有涉及任何神奇数字。其他一切都是自动计算的。
与期望结果相比,结果并非 100% 匹配,因为阴影本身的计算方式似乎不同。因此,像 J. Leon V. 所做的那样添加更多点会有所帮助。但最终结果比我想象的要接近得多。