Vincular un bucle \foreach para comenzar desde una posición de nodo específica

Vincular un bucle \foreach para comenzar desde una posición de nodo específica

Usando el siguiente código, hice manualmente que el bucle \foreach comience desde la ubicación del centro del nodo B.

¿Cómo puedo iniciar automáticamente el bucle \foreach en el centro del nodo B, de modo que cuando quiera editar el código para cambiar su ubicación, el bucle \foreach comience desde la nueva ubicación sin la necesidad de redefinir su posición inicial en (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}

ingrese la descripción de la imagen aquí

Respuesta1

Opción 1

Utilice la coordenada (B|-0,\X), que encuentra la intersección entre una línea vertical que pasa (B)y una horizontal que pasa por (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}

opcion 2

Úselo foreachdentro de una ruta que comience desde 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}

Tenga en cuenta que esto le brinda nombres más naturales para los (y-N)nodos y además se siente más legible. Indica ++(0,1.5)el cambio desde la última coordenada en el pasado, lo que parece más intuitivo y más fácil de cambiar que proporcionar manualmente los yvalores en la lista del bucle.


En ambos casos, el cuadro tenía un espacio inicial adicional que habría resultado en un desplazamiento x no deseado en los cuadros rectangulares. Se ha eliminado comentando la nueva línea.

Respuesta2

Si el problema es solo dibujar la imagen, que muestra en su pregunta, yo dibujaría su imagen de la siguiente manera:

  • primero dibuja cajas rojas
  • después de determinar el inicio de la línea discontinua relativa a la coordenada sur del cuadro más amado
  • en dibujo es útil de usar chainsy positioningbibliotecas
  • No es necesario dibujar cuadros rojos savebox; en cambio, es más sencillo definir el estilo para los cuadros rojos:
\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}

ingrese la descripción de la imagen aquí

información relacionada