
次のコードを使用して、ノード 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
問題が、質問に示されているように、画像を描画することだけである場合、次の方法で画像を描画します。
- まず赤いボックスを描く
- その後、最も愛するボックスの南座標に対する破線の開始を決定します
- 描画では使いやすく
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}