为双列算法的每一列设置边界框并使其与页边距对齐

为双列算法的每一列设置边界框并使其与页边距对齐

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

这里有两个问题:

  1. 右侧对于其内容来说太宽,在右侧minipage留下了大量空间。可以通过减小 和 的宽度来解决此问题。minipagesubfigure
  2. \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}

相关内容