Проблемы с новыми опциями в новых формах с использованием \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

Концептуально похоже на ответ Ульрике, но только с ключами 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}

введите описание изображения здесь

Связанный контент