我快速地勾勒出了我想要的东西:
生成这样的框图的好方法是什么?
答案1
使用 TikZ 和库可以非常轻松地完成此操作matrix
。
尽管 PGF/TikZ 手册以及如何在 TikZ 矩阵节点中插入换行符?说可以\\
在里面使用换行符,matrix of nodes
只要它被括在{ }
里面,这对我来说不起作用,而是我使用了一个简单的\node
(使用\twoRows
宏)。任何选项和设置也由此手动节点继承。
\foreach
循环有助于连接矩阵的节点,而无需在许多行和/或列中重复相同的代码。
代码
\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{matrix}
\newcommand*{\twoRows}[2]{\node {$#1$\\$\scriptstyle #2$};}
\tikzset{
-|/.style={to path={-| (\tikztotarget) \tikztonodes}},
|-/.style={to path={|- (\tikztotarget) \tikztonodes}},
% auxiliary styles
set row cells to/.style n args={3}{% #1 = row, #2 = columns, #3 = style
@set row cells to/.style={row #1 column ##1/.append style={nodes={#3}}},
@set row cells to/.list={#2}
},
set rows to/.style 2 args={% #1 = rows, #2 = style
@set rows to/.style={row ##1/.append style={#2}},
@set rows to/.list={#1}
}
}
\begin{document}
\begin{tikzpicture}[
>=latex,
shorten >=2\pgflinewidth,
thick,
rect/.style={
shape=rectangle,
draw,
minimum width=5em,
align=center,
},
sqplus/.style={
shape=circle,
draw,
minimum size=1.5em,
inner sep=+0pt,
path picture={% the plus
\draw[shorten >=+0pt]
(path picture bounding box.west) -- (path picture bounding box.east)
(path picture bounding box.north) -- (path picture bounding box.south);
}
}
]
\matrix[
column sep=.5cm,
row sep=.5cm,
every node/.append style={anchor=center,text depth=+2pt},
column 1/.style={nodes=rect},
set row cells to={1}{2,...,5}{sqplus},
set row cells to={4}{2,...,5,7}{sqplus},
set rows to={2,3,5,6,7}{nodes=rect},
row 4 column 6/.style={nodes=rect},
row 6 column 5/.style={nodes=sqplus},
matrix of nodes,
] (m) {
0000\ldots 0 & {} & {} &[1cm] {} & {} \\
& \twoRows{E_{k,N}}{1000\ldots0}
& \twoRows{E_{k,N}}{1000\ldots1}
& \twoRows{E_{k,N}}{1000\ldots a-1}
& \twoRows{E_{k,N}}{1000\ldots a} \\
& $A_1$ & $A_2$ & $A_{a-1}$ & $A_a$ \\
0000\ldots 0 & {} & {} & {} & {} & \twoRows{E_{k,N}}{m} & {} \\
& $M_1$ & $M_2$ & $M_{m-1}$ & $M_m$ \\
& \twoRows{E_{k,N}}{0}
& \twoRows{E_{k,N}}{1}
& \twoRows{E_{k,N}}{m-2}
& {} & \twoRows{E_{k,N}}{m} \\
& $C_1$ & $C_2$ & $C_{m-1}$ & $C_m$ & & $T$\\
};
\foreach \Row in {2,6}
\path (m-\Row-3) -- node {$\cdots$} (m-\Row-4);
\foreach \Row in {1,4}
\foreach \cellStart[evaluate={\cellEnd={int(\cellStart+1)}}] in {1,...,4}
\path[->] (m-\Row-\cellStart) edge (m-\Row-\cellEnd);
\foreach \Column in {2,...,5}
\path[->] (m-3-\Column) edge (m-2-\Column)
(m-2-\Column) edge (m-1-\Column)
(m-5-\Column) edge (m-4-\Column) edge (m-6-\Column)
(m-6-\Column) edge (m-7-\Column)
;
\path[->] (m-4-5) edge (m-4-6)
(m-4-6) edge (m-4-7)
(m-4-7) edge[|-] (m-6-6) edge (m-7-7)
(m-6-6) edge (m-6-5)
(m-1-5) edge[-|] (m-4-7)
;
\end{tikzpicture}
\end{document}
输出
答案2
您是否尝试过使用 Libreoffice draw 等工具绘制此图表,然后将其导出为 eps 或 pdf?您可以轻松地插入 PDF 或 EPS 图形LaTeX
。这更像是一个实际答案,而不是技术答案。
我告诉你这个是因为制作这样的图表需要花费大量时间,尤其是当你不了解Tikz
或者Pstricks
不太清楚的时候。