如何在 TikZ 的不同節點之間共用所選選項?

如何在 TikZ 的不同節點之間共用所選選項?

(我沒有找到更好的問題標題。歡迎提出建議。)

我在 TikZ 中創建了一些新形狀,當某個鍵傳遞到最後一個節點時,我想將其中一個形狀放在另一個形狀下方。我將透過使用兩個矩形的範例更好地展示我的意思:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{patterns,calc}

\tikzstyle{ground}=[append after command={;\node[draw=red,rectangle,anchor=north] (B) at (\tikzlastnode.south){a}}]


\begin{document}
\begin{tikzpicture}
  \node[draw,rectangle,ground,rotate=10] (A) at (0,0){a};% not good
  \begin{scope}[shift={(1,0)}]
    \node[draw,rectangle,rotate=10] (B) at (0,0){a};
    \node[draw=red,rectangle,anchor=north,rotate=10] (C) at (B.south){a};% OK
  \end{scope}
\end{tikzpicture}
\end{document}

堆疊節點

正如您所看到的,我創建了一種樣式,該樣式將第二個節點的建立正確地引用到第一個節點。一切工作正常,但是,例如,如果我需要將兩個形狀一起旋轉,我找不到解決方案,因為只有第一個矩形被旋轉(左)。我實現所需結果的唯一方法是程式碼中顯示的方法,其中我必須手動繪製第二個節點並將選項傳遞給它rotate

那麼,有沒有一種方法可以實現所需的結果(右側),但使用第一個範例(左側)的語法?請注意,涉及的兩個真實形狀都是我繪製的,因此如果需要自訂也可以。

答案1

如果您知道哪些參數會影響附加節點,您可以將它們包含到.style.這裡有一個基於您的程式碼的範例。我不知道它是否能解決您的實際問題。

在您的範例中,您需要rotate附加節點,因此我定義了一個ground樣式,其中包含此參數,並將 0 作為預設值。

    ground/.style={%
       append after command={;%
          \node[draw=red,rectangle,
             anchor=north,rotate=#1] (B) 
             at (\tikzlastnode.south){a}}},
    ground/.default=0,

現在可以這樣寫\node[draw,rectangle,ground=10,rotate=10] (A) at (0,0){a};,但這樣您必須確保在ground和中寫入相同的值rotate。更好的解決方案是定義一個包含兩者的新樣式,其作用如下grounded

    grounded/.style={ground=#1,rotate=#1},
    grounded/.default=0}

完整的程式碼是:

\documentclass[tikz,border=1mm]{standalone}

\tikzset{%
    ground/.style={%
       append after command={;%
          \node[draw=red,rectangle,
             anchor=north,rotate=#1] (B) 
             at (\tikzlastnode.south){a}}},
    ground/.default=0,
    grounded/.style={ground=#1,rotate=#1},
    grounded/.default=0}

\begin{document}
\begin{tikzpicture}
  \node[draw,rectangle,ground=10,rotate=10] (A) at (0,0){a};
  \node[draw,rectangle,grounded] (A) at (0.5,0){a};
  \node[draw,rectangle,grounded=25] (A) at (1,0){a};    
  \node[draw,rectangle,grounded=-25] (A) at (1.5,0){a};
\end{tikzpicture}
\end{document}

在此輸入影像描述

並且,請看一下:應該使用 \tikzset 或 \tikzstyle 來定義 TikZ 樣式嗎?

答案2

嘗試這個,使用範圍和變換形狀

  \begin{scope}[shift={(2,0)},rotate=10,transform shape]
  \node[draw,rectangle,ground,] (A) at (0,0){a};% not good
  \end{scope}

相關內容