
使用以下程式碼,我手動使 \foreach 循環從節點 B 中心的位置開始。
如何在節點 B 的中心自動啟動 \foreach 循環,以便當我想編輯程式碼以更改其位置時, \foreach 循環將從新位置開始,而不需要重新定義其起始位置(3,\X)。
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{verbatim}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{frame}[t]
\frametitle{}
\newsavebox{\recBBr}
\savebox{\recBBr}{
\begin{tikzpicture}[scale=.6]
\draw [thick, black, fill=red!60!white] (0,0) rectangle +(1,1.24*1.68);
\end{tikzpicture}}
\begin{tikzpicture}[scale=.8, transform shape]
\draw [line width=.4mm, black, dashed](0,0) -- (11,0) node [pos=.28] (B) {\Large B};
\begin{scope}[on background layer]
\foreach \X in {0,1.5,3,4.5}
{\node[blue, yshift=.64cm] (y-\X) at (3,\X){\usebox{\recBBr}};}
\end{scope}
\end{tikzpicture}
\end{frame}
\end{document}
答案1
選項1
使用座標,它可以找到通過 的垂直線和通過 的水平線(B|-0,\X)
之間的交點:(B)
(0,\X)
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{verbatim}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{frame}[t]
\frametitle{}
\newsavebox{\recBBr}
\savebox{\recBBr}{% <-- important so you don't get extra space in the box
\begin{tikzpicture}[scale=.6]
\draw [thick, black, fill=red!60!white] (0,0) rectangle +(1,1.24*1.68);
\end{tikzpicture}}
\begin{tikzpicture}[scale=.8, transform shape]
\draw [line width=.4mm, black, dashed](0,0) -- (11,0) node [pos=.28,font=\Large] (B) {B};
\begin{scope}[on background layer]
\foreach \X in {0,1.5,3,4.5}
{\node[blue,yshift=.64cm] (y-\X) at (B|-0,\X){\usebox{\recBBr}};}
\end{scope}
\end{tikzpicture}
\end{frame}
\end{document}
選項2
foreach
在從以下位置開始的路徑內使用B
:
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{verbatim}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\begin{document}
\begin{frame}[t]
\frametitle{}
\newsavebox{\recBBr}
\savebox{\recBBr}{% <-- important so you don't get extra space in the box
\begin{tikzpicture}[scale=.6]
\draw [thick, black, fill=red!60!white] (0,0) rectangle +(1,1.24*1.68);
\end{tikzpicture}}
\begin{tikzpicture}[scale=.8, transform shape]
\draw [line width=.4mm, black, dashed](0,0) -- (11,0) node [pos=.28,font=\Large] (B) {B};
\begin{scope}[on background layer]
\path
(B)
\foreach \X in {1,...,4} {
node[blue,yshift=.64cm] (y-\X) {\usebox{\recBBr}}
++(0,1.5)
};
\end{scope}
\end{tikzpicture}
\end{frame}
\end{document}
請注意,這為您提供了更自然的(y-N)
節點命名,而且感覺更具可讀性。表示++(0,1.5)
自過去最後一個座標以來的移位,這感覺更直觀,並且比手動提供y
循環列表中的值更容易更改。
在這兩種情況下,盒子都有額外的初始空間,這會導致矩形盒子中不必要的 x 偏移。它已通過註釋換行符被刪除。
答案2
如果問題只是繪製您在問題中顯示的圖像,那麼我會以以下方式繪製您的圖像:
- 首先畫紅框
- 然後確定相對於最喜歡的盒子的南坐標的起始虛線
- 在繪圖中使用起來很方便
chains
,並且positioning
有庫 - 不需要繪製紅色框
savebox
,而是更簡單定義紅色框的樣式:
\documentclass{beamer}
\beamertemplatenavigationsymbolsempty
\usepackage{verbatim}
\usepackage{tikz}
\usetikzlibrary{chains,
positioning}
\begin{document}
\begin{frame}[t]
\frametitle{}
\begin{tikzpicture}[
node distance = 2mm and 32mm,
start chain = going below,
box/.style = {draw, thick, fill=red!60!white,
minimum width=6mm, minimum height=12mm,
inner sep=0pt, outer sep=0mm,
on chain}
]
\foreach \i in {1,...,4}
\node (n\i) [box] {};
\coordinate[left=of n4.south] (a);
\draw [line width=.4mm, dashed]
(a) -- ++ (11,0);
\node[font=\Large] at (n4.south) {B};
\end{tikzpicture}
\end{frame}
\end{document}