我想画一些这样的东西。
但我能够画出这些东西:
因此存在三个问题:
- 输入和输出箭头位置不正确。
- 我想要一个 5 X 1 MUX 文本上方的矩形。
- 我无法在块内正确定位文本。例如,我希望在每个箭头前面都放置 x。
我附上了我的 tex 代码
\begin{tikzpicture}[thick]
\node [input, name=input] {};
\node [block, right of=input,minimum width=3cm, minimum height=2.5cm,node distance=0.5cm] (a) {Frame Encoder};
\node [block, right of=a,minimum width=3cm, minimum height=5cm,node distance=5cm] (b) {};
\node [block, right of=b, pin={[pinstyle]above:Ack},minimum width=3cm, minimum height=5cm,node distance=5cm] (c) {$5$ $\times$ $1$ MUX};
\node [output,right of=c] (output) {};
\begin{scope}[->,>=latex]
\draw[->] (input) -- (a);
\draw[->] (c) -- (output);
\foreach \i in {-2,...,2}{%
\draw[->] ([yshift=\i * 0.4 cm]a.east) -- ([yshift=\i * 0.8 cm]b.west) ;}
\foreach \i in {-2,...,2}{%
\draw[->] ([yshift=\i * 0.8 cm]b.east) -- ([yshift=\i * 0.8 cm]c.west) ;}
\end{scope}
\end{tikzpicture}
非常感谢您的帮助。我的大部分问题都解决了。现在只有一个问题。我希望这些 x 被编号。为此,我按照一些人的建议使用了 count。但现在它无法编译。我犯了什么错误?
\begin{tikzpicture}[thick]
\tikzset{input/.style={}}
\tikzset{block/.style={rectangle,draw}}
\tikzstyle{pinstyle} = [pin edge={to-,thick,black}]
\node [input, name=input] {};
\node [block, right=1cm of input,minimum width=3cm, minimum height=2.5cm] (a) {Frame Encoder};
\node [block, right of=a,minimum width=3cm, minimum height=5cm,node distance=5cm] (b) {};
\node [block, right of=b, pin={[pinstyle]above:Ack},minimum width=3cm, minimum height=5cm,node distance=5cm] (c) {$5$ $\times$ $1$ MUX};
\node [right =1cm of c] (output) {};
\begin{scope}[->,>=latex]
\draw[->] (input) -- (a);
\node at (b.center) {\footnotesize{z}};
\draw[above] ($(c.text)+(0,1)$)rectangle ($(c.text)+(1.85,2)$);
\draw[->] (c) -- (output);
\foreach \i [count=\xi]in {2,...,-2}{%
\draw[->] ([yshift=\i * 0.4 cm]a.east) -- ([yshift=\i * 0.8 cm]b.west) node[right]{\footnotesize{$x_{\xi}$}} ;}
\foreach \i in {-2,...,2}{%
\draw[->] ([yshift=\i * 0.8 cm]b.east) -- ([yshift=\i * 0.8 cm]c.west) ;}
\end{scope}
\end{tikzpicture}
答案1
1)输入和输出箭头位置不正确:
这很正常,因为默认情况下right of=input
将节点放置在 (输入) 右侧 1 厘米处,但给出的新节点的宽度 minimum width=3cm
为 3 厘米。 (输入) 位于新节点内。 对于 (输出),你犯了同样的错误。 您可以使用库定位,将输入的右侧设置为 3 厘米,也可以使用“anchor=west”。
2)使用(c.center)
和yshift
3)对于文本,问题不清楚
如果图片需要缩放操作,这里有一个解决方案
\documentclass{article}
\usepackage{tikz}
%\usetikzlibrary{calc,positioning} no it's not useful
\begin{document}
\begin{tikzpicture}[thick,scale=.8]
\tikzset{input/.style={}} % <= this can be avoided but then use simply \node[name=input]{};
\tikzset{block/.style={rectangle,fill=blue!15,draw,anchor=west,minimum width=3cm,minimum height=5cm}} % to avoid some repetitions
\node [input, name=input] {};
\node [block, minimum height=2.5cm] (a) at ([xshift=1cm]input) {Frame Encoder};
\node [block ] (b) at ([xshift=4cm]a) {};
\node [block, right of=b, pin={above:Ack}] (c) at ([xshift=4cm]b) {$5$ $\times$ $1$ MUX};
\node (output) at ([xshift=3cm]c) {};
\node [draw,minimum height =1cm,minimum width=1.85cm,below=.5cm] at (c.north) {};
\node at (b.center) {\footnotesize{z}};
\begin{scope}[->,>=latex]
\draw (input) -- (a); % I remove -> because it's an option of the scope !
\draw (c) -- (output); % idem
\foreach \i [count=\xi] in {-2,...,2}{% remove ->
\draw ([yshift=\i * 0.4 cm]a.east) -- ([yshift=\i * 0.8 cm]b.west)
node[right]{\footnotesize{$x_\xi$}} ;}
\foreach \i in {-2,...,2}{% remove ->
\draw ([yshift=\i * 0.8 cm]b.east) -- ([yshift=\i * 0.8 cm]c.west) ;}
\end{scope}
\end{tikzpicture}
\end{document}
答案2
我的解决方案是:
由于pinstyle
您的问题中没有给出所有其他样式,因此我只声明了重要的样式。
代码如下:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\begin{document}
\begin{tikzpicture}[thick]
\tikzset{input/.style={}} % <= this can be avoided but then use simply \node[name=input]{};
\tikzset{block/.style={rectangle,fill=blue!15,draw}}
\node [input, name=input] {};
\node [block, right=1cm of input,minimum width=3cm, minimum height=2.5cm] (a) {Frame Encoder};
\node [block, right of=a,minimum width=3cm, minimum height=5cm,node distance=5cm] (b) {};
\node [block, right of=b, pin={[]above:Ack},minimum width=3cm, minimum height=5cm,node distance=5cm] (c) {$5$ $\times$ $1$ MUX};
\node [right =1cm of c] (output) {};
\begin{scope}[->,>=latex]
\draw[->] (input) -- (a);
% text in the center of the block b
\node at (b.center) {\footnotesize{z}};
% a rectangle in the c block
\draw[above] ($(c.text)+(0,1)$)rectangle ($(c.text)+(1.85,2)$);
\draw[->] (c) -- (output);
\foreach \i in {-2,...,2}{%
\draw[->] ([yshift=\i * 0.4 cm]a.east) -- ([yshift=\i * 0.8 cm]b.west) node[right]{\footnotesize{x}} ;} %<= this to place x in front of each arrow
\foreach \i in {-2,...,2}{%
\draw[->] ([yshift=\i * 0.8 cm]b.east) -- ([yshift=\i * 0.8 cm]c.west) ;}
\end{scope}
\end{tikzpicture}
\end{document}
解释
对于
input
和,output
您可以避免声明实际上为空的样式(在代码中您会找到对此的注释)。要将
z
精确地放置在块的中心,您可以简单地使用:\node at (b.center) {\footnotesize{z}};
对于所有可用的键,请参阅 pgfmanual 48.2 预定义形状 - 矩形。
要在每个箭头前面插入
x
,可以在后面放置一个带有文本的\draw
节点foreach
。最后,为了将矩形放置在文本上方,我更喜欢使用
calc
库,而不是yshift
Altermundus 建议的。此外,我从 开始,c.text
而不是c.center
。
编辑
要插入编号的x
,请将更改\foreach
为:
\draw[->] (c) -- (output);
\foreach \i [count=\xi]in {2,...,-2}{%
\draw[->] ([yshift=\i * 0.4 cm]a.east) -- ([yshift=\i * 0.8 cm]b.west) node[right]{\footnotesize{$x_{\xi}$}} ;}
有从顶部开始的数字或:
\draw[->] (c) -- (output);
\foreach \i [count=\xi]in {-2,...,2}{%
\draw[->] ([yshift=\i * 0.4 cm]a.east) -- ([yshift=\i * 0.8 cm]b.west) node[right]{\footnotesize{$x_{\xi}$}} ;}
从底部开始。第一个解决方案给出: