在 pgf 形状内使用模式

在 pgf 形状内使用模式

是否可以 (正确) 在 pgf 形状定义中使用图案?例如,我尝试将形状定义为填充图案的矩形,如下所示

\usetikzlibrary{patterns}

\pgfdeclareshape{test shape}
{
  \inheritsavedanchors[from=rectangle]
  \inheritanchor[from=rectangle]{center}

  \backgroundpath
  {
    \pgfsetfillpattern{north east lines}{.}
    \pgfpathrectanglecorners{\pgfpoint{0}{0}}{\pgfpoint{1cm}{1cm}}
    \pgfusepath{fill}
  }
}

问题是\pgfsetfillpattern需要一个颜色参数:

\pgfsetfillpattern{pattern name}{pattern color}

我希望这个颜色是用来绘制路径的颜色,所以我尝试使用.(包中的当前颜色xcolor)。它没有按预期工作:

\begin{tikzpicture}
\node[draw=red,test shape] at (0,0) {};
\node[fill=red,test shape] at (2cm,0) {};
\node[color=red,test shape] at (4cm,0) {};
\end{tikzpicture}

产生两个黑色形状和一个红色形状:

两个矩形,分别填充黑色东北线条图案和红色线条图案

我预计第一个也是红色的。所以我有两个问题

  • 这是一个简单的解决办法吗?
  • 在 pgf 形状内使用图案是个好主意吗?(如果答案是否定的,那么,为什么以及应该怎么做呢?)

答案1

我没有找到从 PGF 本身获取描边颜色的方法(\pgfgetsstrokecolor不是定义的宏),但幸运的是 TikZ 将颜色存储在自己的内存空间中,因此可以使用它来获取颜色。有三个这样的存储位置:

\tikz@strokecolor
\tikz@fillcolor
tikz@color
.

前两个是宏,后两个是颜色。draw=colour选项设置第一个,fill=colour选项设置第二个,选项color=colour设置两个都最后两个。

因此,一个解决方案是将颜色设置为. 除非 \tikz@strokecolor已设置,我们将使用它。其中一种方法如下:

\documentclass{article}
\usepackage{tikz}

\usetikzlibrary{patterns}

\makeatletter
\pgfdeclareshape{test shape}
{
  \inheritsavedanchors[from=rectangle]
  \inheritanchor[from=rectangle]{center}

  \backgroundpath
  {
    \def\my@color{.}%
    \ifx\tikz@strokecolor\pgfutil@empty
    \else
    \let\my@color\tikz@strokecolor
    \fi
    \pgfsetfillpattern{north east lines}{\my@color}
    \pgfpathrectanglecorners{\pgfpoint{0}{0}}{\pgfpoint{1cm}{1cm}}
    \pgfusepath{fill}
  }
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node[draw=red,test shape] at (0,0) {};
\node[fill=red,test shape] at (2cm,0) {};
\node[color=red,test shape] at (4cm,0) {};
\end{tikzpicture}
\end{document}

结果是:

彩色图案

如果您想要不同的组合,那么您需要调整选择。

相关内容