Alinear entornos tikz anidados o cómo deshacerse de ellos

Alinear entornos tikz anidados o cómo deshacerse de ellos

En mi diagrama tengo algunos componentes que reutilizo mucho, así hago "macros" en tikz para ellos. El código actual que tengo utiliza entornos tikzpicture anidados y no funciona exactamente como se esperaba. ¿Tiene alguna sugerencia sobre cómo mejorar esto?

Encontré otras preguntas, pero ninguna parece ayudarme.

Mi código

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

Actualizar Ahora tengo este código, ¿hay alguna forma tex-ninja de deshacerme de las coordenadas auxiliares?

\documentclass[]{independiente}

% tikz
\usepackage{tikz}
\usetikzlibrary{posicionamiento} % posicionamiento relativo

\begin{documento}

\tikzset{%
    EDFA/.pic={
        \begin{alcance}[escala=.5, mayúsculas={(1,0)}]
        \draw (-1,0) coordenada (-in) -- (-1,1) -- (1,0) coordenada (-out) -- (-1,-1) -- ciclo;
        \node[anchor=norte,inner sep=2pt] en (0,-1) {EDFA};
        \end{alcance}
    },
    Acoplador/.pic={
        \begin{alcance}[escala=.5, mayúsculas={(1,-1)}]
        \draw (-1,1) coordenada (-in1) a[out=0,in=180] (0,0) a[out=0,in=180] (1,1) coordenada (-out1);
        \draw (-1,-1) coordenada (-in2) a[out=0,in=180] (0,0) a[out=0,in=180] (1,-1) coordenada (-out2) ;
        \end{alcance}
    }
}

\begin{tikzpicture}[
bloque/.style={dibujar},
]


\nodo[bloque] (fuente) {Fuente};

\coordenada de ruta[derecha=de la fuente] (ayudante a);
\draw (ayudante a) pic (edfa) {EDFA};

\ruta coordinada[derecha=de edfa-out] (ayudante b);
\draw (ayudante b) pic (acoplador) {Acoplador};


\nodo[bloque, derecha= del acoplador-out1] (sumidero) {sumidero};

\draw[->] (fuente) -- (edfa-in);
\draw (edfa-out) -- (acoplador-in1);
\draw[->] (acoplador-out1) -- (fregadero);

\end{tikzimagen}

\end{documento}

Respuesta1

Como se explica en¿Cómo dibujo formas dentro de un nodo tikz? picsse puede utilizar para definir nuevos objetos. Mi principal problema al usar fotografías es cómo colocarlas donde quieres porque no están nodesy posicionarlas no es tan fácil.

El siguiente código muestra cómo definir EDFAel bloque.

    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}

En este caso la coordenada (-1,0) actuará como westancla y 1,0como este. Ambos puntos tendrán un nombre especial para mayor referencia. Cada uno picse sitúa según su propio origen (0,0). Puedes usar la respuesta de Claudio paraAnclaje de fotografías TiKZpara un mejor posicionamiento.

Como su ejemplo fue simple, preferiría comenzar con EDFAun lugar Sourcey Sinkdespués.

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

ingrese la descripción de la imagen aquí

Entiendo que sus componentes son más complejos EDFAporque para este caso particular un isosceles trianglenodo con a labelhará el trabajo y se puede usar como a nodey no como 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}

información relacionada