我试图\pgfdeclarepatternformonly
从 TikZ 手册第 1064 页理解。我正在尝试使用rings
那里给出的模式作为示例。如果我按照给出的方式编译示例,我会得到预期的结果。但是,我不完全理解变量的作用。特别是,我不理解 的效果radius
。
\documentclass[tikz]{standalone}
\usetikzlibrary{patterns}
\begin{document}
% page 1064 of manual
\pgfdeclarepatternformonly[/tikz/radius,\thickness,\size]{rings}
{\pgfpoint{-0.5*\size}{-0.5*\size}}
{\pgfpoint{0.5*\size}{0.5*\size}}
{\pgfpoint{\size}{\size}}
{
\pgfsetlinewidth{\thickness}
\pgfpathcircle\pgfpointorigin{\pgfkeysvalueof{/tikz/radius}}
\pgfusepath{stroke}
}
\newdimen\thickness
\tikzset{
radius/.initial=4pt,
size/.store in=\size, size=20pt,
thickness/.code={\thickness=#1},
thickness=0.75pt
}
\begin{tikzpicture}[rings/.style={pattern=rings}]
\filldraw [draw=blue, rings] (0,0) rectangle +(5,5);
\filldraw [draw=green, rings, radius=7pt] (0,0) rectangle +(5,5);
\end{tikzpicture}
\end{document}
可能我太天真了,以为改变radius
会改变所画圆的大小。然而,事实似乎并非如此。也就是说,如果我注释掉第二条图案线,我会得到完全相同的图案,但颜色是蓝色,而不是我预期的带有较小圆的图案。(如果我设置opacity=.5
第二条线,我会得到蓝绿色的圆,因为绿色恰好叠加在蓝色上。)
那么radius
具体在做什么呢?
答案1
键工作正常。问题是radius
用于设置椭圆的半径。因此radius=
更像是行动然后是一个简单的赋值。我们在这里看不到的效果,radius=7pt
因为它是关于x radius
和的y radius
。
有两种方法可以解决这个问题。第一种方法是使用另一个变量名,例如/tikz/rings/radius
。
\documentclass[tikz,border=10]{standalone}
\usetikzlibrary{patterns}
\begin{document}
% page 1064 of manual
\pgfdeclarepatternformonly[/tikz/rings/radius,\thickness,\size]{rings}
{\pgfpoint{-0.5*\size}{-0.5*\size}}
{\pgfpoint{0.5*\size}{0.5*\size}}
{\pgfpoint{\size}{\size}}
{
\pgfsetlinewidth{\thickness}
\pgfpathcircle\pgfpointorigin{\pgfkeysvalueof{/tikz/rings/radius}}
\pgfusepath{stroke}
}
\newdimen\thickness
\tikzset{
rings/radius/.initial=4pt,
size/.store in=\size, size=20pt,
thickness/.code={\thickness=#1},
thickness=0.75pt
}
\begin{tikzpicture}[rings/.style={pattern=rings}]
\filldraw [draw=blue, rings] (0,0) rectangle +(5,5);
\filldraw [draw=green, rings, rings/radius=7pt] (0,0) rectangle +(5,5);
\end{tikzpicture}
否则,重写绘图程序并不难。
\pgfdeclarepatternformonly[/tikz/x radius,/tikz/y radius,\thickness,\size]{Rings}
{\pgfpoint{-0.5*\size}{-0.5*\size}}
{\pgfpoint{0.5*\size}{0.5*\size}}
{\pgfpoint{\size}{\size}}
{
\pgfsetlinewidth{\thickness}
\pgfpathellipse\pgfpointorigin
{\pgfpoint{\pgfkeysvalueof{/tikz/x radius}}{0pt}}
{\pgfpoint{0pt}{\pgfkeysvalueof{/tikz/y radius}}}
\pgfusepath{stroke}
}
\newdimen\thickness
\tikzset{
radius=4pt,
size/.store in=\size, size=20pt,
thickness/.code={\thickness=#1},
thickness=0.75pt
}
\begin{tikzpicture}[Rings/.style={pattern=Rings}]
\filldraw [draw=blue,Rings] (0,0) rectangle +(5,5);
\filldraw [draw=green,Rings,x radius=7pt,y radius=1pt] (0,0) rectangle +(5,5);
\end{tikzpicture}
关于.initial
根据这个帖子,,.initial
与 相比.default
,使用 ,而键应该存储一个值。由于 Ti钾Z 没有仔细进行类型检查,aradius/.initial=7pt
会将值存储在 的原始函数旁边radius=
。最后我们可以通过 看到该值\pgfkeysvalueof
。但我们不能通过 修改它,因为radius=
后者正在做它原来的工作。
关于原始示例
如果你仔细观察,你会发现半径永远不会改变。这似乎是有效的,因为裁剪框会产生小块,而粗圆看起来会很大。然而,人们可能会责怪月亮错觉(
这使得它成为一种奇妙的心理练习。)