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?
- TikZ-Wiederverwendungscode zum Erstellen von VerschachtelungsbildernoderWie zeichne ich Formen innerhalb eines Tikz-Knotens?, usw
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? pics
kann 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 nodes
und ihre Positionierung nicht so einfach ist.
Der folgende Code zeigt, wie EDFA
ein 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 west
Anker und 1,0
als Osten. Beide Punkte haben einen speziellen Namen für weitere Referenzen. Jeder pic
wird 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 EDFA
platzieren .Source
Sink
\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}
Ich verstehe, dass Ihre Komponenten komplexer sind als, EDFA
weil in diesem speziellen Fall ein isosceles triangle
Knoten mit einem label
die Arbeit erledigt und er als node
und 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}