使用具有多个输入的 Tikz 绘制闭环图

使用具有多个输入的 Tikz 绘制闭环图

我第一次使用 Tikz,在绘制图表时遇到了困难

图表是这样的 在此处输入图片描述

我找到了一个代码并尝试修改它,使其尽可能地与上面的图表相似(直到线条的粗细),但每当我执行某些操作时,它似乎都会产生错误消息。我甚至无法将加号移动到线条的右侧。

我不知道 Tikz 的功能,如果无法使用 Tikz 绘制此图表,请告诉我,我将使用我当前的非 Tikz 方法来绘制,大约需要 30 秒。不幸的是,它不具备即时更改的灵活性(更重要的是,我需要绘制图表的 Latex 字体)。

在此处输入图片描述

\tikzstyle{block} = [draw, fill=white, rectangle, 
minimum height=3em, minimum width=6em]
\tikzstyle{sum} = [draw, fill=white, circle, node distance=1cm]
\tikzstyle{input} = [coordinate]
\tikzstyle{output} = [coordinate]
\tikzstyle{pinstyle} = [pin edge={to-,thin,black}]

\begin{figure}[ht]
\centering
\begin{tikzpicture}[auto, node distance=2cm,>=latex']

\node [input, name=input] {};
\node [sum, right of=input] (sum) {};
\node [block, right of=sum] (Ablock) {A};
\node [block, right of=Ablock, node distance=4cm] (Bblock) {B};

\draw [->] (Ablock) -- node[name=b] {$b_1$} (Bblock);
\node [output, right of=Bblock] (output) {};
\node [block, below of=b] (Cblock) {C};

\draw [->] (sum) -- node {$a_1$} (Ablock);

\draw [->] (Bblock) -- node [name=c] {$c_1$}(output);
\draw [->] (c) |- (Cblock);
\draw [->] (Cblock) -| node[pos=0.99] {$+$} 
node [near end] {$$} (sum);
\end{tikzpicture}
\end{figure}

如果有人能帮助我创建上述图表,我将不胜感激。

答案1

看看以下解决方案是否可以接受:

\documentclass[border=3mm,tikz]{standalone}
    \usetikzlibrary{calc,positioning, quotes}

\makeatletter
\def\tikzsavelastnodename#1{\let#1=\tikz@last@fig@name}
\makeatother
    \newcommand\ppbb{path picture bounding box}

\tikzset{%
    node distance=9mm and 12mm,
shorten <>/.style = {%
    shorten >=#1, shorten <=#1
                    },
dot/.style={%
    circle, fill=black,
    minimum size=1mm, inner sep=0mm, outer sep=0mm,
    node contents={}
                },
sum/.style={%
    circle, draw=black, minimum size=6mm,
    path picture={\draw[very thick,shorten <>=1mm,-]
    (\ppbb.north) edge (\ppbb.south)
    (\ppbb.west)   --  (\ppbb.east);
                },% end of node contents
            node contents={}},
element/.style={%
    draw, thick,
    minimum size=11mm, inner xsep=5mm,
    append after command={\pgfextra{\tikzsavelastnodename\tikzsavednodename}},#1
                },
subelement/.style args={#1:#2}{%
    append after command =
    {node[minimum size=3mm,
          font=\footnotesize,% <-- new
          inner sep=2pt] at (\tikzsavednodename.#1) [anchor=#1] {#2}}
                            },
every path/.style = {->, semithick} % <-- new
        }% end of tikzset

\begin{document}
    \begin{tikzpicture}
% first row
\node (n1) [sum];
\node (n2) [element,
            subelement=north east:$\alpha$,
            right=of n1]    {$A$};
\node (n3) [element,
            subelement=north east:$\beta$,
            right=of n2]    {$B$};
\node (n4) [dot,
            right=of n3];
% second row
\node (n5) [element,
            subelement=north east:$\omega$,
            below=of n2]    {$D$};
\node (n6) [element,
            subelement=north east:$\gamma$,
            below=of n3]    {$C$};
% lines
\draw (n1) to ["$a$"] (n2);
\draw (n2) to ["$b_1$"] (n3);
\draw (n3) to ["$c_1$"] (n4) -- + (0.7,0);
\draw (n4) |- (n6);
\draw (n6) to ["$d_1$" '] (n5);
\draw (n5) -| (n1.south) node[below right] {$+$};
%lines with transformed canvas
    \begin{scope}[transform canvas={yshift=-3mm}]
\draw ($(n2)!0.6!(n3)$) node[left] {$b_2$} -- (n3);
\draw ($(n5)!0.4!(n6)$) node[right] {$d_2$} -- (n5);
\draw (n4 |- n6) node[right] {$c$} -- (n6);
    \end{scope}
\end{tikzpicture}
    \end{document}

在此处输入图片描述

笔记: 上面的 MWE 相当复杂和精密,但它也是模块化的,具有预先定义的常用样式\tikzset。这样可以实现统一的图像外观和相对简单的图像设计。

预定义样式为:

  • sum图中为求和节点。 可以通过更改内部线条的粗细(设置为very thick)及其长度(用 确定shorten <>=1mm)来轻松自定义加号内部。 对于加号符号的绘制线条,path picture bounding box使用 a,简而言之,使用新命令 来定义ppbb
  • dot用于标记线路连接点。
  • element这是图表中主要节点的样式。其中append after command准备好了在其中写入标签的可能性。
  • subelement被称为标签,位于element节点内部。它用于在节点的右上角写上希腊字母element

借助 TikZ 库标记节点之间的连接线quotes。绘制一些节点的附加输入,scope并将transform canvas它们移动到正确的位置。

附录:方案中节点的存在sum不太合逻辑。在我看来,它是多余的,应该用简单的坐标代替。在这种情况下,MWE(没有前言,与上面相同)是:

    \begin{tikzpicture}
% first row
\coordinate (n1) at (0,0);
\node (n2) [element,
            subelement=north east:$\alpha$,
            right=of n1]    {$A$};
\node (n3) [element,
            subelement=north east:$\beta$,
            right=of n2]    {$B$};
\node (n4) [dot,
            right=of n3];
% second row
\node (n5) [element,
            subelement=north east:$\omega$,
            below=of n2]    {$D$};
\node (n6) [element,
            subelement=north east:$\gamma$,
            below=of n3]    {$C$};
% lines
\draw (n2) to ["$b_1$"] (n3);
\draw (n3) to ["$c_1$"] (n4) -- + (0.7,0);
\draw (n4) |- (n6);
\draw (n6) to ["$d_1$" '] (n5);
\draw (n5) -| (n1) to ["$a$"] (n2);
%lines with transformed canvas
    \begin{scope}[transform canvas={yshift=-3mm}]
\draw ($(n2)!0.6!(n3)$) node[left] {$b_2$} -- (n3);
\draw ($(n5)!0.4!(n6)$) node[right] {$d_2$} -- (n5);
\draw (n4 |- n6) node[right] {$c$} -- (n6);
    \end{scope}
\end{tikzpicture}

图片是:

在此处输入图片描述

编辑: 现在被认为是您在评论中表达的愿望。对于线条,在 中添加了\tikzset样式,every path其中 定义了线条略粗,并且每条线条的右侧都有箭头。此外,还定义了 中的较小字体大小subelement和 的外观改进。仅在第二幅图(无)dot中考虑了这些变化。sum

相关内容