TikZ - плохое позиционирование изображений, нарисованных макросом

TikZ - плохое позиционирование изображений, нарисованных макросом

Наверное, тупой вопрос о том, как работает позиционирование в TikZ. Я пытаюсь нарисовать кое-какие электрические штуки (начиная с уровня одиночных вентилей), и поскольку многие из них повторяются снова и снова, я хочу определить макросы для их рисования. У меня есть вот такая простая штука:

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

Я хочу, чтобы он делал следующее: я устанавливаю начальную координату и вызываю макрос для рисования компонента, затем я устанавливаю координату в другом месте и снова вызываю рисование. Я хочу получить два компонента, нарисованных следующим образом:

введите описание изображения здесь

но вместо этого результат только один:

введите описание изображения здесь

Я попробовал \newcommand и параметризовал \halfadderplain, чтобы задать координаты, и это сработало правильно. Я также попытался заменить \halfadderplain в коде выше на его определение, но ничего не произошло, поэтому я думаю, что это не проблема с макросом, а просто мое непонимание того, как TikZ вычисляет позицию. Может кто-нибудь помочь, пожалуйста?

(Обратите внимание, что использование какой-то специальной библиотеки для рисования такого рода вещей для меня НЕ является решением.)

решение1

Вот грязное решение, которое требует ручного размещения полусумматоров; более умное решение должно быть возможно с использованием форм TikZ...

ПРАВКА: После комментария Питера Грилла я удалил второй (бесполезный) аргумент.

введите описание изображения здесь

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

решение2

Все пути не знают друг о друге. Первая указанная вами координата \coordinate …;не связана со следующими путями (кроме позиционирования).

Это можно сделать одним путем:

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

или как insert pathстиль:

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

Выход

введите описание изображения здесь

решение3

Можно сократить код: способ размещения узлов, как в других ответах, заключается в использовании xshift, все координаты изменяются.

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

и вариант с другим стилем:

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

Замечание: лучше избегать второго варианта, \foreachесли имеется всего два узла.

Связанный контент