Связывание цикла \foreach для запуска с определенной позиции узла

Связывание цикла \foreach для запуска с определенной позиции узла

Используя следующий код, я вручную сделал так, чтобы цикл \foreach начинался с местоположения центра узла B.

Как можно автоматически запустить цикл \foreach в центре узла B, чтобы, когда я захочу отредактировать код и изменить его местоположение, цикл \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}

введите описание изображения здесь

Связанный контент