TikZ: mal posicionamiento de imágenes dibujadas por macro

TikZ: mal posicionamiento de imágenes dibujadas por macro

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í:

ingrese la descripción de la imagen aquí

pero en cambio el resultado es solo:

ingrese la descripción de la imagen aquí

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.

ingrese la descripción de la imagen aquí

\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 pathestilo:

\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

ingrese la descripción de la imagen aquí

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 \foreachcon solo dos nodos.

información relacionada