(我沒有找到更好的問題標題。歡迎提出建議。)
我在 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}
答案2
嘗試這個,使用範圍和變換形狀
\begin{scope}[shift={(2,0)},rotate=10,transform shape]
\node[draw,rectangle,ground,] (A) at (0,0){a};% not good
\end{scope}