我第一次使用 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