我在 PGF-Ti 中制作了一个新形状钾Z 带有一个锚点(b
anchor),它取决于一些选项。以下代码有效,但我需要重复计算以在形状中绘制线条并放置锚点:
\documentclass[border=2mm]{standalone}
\usepackage{tikz,makeshape}
\usetikzlibrary{calc}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{filecontents}
\begin{filecontents*}{manometro.tex}
\makeatletter
\def\unidad@medicion{mm}
\newdimen\radio@medidor \radio@medidor=2.5\unidad@medicion
% \pgfmathsetmacro quita la unidad pero lo da en puntos. Hay que convertir a mm.
\pgfmathsetmacro\largo@terminal@defecto{0.351459804\radio@medidor} % sin unidades
\newdimen\largo@recta
\pgfkeys{
/tikz/rotacion recta/.initial=270, % para manómetros, etc.
/tikz/longitud recta/.initial=\largo@terminal@defecto
}
\makeatother
\makeatletter
%% Anchor path:
\def\generalanchor{} % No es necesario, el nodo no llevará texto.
%% Background path:
\def\manometroborder{ % Obtiene la caja de texto correcta:
% Círculo:
%
\pgfcircle{\pgfpointorigin}{\radio@medidor}
\ifx\tikz@fillcolor\empty
\pgfusepath{stroke}
\else
\pgfsetfillcolor{\tikz@fillcolor}
% La opción clip evita los picos de la válvula saliendo el círculo.
\pgfusepath{fill,stroke}
\fi
%
% Línea de conexión:
%
\largo@recta=\pgfkeysvalueof{/tikz/longitud recta}\unidad@medicion
\advance\largo@recta\radio@medidor
\pgftransformrotate{\pgfkeysvalueof{/tikz/rotacion recta}}
\pgfpathmoveto{\pgfpointpolar{0}{\radio@medidor}}
\pgfpathlineto{\pgfpointpolar{0}{\largo@recta}}
\pgfusepath{stroke}
}
%% Declaración de la forma:
\pgfdeclareshape{manometro}{
\setpaths{\generalanchor}{\manometroborder}
\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
}
\savedanchor{\basepoint}{
\largo@recta=\pgfkeysvalueof{/tikz/longitud recta}\unidad@medicion
\advance\largo@recta\radio@medidor
\pgfextractx{\pgf@x}{
\pgfpointpolar{\pgfkeysvalueof{/tikz/rotacion recta}}{\largo@recta}
}
\pgfextracty{\pgf@y}{
\pgfpointpolar{\pgfkeysvalueof{/tikz/rotacion recta}}{\largo@recta}
}
}
% Anchors:
\anchor{c}{\centerpoint \pgf@x=0pt \pgf@y=0pt}
%
\anchor{u}{\centerpoint \pgf@x=0pt \pgf@y= \radio@medidor}
\anchor{d}{\centerpoint \pgf@x=0pt \pgf@y=-\radio@medidor}
\anchor{r}{\centerpoint \pgf@x= \radio@medidor \pgf@y=0pt}
\anchor{l}{\centerpoint \pgf@x=-\radio@medidor \pgf@y=0pt}
%
% Del terminal:
\anchor{b}{\basepoint}
}
\makeatother
\end{filecontents*}
\tikzset{
st texto/.style={
font=\sffamily\footnotesize,
circle,black,inner sep=0.0em
},
st valvula/.style={
node contents={},
draw,minimum width=3mm,minimum height=2.85mm,line width=0.1mm,inner sep=0em,scale=2
},
st linea nodo/.style={line width=0.1mm,latex-,orange,shorten >= 0.5em},
}
\input{manometro.tex}
\begin{document}
\begin{tikzpicture}[x=1mm,y=1mm,remember picture]
\path (0,0) node (v) [%
manometro,st valvula,
fill=yellow!50,
rotacion recta=45,
longitud recta=5
];
\draw[st linea nodo] (v.b) -- ++(0:5) node[st texto] {b};
\end{tikzpicture}
\end{document}
在
\savedanchor{\basepoint}{...
我必须做出与
\def\manometroborder{...
请问有什么方法可以避免这种情况吗?提前谢谢!