ネストされた tikz 環境を整列させるか、またはそれらを削除する方法

ネストされた tikz 環境を整列させるか、またはそれらを削除する方法

私のダイアグラムには、頻繁に再利用するコンポーネントがいくつかあるため、それらのコンポーネント用に tikz で「マクロ」を作成しています。現在のコードはネストされた tikzpicture 環境を使用しており、期待どおりに動作していません。これを改善する方法について何か提案はありますか?

他の質問も見つけたのですが、どれも役に立たないようです。

私のコード

\documentclass[]{article}

% tikz
\usepackage{tikz}
\usetikzlibrary{positioning} %relative positioning
\usetikzlibrary{fit} %box around multiople nodes
\usetikzlibrary{calc} %complex positioning
\usepackage{pgfplots}
\pgfplotsset{compat=1.12}

\begin{document}

\begin{tikzpicture}[
block/.style={draw},
container/.style={inner sep=0,},
]

\def\EDFA{
\begin{tikzpicture}[scale=0.25]
\draw (-1,1) --  (1,0) --  (-1,-1) -- (-1,1);
\node[anchor=north,inner sep=2pt] at (0,-1) {$1$};
\end{tikzpicture}
}


\node[block] (source) {Source};

\node[container,right= of source] (edfa) {\EDFA};

\node[block, right= of edfa] (sink) {Sink};

\draw[->] (source) -- (edfa);
\draw[->] (edfa) -- (sink);

\end{tikzpicture}

\end{document}

アップデート このコードができました。Tex-Ninja でヘルパー座標を削除する方法はありますか?

\documentclass[]{スタンドアロン}

% ティック
tikzパッケージ
\usetikzlibrary{positioning} %相対位置

\begin{ドキュメント}

\tikzset{%
    EDFA/.pic={
        \begin{スコープ}[スケール=.5, シフト={(1,0)}]
        \draw (-1,0) 座標 (-in) -- (-1,1) -- (1,0) 座標 (-out) -- (-1,-1) -- 循環;
        \node[anchor=north,inner sep=2pt] (0,-1) {EDFA};
        \end{スコープ}
    },
    カプラー/.pic={
        \begin{スコープ}[スケール=.5, シフト={(1,-1)}]
        \draw (-1,1) 座標 (-in1) から[out=0,in=180] (0,0) から[out=0,in=180] (1,1) 座標 (-out1);
        \draw (-1,-1) 座標 (-in2) から[out=0,in=180] (0,0) から[out=0,in=180] (1,-1) 座標 (-out2);
        \end{スコープ}
    }
}

\begin{tikzpicture}[
ブロック/.style={draw},
]


\node[ブロック] (ソース) {ソース};

\path 座標[ソースの右] (ヘルパー a);
\draw (ヘルパー a) pic (edfa) {EDFA};

\path 座標[edfa-out の右] (ヘルパー b);
\draw (helper b) pic (coupler) {カプラー};


\node[block, coupler-out1の右=] (sink) {Sink};

\draw[->] (ソース) -- (edfa-in);
\draw (edfa-out) -- (coupler-in1);
\draw[->] (カプラ出力1) -- (シンク);

\end{tikzpicture}

\end{ドキュメント}

答え1

で説明されているようにtikz ノード内に図形を描画するにはどうすればよいですか? pics新しいオブジェクトを定義するために使用できます。写真を使用する際の主な問題は、写真が希望する場所に配置できないこととnodes、配置が簡単ではないことです。

次のコードはブロックを定義する方法を示していますEDFA

    EDFA/.pic={
        \begin{scope}[scale=.5]
        \draw (-1,0) coordinate (in) --  (-1,1) -- (1,0) coordinate (out) --  (-1,-1) -- cycle;
        \node[anchor=north,inner sep=2pt] at (0,-1) {$1$};
        \end{scope}

この場合、座標 (-1,0) はwestアンカーと1,0東として機能します。両方のポイントには、今後の参照用に特別な名前が付けられます。それぞれはpic独自の原点に従って配置されます(0,0)。Claudio の回答を使用して、TiKZの写真を固定するより良い位置決めのため。

EDFAあなたの例は単純なので、 andで始まりSourceSinkその後にand を置くことを好みます。

\documentclass[]{article}

% tikz
\usepackage{tikz}
\usetikzlibrary{positioning} %relative positioning

\begin{document}

\tikzset{%
    EDFA/.pic={
        \begin{scope}[scale=.5]
        \draw (-1,0) coordinate (in) --  (-1,1) -- (1,0) coordinate (out) --  (-1,-1) -- cycle;
        \node[anchor=north,inner sep=2pt] at (0,-1) {$1$};
        \end{scope}
    }
}

\begin{tikzpicture}[
block/.style={draw},
]

\draw pic (edfa) {EDFA};

\node[block, left=of edfain] (source) {Source};

\node[block, right= of edfaout] (sink) {Sink};

\draw[->] (source) -- (edfain);
\draw[->] (edfaout) -- (sink);

\end{tikzpicture}

\end{document}

ここに画像の説明を入力してください

EDFAこの特定のケースでは、isosceles triangleを持つノードが作業を実行し、としてではなくlabelとして使用できるため、コンポーネントが よりも複雑であると理解しています。nodepic

\documentclass[]{article}

% tikz
\usepackage{tikz}
\usetikzlibrary{positioning} %relative positioning
\usetikzlibrary{shapes.geometric}

\begin{document}

\begin{tikzpicture}[
    block/.style={draw},
    edfa/.style={isosceles triangle, minimum width=1cm, 
         draw, anchor=west, isosceles triangle stretches, 
         minimum height=1cm, label=-80:#1}
]

\node[block] (source) {Source};

\node[edfa=1, right=of source] (edfa) {};

\node[block, right= of edfa] (sink) {Sink};

\draw[->] (source) -- (edfa);
\draw[->] (edfa) -- (sink);

\end{tikzpicture}

\end{document}

関連情報