使用带有变量的仅限形式模式:可能是 TikZ 错误

使用带有变量的仅限形式模式:可能是 TikZ 错误

当我尝试在 TikZ 中使用可变图案颜色时,我发现它似乎不起作用。这是一个最小的工作示例:

\documentclass[tikz]{standalone}
\usetikzlibrary{patterns}
%
%
\tikzset{slope/.store in=\slope}
%
\pgfdeclarepatternformonly[\slope]{slant lines}
{\pgfpoint{-.1mm/\slope}{-.1mm}}{\pgfpoint{1.1mm/\slope}{1.1mm}}
{\pgfpoint{1mm/\slope}{1mm}}
{
    \pgfsetlinewidth{0.4pt}
    \pgfpathmoveto{\pgfpoint{-.1mm/\slope}{-.1mm}}
    \pgfpathlineto{\pgfpoint{1.1mm/\slope}{1.1mm}}
    \pgfusepath{stroke}
}
%
%
\newcommand{\theslope}{0.7}
%
\pgfdeclarepatternformonly{diagonal lines}
{\pgfpoint{-.1mm/\theslope}{-.1mm}}{\pgfpoint{1.1mm/\theslope}{1.1mm}}
{\pgfpoint{1mm/\theslope}{1mm}}
{
    \pgfsetlinewidth{0.4pt}
    \pgfpathmoveto{\pgfpoint{-.1mm/\theslope}{-.1mm}}
    \pgfpathlineto{\pgfpoint{1.1mm/\theslope}{1.1mm}}
    \pgfusepath{stroke}
}
%
%
\begin{document}
\begin{tikzpicture}
    \draw[pattern=diagonal lines,pattern color=blue] (0,0) rectangle (5,5);
    \tikzset{every path/.append style={xshift=6cm}}
    \draw[pattern=slant lines,pattern color=blue,slope=0.7] (0,0) rectangle (5,5);
\end{tikzpicture}
\end{document}

输出如下所示:

在此处输入图片描述

如果我理解正确的话,两个方块都应该用蓝色对角线填充。但对于可变斜率模式,该pattern color=blue选项似乎被忽略了。

我是不是做错了什么,还是这真的是一个 bug?无论是哪种情况,我都有合理的方法可以改正吗?

答案1

摘自手册第 162 页,因此,仅有形式的图案本身没有任何颜色,但在使用时将使用当前图案颜色作为其颜色。

原因是,没有变量的纯形式图案声明被冻结,因此 TikZ 可以预先设置图案颜色,图案将继承该笔触颜色。但是,带有变量的图案不会被冻结,每次调用时都会重新评估。因此,每次都应该独立设置颜色。正如 Qrrbirlbel 的回答,应该在创建图案时为图案提供颜色。

\documentclass[tikz]{standalone}
\usetikzlibrary{patterns}
\tikzset{
    slope/.code={\edef\slope{#1}},
    slope/.default=0.5,
    slope
}
\makeatletter
\pgfdeclarepatternformonly[\tikz@pattern@color,\slope]{slant lines}
{\pgfpoint{-.1mm/\slope}{-.1mm}}
{\pgfpoint{1.1mm/\slope}{1.1mm}}
{\pgfpoint{1mm/\slope}{1mm}}
{
    \pgfsetlinewidth{0.4pt}
    \pgfpathmoveto{\pgfpoint{-.1mm/\slope}{-.1mm}}
    \pgfpathlineto{\pgfpoint{1.1mm/\slope}{1.1mm}}
    \pgfsetstrokecolor{\tikz@pattern@color}
    \pgfusepath{stroke}
}
\makeatother
\begin{document}
\begin{tikzpicture}
    \fill[pattern=slant lines,pattern color=red] (0,0) rectangle (5,5);
    \fill[pattern color=blue,pattern=slant lines,slope=0.3] (5,0) rectangle (10,5);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

在我的解决方案中,我附加了\def\patterncolor{#1}原始pattern color样式并将其添加到与的一起\patterncolor的变量中并将其与一起使用。\pgfdeclarepatternformonly\slope\pgfsetstrokecolor{\patterncolor}

percusse 的回答使用基本相同的方法,但使用/tikz/pattern color/的实际内部名称\tikz@pattern@color,而我用 来伪造\patterncolor

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{patterns}
\tikzset{
    slope/.store in=\slope,
%    patternkolor/.store in=\patterncolor,% with the next line changed to:
                                          % pattern color/.append style={patternkolor=#1}
    pattern color/.append code={\def\patterncolor{#1}}
}

\newcommand{\theslope}{0.7}

\pgfdeclarepatternformonly{diagonal lines}
{\pgfpoint{-.1mm/\theslope}{-.1mm}}{\pgfpoint{1.1mm/\theslope}{1.1mm}}
{\pgfpoint{1mm/\theslope}{1mm}}
{
    \pgfsetlinewidth{0.4pt}
    \pgfpathmoveto{\pgfpoint{-.1mm/\theslope}{-.1mm}}
    \pgfpathlineto{\pgfpoint{1.1mm/\theslope}{1.1mm}}
    \pgfusepath{stroke}
}

\pgfdeclarepatternformonly[\slope,\patterncolor]{slant lines}
{\pgfpoint{-.1mm/\slope}{-.1mm}}{\pgfpoint{1.1mm/\slope}{1.1mm}}
{\pgfpoint{1mm/\slope}{1mm}}
{
    \pgfsetlinewidth{0.4pt}
    \pgfpathmoveto{\pgfpoint{-.1mm/\slope}{-.1mm}}
    \pgfpathlineto{\pgfpoint{1.1mm/\slope}{1.1mm}}
    \pgfsetstrokecolor{\patterncolor}
    \pgfusepath{stroke}
}

\begin{document}
\begin{tikzpicture}
    \draw[pattern=diagonal lines,pattern color=blue] (0,0) rectangle (5,5);
    \tikzset{every path/.append style={xshift=6cm}}
    \draw[pattern=slant lines, slope=0.7,pattern color=blue] (0,0) rectangle (5,5);
\end{tikzpicture}
\begin{tikzpicture}
    \draw[pattern=slant lines, slope=0.7,pattern color=green] (0,0) rectangle (5,5);
    \tikzset{every path/.append style={xshift=6cm}}
    \draw[pattern=slant lines, slope=0.2,pattern color=green] (0,0) rectangle (5,5);
\end{tikzpicture}
\end{document}

输出

在此处输入图片描述 在此处输入图片描述

相关内容