Выстраивайте вложенные окружения 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[]{автономный}

% тикз
\usepackage{tikz}
\usetikzlibrary{positioning} %относительное позиционирование

\begin{документ}

\tikzset{%
    ЭДФА/.pic={
        \begin{scope}[масштаб=.5, сдвиг={(1,0)}]
        \draw (-1,0) координата (-вход) -- (-1,1) -- (1,0) координата (-выход) -- (-1,-1) -- цикл;
        \node[anchor=north,inner sep=2pt] в точке (0,-1) {EDFA};
        \end{область действия}
    },
    Соединитель/.pic={
        \begin{scope}[масштаб=.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}[
блок/.стиль={рисовать},
]


\node[block] (источник) {Источник};

\path координата[right=источника] (помощник a);
\draw (помощник а) рис (edfa) {EDFA};

\path координата[right=of edfa-out] (помощник b);
\draw (helper b) pic (coupler) {Coupler};


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

\draw[->] (источник) -- (edfa-in);
\draw (edfa-out) -- (coupler-in1);
\draw[->] (coupler-out1) -- (sink);

\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). Вы можете использовать ответ Клаудио, чтобыЗакрепление фотографий TiKZдля лучшего позиционирования.

Поскольку ваш пример был простым, я бы предпочел поставить EDFAпосле него « 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}

введите описание изображения здесь

Я понимаю, что ваши компоненты сложнее, чем , EDFAпотому что в этом конкретном случае isosceles triangleузел с labelбудет выполнять работу, и его можно использовать как node, а не как 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}

Связанный контент