PGFのトレーニングのために、以下に示すように、選択スイッチを備えた複数のポートを持つノードシェイプを作成したいと思います。
これは、特定の数のアンカー(3つの入力+ 1つの出力)に対してこのノードを作成する試みであり、最初は満足のいくものでした。
\documentclass[border=5pt]{standalone}
\usepackage{blindtext}
\usepackage{calc}
\usepackage{ifthen}
\usepackage{tikz}
\usepackage{lipsum}
\usetikzlibrary{calc,shapes,arrows,positioning,patterns,fit,shapes.arrows, fadings,arrows.meta}
\usetikzlibrary{decorations.text}
\usetikzlibrary{decorations.pathmorphing,calc,shadows.blur,shadings, , backgrounds}
\usepackage{circuitikz}
\pgfdeclarelayer{background layer}
\pgfdeclarelayer{foreground layer}
\pgfsetlayers{background,background layer,main,foreground layer}
\makeatletter
\pgfkeys{/tikz/ilength/.initial = 2cm}
\pgfkeys{/tikz/olength/.initial = 2cm}
\pgfkeys{/tikz/hspace/.initial = 1.5cm}
\pgfkeys{/tikz/port length ratio/.initial = 0.2}
\pgfkeys{/tikz/output len to output port ratio/.initial = 0.6}
\pgfkeys{/tikz/select/.initial = 1} %for multiswitch control
\newlength\portlen
\pgfdeclareshape{killer}{
\anchor{center}{\pgfpointorigin}
\anchor{middle}{\pgfpointorigin}
\anchor{text}{\pgfpoint{-.5\wd\pgfnodeparttextbox}{-.5\ht\pgfnodeparttextbox}}
%-------------------
%----------------------
\savedanchor\kcenter{\pgfpointorigin}
\savedanchor\knorthwest{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{0.5*\pgfkeysvalueof{/tikz/ilength}}}%
\savedanchor\ksouthwest{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{-0.5*\pgfkeysvalueof{/tikz/ilength}}}%
\savedanchor\knortheast{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{0.5*\pgfkeysvalueof{/tikz/olength}}}%
\savedanchor\ksoutheast{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{-0.5*\pgfkeysvalueof{/tikz/olength}}}%
\anchor{north west}{\knorthwest}
\anchor{south west}{\ksouthwest}
\anchor{north east}{\knortheast}
\anchor{south east}{\ksoutheast}
\savedanchor\knorth{\pgfpoint{0cm}{0.25*\pgfkeysvalueof{/tikz/ilength}+0.25*\pgfkeysvalueof{/tikz/olength}}}%
\savedanchor\ksouth{\pgfpoint{0cm}{-0.25*\pgfkeysvalueof{/tikz/ilength}-0.25*\pgfkeysvalueof{/tikz/olength}}}%
\savedanchor\keast{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{0cm}}%
\savedanchor\kwest{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{0cm}}%
\anchor{north}{\knorth}
\anchor{north}{\knorth}
\anchor{east}{\keast}
\anchor{west}{\kwest}
%--------------------------
\savedanchor\porti{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{
0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - 0*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}}
}%
\savedanchor\portii{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{
0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - 1*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}}
}%
\savedanchor\portiii{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}}{
0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - 2*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}}
}%
\savedanchor\inp{\pgfpoint{-0.5*\pgfkeysvalueof{/tikz/hspace}}{0cm}
}%
\anchor{port 1}{\porti}
\anchor{port 2}{\portii}
\anchor{port 3}{\portiii}
\anchor{input}{\inp}
\backgroundpath{%
%
\pgfpathmoveto{\knorthwest}%
\pgfpathlineto{\ksouthwest}%
\pgfpathlineto{\ksoutheast}%
\pgfpathlineto{\knortheast}%
\pgfpathclose%
%----------------
}
\foregroundpath{
\pgfmathsetlength{\portlen}{\pgfkeysvalueof{/tikz/hspace}*0.5*\pgfkeysvalueof{/tikz/port length ratio}}
\pgfpathmoveto{\inp}
\pgfpathlineto{\inp \advance \pgf@x by \portlen}
\pgfsetarrows{{Stealth[width=1.5mm]}-}
\pgfpathlineto{\pgfpoint{0.5*\pgfkeysvalueof{/tikz/hspace}-\portlen}{
0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio} - (\pgfkeysvalueof{/tikz/select}-1)*0.5*\pgfkeysvalueof{/tikz/olength}*\pgfkeysvalueof{/tikz/output len to output port ratio}
}}
\pgfusepath{stroke}
\pgfsetarrows{-}
\pgfpathmoveto{\porti}
\pgfpathlineto{\porti \advance \pgf@x by -\portlen}
\pgfpathmoveto{\portii}
\pgfpathlineto{\portii \advance \pgf@x by -\portlen}
\pgfpathmoveto{\portiii}
\pgfpathlineto{\portiii \advance \pgf@x by -\portlen}
}}
\makeatother
\begin{document}
\begin{tikzpicture}
\node [killer,draw=blue,scale=1, port length ratio=0.4,ilength=1.2cm] (A) {};
\node [killer,draw=blue,fill=green,scale=1,select=3, port length ratio=0.4, left = of A] (B) {};
\end{tikzpicture}
\end{document}
しかし、コマンド を使用するために pgf マニュアルを何時間もかけて読んだにもかかわらず、このノードのアンカー ボーダーを描画できませんでした\anchorborder{}
。おそらく、その動作を理解していなかったのでしょう。とにかく、アンカー ボーダーの問題を回避して、次のステップは、ロジック ゲートのキーのように、入力ポート (アンカー) の数を制御することです\pgfkeys{/tikz/number of input ports/.initial = 4}
。 や などのコマンドを使用する必要があることはよくあります\csname ..... \endcsname
が、\expandafter
私にとってはわかりにくいですし、すでに使用しようとしましたが、無駄でした。
最後に、事前定義されたノードを使用する場合を除き、コードを変更するためのあらゆる提案を歓迎します。