
다음 코드 섹션이 있습니다.
\pgfkeys{
/tikz/.cd,
color izquierda/.initial=\tikz@fillcolor,
color derecha/.initial=\tikz@fillcolor,
}
작동하지만 두 옵션을 모두 활성화하지 않은 경우 '채우기=모든 색상' 옵션을 선택하지 않으면 오류가 발생합니다. 제발, 누군가 나를 도와줄 수 있나요? 채우기 옵션이 선택되었는지도 감지해야 합니다. 미리 감사드립니다!
MWE는 다음과 같습니다.
\documentclass[]{article}
\usepackage{tikz,makeshape}
\def\gap{0mm}
\makeatletter
% Dimensiones medidas en Autocad para las válvulas con anchura = 3mm en un
% círculo de 2mm de radio.
\def\radio@llave{2mm}
\def\x@llave{1.5mm}
\def\y@llave{1.32mm}
\pgfkeys{
% Requiere que fill=color esté activado en caso de no estar izq. y dcha.
/tikz/.cd,
color izquierda/.initial=\tikz@fillcolor,
color derecha/.initial=\tikz@fillcolor
}
%% Anchor path:
\def\llaveanchor{ % 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\llaveborder{ % 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 círculo:
%
\pgfcircle{\pgfpointorigin}{\radio@llave}
% con la opción clip evito los picos de la válvula saliendo el círculo
\pgfusepath{fill,stroke,clip}
%
% Triángulo izquierdo:
%
\pgfsetfillcolor{\pgfkeysvalueof{/tikz/color izquierda}}
%
\pgfpathmoveto{\pgfpointorigin}
\pgfpathlineto{\pgfpoint{-\x@llave}{ \y@llave}}
\pgfpathlineto{\pgfpoint{-\x@llave}{-\y@llave}}
\pgfpathclose
\pgfusepath{fill,stroke}
%
% Triángulo derecho:
%
\pgfsetfillcolor{\pgfkeysvalueof{/tikz/color derecha}}
%
\pgfpathmoveto{\pgfpointorigin}
\pgfpathlineto{\pgfpoint{ \x@llave}{ \y@llave}}
\pgfpathlineto{\pgfpoint{ \x@llave}{-\y@llave}}
\pgfpathclose
\pgfusepath{fill,stroke}
%
% Línea vertical:
%
\pgfpathmoveto{\pgfpoint{0}{ \radio@llave}}
\pgfpathlineto{\pgfpoint{0}{-\radio@llave}}
\pgfusepath{stroke}
}
%% Declaración de la forma:
\pgfdeclareshape{llave toma en carga}{
\setpaths{\llaveanchor}{\llaveborder}
\savedanchor{\centerpoint}{
\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}{\centerpoint \pgf@x=0pt \pgf@y=0pt}
%
\anchor{u}{\centerpoint \pgf@x=0pt \pgf@y= \radio@llave}
\anchor{d}{\centerpoint \pgf@x=0pt \pgf@y=-\radio@llave}
\anchor{r}{\centerpoint \pgf@x= \radio@llave \pgf@y=0pt}
\anchor{l}{\centerpoint \pgf@x=-\radio@llave \pgf@y=0pt}
%
\anchor{ur}{\centerpoint \pgf@x= \x@llave \pgf@y= \y@llave}
\anchor{dr}{\centerpoint \pgf@x= \x@llave \pgf@y=-\y@llave}
\anchor{ul}{\centerpoint \pgf@x=-\x@llave \pgf@y= \y@llave}
\anchor{dl}{\centerpoint \pgf@x=-\x@llave \pgf@y=-\y@llave}
}
\makeatother
\tikzset{
st valvula/.style={
draw,minimum width=3mm,minimum height=2.85mm,line width=0.1mm,inner sep=0em,scale=2
}
}
\pagestyle{empty}
\begin{document}
When 'fill' and 'color izquierda'/'color derecha' are commented, an error is obtained. A way to detect if 'fill' is uncommented is necesary.
Moreover, there would be feasible not to fill anything.
\begin{center}
\begin{tikzpicture}[x=1mm,y=1mm]
\node[%
llave toma en carga,st valvula,scale=2,
fill=gray!15,
color izquierda=cyan,
color derecha=red!50
] (v2) at (0,0) {};
\end{tikzpicture}
\end{center}
\end{document}
그 결과는 다음과 같습니다.
답변1
침묵해서 미안하지만 나는 매우 바빠요. 이것은 작동하는 것 같으며 \typeout
이것을 디버깅하는 방법을 나타내기 위해 주석 처리된 s를 남겨 두었습니다 .
\documentclass[]{article}
\usepackage{tikz,makeshape}
\def\gap{0mm}
\makeatletter
% Dimensiones medidas en Autocad para las válvulas con anchura = 3mm en un
% círculo de 2mm de radio.
\def\radio@llave{2mm}
\def\x@llave{1.5mm}
\def\y@llave{1.32mm}
\pgfkeys{
% Requiere que fill=color esté activado en caso de no estar izq. y dcha.
/tikz/.cd,
color izquierda/.initial=\pgfutil@empty,
%color izquierda/.default=\pgfutil@empty,
color derecha/.initial=\pgfutil@empty%
}
%% Anchor path:
\def\llaveanchor{ % 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\llaveborder{ % 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 círculo:
%
\pgfcircle{\pgfpointorigin}{\radio@llave}
% con la opción clip evito los picos de la válvula saliendo el círculo
\pgfusepath{fill,stroke,clip}
%
% Triángulo izquierdo:
%
%\typeout{izquierda\pgfkeysvalueof{/tikz/color izquierda}}
\edef\pgfutil@tmpa{\pgfkeysvalueof{/tikz/color izquierda}}
\ifx\pgfutil@tmpa\pgfutil@empty
%\typeout{izquierda\space empty}
\else
\pgfsetfillcolor{\pgfkeysvalueof{/tikz/color izquierda}}
\fi
%
\pgfpathmoveto{\pgfpointorigin}
\pgfpathlineto{\pgfpoint{-\x@llave}{ \y@llave}}
\pgfpathlineto{\pgfpoint{-\x@llave}{-\y@llave}}
\pgfpathclose
\pgfusepath{fill,stroke}
%
% Triángulo derecho:
%
%\typeout{derecha\pgfkeysvalueof{/tikz/color derecha}}
\edef\pgfutil@tmpa{\pgfkeysvalueof{/tikz/color derecha}}
\ifx\pgfutil@tmpa\pgfutil@empty
%\typeout{derecha\space empty}
\else
\pgfsetfillcolor{\pgfkeysvalueof{/tikz/color derecha}}
\fi
%
\pgfpathmoveto{\pgfpointorigin}
\pgfpathlineto{\pgfpoint{ \x@llave}{ \y@llave}}
\pgfpathlineto{\pgfpoint{ \x@llave}{-\y@llave}}
\pgfpathclose
\pgfusepath{fill,stroke}
%
% Línea vertical:
%
\pgfpathmoveto{\pgfpoint{0}{ \radio@llave}}
\pgfpathlineto{\pgfpoint{0}{-\radio@llave}}
\pgfusepath{stroke}
}
%% Declaración de la forma:
\pgfdeclareshape{llave toma en carga}{
\setpaths{\llaveanchor}{\llaveborder}
\savedanchor{\centerpoint}{
\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}{\centerpoint \pgf@x=0pt \pgf@y=0pt}
%
\anchor{u}{\centerpoint \pgf@x=0pt \pgf@y= \radio@llave}
\anchor{d}{\centerpoint \pgf@x=0pt \pgf@y=-\radio@llave}
\anchor{r}{\centerpoint \pgf@x= \radio@llave \pgf@y=0pt}
\anchor{l}{\centerpoint \pgf@x=-\radio@llave \pgf@y=0pt}
%
\anchor{ur}{\centerpoint \pgf@x= \x@llave \pgf@y= \y@llave}
\anchor{dr}{\centerpoint \pgf@x= \x@llave \pgf@y=-\y@llave}
\anchor{ul}{\centerpoint \pgf@x=-\x@llave \pgf@y= \y@llave}
\anchor{dl}{\centerpoint \pgf@x=-\x@llave \pgf@y=-\y@llave}
}
\makeatother
\tikzset{
st valvula/.style={
draw,minimum width=3mm,minimum height=2.85mm,line width=0.1mm,inner sep=0em,scale=2
}
}
\pagestyle{empty}
\begin{document}
When 'fill' and 'color izquierda'/'color derecha' are commented, an error is obtained. A way to detect if 'fill' is uncommented is necesary.
Moreover, there would be feasible not to fill anything.
\begin{center}
\begin{tikzpicture}[x=1mm,y=1mm]
\node[%
llave toma en carga,st valvula,scale=2,
fill=gray!15,
%color izquierda=cyan,
color derecha=red!50
] (v2) at (0,0) {};
\end{tikzpicture}
\end{center}
\end{document}