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.
- Código de reutilización de TikZ para crear imágenes anidadaso¿Cómo dibujo formas dentro de un nodo tikz?, etc
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? pics
se puede utilizar para definir nuevos objetos. Mi principal problema al usar fotografías es cómo colocarlas donde quieres porque no están nodes
y posicionarlas no es tan fácil.
El siguiente código muestra cómo definir EDFA
el 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 west
ancla y 1,0
como este. Ambos puntos tendrán un nombre especial para mayor referencia. Cada uno pic
se 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 EDFA
un lugar Source
y Sink
despué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}
Entiendo que sus componentes son más complejos EDFA
porque para este caso particular un isosceles triangle
nodo con a label
hará el trabajo y se puede usar como a node
y 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}