使用 \pgfkeys 的新形状中的新选项存在问题

使用 \pgfkeys 的新形状中的新选项存在问题

当我编译以下代码时,使用 \pgfkeys: 的新形状中的新选项出现问题:

\documentclass[border=2mm]{standalone}

\usepackage{tikz,makeshape,filecontents}

% Require makeshape package

\makeatletter

%% Constante para la forma valvula:
\def\gap{0mm}

%% Anchor path:

\def\valvulaanchor{ % Obtiene la caja de texto correcta:

  \pgf@xa=\ctbnex
    \pgf@ya=\ctbney

    % Crea el margen para la forma:
    \advance\pgf@xa by \gap
    \advance\pgf@ya by \gap
    % Corrige minheight y minwidth, y outerxsep o outerysep:
    \mincorrect{\pgf@xa}{\pgfshapeminwidth}
    \advance\pgf@xa\pgfshapeouterxsep
    \mincorrect{\pgf@ya}{\pgfshapeminheight}
    \advance\pgf@ya\pgfshapeouterysep
  % Dibuja el anchor con \pgfusepath{stroke}:
  \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
  \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@ya}}
  \pgfpathlineto{\pgfpoint{-\pgf@xa}{-\pgf@ya}}
  \pgfpathlineto{\pgfpoint{-\pgf@xa}{\pgf@ya}}
  \pgfpathclose 
  % lo siguiente solo para comprobar
  %\pgfusepath{stroke}

}

%% Background path:

\def\valvulaborder{ % Obtiene la caja de texto correcta:

    \pgf@xa=\ctbnex
    \pgf@ya=\ctbney

    % Crea el margen para la forma:
    \advance\pgf@xa by \gap
    \advance\pgf@ya by \gap
  % Corrige minheight y minwidth, y outerxsep o outerysep:
    \mincorrect{\pgf@xa}{\pgfshapeminwidth}
    \advance\pgf@xa\pgfshapeouterxsep
    \mincorrect{\pgf@ya}{\pgfshapeminheight}
    \advance\pgf@ya\pgfshapeouterysep
    %
    % Dibuja el triángulo derecho:
    %
    \pgfkeys{/tikz/.cd,color derecha}
    %
    \pgfpathmoveto{\pgfpoint{0em}{0em}}
    \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@ya}}
  \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@ya}}
    \pgfpathclose
  \pgfusepath{fill,stroke}
  %
    % Triángulo izquierdo:
    %
    \pgfkeys{/tikz/.cd,color izquierda}
    %
    \pgfpathmoveto{\pgfpoint{0em}{0em}}
    \pgfpathlineto{\pgfpoint{-\pgf@xa}{\pgf@ya}}
  \pgfpathlineto{\pgfpoint{-\pgf@xa}{-\pgf@ya}}
    \pgfpathclose
    \pgfusepath{fill,stroke}

}

%% Declaración de la forma:

\pgfdeclareshape{valvula}{

  \setpaths{\valvulaanchor}{\valvulaborder}

  \savedanchor{\northeast}{
      \pgf@x = \ctbnex
      \pgf@y = \ctbney
      \advance\pgf@x by \gap
      \advance\pgf@y by \gap
      \mincorrect{\pgf@x}{\pgfshapeminwidth}
      \mincorrect{\pgf@y}{\pgfshapeminheight}
      \advance\pgf@x\pgfshapeouterxsep
      \advance\pgf@y\pgfshapeouterysep
  }

  % Anchors:
  \anchor{c}{\northeast \pgf@x=0pt \pgf@y=0pt}
  \anchor{ur}{\northeast}
  \anchor{r}{\northeast \pgf@y=0pt}
  \anchor{dr}{\northeast \pgf@y=-\pgf@y}
  \anchor{dl}{\northeast \pgf@x=-\pgf@x \pgf@y=-\pgf@y}
  \anchor{l}{\northeast \pgf@x=-\pgf@x \pgf@y=0pt}
  \anchor{ul}{\northeast \pgf@x=-\pgf@x}

}

\makeatother

