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只有兩個節點的情況。

相關內容