答案1
我们可以定义可拉伸彩虹阴影并将其应用于文本:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fadings, shadings}
\newcounter{fadcnt}\setcounter{fadcnt}{0}
\newcommand\fadingtext[3][]{%
\stepcounter{fadcnt}
\begin{tikzfadingfrompicture}[name=fading letter\thefadcnt]
\node[text=transparent!0,inner xsep=0pt,outer xsep=0pt,#1] {#3};
\end{tikzfadingfrompicture}%
\begin{tikzpicture}[baseline=(textnode.base)]
\node[inner sep=0pt,outer sep=0pt,#1](textnode){\phantom{#3}};
\shade[path fading=fading letter\thefadcnt,#2,fit fading=false]
(textnode.south west) rectangle (textnode.north east);%
\end{tikzpicture}%
}
\usetikzlibrary{calc}
\newbox\shbox
\tikzset{%
path picture shading/.style={%
path picture={%
%
\pgfpointdiff{\pgfpointanchor{path picture bounding box}{south west}}%
{\pgfpointanchor{path picture bounding box}{north east}}%
\pgfgetlastxy\pathwidth\pathheight%
\pgfinterruptpicture%
\global\setbox\shbox=\hbox{\pgfuseshading{#1}}%
\endpgfinterruptpicture%
\pgftransformshift{\pgfpointanchor{path picture bounding box}{center}}%
\pgftransformxscale{\pathwidth/(\wd\shbox)}%
\pgftransformyscale{\pathheight/(\ht\shbox)}% \dp will (should) be 0pt
\pgftext{\box\shbox}%
%
}
}
}
\pgfdeclarehorizontalshading{rainbow}{10bp}{color(0bp)=(violet);
color(1.6667bp)=(blue);
color(3.3333bp)=(cyan);
color(5bp)=(green);
color(6.6667bp)=(yellow);
color(8.3333bp)=(orange);
color(10bp)=(red)}
\begin{document}
\fadingtext[scale=10, font=\bfseries]{upper left=red, upper right=green, lower left=blue,lower right=yellow}{\LaTeX}
\fadingtext[scale=10, font=\bfseries]{path picture shading=rainbow}{\LaTeX}
\fadingtext[scale=10, font=\bfseries]{path picture shading=rainbow}{X}
\end{document}
答案2
如果您制作一个阴影100bp
方块(或100bp
径向阴影的半径),并记住(对于水平或垂直阴影)中间方块中只有九分之一的区域可见(最多),则阴影将缩放as expected
。也就是说,它将按照常规预定义阴影缩放的方式缩放。因此,最好始终指定100bp
宽度/高度并安排颜色以覆盖高度/宽度100bp
。
我定义了 2 种这种阴影,rainbow
和rainbow steps
。后者使用离散条纹的颜色。前者是“真实”阴影。
然后,我my <capital letter>
为每个<capital letter>
英文字母定义 26 种淡入淡出。
这些阴影和褪色可以在 s 内使用tikzpicture
。例如:
\begin{tikzpicture}
\shade [shading=rainbow] (1,-1) rectangle (8,-2);
\shade [shading=rainbow steps] (1,-1) rectangle (8,0);
\shade [shading=rainbow, shading angle=90] (1,0) rectangle (3,2);
\shade [shading=rainbow steps, shading angle=90] (6,0) rectangle (8,2);
\shade [shading=rainbow, shading angle=-90] (3,1) rectangle (6,2);
\shade [shading=rainbow, shading angle=90, path fading=my Y, fit fading=true] (4.5,.25) rectangle (5,.75);
\shade [shading=rainbow steps, shading angle=-90, path fading=my X, fit fading=true] (4,.25) rectangle (4.5,.75);
\end{tikzpicture}
最后,我定义了两个新命令
\rainbowletter(<dimension>)[<tikz keys>]{<capital letter>}
\rainbowletter*(<dimension>)[<tikz keys>]{<capital letter>}
每个参数都有 2 个可选参数和一个强制参数。第一个可选参数(如果指定)应为维度或数字 Ti钾Z 可以理解为维度,例如0.78
或10pt
。生成的字母将位于边长为该长度的方框中。如果指定了第二个可选参数,则可以指定 Ti钾Z 键用于创建字母的背景\path
。这些可用于填充背景或更改彩虹的阴影角度。
带星号的形式使用离散条纹。无星号的形式使用常规阴影。
所以,
\rainbowletter(.75)[inner color=white, outer color=black, shading angle=-90]{Y}
将使用一个 7.5 毫米 x 7.5 毫米的盒子,背景阴影中心为白色,边缘为黑色。它将使用标准彩虹阴影,但会将其旋转 -90 度。它将产生彩虹 Y。
\rainbowletter*(1){A}
这将使用大小相当于默认值1
(即 10 毫米见方)的离散条纹,并且仅显示 A,没有其他内容。
\rainbowletter[top color=black, bottom color=black, middle color=white, shading angle=90,]{X}
这将为我们提供一个阴影背景,左边和右边是黑色,中间是白色,并且彩虹阴影旋转了 90 度。
请注意,shading angle
也会影响背景阴影,因此我们使用top
和bottom
来获得left
和right
。
完整代码:
\documentclass[border=10pt,multi,tikz]{standalone}
\usetikzlibrary{fadings}
\usepackage{xparse}
\pgfdeclarehorizontalshading{rainbow}{100bp}{%
rgb(0bp)=(1,0,0);
rgb(26bp)=(1,0,0);
rgb(33bp)=(1,.5,0);
rgb(40bp)=(1,1,0);
rgb(47bp)=(0,1,0);
rgb(54bp)=(0,1,1);
rgb(61bp)=(0,0,1);
rgb(68bp)=(1,0,1);
rgb(75bp)=(.5,0,.5);
rgb(100bp)=(.5,0,.5)}
\pgfdeclarehorizontalshading{rainbow steps}{100bp}{%
rgb(0bp)=(1,0,0);
rgb(32.1bp)=(1,0,0);
rgb(32.1bp)=(1,.5,0);
rgb(39.2bp)=(1,.5,0);
rgb(39.2bp)=(1,1,0);
rgb(46.4bp)=(1,1,0);
rgb(46.4bp)=(0,1,0);
rgb(53.5bp)=(0,1,0);
rgb(53.5bp)=(0,1,1);
rgb(60.7bp)=(0,1,1);
rgb(60.7bp)=(0,0,1);
rgb(67.9bp)=(0,0,1);
rgb(67.9bp)=(.75,0,.75);
rgb(100bp)=(.75,0,.75)}
\foreach \i in {A,B,...,Z}
{%
\begin{tikzfadingfrompicture}[name=my \i]
\node [text=transparent!0, inner sep=0pt, transform shape] {\fontfamily{Roboto-TLF}\fontsize{60pt}{60pt}\bfseries\selectfont \i};
\end{tikzfadingfrompicture}%
}
\NewDocumentCommand \rainbowletter { s D() {1} O {} m }{%
\IfBooleanTF{#1}{\def\tempa{rainbow steps}}{\def\tempa{rainbow}}%
\tikz{%
\path [#3, postaction={shading=\tempa, path fading=my #4, fit fading=true}] (0,0) rectangle (#2,#2);
}%
}
\begin{document}
\rainbowletter(.75)[inner color=white, outer color=black, shading angle=-90]{Y}
\rainbowletter*(1){A}
\rainbowletter[top color=black, bottom color=black, middle color=white, shading angle=90,]{X}
\begin{tikzpicture}
\shade [shading=rainbow] (1,-1) rectangle (8,-2);
\shade [shading=rainbow steps] (1,-1) rectangle (8,0);
\shade [shading=rainbow, shading angle=90] (1,0) rectangle (3,2);
\shade [shading=rainbow steps, shading angle=90] (6,0) rectangle (8,2);
\shade [shading=rainbow, shading angle=-90] (3,1) rectangle (6,2);
\shade [shading=rainbow, shading angle=90, path fading=my Y, fit fading=true] (4.5,.25) rectangle (5,.75);
\shade [shading=rainbow steps, shading angle=-90, path fading=my X, fit fading=true] (4,.25) rectangle (4.5,.75);
\end{tikzpicture}
\end{document}