Alinhe ambientes tikz aninhados ou como se livrar deles

Alinhe ambientes tikz aninhados ou como se livrar deles

No meu diagrama tenho alguns componentes que reutilizo bastante, fazendo assim "macros" no tikz para eles. O código atual que tenho está usando ambientes tikzpicture aninhados e não está funcionando exatamente como esperado. Você tem alguma sugestão de como melhorar isso?

Encontrei outras perguntas, mas nenhuma parece me ajudar?

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

Atualizar Agora tenho esse código. Existe uma maneira tex-ninja de se livrar das coordenadas auxiliares?

\documentclass[]{autônomo}

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

\begin{documento}

\tikzset{%
    EDFA/.pic={
        \begin{escopo}[escala=0,5, shift={(1,0)}]
        \draw (-1,0) coordenada (-in) -- (-1,1) -- (1,0) coordenada (-out) -- (-1,-1) -- ciclo;
        \node[anchor=norte,inner set=2pt] em (0,-1) {EDFA};
        \end{escopo}
    },
    Acoplador/.pic={
        \begin{escopo}[escala=0,5, shift={(1,-1)}]
        \draw (-1,1) coordenada (-in1) para[out=0,in=180] (0,0) to[out=0,in=180] (1,1) coordenada (-out1);
        \draw (-1,-1) coordenada (-in2) para[out=0,in=180] (0,0) para[out=0,in=180] (1,-1) coordenada (-out2) ;
        \end{escopo}
    }
}

\begin{tikzpicture}[
bloco/.style={desenhar},
]


\node[bloco] (fonte) {Fonte};

\coordenada do caminho[direita=da fonte] (ajudante a);
\draw (ajudante a) pic (edfa) {EDFA};

\coordenada do caminho[direita=de edfa-out] (ajudante b);
\draw (ajudante b) pic (acoplador) {Acoplador};


\node[bloco, direita= do acoplador-out1] (sink) {Sink};

\draw[->] (fonte) -- (edfa-in);
\draw (edfa-out) -- (acoplador-in1);
\draw[->] (acoplador-out1) -- (pia);

\end{tikzpicture}

\end{documento}

Responder1

Como é explicado emComo desenho formas dentro de um nó tikz? picspode ser usado para definir novos objetos. Meu principal problema ao usar fotos é como colocá-las onde quiser, porque elas não estão nodese posicioná-las não é tão fácil.

O código a seguir mostra como definir EDFAo bloco.

    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}

Neste caso, a coordenada (-1,0) atuará como westâncora e 1,0como leste. Ambos os pontos terão um nome especial para referência futura. Cada um picé colocado de acordo com sua própria origem (0,0). Você pode usar a resposta de Claudio paraAncorando fotos TiKZpara melhor posicionamento.

Como seu exemplo foi simples, prefiro começar com EDFAe colocar Sourcee Sinkdepois dele.

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

insira a descrição da imagem aqui

Entendo que seus componentes são mais complexos EDFAporque, neste caso específico, um isosceles trianglenó com a labelfará o trabalho e pode ser usado como a nodee não como a 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}

informação relacionada