TikZ – mau posicionamento de imagens desenhadas por macro

TikZ – mau posicionamento de imagens desenhadas por macro

Provavelmente uma pergunta idiota sobre como funciona o posicionamento no TikZ. Estou tentando desenhar algumas coisas elétricas (começando no nível de portas únicas) e como muitas delas se repetem continuamente, quero definir macros para desenhá-las. Eu tenho essa coisa simples:

\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}

Quero que faça o seguinte: configure uma coordenada inicial e chame a macro para desenhar o componente, depois defina a coordenada em outro lugar e chame o desenho novamente. Quero terminar com dois componentes desenhados assim:

insira a descrição da imagem aqui

mas em vez disso o resultado é apenas:

insira a descrição da imagem aqui

Tentei o \newcommand e parametrizei o \halfadderplain para definir as coordenadas e funcionou corretamente. Também tentei substituir \halfadderplain no código acima por sua definição e nada aconteceu, então acho que esse não é o problema da macro, mas apenas meu mal-entendido de como o TikZ calcula a posição. Alguém pode ajudar, por favor?

(Observe que usar alguma biblioteca específica para desenhar esse tipo de coisa NÃO É uma solução para mim.)

Responder1

Aqui está uma solução suja, que requer a colocação manual das unidades meio somadoras; uma solução mais inteligente deve ser possível com formas TikZ...

EDIT: Seguindo o comentário de Peter Grill, removi o segundo (inútil) segundo argumento.

insira a descrição da imagem aqui

\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}

Responder2

Todos os caminhos não se conhecem. A primeira coordenada especificada \coordinate …;não está conectada aos caminhos seguintes (além do posicionamento).

Você pode fazer isso em um caminho:

\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}

ou como um 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}

Saída

insira a descrição da imagem aqui

Responder3

É possível reduzir o código: a forma de colocar os nós como nas outras respostas é usar xshift, todas as coordenadas são modificadas.

\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}

e uma variante com outro estilo é:

\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}

Observação: melhor é evitar o segundo \foreachcom apenas dois nós.

informação relacionada