特定のノード位置から開始する\foreachループをリンクする

特定のノード位置から開始する\foreachループをリンクする

次のコードを使用して、ノード B の中心の位置から \foreach ループが開始するように手動で設定しました。

コードを編集して場所を変更するときに、開始位置を (3,\X) に再定義する必要なく、\foreach ループが新しい場所から開始されるように、ノード B の中心で \foreach ループを自動的に開始するにはどうすればよいですか。

\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

問題が、質問に示されているように、画像を描画することだけである場合、次の方法で画像を描画します。

  • まず赤いボックスを描く
  • その後、最も愛するボックスの南座標に対する破線の開始を決定します
  • 描画では使いやすくchainspositioningライブラリ
  • 赤いボックスを描画する必要はありません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}

ここに画像の説明を入力してください

関連情報