如何用 Tikz 在其他人身上画一个块?

如何用 Tikz 在其他人身上画一个块?

这是我尝试使用 tikz 制作的图表。块 A、B 和 C 位于一个块内(此处为具有红色背景的块),而块 E 和 F 位于另一个块内。两个巨大的块(具有红色背景)顶部有标签(LabA 和 LabB)。此外,我希望块 E 位于块 A 和 B 的中间。并且指向块 E 的箭头应该有一些弯曲角度;所以,不像我尝试过的那个。

预期的

这是我的代码。

\documentclass[varwidth,border=7]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,calc}
\tikzstyle{block} = [draw=black, thick, text width=2cm, minimum height=1cm, align=center]  
\tikzstyle{arrow} = [thick,->,>=stealth]

\begin{document}

    \begin{tikzpicture}
    
        \node[block] (a) {a};
        \node[block, below=of a, yshift=0.7cm] (b) {b};
        \node[block, below=of b, yshift=0.7cm] (c) {c};
        \node[block, right=of c, xshift=0.7cm] (d) {d};
        
        \node[block, right=of a, xshift=0.7cm, yshift=-0.4cm] (e) {e};
        
        \draw [arrow] (a) -- (e);
        \draw [arrow] (b) -- (e);
        \draw [arrow] (c) -- (d);
        
    \end{tikzpicture}

\end{document}

我如何才能在一些节点上添加一个矩形并在其上写一个标签。
如何让这里的箭头具有一定的倾斜角度(不是直线),以及如何让 E 块位于 A 块和 B 块的中间和右侧。我本以为可以用 得到箭头\draw [arrow] (a) -|- (e);,但不起作用。

我也添加了\node[draw,inner xsep=4mm,inner ysep=7mm,fit=(a)(b)(c)]{};但是这会产生以下错误:

Timed out. Sorry, your compile took too long to run and timed out. This may be due to a LaTeX error, or a large number of high-res images or complicated diagrams.

先感谢您

当前状态

答案1

块上块

\documentclass[tikz,border=3.14mm]{standalone}
\usetikzlibrary{
        fit,
        backgrounds,
        positioning,
        calc,
        arrows.meta}

\tikzset{
        bBlock/.style={minimum width=5mm,fill=blue!70,text=white},
        rBlock/.style={minimum width=1cm,minimum height=3cm,fill=red},
        arr/.style={line width=.75pt,-Stealth}
        }

\begin{document}
    \begin{tikzpicture}[on grid,font=\sffamily]
        \def\dist{1.5} % Distance between red blocks
        \node[bBlock] (A) {A};
        \node[bBlock,below of= A] (B) {B};
        \node[bBlock,below of=B] (C) {C};
        
        \path($(A)!0.5!(B)$)--++ (\dist,0) node[bBlock] (E) {E};
        \path(C)--++ (\dist,0) node[bBlock] (D) {D};
        
        \begin{scope}[on background layer]
            \node[rBlock,fit=(A)(C),label=above:LabA] (R1) {};
            \node[rBlock,right= \dist cm of R1,label=above:LabB] (R2) {};
        \end{scope}
        
        \draw[arr] (A) --++ (.5*\dist,0) |- ($(E.west)+(0,0.1)$);
        \draw[arr] (B) --++ (.5*\dist,0) |- ($(E.west)+(0,-0.1)$);
        \draw[arr] (C) -- (D);
    \end{tikzpicture}
\end{document}

编辑:一些解释

1.您必须使用 定义块的方面tikzset。在这里我选择将minimum width红色块设置为 1cm,将蓝色块设置为 0.5cm,然后,为了获得两个相同的红色块,我将 设置minimum height为 3 cm。请注意,我也定义了箭头样式。

2.此处的参数on grid用于定义节点在电网上,即当将一个节点定位在另一个节点右侧时,节点宽度不会影响定位。

3. \path($(A)!0.5!(B)$)--++ (\dist,0)意思是你从节点 A 和 B 之间的中间点开始(使用calc库),然后\dist向右添加以找到放置节点 E 的位置。

4.您必须在背景层上绘制并填充红色节点,因为您已经绘制了蓝色节点。这可以使用 Excelsior 命令或我的命令来实现。左侧红色节点定义为适合 A 和 C 节点,右侧红色节点定义为放置在右侧\distcm 处。

5. \draw[arr] (A) --++ (.5*\dist,0) |- ($(E.west)+(0,0.1)$);意味着你从节点 A 开始画一个箭头,向右走到一半\dist(正好走到两个红色节点之间的空间中间),然后使用|-直角,到达节点 E。但你不希望两个箭头的终点恰好在同一个地方,所以这里还有另一种用法,calc将箭头的终点放在节点 E 的稍上方west(来自 B 的箭头则稍下方)。

希望这是清楚的。

