我正在尝试创建一个自定义的 TikZ 形状,该形状由一个边框上有小箭头的矩形组成(代表信号输入/输出端口)。
在大多数情况下,我可以从矩形继承,但在创建输入/输出端口箭头时遇到了一些问题。理想情况下,我会在端口位置定义锚点,然后使用这些锚点在 backgroundpath 部分绘制箭头。问题是,backgroundpath 不能使用普通锚点。
一个选项是将港口位置保存为锚点,但这样我就无法访问 \northeast 和 \southwest。如果没有这些,我就无法将锚点置于实际边界上。
另一种选择是仅重复到达每个锚点所需的步骤,但我不太喜欢这样。
下面是我想要做的一个例子:
\makeatletter
\pgfdeclareshape{MyShape}
{
\inheritsavedanchors[from=rectangle]
\inheritanchorborder[from=rectangle]
\inheritanchor[from=rectangle]{center}
\inheritanchor[from=rectangle]{south}
\inheritanchor[from=rectangle]{west}
\inheritanchor[from=rectangle]{north}
\inheritanchor[from=rectangle]{east}
% etc.
\inheritbeforebackgroundpath[from=rectangle]
\inheritforegroundpath[from=rectangle]
\inheritbeforeforegroundpath[from=rectangle]
\anchor{inputA}{%
\southwest
\pgf@y = \advance \pgf@y by 3mm
}
\backgroundpath
{
\pgfsetarrowsend{Latex[length=3pt]}
\pgfpathmoveto{\inputA}
\pgfpathlineto{\northeast}
\pgfusepath{stroke}
}
}
\makeatother
注意:我知道该代码不起作用因为inputA只是一个普通的锚点;
答案1
\savedanchor
首先,无论如何你都需要,inputA
但我认为这对你来说不是问题。相对引用其他锚点的一个原因是它们必须完全收集,这至少相当麻烦,因为框大小是唯一可用的信息。相反,我会做以下事情
\documentclass[tikz]{standalone}
\usetikzlibrary{arrows.meta}
\makeatletter
\pgfdeclareshape{MyShape}
{
\inheritsavedanchors[from=rectangle]
\inheritanchorborder[from=rectangle]
\inheritanchor[from=rectangle]{center}
\inheritanchor[from=rectangle]{south}
\inheritanchor[from=rectangle]{west}
\inheritanchor[from=rectangle]{north}
\inheritanchor[from=rectangle]{east}
% etc.
\inheritbeforebackgroundpath[from=rectangle]
\inheritforegroundpath[from=rectangle]
\inheritbeforeforegroundpath[from=rectangle]
%
\backgroundpath
{%
\pgfsetarrowsend{Latex[length=3pt]}%
\southwest\advance\pgf@y by3mm\relax\pgfpathmoveto{\pgfpoint{\pgf@x}{\pgf@y}}%
\northeast\pgfpathlineto{\pgfpoint{\pgf@x}{\pgf@y}}%
\pgfusepath{stroke}%
}%
}
\makeatother
\begin{document}
\begin{tikzpicture}
\draw[style=help lines] (-2,-2) grid[step=1] (2,2);
\node[MyShape,minimum size=1cm,text=red]{A B C};
\node[draw,minimum size=1cm,text=red]{A B C};
\end{tikzpicture}
\end{document}