Probablemente una pregunta poco convincente sobre cómo funciona el posicionamiento en TikZ. Estoy intentando dibujar algunas cosas eléctricas (comenzando en el nivel de puertas individuales) y debido a que muchas de ellas se repiten una y otra vez, quiero definir macros para dibujarlas. Tengo esta cosa simple:
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\def\halfadderplain{%
\draw +(0,2) -- +(3,2);
\draw +(0,1) -- +(3,1);
\draw +(0,0) -- +(3,0);
\draw +(0.5,-0.5) [fill=white] rectangle +(2.5,2.5);
\node at +(1.5,1) {QHA};
}
\begin{tikzpicture}
\coordinate (0,0);
\halfadderplain;
\coordinate (3,3);
\halfadderplain;
\end{tikzpicture}
\end{document}
Quiero que haga lo siguiente: configuro una coordenada inicial y llamo a la macro para dibujar el componente, luego establezco la coordenada en otro lugar y vuelvo a llamar al dibujo. Quiero terminar con dos componentes dibujados así:
pero en cambio el resultado es solo:
Probé el \newcommand y parametricé el \halfadderplain para establecer las coordenadas y funcionó correctamente. También intenté reemplazar \halfadderplain en el código anterior con su definición y no pasó nada, así que creo que este no es un problema con la macro sino simplemente mi malentendido sobre cómo TikZ calcula la posición. ¿Alguien puede ayudar por favor?
(Tenga en cuenta que usar alguna biblioteca específica para dibujar este tipo de cosas NO ES una solución para mí).
Respuesta1
Aquí hay una solución sucia, que requiere la colocación manual de las unidades del medio sumador; debe ser posible una solución más inteligente con las formas TikZ...
EDITAR: Tras el comentario de Peter Grill, eliminé el segundo (inútil) segundo argumento.
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\def\halfadderplain#1{%
\begin{scope}[xshift=#1]
\draw +(0,2) -- +(3,2);
\draw +(0,1) -- +(3,1);
\draw +(0,0) -- +(3,0);
\draw +(0.5,-0.5) [fill=white] rectangle +(2.5,2.5);
\node at +(1.5,1) {QHA};
\end{scope}
}
\begin{tikzpicture}
\halfadderplain{0};
\halfadderplain{3cm};
\end{tikzpicture}
\end{document}
Respuesta2
Todos los caminos no se conocen entre sí. La primera coordenada que especifique \coordinate …;
no está conectada a las siguientes rutas (aparte del posicionamiento).
Puedes hacerlo en un camino:
\documentclass[tikz]{standalone}
\begin{document}
\def\halfadderplain{
\foreach \y in {0,1,2} {+(0,\y) -- +(0.5,\y) +(2.5,\y) -- +(3,\y)}
+(0.5,-0.5) rectangle +(2.5,2.5)
node [midway] {QHA}
}
\begin{tikzpicture}
\draw (0,0) \halfadderplain;
\draw (3,0) \halfadderplain;
\end{tikzpicture}
\end{document}
o como insert path
estilo:
\documentclass[tikz]{standalone}
\begin{document}
\tikzset{
halfadderplain/.style={
insert path={
\foreach \y in {0,1,2} {+(0,\y) -- +(0.5,\y) +(2.5,\y) -- +(3,\y)}
+(0.5,-0.5) rectangle +(2.5,2.5)
node [midway] {QHA}
}
}
}
\begin{tikzpicture}
\draw (0,0) [halfadderplain];
\draw (3,0) [halfadderplain];
\end{tikzpicture}
\end{document}
Producción
Respuesta3
Es posible reducir el código: la forma de colocar los nodos como en las otras respuestas es usar xshift
, se modifican todas las coordenadas.
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[qha/.style={minimum width= 2cm, minimum height= 3cm,draw,fill=white}]
\draw \foreach \y in {0,...,2} {(0,\y) -- (6,\y)};
\foreach \y in {0,3} \node[qha,xshift=\y cm] at (1.5,1) {QHA};
\end{tikzpicture}
\end{document}
y una variante con otro estilo es:
\begin{tikzpicture}[qha/.style={minimum width= 2cm, minimum height= 3cm,draw,fill=white,xshift=#1}]
\draw \foreach \y in {0,...,2} {(0,\y) -- (6,\y)};
\foreach \y in {0,3} \node[qha=\y cm] at (1.5,1) {QHA};
\end{tikzpicture}
Observación: mejor es evitar el segundo \foreach
con solo dos nodos.