答案2

问题 1 我如何在某些节点上添加一个矩形并在其上面写一个标签。

您可以使用fit命令,在矩形中为定义的节点添加一个矩形。缺点是,第二列的矩形较低,因为节点较低。或者,您可以“手动”在背景中放置一个矩形。

第二季度 如何让这里的箭头具有一定的倾斜角度(不是直线),并且让 E 块位于 A 块和 B 块的中间和右侧。

可以使用语法调整箭头--++(xshift,yshift),然后执行“prependicular命令” |-

在此处输入图片描述

\documentclass[varwidth,border=7]{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,fit,calc,backgrounds}

\tikzstyle{block} = [draw=black, fill=cyan, thick, minimum height=0.5cm, align=center]  

\tikzstyle{arrow} = [thick,->,>=stealth]

\begin{document}
    
    \begin{tikzpicture}
        
        \node[block] (a) {\textcolor{white}{A}} node[above=10pt] {\textbf{Lab A}};
        \node[block, below=of a, yshift=0.7cm] (b) {\textcolor{white}{B}};
        \node[block, below=of b, yshift=0.7cm] (c) {\textcolor{white}{C}};
        \node[block, right=of c, xshift=0.7cm] (d) {\textcolor{white}{D}};
        
        \node[block, right=of a, xshift=0.7cm, yshift=-0.4cm] (e) {\textcolor{white}{E}};
        
        \node[above=10pt] at (e) {\textbf{Lab B}};
        
        \draw [arrow] (a) --++ (1,0) |-  (e);
        \draw [arrow] (b) --++ (1,0) |- (e);
        \draw [arrow] (c) -- (d);
        
        \begin{pgfonlayer}{background}
            \node[fit=(a)(c), fill=red, inner sep=5pt] {};
            \node[fit=(d)(e), fill=red, inner sep=5pt] {};
        \end{pgfonlayer}
    
    \end{tikzpicture}
    
\end{document}

答案3

使用backgroundscalcchainsfitTi用于节点定位和arrows.meta箭头的 Z 库:

\documentclass[border=3.141592]{standalone}%{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,
                backgrounds,
                calc, chains, 
                fit,
                positioning}

\begin{document}
    \begin{tikzpicture}[
node distance = 2mm and 8mm,
  start chain = going below,
   box/.style = {fill=blue!50, font=\bfseries, text=white,
                 minimum height=4ex, minimum width=1em,
                 outer sep=0pt},
   FIT/.style = {fill=red, inner sep=2mm, fit=#1},
every path/.append style = {draw, semithick, -{Straight Barb[scale=0.8]}}
                        ]
%
\scoped[nodes={box, on chain}]
{
\node   (a) {A};   
\node   (b) {B};
\node   (c) {C};
}
%
\node [box, 
       right=of $(a.east)!0.5!(b.east)$] (e) {E};
\node [box,
       right=of c]                       (d) {D};
%
\scoped[on background layer]
{
    \node[FIT=(a) (c)] {};
    \node[FIT=(a.north -| e) (d)] {};
}
%
\draw   (a.east) --++ (4mm,0) |- ([yshift=+3pt] e.west);
\draw   (b.east) --++ (4mm,0) |- ([yshift=-3pt] e.west);
\draw   (c) -- (d);
    \end{tikzpicture}
\end{document}

在此处输入图片描述

答案4

所有其他答案都使用在背景层上绘制的适合节点来填充一组节点周围的区域。

由于节点组具有规则分布,因此可以将它们绘制为一个节点,并用与内部节点不同的颜色matrix填充。这样就不需要或节点了。matrixbackgroundsfitting

在这个特殊情况下,右块中的节点分布不太好matrix,但可以解决这个问题。由于右下块位置与左下块位置相同,因此绘制了一个类似的矩阵,但两个上块填充了背景色。之后,在矩阵上放置一个独立块。

\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning, matrix, arrows.meta}

\begin{document}
\begin{tikzpicture}[
    box/.style={fill=blue!50, font=\bfseries, text=white,
        minimum size=4ex, inner sep=.3333em, outer sep=0pt},
    Box/.style={matrix of nodes, row sep=1mm, nodes in empty cells, fill=red, inner sep=1mm, 
        nodes={box, anchor=center}},
    link/.style={-Stealth, blue!50!black, thick}]
        
\matrix[Box] (B1) {|(A)|A\\|(B)|B\\|(C)|C\\};   

\matrix[Box, right=5mm of B1, nodes={fill=red}] (B2) {\\ \\|[name=D, fill=blue!50]|D\\};
\path (B2-1-1)--node[box] (E) {E} (B2-2-1); 

\draw[link] (A)--++(0:6mm)|-(E);
\draw[link] (B)--++(0:6mm)|-(E);
\draw[link] (C)--(D);

\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容