例子

例子

我有两个问题与我在 LaTeX 中使用的算法环境有关。

例子

让我先从一个示例文件开始,以说明我正在寻找的内容。下面的 MWE 中的算法 1 实现了我想要的功能:它跨越了文本宽度的 95%,居中,具有该宽度的规则,并且缩进是我想要的方式,如下图所示。

在此处输入图片描述

\documentclass{memoir}

%% Memoir layout setup
%\setulmarginsandblock{3cm}{3cm}{*}
%\setlrmarginsandblock{2.25cm}{2.25cm}{*}
%\checkandfixthelayout

%% packages
\usepackage{etoolbox}
\usepackage{enumitem}
\usepackage{lipsum}

%% algorithm environment
\usepackage[vlined,ruled,algo2e]{algorithm2e}
\SetAlCapHSkip{0pt}
\setlength{\algoheightrule}{1pt}
\setlength{\algotitleheightrule}{0.7pt}
\newcommand{\marginwidth}{0.025\linewidth}
\newcommand{\algoboxwidth}{0.95\linewidth}
\setlength{\algomargin}{0.0em}
\SetCustomAlgoRuledWidth{0.95\linewidth}
\makeatletter
\patchcmd{\@algocf@start}{%
  \begin{lrbox}{\algocf@algobox}%
}{%
  \rule{\marginwidth}{\z@}%
  \begin{lrbox}{\algocf@algobox}%
  \begin{minipage}{\algoboxwidth}%
}{}{}
\patchcmd{\@algocf@finish}{%
  \end{lrbox}%
}{%
  \end{minipage}%
  \end{lrbox}%
}{}{}
% extend caption all the way to the right
\renewcommand{\algocf@makecaption@ruled}[2]{%
  \global\sbox\algocf@capbox{\hskip\AlCapHSkip%
    \setlength{\hsize}{\columnwidth}% restored on exit of sbox
    \addtolength{\hsize}{-2\AlCapHSkip}% add equal margin to both sides
    \vtop{\algocf@captiontext{#1}{#2}}}% then caption is not centered
}%
\makeatother

\begin{document}

\lipsum[1]

\begin{algorithm2e}[H]
\caption{A simple algorithm}
\SetKwInOut{Input}{Input}
\Input{Give me some input.}
\smallskip
\ForEach{outer iteration}{
\ForEach{inner iteration}{
calculate some cool stuff
}
more cool stuff
}
\Return{got it}
\end{algorithm2e}

\lipsum[1]

\begin{algorithm2e}[H]
\caption{This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption.}
\SetKwInOut{Input}{Input}
\Input{\lipsum[2]}
\smallskip
\begin{enumerate}[itemsep=0.3em, labelwidth=0.9em, leftmargin=!, topsep=0pt]
\item \lipsum[2]
\item \lipsum[2]
\end{enumerate}
\end{algorithm2e}

\lipsum[2]

\end{document}

问题

  1. 请注意布局设置,即三行

    \setulmarginsandblock{3cm}{3cm}{*}
    \setlrmarginsandblock{2.25cm}{2.25cm}{*}
    \checkandfixthelayout
    

    在上述文档中被注释掉了。如果使用该设置,则限制算法的线条将不再延伸到线条宽度的 95%。当然,我可以摆弄 中的因子\SetCustomAlgoRuledWidth{0.95\linewidth},但我想应该有一个通用的解决方案可以真正为我提供 95% 的线条宽度。

    此外,我很高兴了解为什么行为不像预期的那样。

    下图显示了这种情况。

    在此处输入图片描述

  2. 在算法 2 中,我们在标题、输入和算法主体中包含了更多文本,但有两点我不喜欢:

    • 文本宽度:标题已手动更正为采用完整算法宽度,我该如何对输入执行此操作?算法主体似乎具有正确的宽度。

    • 文本对齐:有没有办法证明输入和算法正文的合理性?我尝试了以下建议:algorithm2e 完全合理的输入/输出块用于输入,但是由于某些我无法理解的原因,在我的情况下,这会在输入上方引入额外的间距。

    再次,下图显示了事物的样子。

    在此处输入图片描述

答案1

一些分析供您参考:使用(浮动)环境enumerate内的环境algorithm2e似乎会破坏正常对齐,请参见此处维基百科

比较:

  • 正常enumerate环境
  • enumeratealgorithm2e环境中的环境

2 枚举环境

\documentclass{article}
\usepackage[vlined,ruled,algo2e]{algorithm2e}
\usepackage{blindtext}

\begin{document}
    \begin{enumerate}
     \item \blindtext
    \end{enumerate}

    \begin{algorithm2e}[H]
        \caption{some enum in algo}
        \begin{enumerate}
          \item \blindtext
        \end{enumerate}
    \end{algorithm2e}
\end{document}

这增加了我对在算法中使用枚举的怀疑:这是什么意思?算法在那里执行什么样的操作?

建议:在算法中使用一些清晰的动作语句(如plotting(thingies);),并在稍后更详细地解释(plotting(thingies)是一个复杂的过程,涉及这个和那个......),如果这是您想要的。

附言:如果你坚持使用里面的枚举,请尝试一下\parbox,例如像这样,我不知道它是否会有副作用:

带有 parbox 的枚举

\documentclass{article}
\usepackage[vlined,ruled,algo2e]{algorithm2e}
\usepackage{blindtext}

\begin{document}
    \begin{enumerate}
     \item \blindtext
    \end{enumerate}

    \begin{algorithm2e}[H]
        \caption{some enum in algo}
        \begin{enumerate}
          \item \blindtext
          \item \parbox[t]{8cm}{\blindtext}
        \end{enumerate}
    \end{algorithm2e}
\end{document}

相关内容