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?
- Código de reutilização TikZ para construção de imagens de aninhamentoouComo desenho formas dentro de um nó tikz?, etc.
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? pics
pode ser usado para definir novos objetos. Meu principal problema ao usar fotos é como colocá-las onde quiser, porque elas não estão nodes
e posicioná-las não é tão fácil.
O código a seguir mostra como definir EDFA
o 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,0
como 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 EDFA
e colocar Source
e Sink
depois 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}
Entendo que seus componentes são mais complexos EDFA
porque, neste caso específico, um isosceles triangle
nó com a label
fará o trabalho e pode ser usado como a node
e 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}