我正在使用pgf绘制一些图形,虽然我并不完全了解它的工作原理,但我已经通过文档完成了所需的操作。
\pgfdeclareshape{reg}{
% The 'minimum width' and 'minimum height' keys, not the content, determine
% the size
\savedanchor\northeast{%
\pgfmathsetlength\pgf@x{\pgfshapeminwidth}%
\pgfmathsetlength\pgf@y{\pgfshapeminheight}%
\pgf@x=0.11\pgf@x
\pgf@y=0.15\pgf@y
}
% This is redundant, but makes some things easier:
\savedanchor\southwest{%
\pgfmathsetlength\pgf@x{\pgfshapeminwidth}%
\pgfmathsetlength\pgf@y{\pgfshapeminheight}%
\pgf@x=-0.11\pgf@x
\pgf@y=-0.15\pgf@y
}
% Inherit from rectangle
\inheritanchorborder[from=rectangle]
% Define same anchor a normal rectangle has
\anchor{center}{\pgfpointorigin}
\anchor{north}{\northeast \pgf@x=0pt}
\anchor{east}{\northeast \pgf@y=0pt}
\anchor{south}{\southwest \pgf@x=0pt}
\anchor{west}{\southwest \pgf@y=0pt}
\anchor{north east}{\northeast}
\anchor{north west}{\northeast \pgf@x=-\pgf@x}
\anchor{south west}{\southwest}
\anchor{south east}{\southwest \pgf@x=-\pgf@x}
\anchor{text}{
\pgfpointorigin
\advance\pgf@x by -.5\wd\pgfnodeparttextbox%
\advance\pgf@y by -.5\ht\pgfnodeparttextbox%
\advance\pgf@y by +.5\dp\pgfnodeparttextbox%
}
% Define anchors for signal ports
\anchor{CLK}{
\pgf@process{\northeast}%
\pgf@x=0\pgf@x%
\pgf@y=1\pgf@y%
}
\anchor{PC}{
\pgf@process{\northeast}%
\pgf@x=-2.5\pgf@x%
\pgf@y=0\pgf@y%
}
\anchor{PCS}{
\pgf@process{\northeast}%
\pgf@x=2.5\pgf@x%
\pgf@y=0\pgf@y%
}
% Draw the rectangle box and the port labels
\backgroundpath{
% Rectangle box
\pgfpathrectanglecorners{\southwest}{\northeast}
% Drawing Triangle for clock input
% upper left x
\southwest \pgf@xa=\pgf@x
\northeast \pgf@ya=\pgf@y \pgf@yb=\pgf@y \pgf@xb=\pgf@x
\pgf@anchor@reg@CLK
\pgf@xc=\pgf@x \pgf@yc=\pgf@y
\pgfmathsetlength\pgf@x{1.3ex}
\advance\pgf@xa by .15mm
\advance\pgf@xb by -.15mm
\advance\pgf@yc by -\pgf@x
\pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
\pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yb}}
\pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
\pgfclosepath
\tikzset{flip flop/port labels} % Use font from this style
\tikz@textfont
%Drawing CLK circuit
\pgf@anchor@reg@CLK
\pgf@xa=\pgf@x \pgf@ya=\pgf@y
\pgf@xb=\pgf@x \pgf@yb=\pgf@y
\pgfmathsetlength\pgf@x{1.8ex}
\advance\pgf@yb by \pgf@x
\pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
\pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yb}}
%Draw clock label
\pgf@anchor@reg@CLK\pgftext[base,at={\pgfpoint{\pgf@x}{\pgf@y}}]{\raisebox{2.5ex}{CLK}}
%Drawing PC circuit
\pgf@anchor@reg@PC
\pgf@ya=\pgf@y \pgf@yb=\pgf@y \pgf@xa=\pgf@x
\pgf@anchor@reg@west
\pgf@xb=\pgf@x
%\pgfmathsetlength\pgf@x{2.7ex}
%\advance\pgf@xb by \pgf@x
\pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
\pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yb}}
\pgf@anchor@reg@PC\pgftext[base,at={\pgfpoint{\pgf@x+0.5ex}{\pgf@y}}]{\raisebox{.5ex}{PC}}
%Drawing PC' circuit
\pgf@anchor@reg@PCS
\pgf@ya=\pgf@y \pgf@yb=\pgf@y\pgf@xa=\pgf@x
\pgf@anchor@reg@east
\pgf@xb=\pgf@x
%\pgfmathsetlength\pgf@x{2.5ex}
%\advance\pgf@xb by \pgf@x
\pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
\pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yb}}
\pgf@anchor@reg@PCS\pgftext[base,at={\pgfpoint{\pgf@x}{\pgf@y}}]{\raisebox{.5ex}{PC'}}
}
}
我在这里创建了一个带外部连接点的形状,其实已经很好用了。但是我真的想要在创建此形状时有一个参数,以便我可以指定端口数量。
例如像这样:
\begin{tikzpicture}
\node [reg,black!50,ports=3] (PC) at (0,0) {};
\end{tikzpicture}
但是我在文档中找不到允许自定义参数的内容。另外,我想将锚点命名为A1、A2和A3,但似乎无法在名称中添加数字,即使在文档中明确说明像"1"和"::"这样的名称应该没有问题,但"A1"仍然会出现问题。
如果有人知道如何做到这一点,我会非常感激帮助。并且也希望有更好的参考资料来创建pgf图形。
我使用Overleaf和pdflatex编辑tex文件。
编辑:
我现在发现可以使用\pgfkeys
来向图形添加参数,但它们似乎不能正常工作,而我并不真的知道该怎么处理。
\def\microarchbasekey{/tikz/microarch}
\pgfkeys{\microarchbasekey/.is family}
\pgfdeclareshape{mux}{
\pgfkeys{\microarchbasekey,inputs/.initial=2,spacing/.initial=5}
\savedmacro{\numpins}{
\def\numpins{\pgfkeysvalueof{\microarchbasekey/inputs}}
}
\saveddimen{\spacing}{
\pgf@x = \pgfkeysvalueof{\microarchbasekey/spacing}
}
%a lot of code down there
}
但是它会给我返回以下错误。
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)
但我找不到代码中缺失的部分。
circuitikz
中的muxdemux
定义感兴趣:https://github.com/circuitikz/circuitikz/blob/master/tex/pgfcircmultipoles.tex --- 它的注释不是很详细,但那里有很多锚点技巧。 - Rmano