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 모양을 사용하면 더 영리한 솔루션이 가능해야 합니다...

편집: Peter Grill의 의견에 따라 두 번째 (쓸모없는) 두 번째 인수를 제거했습니다.

여기에 이미지 설명을 입력하세요

\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참고: 두 개의 노드만 있는 두 번째를 피하는 것이 더 좋습니다 .

관련 정보