\pgfkeys{%
    /tikz/color izquierda/.style={fill=#1},
    /tikz/color derecha/.style={fill=#1},
}

\begin{document}

\begin{tikzpicture}[scale=2]

\node[
  valvula,
  minimum width=6mm,minimum height=5.5mm,scale=2,
  color derecha=green,color izquierda=cyan
] (v1) at (0,0) {};

\end{tikzpicture}

\end{document}


I get an erroneous result:

在此处输入图片描述

但是,当我分别用 和 替换和\pgfkeys{/tikz/.cd,color derecha}时 , 代码有效:\pgfkeys{/tikz/.cd,color izquierda}\pgfsetfillcolor{green}\pgfsetfillcolor{cyan}

在此处输入图片描述

有人能帮我吗?提前谢谢!

答案1

概念上与 Ulrike 的答案类似,但仅使用 pgf 键,即没有宏(表面上)。

\documentclass[border=2mm]{standalone}

\usepackage{tikz,makeshape,filecontents}

% Require makeshape package

\makeatletter

%% Constante para la forma valvula:
\def\gap{0mm}

%% Anchor path:

\def\valvulaanchor{ % Obtiene la caja de texto correcta:

  \pgf@xa=\ctbnex
    \pgf@ya=\ctbney

    % Crea el margen para la forma:
    \advance\pgf@xa by \gap
    \advance\pgf@ya by \gap
    % Corrige minheight y minwidth, y outerxsep o outerysep:
    \mincorrect{\pgf@xa}{\pgfshapeminwidth}
    \advance\pgf@xa\pgfshapeouterxsep
    \mincorrect{\pgf@ya}{\pgfshapeminheight}
    \advance\pgf@ya\pgfshapeouterysep
  % Dibuja el anchor con \pgfusepath{stroke}:
  \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
  \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@ya}}
  \pgfpathlineto{\pgfpoint{-\pgf@xa}{-\pgf@ya}}
  \pgfpathlineto{\pgfpoint{-\pgf@xa}{\pgf@ya}}
  \pgfpathclose 
  % lo siguiente solo para comprobar
  %\pgfusepath{stroke}

}

%% Background path:

\def\valvulaborder{ % Obtiene la caja de texto correcta:

    \pgf@xa=\ctbnex
    \pgf@ya=\ctbney

    % Crea el margen para la forma:
    \advance\pgf@xa by \gap
    \advance\pgf@ya by \gap
  % Corrige minheight y minwidth, y outerxsep o outerysep:
    \mincorrect{\pgf@xa}{\pgfshapeminwidth}
    \advance\pgf@xa\pgfshapeouterxsep
    \mincorrect{\pgf@ya}{\pgfshapeminheight}
    \advance\pgf@ya\pgfshapeouterysep
    %
    % Dibuja el triángulo derecho:
    %
    \pgfsetfillcolor{\pgfkeysvalueof{/tikz/color derecha}}
    %
    \pgfpathmoveto{\pgfpoint{0em}{0em}}
    \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@ya}}
  \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@ya}}
    \pgfpathclose
  \pgfusepath{fill,stroke}
  %
    % Triángulo izquierdo:
    %
    \pgfsetfillcolor{\pgfkeysvalueof{/tikz/color izquierda}}
    %
    \pgfpathmoveto{\pgfpoint{0em}{0em}}
    \pgfpathlineto{\pgfpoint{-\pgf@xa}{\pgf@ya}}
  \pgfpathlineto{\pgfpoint{-\pgf@xa}{-\pgf@ya}}
    \pgfpathclose
    \pgfusepath{fill,stroke}

}

%% Declaración de la forma:

\pgfdeclareshape{valvula}{

  \setpaths{\valvulaanchor}{\valvulaborder}

  \savedanchor{\northeast}{
      \pgf@x = \ctbnex
      \pgf@y = \ctbney
      \advance\pgf@x by \gap
      \advance\pgf@y by \gap
      \mincorrect{\pgf@x}{\pgfshapeminwidth}
      \mincorrect{\pgf@y}{\pgfshapeminheight}
      \advance\pgf@x\pgfshapeouterxsep
      \advance\pgf@y\pgfshapeouterysep
  }

  % Anchors:
  \anchor{c}{\northeast \pgf@x=0pt \pgf@y=0pt}
  \anchor{ur}{\northeast}
  \anchor{r}{\northeast \pgf@y=0pt}
  \anchor{dr}{\northeast \pgf@y=-\pgf@y}
  \anchor{dl}{\northeast \pgf@x=-\pgf@x \pgf@y=-\pgf@y}
  \anchor{l}{\northeast \pgf@x=-\pgf@x \pgf@y=0pt}
  \anchor{ul}{\northeast \pgf@x=-\pgf@x}

}

\makeatother

\pgfkeys{%
    /tikz/color izquierda/.initial=blue,
    /tikz/color derecha/.initial=red,
}

\begin{document}

\begin{tikzpicture}[scale=2]

\node[
  valvula,
  minimum width=6mm,minimum height=5.5mm,scale=2,
  color derecha=green,color izquierda=cyan
] (v1) at (0,0) {};

