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}

次の操作を実行したいです。開始座標を設定し、マクロを呼び出してコンポーネントを描画し、次に座標を別の場所に設定して再度描画を呼び出します。最終的に、次のように 2 つのコンポーネントを描画します。

ここに画像の説明を入力してください

しかし、結果は次のようになります:

ここに画像の説明を入力してください

\newcommand を試し、\halfadderplain をパラメータ化して座標を設定しましたが、正しく実行されました。また、上記のコード内の \halfadderplain をその定義に置き換えようとしましたが、何も起こりませんでした。したがって、これはマクロの問題ではなく、TikZ が位置を計算する方法についての私の誤解だと思います。誰か助けてくれませんか?

(この種のものを描画するために特定のライブラリを使用することは、私にとっては解決策ではないことに注意してください。)

答え1

これは、半加算器ユニットを手動で配置する必要がある汚い解決策です。TikZ シェイプを使用すると、より巧妙な解決策が可能であるはずです...

編集: Peter Grill のコメントに従って、2 番目の (役に立たない) 引数を削除しました。

ここに画像の説明を入力してください

\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 …;後続のパスには接続されません (位置決めを除く)。

1 つのパスで実行できます:

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

注: \foreach2 つのノードのみを使用する場合は、2 番目の方法を避けることをお勧めします。

関連情報