Verschachtelte Tikz-Umgebungen anordnen oder wie man sie loswird

Verschachtelte Tikz-Umgebungen anordnen oder wie man sie loswird

In meinem Diagramm habe ich einige Komponenten, die ich häufig wiederverwende und für die ich in Tikz „Makros“ erstelle. Mein aktueller Code verwendet verschachtelte Tikzpicture-Umgebungen und funktioniert nicht ganz wie erwartet. Haben Sie Vorschläge, wie man das verbessern kann?

Ich habe weitere Fragen gefunden, aber keine scheint mir zu helfen?

Mein Code

\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}

Aktualisieren Ich habe jetzt diesen Code. Gibt es eine Tex-Ninja-Methode, um die Hilfskoordinaten loszuwerden?

\documentclass[]{eigenständig}

% tikz
\usepackage{tikz}
\usetikzlibrary{positionierung} %relative Positionierung

\begin{document}

\tikzset{%
    EDFA/.pic={
        \begin{scope}[Skala=.5, Verschiebung={(1,0)}]
        \draw (-1,0) Koordinate (-in) -- (-1,1) -- (1,0) Koordinate (-out) -- (-1,-1) -- Zyklus;
        \node[Anker=Nord,innere Sep=2pt] bei (0,-1) {EDFA};
        \end{scope}
    },
    Koppler/.pic={
        \begin{scope}[Skala=.5, Verschiebung={(1,-1)}]
        \draw (-1,1) Koordinate (-in1) nach [out=0,in=180] (0,0) nach [out=0,in=180] (1,1) Koordinate (-out1);
        \draw (-1,-1) Koordinate (-in2) nach [out=0,in=180] (0,0) nach [out=0,in=180] (1,-1) Koordinate (-out2);
        \end{scope}
    }
}

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


\node[block] (Quelle) {Quelle};

\Pfadkoordinate [rechts=von der Quelle] (Helfer a);
\draw (Helfer a) Bild (edfa) {EDFA};

\Pfadkoordinate [rechts=von edfa-out] (Helfer b);
\draw (Helfer b) pic (Koppler) {Koppler};


\node[block, rechts= von Koppler-Ausgang1] (Sink) {Sink};

\draw[->] (Quelle) -- (edfa-in);
\draw (edfa-out) -- (Koppler-in1);
\draw[->] (Koppler-Ausgang1) -- (Senke);

\end{tikzpicture}

\end{document}

Antwort1

Wie inWie zeichne ich Formen innerhalb eines Tikz-Knotens? picskann zum Definieren neuer Objekte verwendet werden. Mein Hauptproblem bei der Verwendung von Bildern ist, wie man sie an der gewünschten Stelle platziert, da sie nicht vorhanden sind nodesund ihre Positionierung nicht so einfach ist.

Der folgende Code zeigt, wie EDFAein Block definiert wird.

    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}

In diesem Fall fungiert die Koordinate (-1,0) als westAnker und 1,0als Osten. Beide Punkte haben einen speziellen Namen für weitere Referenzen. Jeder picwird entsprechend seinem eigenen Ursprung platziert (0,0). Sie können Claudios Antwort verwenden, umTiKZ-Bilder verankernzur besseren Positionierung.

Da Ihr Beispiel einfach war, würde ich lieber mit beginnen und und dahinter EDFAplatzieren .SourceSink

\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}

Bildbeschreibung hier eingeben

Ich verstehe, dass Ihre Komponenten komplexer sind als, EDFAweil in diesem speziellen Fall ein isosceles triangleKnoten mit einem labeldie Arbeit erledigt und er als nodeund nicht als verwendet werden kann pic:

\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}

verwandte Informationen