![为双列算法的每一列设置边界框并使其与页边距对齐](https://linux22.com/image/376407/%E4%B8%BA%E5%8F%8C%E5%88%97%E7%AE%97%E6%B3%95%E7%9A%84%E6%AF%8F%E4%B8%80%E5%88%97%E8%AE%BE%E7%BD%AE%E8%BE%B9%E7%95%8C%E6%A1%86%E5%B9%B6%E4%BD%BF%E5%85%B6%E4%B8%8E%E9%A1%B5%E8%BE%B9%E8%B7%9D%E5%AF%B9%E9%BD%90.png)
algpseudocode
我有两个子算法,使用包中的布局并排放置algorithmicx
。由于每个子算法都需要在文本中单独引用,因此我选择了包subfigure
提供的环境subcaption
。感谢社区帮助,我已经有了一个好的开始。
然而,这两个子算法的排版太过接近,无法在视觉上区分。此外,RHS 算法的右侧有过多的空白。
下图描述了这个问题。
它由以下产生MWE
\documentclass{article}
\usepackage{subcaption}
\usepackage{algorithm}
\usepackage{algpseudocode}
\usepackage[margin=1cm]{geometry}
\newsavebox{\algboxA}
\newsavebox{\algboxB}
\begin{document}
\begin{figure}
\savebox{\algboxA}{%
\begin{minipage}[b]{0.48\linewidth}
\begin{algorithmic}[0]
\Procedure{Main}{}
\State configure interrupts
\State enable timers
\State $\vdots$
\While{\textproc{True}} \Comment{until shutdown}
\State background task \#1 \Comment{safety checks}
\State background task \#2
\State $\vdots$
\If{Calibrate}
\Function{doCalibration}{$x$}
\State subroutine for calibration
\State $\vdots$
\EndFunction
\EndIf
\State $\vdots$
\State background task \#$n$ \Comment{serial comm.}
\EndWhile
\EndProcedure
\end{algorithmic}
\end{minipage}%
}%
\savebox{\algboxB}{%
\begin{minipage}[b]{0.48\linewidth}
\begin{algorithmic}[0]
\Function{ISR}{$ $}
\State read sensor data from ADC
\State $\vdots$
\State initialise model
\Function{computeControl}{$x$}
\State evalute modeleqns
\State $\vdots$
\EndFunction
\State $\vdots$
\State write control output to DAC
\EndFunction
\end{algorithmic}
\end{minipage}%
}
\fbox{%
\begin{subfigure}[b]{0.48\textwidth}
\usebox{\algboxA}
\caption{background processes}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.48\textwidth}
\raisebox{\dimexpr.5\ht\algboxA-.5\ht\algboxB}{%
\usebox{\algboxB}%
}
\caption{foreground process}
\end{subfigure}
}
\caption{RT software architecture of a microcontroller}
\end{figure}
\end{document}
注释描述了建议的修复,即刷新其 minipages/parboxes 中的相应子算法。这没有对我来说,它不起作用,即使它起作用,我担心它也可能不是最理想的。
可能还有其他更好的解决方案——也许不是将每个子图硬编码为0.48
,\textwidth
而是可以动态计算每个子算法的最佳容器大小,并将它们与各自的边距齐平。
非常感谢有关如何实现此目标的任何帮助。
答案1
这里有两个问题:
- 右侧对于其内容来说太宽,在右侧
minipage
留下了大量空间。可以通过减小 和 的宽度来解决此问题。minipage
subfigure
- 会
\fbox
自动调整宽度以适应内容。因此, s\hfill
之间的subfigure
不会执行任何操作。\fbox
用替换\framebox[\textwidth]
可解决此问题。
结果:
代码:
\documentclass{article}
\usepackage{subcaption}
%\usepackage{algorithm} <-- doesn't exist
\usepackage{algorithmicx} % used this instead
\usepackage{algpseudocode}
\usepackage[margin=1cm]{geometry}
\newsavebox{\algboxA}
\newsavebox{\algboxB}
\begin{document}
\begin{figure}
\savebox{\algboxA}{%
\begin{minipage}[b]{0.48\linewidth}
\begin{algorithmic}[0]
\Procedure{Main}{}
\State configure interrupts
\State enable timers
\State $\vdots$
\While{\textproc{True}} \Comment{until shutdown}
\State background task \#1 \Comment{safety checks}
\State background task \#2
\State $\vdots$
\If{Calibrate}
\Function{doCalibration}{$x$}
\State subroutine for calibration
\State $\vdots$
\EndFunction
\EndIf
\State $\vdots$
\State background task \#$n$ \Comment{serial comm.}
\EndWhile
\EndProcedure
\end{algorithmic}
\end{minipage}%
}%
\savebox{\algboxB}{%
\begin{minipage}[b]{0.32\linewidth}
\begin{algorithmic}[0]
\Function{ISR}{$ $}
\State read sensor data from ADC
\State $\vdots$
\State initialise model
\Function{computeControl}{$x$}
\State evalute modeleqns
\State $\vdots$
\EndFunction
\State $\vdots$
\State write control output to DAC
\EndFunction
\end{algorithmic}
\end{minipage}%
}
\framebox[\textwidth]{%
\begin{subfigure}[b]{0.48\textwidth}
\usebox{\algboxA}
\caption{background processes}
\end{subfigure}
\hfill
\begin{subfigure}[b]{0.32\textwidth}
\raisebox{\dimexpr.5\ht\algboxA-.5\ht\algboxB}{%
\usebox{\algboxB}%
}
\caption{foreground process}
\end{subfigure}
}
\caption{RT software architecture of a microcontroller}
\end{figure}
\end{document}