在 TikZ 中使用变量声明模式:理解变量的作用

在 TikZ 中使用变量声明模式:理解变量的作用

我试图\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,使用 ,而键应该存储一个值。由于 TiZ 没有仔细进行类型检查,aradius/.initial=7pt会将值存储在 的原始函数旁边radius=。最后我们可以通过 看到该值\pgfkeysvalueof。但我们不能通过 修改它,因为radius=后者正在做它原来的工作。

关于原始示例

如果你仔细观察,你会发现半径永远不会改变。这似乎是有效的,因为裁剪框会产生小块,而粗圆看起来会很大。然而,人们可能会责怪月亮错觉
这使得它成为一种奇妙的心理练习。)

相关内容