是否可以 (正确) 在 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}
结果是:
如果您想要不同的组合,那么您需要调整选择。