\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

将键的值存储在命令中然后使用它们:

\documentclass[border=2mm]{standalone}

\usepackage{tikz,makeshape,filecontents}

% Require makeshape package

\makeatletter

%% Constante para la forma valvula:
\def\gap{0mm}

%% Anchor path:

\def\valvulaanchor{ % Obtiene la caja de texto correcta:

  \pgf@xa=\ctbnex
    \pgf@ya=\ctbney

    % Crea el margen para la forma:
    \advance\pgf@xa by \gap
    \advance\pgf@ya by \gap
    % Corrige minheight y minwidth, y outerxsep o outerysep:
    \mincorrect{\pgf@xa}{\pgfshapeminwidth}
    \advance\pgf@xa\pgfshapeouterxsep
    \mincorrect{\pgf@ya}{\pgfshapeminheight}
    \advance\pgf@ya\pgfshapeouterysep
  % Dibuja el anchor con \pgfusepath{stroke}:
  \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
  \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@ya}}
  \pgfpathlineto{\pgfpoint{-\pgf@xa}{-\pgf@ya}}
  \pgfpathlineto{\pgfpoint{-\pgf@xa}{\pgf@ya}}
  \pgfpathclose
  % lo siguiente solo para comprobar
  %\pgfusepath{stroke}

}

%% Background path:

\def\valvulaborder{ % Obtiene la caja de texto correcta:

    \pgf@xa=\ctbnex
    \pgf@ya=\ctbney

    % Crea el margen para la forma:
    \advance\pgf@xa by \gap
    \advance\pgf@ya by \gap
  % Corrige minheight y minwidth, y outerxsep o outerysep:
    \mincorrect{\pgf@xa}{\pgfshapeminwidth}
    \advance\pgf@xa\pgfshapeouterxsep
    \mincorrect{\pgf@ya}{\pgfshapeminheight}
    \advance\pgf@ya\pgfshapeouterysep
    %
    % Dibuja el triángulo derecho:
    %
    %\pgfkeys{/tikz/.cd,color derecha}
    \pgfsetfillcolor{\derechafillcolor}
    %
    \pgfpathmoveto{\pgfpoint{0em}{0em}}
    \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@ya}}
  \pgfpathlineto{\pgfpoint{\pgf@xa}{-\pgf@ya}}
    \pgfpathclose
  \pgfusepath{fill,stroke}
  %
    % Triángulo izquierdo:
     \pgfsetfillcolor{\izquierdafillcolor}
    %
    %\pgfkeys{/tikz/.cd,color izquierda}
    %
    \pgfpathmoveto{\pgfpoint{0em}{0em}}
    \pgfpathlineto{\pgfpoint{-\pgf@xa}{\pgf@ya}}
  \pgfpathlineto{\pgfpoint{-\pgf@xa}{-\pgf@ya}}
    \pgfpathclose
    \pgfusepath{fill,stroke}

}

%% Declaración de la forma:

\pgfdeclareshape{valvula}{

  \setpaths{\valvulaanchor}{\valvulaborder}

  \savedanchor{\northeast}{
      \pgf@x = \ctbnex
      \pgf@y = \ctbney
      \advance\pgf@x by \gap
      \advance\pgf@y by \gap
      \mincorrect{\pgf@x}{\pgfshapeminwidth}
      \mincorrect{\pgf@y}{\pgfshapeminheight}
      \advance\pgf@x\pgfshapeouterxsep
      \advance\pgf@y\pgfshapeouterysep
  }

  % Anchors:
  \anchor{c}{\northeast \pgf@x=0pt \pgf@y=0pt}
  \anchor{ur}{\northeast}
  \anchor{r}{\northeast \pgf@y=0pt}
  \anchor{dr}{\northeast \pgf@y=-\pgf@y}
  \anchor{dl}{\northeast \pgf@x=-\pgf@x \pgf@y=-\pgf@y}
  \anchor{l}{\northeast \pgf@x=-\pgf@x \pgf@y=0pt}
  \anchor{ul}{\northeast \pgf@x=-\pgf@x}

}

\makeatother

\pgfkeys{%
    /tikz/color izquierda/.store in=\izquierdafillcolor,
    /tikz/color derecha/.store in =\derechafillcolor,
}

\begin{document}

\begin{tikzpicture}[scale=2]

\node[
  valvula,
  minimum width=6mm,minimum height=5.5mm,scale=2,
  color derecha=green,color izquierda=cyan
] (v1) at (0,0) {};

\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容