这个问题有点棘手。我正在尝试构建气动回路流程图的符号。我不需要那么多元素,但我希望能够扩展我的集合pgfcirkuitz
(尽管不是那么复杂)。因此,我编写了几个绘制常见符号的定义,并构建了一个宏,将它们组合成一个特定的节点形状。我将一个特定长度存储在 中tikzset
。整个流程在绘制符号的意义上有效,但我收到了类似 的错误消息illegal unit of measure
。有人能指出我犯的错误吗?
下面是我的代码,不幸的是,由于尝试使这个东西可定制,对于这个特定的问题来说,它相当长。
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta}
\makeatletter
\def\storecenter#1{%
\pgf@process{#1}%
\pgfutil@tempdima=\pgf@x%
\pgfutil@tempdimb=\pgf@y%
}%
% empty flowpath square {centerpoint}{half sidelength}
\def\addemptyflowpath#1#2{%
\storecenter{#1}
\pgfpathrectanglecorners%
{\pgf@x=\pgfutil@tempdima%
\pgf@y=\pgfutil@tempdimb%
\advance\pgf@x by-#2%
\advance\pgf@y by-#2}%
{\pgf@x=\pgfutil@tempdima%
\pgf@y=\pgfutil@tempdimb%
\advance\pgf@x by #2%
\advance\pgf@y by #2}%
\pgfusepath{draw}
}
\def\addflowpathbothways#1#2{%
\storecenter{#1}
% rectangle
\addemptyflowpath{#1}{#2}
% symbol
\pgfpathmoveto{\pgfpoint{\pgfutil@tempdima}{\pgfutil@tempdimb-#2}}
\pgfpathlineto{\pgfpoint{\pgfutil@tempdima}{\pgfutil@tempdimb+#2}}
% \pgfsetarrows{<->}
% \pgfusepath{draw}
% \pgfsetarrows{-}
}%
\long\def\declarecombindedflow#1#2#3#4{%
\pgfdeclareshape{#1}{%
\savedanchor{\centerpoint}{\pgfpointorigin}
\saveddimen\numberofelements{\pgf@x=#2}
\saveddimen\halfside{%
\pgfmathsetlength\pgf@x{.5*\pgfkeysvalueof{/tikz/pneumatic/flow path size}}%
}
\saveddimen\halfwidth{%
\pgfmathsetlength\pgf@x{#2*0.5*\pgfkeysvalueof{/tikz/pneumatic/flow path size}}%
}
\anchor{center}{\centerpoint}
#3
\backgroundpath{
#4
}%
}%
}%
\makeatother
\tikzset{
pneumatic/flow path size/.initial=20 cm,
}
\declarecombindedflow{combindedtest}{2}{}{%
\newlength\shiftelement
\pgfmathsetlength\shiftelement{(-(2+1)+1*2)*\halfside}
\addflowpathbothways{\pgfpointadd{\centerpoint}{\pgfpoint{-\shiftelement}{0pt}}}{\halfside}
\pgfmathsetlength\shiftelement{(-(2+1)+2*2)*\halfside}
\addflowpathbothways{\pgfpointadd{\centerpoint}{\pgfpoint{-\shiftelement}{0pt}}}{\halfside}
}
\begin{document}
\begin{tikzpicture}
\node[combindedtest, name=a] at (2,2) {};
\end{tikzpicture}
\end{document}
答案1
\declarecombindedflow
您的用途定义#2
为
\pgf@x=#2
这意味着,#2
需要有一个长度。因此,当您使用宏时,您需要使用:
\declarecombindedflow{combindedtest}{2pt}{}{% i.e. `2pt` instead of `2`.
不过,由于\numberofelements
听起来不像长度,所以最好使用\savedmacro
, IE
\savedmacro\numberofelements{\pgfmathtruncatemacro\numberofelements{#2}}
然后你可以使用
\declarecombindedflow{combindedtest}{2}{}{%
再次(甚至\declarecombindedflow{foo}{5*3-13}…
)并且\numberofelements
将可用并将扩展到2
。
(如果您不需要 PGFmath,您可以简单地执行\savedmacro\numberofelements{\edef\numberofelement{#2}}
。)