![tikz“流程图”/协议图,无硬编码位置](https://linux22.com/image/333550/tikz%E2%80%9C%E6%B5%81%E7%A8%8B%E5%9B%BE%E2%80%9D%2F%E5%8D%8F%E8%AE%AE%E5%9B%BE%EF%BC%8C%E6%97%A0%E7%A1%AC%E7%BC%96%E7%A0%81%E4%BD%8D%E7%BD%AE.png)
我正在尝试创建特定样式的流程图/协议图。这似乎很容易用 tikz 实现,但我还没弄清楚如何让 tikz 尝试做我想做的事情。
希望边界框能够扩展其所在的页面(或在这种情况下为迷你页面),并且所有布局都是相对的。这将被相对频繁地重复使用
我目前有一种方法,只需使用 minipage、flushleft/right 和 framed 即可实现 90% 的预期效果。重要的是,我可以轻松地将任意方程式、itemize 等放入框中,而不必担心布局。所以它很灵活。但我认为不可能以我想要的方式轻松获得连接箭头。因此使用 tikz。
无论如何,该方法如下。
\documentclass{article}
\usepackage{amsmath}
\usepackage{amssymb,framed}
\begin{document}
\begin{figure*}[t]
\begin{minipage}{\linewidth}
\begin{framed}
\begin{minipage}{.75\textwidth}
\begin{framed}
Do some stuff. Works like normal tex. can do arbitrary stuff in here
\begin{align*}
\pi=PK\{(a,b,c,d):&a=b(y;r) \land c(y^\prime;r^\prime) \\ &\land foo(bar,c) %
\end{align*}%
\end{framed}
\end{minipage}$ \xrightarrow{\makebox[.15\textwidth]{$C$}}$ M
\begin{flushright}
C $\xrightarrow{\makebox[.14\textwidth]{$W$}}$
\begin{minipage}{.75\textwidth}
\begin{framed}
Do some more stuff ....
\end{framed}
\end{minipage}
\end{flushright}
\begin{minipage}{.75\textwidth}
\begin{framed}
Yet more stuff
\end{framed}
\end{minipage}$\xrightarrow{\makebox[.15\textwidth]{$x$}}$ M
\end{framed}
\end{minipage}
\end{figure*}
\end{document}
答案1
这是 Tikz 版本,命令是\dbox
,它需要一个强制参数,即文本。可选参数是箭头上的标签。您可以选择不写它。当然,第一次出现的\dbox
不能有箭头标签,您可以写它,但它不会产生任何结果。
表示框的字母(A、B、...)会自动插入;此外,每个矩形都不会有任何缩进。如果没有此选项,在矩形之间留一个空行会产生缩进。现在空行不再是问题。
框的对齐也是自动的。我创建了一个计数器,每次绘制一个框时,计数器都会增加 1。如果计数器为奇数,框将向左对齐,否则将绘制在右侧。
总而言之,命令如下:
\dbox[ <arrow label> ]{ <text> }
输出
代码
\documentclass{article}
\usepackage[margin=2.5cm]{geometry}
\usepackage{tikz}
\usepackage{lipsum}
\usetikzlibrary{arrows.meta}
\newcounter{boxes}
\setcounter{boxes}{1}
\newcommand\dbox[2][]{%
\noindent
\ifodd\theboxes
\tikz[remember picture, overlay]{%
\node[draw, anchor=west, text width=.75\textwidth] (n\arabic{boxes}) {\Alph{boxes}: #2};%
\ifnum\theboxes>1\relax
\pgfmathtruncatemacro\prev{\arabic{boxes}-1}
\draw (n\prev.west) -- (n\prev.west-|n\arabic{boxes}.north west) coordinate (a) node[above, midway, text width=.2\textwidth] {#1};
\draw[-{Latex}] (a) -- (n\arabic{boxes}.north west);
\fi}\par\vspace*{2cm}
\else%
\begin{flushright}%
\tikz[remember picture, overlay]{%
\node[draw, anchor=east, text width=.75\textwidth] (n\arabic{boxes}) {\Alph{boxes}: #2};
\ifnum\theboxes>1\relax
\pgfmathtruncatemacro\prev{\arabic{boxes}-1}
\draw (n\prev.east) -- (n\prev.east-|n\arabic{boxes}.north east) coordinate (a) node[above, midway, text width=.2\textwidth] {#1};
\draw[-{Latex}] (a) -- (n\arabic{boxes}.north east);
\fi}\par\vspace*{2cm}
\end{flushright}%
\fi%
\stepcounter{boxes}%
}%
\begin{document}
\dbox{Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque.}
\dbox[Here's a label!]{Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra me- tus rhoncus sem. Nulla et lectus vestibulum urna fringilla ultrices. Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in, pretium quis, viverra ac, nunc.}
\dbox{Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra me- tus rhoncus sem. Nulla et lectus vestibulum urna fringilla ultrices. Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in, pretium quis, viverra ac, nunc.}
\end{document}