TikZ - schlechte Positionierung von per Makro gezeichneten Bildern

TikZ - schlechte Positionierung von per Makro gezeichneten Bildern

Wahrscheinlich eine lahme Frage dazu, wie die Positionierung in TikZ funktioniert. Ich versuche, einige elektrische Dinge zu zeichnen (beginnend auf der Ebene einzelner Tore) und da sich viele davon immer wieder wiederholen, möchte ich Makros zum Zeichnen definieren. Ich habe dieses einfache Ding:

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

Ich möchte, dass es Folgendes tut: Ich lege eine Anfangskoordinate fest und rufe das Makro auf, um die Komponente zu zeichnen. Dann lege ich die Koordinate woanders fest und rufe das Zeichnen erneut auf. Am Ende möchte ich zwei Komponenten haben, die wie folgt gezeichnet sind:

Bildbeschreibung hier eingeben

sondern stattdessen ist das Ergebnis nur:

Bildbeschreibung hier eingeben

Ich habe den \newcommand ausprobiert und \halfadderplain parametrisiert, um die Koordinaten festzulegen, und es hat richtig funktioniert. Ich habe auch versucht, \halfadderplain im obigen Code durch seine Definition zu ersetzen, und nichts ist passiert. Ich denke also, dass dies kein Problem mit dem Makro ist, sondern nur mein Missverständnis, wie TikZ die Position berechnet. Kann mir bitte jemand helfen?

(Bitte beachten Sie, dass die Verwendung einer bestimmten Bibliothek zum Zeichnen dieser Art von Dingen für mich KEINE Lösung ist.)

Antwort1

Hier ist eine schmutzige Lösung, die eine manuelle Platzierung der Halbaddierer-Einheiten erfordert; mit TikZ-Formen muss eine cleverere Lösung möglich sein …

BEARBEITEN: Ich habe gemäß dem Kommentar von Peter Grill das zweite (nutzlose) zweite Argument entfernt.

Bildbeschreibung hier eingeben

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

Antwort2

Die Pfade kennen sich gegenseitig nicht. Die erste Koordinate, die Sie angeben, \coordinate …;ist nicht mit den folgenden Pfaden verbunden (außer bei der Positionierung).

Sie können dies auf einem Weg tun:

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

oder als insert pathStil:

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

Ausgabe

Bildbeschreibung hier eingeben

Antwort3

Es ist möglich, den Code zu reduzieren: Die Knoten werden wie in den anderen Antworten durch die Verwendung von platziert xshift. Alle Koordinaten werden geändert.

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

und eine Variante mit einem anderen Stil ist:

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

\foreachBemerkung: Es ist besser, den zweiten mit nur zwei Knoten zu vermeiden .

verwandte Informationen