В моей схеме есть несколько компонентов, которые я часто использую повторно, поэтому для них в tikz создаются "макросы". Текущий код, который у меня есть, использует вложенные среды tikzpicture и работает не совсем так, как ожидалось. Есть ли у вас предложения, как это улучшить?
Я нашел другие вопросы, но ни один из них мне не помог?
- Код повторного использования TikZ для создания вложенных изображенийилиКак рисовать фигуры внутри узла tikz?, и т. д
Мой код
\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}