Verknüpfen einer \foreach-Schleife, um an einer bestimmten Knotenposition zu beginnen

Verknüpfen einer \foreach-Schleife, um an einer bestimmten Knotenposition zu beginnen

Mithilfe des folgenden Codes habe ich manuell dafür gesorgt, dass die \foreach-Schleife an der Position des Mittelpunkts von Knoten B beginnt.

Wie kann ich die \foreach-Schleife automatisch in der Mitte des Knotens B starten, sodass, wenn ich den Code bearbeiten möchte, um ihre Position zu ändern, die \foreach-Schleife an der neuen Position startet, ohne dass ich ihre Startposition bei (3,\X) neu definieren muss.

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

Bildbeschreibung hier eingeben

Antwort1

Option 1

Verwenden Sie die Koordinate (B|-0,\X), die den Schnittpunkt zwischen einer vertikalen Linie durch (B)und einer horizontalen Linie durch findet (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}

Option 2

Verwendung foreachinnerhalb eines Pfades, beginnend bei 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}

Beachten Sie, dass Sie dadurch eine natürlichere Benennung der (y-N)Knoten erhalten und diese zudem besser lesbar ist. Dies ++(0,1.5)gibt die Verschiebung seit der letzten Koordinate in der Vergangenheit an, was intuitiver erscheint und einfacher zu ändern ist, als die yWerte manuell in der Liste der Schleife anzugeben.


In beiden Fällen hatte die Box einen zusätzlichen anfänglichen Zwischenraum, der zu einer unerwünschten X-Verschiebung in den rechteckigen Boxen geführt hätte. Dieser wurde durch Kommentieren der neuen Zeile entfernt.

Antwort2

Wenn das Problem nur darin besteht, das Bild zu zeichnen, das Sie in Ihrer Frage zeigen, würde ich Ihr Bild folgendermaßen zeichnen:

  • ziehe zuerst rote Kästchen
  • Danach bestimmen Sie die gestrichelte Startlinie relativ zur Südkoordinate der Lovest-Box
  • in der Zeichnung ist praktisch zu verwenden chainsund positioningBibliotheken
  • zum Zeichnen von roten Kästen ist dies nicht erforderlich savebox. Stattdessen ist es einfacher, den Stil für rote Kästen zu definieren:
\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}

Bildbeschreibung hier eingeben

verwandte Informationen